mirror of
https://github.com/tailwindlabs/tailwindcss.git
synced 2026-01-25 16:44:12 +00:00
Add @tailwindcss/browser package (#15558)
Co-authored-by: Philipp Spiess <hello@philippspiess.com> Co-authored-by: Robin Malfait <malfait.robin@gmail.com>
This commit is contained in:
parent
d4f693f7f3
commit
dcf116bb30
@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Added
|
||||
|
||||
- Add `@tailwindcss/browser` package to run Tailwind CSS in the browser ([#15558](https://github.com/tailwindlabs/tailwindcss/pull/15558))
|
||||
|
||||
### Fixed
|
||||
|
||||
- Use the correct property value for `place-content-between`, `place-content-around`, and `place-content-evenly` utilities ([#15440](https://github.com/tailwindlabs/tailwindcss/pull/15440))
|
||||
|
||||
@ -39,7 +39,7 @@
|
||||
"dev": "turbo dev --filter=!./playgrounds/*",
|
||||
"test": "cargo test && vitest run --hideSkippedTests",
|
||||
"test:integrations": "vitest --root=./integrations",
|
||||
"test:ui": "pnpm run --filter=tailwindcss test:ui",
|
||||
"test:ui": "pnpm run --filter=tailwindcss test:ui && pnpm run --filter=@tailwindcss/browser test:ui",
|
||||
"tdd": "vitest --hideSkippedTests",
|
||||
"bench": "vitest bench",
|
||||
"version-packages": "node ./scripts/version-packages.mjs",
|
||||
|
||||
40
packages/@tailwindcss-browser/README.md
Normal file
40
packages/@tailwindcss-browser/README.md
Normal file
@ -0,0 +1,40 @@
|
||||
<p align="center">
|
||||
<a href="https://tailwindcss.com" target="_blank">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/tailwindlabs/tailwindcss/HEAD/.github/logo-dark.svg">
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/tailwindlabs/tailwindcss/HEAD/.github/logo-light.svg">
|
||||
<img alt="Tailwind CSS" src="https://raw.githubusercontent.com/tailwindlabs/tailwindcss/HEAD/.github/logo-light.svg" width="350" height="70" style="max-width: 100%;">
|
||||
</picture>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
A utility-first CSS framework for rapidly building custom user interfaces.
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/tailwindlabs/tailwindcss/actions"><img src="https://img.shields.io/github/actions/workflow/status/tailwindlabs/tailwindcss/ci.yml?branch=next" alt="Build Status"></a>
|
||||
<a href="https://www.npmjs.com/package/tailwindcss"><img src="https://img.shields.io/npm/dt/tailwindcss.svg" alt="Total Downloads"></a>
|
||||
<a href="https://github.com/tailwindcss/tailwindcss/releases"><img src="https://img.shields.io/npm/v/tailwindcss.svg" alt="Latest Release"></a>
|
||||
<a href="https://github.com/tailwindcss/tailwindcss/blob/master/LICENSE"><img src="https://img.shields.io/npm/l/tailwindcss.svg" alt="License"></a>
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
## Documentation
|
||||
|
||||
For full documentation, visit [tailwindcss.com](https://tailwindcss.com).
|
||||
|
||||
## Community
|
||||
|
||||
For help, discussion about best practices, or any other conversation that would benefit from being searchable:
|
||||
|
||||
[Discuss Tailwind CSS on GitHub](https://github.com/tailwindcss/tailwindcss/discussions)
|
||||
|
||||
For chatting with others using the framework:
|
||||
|
||||
[Join the Tailwind CSS Discord Server](https://discord.gg/7NF8GNe)
|
||||
|
||||
## Contributing
|
||||
|
||||
If you're interested in contributing to Tailwind CSS, please read our [contributing docs](https://github.com/tailwindcss/tailwindcss/blob/next/.github/CONTRIBUTING.md) **before submitting a pull request**.
|
||||
35
packages/@tailwindcss-browser/package.json
Normal file
35
packages/@tailwindcss-browser/package.json
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "@tailwindcss/browser",
|
||||
"version": "4.0.0-beta.8",
|
||||
"description": "A utility-first CSS framework for rapidly building custom user interfaces.",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/tailwindlabs/tailwindcss.git",
|
||||
"directory": "packages/@tailwindcss-browser"
|
||||
},
|
||||
"bugs": "https://github.com/tailwindlabs/tailwindcss/issues",
|
||||
"homepage": "https://tailwindcss.com",
|
||||
"scripts": {
|
||||
"lint": "tsc --noEmit",
|
||||
"build": "tsup-node",
|
||||
"dev": "pnpm run build -- --watch",
|
||||
"test:ui": "playwright test"
|
||||
},
|
||||
"exports": {
|
||||
".": "./dist/index.mjs",
|
||||
"./package.json": "./package.json"
|
||||
},
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"publishConfig": {
|
||||
"provenance": true,
|
||||
"access": "public"
|
||||
},
|
||||
"devDependencies": {
|
||||
"h3": "^1.13.0",
|
||||
"listhen": "^1.9.0",
|
||||
"tailwindcss": "workspace:*"
|
||||
}
|
||||
}
|
||||
66
packages/@tailwindcss-browser/playwright.config.ts
Normal file
66
packages/@tailwindcss-browser/playwright.config.ts
Normal file
@ -0,0 +1,66 @@
|
||||
import { defineConfig, devices } from '@playwright/test'
|
||||
|
||||
/**
|
||||
* See https://playwright.dev/docs/test-configuration.
|
||||
*/
|
||||
export default defineConfig({
|
||||
testDir: './tests',
|
||||
/* Run tests in files in parallel */
|
||||
fullyParallel: true,
|
||||
/* Fail the build on CI if you accidentally left test.only in the source code. */
|
||||
forbidOnly: !!process.env.CI,
|
||||
/* Retry on CI only */
|
||||
retries: process.env.CI ? 2 : 0,
|
||||
/* Opt out of parallel tests on CI. */
|
||||
workers: process.env.CI ? 1 : undefined,
|
||||
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
|
||||
reporter: 'html',
|
||||
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
|
||||
use: {
|
||||
/* Base URL to use in actions like `await page.goto('/')`. */
|
||||
// baseURL: 'http://127.0.0.1:3000',
|
||||
|
||||
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
|
||||
trace: 'on-first-retry',
|
||||
},
|
||||
|
||||
/* Configure projects for major browsers */
|
||||
projects: [
|
||||
{
|
||||
name: 'chromium',
|
||||
use: { ...devices['Desktop Chrome'] },
|
||||
},
|
||||
{
|
||||
name: 'webkit',
|
||||
use: { ...devices['Desktop Safari'] },
|
||||
},
|
||||
{
|
||||
name: 'firefox',
|
||||
use: {
|
||||
...devices['Desktop Firefox'],
|
||||
// https://playwright.dev/docs/test-use-options#more-browser-and-context-options
|
||||
launchOptions: {
|
||||
// https://playwright.dev/docs/api/class-browsertype#browser-type-launch-option-firefox-user-prefs
|
||||
firefoxUserPrefs: {
|
||||
// By default, headless Firefox runs as though no pointers
|
||||
// capabilities are available.
|
||||
// https://github.com/microsoft/playwright/issues/7769#issuecomment-966098074
|
||||
//
|
||||
// This impacts our `hover` variant implementation which uses an
|
||||
// '(hover: hover)' media query to determine if hover is available.
|
||||
//
|
||||
// Available values for pointer capabilities:
|
||||
// NO_POINTER = 0x00;
|
||||
// COARSE_POINTER = 0x01;
|
||||
// FINE_POINTER = 0x02;
|
||||
// HOVER_CAPABLE_POINTER = 0x04;
|
||||
//
|
||||
// Setting to 0x02 | 0x04 says the system supports a mouse
|
||||
'ui.primaryPointerCapabilities': 0x02 | 0x04,
|
||||
'ui.allPointerCapabilities': 0x02 | 0x04,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
})
|
||||
11
packages/@tailwindcss-browser/src/assets.ts
Normal file
11
packages/@tailwindcss-browser/src/assets.ts
Normal file
@ -0,0 +1,11 @@
|
||||
import index from 'tailwindcss/index.css'
|
||||
import preflight from 'tailwindcss/preflight.css'
|
||||
import theme from 'tailwindcss/theme.css'
|
||||
import utilities from 'tailwindcss/utilities.css'
|
||||
|
||||
export const css = {
|
||||
index,
|
||||
preflight,
|
||||
theme,
|
||||
utilities,
|
||||
}
|
||||
296
packages/@tailwindcss-browser/src/index.ts
Normal file
296
packages/@tailwindcss-browser/src/index.ts
Normal file
@ -0,0 +1,296 @@
|
||||
import * as tailwindcss from 'tailwindcss'
|
||||
import * as assets from './assets'
|
||||
import { Instrumentation } from './instrumentation'
|
||||
|
||||
// Warn users about using the browser build in production as early as possible.
|
||||
// It can take time for the script to do its work so this must be at the top.
|
||||
console.warn(
|
||||
'The browser build of Tailwind CSS should not be used in production. To use Tailwind CSS in production, use the Tailwind CLI, Vite plugin, or PostCSS plugin: https://tailwindcss.com/docs/installation',
|
||||
)
|
||||
|
||||
/**
|
||||
* The type used by `<style>` tags that contain input CSS.
|
||||
*/
|
||||
const STYLE_TYPE = 'text/tailwindcss'
|
||||
|
||||
/**
|
||||
* The current Tailwind CSS compiler.
|
||||
*
|
||||
* This gets recreated:
|
||||
* - When stylesheets change
|
||||
*/
|
||||
let compiler: Awaited<ReturnType<typeof tailwindcss.compile>>
|
||||
|
||||
/**
|
||||
* The list of all seen classes on the page so far. The compiler already has a
|
||||
* cache of classes but this lets us only pass new classes to `build(…)`.
|
||||
*/
|
||||
let classes = new Set<string>()
|
||||
|
||||
/**
|
||||
* The last input CSS that was compiled. If stylesheets "change" without
|
||||
* actually changing, we can avoid a full rebuild.
|
||||
*/
|
||||
let lastCss = ''
|
||||
|
||||
/**
|
||||
* The stylesheet that we use to inject the compiled CSS into the page.
|
||||
*/
|
||||
let sheet = document.createElement('style')
|
||||
|
||||
/**
|
||||
* The queue of build tasks that need to be run. This is used to ensure that we
|
||||
* don't run multiple builds concurrently.
|
||||
*/
|
||||
let buildQueue = Promise.resolve()
|
||||
|
||||
/**
|
||||
* What build this is
|
||||
*/
|
||||
let nextBuildId = 1
|
||||
|
||||
/**
|
||||
* Used for instrumenting the build process. This data shows up in the
|
||||
* performance tab of the browser's devtools.
|
||||
*/
|
||||
let I = new Instrumentation()
|
||||
|
||||
/**
|
||||
* Create the Tailwind CSS compiler
|
||||
*
|
||||
* This handles loading imports, plugins, configs, etc…
|
||||
*
|
||||
* This does **not** imply that the CSS is actually built. That happens in the
|
||||
* `build` function and is a separate scheduled task.
|
||||
*/
|
||||
async function createCompiler() {
|
||||
I.start(`Create compiler`)
|
||||
I.start('Reading Stylesheets')
|
||||
|
||||
// The stylesheets may have changed causing a full rebuild so we'll need to
|
||||
// gather the latest list of stylesheets.
|
||||
let stylesheets: Iterable<HTMLStyleElement> = document.querySelectorAll(
|
||||
`style[type="${STYLE_TYPE}"]`,
|
||||
)
|
||||
|
||||
let css = ''
|
||||
for (let sheet of stylesheets) {
|
||||
observeSheet(sheet)
|
||||
css += sheet.textContent + '\n'
|
||||
}
|
||||
|
||||
// The user might have no stylesheets, or a some stylesheets without `@import`
|
||||
// because they want to customize their theme so we'll inject the main import
|
||||
// for them. However, if they start using `@import` we'll let them control
|
||||
// the build completely.
|
||||
if (!css.includes('@import')) {
|
||||
css = `@import "tailwindcss";${css}`
|
||||
}
|
||||
|
||||
I.end('Reading Stylesheets', {
|
||||
size: css.length,
|
||||
changed: lastCss !== css,
|
||||
})
|
||||
|
||||
// The input CSS did not change so the compiler does not need to be recreated
|
||||
if (lastCss === css) return
|
||||
|
||||
lastCss = css
|
||||
|
||||
I.start('Compile CSS')
|
||||
try {
|
||||
compiler = await tailwindcss.compile(css, {
|
||||
base: '/',
|
||||
loadStylesheet,
|
||||
loadModule,
|
||||
})
|
||||
} finally {
|
||||
I.end('Compile CSS')
|
||||
I.end(`Create compiler`)
|
||||
}
|
||||
|
||||
classes.clear()
|
||||
}
|
||||
|
||||
async function loadStylesheet(id: string, base: string) {
|
||||
function load() {
|
||||
if (id === 'tailwindcss') {
|
||||
return {
|
||||
base,
|
||||
content: assets.css.index,
|
||||
}
|
||||
} else if (
|
||||
id === 'tailwindcss/preflight' ||
|
||||
id === 'tailwindcss/preflight.css' ||
|
||||
id === './preflight.css'
|
||||
) {
|
||||
return {
|
||||
base,
|
||||
content: assets.css.preflight,
|
||||
}
|
||||
} else if (
|
||||
id === 'tailwindcss/theme' ||
|
||||
id === 'tailwindcss/theme.css' ||
|
||||
id === './theme.css'
|
||||
) {
|
||||
return {
|
||||
base,
|
||||
content: assets.css.theme,
|
||||
}
|
||||
} else if (
|
||||
id === 'tailwindcss/utilities' ||
|
||||
id === 'tailwindcss/utilities.css' ||
|
||||
id === './utilities.css'
|
||||
) {
|
||||
return {
|
||||
base,
|
||||
content: assets.css.utilities,
|
||||
}
|
||||
}
|
||||
|
||||
throw new Error(`The browser build does not support @import for "${id}"`)
|
||||
}
|
||||
|
||||
try {
|
||||
let sheet = load()
|
||||
|
||||
I.hit(`Loaded stylesheet`, {
|
||||
id,
|
||||
base,
|
||||
size: sheet.content.length,
|
||||
})
|
||||
|
||||
return sheet
|
||||
} catch (err) {
|
||||
I.hit(`Failed to load stylesheet`, {
|
||||
id,
|
||||
base,
|
||||
error: (err as Error).message ?? err,
|
||||
})
|
||||
|
||||
throw err
|
||||
}
|
||||
}
|
||||
|
||||
async function loadModule(): Promise<never> {
|
||||
throw new Error(`The browser build does not support plugins or config files.`)
|
||||
}
|
||||
|
||||
async function build(kind: 'full' | 'incremental') {
|
||||
if (!compiler) return
|
||||
|
||||
// 1. Refresh the known list of classes
|
||||
let newClasses = new Set<string>()
|
||||
|
||||
I.start(`Collect classes`)
|
||||
|
||||
for (let element of document.querySelectorAll('[class]')) {
|
||||
for (let c of element.classList) {
|
||||
if (classes.has(c)) continue
|
||||
|
||||
classes.add(c)
|
||||
newClasses.add(c)
|
||||
}
|
||||
}
|
||||
|
||||
I.end(`Collect classes`, {
|
||||
count: newClasses.size,
|
||||
})
|
||||
|
||||
if (newClasses.size === 0 && kind === 'incremental') return
|
||||
|
||||
// 2. Compile the CSS
|
||||
I.start(`Build utilities`)
|
||||
|
||||
sheet.textContent = compiler.build(Array.from(newClasses))
|
||||
|
||||
I.end(`Build utilities`)
|
||||
}
|
||||
|
||||
function rebuild(kind: 'full' | 'incremental') {
|
||||
async function run() {
|
||||
if (!compiler && kind !== 'full') {
|
||||
return
|
||||
}
|
||||
|
||||
let buildId = nextBuildId++
|
||||
|
||||
I.start(`Build #${buildId} (${kind})`)
|
||||
|
||||
if (kind === 'full') {
|
||||
await createCompiler()
|
||||
}
|
||||
|
||||
I.start(`Build`)
|
||||
await build(kind)
|
||||
I.end(`Build`)
|
||||
|
||||
I.end(`Build #${buildId} (${kind})`)
|
||||
}
|
||||
|
||||
buildQueue = buildQueue.then(run).catch((err) => I.error(err))
|
||||
}
|
||||
|
||||
// Handle changes to known stylesheets
|
||||
let styleObserver = new MutationObserver(() => rebuild('full'))
|
||||
|
||||
function observeSheet(sheet: HTMLStyleElement) {
|
||||
styleObserver.observe(sheet, {
|
||||
attributes: true,
|
||||
attributeFilter: ['type'],
|
||||
characterData: true,
|
||||
subtree: true,
|
||||
childList: true,
|
||||
})
|
||||
}
|
||||
|
||||
// Handle changes to the document that could affect the styles
|
||||
// - Changes to any element's class attribute
|
||||
// - New stylesheets being added to the page
|
||||
// - New elements (with classes) being added to the page
|
||||
new MutationObserver((records) => {
|
||||
let full = 0
|
||||
let incremental = 0
|
||||
|
||||
for (let record of records) {
|
||||
// New stylesheets == tracking + full rebuild
|
||||
for (let node of record.addedNodes as Iterable<HTMLElement>) {
|
||||
if (node.nodeType !== Node.ELEMENT_NODE) continue
|
||||
if (node.tagName !== 'STYLE') continue
|
||||
if (node.getAttribute('type') !== STYLE_TYPE) continue
|
||||
|
||||
observeSheet(node as HTMLStyleElement)
|
||||
full++
|
||||
}
|
||||
|
||||
// New nodes require an incremental rebuild
|
||||
for (let node of record.addedNodes) {
|
||||
if (node.nodeType !== 1) continue
|
||||
|
||||
// Skip the output stylesheet itself to prevent loops
|
||||
if (node === sheet) continue
|
||||
|
||||
incremental++
|
||||
}
|
||||
|
||||
// Changes to class attributes require an incremental rebuild
|
||||
if (record.type === 'attributes') {
|
||||
incremental++
|
||||
}
|
||||
}
|
||||
|
||||
if (full > 0) {
|
||||
return rebuild('full')
|
||||
} else if (incremental > 0) {
|
||||
return rebuild('incremental')
|
||||
}
|
||||
}).observe(document.documentElement, {
|
||||
attributes: true,
|
||||
attributeFilter: ['class'],
|
||||
childList: true,
|
||||
subtree: true,
|
||||
})
|
||||
|
||||
rebuild('full')
|
||||
|
||||
document.head.append(sheet)
|
||||
29
packages/@tailwindcss-browser/src/instrumentation.ts
Normal file
29
packages/@tailwindcss-browser/src/instrumentation.ts
Normal file
@ -0,0 +1,29 @@
|
||||
export class Instrumentation {
|
||||
start(label: string) {
|
||||
performance.mark(`${label} (start)`)
|
||||
}
|
||||
|
||||
end(label: string, detail?: any) {
|
||||
performance.mark(`${label} (end)`)
|
||||
|
||||
performance.measure(label, {
|
||||
start: `${label} (start)`,
|
||||
end: `${label} (end)`,
|
||||
detail,
|
||||
})
|
||||
}
|
||||
|
||||
hit(label: string, detail?: any) {
|
||||
performance.mark(label, {
|
||||
detail,
|
||||
})
|
||||
}
|
||||
|
||||
error(error: any) {
|
||||
performance.mark(`(error)`, {
|
||||
detail: { error: `${error}` },
|
||||
})
|
||||
|
||||
throw error
|
||||
}
|
||||
}
|
||||
4
packages/@tailwindcss-browser/src/types.d.ts
vendored
Normal file
4
packages/@tailwindcss-browser/src/types.d.ts
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
declare module '*.css' {
|
||||
const content: string
|
||||
export default content
|
||||
}
|
||||
171
packages/@tailwindcss-browser/tests/ui.spec.ts
Normal file
171
packages/@tailwindcss-browser/tests/ui.spec.ts
Normal file
@ -0,0 +1,171 @@
|
||||
import { expect, test, type Page } from '@playwright/test'
|
||||
import { readFile } from 'node:fs/promises'
|
||||
|
||||
const html = String.raw
|
||||
|
||||
let server: Awaited<ReturnType<typeof createServer>>
|
||||
|
||||
test.beforeAll(async ({}, info) => {
|
||||
server = await createServer()
|
||||
})
|
||||
|
||||
test('basic', async ({ page }) => {
|
||||
await server.render({
|
||||
page,
|
||||
body: html`<div data-test class="w-32 h-32 bg-red"></div>`,
|
||||
})
|
||||
|
||||
await expect(page.locator('[data-test]')).toHaveCSS('background-color', 'rgb(255, 0, 0)')
|
||||
})
|
||||
|
||||
test('observer', async ({ page }) => {
|
||||
await server.render({
|
||||
page,
|
||||
body: html`<div data-test class="w-32 h-32 bg-red"></div>`,
|
||||
})
|
||||
|
||||
await page.evaluate(() => {
|
||||
document.querySelector('[data-test]')!.classList.replace('bg-red', 'bg-blue')
|
||||
})
|
||||
|
||||
await expect(page.locator('[data-test]')).toHaveCSS('background-color', 'rgb(0, 0, 255)')
|
||||
})
|
||||
|
||||
test('custom css', async ({ page }) => {
|
||||
await server.render({
|
||||
page,
|
||||
head: html`
|
||||
<style data-css type="text/tailwindcss">
|
||||
.foo {
|
||||
@apply bg-red;
|
||||
}
|
||||
</style>
|
||||
`,
|
||||
body: html`<div data-test class="w-32 h-32 foo"></div>`,
|
||||
})
|
||||
|
||||
await expect(page.locator('[data-test]')).toHaveCSS('background-color', 'rgb(255, 0, 0)')
|
||||
|
||||
await page.evaluate(() => {
|
||||
document.querySelector('[data-css]')!.textContent = `
|
||||
.foo {
|
||||
@apply bg-blue;
|
||||
}
|
||||
`
|
||||
})
|
||||
|
||||
await expect(page.locator('[data-test]')).toHaveCSS('background-color', 'rgb(0, 0, 255)')
|
||||
})
|
||||
|
||||
test('changes to `@theme`', async ({ page }) => {
|
||||
await server.render({
|
||||
page,
|
||||
head: html`
|
||||
<style data-css type="text/tailwindcss">
|
||||
@theme {
|
||||
--color-primary: #ff0000;
|
||||
}
|
||||
</style>
|
||||
`,
|
||||
body: html`<div data-test class="w-32 h-32 bg-primary"></div>`,
|
||||
})
|
||||
|
||||
await expect(page.locator('[data-test]')).toHaveCSS('background-color', 'rgb(255, 0, 0)')
|
||||
|
||||
await page.evaluate(() => {
|
||||
document.querySelector('[data-css]')!.textContent = `
|
||||
@theme {
|
||||
--color-primary: #0000ff;
|
||||
}
|
||||
`
|
||||
})
|
||||
|
||||
await expect(page.locator('[data-test]')).toHaveCSS('background-color', 'rgb(0, 0, 255)')
|
||||
})
|
||||
|
||||
test('no classes', async ({ page }) => {
|
||||
await server.render({
|
||||
page,
|
||||
body: html`<div data-test>test</div>`,
|
||||
})
|
||||
|
||||
await expect(page.locator('body')).toHaveCSS('margin', '0px')
|
||||
})
|
||||
|
||||
test('html classes', async ({ page }) => {
|
||||
await server.render({
|
||||
page,
|
||||
htmlClasses: 'h-4',
|
||||
})
|
||||
|
||||
await expect(page.locator('html')).toHaveCSS('height', '16px')
|
||||
})
|
||||
|
||||
async function createServer() {
|
||||
const { createApp, createRouter, defineEventHandler, toNodeListener } = await import('h3')
|
||||
const { listen } = await import('listhen')
|
||||
|
||||
interface PageOptions {
|
||||
page: Page
|
||||
head?: string
|
||||
body?: string
|
||||
htmlClasses?: string
|
||||
}
|
||||
|
||||
async function render({ page, htmlClasses, head, body }: PageOptions) {
|
||||
let content = html`
|
||||
<!doctype html>
|
||||
<html lang="en" class="${htmlClasses ?? ''}">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Document</title>
|
||||
<script src="/tailwindcss.js"></script>
|
||||
<style type="text/tailwindcss">
|
||||
@theme {
|
||||
--color-red: #ff0000;
|
||||
--color-green: #00ff00;
|
||||
--color-blue: #0000ff;
|
||||
}
|
||||
</style>
|
||||
${head ?? ''}
|
||||
</head>
|
||||
<body>
|
||||
${body ?? ''}
|
||||
</body>
|
||||
</html>
|
||||
`
|
||||
|
||||
router.get(
|
||||
'/',
|
||||
defineEventHandler(() => content),
|
||||
)
|
||||
|
||||
await page.goto(server.url)
|
||||
}
|
||||
|
||||
const app = createApp()
|
||||
const router = createRouter()
|
||||
|
||||
router.get(
|
||||
'/tailwindcss.js',
|
||||
defineEventHandler(() => readFile(require.resolve('@tailwindcss/browser'))),
|
||||
)
|
||||
|
||||
app.use(router)
|
||||
|
||||
let workerIndex = Number(process.env.TEST_WORKER_INDEX ?? 0)
|
||||
|
||||
let listener = await listen(toNodeListener(app), {
|
||||
port: 3000 + workerIndex,
|
||||
showURL: false,
|
||||
open: false,
|
||||
})
|
||||
|
||||
return {
|
||||
app,
|
||||
url: listener.url,
|
||||
render,
|
||||
}
|
||||
}
|
||||
6
packages/@tailwindcss-browser/tsconfig.json
Normal file
6
packages/@tailwindcss-browser/tsconfig.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"extends": "../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"lib": ["es2022", "esnext.disposable", "dom", "dom.iterable"],
|
||||
},
|
||||
}
|
||||
15
packages/@tailwindcss-browser/tsup.config.ts
Normal file
15
packages/@tailwindcss-browser/tsup.config.ts
Normal file
@ -0,0 +1,15 @@
|
||||
import { defineConfig } from 'tsup'
|
||||
|
||||
export default defineConfig({
|
||||
format: ['esm'],
|
||||
clean: true,
|
||||
minify: true,
|
||||
entry: ['src/index.ts'],
|
||||
noExternal: [/.*/],
|
||||
loader: {
|
||||
'.css': 'text',
|
||||
},
|
||||
define: {
|
||||
'process.env.NODE_ENV': '"production"',
|
||||
},
|
||||
})
|
||||
7
packages/@tailwindcss-browser/vitest.config.ts
Normal file
7
packages/@tailwindcss-browser/vitest.config.ts
Normal file
@ -0,0 +1,7 @@
|
||||
import { defineConfig } from 'vitest/config'
|
||||
|
||||
export default defineConfig({
|
||||
test: {
|
||||
exclude: ['**/*.spec.?(c|m)[jt]s?(x)', '**/node_modules/**'],
|
||||
},
|
||||
})
|
||||
261
pnpm-lock.yaml
generated
261
pnpm-lock.yaml
generated
@ -135,6 +135,18 @@ importers:
|
||||
specifier: ^3.3.2
|
||||
version: 3.3.2
|
||||
|
||||
packages/@tailwindcss-browser:
|
||||
devDependencies:
|
||||
h3:
|
||||
specifier: ^1.13.0
|
||||
version: 1.13.0
|
||||
listhen:
|
||||
specifier: ^1.9.0
|
||||
version: 1.9.0
|
||||
tailwindcss:
|
||||
specifier: workspace:*
|
||||
version: link:../tailwindcss
|
||||
|
||||
packages/@tailwindcss-cli:
|
||||
dependencies:
|
||||
'@parcel/watcher':
|
||||
@ -1517,13 +1529,11 @@ packages:
|
||||
'@parcel/watcher-darwin-arm64@2.5.0':
|
||||
resolution: {integrity: sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
'@parcel/watcher-darwin-x64@2.5.0':
|
||||
resolution: {integrity: sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
'@parcel/watcher-freebsd-x64@2.5.0':
|
||||
@ -1547,27 +1557,29 @@ packages:
|
||||
'@parcel/watcher-linux-arm64-glibc@2.5.0':
|
||||
resolution: {integrity: sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
'@parcel/watcher-linux-arm64-musl@2.5.0':
|
||||
resolution: {integrity: sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
'@parcel/watcher-linux-x64-glibc@2.5.0':
|
||||
resolution: {integrity: sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
'@parcel/watcher-linux-x64-musl@2.5.0':
|
||||
resolution: {integrity: sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
'@parcel/watcher-wasm@2.5.0':
|
||||
resolution: {integrity: sha512-Z4ouuR8Pfggk1EYYbTaIoxc+Yv4o7cGQnH0Xy8+pQ+HbiW+ZnwhcD2LPf/prfq1nIWpAxjOkQ8uSMFWMtBLiVQ==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
bundledDependencies:
|
||||
- napi-wasm
|
||||
|
||||
'@parcel/watcher-win32-arm64@2.5.0':
|
||||
resolution: {integrity: sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
@ -1583,7 +1595,6 @@ packages:
|
||||
'@parcel/watcher-win32-x64@2.5.0':
|
||||
resolution: {integrity: sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
'@parcel/watcher@2.5.0':
|
||||
@ -2070,13 +2081,11 @@ packages:
|
||||
|
||||
bun@1.1.29:
|
||||
resolution: {integrity: sha512-SKhpyKNZtgxrVel9ec9xon3LDv8mgpiuFhARgcJo1YIbggY2PBrKHRNiwQ6Qlb+x3ivmRurfuwWgwGexjpgBRg==}
|
||||
cpu: [arm64, x64]
|
||||
os: [darwin, linux, win32]
|
||||
hasBin: true
|
||||
|
||||
bun@1.1.42:
|
||||
resolution: {integrity: sha512-PckeNolMEBaBEzixTMvp0jJD9r/9lly8AfctILi1ve14zwwChFjsxI4TJLQO2yezzOjVeG0u7xf8WQFbS7GjAA==}
|
||||
cpu: [arm64, x64, aarch64]
|
||||
os: [darwin, linux, win32]
|
||||
hasBin: true
|
||||
|
||||
@ -2125,9 +2134,16 @@ packages:
|
||||
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
|
||||
engines: {node: '>= 8.10.0'}
|
||||
|
||||
citty@0.1.6:
|
||||
resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==}
|
||||
|
||||
client-only@0.0.1:
|
||||
resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
|
||||
|
||||
clipboardy@4.0.0:
|
||||
resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
color-convert@2.0.1:
|
||||
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
|
||||
engines: {node: '>=7.0.0'}
|
||||
@ -2152,6 +2168,9 @@ packages:
|
||||
concat-map@0.0.1:
|
||||
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
|
||||
|
||||
confbox@0.1.8:
|
||||
resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
|
||||
|
||||
consola@3.2.3:
|
||||
resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==}
|
||||
engines: {node: ^14.18.0 || >=16.10.0}
|
||||
@ -2159,6 +2178,9 @@ packages:
|
||||
convert-source-map@2.0.0:
|
||||
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
|
||||
|
||||
cookie-es@1.2.2:
|
||||
resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==}
|
||||
|
||||
cross-spawn@7.0.3:
|
||||
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
|
||||
engines: {node: '>= 8'}
|
||||
@ -2167,6 +2189,9 @@ packages:
|
||||
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
|
||||
engines: {node: '>= 8'}
|
||||
|
||||
crossws@0.3.1:
|
||||
resolution: {integrity: sha512-HsZgeVYaG+b5zA+9PbIPGq4+J/CJynJuearykPsXx4V/eMhyQ5EDVg3Ak2FBZtVXCiOLu/U7IiwDHTr9MA+IKw==}
|
||||
|
||||
cssesc@3.0.0:
|
||||
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
|
||||
engines: {node: '>=4'}
|
||||
@ -2239,6 +2264,12 @@ packages:
|
||||
resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
defu@6.1.4:
|
||||
resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
|
||||
|
||||
destr@2.0.3:
|
||||
resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==}
|
||||
|
||||
detect-libc@1.0.3:
|
||||
resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
|
||||
engines: {node: '>=0.10'}
|
||||
@ -2548,6 +2579,9 @@ packages:
|
||||
resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
get-port-please@3.1.2:
|
||||
resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==}
|
||||
|
||||
get-stream@6.0.1:
|
||||
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
|
||||
engines: {node: '>=10'}
|
||||
@ -2604,6 +2638,9 @@ packages:
|
||||
graphemer@1.4.0:
|
||||
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
|
||||
|
||||
h3@1.13.0:
|
||||
resolution: {integrity: sha512-vFEAu/yf8UMUcB4s43OaDaigcqpQd14yanmOsn+NcRX3/guSKncyE2rOYhq8RIchgJrPSs/QiIddnTTR1ddiAg==}
|
||||
|
||||
has-bigints@1.0.2:
|
||||
resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
|
||||
|
||||
@ -2630,6 +2667,10 @@ packages:
|
||||
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
http-shutdown@1.2.2:
|
||||
resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==}
|
||||
engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
|
||||
|
||||
human-signals@2.1.0:
|
||||
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
|
||||
engines: {node: '>=10.17.0'}
|
||||
@ -2658,6 +2699,9 @@ packages:
|
||||
resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
iron-webcrypto@1.2.1:
|
||||
resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==}
|
||||
|
||||
is-array-buffer@3.0.4:
|
||||
resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
@ -2703,6 +2747,11 @@ packages:
|
||||
resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
is-docker@3.0.0:
|
||||
resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
|
||||
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||
hasBin: true
|
||||
|
||||
is-extglob@2.1.1:
|
||||
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
@ -2722,6 +2771,11 @@ packages:
|
||||
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
is-inside-container@1.0.0:
|
||||
resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
|
||||
engines: {node: '>=14.16'}
|
||||
hasBin: true
|
||||
|
||||
is-map@2.0.3:
|
||||
resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
@ -2781,6 +2835,14 @@ packages:
|
||||
resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
is-wsl@3.1.0:
|
||||
resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==}
|
||||
engines: {node: '>=16'}
|
||||
|
||||
is64bit@2.0.0:
|
||||
resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
isarray@2.0.5:
|
||||
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
|
||||
|
||||
@ -2857,13 +2919,11 @@ packages:
|
||||
lightningcss-darwin-arm64@1.26.0:
|
||||
resolution: {integrity: sha512-n4TIvHO1NY1ondKFYpL2ZX0bcC2y6yjXMD6JfyizgR8BCFNEeArINDzEaeqlfX9bXz73Bpz/Ow0nu+1qiDrBKg==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
lightningcss-darwin-x64@1.26.0:
|
||||
resolution: {integrity: sha512-Rf9HuHIDi1R6/zgBkJh25SiJHF+dm9axUZW/0UoYCW1/8HV0gMI0blARhH4z+REmWiU1yYT/KyNF3h7tHyRXUg==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
lightningcss-freebsd-x64@1.26.0:
|
||||
@ -2881,25 +2941,21 @@ packages:
|
||||
lightningcss-linux-arm64-gnu@1.26.0:
|
||||
resolution: {integrity: sha512-iJmZM7fUyVjH+POtdiCtExG+67TtPUTer7K/5A8DIfmPfrmeGvzfRyBltGhQz13Wi15K1lf2cPYoRaRh6vcwNA==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
lightningcss-linux-arm64-musl@1.26.0:
|
||||
resolution: {integrity: sha512-XxoEL++tTkyuvu+wq/QS8bwyTXZv2y5XYCMcWL45b8XwkiS8eEEEej9BkMGSRwxa5J4K+LDeIhLrS23CpQyfig==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
lightningcss-linux-x64-gnu@1.26.0:
|
||||
resolution: {integrity: sha512-1dkTfZQAYLj8MUSkd6L/+TWTG8V6Kfrzfa0T1fSlXCXQHrt1HC1/UepXHtKHDt/9yFwyoeayivxXAsApVxn6zA==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
lightningcss-linux-x64-musl@1.26.0:
|
||||
resolution: {integrity: sha512-yX3Rk9m00JGCUzuUhFEojY+jf/6zHs3XU8S8Vk+FRbnr4St7cjyMXdNjuA2LjiT8e7j8xHRCH8hyZ4H/btRE4A==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
lightningcss-win32-arm64-msvc@1.26.0:
|
||||
@ -2911,7 +2967,6 @@ packages:
|
||||
lightningcss-win32-x64-msvc@1.26.0:
|
||||
resolution: {integrity: sha512-pYS3EyGP3JRhfqEFYmfFDiZ9/pVNfy8jVIYtrx9TVNusVyDK3gpW1w/rbvroQ4bDJi7grdUtyrYU6V2xkY/bBw==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
lightningcss@1.26.0:
|
||||
@ -2929,6 +2984,10 @@ packages:
|
||||
lines-and-columns@1.2.4:
|
||||
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
|
||||
|
||||
listhen@1.9.0:
|
||||
resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==}
|
||||
hasBin: true
|
||||
|
||||
load-tsconfig@0.2.5:
|
||||
resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==}
|
||||
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||
@ -2979,6 +3038,11 @@ packages:
|
||||
resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
|
||||
engines: {node: '>=8.6'}
|
||||
|
||||
mime@3.0.0:
|
||||
resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
|
||||
engines: {node: '>=10.0.0'}
|
||||
hasBin: true
|
||||
|
||||
mimic-fn@2.1.0:
|
||||
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
|
||||
engines: {node: '>=6'}
|
||||
@ -3005,6 +3069,9 @@ packages:
|
||||
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
|
||||
engines: {node: '>=16 || 14 >=14.17'}
|
||||
|
||||
mlly@1.7.3:
|
||||
resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==}
|
||||
|
||||
mri@1.2.0:
|
||||
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
|
||||
engines: {node: '>=4'}
|
||||
@ -3054,6 +3121,13 @@ packages:
|
||||
resolution: {integrity: sha512-9emqXAKhVoNrQ792nLI/wpzPpJ/bj/YXxW0CvAau1+RdGBcCRF1Dmz7719zgVsQNrzHl9Tzn3ImZ4qWFarWL0A==}
|
||||
engines: {node: ^18 || ^20 || >= 21}
|
||||
|
||||
node-fetch-native@1.6.4:
|
||||
resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==}
|
||||
|
||||
node-forge@1.3.1:
|
||||
resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
|
||||
engines: {node: '>= 6.13.0'}
|
||||
|
||||
node-gyp-build@4.8.2:
|
||||
resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==}
|
||||
hasBin: true
|
||||
@ -3113,6 +3187,9 @@ packages:
|
||||
resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
ohash@1.1.4:
|
||||
resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==}
|
||||
|
||||
onetime@5.1.2:
|
||||
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
|
||||
engines: {node: '>=6'}
|
||||
@ -3193,6 +3270,9 @@ packages:
|
||||
resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
|
||||
engines: {node: '>= 6'}
|
||||
|
||||
pkg-types@1.3.0:
|
||||
resolution: {integrity: sha512-kS7yWjVFCkIw9hqdJBoMxDdzEngmkr5FXeWZZfQ6GoYacjVnsW6l2CcYW/0ThD0vF4LPJgVYnrg4d0uuhwYQbg==}
|
||||
|
||||
playwright-core@1.49.1:
|
||||
resolution: {integrity: sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==}
|
||||
engines: {node: '>=18'}
|
||||
@ -3327,6 +3407,9 @@ packages:
|
||||
queue-microtask@1.2.3:
|
||||
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
|
||||
|
||||
radix3@1.1.2:
|
||||
resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==}
|
||||
|
||||
react-dom@18.3.1:
|
||||
resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
|
||||
peerDependencies:
|
||||
@ -3568,6 +3651,10 @@ packages:
|
||||
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
system-architecture@0.1.0:
|
||||
resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
tailwindcss@3.4.14:
|
||||
resolution: {integrity: sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==}
|
||||
engines: {node: '>=14.0.0'}
|
||||
@ -3744,22 +3831,38 @@ packages:
|
||||
engines: {node: '>=14.17'}
|
||||
hasBin: true
|
||||
|
||||
ufo@1.5.4:
|
||||
resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
|
||||
|
||||
unbox-primitive@1.0.2:
|
||||
resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
|
||||
|
||||
uncrypto@0.1.3:
|
||||
resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
|
||||
|
||||
undici-types@5.26.5:
|
||||
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
|
||||
|
||||
unenv@1.10.0:
|
||||
resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==}
|
||||
|
||||
unicorn-magic@0.1.0:
|
||||
resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
untun@0.1.3:
|
||||
resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==}
|
||||
hasBin: true
|
||||
|
||||
update-browserslist-db@1.1.1:
|
||||
resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
browserslist: '>= 4.21.0'
|
||||
|
||||
uqr@0.1.2:
|
||||
resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==}
|
||||
|
||||
uri-js@4.4.1:
|
||||
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
|
||||
|
||||
@ -4617,6 +4720,11 @@ snapshots:
|
||||
|
||||
'@parcel/watcher-linux-x64-musl@2.5.0': {}
|
||||
|
||||
'@parcel/watcher-wasm@2.5.0':
|
||||
dependencies:
|
||||
is-glob: 4.0.3
|
||||
micromatch: 4.0.7
|
||||
|
||||
'@parcel/watcher-win32-arm64@2.5.0':
|
||||
optional: true
|
||||
|
||||
@ -5274,8 +5382,18 @@ snapshots:
|
||||
optionalDependencies:
|
||||
fsevents: 2.3.3
|
||||
|
||||
citty@0.1.6:
|
||||
dependencies:
|
||||
consola: 3.2.3
|
||||
|
||||
client-only@0.0.1: {}
|
||||
|
||||
clipboardy@4.0.0:
|
||||
dependencies:
|
||||
execa: 8.0.1
|
||||
is-wsl: 3.1.0
|
||||
is64bit: 2.0.0
|
||||
|
||||
color-convert@2.0.1:
|
||||
dependencies:
|
||||
color-name: 1.1.4
|
||||
@ -5301,10 +5419,14 @@ snapshots:
|
||||
|
||||
concat-map@0.0.1: {}
|
||||
|
||||
confbox@0.1.8: {}
|
||||
|
||||
consola@3.2.3: {}
|
||||
|
||||
convert-source-map@2.0.0: {}
|
||||
|
||||
cookie-es@1.2.2: {}
|
||||
|
||||
cross-spawn@7.0.3:
|
||||
dependencies:
|
||||
path-key: 3.1.1
|
||||
@ -5317,6 +5439,10 @@ snapshots:
|
||||
shebang-command: 2.0.0
|
||||
which: 2.0.2
|
||||
|
||||
crossws@0.3.1:
|
||||
dependencies:
|
||||
uncrypto: 0.1.3
|
||||
|
||||
cssesc@3.0.0: {}
|
||||
|
||||
csstype@3.1.3: {}
|
||||
@ -5371,6 +5497,10 @@ snapshots:
|
||||
has-property-descriptors: 1.0.2
|
||||
object-keys: 1.1.1
|
||||
|
||||
defu@6.1.4: {}
|
||||
|
||||
destr@2.0.3: {}
|
||||
|
||||
detect-libc@1.0.3: {}
|
||||
|
||||
detect-libc@2.0.3:
|
||||
@ -6001,6 +6131,8 @@ snapshots:
|
||||
has-symbols: 1.0.3
|
||||
hasown: 2.0.2
|
||||
|
||||
get-port-please@3.1.2: {}
|
||||
|
||||
get-stream@6.0.1: {}
|
||||
|
||||
get-stream@8.0.1: {}
|
||||
@ -6067,6 +6199,19 @@ snapshots:
|
||||
|
||||
graphemer@1.4.0: {}
|
||||
|
||||
h3@1.13.0:
|
||||
dependencies:
|
||||
cookie-es: 1.2.2
|
||||
crossws: 0.3.1
|
||||
defu: 6.1.4
|
||||
destr: 2.0.3
|
||||
iron-webcrypto: 1.2.1
|
||||
ohash: 1.1.4
|
||||
radix3: 1.1.2
|
||||
ufo: 1.5.4
|
||||
uncrypto: 0.1.3
|
||||
unenv: 1.10.0
|
||||
|
||||
has-bigints@1.0.2: {}
|
||||
|
||||
has-flag@4.0.0: {}
|
||||
@ -6087,6 +6232,8 @@ snapshots:
|
||||
dependencies:
|
||||
function-bind: 1.1.2
|
||||
|
||||
http-shutdown@1.2.2: {}
|
||||
|
||||
human-signals@2.1.0: {}
|
||||
|
||||
human-signals@5.0.0: {}
|
||||
@ -6108,6 +6255,8 @@ snapshots:
|
||||
hasown: 2.0.2
|
||||
side-channel: 1.0.6
|
||||
|
||||
iron-webcrypto@1.2.1: {}
|
||||
|
||||
is-array-buffer@3.0.4:
|
||||
dependencies:
|
||||
call-bind: 1.0.7
|
||||
@ -6155,6 +6304,8 @@ snapshots:
|
||||
dependencies:
|
||||
has-tostringtag: 1.0.2
|
||||
|
||||
is-docker@3.0.0: {}
|
||||
|
||||
is-extglob@2.1.1: {}
|
||||
|
||||
is-finalizationregistry@1.0.2:
|
||||
@ -6171,6 +6322,10 @@ snapshots:
|
||||
dependencies:
|
||||
is-extglob: 2.1.1
|
||||
|
||||
is-inside-container@1.0.0:
|
||||
dependencies:
|
||||
is-docker: 3.0.0
|
||||
|
||||
is-map@2.0.3: {}
|
||||
|
||||
is-negative-zero@2.0.3: {}
|
||||
@ -6219,6 +6374,14 @@ snapshots:
|
||||
call-bind: 1.0.7
|
||||
get-intrinsic: 1.2.4
|
||||
|
||||
is-wsl@3.1.0:
|
||||
dependencies:
|
||||
is-inside-container: 1.0.0
|
||||
|
||||
is64bit@2.0.0:
|
||||
dependencies:
|
||||
system-architecture: 0.1.0
|
||||
|
||||
isarray@2.0.5: {}
|
||||
|
||||
isexe@2.0.0: {}
|
||||
@ -6329,6 +6492,27 @@ snapshots:
|
||||
|
||||
lines-and-columns@1.2.4: {}
|
||||
|
||||
listhen@1.9.0:
|
||||
dependencies:
|
||||
'@parcel/watcher': 2.5.0(patch_hash=pyfayeoxwesjxsefsxp3jpev4q)
|
||||
'@parcel/watcher-wasm': 2.5.0
|
||||
citty: 0.1.6
|
||||
clipboardy: 4.0.0
|
||||
consola: 3.2.3
|
||||
crossws: 0.3.1
|
||||
defu: 6.1.4
|
||||
get-port-please: 3.1.2
|
||||
h3: 1.13.0
|
||||
http-shutdown: 1.2.2
|
||||
jiti: 2.4.2
|
||||
mlly: 1.7.3
|
||||
node-forge: 1.3.1
|
||||
pathe: 1.1.2
|
||||
std-env: 3.7.0
|
||||
ufo: 1.5.4
|
||||
untun: 0.1.3
|
||||
uqr: 0.1.2
|
||||
|
||||
load-tsconfig@0.2.5: {}
|
||||
|
||||
locate-path@6.0.0:
|
||||
@ -6372,6 +6556,8 @@ snapshots:
|
||||
braces: 3.0.3
|
||||
picomatch: 2.3.1
|
||||
|
||||
mime@3.0.0: {}
|
||||
|
||||
mimic-fn@2.1.0: {}
|
||||
|
||||
mimic-fn@4.0.0: {}
|
||||
@ -6390,6 +6576,13 @@ snapshots:
|
||||
|
||||
minipass@7.1.2: {}
|
||||
|
||||
mlly@1.7.3:
|
||||
dependencies:
|
||||
acorn: 8.14.0
|
||||
pathe: 1.1.2
|
||||
pkg-types: 1.3.0
|
||||
ufo: 1.5.4
|
||||
|
||||
mri@1.2.0: {}
|
||||
|
||||
ms@2.1.2: {}
|
||||
@ -6436,6 +6629,10 @@ snapshots:
|
||||
|
||||
node-addon-api@8.2.2: {}
|
||||
|
||||
node-fetch-native@1.6.4: {}
|
||||
|
||||
node-forge@1.3.1: {}
|
||||
|
||||
node-gyp-build@4.8.2: {}
|
||||
|
||||
node-releases@2.0.18: {}
|
||||
@ -6492,6 +6689,8 @@ snapshots:
|
||||
define-properties: 1.2.1
|
||||
es-object-atoms: 1.0.0
|
||||
|
||||
ohash@1.1.4: {}
|
||||
|
||||
onetime@5.1.2:
|
||||
dependencies:
|
||||
mimic-fn: 2.1.0
|
||||
@ -6556,6 +6755,12 @@ snapshots:
|
||||
|
||||
pirates@4.0.6: {}
|
||||
|
||||
pkg-types@1.3.0:
|
||||
dependencies:
|
||||
confbox: 0.1.8
|
||||
mlly: 1.7.3
|
||||
pathe: 1.1.2
|
||||
|
||||
playwright-core@1.49.1: {}
|
||||
|
||||
playwright@1.49.1:
|
||||
@ -6684,6 +6889,8 @@ snapshots:
|
||||
|
||||
queue-microtask@1.2.3: {}
|
||||
|
||||
radix3@1.1.2: {}
|
||||
|
||||
react-dom@18.3.1(react@18.3.1):
|
||||
dependencies:
|
||||
loose-envify: 1.4.0
|
||||
@ -7002,6 +7209,8 @@ snapshots:
|
||||
|
||||
supports-preserve-symlinks-flag@1.0.0: {}
|
||||
|
||||
system-architecture@0.1.0: {}
|
||||
|
||||
tailwindcss@3.4.14:
|
||||
dependencies:
|
||||
'@alloc/quick-lru': 5.2.0
|
||||
@ -7210,6 +7419,8 @@ snapshots:
|
||||
|
||||
typescript@5.6.3: {}
|
||||
|
||||
ufo@1.5.4: {}
|
||||
|
||||
unbox-primitive@1.0.2:
|
||||
dependencies:
|
||||
call-bind: 1.0.7
|
||||
@ -7217,16 +7428,34 @@ snapshots:
|
||||
has-symbols: 1.0.3
|
||||
which-boxed-primitive: 1.0.2
|
||||
|
||||
uncrypto@0.1.3: {}
|
||||
|
||||
undici-types@5.26.5: {}
|
||||
|
||||
unenv@1.10.0:
|
||||
dependencies:
|
||||
consola: 3.2.3
|
||||
defu: 6.1.4
|
||||
mime: 3.0.0
|
||||
node-fetch-native: 1.6.4
|
||||
pathe: 1.1.2
|
||||
|
||||
unicorn-magic@0.1.0: {}
|
||||
|
||||
untun@0.1.3:
|
||||
dependencies:
|
||||
citty: 0.1.6
|
||||
consola: 3.2.3
|
||||
pathe: 1.1.2
|
||||
|
||||
update-browserslist-db@1.1.1(browserslist@4.24.2):
|
||||
dependencies:
|
||||
browserslist: 4.24.2
|
||||
escalade: 3.2.0
|
||||
picocolors: 1.1.1
|
||||
|
||||
uqr@0.1.2: {}
|
||||
|
||||
uri-js@4.4.1:
|
||||
dependencies:
|
||||
punycode: 2.3.1
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user