From b4523f8ec56419117875cddcabc2e5ce9596729d Mon Sep 17 00:00:00 2001 From: Austin1serb Date: Mon, 6 Apr 2026 00:10:19 -0600 Subject: [PATCH 1/2] Fix PostCSS packaging and upgrade test fixtures --- .github/dependabot.yml | 49 ++ .github/workflows/compat.yml | 110 +++++ packages/core/__tests__/e2e/next-ssr.spec.js | 4 +- .../__tests__/fixtures/next/next-env.d.ts | 1 + .../core/__tests__/fixtures/next/package.json | 14 +- .../__tests__/fixtures/next/tsconfig.json | 7 +- .../core/__tests__/fixtures/vite/package.json | 18 +- packages/core/__tests__/unit/index.test.cjs | 29 ++ packages/core/src/index.ts | 58 ++- packages/core/src/postcss/index.cts | 60 ++- pnpm-lock.yaml | 426 ++++++++++++++++-- scripts/set-compat-fixture-versions.mjs | 64 +++ 12 files changed, 743 insertions(+), 97 deletions(-) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/compat.yml create mode 100644 scripts/set-compat-fixture-versions.mjs diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..a528f90 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,49 @@ +version: 2 +updates: + - package-ecosystem: npm + directory: /packages/core/__tests__/fixtures/next + schedule: + interval: daily + time: "14:00" + timezone: America/Boise + open-pull-requests-limit: 5 + labels: + - dependencies + - compat + allow: + - dependency-name: next + - dependency-name: react + - dependency-name: react-dom + - dependency-name: "@types/react" + - dependency-name: "@types/react-dom" + groups: + next-stack: + patterns: + - next + - react + - react-dom + - "@types/react" + - "@types/react-dom" + + - package-ecosystem: npm + directory: /packages/core/__tests__/fixtures/vite + schedule: + interval: daily + time: "14:00" + timezone: America/Boise + open-pull-requests-limit: 5 + labels: + - dependencies + - compat + allow: + - dependency-name: react + - dependency-name: react-dom + - dependency-name: "@types/react" + - dependency-name: "@types/react-dom" + groups: + react-stack: + patterns: + - react + - react-dom + - "@types/react" + - "@types/react-dom" diff --git a/.github/workflows/compat.yml b/.github/workflows/compat.yml new file mode 100644 index 0000000..f2269ad --- /dev/null +++ b/.github/workflows/compat.yml @@ -0,0 +1,110 @@ +name: Compatibility + +on: + schedule: + - cron: '0 14 * * 1' + workflow_dispatch: + inputs: + next_version: + description: Next.js version or dist-tag + required: false + default: latest + react_version: + description: React and react-dom version or dist-tag + required: false + default: latest + react_dom_version: + description: Optional react-dom override + required: false + default: '' + types_react_version: + description: Optional @types/react override + required: false + default: latest + types_react_dom_version: + description: Optional @types/react-dom override + required: false + default: latest + +permissions: + contents: read + +concurrency: + group: compatibility-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + latest-stack: + name: Latest React / Next Stack + runs-on: ubuntu-latest + timeout-minutes: 30 + env: + NEXT_VERSION: ${{ github.event.inputs.next_version || 'latest' }} + REACT_VERSION: ${{ github.event.inputs.react_version || 'latest' }} + REACT_DOM_VERSION: ${{ github.event.inputs.react_dom_version || '' }} + TYPES_REACT_VERSION: ${{ github.event.inputs.types_react_version || 'latest' }} + TYPES_REACT_DOM_VERSION: ${{ github.event.inputs.types_react_dom_version || 'latest' }} + + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v3 + with: + version: 10.12.1 + run_install: false + + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: pnpm + + - name: Install workspace dependencies + run: pnpm install --no-frozen-lockfile + + - name: Cache Playwright browsers + id: pw-cache + uses: actions/cache@v4 + with: + path: ~/.cache/ms-playwright + key: ${{ runner.os }}-playwright-${{ hashFiles('packages/core/package.json') }} + restore-keys: | + ${{ runner.os }}-playwright- + + - name: Install Playwright browsers (if cache miss) + if: steps.pw-cache.outputs.cache-hit != 'true' + run: pnpm --filter @react-zero-ui/core exec playwright install --with-deps + + - name: Rewrite fixture versions + run: node scripts/set-compat-fixture-versions.mjs + + - name: Lint + run: pnpm lint + + - name: Run Build + run: pnpm build + + - name: Run Prepack + run: pnpm prepack:core + + - name: Install packed core into fixtures + run: | + TARBALL="$(pwd)/$(ls -t dist/*.tgz | head -n1)" + pnpm --dir packages/core/__tests__/fixtures/next add "$TARBALL" + pnpm --dir packages/core/__tests__/fixtures/next install --no-frozen-lockfile + pnpm --dir packages/core/__tests__/fixtures/vite add "$TARBALL" + pnpm --dir packages/core/__tests__/fixtures/vite install --no-frozen-lockfile + + - name: Run Vite tests + run: pnpm test:vite + + - name: Run Next.js tests + run: pnpm test:next + + - name: Run unit tests + run: pnpm test:unit + + - name: Run CLI tests + run: pnpm test:cli + + - name: Run integration tests + run: pnpm test:integration diff --git a/packages/core/__tests__/e2e/next-ssr.spec.js b/packages/core/__tests__/e2e/next-ssr.spec.js index 12255ea..1fcf3ce 100644 --- a/packages/core/__tests__/e2e/next-ssr.spec.js +++ b/packages/core/__tests__/e2e/next-ssr.spec.js @@ -251,8 +251,8 @@ test.describe('Zero-UI Comprehensive Test Suite', () => { await expect(themeTest).toHaveCSS('background-color', 'rgb(0, 0, 0)'); // black // Color styling - await expect(colorTest).toHaveCSS('background-color', 'oklch(0.637 0.237 25.331)'); // red-500 + await expect(colorTest).toHaveCSS('background-color', 'lab(55.4814 75.0732 48.8528)'); // red-500 await page.getByTestId('color-blue').click(); - await expect(colorTest).toHaveCSS('background-color', 'oklch(0.623 0.214 259.815)'); // blue-500 + await expect(colorTest).toHaveCSS('background-color', 'lab(54.1736 13.3369 -74.6839)'); // blue-500 }); }); diff --git a/packages/core/__tests__/fixtures/next/next-env.d.ts b/packages/core/__tests__/fixtures/next/next-env.d.ts index 1b3be08..9edff1c 100644 --- a/packages/core/__tests__/fixtures/next/next-env.d.ts +++ b/packages/core/__tests__/fixtures/next/next-env.d.ts @@ -1,5 +1,6 @@ /// /// +import "./.next/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/packages/core/__tests__/fixtures/next/package.json b/packages/core/__tests__/fixtures/next/package.json index 99de055..356b81b 100644 --- a/packages/core/__tests__/fixtures/next/package.json +++ b/packages/core/__tests__/fixtures/next/package.json @@ -8,17 +8,17 @@ "clean": "rm -rf .next node_modules package-lock.json" }, "dependencies": { - "next": "15.0.7", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "next": "16.2.2", + "react": "19.2.4", + "react-dom": "19.2.4" }, "devDependencies": { - "@tailwindcss/postcss": "^4.1.10", + "@tailwindcss/postcss": "4.2.2", "@types/node": "24.0.0", - "@types/react": "19.1.7", + "@types/react": "19.2.14", "eslint-plugin-react-zero-ui": "0.0.1-beta.1", - "postcss": "^8.5.5", - "tailwindcss": "^4.1.10", + "postcss": "8.5.8", + "tailwindcss": "4.2.2", "typescript": "5.8.3" } } diff --git a/packages/core/__tests__/fixtures/next/tsconfig.json b/packages/core/__tests__/fixtures/next/tsconfig.json index a976c3c..8e80681 100644 --- a/packages/core/__tests__/fixtures/next/tsconfig.json +++ b/packages/core/__tests__/fixtures/next/tsconfig.json @@ -7,7 +7,7 @@ ], "allowJs": true, "skipLibCheck": true, - "strict": false, + "strict": true, "noEmit": true, "incremental": true, "module": "ESNext", @@ -15,7 +15,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve", + "jsx": "react-jsx", "plugins": [ { "name": "next" @@ -35,7 +35,8 @@ ".next/**/*.d.ts", ".next/types/**/*.ts", ".zero-ui/**/*.d.ts", - "next-env.d.ts" + "next-env.d.ts", + ".next/dev/types/**/*.ts" ], "exclude": [ "node_modules" diff --git a/packages/core/__tests__/fixtures/vite/package.json b/packages/core/__tests__/fixtures/vite/package.json index 8727de5..9d74147 100644 --- a/packages/core/__tests__/fixtures/vite/package.json +++ b/packages/core/__tests__/fixtures/vite/package.json @@ -9,17 +9,17 @@ "build-and-preview": "vite build && vite preview --port 5173" }, "dependencies": { - "react": "^19.1.0", - "react-dom": "^19.1.0" + "react": "19.2.4", + "react-dom": "19.2.4" }, "devDependencies": { - "@tailwindcss/postcss": "^4.1.10", - "@types/react": "^19.1.2", - "@types/react-dom": "^19.1.2", - "@vitejs/plugin-react": "^4.4.1", - "postcss": "^8.5.5", - "tailwindcss": "^4.1.10", + "@tailwindcss/postcss": "4.2.2", + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", + "@vitejs/plugin-react": "6.0.1", + "postcss": "8.5.8", + "tailwindcss": "4.2.2", "typescript": "~5.8.3", - "vite": "^6.3.5" + "vite": "8.0.3" } } diff --git a/packages/core/__tests__/unit/index.test.cjs b/packages/core/__tests__/unit/index.test.cjs index e56720a..17bc5e8 100644 --- a/packages/core/__tests__/unit/index.test.cjs +++ b/packages/core/__tests__/unit/index.test.cjs @@ -96,6 +96,35 @@ test('generates body attributes file correctly', async () => { ); }); +test('warns instead of auto-initializing when project setup is missing', async () => { + await runTest( + { + 'app/test.jsx': ` + import { useUI } from '@react-zero-ui/core'; + + function Component() { + const [theme, setTheme] = useUI('theme', 'light'); + return
Test
; + } + `, + }, + (result) => { + assert(fs.existsSync(getAttrFile()), 'Attributes file should still be generated'); + assert(!fs.existsSync('postcss.config.js'), 'PostCSS plugin should not create postcss.config.js'); + assert(!fs.existsSync('postcss.config.mjs'), 'PostCSS plugin should not create postcss.config.mjs'); + assert(!fs.existsSync('tsconfig.json'), 'PostCSS plugin should not patch tsconfig'); + + const warnings = result.warnings().map((warning) => warning.text); + assert( + warnings.some( + (text) => text.includes('Zero UI is not initialized') && text.includes('react-zero-ui') + ), + 'Expected a setup warning instead of auto-initialization' + ); + } + ); +}); + test('generates body attributes file correctly when kebab-case is used', async () => { await runTest( { diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 0f452c2..1b6e2eb 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,10 +1,10 @@ 'use client'; -import { useRef, type RefObject } from 'react'; +import { useRef } from 'react'; import { cssVar, makeSetter } from './internal.js'; type UIAction = T | ((prev: T) => T); -type ScopedRef = RefObject | (((node: HTMLElement | null) => void) & { current: HTMLElement | null }); +type ScopedRef = ((node: HTMLElement | null) => void) & { current: HTMLElement | null }; interface ScopedSetterFn { (action: UIAction): void; // ← SINGLE source of truth @@ -22,40 +22,38 @@ function useScopedUI(key: string, initialValue: T, fl // Create a ref to hold the DOM element that will receive the data-* attributes // This allows scoping UI state to specific elements instead of always using document.body const scopeRef = useRef(null); - const setterFn = useRef(makeSetter(key, initialValue, () => scopeRef.current!, flag)).current as ScopedSetterFn; - - if (process.env.NODE_ENV !== 'production') { - // -- DEV-ONLY MULTIPLE REF GUARD (removed in production by modern bundlers) -- - // Attach the ref to the setter function so users can write:
- const refAttachCount = useRef(0); - // DEV: Wrap scopeRef to detect multiple attachments - const attachRef = ((node: HTMLElement | null) => { - if (node) { - refAttachCount!.current++; - if (refAttachCount!.current > 1) { - // TODO add documentation link - throw new Error( - `[useUI] Multiple ref attachments detected for key "${key}". ` + - `Each useScopedUI hook supports only one ref attachment per component. ` + - `Solution: Create separate component. and reuse.\n` + - `React Strict Mode May Cause the Ref to be attached multiple times.` - ); + const refAttachCount = useRef(0); + const attachRef = useRef(null); + + if (!attachRef.current) { + attachRef.current = ((node: HTMLElement | null) => { + if (process.env.NODE_ENV !== 'production') { + if (node) { + refAttachCount.current++; + if (refAttachCount.current > 1) { + // TODO add documentation link + throw new Error( + `[useUI] Multiple ref attachments detected for key "${key}". ` + + `Each useScopedUI hook supports only one ref attachment per component. ` + + `Solution: Create separate component. and reuse.\n` + + `React Strict Mode May Cause the Ref to be attached multiple times.` + ); + } + } else { + // Handle cleanup when ref is detached + refAttachCount.current = Math.max(0, refAttachCount.current - 1); } - } else { - // Handle cleanup when ref is detached - refAttachCount!.current = Math.max(0, refAttachCount!.current - 1); } + scopeRef.current = node; - attachRef.current = node; - }) as ((node: HTMLElement | null) => void) & { current: HTMLElement | null }; - attachRef.current = null; - (setterFn as ScopedSetterFn).ref = attachRef; - } else { - // PROD: Direct ref assignment for zero overhead - setterFn.ref = scopeRef; + attachRef.current!.current = node; + }) as ScopedRef; + attachRef.current.current = null; } + setterFn.ref = attachRef.current; + // Return tuple matching React's useState pattern: [initialValue, setter] return [initialValue, setterFn]; } diff --git a/packages/core/src/postcss/index.cts b/packages/core/src/postcss/index.cts index 7636921..033cf1c 100644 --- a/packages/core/src/postcss/index.cts +++ b/packages/core/src/postcss/index.cts @@ -2,21 +2,60 @@ /** * @type {import('postcss').PluginCreator} */ -import { buildCss, generateAttributesFile, isZeroUiInitialized } from './helpers'; -import { runZeroUiInit } from '../cli/postInstall.js'; -import { processVariants } from './ast-parsing'; -import { CONFIG } from '../config'; -import { formatError, registerDeps, Result } from './utilities.js'; - type Root = { prepend: (css: string) => void }; +type Result = { + messages: { type: string; plugin: string; file: string; parent: string }[]; + opts: { from: string }; + prepend: (css: string) => void; + warn: (message: string, options?: { endIndex?: number; index?: number; node?: Node; plugin?: string; word?: string }) => void; +}; +type RuntimeModules = { + buildCss: typeof import('./helpers.js').buildCss; + generateAttributesFile: typeof import('./helpers.js').generateAttributesFile; + isZeroUiInitialized: typeof import('./helpers.js').isZeroUiInitialized; + processVariants: typeof import('./ast-parsing.js').processVariants; + formatError: typeof import('./utilities.js').formatError; + registerDeps: typeof import('./utilities.js').registerDeps; +}; + +const zeroUIPlugin = 'postcss-react-zero-ui'; +const warnedCwds = new Set(); +let runtimeModulesPromise: Promise | null = null; + +function loadRuntimeModules(): Promise { + if (!runtimeModulesPromise) { + runtimeModulesPromise = Promise.all([import('./helpers.js'), import('./ast-parsing.js'), import('./utilities.js')]).then( + ([helpers, astParsing, utilities]) => ({ + buildCss: helpers.buildCss, + generateAttributesFile: helpers.generateAttributesFile, + isZeroUiInitialized: helpers.isZeroUiInitialized, + processVariants: astParsing.processVariants, + formatError: utilities.formatError, + registerDeps: utilities.registerDeps, + }) + ); + } -const zeroUIPlugin = CONFIG.PLUGIN_NAME; + return runtimeModulesPromise; +} + +function warnIfNotInitialized(result: Result, isZeroUiInitialized: RuntimeModules['isZeroUiInitialized']) { + const cwd = process.cwd(); + + if (isZeroUiInitialized() || warnedCwds.has(cwd)) { + return; + } + + warnedCwds.add(cwd); + result.warn('[Zero-UI] Zero UI is not initialized. Run `react-zero-ui` to patch your project config.', { plugin: zeroUIPlugin }); +} const plugin = () => { return { postcssPlugin: zeroUIPlugin, async Once(root: Root, { result }: { result: Result }) { try { + const { buildCss, generateAttributesFile, isZeroUiInitialized, processVariants, formatError, registerDeps } = await loadRuntimeModules(); const { finalVariants, initialGlobalValues, sourceFiles } = await processVariants(); const cssBlock = buildCss(finalVariants); @@ -25,13 +64,10 @@ const plugin = () => { /* ── register file-dependencies for HMR ─────────────────── */ registerDeps(result, zeroUIPlugin, sourceFiles, result.opts.from ?? ''); - /* ── first-run bootstrap ────────────────────────────────── */ - if (!isZeroUiInitialized()) { - console.log('[Zero-UI] Auto-initializing (first-time setup)…'); - await runZeroUiInit(); - } + warnIfNotInitialized(result, isZeroUiInitialized); await generateAttributesFile(finalVariants, initialGlobalValues); } catch (err: unknown) { + const { formatError, registerDeps } = await loadRuntimeModules(); const { friendly, loc } = formatError(err); if (process.env.NODE_ENV !== 'production') { if (loc?.file) registerDeps(result, zeroUIPlugin, [loc.file], result.opts.from ?? ''); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d6957c9..c34af38 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,13 +19,13 @@ importers: version: 0.25.8 eslint: specifier: ^9.32.0 - version: 9.32.0(jiti@2.5.1) + version: 9.32.0(jiti@2.6.1) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(eslint@9.32.0(jiti@2.5.1)) + version: 2.32.0(eslint@9.32.0(jiti@2.6.1)) eslint-plugin-n: specifier: ^17.21.3 - version: 17.21.3(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2) + version: 17.21.3(eslint@9.32.0(jiti@2.6.1))(typescript@5.9.2) prettier: specifier: ^3.6.2 version: 3.6.2 @@ -95,7 +95,7 @@ importers: dependencies: '@react-zero-ui/core': specifier: ^0.3.3 - version: 0.3.3(@tailwindcss/postcss@4.1.11)(react@19.1.1) + version: 0.3.3(@tailwindcss/postcss@4.2.2)(react@19.2.4) packages/core: dependencies: @@ -162,17 +162,17 @@ importers: dependencies: '@typescript-eslint/parser': specifier: ^8.39.0 - version: 8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2) + version: 8.39.0(eslint@9.32.0(jiti@2.6.1))(typescript@5.9.2) eslint: specifier: ^9.0.0 - version: 9.32.0(jiti@2.5.1) + version: 9.32.0(jiti@2.6.1) typescript: specifier: ^5.9.2 version: 5.9.2 devDependencies: '@typescript-eslint/utils': specifier: ^8.39.0 - version: 8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2) + version: 8.39.0(eslint@9.32.0(jiti@2.6.1))(typescript@5.9.2) packages: @@ -734,6 +734,9 @@ packages: '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -741,6 +744,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.4': resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.29': resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} @@ -997,60 +1003,117 @@ packages: '@tailwindcss/node@4.1.11': resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==} + '@tailwindcss/node@4.2.2': + resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} + '@tailwindcss/oxide-android-arm64@4.1.11': resolution: {integrity: sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==} engines: {node: '>= 10'} cpu: [arm64] os: [android] + '@tailwindcss/oxide-android-arm64@4.2.2': + resolution: {integrity: sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + '@tailwindcss/oxide-darwin-arm64@4.1.11': resolution: {integrity: sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] + '@tailwindcss/oxide-darwin-arm64@4.2.2': + resolution: {integrity: sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + '@tailwindcss/oxide-darwin-x64@4.1.11': resolution: {integrity: sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@tailwindcss/oxide-darwin-x64@4.2.2': + resolution: {integrity: sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + '@tailwindcss/oxide-freebsd-x64@4.1.11': resolution: {integrity: sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] + '@tailwindcss/oxide-freebsd-x64@4.2.2': + resolution: {integrity: sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': resolution: {integrity: sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + resolution: {integrity: sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': resolution: {integrity: sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + resolution: {integrity: sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + '@tailwindcss/oxide-linux-arm64-musl@4.1.11': resolution: {integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + resolution: {integrity: sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + '@tailwindcss/oxide-linux-x64-gnu@4.1.11': resolution: {integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + resolution: {integrity: sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + '@tailwindcss/oxide-linux-x64-musl@4.1.11': resolution: {integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + resolution: {integrity: sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + '@tailwindcss/oxide-wasm32-wasi@4.1.11': resolution: {integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==} engines: {node: '>=14.0.0'} @@ -1063,25 +1126,56 @@ packages: - '@emnapi/wasi-threads' - tslib + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': resolution: {integrity: sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + resolution: {integrity: sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + '@tailwindcss/oxide-win32-x64-msvc@4.1.11': resolution: {integrity: sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + resolution: {integrity: sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + '@tailwindcss/oxide@4.1.11': resolution: {integrity: sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==} engines: {node: '>= 10'} + '@tailwindcss/oxide@4.2.2': + resolution: {integrity: sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==} + engines: {node: '>= 20'} + '@tailwindcss/postcss@4.1.11': resolution: {integrity: sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==} + '@tailwindcss/postcss@4.2.2': + resolution: {integrity: sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==} + '@types/babel__code-frame@7.0.6': resolution: {integrity: sha512-Anitqkl3+KrzcW2k77lRlg/GfLZLWXBuNgbEcIOU6M92yw42vsd3xV/Z/yAHEj8m+KUjL6bWOVOFqX8PFPJ4LA==} @@ -1419,6 +1513,10 @@ packages: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -1451,6 +1549,10 @@ packages: resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} engines: {node: '>=10.13.0'} + enhanced-resolve@5.20.1: + resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} + engines: {node: '>=10.13.0'} + entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -1907,6 +2009,10 @@ packages: resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1948,70 +2054,140 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + lightningcss-darwin-arm64@1.30.1: resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + lightningcss-darwin-x64@1.30.1: resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + lightningcss-freebsd-x64@1.30.1: resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + lightningcss-linux-arm-gnueabihf@1.30.1: resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + lightningcss-linux-arm64-gnu@1.30.1: resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + lightningcss-linux-arm64-musl@1.30.1: resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + lightningcss-linux-x64-gnu@1.30.1: resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + lightningcss-linux-x64-musl@1.30.1: resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + lightningcss-win32-arm64-msvc@1.30.1: resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + lightningcss-win32-x64-msvc@1.30.1: resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + lightningcss@1.30.1: resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} engines: {node: '>= 12.0.0'} + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -2041,6 +2217,9 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -2242,6 +2421,10 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + engines: {node: ^10 || ^12 || >=14} + preact@10.27.0: resolution: {integrity: sha512-/DTYoB6mwwgPytiqQTh/7SFRL98ZdiD8Sk8zIUVOxtwq4oWcwrcd1uno9fE/zZmUaUrFNYzbH14CPebOz9tZQw==} @@ -2296,6 +2479,10 @@ packages: resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} engines: {node: '>=0.10.0'} + react@19.2.4: + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + engines: {node: '>=0.10.0'} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -2467,10 +2654,17 @@ packages: tailwindcss@4.1.11: resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} + tailwindcss@4.2.2: + resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} + tapable@2.2.2: resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} engines: {node: '>=6'} + tapable@2.3.2: + resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} + engines: {node: '>=6'} + tar@7.4.3: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} @@ -3032,9 +3226,9 @@ snapshots: '@esbuild/win32-x64@0.25.8': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.32.0(jiti@2.5.1))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.32.0(jiti@2.6.1))': dependencies: - eslint: 9.32.0(jiti@2.5.1) + eslint: 9.32.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -3181,17 +3375,24 @@ snapshots: '@jridgewell/gen-mapping@0.3.12': dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.29 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.12 '@jridgewell/trace-mapping': 0.3.29 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.4': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.29': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 '@lezer/common@1.2.3': {} @@ -3303,6 +3504,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@react-zero-ui/core@0.3.3(@tailwindcss/postcss@4.2.2)(react@19.2.4)': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.2 + '@tailwindcss/postcss': 4.2.2 + fast-glob: 3.3.3 + lru-cache: 11.1.0 + react: 19.2.4 + transitivePeerDependencies: + - supports-color + '@react-zero-ui/icon-sprite@0.1.4(react@19.1.1)': dependencies: '@babel/core': 7.28.0 @@ -3404,42 +3619,88 @@ snapshots: source-map-js: 1.2.1 tailwindcss: 4.1.11 + '@tailwindcss/node@4.2.2': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.20.1 + jiti: 2.6.1 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.2.2 + '@tailwindcss/oxide-android-arm64@4.1.11': optional: true + '@tailwindcss/oxide-android-arm64@4.2.2': + optional: true + '@tailwindcss/oxide-darwin-arm64@4.1.11': optional: true + '@tailwindcss/oxide-darwin-arm64@4.2.2': + optional: true + '@tailwindcss/oxide-darwin-x64@4.1.11': optional: true + '@tailwindcss/oxide-darwin-x64@4.2.2': + optional: true + '@tailwindcss/oxide-freebsd-x64@4.1.11': optional: true + '@tailwindcss/oxide-freebsd-x64@4.2.2': + optional: true + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': optional: true + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + optional: true + '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': optional: true + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + optional: true + '@tailwindcss/oxide-linux-arm64-musl@4.1.11': optional: true + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + optional: true + '@tailwindcss/oxide-linux-x64-gnu@4.1.11': optional: true + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + optional: true + '@tailwindcss/oxide-linux-x64-musl@4.1.11': optional: true + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + optional: true + '@tailwindcss/oxide-wasm32-wasi@4.1.11': optional: true + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + optional: true + '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': optional: true + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + optional: true + '@tailwindcss/oxide-win32-x64-msvc@4.1.11': optional: true + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + optional: true + '@tailwindcss/oxide@4.1.11': dependencies: detect-libc: 2.0.4 @@ -3458,6 +3719,21 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 + '@tailwindcss/oxide@4.2.2': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-x64': 4.2.2 + '@tailwindcss/oxide-freebsd-x64': 4.2.2 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.2 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.2 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-x64-musl': 4.2.2 + '@tailwindcss/oxide-wasm32-wasi': 4.2.2 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 + '@tailwindcss/postcss@4.1.11': dependencies: '@alloc/quick-lru': 5.2.0 @@ -3466,6 +3742,14 @@ snapshots: postcss: 8.5.6 tailwindcss: 4.1.11 + '@tailwindcss/postcss@4.2.2': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.2.2 + '@tailwindcss/oxide': 4.2.2 + postcss: 8.5.8 + tailwindcss: 4.2.2 + '@types/babel__code-frame@7.0.6': {} '@types/babel__core@7.20.5': @@ -3515,14 +3799,14 @@ snapshots: dependencies: csstype: 3.1.3 - '@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.6.1))(typescript@5.9.2)': dependencies: '@typescript-eslint/scope-manager': 8.39.0 '@typescript-eslint/types': 8.39.0 '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.39.0 debug: 4.4.1 - eslint: 9.32.0(jiti@2.5.1) + eslint: 9.32.0(jiti@2.6.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -3563,13 +3847,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.39.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/utils@8.39.0(eslint@9.32.0(jiti@2.6.1))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.39.0 '@typescript-eslint/types': 8.39.0 '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) - eslint: 9.32.0(jiti@2.5.1) + eslint: 9.32.0(jiti@2.6.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -3846,6 +4130,8 @@ snapshots: detect-libc@2.0.4: {} + detect-libc@2.1.2: {} + doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -3883,6 +4169,11 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.2 + enhanced-resolve@5.20.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.2 + entities@2.2.0: {} es-abstract@1.24.0: @@ -4020,9 +4311,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.32.0(jiti@2.5.1)): + eslint-compat-utils@0.5.1(eslint@9.32.0(jiti@2.6.1)): dependencies: - eslint: 9.32.0(jiti@2.5.1) + eslint: 9.32.0(jiti@2.6.1) semver: 7.7.2 eslint-import-resolver-node@0.3.9: @@ -4033,23 +4324,23 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.5.1)): + eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - eslint: 9.32.0(jiti@2.5.1) + eslint: 9.32.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-es-x@7.8.0(eslint@9.32.0(jiti@2.5.1)): + eslint-plugin-es-x@7.8.0(eslint@9.32.0(jiti@2.6.1)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 - eslint: 9.32.0(jiti@2.5.1) - eslint-compat-utils: 0.5.1(eslint@9.32.0(jiti@2.5.1)) + eslint: 9.32.0(jiti@2.6.1) + eslint-compat-utils: 0.5.1(eslint@9.32.0(jiti@2.6.1)) - eslint-plugin-import@2.32.0(eslint@9.32.0(jiti@2.5.1)): + eslint-plugin-import@2.32.0(eslint@9.32.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -4058,9 +4349,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.32.0(jiti@2.5.1) + eslint: 9.32.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.5.1)) + eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -4076,12 +4367,12 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-n@17.21.3(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2): + eslint-plugin-n@17.21.3(eslint@9.32.0(jiti@2.6.1))(typescript@5.9.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.6.1)) enhanced-resolve: 5.18.2 - eslint: 9.32.0(jiti@2.5.1) - eslint-plugin-es-x: 7.8.0(eslint@9.32.0(jiti@2.5.1)) + eslint: 9.32.0(jiti@2.6.1) + eslint-plugin-es-x: 7.8.0(eslint@9.32.0(jiti@2.6.1)) get-tsconfig: 4.10.1 globals: 15.15.0 globrex: 0.1.2 @@ -4100,9 +4391,9 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.32.0(jiti@2.5.1): + eslint@9.32.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.0 @@ -4138,7 +4429,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.5.1 + jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -4469,6 +4760,8 @@ snapshots: jiti@2.5.1: {} + jiti@2.6.1: {} + js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -4500,36 +4793,69 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lightningcss-android-arm64@1.32.0: + optional: true + lightningcss-darwin-arm64@1.30.1: optional: true + lightningcss-darwin-arm64@1.32.0: + optional: true + lightningcss-darwin-x64@1.30.1: optional: true + lightningcss-darwin-x64@1.32.0: + optional: true + lightningcss-freebsd-x64@1.30.1: optional: true + lightningcss-freebsd-x64@1.32.0: + optional: true + lightningcss-linux-arm-gnueabihf@1.30.1: optional: true + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + lightningcss-linux-arm64-gnu@1.30.1: optional: true + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + lightningcss-linux-arm64-musl@1.30.1: optional: true + lightningcss-linux-arm64-musl@1.32.0: + optional: true + lightningcss-linux-x64-gnu@1.30.1: optional: true + lightningcss-linux-x64-gnu@1.32.0: + optional: true + lightningcss-linux-x64-musl@1.30.1: optional: true + lightningcss-linux-x64-musl@1.32.0: + optional: true + lightningcss-win32-arm64-msvc@1.30.1: optional: true + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + lightningcss-win32-x64-msvc@1.30.1: optional: true + lightningcss-win32-x64-msvc@1.32.0: + optional: true + lightningcss@1.30.1: dependencies: detect-libc: 2.0.4 @@ -4545,6 +4871,22 @@ snapshots: lightningcss-win32-arm64-msvc: 1.30.1 lightningcss-win32-x64-msvc: 1.30.1 + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -4569,6 +4911,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.4 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + math-intrinsics@1.1.0: {} merge2@1.4.1: {} @@ -4756,6 +5102,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.8: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + preact@10.27.0: {} prelude-ls@1.2.1: {} @@ -4808,6 +5160,8 @@ snapshots: react@19.1.1: {} + react@19.2.4: {} + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -5055,8 +5409,12 @@ snapshots: tailwindcss@4.1.11: {} + tailwindcss@4.2.2: {} + tapable@2.2.2: {} + tapable@2.3.2: {} + tar@7.4.3: dependencies: '@isaacs/fs-minipass': 4.0.1 diff --git a/scripts/set-compat-fixture-versions.mjs b/scripts/set-compat-fixture-versions.mjs new file mode 100644 index 0000000..77a0737 --- /dev/null +++ b/scripts/set-compat-fixture-versions.mjs @@ -0,0 +1,64 @@ +import { readFile, writeFile } from 'node:fs/promises'; +import path from 'node:path'; + +const rootDir = process.cwd(); +const dryRun = process.env.DRY_RUN === '1'; + +function envOrDefault(name, fallback) { + const value = process.env[name]?.trim(); + return value ? value : fallback; +} + +const versions = { + next: envOrDefault('NEXT_VERSION', 'latest'), + react: envOrDefault('REACT_VERSION', 'latest'), + reactDom: envOrDefault('REACT_DOM_VERSION', envOrDefault('REACT_VERSION', 'latest')), + typesReact: envOrDefault('TYPES_REACT_VERSION', 'latest'), + typesReactDom: envOrDefault('TYPES_REACT_DOM_VERSION', 'latest'), +}; + +const manifests = [ + { + file: 'packages/core/__tests__/fixtures/next/package.json', + update(pkg) { + pkg.dependencies.next = versions.next; + pkg.dependencies.react = versions.react; + pkg.dependencies['react-dom'] = versions.reactDom; + pkg.devDependencies['@types/react'] = versions.typesReact; + if (pkg.devDependencies['@types/react-dom']) { + pkg.devDependencies['@types/react-dom'] = versions.typesReactDom; + } + return pkg; + }, + }, + { + file: 'packages/core/__tests__/fixtures/vite/package.json', + update(pkg) { + pkg.dependencies.react = versions.react; + pkg.dependencies['react-dom'] = versions.reactDom; + pkg.devDependencies['@types/react'] = versions.typesReact; + if (pkg.devDependencies['@types/react-dom']) { + pkg.devDependencies['@types/react-dom'] = versions.typesReactDom; + } + return pkg; + }, + }, +]; + +for (const manifest of manifests) { + const manifestPath = path.join(rootDir, manifest.file); + const pkg = JSON.parse(await readFile(manifestPath, 'utf8')); + const updated = manifest.update(pkg); + + if (dryRun) { + console.log(`[compat] Would update ${manifest.file}`); + continue; + } + + await writeFile(manifestPath, `${JSON.stringify(updated, null, 2)}\n`); + console.log(`[compat] Updated ${manifest.file}`); +} + +console.log( + `[compat] Using versions: next=${versions.next}, react=${versions.react}, react-dom=${versions.reactDom}, @types/react=${versions.typesReact}, @types/react-dom=${versions.typesReactDom}` +); From f76cb542c39af8993e7505aef86f6745bce72031 Mon Sep 17 00:00:00 2001 From: Austin1serb Date: Mon, 6 Apr 2026 00:12:33 -0600 Subject: [PATCH 2/2] remove dep bot --- .github/dependabot.yml | 49 ----------- .github/workflows/compat.yml | 110 ------------------------ scripts/set-compat-fixture-versions.mjs | 64 -------------- 3 files changed, 223 deletions(-) delete mode 100644 .github/dependabot.yml delete mode 100644 .github/workflows/compat.yml delete mode 100644 scripts/set-compat-fixture-versions.mjs diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index a528f90..0000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,49 +0,0 @@ -version: 2 -updates: - - package-ecosystem: npm - directory: /packages/core/__tests__/fixtures/next - schedule: - interval: daily - time: "14:00" - timezone: America/Boise - open-pull-requests-limit: 5 - labels: - - dependencies - - compat - allow: - - dependency-name: next - - dependency-name: react - - dependency-name: react-dom - - dependency-name: "@types/react" - - dependency-name: "@types/react-dom" - groups: - next-stack: - patterns: - - next - - react - - react-dom - - "@types/react" - - "@types/react-dom" - - - package-ecosystem: npm - directory: /packages/core/__tests__/fixtures/vite - schedule: - interval: daily - time: "14:00" - timezone: America/Boise - open-pull-requests-limit: 5 - labels: - - dependencies - - compat - allow: - - dependency-name: react - - dependency-name: react-dom - - dependency-name: "@types/react" - - dependency-name: "@types/react-dom" - groups: - react-stack: - patterns: - - react - - react-dom - - "@types/react" - - "@types/react-dom" diff --git a/.github/workflows/compat.yml b/.github/workflows/compat.yml deleted file mode 100644 index f2269ad..0000000 --- a/.github/workflows/compat.yml +++ /dev/null @@ -1,110 +0,0 @@ -name: Compatibility - -on: - schedule: - - cron: '0 14 * * 1' - workflow_dispatch: - inputs: - next_version: - description: Next.js version or dist-tag - required: false - default: latest - react_version: - description: React and react-dom version or dist-tag - required: false - default: latest - react_dom_version: - description: Optional react-dom override - required: false - default: '' - types_react_version: - description: Optional @types/react override - required: false - default: latest - types_react_dom_version: - description: Optional @types/react-dom override - required: false - default: latest - -permissions: - contents: read - -concurrency: - group: compatibility-${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - latest-stack: - name: Latest React / Next Stack - runs-on: ubuntu-latest - timeout-minutes: 30 - env: - NEXT_VERSION: ${{ github.event.inputs.next_version || 'latest' }} - REACT_VERSION: ${{ github.event.inputs.react_version || 'latest' }} - REACT_DOM_VERSION: ${{ github.event.inputs.react_dom_version || '' }} - TYPES_REACT_VERSION: ${{ github.event.inputs.types_react_version || 'latest' }} - TYPES_REACT_DOM_VERSION: ${{ github.event.inputs.types_react_dom_version || 'latest' }} - - steps: - - uses: actions/checkout@v4 - - - uses: pnpm/action-setup@v3 - with: - version: 10.12.1 - run_install: false - - - uses: actions/setup-node@v4 - with: - node-version: 22 - cache: pnpm - - - name: Install workspace dependencies - run: pnpm install --no-frozen-lockfile - - - name: Cache Playwright browsers - id: pw-cache - uses: actions/cache@v4 - with: - path: ~/.cache/ms-playwright - key: ${{ runner.os }}-playwright-${{ hashFiles('packages/core/package.json') }} - restore-keys: | - ${{ runner.os }}-playwright- - - - name: Install Playwright browsers (if cache miss) - if: steps.pw-cache.outputs.cache-hit != 'true' - run: pnpm --filter @react-zero-ui/core exec playwright install --with-deps - - - name: Rewrite fixture versions - run: node scripts/set-compat-fixture-versions.mjs - - - name: Lint - run: pnpm lint - - - name: Run Build - run: pnpm build - - - name: Run Prepack - run: pnpm prepack:core - - - name: Install packed core into fixtures - run: | - TARBALL="$(pwd)/$(ls -t dist/*.tgz | head -n1)" - pnpm --dir packages/core/__tests__/fixtures/next add "$TARBALL" - pnpm --dir packages/core/__tests__/fixtures/next install --no-frozen-lockfile - pnpm --dir packages/core/__tests__/fixtures/vite add "$TARBALL" - pnpm --dir packages/core/__tests__/fixtures/vite install --no-frozen-lockfile - - - name: Run Vite tests - run: pnpm test:vite - - - name: Run Next.js tests - run: pnpm test:next - - - name: Run unit tests - run: pnpm test:unit - - - name: Run CLI tests - run: pnpm test:cli - - - name: Run integration tests - run: pnpm test:integration diff --git a/scripts/set-compat-fixture-versions.mjs b/scripts/set-compat-fixture-versions.mjs deleted file mode 100644 index 77a0737..0000000 --- a/scripts/set-compat-fixture-versions.mjs +++ /dev/null @@ -1,64 +0,0 @@ -import { readFile, writeFile } from 'node:fs/promises'; -import path from 'node:path'; - -const rootDir = process.cwd(); -const dryRun = process.env.DRY_RUN === '1'; - -function envOrDefault(name, fallback) { - const value = process.env[name]?.trim(); - return value ? value : fallback; -} - -const versions = { - next: envOrDefault('NEXT_VERSION', 'latest'), - react: envOrDefault('REACT_VERSION', 'latest'), - reactDom: envOrDefault('REACT_DOM_VERSION', envOrDefault('REACT_VERSION', 'latest')), - typesReact: envOrDefault('TYPES_REACT_VERSION', 'latest'), - typesReactDom: envOrDefault('TYPES_REACT_DOM_VERSION', 'latest'), -}; - -const manifests = [ - { - file: 'packages/core/__tests__/fixtures/next/package.json', - update(pkg) { - pkg.dependencies.next = versions.next; - pkg.dependencies.react = versions.react; - pkg.dependencies['react-dom'] = versions.reactDom; - pkg.devDependencies['@types/react'] = versions.typesReact; - if (pkg.devDependencies['@types/react-dom']) { - pkg.devDependencies['@types/react-dom'] = versions.typesReactDom; - } - return pkg; - }, - }, - { - file: 'packages/core/__tests__/fixtures/vite/package.json', - update(pkg) { - pkg.dependencies.react = versions.react; - pkg.dependencies['react-dom'] = versions.reactDom; - pkg.devDependencies['@types/react'] = versions.typesReact; - if (pkg.devDependencies['@types/react-dom']) { - pkg.devDependencies['@types/react-dom'] = versions.typesReactDom; - } - return pkg; - }, - }, -]; - -for (const manifest of manifests) { - const manifestPath = path.join(rootDir, manifest.file); - const pkg = JSON.parse(await readFile(manifestPath, 'utf8')); - const updated = manifest.update(pkg); - - if (dryRun) { - console.log(`[compat] Would update ${manifest.file}`); - continue; - } - - await writeFile(manifestPath, `${JSON.stringify(updated, null, 2)}\n`); - console.log(`[compat] Updated ${manifest.file}`); -} - -console.log( - `[compat] Using versions: next=${versions.next}, react=${versions.react}, react-dom=${versions.reactDom}, @types/react=${versions.typesReact}, @types/react-dom=${versions.typesReactDom}` -);