diff --git a/e2e/adapters-e2e/adapters/express/vite.config.ts b/e2e/adapters-e2e/adapters/express/vite.config.ts index 5c0ac664b36..a08e8dc531a 100644 --- a/e2e/adapters-e2e/adapters/express/vite.config.ts +++ b/e2e/adapters-e2e/adapters/express/vite.config.ts @@ -6,7 +6,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: ['src/entry.express.tsx'], }, }, diff --git a/e2e/qwik-e2e/apps/preloader-test/vite.config.ts b/e2e/qwik-e2e/apps/preloader-test/vite.config.ts index 944f0579b63..d4c702fc557 100644 --- a/e2e/qwik-e2e/apps/preloader-test/vite.config.ts +++ b/e2e/qwik-e2e/apps/preloader-test/vite.config.ts @@ -75,14 +75,23 @@ export default defineConfig((): UserConfig => { ], build: { minify: false, - rollupOptions: { + rolldownOptions: { output: { - manualChunks: (id) => { - // Put library code in separate chunks - if (id.includes('vendor-lib')) { - return id; - } + codeSplitting: { + groups: [ + { + name: (id) => { + if (id.includes('vendor-lib')) { + return 'vendor'; + } + }, + }, + ], }, + comments: true, + }, + experimental: { + attachDebugInfo: 'full', }, }, }, diff --git a/e2e/qwik-e2e/apps/qwikrouter-ssg-snapshot/expected.ssg.html b/e2e/qwik-e2e/apps/qwikrouter-ssg-snapshot/expected.ssg.html index 2ffadd3e233..156c0d68152 100644 --- a/e2e/qwik-e2e/apps/qwikrouter-ssg-snapshot/expected.ssg.html +++ b/e2e/qwik-e2e/apps/qwikrouter-ssg-snapshot/expected.ssg.html @@ -1,3 +1,3 @@ -Qwik Router SSG Snapshot

SSG Snapshot Fixture

routeLoader$ | useResource$ | useSignal

{"heading":"SSG Snapshot Fixture","stats":[2,3,5,8],"tags":["routeLoader$","useResource$","useSignal"],"profile":{"name":"router-state","status":"stable"}}
{"total":18,"selectedCount":2,"clicks":2}
{"headline":"router-state:stable","selected":["alpha","beta"],"weighted":[2,6,15,32],"summary":{"total":18,"selectedCount":2,"clicks":2}}
[state omitted] +Qwik Router SSG Snapshot

SSG Snapshot Fixture

routeLoader$ | useResource$ | useSignal

{"heading":"SSG Snapshot Fixture","stats":[2,3,5,8],"tags":["routeLoader$","useResource$","useSignal"],"profile":{"name":"router-state","status":"stable"}}
{"total":18,"selectedCount":2,"clicks":2}
{"headline":"router-state:stable","selected":["alpha","beta"],"weighted":[2,6,15,32],"summary":{"total":18,"selectedCount":2,"clicks":2}}
[state omitted] [vnode map omitted] \ No newline at end of file diff --git a/e2e/qwik-e2e/tests/style.e2e.ts b/e2e/qwik-e2e/tests/style.e2e.ts index a463f5acef2..187e743770e 100644 --- a/e2e/qwik-e2e/tests/style.e2e.ts +++ b/e2e/qwik-e2e/tests/style.e2e.ts @@ -1,6 +1,6 @@ import { test, expect } from '@playwright/test'; -const USE_STYLES_DEDUPE_MARKER = '--use-styles-dedupe-marker: dedupe-ok'; +const USE_STYLES_DEDUPE_MARKER = '--use-styles-dedupe-marker:dedupe-ok'; test.describe('styles', () => { test.beforeEach(async ({ page }) => { diff --git a/e2e/qwik-react-e2e/adapters/express/vite.config.ts b/e2e/qwik-react-e2e/adapters/express/vite.config.ts index 5c0ac664b36..a08e8dc531a 100644 --- a/e2e/qwik-react-e2e/adapters/express/vite.config.ts +++ b/e2e/qwik-react-e2e/adapters/express/vite.config.ts @@ -6,7 +6,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: ['src/entry.express.tsx'], }, }, diff --git a/package.json b/package.json index 0e8e49daef6..aabe0474447 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "syncpack": { "versionGroups": [ { - "label": "Be lenient in vite versions for prod. v4 is broken, v5 is good", + "label": "Only accept vite 6 or higher", "dependencyTypes": [ "prod", "peer" @@ -19,7 +19,7 @@ "dependencies": [ "vite" ], - "pinVersion": ">=6 <9" + "pinVersion": ">=6" }, { "label": "optimizer needs exact workspace version", @@ -129,7 +129,7 @@ "@types/semver": "7.7.1", "@types/tmp": "0.2.6", "@types/which-pm-runs": "1.0.2", - "@vitejs/plugin-basic-ssl": "2.1.4", + "@vitejs/plugin-basic-ssl": "2.2.0", "@vitest/coverage-v8": "4.0.18", "all-contributors-cli": "6.26.1", "brotli": "1.3.3", @@ -155,7 +155,7 @@ "prettier-plugin-tailwindcss": "0.7.2", "pretty-quick": "4.2.2", "prompts": "2.4.2", - "rollup": "4.59.0", + "rolldown": "1.0.0-rc.16", "semver": "7.7.3", "simple-git-hooks": "2.13.1", "snoop": "1.0.4", @@ -169,7 +169,7 @@ "typescript": "5.9.3", "typescript-eslint": "8.56.1", "vfile": "6.0.3", - "vite": "7.3.1", + "vite": "8.0.9", "vite-imagetools": "10.0.0", "vite-plugin-dts": "4.5.4", "vite-tsconfig-paths": "6.0.4", diff --git a/packages/docs/adapters/cloudflare-pages/vite.config.ts b/packages/docs/adapters/cloudflare-pages/vite.config.ts index 09178a42746..ea38d64e89d 100644 --- a/packages/docs/adapters/cloudflare-pages/vite.config.ts +++ b/packages/docs/adapters/cloudflare-pages/vite.config.ts @@ -6,7 +6,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: ['src/entry.cloudflare-pages.tsx'], }, minify: false, diff --git a/packages/docs/package.json b/packages/docs/package.json index d57b6387f34..67d119422d3 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -20,7 +20,7 @@ "@qwik.dev/partytown": "0.11.2", "@qwik.dev/react": "workspace:*", "@qwik.dev/router": "workspace:*", - "@rolldown/browser": "1.0.0-beta.59", + "@rolldown/browser": "1.0.0-rc.12", "@shikijs/colorized-brackets": "3.21.0", "@shikijs/langs": "3.21.0", "@shikijs/rehype": "3.21.0", @@ -28,7 +28,8 @@ "@shikijs/transformers": "3.21.0", "@shikijs/types": "3.21.0", "@supabase/supabase-js": "2.53.0", - "@tailwindcss/vite": "4.1.18", + "@tailwindcss/postcss": "4.2.2", + "@tailwindcss/vite": "4.2.2", "@types/leaflet": "1.9.21", "@types/prismjs": "1.26.5", "@types/react": "19.2.7", @@ -44,21 +45,23 @@ "pagefind": "1.4.0", "prettier": "3.7.4", "prism-themes": "1.9.0", - "prismjs": "1.30.0", "qwik-image": "0.0.16", "react": "19.2.3", "react-dom": "19.2.3", "shiki": "3.21.0", "snarkdown": "2.0.0", - "tailwindcss": "4.1.18", + "tailwindcss": "4.2.1", "terser": "5.46.0", "tsm": "2.3.0", "typescript": "5.9.3", "valibot": "1.2.0", - "vite": "7.3.1", + "vite": "8.0.9", "vite-tsconfig-paths": "6.0.4", "wrangler": "4.80.0" }, + "dependencies": { + "prismjs": "1.30.0" + }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0", "npm": "please-use-pnpm", diff --git a/packages/docs/src/routes/docs/deployments/cloudflare-pages/index.mdx b/packages/docs/src/routes/docs/deployments/cloudflare-pages/index.mdx index 9689f213f3e..0244d5f8ac8 100644 --- a/packages/docs/src/routes/docs/deployments/cloudflare-pages/index.mdx +++ b/packages/docs/src/routes/docs/deployments/cloudflare-pages/index.mdx @@ -151,7 +151,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: [ 'src/entry.cloudflare-pages.tsx', // This ensures that the SSG can read the routes from the config diff --git a/packages/docs/src/routes/docs/deployments/static/index.mdx b/packages/docs/src/routes/docs/deployments/static/index.mdx index c360b9969e8..cb7448dc60d 100644 --- a/packages/docs/src/routes/docs/deployments/static/index.mdx +++ b/packages/docs/src/routes/docs/deployments/static/index.mdx @@ -53,7 +53,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: ['@qwik-router-config'], }, }, diff --git a/packages/docs/vite.config.ts b/packages/docs/vite.config.ts index a8eda7507d7..2242d715adb 100644 --- a/packages/docs/vite.config.ts +++ b/packages/docs/vite.config.ts @@ -12,7 +12,7 @@ import type { ShikiTransformer } from '@shikijs/types'; import tailwindcss from '@tailwindcss/vite'; import path, { resolve } from 'node:path'; // import { qwikDevtools } from '@qwik.dev/devtools'; -import { defineConfig, loadEnv, type Plugin, type Rollup, type UserConfig } from 'vite'; +import { defineConfig, loadEnv, type Plugin, type UserConfig } from 'vite'; import { compiledStringPlugin } from '../../scripts/compiled-string-plugin.js'; import { examplesData, playgroundData, rawSource, tutorialData } from './vite.repl-apps'; import { sourceResolver } from './vite.source-resolver'; @@ -27,10 +27,10 @@ const muteWarningsPlugin = (warningsToIgnore: string[][]): Plugin => { name: 'mute-warnings', enforce: 'pre', config: (userConfig) => { - const origOnLog = userConfig.build?.rollupOptions?.onLog; + const origOnLog = userConfig.build?.rolldownOptions?.onLog; return { build: { - rollupOptions: { + rolldownOptions: { onLog(type, warning, defaultHandler) { if (type === 'warn') { if (warning.code) { @@ -98,42 +98,6 @@ function transformerMetaShowTitle(): ShikiTransformer { }; } -function overrideManualChunksForRepl(): Plugin { - return { - name: 'override-manual-chunks-for-repl', - enforce: 'post', - config(userConfig) { - const prevOutput = userConfig.build?.rollupOptions?.output; - const prevManualChunks: Rollup.ManualChunksOption | undefined = - prevOutput && !Array.isArray(prevOutput) - ? (prevOutput as Rollup.OutputOptions).manualChunks - : undefined; - - return { - build: { - rollupOptions: { - output: { - manualChunks: (id, meta) => { - const moduleInfo = meta.getModuleInfo(id); - if (moduleInfo) { - // Prevent the similar optimizer plugin logic from running on the repl - if (id.includes('repl') && (moduleInfo as any).meta?.qwikdeps?.length === 0) { - return null; - } - } - - if (typeof prevManualChunks === 'function') { - return prevManualChunks(id, meta); - } - }, - }, - }, - }, - }; - }, - }; -} - export default defineConfig(({ mode }) => { const routesDir = resolve('src', 'routes'); const isProd = mode === 'production'; @@ -264,12 +228,12 @@ export default defineConfig(({ mode }) => { qwikReact(), qwikInsights({ publicApiKey: insightsApiKey }), tailwindcss(), - overrideManualChunksForRepl(), // qwikDevtools(), ], build: { sourcemap: true, - rollupOptions: { + rolldownOptions: { + makeAbsoluteExternalsRelative: true, output: { assetFileNames: 'assets/[hash]-[name].[ext]', }, diff --git a/packages/docs/vite.repl-apps.ts b/packages/docs/vite.repl-apps.ts index a8f70a854b1..d8c9cb2639b 100644 --- a/packages/docs/vite.repl-apps.ts +++ b/packages/docs/vite.repl-apps.ts @@ -2,7 +2,7 @@ import type { TransformModuleInput } from '@qwik.dev/core/optimizer'; import MagicString from 'magic-string'; import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'; import { basename, join } from 'node:path'; -import type { PluginContext } from 'rollup'; +import type { PluginContext } from 'rolldown'; import type { Plugin } from 'vite'; import type { ReplModuleInput } from './src/repl/types'; import type { ExampleSection } from './src/routes/examples/apps/examples-data'; diff --git a/packages/insights/adapters/netlify-edge/vite.config.ts b/packages/insights/adapters/netlify-edge/vite.config.ts index 42f7ec4061a..4818da43b87 100644 --- a/packages/insights/adapters/netlify-edge/vite.config.ts +++ b/packages/insights/adapters/netlify-edge/vite.config.ts @@ -6,7 +6,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: ['src/entry.netlify-edge.tsx'], }, outDir: '.netlify/edge-functions/entry.netlify-edge', diff --git a/packages/insights/package.json b/packages/insights/package.json index fa476e1c9c9..7e5665c9bea 100644 --- a/packages/insights/package.json +++ b/packages/insights/package.json @@ -19,7 +19,7 @@ "@netlify/edge-functions": "3.0.6", "@qwik.dev/core": "workspace:*", "@qwik.dev/router": "workspace:*", - "@tailwindcss/vite": "4.1.18", + "@tailwindcss/vite": "4.2.2", "@types/density-clustering": "1.3.3", "@types/node": "24.10.0", "autoprefixer": "10.4.23", @@ -30,10 +30,10 @@ "postcss": "8.5.6", "prettier": "3.7.4", "prettier-plugin-tailwindcss": "0.7.2", - "tailwindcss": "4.1.18", + "tailwindcss": "4.2.1", "typescript": "5.9.3", "typescript-eslint": "8.56.1", - "vite": "7.3.1", + "vite": "8.0.9", "vite-tsconfig-paths": "6.0.4", "vitest": "4.0.18", "zod": "3.25.48" diff --git a/packages/optimizer/vite.config.ts b/packages/optimizer/vite.config.ts index afd46ba5304..293a887d027 100644 --- a/packages/optimizer/vite.config.ts +++ b/packages/optimizer/vite.config.ts @@ -22,7 +22,7 @@ export default defineConfig(({ mode }) => ({ fileName: () => 'index.mjs', formats: ['es'], }, - rollupOptions: { + rolldownOptions: { output: { banner: getBanner('@qwik.dev/optimizer', version) }, }, }, diff --git a/packages/qwik-react/package.json b/packages/qwik-react/package.json index f5a4f017566..7c43701ce18 100644 --- a/packages/qwik-react/package.json +++ b/packages/qwik-react/package.json @@ -10,7 +10,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "typescript": "5.9.3", - "vite": "7.3.1" + "vite": "8.0.9" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -38,7 +38,7 @@ "@types/react-dom": "^18", "react": "^18", "react-dom": "^18", - "vite": ">=6 <9" + "vite": ">=6" }, "publishConfig": { "access": "public" diff --git a/packages/qwik-react/vite.config.ts b/packages/qwik-react/vite.config.ts index a2c2ba1eb63..a2dbe689ed7 100644 --- a/packages/qwik-react/vite.config.ts +++ b/packages/qwik-react/vite.config.ts @@ -11,7 +11,7 @@ export default defineConfig(() => { formats: ['es'], fileName: (format, entryName) => `${entryName}.mjs`, }, - rollupOptions: { + rolldownOptions: { external: [ 'react', 'react/jsx-runtime', diff --git a/packages/qwik-router/package.json b/packages/qwik-router/package.json index 4652e0ce21d..83718cd4f8a 100644 --- a/packages/qwik-router/package.json +++ b/packages/qwik-router/package.json @@ -26,7 +26,6 @@ "unist-util-visit": "^5.0.0", "valibot": ">=0.36.0 <2", "vfile": "6.0.3", - "vite": ">=6 <9", "vite-imagetools": "10.0.0", "yaml": "^2.8.2", "zod": "^3.25.48" @@ -40,7 +39,8 @@ "@types/set-cookie-parser": "2.4.10", "tsm": "2.3.0", "typescript": "5.9.3", - "uvu": "0.5.6" + "uvu": "0.5.6", + "vite": "8.0.9" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -169,7 +169,7 @@ "main": "./lib/index.qwik.mjs", "peerDependencies": { "@qwik.dev/core": "workspace:^", - "vite": ">=6 <9" + "vite": ">=6" }, "publishConfig": { "access": "public" diff --git a/packages/qwik-router/src/adapters/cloudflare-pages/vite/index.ts b/packages/qwik-router/src/adapters/cloudflare-pages/vite/index.ts index ed0fed99c06..bdfa3602098 100644 --- a/packages/qwik-router/src/adapters/cloudflare-pages/vite/index.ts +++ b/packages/qwik-router/src/adapters/cloudflare-pages/vite/index.ts @@ -26,7 +26,7 @@ export function cloudflarePagesAdapter(opts: CloudflarePagesAdapterOptions = {}) }, build: { ssr: true, - rollupOptions: { + rolldownOptions: { output: { format: 'es', hoistTransitiveImports: false, diff --git a/packages/qwik-router/src/adapters/deno-server/vite/index.ts b/packages/qwik-router/src/adapters/deno-server/vite/index.ts index aba61a974b5..da99c27f2b7 100644 --- a/packages/qwik-router/src/adapters/deno-server/vite/index.ts +++ b/packages/qwik-router/src/adapters/deno-server/vite/index.ts @@ -23,7 +23,7 @@ export function denoServerAdapter(opts: DenoServerAdapterOptions = {}): any { build: { ssr: true, target: 'esnext', - rollupOptions: { + rolldownOptions: { output: { format: 'es', hoistTransitiveImports: false, diff --git a/packages/qwik-router/src/adapters/netlify-edge/vite/index.ts b/packages/qwik-router/src/adapters/netlify-edge/vite/index.ts index 26dbade0b40..0cb35eac95e 100644 --- a/packages/qwik-router/src/adapters/netlify-edge/vite/index.ts +++ b/packages/qwik-router/src/adapters/netlify-edge/vite/index.ts @@ -27,7 +27,7 @@ export function netlifyEdgeAdapter(opts: NetlifyEdgeAdapterOptions = {}): any { build: { ssr: true, outDir, - rollupOptions: { + rolldownOptions: { output: { format: 'es', hoistTransitiveImports: false, diff --git a/packages/qwik-router/src/adapters/vercel-edge/vite/index.ts b/packages/qwik-router/src/adapters/vercel-edge/vite/index.ts index 5ee9116505f..d5c9ae9b24b 100644 --- a/packages/qwik-router/src/adapters/vercel-edge/vite/index.ts +++ b/packages/qwik-router/src/adapters/vercel-edge/vite/index.ts @@ -29,7 +29,7 @@ export function vercelEdgeAdapter(opts: VercelEdgeAdapterOptions = {}): any { build: { ssr: true, outDir, - rollupOptions: { + rolldownOptions: { output: { format: 'es', hoistTransitiveImports: false, diff --git a/packages/qwik-router/src/ssg/bundle-isolation.unit.ts b/packages/qwik-router/src/ssg/bundle-isolation.unit.ts index 69f81f9fe83..bb4cc09826d 100644 --- a/packages/qwik-router/src/ssg/bundle-isolation.unit.ts +++ b/packages/qwik-router/src/ssg/bundle-isolation.unit.ts @@ -65,7 +65,7 @@ describe('SSG worker bundle isolation', () => { minify: false, outDir, ssr: true, - rollupOptions: { + rolldownOptions: { input: join(appDir, 'run-ssg.ts'), }, }, diff --git a/packages/qwik-router/vite.config.ts b/packages/qwik-router/vite.config.ts index 4ab77e10c19..9916fbaccee 100644 --- a/packages/qwik-router/vite.config.ts +++ b/packages/qwik-router/vite.config.ts @@ -3,8 +3,9 @@ import { defineConfig } from 'vite'; import { compiledStringPlugin } from '../../scripts/compiled-string-plugin.js'; import { ssgWorkerImportPlugin } from './src/buildtime/vite/ssg-worker-imports'; import pkg from './package.json' with { type: 'json' }; +import type { UserConfig } from 'vite'; -export default defineConfig(() => { +export default defineConfig((): UserConfig => { return { build: { emptyOutDir: false, @@ -13,7 +14,7 @@ export default defineConfig(() => { target: 'esnext', outDir: 'lib', minify: false, - rollupOptions: { + rolldownOptions: { input: { index: './src/runtime/src/', 'adapters/azure-swa/vite': './src/adapters/azure-swa/vite', diff --git a/packages/qwik-vite/package.json b/packages/qwik-vite/package.json index 82e40fecd7f..a19a392bf3e 100644 --- a/packages/qwik-vite/package.json +++ b/packages/qwik-vite/package.json @@ -1,7 +1,10 @@ { "name": "@qwik.dev/qwik-vite", "devDependencies": { - "image-size": "1.2.1" + "image-size": "1.2.1", + "rolldown": "1.0.0-rc.16", + "rollup": "4.60.2", + "vite": "8.0.9" }, "private": true } diff --git a/packages/qwik-vite/src/manifest.ts b/packages/qwik-vite/src/manifest.ts index 121b90598b8..c2cdeef2709 100644 --- a/packages/qwik-vite/src/manifest.ts +++ b/packages/qwik-vite/src/manifest.ts @@ -395,6 +395,7 @@ export function computeTotals(graph: QwikManifest['bundles']): void { const preloaderRegex = /[/\\](core|qwik)[/\\]dist[/\\]preloader\.(|c|m)js$/; const coreRegex = /[/\\](core|qwik)[/\\]dist[/\\]core(\.min|\.prod)?\.(|c|m)js$/; const qwikLoaderRegex = /[/\\](core|qwik)[/\\](dist[/\\])?qwikloader(\.debug)?\.[^/]*js$/; +const handlersRegex = /[/\\](core|qwik)[/\\]handlers\.(|c|m)js$/; /** * Generates the Qwik build manifest from the Rollup output bundles. It also figures out the bundle * files for the preloader, core, qwikloader and handlers. This information is used during SSR. @@ -486,8 +487,6 @@ export function generateManifestFromBundles( } } const bundleImports = outputBundle.imports - // Tree shaking might remove imports - .filter((i) => outputBundle.code.includes(path.basename(i))) .map((i) => getBundleName(i)) .filter((i) => i !== preloaderBundleName && i !== coreBundleName && i !== qwikHandlersName) .filter(Boolean) as string[]; @@ -495,7 +494,6 @@ export function generateManifestFromBundles( bundle.imports = bundleImports; } const bundleDynamicImports = outputBundle.dynamicImports - .filter((i) => outputBundle.code.includes(path.basename(i))) .map((i) => getBundleName(i)) .filter(Boolean) as string[]; if (bundleDynamicImports.length > 0) { @@ -510,6 +508,8 @@ export function generateManifestFromBundles( manifest.core = bundleFileName; } else if (qwikLoaderRegex.test(outputBundle.facadeModuleId)) { manifest.qwikLoader = bundleFileName; + } else if (handlersRegex.test(outputBundle.facadeModuleId)) { + qwikHandlersName = bundleFileName; } } // Rollup doesn't provide the moduleIds in the outputBundle but Vite does @@ -529,6 +529,9 @@ export function generateManifestFromBundles( if (!manifest.qwikLoader && modulePaths.some((m) => qwikLoaderRegex.test(m))) { manifest.qwikLoader = bundleFileName; } + if (!qwikHandlersName && modulePaths.some((m) => handlersRegex.test(m))) { + qwikHandlersName = bundleFileName; + } } manifest.bundles[bundleFileName] = bundle; diff --git a/packages/qwik-vite/src/plugins/bundle-graph.ts b/packages/qwik-vite/src/plugins/bundle-graph.ts index 94117adcfec..0677995bd5b 100644 --- a/packages/qwik-vite/src/plugins/bundle-graph.ts +++ b/packages/qwik-vite/src/plugins/bundle-graph.ts @@ -115,22 +115,6 @@ export function convertManifestToBundleGraph( const names = Object.keys(graph); const map = new Map }>(); - const clearTransitiveDeps = ( - parentDeps: Set, - bundleName: string, - seen: Set = new Set() - ) => { - const bundle = graph[bundleName]; - for (const dep of bundle.imports!) { - if (parentDeps.has(dep)) { - parentDeps.delete(dep); - } - if (!seen.has(dep)) { - seen.add(dep); - clearTransitiveDeps(parentDeps, dep, seen); - } - } - }; /** * First pass to collect minimal dependency lists and allocate space for dependencies. Minimal @@ -141,13 +125,9 @@ export function convertManifestToBundleGraph( const bundle = graph[bundleName]; // external dependencies are not included in `graph` const deps = new Set(bundle.imports!); - for (const depName of deps) { - clearTransitiveDeps(deps, depName); - } const dynDeps = new Set(bundle.dynamicImports!); const depProbability = new Map(); for (const depName of dynDeps) { - clearTransitiveDeps(dynDeps, depName); const dep = graph[depName]; // Calculate the probability of the dependency diff --git a/packages/qwik-vite/src/plugins/bundle-graph.unit.ts b/packages/qwik-vite/src/plugins/bundle-graph.unit.ts index 0bca11d533f..5e1bfd4a3b6 100644 --- a/packages/qwik-vite/src/plugins/bundle-graph.unit.ts +++ b/packages/qwik-vite/src/plugins/bundle-graph.unit.ts @@ -51,30 +51,30 @@ describe('convertManifestToBundleGraph', () => { 2, 'static-dep.js', // 2 -7, - 5, - // doesn't list 13 because it's also statically imported by dynamic-dep.js - 'dynamic-dep.js', // 5 + 13, + 6, + 'dynamic-dep.js', // 6 2, - 12, - -9, 13, + -9, + 14, -7, - 16, - 'transitive-dep.js', // 12 - 'has-a-symbol.js', // 13 - -5, 17, - 'boring-dep.js', // 16 - 'large-file.js', // 17 - 'sym1', // 18 + 'transitive-dep.js', // 13 + 'has-a-symbol.js', // 14 + -5, + 18, + 'boring-dep.js', // 17 + 'large-file.js', // 18 + 'sym1', // 19 -7, - 5, - 'sym2', // 21 + 6, + 'sym2', // 22 -7, - 13, - 'sym3', // 24 + 14, + 'sym3', // 25 -5, - 17, + 18, ]); }); @@ -130,28 +130,29 @@ describe('convertManifestToBundleGraph', () => { 2, 'static-dep.js', // 2 -7, - 5, - 'dynamic-dep.js', // 5 + 9, + 6, + 'dynamic-dep.js', // 6 2, - 8, - 'transitive-dep.js', // 8 - 'has-a-symbol.js', // 9 + 9, + 'transitive-dep.js', // 9 + 'has-a-symbol.js', // 10 -5, - 12, - 'large-file.js', // 12 - 'sym1', // 13 + 13, + 'large-file.js', // 13 + 'sym1', // 14 -7, - 5, - 'sym2', // 16 + 6, + 'sym2', // 17 -7, - 9, - 'sym3', // 19 + 10, + 'sym3', // 20 -5, - 12, - 'dashboard/', // 22 + 13, + 'dashboard/', // 23 2, -7, - 8, + 9, ]); }); @@ -208,127 +209,146 @@ describe('convertManifestToBundleGraph', () => { [ "index.js", -9, - 18, + 26, "index.qwik.mjs_ErrorBoundary_component_6VMZkqoH00Q.js", "index.qwik.mjs_Form_form_onSubmit_5DbAsQLGGo4.js", "index.qwik.mjs_Link_component_handlePrefetch_0xCNPioszTk.js", - 27, + 38, "index.qwik.mjs_QwikRouterMockProvider_component_goto_dNtHVLGwESE.js", - 27, + 38, "index.qwik.mjs_QwikRouterProvider_component_useStyles_BMutFDNOKhc.js", + 38, + -9, + 29, + -7, 27, + -6, + 0, + -5, + 33, "index.qwik.mjs_routeActionQrl_action_submit_rufUrhffR5k.js", "index.qwik.mjs_RouterOutlet_component_q56DrQcc9VE.js", - 27, + 38, "index.qwik.mjs_serverQrl_rpc_Nhj4Mq4ilm8.js", - 27, + 38, "index.qwik.mjs_spaInit_event_3mjmVvTlJqo.js", "index.qwik.mjs_usePreventNavigateQrl_useVisibleTask_VjDx6RO4Kis.js", "index.tsx_about_component_useStyles_WOcPLNnm2is.js", "index.tsx_form_component_useStyles_0pasaG6nmEA.js", - 27, + 38, "index.tsx_routes_component_vG0UuU4cNCg.js", + -5, + 57, + 59, "layout.js", -9, - 25, + 36, "layout.tsx_layout_component_useStyles_MOLFIZOhXmE.js", - 27, + 38, "qwik-router.js", + -10, + 4, + 9, + -9, + 5, + 20, + 19, + 24, "root.js", -9, - 31, + 50, "root.tsx_root_component_9PcKHFjikV0.js", - 27, + 38, -9, - 35, + 54, "router-head.tsx_RouterHead_component_dAo05yeFq1I.js", - 27, + 38, "src-vendor-lib-helper.ts.js", "src-vendor-lib-libA.ts.js", - 37, + 56, "src-vendor-lib-libB.ts.js", - 37, + 56, "BjxcCeNQ9ak", -9, - 21, + 29, "eevMxFvmCM8", -7, - 25, + 36, "99K9SAWjPFQ", -9, - 21, + 29, "LopIayqLfMo", -8, 9, "VjDx6RO4Kis", -9, - 17, + 25, "HEFxKy9cwuk", -9, - 21, + 29, "6VMZkqoH00Q", -7, 3, "9PcKHFjikV0", -7, - 31, + 50, "9fcUDoGM9Wo", -8, 9, "SHtFir1Ia94", -7, - 25, + 36, "cH9twROgaEg", -7, 7, "dAo05yeFq1I", -7, - 35, + 54, "ds9jIPT1g9s", -7, - 19, + 27, "lTNqDDf58lI", -7, 5, "m7u9ARcfDGU", -7, - 18, + 26, "q56DrQcc9VE", -7, - 12, + 20, "vG0UuU4cNCg", -9, - 21, + 29, "vXTAPbOW0Ig", -7, - 27, + 38, "0pasaG6nmEA", -7, - 19, + 27, "BMutFDNOKhc", -8, 9, "Iyy38y0K3Hw", -9, - 21, + 29, "MOLFIZOhXmE", -7, - 25, + 36, "WOcPLNnm2is", -7, - 18, + 26, "3mjmVvTlJqo", -6, - 16, + 24, "5DbAsQLGGo4", -8, 4, "Nhj4Mq4ilm8", -6, - 14, + 22, "rufUrhffR5k", -6, - 11, + 19, "0xCNPioszTk", -7, 5, @@ -337,19 +357,19 @@ describe('convertManifestToBundleGraph', () => { 3, "ANY7TPAnAd8", -7, - 27, + 38, "BdwdOv10pp0", -8, 9, "YCi2vDzuhns", -7, - 27, + 38, "dNtHVLGwESE", -7, 7, "ep3t0fF0SDA", -9, - 21, + 29, "lWJp5Z4VtFs", -7, 5, diff --git a/packages/qwik-vite/src/plugins/dev/image-size-server.ts b/packages/qwik-vite/src/plugins/dev/image-size-server.ts index 5bebc462529..13ad28bf61e 100644 --- a/packages/qwik-vite/src/plugins/dev/image-size-server.ts +++ b/packages/qwik-vite/src/plugins/dev/image-size-server.ts @@ -1,20 +1,20 @@ -import bmp_1 from 'image-size/dist/types/bmp.js'; -import cur_1 from 'image-size/dist/types/cur.js'; -import dds_1 from 'image-size/dist/types/dds.js'; -import gif_1 from 'image-size/dist/types/gif.js'; -import icns_1 from 'image-size/dist/types/icns.js'; -import ico_1 from 'image-size/dist/types/ico.js'; -import j2c_1 from 'image-size/dist/types/j2c.js'; -import jp2_1 from 'image-size/dist/types/jp2.js'; -import jpg_1 from 'image-size/dist/types/jpg.js'; -import ktx_1 from 'image-size/dist/types/ktx.js'; -import png_1 from 'image-size/dist/types/png.js'; -import pnm_1 from 'image-size/dist/types/pnm.js'; -import psd_1 from 'image-size/dist/types/psd.js'; -import svg_1 from 'image-size/dist/types/svg.js'; -import tga_1 from 'image-size/dist/types/tga.js'; -import webp_1 from 'image-size/dist/types/webp.js'; -import heif_1 from 'image-size/dist/types/heif.js'; +import { BMP } from 'image-size/dist/types/bmp.js'; +import { CUR } from 'image-size/dist/types/cur.js'; +import { DDS } from 'image-size/dist/types/dds.js'; +import { GIF } from 'image-size/dist/types/gif.js'; +import { ICNS } from 'image-size/dist/types/icns.js'; +import { ICO } from 'image-size/dist/types/ico.js'; +import { J2C } from 'image-size/dist/types/j2c.js'; +import { JP2 } from 'image-size/dist/types/jp2.js'; +import { JPG } from 'image-size/dist/types/jpg.js'; +import { KTX } from 'image-size/dist/types/ktx.js'; +import { PNG } from 'image-size/dist/types/png.js'; +import { PNM } from 'image-size/dist/types/pnm.js'; +import { PSD } from 'image-size/dist/types/psd.js'; +import { SVG } from 'image-size/dist/types/svg.js'; +import { TGA } from 'image-size/dist/types/tga.js'; +import { WEBP } from 'image-size/dist/types/webp.js'; +import { HEIF } from 'image-size/dist/types/heif.js'; import type { Connect } from 'vite'; import type { OptimizerSystem } from '../../types'; @@ -34,23 +34,23 @@ const firstBytes: Record = { // Put in order of most common to least common const types = { - webp: webp_1.WEBP, - jpg: jpg_1.JPG, - png: png_1.PNG, - svg: svg_1.SVG, - gif: gif_1.GIF, - avif: heif_1.HEIF, - bmp: bmp_1.BMP, - cur: cur_1.CUR, - dds: dds_1.DDS, - icns: icns_1.ICNS, - ico: ico_1.ICO, - j2c: j2c_1.J2C, - jp2: jp2_1.JP2, - ktx: ktx_1.KTX, - pnm: pnm_1.PNM, - psd: psd_1.PSD, - tga: tga_1.TGA, + webp: WEBP, + jpg: JPG, + png: PNG, + svg: SVG, + gif: GIF, + avif: HEIF, + bmp: BMP, + cur: CUR, + dds: DDS, + icns: ICNS, + ico: ICO, + j2c: J2C, + jp2: JP2, + ktx: KTX, + pnm: PNM, + psd: PSD, + tga: TGA, }; const keys = Object.keys(types) as (keyof typeof types)[]; diff --git a/packages/qwik-vite/src/plugins/eslint-plugin.ts b/packages/qwik-vite/src/plugins/eslint-plugin.ts index 87c11c50876..78e44a00924 100644 --- a/packages/qwik-vite/src/plugins/eslint-plugin.ts +++ b/packages/qwik-vite/src/plugins/eslint-plugin.ts @@ -54,7 +54,7 @@ export async function createLinter( if (message.ruleId != null && !message.ruleId.startsWith('qwik/')) { continue; } - const err = createRollupError(file.filePath, message); + const err = createBundlerError(file.filePath, message); ctx.warn(err); } }); @@ -69,7 +69,7 @@ function parseRequest(id: string) { return id.split('?', 2)[0]; } -function createRollupError(id: string, reportMessage: Linter.LintMessage) { +function createBundlerError(id: string, reportMessage: Linter.LintMessage) { const err: Rollup.RollupError = Object.assign(new Error(reportMessage.message), { id, plugin: 'vite-plugin-eslint', diff --git a/packages/qwik-vite/src/plugins/plugin.ts b/packages/qwik-vite/src/plugins/plugin.ts index 42fa6b4403e..3cf9108fc2c 100644 --- a/packages/qwik-vite/src/plugins/plugin.ts +++ b/packages/qwik-vite/src/plugins/plugin.ts @@ -1,3 +1,4 @@ +import type { ChunkingContext, CodeSplittingOptions } from 'rolldown'; import type { DevEnvironment, HotUpdateOptions, Plugin, Rollup, ViteDevServer } from 'vite'; import { hashCode } from '../../../qwik/src/core/shared/utils/hash_code'; import { generateManifestFromBundles, getValidManifest } from '../manifest'; @@ -89,6 +90,9 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { const clientResults = new Map(); const clientTransformedOutputs = new Map(); + // Maintaing our own map of segments because Rolldown doesn't retain module.meta information (https://github.com/rolldown/rolldown/issues/8924) + const clientSegments = new Map(); + const clientChunkNames = new Map(); const serverTransformedOutputs = new Map(); const parentIds = new Map(); @@ -430,8 +434,12 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { } debug(`transformedOutputs.clear()`); + clientResults.clear(); clientTransformedOutputs.clear(); + clientSegments.clear(); + clientChunkNames.clear(); serverTransformedOutputs.clear(); + parentIds.clear(); if (opts.target === 'client' && !devServer) { // emitFile() is only supported during build, not in Vite serve mode @@ -457,6 +465,55 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { : opts.target === 'ssr' || opts.target === 'test'; }; + const normalizeId = (id: string) => normalizePath(parseId(id).pathId); + + const setCachedSegment = (id: string, segment: SegmentAnalysis | null) => { + if (!segment) { + return; + } + clientSegments.set(normalizeId(id), segment); + }; + + /** Rolldown drops module.meta.segment during codeSplitting, so we cache it ourselves. */ + const getCachedSegment = (id: string): SegmentAnalysis | undefined => { + return clientSegments.get(normalizeId(id)); + }; + + const sanitizeChunkGroupName = (name: string | null | undefined) => { + if (!name) { + return null; + } + if (!/^(\.\.?([/\\]|$)|[/\\]|[A-Za-z]:[/\\])/.test(name)) { + return name; + } + + const normalizedName = name + .replace(/^[A-Za-z]:/, '') + .replace(/^(\.\.[/\\])+/, '') + .replace(/^\.[/\\]/, '') + .replace(/^[/\\]+/, '') + .replace(/[/\\]+/g, '-'); + + return normalizedName || null; + }; + + const normalizeChunkGroupName = (entry: string | null | undefined, srcDir: string) => { + if (!entry) { + return null; + } + const path = getPath(); + const normalizedEntry = normalizePath(entry); + const absoluteEntry = path.isAbsolute(normalizedEntry) + ? normalizedEntry + : normalizePath(path.resolve(srcDir, normalizedEntry)); + const rootRelativeEntry = normalizePath(path.relative(opts.rootDir, absoluteEntry)); + const preferredName = + !rootRelativeEntry.startsWith('../') && !path.isAbsolute(rootRelativeEntry) + ? rootRelativeEntry + : absoluteEntry; + return sanitizeChunkGroupName(preferredName); + }; + let resolveIdCount = 0; let doNotEdit = false; /** @@ -865,7 +922,6 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { const newOutput = await optimizer.transformModules(transformOpts); debug(`transform(${count})`, `done in ${Date.now() - now}ms`); const module = newOutput.modules.find((mod) => !isAdditionalFile(mod))!; - // uncomment to show transform results // debug({ isServer, strip }, transformOpts, newOutput); diagnosticsCallback(newOutput.diagnostics, optimizer, srcDir); @@ -879,12 +935,22 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { } const deps = new Set(); for (const mod of newOutput.modules) { + if (mod.segment) { + mod.segment.entry = normalizeChunkGroupName(mod.segment.entry, srcDir); + } + if (!isServer && mod.segment) { + const chunkName = mod.segment.entry; + if (chunkName) { + clientChunkNames.set(mod.segment.hash, chunkName); + } + } // TODO handle noop modules if (mod !== module) { const key = normalizePath(path.join(srcDir, mod.path)); debug(`transform(${count})`, `segment ${key}`, mod.segment!.displayName); parentIds.set(key, id); currentOutputs.set(key, [mod, id]); + setCachedSegment(key, mod.segment); deps.add(key); if (devServer) { const mod = devServer.moduleGraph.getModuleById(key); @@ -1081,9 +1147,14 @@ export const manifest = ${serverManifest ? JSON.stringify(serverManifest) : 'glo if (id) { debug('hotUpdate()', `invalidate ${id}`); clientResults.delete(id); + clientChunkNames.clear(); + clientSegments.delete(id); + clientSegments.delete(normalizePath(parseId(id).pathId)); for (const [key, [_, parentId]] of outputs) { if (parentId === id) { debug('hotUpdate()', `invalidate ${id} segment ${key}`); + clientSegments.delete(key); + clientSegments.delete(normalizePath(parseId(key).pathId)); outputs.delete(key); const segMod = environment.moduleGraph.getModuleById(key); if (segMod) { @@ -1095,7 +1166,7 @@ export const manifest = ${serverManifest ? JSON.stringify(serverManifest) : 'glo } } - const manualChunks: Rollup.ManualChunksOption = (id: string, { getModuleInfo }) => { + const manualChunks = (id: string, ctx: ChunkingContext) => { if (opts.target === 'client') { if ( // The preloader has to stay in a separate chunk if it's a client build @@ -1114,10 +1185,39 @@ export const manifest = ${serverManifest ? JSON.stringify(serverManifest) : 'glo return 'qwik-loader'; } } + return mergeRelatedSegments(id, ctx); + }; + + const codeSplitting: CodeSplittingOptions = { + includeDependenciesRecursively: false, + groups: [ + { + name: 'qwik-core', + test: /[/\\](core|qwik)[/\\](handlers|dist[/\\]core(\.prod|\.min)?)\.[cm]js$/, + }, + { + name: 'qwik-loader', + test: /[/\\](core|qwik)[/\\]dist[/\\]qwikloader\.js$/, + }, + { + name: 'qwik-preloader', + test: (id: string) => + id.endsWith('@qwik.dev/core/build') || + id === '\0vite/preload-helper.js' || + /[/\\](core|qwik)[/\\]dist[/\\]preloader\.[cm]js$/.test(id), + }, + { + name: (id: string, ctx: ChunkingContext) => { + return mergeRelatedSegments(id, ctx); + }, + }, + ], + }; - const module = getModuleInfo(id); + const mergeRelatedSegments = (id: string, ctx: ChunkingContext) => { + const module = ctx?.getModuleInfo(id); if (module) { - const segment = module.meta.segment as SegmentAnalysis | undefined; + const segment = (module.meta.segment as SegmentAnalysis | undefined) ?? getCachedSegment(id); if (segment) { // TODO: Remove useComputed$ once we don't need to eagerly load them anymore if (['qwikify$', 'useVisibleTask$', 'useComputed$'].includes(segment.ctxName)) { @@ -1136,7 +1236,6 @@ export const manifest = ${serverManifest ? JSON.stringify(serverManifest) : 'glo } } - // The rest is non-qwik code. We let rollup handle it. return null; }; @@ -1212,6 +1311,7 @@ export const manifest = ${serverManifest ? JSON.stringify(serverManifest) : 'glo configureServer, hotUpdate, manualChunks, + codeSplitting, generateManifest, }; } diff --git a/packages/qwik-vite/src/plugins/plugin.unit.ts b/packages/qwik-vite/src/plugins/plugin.unit.ts index 53a1a37a423..66a06ad6a9b 100644 --- a/packages/qwik-vite/src/plugins/plugin.unit.ts +++ b/packages/qwik-vite/src/plugins/plugin.unit.ts @@ -4,7 +4,7 @@ import { normalizePath } from '../../../qwik/src/testing/util'; import type { QwikManifest } from '../types'; import { ExperimentalFeatures, createQwikPlugin } from './plugin'; import { qwikVite } from './vite'; -import type { ResolvedId } from 'rollup'; +import type { ResolvedId } from 'rolldown'; const cwd = process.cwd(); @@ -191,6 +191,12 @@ test.runIf(process.platform === 'win32')('input array, win32', async () => { assert.deepEqual(opts.input, ['C:/proj/src/cmps/a.tsx', 'C:\\abs\\b.tsx']); }); +test('input with @ prefix is not resolved', async () => { + const plugin = await mockPlugin(); + const opts = await plugin.normalizeOptions({ input: ['@some/virtual-entry'] }); + assert.deepEqual(opts.input, ['@some/virtual-entry']); +}); + test('outDir', async () => { const plugin = await mockPlugin(); const opts = await plugin.normalizeOptions({ outDir: 'out' }); @@ -240,6 +246,188 @@ test('experimental[]', async () => { assert.deepEqual(opts.experimental, { [flag]: true } as any); }); +test('manualChunks falls back to cached segment metadata', async () => { + const segment = { + origin: 'routes/index.tsx', + name: 's_test', + entry: 'routes/index', + displayName: 'useTask$', + hash: 'test-hash', + canonicalFilename: 'q-test', + extension: 'js', + parent: null, + ctxKind: 'function', + ctxName: 'useTask$', + captures: false, + loc: [0, 0], + } as const; + + const plugin = createQwikPlugin({ + sys: { + cwd: () => process.cwd(), + env: 'node', + os: process.platform, + dynamicImport: async (path) => import(path), + strictDynamicImport: async (path) => import(path), + path: path as any, + }, + binding: { + transform_modules: async () => ({ + modules: [ + { + path: 'routes/index.tsx', + isEntry: false, + code: 'export default 1;', + map: null, + segment: null, + origPath: null, + }, + { + path: 'routes/index.tsx_s_test.js', + isEntry: false, + code: 'export const s_test = () => {};', + map: null, + segment, + origPath: null, + }, + ], + diagnostics: [], + isTypeScript: true, + isJsx: true, + }), + }, + }); + await plugin.init(); + await plugin.normalizeOptions({ + target: 'client', + buildMode: 'production', + }); + await plugin.buildStart({ + resolve: async () => null, + emitFile: () => '0', + } as any); + + const id = normalizePath(resolve(cwd, 'src', 'routes', 'index.tsx')); + const transformResult = (await plugin.transform( + { + addWatchFile: () => {}, + emitFile: () => '0', + load: async () => null, + } as any, + ` + import { component$, useTask$ } from '@qwik.dev/core'; + export default component$(() => { + useTask$(() => {}); + return
Hello
; + }); + `, + id + )) as { meta?: { qwikdeps?: string[] } }; + + const depId = transformResult.meta?.qwikdeps?.[0]; + expect(depId).toBeTruthy(); + + const withMeta = plugin.manualChunks(depId!, { + getModuleInfo: () => ({ id: depId, meta: { segment } }), + } as any); + const withoutMeta = plugin.manualChunks(depId!, { + getModuleInfo: () => ({ id: depId, meta: {} }), + } as any); + + assert.deepEqual(withoutMeta, withMeta); +}); + +test('manualChunks normalizes cached segment entry', async () => { + const segment = { + origin: 'routing.qwik.mjs', + name: 'entry_createLoaderSignal', + entry: + '../node_modules/.pnpm/@qwik.dev_router@x/node_modules/@qwik.dev/router/lib/chunks/routing.qwik.mjs_entry_createLoaderSignal', + displayName: 'createLoaderSignal', + hash: 'hash', + canonicalFilename: 'q-file', + extension: 'js', + parent: null, + ctxKind: 'function', + ctxName: 'routeLoader$', + captures: false, + loc: [0, 0], + } as const; + const plugin = createQwikPlugin({ + sys: { + cwd: () => process.cwd(), + env: 'node', + os: process.platform, + dynamicImport: async (path) => import(path), + strictDynamicImport: async (path) => import(path), + path: path as any, + }, + binding: { + transform_modules: async () => ({ + modules: [ + { + path: 'routes/index.tsx', + isEntry: false, + code: 'export default 1;', + map: null, + segment: null, + origPath: null, + }, + { + path: 'routing.qwik.mjs_entry_createLoaderSignal.js', + isEntry: false, + code: 'export const x = 1;', + map: null, + segment, + origPath: null, + }, + ], + diagnostics: [], + isTypeScript: true, + isJsx: true, + }), + }, + }); + await plugin.init(); + await plugin.normalizeOptions({ + target: 'client', + buildMode: 'production', + }); + await plugin.buildStart({ + resolve: async () => null, + emitFile: () => '0', + } as any); + + const id = normalizePath(resolve(cwd, 'src', 'routes', 'index.tsx')); + const transformResult = (await plugin.transform( + { + addWatchFile: () => {}, + emitFile: () => '0', + load: async () => null, + } as any, + ` + import { component$, useTask$ } from '@qwik.dev/core'; + export default component$(() => { + useTask$(() => {}); + return
Hello
; + }); + `, + id + )) as { meta?: { qwikdeps?: string[] } }; + + const depId = transformResult.meta?.qwikdeps?.[0]; + expect(depId).toBeTruthy(); + + const chunkName = plugin.manualChunks(depId!, { + getModuleInfo: () => ({ id: depId, meta: {} }), + } as any); + + assert.deepEqual( + chunkName, + 'node_modules/.pnpm/@qwik.dev_router@x/node_modules/@qwik.dev/router/lib/chunks/routing.qwik.mjs_entry_createLoaderSignal' + ); +}); + describe('resolveId', () => { test('qrls', async () => { const plugin = await mockPlugin(); diff --git a/packages/qwik-vite/src/plugins/rollup.ts b/packages/qwik-vite/src/plugins/rollup.ts index 4ddf5b368ce..f4a5918362a 100644 --- a/packages/qwik-vite/src/plugins/rollup.ts +++ b/packages/qwik-vite/src/plugins/rollup.ts @@ -19,6 +19,7 @@ import { } from './plugin'; import { findDepPkgJsonPath } from './utils'; import { isVirtualId } from './vite-utils'; +import type { OutputOptions } from 'rolldown'; type QwikRollupPluginApi = { getOptimizer: () => Optimizer; @@ -76,7 +77,7 @@ export function qwikRollup(qwikRollupOpts: QwikRollupPluginOptions = {}): any { }, outputOptions(rollupOutputOpts) { - return normalizeRollupOutputOptionsObject(qwikPlugin, rollupOutputOpts, false) as any; + return normalizeRollupOutputObject(qwikPlugin, rollupOutputOpts, false) as any; }, async buildStart() { @@ -84,9 +85,9 @@ export function qwikRollup(qwikRollupOpts: QwikRollupPluginOptions = {}): any { diagnostics.forEach((d) => { const id = qwikPlugin.normalizePath(optimizer.sys.path.join(srcDir, d.file)); if (d.category === 'error') { - this.error(createRollupError(id, d)); + this.error(createBundlerError(id, d)); } else { - this.warn(createRollupError(id, d)); + this.warn(createBundlerError(id, d)); } }); }); @@ -127,32 +128,70 @@ export function qwikRollup(qwikRollupOpts: QwikRollupPluginOptions = {}): any { return rollupPlugin; } -export async function normalizeRollupOutputOptions( +// `outputOptions.onlyExplicitManualChunks` is a new option in Rollup 4.52 that is not present in Rolldown yet so we need to add it manually. +type ExtendedOutputOptions = OutputOptions & { onlyExplicitManualChunks?: boolean }; + +async function normalizeOutputOptions( qwikPlugin: QwikPlugin, - rollupOutputOpts: Rollup.OutputOptions | Rollup.OutputOptions[] | undefined, + outputOpts: ExtendedOutputOptions | ExtendedOutputOptions[] | undefined, useAssetsDir: boolean, - outDir?: string -): Promise { - if (Array.isArray(rollupOutputOpts)) { + outDir: string | undefined, + normalizeObject: ( + qwikPlugin: QwikPlugin, + outputOptions: ExtendedOutputOptions | undefined, + useAssetsDir: boolean + ) => Promise +): Promise { + if (Array.isArray(outputOpts)) { // make sure at least one output is present in every case - if (!rollupOutputOpts.length) { - rollupOutputOpts.push({}); + if (!outputOpts.length) { + outputOpts.push({}); } return await Promise.all( - rollupOutputOpts.map(async (outputOptsObj) => ({ - ...(await normalizeRollupOutputOptionsObject(qwikPlugin, outputOptsObj, useAssetsDir)), + outputOpts.map(async (outputOptsObj) => ({ + ...(await normalizeObject(qwikPlugin, outputOptsObj, useAssetsDir)), dir: outDir || outputOptsObj.dir, })) ); } return { - ...(await normalizeRollupOutputOptionsObject(qwikPlugin, rollupOutputOpts, useAssetsDir)), - dir: outDir || rollupOutputOpts?.dir, + ...(await normalizeObject(qwikPlugin, outputOpts, useAssetsDir)), + dir: outDir || outputOpts?.dir, }; } +export function normalizeRollupOutputOptions( + qwikPlugin: QwikPlugin, + outputOpts: ExtendedOutputOptions | ExtendedOutputOptions[] | undefined, + useAssetsDir: boolean, + outDir?: string +) { + return normalizeOutputOptions( + qwikPlugin, + outputOpts, + useAssetsDir, + outDir, + normalizeRollupOutputObject + ); +} + +export function normalizeRolldownOutputOptions( + qwikPlugin: QwikPlugin, + outputOpts: ExtendedOutputOptions | ExtendedOutputOptions[] | undefined, + useAssetsDir: boolean, + outDir?: string +) { + return normalizeOutputOptions( + qwikPlugin, + outputOpts, + useAssetsDir, + outDir, + normalizeRolldownOutputObject + ); +} + const getChunkFileName = ( prefix: string, opts: NormalizedQwikPluginOptions, @@ -172,8 +211,13 @@ const getChunkFileName = ( // The chunk name can often be a path. We sanitize it to use dashes instead of slashes, to keep the same folder structure as without debug:true. // Besides, Rollup doesn't accept absolute or relative paths as inputs for the [name] placeholder for the same reason. - const relativePath = optimizer.sys.path.relative(optimizer.sys.cwd(), chunkInfo.name); - const sanitized = relativePath + let name = optimizer.sys.path.relative(optimizer.sys.cwd(), chunkInfo.name); + // Strip everything up to the last node_modules/ to get the meaningful package path + const lastNodeModules = name.lastIndexOf('node_modules-'); + if (lastNodeModules !== -1) { + name = name.slice(lastNodeModules + 'node_modules-'.length); + } + const sanitized = name .replace(/^(\.\.\/)+/, '') .replace(/^\/+/, '') .replace(/\//g, '-'); @@ -182,15 +226,14 @@ const getChunkFileName = ( } }; -export async function normalizeRollupOutputOptionsObject( +async function normalizeSharedOutputOptions( qwikPlugin: QwikPlugin, - rollupOutputOptsObj: Rollup.OutputOptions | undefined, + outputOptions: ExtendedOutputOptions | undefined, useAssetsDir: boolean -): Promise { - const outputOpts: Rollup.OutputOptions = { ...rollupOutputOptsObj }; +): Promise { + const outputOpts = { ...outputOptions }; const opts = qwikPlugin.getOptions(); const optimizer = qwikPlugin.getOptimizer(); - const manualChunks = qwikPlugin.manualChunks; if (!outputOpts.assetFileNames) { // SEO likes readable asset names @@ -211,18 +254,6 @@ export async function normalizeRollupOutputOptionsObject( // client should always be es outputOpts.format = 'es'; - const prevManualChunks = outputOpts.manualChunks; - if (prevManualChunks && typeof prevManualChunks !== 'function') { - throw new Error('manualChunks must be a function'); - } - // Casts bridge Rollup vs Rolldown ManualChunkMeta type differences - type ManualChunkFn = (id: string, meta: unknown) => string | void | null; - - // We need custom chunking for the client build - outputOpts.manualChunks = prevManualChunks - ? (id, meta) => - (prevManualChunks as ManualChunkFn)(id, meta) || (manualChunks as ManualChunkFn)(id, meta) - : (manualChunks as Rollup.OutputOptions['manualChunks']); } else { // server production output, try to be similar to client if (!outputOpts.chunkFileNames) { @@ -238,10 +269,52 @@ export async function normalizeRollupOutputOptionsObject( outputOpts.exports = 'auto'; } + return outputOpts; +} + +/* + * The Vite 8 types override the Rollup types to use the Rolldown ones. + * This is why manualChunks appears as deprecated. + * Using the Rollup types directly leads to type errors in normalizeSharedOutputOptions because the functions are about the same but the types signatures have been changed in Rolldown. + */ + +export async function normalizeRollupOutputObject( + qwikPlugin: QwikPlugin, + outputOptions: ExtendedOutputOptions | undefined, + useAssetsDir: boolean +): Promise { + const outputOpts: ExtendedOutputOptions = await normalizeSharedOutputOptions( + qwikPlugin, + outputOptions, + useAssetsDir + ); + const opts = qwikPlugin.getOptions(); + const optimizer = qwikPlugin.getOptimizer(); + const internalManualChunks = qwikPlugin.manualChunks; + + if (opts.target === 'client') { + const userManualChunks = outputOptions?.manualChunks; + if (userManualChunks && typeof userManualChunks !== 'function') { + throw new Error( + 'manualChunks must be a function for Qwik to group qrl segments back together' + ); + } + + // We need custom chunking for the client build + outputOpts.manualChunks = userManualChunks + ? (id, meta) => userManualChunks(id, meta) || internalManualChunks(id, meta) + : internalManualChunks; + } + /** * Transitive imports must not be hoisted. Otherwise, the bundle-graph static imports will be * incorrect; leading to over-preloading. */ + if (outputOpts.hoistTransitiveImports) { + throw new Error( + 'hoistTransitiveImports must be false for Qwik to ensure the bundle graph is correct for proper preloading. Please set it to false in your Rollup output configuration.' + ); + } outputOpts.hoistTransitiveImports = false; // V2 official release TODO: remove below checks and just keep `outputOpts.onlyExplicitManualChunks = true;` @@ -277,7 +350,44 @@ export async function normalizeRollupOutputOptionsObject( return outputOpts; } -export function createRollupError(id: string, diagnostic: Diagnostic) { +export async function normalizeRolldownOutputObject( + qwikPlugin: QwikPlugin, + outputOptions: ExtendedOutputOptions | undefined, + useAssetsDir: boolean +): Promise { + const outputOpts = await normalizeSharedOutputOptions(qwikPlugin, outputOptions, useAssetsDir); + const opts = qwikPlugin.getOptions(); + const internalCodeSplitting = qwikPlugin.codeSplitting; + + if (opts.target === 'client') { + // User config: only object form is merged (boolean is never passed through) + const userCodeSplitting = outputOptions?.codeSplitting; + if (typeof userCodeSplitting === 'boolean') { + throw new Error( + "codeSplitting must be a `codeSplitting: { groups: [...] }` object for Qwik's chunking and preloading to work without causing network waterfalls issues." + ); + } + + outputOpts.codeSplitting = { + includeDependenciesRecursively: internalCodeSplitting.includeDependenciesRecursively, + groups: [...(internalCodeSplitting.groups ?? []), ...(userCodeSplitting?.groups ?? [])], + }; + } else if (internalCodeSplitting) { + outputOpts.codeSplitting = internalCodeSplitting; + } + + const userComments = outputOptions?.comments; + if (userComments) { + console.warn( + `⚠️ You enabled the "comments" option in your Rollup output configuration. This can lead to larger bundle sizes and slower load times. Disable this option for optimal performance.` + ); + } + outputOpts.comments = userComments ?? false; + + return outputOpts; +} + +export function createBundlerError(id: string, diagnostic: Diagnostic) { const loc = diagnostic.highlights?.[0]; const err: Rollup.RollupError = Object.assign(new Error(diagnostic.message), { id, diff --git a/packages/qwik-vite/src/plugins/vite.ts b/packages/qwik-vite/src/plugins/vite.ts index ae5b100ee62..888c5f480b6 100644 --- a/packages/qwik-vite/src/plugins/vite.ts +++ b/packages/qwik-vite/src/plugins/vite.ts @@ -1,6 +1,4 @@ -import type { ResolvedId } from 'rollup'; import type { - BuildOptions, ConfigEnv, EnvironmentOptions, UserConfig, @@ -35,8 +33,14 @@ import { type QwikPluginDevTools, type QwikPluginOptions, } from './plugin'; -import { createRollupError, normalizeRollupOutputOptions } from './rollup'; +import { + createBundlerError, + normalizeRolldownOutputOptions, + normalizeRollupOutputOptions, +} from './rollup'; import { isVirtualId } from './vite-utils'; +import type { BuildOptions, ResolvedId } from 'rolldown'; +import type { RollupOptions } from 'rollup'; const DEDUPE = [ QWIK_CORE_ID, @@ -106,7 +110,6 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { let viteAssetsDir: string | undefined; let srcDir: string | null = null; let rootDir: string | null = null; - let ssrOutDir: string | null = null; let buildMode: QwikBuildMode = 'development'; let viteServer: ViteDevServer | undefined; @@ -147,6 +150,8 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { async config(viteConfig, viteEnv) { await qwikPlugin.init(); + const bundlerOptionsKey = this.meta.rolldownVersion ? 'rolldownOptions' : 'rollupOptions'; + let target: QwikBuildTarget; if (viteEnv.mode === 'lib') { target = 'lib'; @@ -191,7 +196,7 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { : qwikViteOpts.ssr?.input : undefined; const clientInput = target === 'client' ? qwikViteOpts.client?.input : undefined; - let input = viteConfig.build?.rollupOptions?.input || clientInput || ssrInput; + let input = viteConfig.build?.[bundlerOptionsKey]?.input || clientInput || ssrInput; if (input && typeof input === 'string') { input = [input]; } @@ -252,6 +257,26 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { const qDev = viteConfig?.define?.[qDevKey] ?? isDevelopment; const qInspector = viteConfig?.define?.[qInspectorKey] ?? isDevelopment; + const sharedBuildOptions: BuildOptions & RollupOptions = { + external: ['node:async_hooks'], + input, + }; + const rolldownBuildOptions: BuildOptions = { + ...sharedBuildOptions, + experimental: { + attachDebugInfo: + viteConfig.build?.rolldownOptions?.experimental?.attachDebugInfo ?? 'none', + }, + }; + const rollupBuildOptions: RollupOptions = { + ...sharedBuildOptions, + /** + * This is a workaround to have predictable chunk hashes between builds. It doesn't seem to + * impact the build time. + * https://github.com/QwikDev/qwik/issues/7226#issuecomment-2647122505 + */ + maxParallelFileOps: 1, + }; const updatedViteConfig: UserConfig = { // Duplicated in configEnvironment to support legacy vite build --ssr compatibility ssr: { @@ -301,12 +326,9 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { dynamicImportVarsOptions: { exclude: [/./], }, - rollupOptions: { - external: ['node:async_hooks'], - // This will amend the existing input - input, - // temporary fix for rolldown-vite types - } as BuildOptions['rollupOptions'], + [bundlerOptionsKey]: this.meta.rolldownVersion + ? rolldownBuildOptions + : rollupBuildOptions, }, define: { [qDevKey]: qDev, @@ -315,21 +337,39 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { }, }; + if (this.meta.rolldownVersion) { + updatedViteConfig.oxc = + viteCommand === 'serve' + ? false + : { + jsx: { + runtime: 'automatic', + }, + }; + } else { + updatedViteConfig.esbuild = + viteCommand === 'serve' + ? false + : { + logLevel: 'error', + jsx: 'automatic', + }; + } + if (!qwikViteOpts.csr) { updatedViteConfig.build!.cssCodeSplit = false; if (opts.outDir) { updatedViteConfig.build!.outDir = opts.outDir; } - const origOnwarn = updatedViteConfig.build!.rollupOptions?.onwarn; - updatedViteConfig.build!.rollupOptions = { - ...updatedViteConfig.build!.rollupOptions, - output: await normalizeRollupOutputOptions( - qwikPlugin, - viteConfig.build?.rollupOptions?.output, - useAssetsDir, - opts.outDir - ), - preserveEntrySignatures: 'exports-only', + const origOnwarn = updatedViteConfig.build![bundlerOptionsKey]?.onwarn; + updatedViteConfig.build![bundlerOptionsKey] = { + ...updatedViteConfig.build![bundlerOptionsKey], + output: await ( + this.meta.rolldownVersion + ? normalizeRolldownOutputOptions + : normalizeRollupOutputOptions + )(qwikPlugin, viteConfig.build?.[bundlerOptionsKey]?.output, useAssetsDir, opts.outDir), + preserveEntrySignatures: 'allow-extension', onwarn: (warning, warn) => { if (warning.plugin === 'typescript' && warning.message.includes('outputToFilesystem')) { return; @@ -352,7 +392,7 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { } else if (opts.target === 'lib') { // Library Build updatedViteConfig.build!.minify = false; - updatedViteConfig.build!.rollupOptions.external = [ + updatedViteConfig.build![bundlerOptionsKey]!.external = [ QWIK_CORE_ID, QWIK_CORE_INTERNAL_ID, QWIK_CORE_SERVER, @@ -431,9 +471,9 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { diagnostics.forEach((d) => { const id = qwikPlugin.normalizePath(optimizer.sys.path.join(srcDir, d.file)); if (d.category === 'error') { - this.error(createRollupError(id, d)); + this.error(createBundlerError(id, d)); } else { - this.warn(createRollupError(id, d)); + this.warn(createBundlerError(id, d)); } }); }); diff --git a/packages/qwik-vite/src/plugins/vite.unit.ts b/packages/qwik-vite/src/plugins/vite.unit.ts index 5e62ec74fe2..4f4b4f6f897 100644 --- a/packages/qwik-vite/src/plugins/vite.unit.ts +++ b/packages/qwik-vite/src/plugins/vite.unit.ts @@ -58,713 +58,805 @@ const excludeDeps = [ const getPlugin = (opts: QwikVitePluginOptions | undefined) => (qwikVite(opts) as any)[0] as QwikVitePlugin; -// undefined for Vite 5 - 6, an object for Vite 7 -const configHookPluginContext = undefined as any; - -test('command: serve, mode: development', async () => { - const initOpts = { - optimizerOptions: mockOptimizerOptions(), - }; - const plugin = getPlugin(initOpts); - const c = (await plugin.config.call( - configHookPluginContext, - {}, - { command: 'serve', mode: 'development' } - ))!; - const opts = await plugin.api?.getOptions(); - const build = c.build!; - const rollupOptions = build!.rollupOptions!; - const outputOptions = rollupOptions.output as Rollup.OutputOptions; - const chunkFileNames = outputOptions.chunkFileNames as ( - chunkInfo: Rollup.PreRenderedChunk - ) => string; - const entryFileNames = outputOptions.entryFileNames as ( - chunkInfo: Rollup.PreRenderedChunk - ) => string; - - assert.deepEqual(opts.target, 'client'); - assert.deepEqual(opts.buildMode, 'development'); - assert.deepEqual(opts.entryStrategy, { type: 'segment' }); - assert.deepEqual(opts.debug, false); - - assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'dist'))); - assert.deepEqual(rollupOptions.input, [normalizePath(resolve(cwd, 'src', 'root'))]); - - assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]'); - assert.deepEqual(chunkFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`); - assert.deepEqual(entryFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`); - const relDev = path.relative(cwd, chunkInfoMocks[1].name); - const sanitizedDev = relDev - .replace(/^\(\.\.\/\)+/, '') - .replace(/^\/+/, '') - .replace(/\//g, '-'); - const expectedDevChunk = `build/${sanitizedDev}.js`; - assert.deepEqual(chunkFileNames(chunkInfoMocks[1]), expectedDevChunk); - assert.deepEqual(entryFileNames(chunkInfoMocks[1]), expectedDevChunk); - assert.deepEqual(outputOptions.format, 'es'); - - assert.deepEqual(build.dynamicImportVarsOptions?.exclude, [/./]); - assert.deepEqual(build.ssr, undefined); - assert.deepEqual(c.optimizeDeps?.include, includeDeps); - assert.deepEqual(c.optimizeDeps?.exclude, excludeDeps); - - assert.deepEqual(c.ssr?.noExternal, noExternal); -}); - -test('command: serve, mode: production', async () => { - const initOpts = { - optimizerOptions: mockOptimizerOptions(), - }; - const plugin = getPlugin(initOpts); - const c = (await plugin.config.call( - configHookPluginContext, - {}, - { command: 'serve', mode: 'production' } - ))!; - const opts = await plugin.api?.getOptions(); - const build = c.build!; - const rollupOptions = build!.rollupOptions!; - const outputOptions = rollupOptions.output as Rollup.OutputOptions; - - assert.deepEqual(opts.target, 'client'); - assert.deepEqual(opts.buildMode, 'production'); - assert.deepEqual(opts.entryStrategy, { type: 'segment' }); - assert.deepEqual(opts.debug, false); - assert.deepEqual(opts.resolveQwikBuild, true); - - assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'dist'))); - assert.deepEqual(build.emptyOutDir, undefined); - assert.deepEqual(rollupOptions.input, [normalizePath(resolve(cwd, 'src', 'root'))]); - assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]'); - assert.deepEqual(outputOptions.chunkFileNames, 'build/q-[hash].js'); - assert.deepEqual(outputOptions.entryFileNames, 'build/q-[hash].js'); - assert.deepEqual(outputOptions.format, 'es'); - - assert.deepEqual(build.dynamicImportVarsOptions?.exclude, [/./]); - assert.deepEqual(build.ssr, undefined); - assert.deepEqual(c.optimizeDeps?.include, includeDeps); - assert.deepEqual(c.optimizeDeps?.exclude, excludeDeps); - assert.deepEqual(c.ssr?.noExternal, noExternal); -}); - -test('command: build, mode: development', async () => { - const initOpts = { - optimizerOptions: mockOptimizerOptions(), - }; - const plugin = getPlugin(initOpts); - const c = (await plugin.config.call( - configHookPluginContext, - {}, - { command: 'build', mode: 'development' } - ))!; - const opts = await plugin.api?.getOptions(); - const build = c.build!; - const rollupOptions = build!.rollupOptions!; - const outputOptions = rollupOptions.output as Rollup.OutputOptions; - const chunkFileNames = outputOptions.chunkFileNames as ( - chunkInfo: Rollup.PreRenderedChunk - ) => string; - const entryFileNames = outputOptions.entryFileNames as ( - chunkInfo: Rollup.PreRenderedChunk - ) => string; - - assert.deepEqual(opts.target, 'client'); - assert.deepEqual(opts.buildMode, 'development'); - assert.deepEqual(opts.entryStrategy, { type: 'segment' }); - assert.deepEqual(opts.debug, false); - assert.deepEqual(opts.resolveQwikBuild, true); - - assert.deepEqual(plugin.enforce, 'pre'); - assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'dist'))); - assert.deepEqual(build.emptyOutDir, undefined); - assert.deepEqual((rollupOptions.input as string[]).map(normalizePath), [ - normalizePath(resolve(cwd, 'src', 'root')), - ]); - - assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]'); - assert.deepEqual(chunkFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`); - assert.deepEqual(entryFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`); - const relBuildDev = path.relative(cwd, chunkInfoMocks[1].name); - const sanitizedBuildDev = relBuildDev - .replace(/^\(\.\.\/\)+/, '') - .replace(/^\/+/, '') - .replace(/\//g, '-'); - const expectedBuildDevChunk = `build/${sanitizedBuildDev}.js`; - assert.deepEqual(chunkFileNames(chunkInfoMocks[1]), expectedBuildDevChunk); - assert.deepEqual(entryFileNames(chunkInfoMocks[1]), expectedBuildDevChunk); - - assert.deepEqual(build.dynamicImportVarsOptions?.exclude, [/./]); - assert.deepEqual(build.ssr, undefined); - assert.deepEqual(c.optimizeDeps?.include, includeDeps); - assert.deepEqual(c.optimizeDeps?.exclude, excludeDeps); - assert.deepEqual(c.ssr?.noExternal, noExternal); -}); - -test('command: build, mode: production', async () => { - const initOpts = { - optimizerOptions: mockOptimizerOptions(), - }; - const plugin = getPlugin(initOpts); - const c = (await plugin.config.call( - configHookPluginContext, - {}, - { command: 'build', mode: 'production' } - ))!; - const opts = await plugin.api?.getOptions(); - const build = c.build!; - const rollupOptions = build!.rollupOptions!; - const outputOptions = rollupOptions.output as Rollup.OutputOptions; - - assert.deepEqual(opts.target, 'client'); - assert.deepEqual(opts.buildMode, 'production'); - assert.deepEqual(opts.entryStrategy, { type: 'smart' }); - assert.deepEqual(opts.debug, false); - assert.deepEqual(opts.resolveQwikBuild, true); - - assert.deepEqual(plugin.enforce, 'pre'); - assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'dist'))); - assert.deepEqual(build.emptyOutDir, undefined); - assert.deepEqual((rollupOptions.input as string[]).map(normalizePath), [ - normalizePath(resolve(cwd, 'src', 'root')), - ]); - - assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]'); - assert.deepEqual(outputOptions.chunkFileNames, 'build/q-[hash].js'); - assert.deepEqual(outputOptions.entryFileNames, 'build/q-[hash].js'); - - assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'dist'))); - assert.deepEqual(build.dynamicImportVarsOptions?.exclude, [/./]); - assert.deepEqual(build.ssr, undefined); - assert.deepEqual(c.optimizeDeps?.include, includeDeps); - assert.deepEqual(c.optimizeDeps?.exclude, excludeDeps); - assert.deepEqual(c.ssr?.noExternal, noExternal); -}); - -test('command: build, --mode production (client)', async () => { - const initOpts = { - optimizerOptions: mockOptimizerOptions(), - client: { - devInput: resolve(cwd, 'src', 'dev.entry.tsx'), - outDir: resolve(cwd, 'client-dist'), - }, - }; - - const plugin = getPlugin(initOpts); - const c: any = (await plugin.config.call( - configHookPluginContext, - {}, - { command: 'build', mode: 'production' } - ))!; - const opts = await plugin.api?.getOptions(); - const build = c.build!; - const rollupOptions = build!.rollupOptions!; - assert.deepEqual(opts.resolveQwikBuild, true); - - assert.deepEqual(opts.target, 'client'); - assert.deepEqual(opts.buildMode, 'production'); - assert.deepEqual((rollupOptions.input as string[]).map(normalizePath), [ - normalizePath(resolve(cwd, 'src', 'root')), - ]); - assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'client-dist'))); - assert.deepEqual(build.emptyOutDir, undefined); -}); - -test('command: build, --ssr entry.server.tsx', async () => { - const initOpts = { - optimizerOptions: mockOptimizerOptions(), - }; - const plugin = getPlugin(initOpts); - const c = (await plugin.config.call( - configHookPluginContext, - { build: { ssr: resolve(cwd, 'src', 'entry.server.tsx') } }, - { command: 'build', mode: '' } - ))!; - const opts = await plugin.api?.getOptions(); - const build = c.build!; - const rollupOptions = build!.rollupOptions!; - const outputOptions = rollupOptions.output as Rollup.OutputOptions; - - assert.deepEqual(opts.target, 'ssr'); - assert.deepEqual(opts.buildMode, 'development'); - assert.deepEqual(opts.entryStrategy, { type: 'hoist' }); - assert.deepEqual(opts.debug, false); - assert.deepEqual(opts.resolveQwikBuild, true); - - assert.deepEqual(plugin.enforce, 'pre'); - assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'server'))); - assert.deepEqual(build.emptyOutDir, undefined); - assert.deepEqual((rollupOptions.input as string[]).map(normalizePath), [ - normalizePath(resolve(cwd, 'src', 'entry.server.tsx')), - ]); - - assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]'); - assert.isFunction(outputOptions.chunkFileNames); - assert.deepEqual((outputOptions.chunkFileNames as any)({ name: 'hello' }), 'build/hello.js'); - assert.deepEqual(outputOptions.entryFileNames, undefined); - - assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'server'))); - assert.deepEqual(build.dynamicImportVarsOptions?.exclude, [/./]); - assert.deepEqual(build.ssr, true); - assert.deepEqual(c.optimizeDeps?.include, includeDeps); - assert.deepEqual(c.optimizeDeps?.exclude, excludeDeps); - assert.deepEqual(c.publicDir, false); -}); - -test('command: build, --ssr with relative path resolves to absolute', async () => { - const initOpts = { - optimizerOptions: mockOptimizerOptions(), - }; - const plugin = getPlugin(initOpts); - const c = (await plugin.config.call( - configHookPluginContext, - { build: { ssr: 'src/entry.server.tsx' } }, - { command: 'build', mode: '' } - ))!; - const build = c.build!; - const rollupOptions = build!.rollupOptions!; - - assert.deepEqual((rollupOptions.input as string[]).map(normalizePath), [ - normalizePath(resolve(cwd, 'src', 'entry.server.tsx')), - ]); -}); - -test('command: serve, --mode ssr', async () => { - const initOpts = { - optimizerOptions: mockOptimizerOptions(), - ssr: { - input: resolve(cwd, 'src', 'renderz.tsx'), - outDir: resolve(cwd, 'ssr-dist'), - }, - }; - const plugin = getPlugin(initOpts); - const c: any = (await plugin.config.call( - configHookPluginContext, - { build: { emptyOutDir: true } }, - { command: 'serve', mode: 'ssr' } - ))!; - const opts = await plugin.api?.getOptions(); - const build = c.build!; - const rollupOptions = build!.rollupOptions!; - - assert.deepEqual(opts.target, 'ssr'); - assert.deepEqual(opts.buildMode, 'development'); - assert.deepEqual(build.minify, undefined); - assert.deepEqual(build.ssr, undefined); - assert.deepEqual((rollupOptions.input as string[]).map(normalizePath), [ - normalizePath(resolve(cwd, 'src', 'renderz.tsx')), - ]); - assert.deepEqual(c.build.outDir, normalizePath(resolve(cwd, 'ssr-dist'))); - assert.deepEqual(build.emptyOutDir, undefined); - assert.deepEqual(c.publicDir, undefined); - assert.deepEqual(opts.resolveQwikBuild, true); -}); - -test('command: serve, --mode ssr with build.assetsDir', async () => { - const initOpts = { - optimizerOptions: mockOptimizerOptions(), - ssr: { - input: resolve(cwd, 'src', 'renderz.tsx'), - outDir: resolve(cwd, 'ssr-dist'), - }, - }; - const plugin = getPlugin(initOpts); - const c: any = (await plugin.config.call( - configHookPluginContext, - { build: { emptyOutDir: true, assetsDir: 'my-assets-dir' } }, - { command: 'serve', mode: 'ssr' } - ))!; - const opts = plugin.api?.getOptions(); - const build = c.build!; - const rollupOptions = build!.rollupOptions!; - - assert.deepEqual(opts.target, 'ssr'); - assert.deepEqual(opts.buildMode, 'development'); - assert.deepEqual(build.minify, undefined); - assert.deepEqual(build.ssr, undefined); - assert.deepEqual((rollupOptions.input as string[]).map(normalizePath), [ - normalizePath(resolve(cwd, 'src', 'renderz.tsx')), - ]); - assert.deepEqual(c.build.outDir, normalizePath(resolve(cwd, 'ssr-dist'))); - assert.deepEqual(build.emptyOutDir, undefined); - assert.deepEqual(c.publicDir, undefined); - assert.deepEqual(opts.resolveQwikBuild, true); -}); - -test('should use the dist/ fallback with client target', async () => { - const initOpts = { - optimizerOptions: mockOptimizerOptions(), - }; - const plugin = getPlugin(initOpts); - const c: any = (await plugin.config.call( - configHookPluginContext, - { build: { assetsDir: 'my-assets-dir/' } }, - { command: 'serve', mode: 'development' } - ))!; - - assert.equal(c.build.outDir, normalizePath(resolve(cwd, `dist`))); -}); - -test('should use build.outDir config with client target', async () => { - const initOpts = { - optimizerOptions: mockOptimizerOptions(), - }; - const plugin = getPlugin(initOpts); - const c: any = (await plugin.config.call( - configHookPluginContext, - { build: { outDir: 'my-dist/', assetsDir: 'my-assets-dir' } }, - { command: 'serve', mode: 'development' } - ))!; - - assert.equal(c.build.outDir, normalizePath(resolve(cwd, `my-dist`))); -}); - -test('should use build.outDir config when assetsDir is _astro', async () => { - const initOpts = { - optimizerOptions: mockOptimizerOptions(), - }; +const bundlerMatrix = [ + { + name: 'rollup', + configHookPluginContext: { + meta: { + rollupVersion: '4.0.0', + }, + } as any, + bundlerOptionsKey: 'rollupOptions' as const, + }, + { + name: 'rolldown', + configHookPluginContext: { + meta: { + rollupVersion: '4.0.0', + rolldownVersion: '1.0.0', + }, + } as any, + bundlerOptionsKey: 'rolldownOptions' as const, + }, +]; - const plugin = getPlugin(initOpts); +type BundlerOptionsKey = (typeof bundlerMatrix)[number]['bundlerOptionsKey']; + +const getBundlerOptions = (build: any, bundlerOptionsKey: BundlerOptionsKey) => { + const bundlerOptions = build[bundlerOptionsKey]; + assert.ok(bundlerOptions, `Missing ${bundlerOptionsKey}`); + if (bundlerOptionsKey === 'rolldownOptions') { + assert.equal(build.rollupOptions, undefined); + } else { + assert.equal(build.rolldownOptions, undefined); + } + return bundlerOptions; +}; + +const expectTransformEngine = ( + c: any, + bundlerOptionsKey: BundlerOptionsKey, + command: 'serve' | 'build' +) => { + if (bundlerOptionsKey === 'rolldownOptions') { + assert.deepEqual( + c.oxc, + command === 'serve' + ? false + : { + jsx: { + runtime: 'automatic', + }, + } + ); + assert.equal(c.esbuild, undefined); + } else { + assert.deepEqual( + c.esbuild, + command === 'serve' + ? false + : { + logLevel: 'error', + jsx: 'automatic', + } + ); + assert.equal(c.oxc, undefined); + } +}; - // Astro sets a build.assetsDir of _astro, but we don't want to change that - const c: any = (await plugin.config.call( - configHookPluginContext, - { build: { assetsDir: '_astro' } }, - { command: 'serve', mode: 'development' } - ))!; +describe.each(bundlerMatrix)('$name', ({ configHookPluginContext, bundlerOptionsKey }) => { + test('command: serve, mode: development', async () => { + const initOpts = { + optimizerOptions: mockOptimizerOptions(), + }; + const plugin = getPlugin(initOpts); + const c = (await plugin.config.call( + configHookPluginContext, + {}, + { command: 'serve', mode: 'development' } + ))!; + const opts = await plugin.api?.getOptions(); + const build = c.build!; + const bundlerOptions = getBundlerOptions(build, bundlerOptionsKey); + const outputOptions = bundlerOptions.output as Rollup.OutputOptions; + const chunkFileNames = outputOptions.chunkFileNames as ( + chunkInfo: Rollup.PreRenderedChunk + ) => string; + const entryFileNames = outputOptions.entryFileNames as ( + chunkInfo: Rollup.PreRenderedChunk + ) => string; + + assert.deepEqual(opts.target, 'client'); + assert.deepEqual(opts.buildMode, 'development'); + assert.deepEqual(opts.entryStrategy, { type: 'segment' }); + assert.deepEqual(opts.debug, false); + + assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'dist'))); + assert.deepEqual(bundlerOptions.input, [normalizePath(resolve(cwd, 'src', 'root'))]); + + assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]'); + assert.deepEqual(chunkFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`); + assert.deepEqual(entryFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`); + const relDev = path.relative(cwd, chunkInfoMocks[1].name); + const sanitizedDev = relDev + .replace(/^\(\.\.\/\)+/, '') + .replace(/^\/+/, '') + .replace(/\//g, '-'); + const expectedDevChunk = `build/${sanitizedDev}.js`; + assert.deepEqual(chunkFileNames(chunkInfoMocks[1]), expectedDevChunk); + assert.deepEqual(entryFileNames(chunkInfoMocks[1]), expectedDevChunk); + assert.deepEqual(outputOptions.format, 'es'); + + assert.deepEqual(build.dynamicImportVarsOptions?.exclude, [/./]); + assert.deepEqual(build.ssr, undefined); + assert.deepEqual(c.optimizeDeps?.include, includeDeps); + assert.deepEqual(c.optimizeDeps?.exclude, excludeDeps); + + expectTransformEngine(c, bundlerOptionsKey, 'serve'); + assert.deepEqual(c.ssr, { + noExternal, + }); + }); - assert.equal(c.build.outDir, normalizePath(resolve(cwd, `dist/`))); -}); + test('command: serve, mode: production', async () => { + const initOpts = { + optimizerOptions: mockOptimizerOptions(), + }; + const plugin = getPlugin(initOpts); + const c = (await plugin.config.call( + configHookPluginContext, + {}, + { command: 'serve', mode: 'production' } + ))!; + const opts = await plugin.api?.getOptions(); + const build = c.build!; + const bundlerOptions = getBundlerOptions(build, bundlerOptionsKey); + const outputOptions = bundlerOptions.output as Rollup.OutputOptions; + + assert.deepEqual(opts.target, 'client'); + assert.deepEqual(opts.buildMode, 'production'); + assert.deepEqual(opts.entryStrategy, { type: 'segment' }); + assert.deepEqual(opts.debug, false); + assert.deepEqual(opts.resolveQwikBuild, true); + + assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'dist'))); + assert.deepEqual(build.emptyOutDir, undefined); + assert.deepEqual(bundlerOptions.input, [normalizePath(resolve(cwd, 'src', 'root'))]); + assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]'); + assert.deepEqual(outputOptions.chunkFileNames, 'build/q-[hash].js'); + assert.deepEqual(outputOptions.entryFileNames, 'build/q-[hash].js'); + assert.deepEqual(outputOptions.format, 'es'); + + assert.deepEqual(build.dynamicImportVarsOptions?.exclude, [/./]); + assert.deepEqual(build.ssr, undefined); + assert.deepEqual(c.optimizeDeps?.include, includeDeps); + assert.deepEqual(c.optimizeDeps?.exclude, excludeDeps); + expectTransformEngine(c, bundlerOptionsKey, 'serve'); + assert.deepEqual(c.ssr, { + noExternal, + }); + }); -test('command: build, mode: production (deno)', async () => { - const initOpts = { - optimizerOptions: mockOptimizerOptions('deno'), - }; - const plugin = getPlugin(initOpts); - const c = (await plugin.config.call( - configHookPluginContext, - {}, - { command: 'build', mode: 'production' } - ))!; - const opts = await plugin.api?.getOptions(); - - assert.deepEqual(opts.target, 'client'); - assert.deepEqual(opts.buildMode, 'production'); - assert.deepEqual(opts.resolveQwikBuild, true); - - // Deno should produce the same config shape as Node - const build = c.build!; - assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'dist'))); - assert.deepEqual(build.dynamicImportVarsOptions?.exclude, [/./]); - assert.deepEqual(build.ssr, undefined); -}); + test('command: build, mode: development', async () => { + const initOpts = { + optimizerOptions: mockOptimizerOptions(), + }; + const plugin = getPlugin(initOpts); + const c = (await plugin.config.call( + configHookPluginContext, + {}, + { command: 'build', mode: 'development' } + ))!; + const opts = await plugin.api?.getOptions(); + const build = c.build!; + const bundlerOptions = getBundlerOptions(build, bundlerOptionsKey); + const outputOptions = bundlerOptions.output as Rollup.OutputOptions; + const chunkFileNames = outputOptions.chunkFileNames as ( + chunkInfo: Rollup.PreRenderedChunk + ) => string; + const entryFileNames = outputOptions.entryFileNames as ( + chunkInfo: Rollup.PreRenderedChunk + ) => string; + + assert.deepEqual(opts.target, 'client'); + assert.deepEqual(opts.buildMode, 'development'); + assert.deepEqual(opts.entryStrategy, { type: 'segment' }); + assert.deepEqual(opts.debug, false); + assert.deepEqual(opts.resolveQwikBuild, true); + + assert.deepEqual(plugin.enforce, 'pre'); + assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'dist'))); + assert.deepEqual(build.emptyOutDir, undefined); + assert.deepEqual((bundlerOptions.input as string[]).map(normalizePath), [ + normalizePath(resolve(cwd, 'src', 'root')), + ]); -test('command: build, --ssr entry.server.tsx (deno)', async () => { - const initOpts = { - optimizerOptions: mockOptimizerOptions('deno'), - }; - const plugin = getPlugin(initOpts); - const c = (await plugin.config.call( - configHookPluginContext, - { build: { ssr: resolve(cwd, 'src', 'entry.server.tsx') } }, - { command: 'build', mode: '' } - ))!; - const opts = await plugin.api?.getOptions(); - - assert.deepEqual(opts.target, 'ssr'); - assert.deepEqual(opts.buildMode, 'development'); - assert.deepEqual(opts.entryStrategy, { type: 'hoist' }); - - const build = c.build!; - assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'server'))); - assert.deepEqual(build.ssr, true); - assert.deepEqual(c.publicDir, false); -}); + assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]'); + assert.deepEqual(chunkFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`); + assert.deepEqual(entryFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`); + const relBuildDev = path.relative(cwd, chunkInfoMocks[1].name); + const sanitizedBuildDev = relBuildDev + .replace(/^\(\.\.\/\)+/, '') + .replace(/^\/+/, '') + .replace(/\//g, '-'); + const expectedBuildDevChunk = `build/${sanitizedBuildDev}.js`; + assert.deepEqual(chunkFileNames(chunkInfoMocks[1]), expectedBuildDevChunk); + assert.deepEqual(entryFileNames(chunkInfoMocks[1]), expectedBuildDevChunk); + + assert.deepEqual(build.dynamicImportVarsOptions?.exclude, [/./]); + assert.deepEqual(build.ssr, undefined); + assert.deepEqual(c.optimizeDeps?.include, includeDeps); + assert.deepEqual(c.optimizeDeps?.exclude, excludeDeps); + expectTransformEngine(c, bundlerOptionsKey, 'build'); + assert.deepEqual(c.ssr?.noExternal, noExternal); + }); -test('command: build, --mode lib', async () => { - const initOpts = { - optimizerOptions: mockOptimizerOptions(), - }; - const plugin = getPlugin(initOpts); - const c: any = (await plugin.config.call( - configHookPluginContext, - { - build: { - lib: { - entry: './src/index.ts', - formats: ['es', 'cjs'], - }, - }, - }, - { command: 'build', mode: 'lib' } - ))!; - const opts = await plugin.api?.getOptions(); - const build = c.build!; - const rollupOptions = build!.rollupOptions!; - const outputOptions = rollupOptions.output as Rollup.OutputOptions; - - assert.deepEqual(opts.target, 'lib'); - assert.deepEqual(opts.buildMode, 'development'); - assert.deepEqual(build.minify, false); - assert.deepEqual(build.ssr, undefined); - assert.deepEqual(rollupOptions.input, undefined); - - assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]'); - assert.isFunction(outputOptions.chunkFileNames); - assert.deepEqual((outputOptions.chunkFileNames as any)({ name: 'hello' }), 'build/hello.js'); - - assert.deepEqual(c.build.outDir, normalizePath(resolve(cwd, 'lib'))); - assert.deepEqual(build.emptyOutDir, undefined); - assert.deepEqual(opts.resolveQwikBuild, true); -}); + test('command: build, mode: production', async () => { + const initOpts = { + optimizerOptions: mockOptimizerOptions(), + }; + const plugin = getPlugin(initOpts); + const c = (await plugin.config.call( + configHookPluginContext, + {}, + { command: 'build', mode: 'production' } + ))!; + const opts = await plugin.api?.getOptions(); + const build = c.build!; + const bundlerOptions = getBundlerOptions(build, bundlerOptionsKey); + const outputOptions = bundlerOptions.output as Rollup.OutputOptions; + + assert.deepEqual(opts.target, 'client'); + assert.deepEqual(opts.buildMode, 'production'); + assert.deepEqual(opts.entryStrategy, { type: 'smart' }); + assert.deepEqual(opts.debug, false); + assert.deepEqual(opts.resolveQwikBuild, true); + + assert.deepEqual(plugin.enforce, 'pre'); + assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'dist'))); + assert.deepEqual(build.emptyOutDir, undefined); + assert.deepEqual((bundlerOptions.input as string[]).map(normalizePath), [ + normalizePath(resolve(cwd, 'src', 'root')), + ]); -test('command: build, --mode lib with multiple outputs', async () => { - const initOpts = { - optimizerOptions: mockOptimizerOptions(), - }; - const plugin = getPlugin(initOpts); - const c: any = (await plugin.config.call( - configHookPluginContext, - { - build: { - lib: { - entry: './src/index.ts', - }, - rollupOptions: { - output: [ - { - format: 'es', - entryFileNames: 'index.esm.js', - }, - { - format: 'es', - entryFileNames: 'index.mjs', - }, - { - format: 'cjs', - entryFileNames: 'index.cjs.js', - }, - { - format: 'cjs', - entryFileNames: 'index.cjs', - }, - ], - }, - }, - }, - { command: 'build', mode: 'lib' } - ))!; - const opts = await plugin.api?.getOptions(); - const build = c.build!; - const rollupOptions = build!.rollupOptions!; - const outputOptions = rollupOptions.output as Rollup.OutputOptions[]; - - assert.deepEqual(opts.target, 'lib'); - assert.deepEqual(opts.buildMode, 'development'); - assert.deepEqual(build.minify, false); - assert.deepEqual(build.ssr, undefined); - assert.deepEqual(rollupOptions.input, undefined); - - assert.ok(Array.isArray(outputOptions)); - assert.lengthOf(outputOptions, 4); - - outputOptions.forEach((outputOptionsObj) => { - assert.deepEqual(outputOptionsObj.assetFileNames, 'assets/[hash]-[name].[ext]'); - assert.isFunction(outputOptionsObj.chunkFileNames); - assert.deepEqual((outputOptionsObj.chunkFileNames as any)({ name: 'hello' }), 'build/hello.js'); + assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]'); + assert.deepEqual(outputOptions.chunkFileNames, 'build/q-[hash].js'); + assert.deepEqual(outputOptions.entryFileNames, 'build/q-[hash].js'); + + assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'dist'))); + assert.deepEqual(build.dynamicImportVarsOptions?.exclude, [/./]); + assert.deepEqual(build.ssr, undefined); + assert.deepEqual(c.optimizeDeps?.include, includeDeps); + assert.deepEqual(c.optimizeDeps?.exclude, excludeDeps); + expectTransformEngine(c, bundlerOptionsKey, 'build'); + assert.deepEqual(c.ssr, { + noExternal, + }); }); - assert.deepEqual(c.build.outDir, normalizePath(resolve(cwd, 'lib'))); - assert.deepEqual(build.emptyOutDir, undefined); - assert.deepEqual(opts.resolveQwikBuild, true); -}); + test('command: build, --mode production (client)', async () => { + const initOpts = { + optimizerOptions: mockOptimizerOptions(), + client: { + devInput: resolve(cwd, 'src', 'dev.entry.tsx'), + outDir: resolve(cwd, 'client-dist'), + }, + }; -describe('input config', () => { - const initOpts = { - optimizerOptions: mockOptimizerOptions(), - client: { - input: './src/widget/counter.tsx', - outDir: './dist/client', - }, - ssr: { - input: './src/widget/ssr.tsx', - outDir: './dist/server', - }, - } as QwikVitePluginOptions; - test('should handle client target', async () => { const plugin = getPlugin(initOpts); const c: any = (await plugin.config.call( configHookPluginContext, {}, - { command: 'build', mode: 'development' } + { command: 'build', mode: 'production' } ))!; - assert.deepEqual((c.build.rollupOptions.input as string[]).map(normalizePath), [ - normalizePath(resolve(cwd, 'src', 'widget', 'counter.tsx')), + const opts = await plugin.api?.getOptions(); + const build = c.build!; + const bundlerOptions = getBundlerOptions(build, bundlerOptionsKey); + assert.deepEqual(opts.resolveQwikBuild, true); + + assert.deepEqual(opts.target, 'client'); + assert.deepEqual(opts.buildMode, 'production'); + assert.deepEqual((bundlerOptions.input as string[]).map(normalizePath), [ + normalizePath(resolve(cwd, 'src', 'root')), ]); + assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'client-dist'))); + assert.deepEqual(build.emptyOutDir, undefined); }); - test('should handle ssr target', async () => { + + test('command: build, --ssr entry.server.tsx', async () => { + const initOpts = { + optimizerOptions: mockOptimizerOptions(), + }; const plugin = getPlugin(initOpts); - const c: any = (await plugin.config.call( + const c = (await plugin.config.call( configHookPluginContext, - {}, - { command: 'build', mode: 'ssr' } + { build: { ssr: resolve(cwd, 'src', 'entry.server.tsx') } }, + { command: 'build', mode: '' } ))!; - assert.deepEqual((c.build.rollupOptions.input as string[]).map(normalizePath), [ - normalizePath(resolve(cwd, 'src', 'widget', 'ssr.tsx')), + const opts = await plugin.api?.getOptions(); + const build = c.build!; + const bundlerOptions = getBundlerOptions(build, bundlerOptionsKey); + const outputOptions = bundlerOptions.output as Rollup.OutputOptions; + + assert.deepEqual(opts.target, 'ssr'); + assert.deepEqual(opts.buildMode, 'development'); + assert.deepEqual(opts.entryStrategy, { type: 'hoist' }); + assert.deepEqual(opts.debug, false); + assert.deepEqual(opts.resolveQwikBuild, true); + + assert.deepEqual(plugin.enforce, 'pre'); + assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'server'))); + assert.deepEqual(build.emptyOutDir, undefined); + assert.deepEqual((bundlerOptions.input as string[]).map(normalizePath), [ + normalizePath(resolve(cwd, 'src', 'entry.server.tsx')), ]); + + assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]'); + assert.isFunction(outputOptions.chunkFileNames); + assert.deepEqual((outputOptions.chunkFileNames as any)({ name: 'hello' }), 'build/hello.js'); + assert.deepEqual(outputOptions.entryFileNames, undefined); + + assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'server'))); + assert.deepEqual(build.dynamicImportVarsOptions?.exclude, [/./]); + assert.deepEqual(build.ssr, true); + assert.deepEqual(c.optimizeDeps?.include, includeDeps); + assert.deepEqual(c.optimizeDeps?.exclude, excludeDeps); + expectTransformEngine(c, bundlerOptionsKey, 'build'); + assert.deepEqual(c.publicDir, false); }); -}); -describe('clientPublicOutDir', () => { - test('clientPublicOutDir should equal clientOutDir when base is set', async () => { + test('command: build, --ssr with relative path resolves to absolute', async () => { const initOpts = { optimizerOptions: mockOptimizerOptions(), }; const plugin = getPlugin(initOpts); + const c = (await plugin.config.call( + configHookPluginContext, + { build: { ssr: 'src/entry.server.tsx' } }, + { command: 'build', mode: '' } + ))!; + const build = c.build!; + const bundlerOptions = getBundlerOptions(build, bundlerOptionsKey); - // Simulate a config with a base path that might cause duplication - const viteConfig = { - base: '/frameworks/keyed/qwik2/', - build: { - outDir: 'dist', + assert.deepEqual((bundlerOptions.input as string[]).map(normalizePath), [ + normalizePath(resolve(cwd, 'src', 'entry.server.tsx')), + ]); + }); + + test('command: serve, --mode ssr', async () => { + const initOpts = { + optimizerOptions: mockOptimizerOptions(), + ssr: { + input: resolve(cwd, 'src', 'renderz.tsx'), + outDir: resolve(cwd, 'ssr-dist'), }, }; + const plugin = getPlugin(initOpts); + const c: any = (await plugin.config.call( + configHookPluginContext, + { build: { emptyOutDir: true } }, + { command: 'serve', mode: 'ssr' } + ))!; + const opts = await plugin.api?.getOptions(); + const build = c.build!; + const bundlerOptions = getBundlerOptions(build, bundlerOptionsKey); + + assert.deepEqual(opts.target, 'ssr'); + assert.deepEqual(opts.buildMode, 'development'); + assert.deepEqual(build.minify, undefined); + assert.deepEqual(build.ssr, undefined); + assert.deepEqual((bundlerOptions.input as string[]).map(normalizePath), [ + normalizePath(resolve(cwd, 'src', 'renderz.tsx')), + ]); + assert.deepEqual(c.build.outDir, normalizePath(resolve(cwd, 'ssr-dist'))); + assert.deepEqual(build.emptyOutDir, undefined); + assert.deepEqual(c.publicDir, undefined); + assert.deepEqual(opts.resolveQwikBuild, true); + }); - await plugin.config.call(configHookPluginContext, viteConfig, { - command: 'build', - mode: 'production', - }); + test('command: serve, --mode ssr with build.assetsDir', async () => { + const initOpts = { + optimizerOptions: mockOptimizerOptions(), + ssr: { + input: resolve(cwd, 'src', 'renderz.tsx'), + outDir: resolve(cwd, 'ssr-dist'), + }, + }; + const plugin = getPlugin(initOpts); + const c: any = (await plugin.config.call( + configHookPluginContext, + { build: { emptyOutDir: true, assetsDir: 'my-assets-dir' } }, + { command: 'serve', mode: 'ssr' } + ))!; + const opts = plugin.api?.getOptions(); + const build = c.build!; + const bundlerOptions = getBundlerOptions(build, bundlerOptionsKey); + + assert.deepEqual(opts.target, 'ssr'); + assert.deepEqual(opts.buildMode, 'development'); + assert.deepEqual(build.minify, undefined); + assert.deepEqual(build.ssr, undefined); + assert.deepEqual((bundlerOptions.input as string[]).map(normalizePath), [ + normalizePath(resolve(cwd, 'src', 'renderz.tsx')), + ]); + assert.deepEqual(c.build.outDir, normalizePath(resolve(cwd, 'ssr-dist'))); + assert.deepEqual(build.emptyOutDir, undefined); + assert.deepEqual(c.publicDir, undefined); + assert.deepEqual(opts.resolveQwikBuild, true); + }); - const clientOutDir = plugin.api.getClientOutDir(); - const clientPublicOutDir = plugin.api.getClientPublicOutDir(); + test('should use the dist/ fallback with client target', async () => { + const initOpts = { + optimizerOptions: mockOptimizerOptions(), + }; + const plugin = getPlugin(initOpts); + const c: any = (await plugin.config.call( + configHookPluginContext, + { build: { assetsDir: 'my-assets-dir/' } }, + { command: 'serve', mode: 'development' } + ))!; - // clientPublicOutDir should be the same as clientOutDir - // The base path should NOT be appended to the filesystem path - assert.equal(clientPublicOutDir, clientOutDir); + assert.equal(c.build.outDir, normalizePath(resolve(cwd, `dist`))); }); - test('clientPublicOutDir should equal clientOutDir without base', async () => { + test('should use build.outDir config with client target', async () => { const initOpts = { optimizerOptions: mockOptimizerOptions(), }; const plugin = getPlugin(initOpts); + const c: any = (await plugin.config.call( + configHookPluginContext, + { build: { outDir: 'my-dist/', assetsDir: 'my-assets-dir' } }, + { command: 'serve', mode: 'development' } + ))!; - const viteConfig = { - build: { - outDir: 'dist', - }, + assert.equal(c.build.outDir, normalizePath(resolve(cwd, `my-dist`))); + }); + + test('should use build.outDir config when assetsDir is _astro', async () => { + const initOpts = { + optimizerOptions: mockOptimizerOptions(), }; - await plugin.config.call(configHookPluginContext, viteConfig, { - command: 'build', - mode: 'production', - }); + const plugin = getPlugin(initOpts); - const clientOutDir = plugin.api.getClientOutDir(); - const clientPublicOutDir = plugin.api.getClientPublicOutDir(); + // Astro sets a build.assetsDir of _astro, but we don't want to change that + const c: any = (await plugin.config.call( + configHookPluginContext, + { build: { assetsDir: '_astro' } }, + { command: 'serve', mode: 'development' } + ))!; - assert.equal(clientPublicOutDir, clientOutDir); + assert.equal(c.build.outDir, normalizePath(resolve(cwd, `dist/`))); }); - test('clientPublicOutDir should equal clientOutDir with base="/"', async () => { + test('command: build, --mode lib', async () => { const initOpts = { optimizerOptions: mockOptimizerOptions(), }; const plugin = getPlugin(initOpts); - - const viteConfig = { - base: '/', - build: { - outDir: 'dist', + const c: any = (await plugin.config.call( + configHookPluginContext, + { + build: { + lib: { + entry: './src/index.ts', + formats: ['es', 'cjs'], + }, + }, }, - }; + { command: 'build', mode: 'lib' } + ))!; + const opts = await plugin.api?.getOptions(); + const build = c.build!; + const bundlerOptions = getBundlerOptions(build, bundlerOptionsKey); + const outputOptions = bundlerOptions.output as Rollup.OutputOptions; + + assert.deepEqual(opts.target, 'lib'); + assert.deepEqual(opts.buildMode, 'development'); + assert.deepEqual(build.minify, false); + assert.deepEqual(build.ssr, undefined); + assert.deepEqual(bundlerOptions.input, undefined); + + assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]'); + assert.isFunction(outputOptions.chunkFileNames); + assert.deepEqual((outputOptions.chunkFileNames as any)({ name: 'hello' }), 'build/hello.js'); + + assert.deepEqual(c.build.outDir, normalizePath(resolve(cwd, 'lib'))); + assert.deepEqual(build.emptyOutDir, undefined); + assert.deepEqual(opts.resolveQwikBuild, true); + }); - await plugin.config.call(configHookPluginContext, viteConfig, { - command: 'build', - mode: 'production', + test('command: build, --mode lib with multiple outputs', async () => { + const initOpts = { + optimizerOptions: mockOptimizerOptions(), + }; + const plugin = getPlugin(initOpts); + const c: any = (await plugin.config.call( + configHookPluginContext, + { + build: { + lib: { + entry: './src/index.ts', + }, + [bundlerOptionsKey]: { + output: [ + { + format: 'es', + entryFileNames: 'index.esm.js', + }, + { + format: 'es', + entryFileNames: 'index.mjs', + }, + { + format: 'cjs', + entryFileNames: 'index.cjs.js', + }, + { + format: 'cjs', + entryFileNames: 'index.cjs', + }, + ], + }, + }, + }, + { command: 'build', mode: 'lib' } + ))!; + const opts = await plugin.api?.getOptions(); + const build = c.build!; + const bundlerOptions = getBundlerOptions(build, bundlerOptionsKey); + const outputOptions = bundlerOptions.output as Rollup.OutputOptions[]; + + assert.deepEqual(opts.target, 'lib'); + assert.deepEqual(opts.buildMode, 'development'); + assert.deepEqual(build.minify, false); + assert.deepEqual(build.ssr, undefined); + assert.deepEqual(bundlerOptions.input, undefined); + + assert.ok(Array.isArray(outputOptions)); + assert.lengthOf(outputOptions, 4); + + outputOptions.forEach((outputOptionsObj) => { + assert.deepEqual(outputOptionsObj.assetFileNames, 'assets/[hash]-[name].[ext]'); + assert.isFunction(outputOptionsObj.chunkFileNames); + assert.deepEqual( + (outputOptionsObj.chunkFileNames as any)({ name: 'hello' }), + 'build/hello.js' + ); }); - const clientOutDir = plugin.api.getClientOutDir(); - const clientPublicOutDir = plugin.api.getClientPublicOutDir(); - - assert.equal(clientPublicOutDir, clientOutDir); + assert.deepEqual(c.build.outDir, normalizePath(resolve(cwd, 'lib'))); + assert.deepEqual(build.emptyOutDir, undefined); + assert.deepEqual(opts.resolveQwikBuild, true); }); - test('clientPublicOutDir should not duplicate custom outDir with nested base path', async () => { + describe('input config', () => { const initOpts = { optimizerOptions: mockOptimizerOptions(), client: { - outDir: 'frameworks/keyed/qwik2/dist', + input: './src/widget/counter.tsx', + outDir: './dist/client', }, - }; - const plugin = getPlugin(initOpts); - - const viteConfig = { - base: '/frameworks/keyed/qwik2/', - build: { - outDir: 'frameworks/keyed/qwik2/dist', + ssr: { + input: './src/widget/ssr.tsx', + outDir: './dist/server', }, - }; + } as QwikVitePluginOptions; + test('should handle client target', async () => { + const plugin = getPlugin(initOpts); + const c: any = (await plugin.config.call( + configHookPluginContext, + {}, + { command: 'build', mode: 'development' } + ))!; + assert.deepEqual(c.build.rollupOptions.input, ['./src/widget/counter.tsx']); + }); + test('should handle ssr target', async () => { + const plugin = getPlugin(initOpts); + const c: any = (await plugin.config.call( + configHookPluginContext, + {}, + { command: 'build', mode: 'ssr' } + ))!; + assert.deepEqual(c.build.rollupOptions.input, ['./src/widget/ssr.tsx']); + }); + }); + + describe('clientPublicOutDir', () => { + test('clientPublicOutDir should equal clientOutDir when base is set', async () => { + const initOpts = { + optimizerOptions: mockOptimizerOptions(), + }; + const plugin = getPlugin(initOpts); + + // Simulate a config with a base path that might cause duplication + const viteConfig = { + base: '/frameworks/keyed/qwik2/', + build: { + outDir: 'dist', + }, + }; - await plugin.config.call(configHookPluginContext, viteConfig, { - command: 'build', - mode: 'production', + await plugin.config.call(configHookPluginContext, viteConfig, { + command: 'build', + mode: 'production', + }); + + const clientOutDir = plugin.api.getClientOutDir(); + const clientPublicOutDir = plugin.api.getClientPublicOutDir(); + + // clientPublicOutDir should be the same as clientOutDir + // The base path should NOT be appended to the filesystem path + assert.equal(clientPublicOutDir, clientOutDir); }); - const clientPublicOutDir = plugin.api.getClientPublicOutDir(); + test('clientPublicOutDir should equal clientOutDir without base', async () => { + const initOpts = { + optimizerOptions: mockOptimizerOptions(), + }; + const plugin = getPlugin(initOpts); - // Should be the outDir, not outDir + base - assert.equal( - normalizePath(clientPublicOutDir!), - normalizePath(resolve(cwd, 'frameworks/keyed/qwik2/dist')) - ); + const viteConfig = { + build: { + outDir: 'dist', + }, + }; - // Should NOT be duplicated like: frameworks/keyed/qwik2/dist/frameworks/keyed/qwik2 - assert.notMatch(clientPublicOutDir!, /frameworks.*frameworks/); - }); -}); + await plugin.config.call(configHookPluginContext, viteConfig, { + command: 'build', + mode: 'production', + }); -describe('configEnvironment', () => { - test('should set noExternal for server environments', async () => { - const plugin = getPlugin({ optimizerOptions: mockOptimizerOptions() }); - // Initialize the plugin first - await plugin.config.call( - configHookPluginContext, - {}, - { command: 'serve', mode: 'development' } - ); + const clientOutDir = plugin.api.getClientOutDir(); + const clientPublicOutDir = plugin.api.getClientPublicOutDir(); - const hook = (plugin as any).configEnvironment; - assert.isFunction(hook); + assert.equal(clientPublicOutDir, clientOutDir); + }); - const result = hook('ssr', { consumer: 'server' }, { command: 'serve', mode: 'development' }); - assert.deepEqual(result.resolve.noExternal, noExternal); + test('clientPublicOutDir should equal clientOutDir with base="/"', async () => { + const initOpts = { + optimizerOptions: mockOptimizerOptions(), + }; + const plugin = getPlugin(initOpts); + + const viteConfig = { + base: '/', + build: { + outDir: 'dist', + }, + }; + + await plugin.config.call(configHookPluginContext, viteConfig, { + command: 'build', + mode: 'production', + }); + + const clientOutDir = plugin.api.getClientOutDir(); + const clientPublicOutDir = plugin.api.getClientPublicOutDir(); + + assert.equal(clientPublicOutDir, clientOutDir); + }); + + test('clientPublicOutDir should not duplicate custom outDir with nested base path', async () => { + const initOpts = { + optimizerOptions: mockOptimizerOptions(), + client: { + outDir: 'frameworks/keyed/qwik2/dist', + }, + }; + const plugin = getPlugin(initOpts); + + const viteConfig = { + base: '/frameworks/keyed/qwik2/', + build: { + outDir: 'frameworks/keyed/qwik2/dist', + }, + }; + + await plugin.config.call(configHookPluginContext, viteConfig, { + command: 'build', + mode: 'production', + }); + + const clientPublicOutDir = plugin.api.getClientPublicOutDir(); + + // Should be the outDir, not outDir + base + assert.equal( + normalizePath(clientPublicOutDir!), + normalizePath(resolve(cwd, 'frameworks/keyed/qwik2/dist')) + ); + + // Should NOT be duplicated like: frameworks/keyed/qwik2/dist/frameworks/keyed/qwik2 + assert.notMatch(clientPublicOutDir!, /frameworks.*frameworks/); + }); }); - test('should set resolve conditions for client environments in production', async () => { - const plugin = getPlugin({ optimizerOptions: mockOptimizerOptions() }); - await plugin.config.call(configHookPluginContext, {}, { command: 'build', mode: 'production' }); + describe('configEnvironment', () => { + test('should set noExternal for server environments', async () => { + const plugin = getPlugin({ optimizerOptions: mockOptimizerOptions() }); + // Initialize the plugin first + await plugin.config.call( + configHookPluginContext, + {}, + { command: 'serve', mode: 'development' } + ); + + const hook = (plugin as any).configEnvironment; + assert.isFunction(hook); + + const result = hook('ssr', { consumer: 'server' }, { command: 'serve', mode: 'development' }); + assert.deepEqual(result.resolve.noExternal, noExternal); + }); + + test('should set resolve conditions for client environments in production', async () => { + const plugin = getPlugin({ optimizerOptions: mockOptimizerOptions() }); + await plugin.config.call( + configHookPluginContext, + {}, + { command: 'build', mode: 'production' } + ); + + const hook = (plugin as any).configEnvironment; + const result = hook( + 'client', + { consumer: 'client' }, + { command: 'build', mode: 'production' } + ); + assert.deepEqual(result.resolve.conditions, ['min']); + }); - const hook = (plugin as any).configEnvironment; - const result = hook('client', { consumer: 'client' }, { command: 'build', mode: 'production' }); - assert.deepEqual(result.resolve.conditions, ['min']); + test('should return empty config for client environments in development', async () => { + const plugin = getPlugin({ optimizerOptions: mockOptimizerOptions() }); + await plugin.config.call( + configHookPluginContext, + {}, + { command: 'serve', mode: 'development' } + ); + + const hook = (plugin as any).configEnvironment; + const result = hook( + 'client', + { consumer: 'client' }, + { command: 'serve', mode: 'development' } + ); + // In development, we don't set conditions to avoid overriding adapter-provided conditions + // (e.g. ['webworker', 'worker'] for edge adapters). Empty object is the correct result. + assert.deepEqual(result, {}); + }); }); - test('should return empty config for client environments in development', async () => { - const plugin = getPlugin({ optimizerOptions: mockOptimizerOptions() }); - await plugin.config.call( - configHookPluginContext, - {}, - { command: 'serve', mode: 'development' } - ); + describe('configEnvironment', () => { + test('should set noExternal for server environments', async () => { + const plugin = getPlugin({ optimizerOptions: mockOptimizerOptions() }); + // Initialize the plugin first + await plugin.config.call( + configHookPluginContext, + {}, + { command: 'serve', mode: 'development' } + ); + + const hook = (plugin as any).configEnvironment; + assert.isFunction(hook); + + const result = hook('ssr', { consumer: 'server' }, { command: 'serve', mode: 'development' }); + assert.deepEqual(result.resolve.noExternal, noExternal); + }); - const hook = (plugin as any).configEnvironment; - const result = hook( - 'client', - { consumer: 'client' }, - { command: 'serve', mode: 'development' } - ); - // In development, we don't set conditions to avoid overriding adapter-provided conditions - // (e.g. ['webworker', 'worker'] for edge adapters). Empty object is the correct result. - assert.deepEqual(result, {}); + test('should set resolve conditions for client environments in production', async () => { + const plugin = getPlugin({ optimizerOptions: mockOptimizerOptions() }); + await plugin.config.call( + configHookPluginContext, + {}, + { command: 'build', mode: 'production' } + ); + + const hook = (plugin as any).configEnvironment; + const result = hook( + 'client', + { consumer: 'client' }, + { command: 'build', mode: 'production' } + ); + assert.deepEqual(result.resolve.conditions, ['min']); + }); + + test('should return empty config for client environments in development', async () => { + const plugin = getPlugin({ optimizerOptions: mockOptimizerOptions() }); + await plugin.config.call( + configHookPluginContext, + {}, + { command: 'serve', mode: 'development' } + ); + + const hook = (plugin as any).configEnvironment; + const result = hook( + 'client', + { consumer: 'client' }, + { command: 'serve', mode: 'development' } + ); + // In development, we don't set conditions to avoid overriding adapter-provided conditions + // (e.g. ['webworker', 'worker'] for edge adapters). Empty object is the correct result. + assert.deepEqual(result, {}); + }); }); }); diff --git a/packages/qwik/package.json b/packages/qwik/package.json index f24a50ddccb..50082b5d2b9 100644 --- a/packages/qwik/package.json +++ b/packages/qwik/package.json @@ -10,10 +10,10 @@ "dependencies": { "@qwik.dev/optimizer": "workspace:*", "csstype": "^3.2.3", - "launch-editor": "^2.12.0", - "rollup": "^4.59.0" + "launch-editor": "^2.12.0" }, "devDependencies": { + "rolldown": "1.0.0-rc.16", "@croct/json5-parser": "0.2.2", "@qwik.dev/core": "workspace:*", "@qwik.dev/dom": "workspace:*", @@ -155,8 +155,8 @@ "main": "./src/index.ts", "peerDependencies": { "prettier": "*", - "vite": ">=6 <9", - "vitest": ">=2 <4" + "vite": ">=6", + "vitest": ">=2 <5" }, "peerDependenciesMeta": { "vitest": { diff --git a/packages/qwik/src/core/bench/bench-results.json b/packages/qwik/src/core/bench/bench-results.json index 7a9be0d7c74..9a065ddc641 100644 --- a/packages/qwik/src/core/bench/bench-results.json +++ b/packages/qwik/src/core/bench/bench-results.json @@ -1,71 +1,71 @@ { "version": 1, - "generatedAt": "2026-04-22T13:33:16.277Z", + "generatedAt": "2026-04-28T17:50:42.820Z", "benchmarks": { "baseline.shared-workload": { - "mean": 1.4272255158758433, - "median": 1.3930829999999332, - "p75": 1.4647919999997612, - "p99": 1.9199589999998352, - "p995": 2.7983750000003056, - "p999": 4.205416999999898, - "rme": 0.5182242396741151, - "sampleCount": 2803 + "mean": 1.4240758113207423, + "median": 1.3966250000003129, + "p75": 1.450749999999971, + "p99": 1.7515830000002097, + "p995": 2.1427910000002157, + "p999": 5.109749999999622, + "rme": 0.54052124000814, + "sampleCount": 2809 }, "current.dom-table-10": { - "mean": 0.13639182387307877, - "median": 0.12041700000190758, - "p75": 0.12604099999953178, - "p99": 0.2091660000005504, - "p995": 0.34633300000132294, - "p999": 4.493583999999828, - "rme": 1.9663956362018276, - "sampleCount": 43991, - "factor": 0.08643921431954403 + "mean": 0.14941045403157716, + "median": 0.13149999999950523, + "p75": 0.13608299999759765, + "p99": 0.2580409999973199, + "p995": 0.45600000000194996, + "p999": 5.176124999998137, + "rme": 1.7565343657150443, + "sampleCount": 40158, + "factor": 0.0941555535662585 }, "current.dom-table-1k": { - "mean": 10.707175217468814, - "median": 9.631915999998455, - "p75": 9.969834000003175, - "p99": 20.992291000002297, - "p995": 27.08808300000237, - "p999": 38.75787499999933, - "rme": 2.2165818681117764, - "sampleCount": 561, - "factor": 6.9141005955846975 + "mean": 11.107390414048036, + "median": 9.975790999997116, + "p75": 10.397375000000466, + "p99": 24.391875000001164, + "p995": 29.972459000000526, + "p999": 33.76166699999885, + "rme": 2.3070835409071266, + "sampleCount": 541, + "factor": 7.142784211935832 }, "current.serialize-state-1k": { - "mean": 3.4859137189313567, - "median": 3.102792000003319, - "p75": 3.2292079999970156, - "p99": 10.06095799999457, - "p995": 20.237291000004916, - "p999": 33.13070799999696, - "rme": 2.710598920931681, - "sampleCount": 1722, - "factor": 2.227284375736024 + "mean": 3.312152468543047, + "median": 3.102082999997947, + "p75": 3.1808750000054715, + "p99": 6.288375000003725, + "p995": 6.612584000002244, + "p999": 11.6240420000031, + "rme": 1.1007574834956455, + "sampleCount": 1812, + "factor": 2.2211280766112966 }, "current.ssr-table-10": { - "mean": 0.09733865399652775, - "median": 0.08687500000087311, - "p75": 0.09112500000082946, - "p99": 0.1670830000002752, - "p995": 0.27616699999998673, - "p999": 3.2901249999995343, - "rme": 1.3731043157090865, - "sampleCount": 61641, - "factor": 0.0623616826857246 + "mean": 0.10140340277167215, + "median": 0.09112500000082946, + "p75": 0.0946670000002996, + "p99": 0.17295799999919836, + "p995": 0.23849999999947613, + "p999": 3.298624999999447, + "rme": 1.3121057818426658, + "sampleCount": 59170, + "factor": 0.06524657656909266 }, "current.ssr-table-1k": { - "mean": 8.069372754032258, - "median": 7.222708999999668, - "p75": 7.565000000002328, - "p99": 13.761290999998891, - "p995": 14.159625000000233, - "p999": 23.3426670000008, - "rme": 1.7015020992506698, - "sampleCount": 744, - "factor": 5.1846939486017805 + "mean": 8.582158692857139, + "median": 7.750499499999933, + "p75": 8.104166000000987, + "p99": 14.326499999999214, + "p995": 15.043208999999479, + "p999": 20.417457999999897, + "rme": 1.6630042599469437, + "sampleCount": 700, + "factor": 5.549449207910639 } }, "sizes": { diff --git a/packages/qwik/src/core/preloader/preloader.unit.ts b/packages/qwik/src/core/preloader/preloader.unit.ts index f3739bf04c3..25ce59f7881 100644 --- a/packages/qwik/src/core/preloader/preloader.unit.ts +++ b/packages/qwik/src/core/preloader/preloader.unit.ts @@ -33,8 +33,8 @@ test('preloader script', async () => { const compressed = compress(Buffer.from(code), { mode: 1, quality: 11 }); expect({ brotli: compressed.length, minified: code.length }).toMatchInlineSnapshot(` { - "brotli": 1357, - "minified": 2913, + "brotli": 1350, + "minified": 2859, } `); }); diff --git a/packages/qwik/src/qwikloader.unit.ts b/packages/qwik/src/qwikloader.unit.ts index cedcf1cdc97..3704142f638 100644 --- a/packages/qwik/src/qwikloader.unit.ts +++ b/packages/qwik/src/qwikloader.unit.ts @@ -23,13 +23,13 @@ test('qwikloader script', () => { const compressed = compress(Buffer.from(qwikLoader), { mode: 1, quality: 11 }); expect([compressed.length, qwikLoader.length]).toMatchInlineSnapshot(` [ - 1943, - 4913, + 1928, + 4897, ] `); expect(qwikLoader).toMatchInlineSnapshot( - `"const e=document,t=window,r="w",n="wp",o="d",s="dp",i="e",c="ep",l="capture:",a=new Set,p=new Set([e]),q=new Map;let u,f,h;const d=(e,t)=>Array.from(e.querySelectorAll(t)),b=e=>{const t=[];return p.forEach(r=>t.push(...d(r,e))),t},m=(e,t,r,n=!1,o=!1)=>e.addEventListener(t,r,{capture:n,passive:o}),g=e=>{J(e);const t=d(e,"[q\\\\:shadowroot]");for(let e=0;ee&&"function"==typeof e.then,y=async e=>{for(let t=0;t{if(e.length){const t=()=>y(e);h=h?h.then(t,t):t()}},E=t=>{if(void 0===t._qwikjson_){let r=(t===e.documentElement?e.body:t).lastElementChild;for(;r;){if("SCRIPT"===r.tagName&&"qwik/json"===r.getAttribute("type")){t._qwikjson_=JSON.parse(r.textContent.replace(/\\\\x3C(\\/?script)/gi,"<$1"));break}r=r.previousElementSibling}}},A=(e,t)=>new CustomEvent(e,{detail:t}),C=(t,r)=>{e.dispatchEvent(A(t,r))},_=e=>e.replace(/([A-Z-])/g,e=>"-"+e.toLowerCase()),k=e=>e.replace(/-./g,e=>e[1].toUpperCase()),B=e=>{const t=e.indexOf(":");return{scope:e.slice(0,t),eventName:k(e.slice(t+1))}},S=e=>2===e.length,I=e=>e.charAt(0),N=e=>!!e&&1===e.nodeType,T=(e,t,r)=>e.hasAttribute(r)&&(!!e._qDispatch?.[t]||e.hasAttribute("q-"+t)),$=(t,r,n,o,s,i,c)=>{const l={qBase:n,symbol:i,element:r,reqTime:c};if(""===s){const r=t.getAttribute("q:instance"),n=(e["qFuncs_"+r]||[])[Number.parseInt(i)];if(!n){const e=Error("sym:"+i);C("qerror",{importError:"sync",error:e,...l}),console.error(e)}return n}const a=\`\${i}|\${n}|\${s}\`,p=q.get(a);if(p)return p;const u=new URL(s,o).href,f=import(u);return E(t),f.then(e=>{const t=e[i];if(t)q.set(a,t),C("qsymbol",l);else{const e=Error(\`\${i} not in \${u}\`);C("qerror",{importError:"no-symbol",error:e,...l}),console.error(e)}return t},e=>{C("qerror",{importError:"async",error:e,...l}),console.error(e)})},R=(t,r,n,o,s,i=!0)=>{let c=!1;s&&(i&&t.hasAttribute("preventdefault:"+s)&&r.preventDefault(),t.hasAttribute("stoppropagation:"+s)&&r.stopPropagation());const l=t._qDispatch?.[n];if(l){if("function"==typeof l){const e=()=>l(r,t);if(c)o.push(async()=>{const t=e();v(t)&&await t});else{const t=e();v(t)&&(c=!0,o.push(()=>t))}}else if(l.length)for(let e=0;en(r,t);if(c)o.push(async()=>{const t=e();v(t)&&await t});else{const t=e();v(t)&&(c=!0,o.push(()=>t))}}}return}const a=t.getAttribute("q-"+n);if(a){const n=t.closest("[q\\\\:container]:not([q\\\\:container=html]):not([q\\\\:container=text])"),s=n.getAttribute("q:base"),i=new URL(s,e.baseURI),l=a.split("|");for(let e=0;e{if(e&&t.isConnected)try{const n=e.call(f,r,t);if(v(n))return n.catch(e=>{C("qerror",{error:e,qBase:s,symbol:u,element:t,reqTime:p})})}catch(e){C("qerror",{error:e,qBase:s,symbol:u,element:t,reqTime:p})}},d=$(n,t,s,i,q,u,p);if(c||v(d))c=!0,o.push(async()=>{await h(v(d)?await d:d)});else{const e=h(d);v(e)&&(c=!0,o.push(()=>e))}}}},x=(e,t=i,r=!0)=>{const n=_(e.type),o=t+":"+n,s=l+n,c=[],a=[],p=[];let q=e.target;for(;q;)N(q)?(c.push(q),a.push(T(q,o,s)),q=q.parentElement):q=q.parentElement;for(let t=c.length-1;t>=0;t--)if(a[t]&&(R(c[t],e,o,p,n,r),e.cancelBubble||e.cancelBubble))return void w(p);for(let t=0;tx(e,c,!1),U=(e,t,r=!0)=>{const n=_(t.type),o=e+":"+n,s=b("[q-"+e+"\\\\:"+n+"]"),i=[];for(let e=0;e{U(o,e)},D=e=>{U(s,e,!1)},O=e=>{U(r,e)},P=e=>{U(n,e,!1)},F=()=>{const r=e.readyState;if("interactive"==r||"complete"==r){if(f=1,p.forEach(g),a.has("d:qinit")){a.delete("d:qinit");const e=A("qinit"),t=b("[q-d\\\\:qinit]"),r=[];for(let n=0;n{const e=A("qidle"),t=b("[q-d\\\\:qidle]"),r=[];for(let n=0;n{const t=[];for(let r=0;r{for(let n=0;nm(e,n,c===o?i?D:j:i?L:x,!0,i)),1!==f||"e:qvisible"!==s&&"d:qinit"!==s&&"d:qidle"!==s||F()}}else p.has(s)||(a.forEach(e=>{const{scope:t,eventName:n}=B(e),i=S(t),c=I(t);c!==r&&m(s,n,c===o?i?D:j:i?L:x,!0,i)}),p.add(s))}},M=t._qwikEv;M?.roots||(Array.isArray(M)?J(...M):J("e:click","e:input"),t._qwikEv={events:a,roots:p,push:J},m(e,"readystatechange",F),F());"` + `"var e,t,r,n=document,o=window,s="w",i="wp",c="d",l="dp",a="e",p="ep",q="capture:",u=new Set,f=new Set([n]),h=new Map,d=(e,t)=>Array.from(e.querySelectorAll(t)),b=e=>{const t=[];return f.forEach(r=>t.push(...d(r,e))),t},m=(e,t,r,n=!1,o=!1)=>e.addEventListener(t,r,{capture:n,passive:o}),g=e=>{J(e);const t=d(e,"[q\\\\:shadowroot]");for(let e=0;ee&&"function"==typeof e.then,y=async e=>{for(let t=0;t{if(e.length){const t=()=>y(e);r=r?r.then(t,t):t()}},E=e=>{if(void 0===e._qwikjson_){let t=(e===n.documentElement?n.body:e).lastElementChild;for(;t;){if("SCRIPT"===t.tagName&&"qwik/json"===t.getAttribute("type")){e._qwikjson_=JSON.parse(t.textContent.replace(/\\\\x3C(\\/?script)/gi,"<$1"));break}t=t.previousElementSibling}}},A=(e,t)=>new CustomEvent(e,{detail:t}),C=(e,t)=>{n.dispatchEvent(A(e,t))},_=e=>e.replace(/([A-Z-])/g,e=>"-"+e.toLowerCase()),k=e=>e.replace(/-./g,e=>e[1].toUpperCase()),B=e=>{const t=e.indexOf(":");return{scope:e.slice(0,t),eventName:k(e.slice(t+1))}},S=e=>2===e.length,I=e=>e.charAt(0),N=e=>!!e&&1===e.nodeType,T=(e,t,r)=>e.hasAttribute(r)&&(!!e._qDispatch?.[t]||e.hasAttribute("q-"+t)),$=(e,t,r,o,s,i,c)=>{const l={qBase:r,symbol:i,element:t,reqTime:c};if(""===s){const t=(n["qFuncs_"+e.getAttribute("q:instance")]||[])[Number.parseInt(i)];if(!t){const e=Error("sym:"+i);C("qerror",{importError:"sync",error:e,...l}),console.error(e)}return t}const a=\`\${i}|\${r}|\${s}\`,p=h.get(a);if(p)return p;const q=new URL(s,o).href,u=import(q);return E(e),u.then(e=>{const t=e[i];if(t)h.set(a,t),C("qsymbol",l);else{const e=Error(\`\${i} not in \${q}\`);C("qerror",{importError:"no-symbol",error:e,...l}),console.error(e)}return t},e=>{C("qerror",{importError:"async",error:e,...l}),console.error(e)})},R=(e,t,r,o,s,i=!0)=>{let c=!1;s&&(i&&e.hasAttribute("preventdefault:"+s)&&t.preventDefault(),e.hasAttribute("stoppropagation:"+s)&&t.stopPropagation());const l=e._qDispatch?.[r];if(l){if("function"==typeof l){const r=()=>l(t,e);if(c)o.push(async()=>{const e=r();v(e)&&await e});else{const e=r();v(e)&&(c=!0,o.push(()=>e))}}else if(l.length)for(let r=0;rn(t,e);if(c)o.push(async()=>{const e=r();v(e)&&await e});else{const e=r();v(e)&&(c=!0,o.push(()=>e))}}}return}const a=e.getAttribute("q-"+r);if(a){const r=e.closest("[q\\\\:container]:not([q\\\\:container=html]):not([q\\\\:container=text])"),s=r.getAttribute("q:base"),i=new URL(s,n.baseURI),l=a.split("|");for(let n=0;n{if(r&&e.isConnected)try{const n=r.call(f,t,e);if(v(n))return n.catch(t=>{C("qerror",{error:t,qBase:s,symbol:u,element:e,reqTime:p})})}catch(t){C("qerror",{error:t,qBase:s,symbol:u,element:e,reqTime:p})}},d=$(r,e,s,i,q,u,p);if(c||v(d))c=!0,o.push(async()=>{await h(v(d)?await d:d)});else{const e=h(d);v(e)&&(c=!0,o.push(()=>e))}}}},x=(e,t=a,r=!0)=>{const n=_(e.type),o=t+":"+n,s=q+n,i=[],c=[],l=[];let p=e.target;for(;p;)N(p)?(i.push(p),c.push(T(p,o,s)),p=p.parentElement):p=p.parentElement;for(let t=i.length-1;t>=0;t--)if(c[t]&&(R(i[t],e,o,l,n,r),e.cancelBubble||e.cancelBubble))return void w(l);for(let t=0;tx(e,p,!1),U=(e,t,r=!0)=>{const n=_(t.type),o=e+":"+n,s=b("[q-"+e+"\\\\:"+n+"]"),i=[];for(let e=0;e{U(c,e)},D=e=>{U(l,e,!1)},O=e=>{U(s,e)},P=e=>{U(i,e,!1)},F=()=>{const r=n.readyState;if("interactive"==r||"complete"==r){if(t=1,f.forEach(g),u.has("d:qinit")){u.delete("d:qinit");const e=A("qinit"),t=b("[q-d\\\\:qinit]"),r=[];for(let n=0;n{const e=A("qidle"),t=b("[q-d\\\\:qidle]"),r=[];for(let n=0;n{const r=[];for(let n=0;n{for(let r=0;rm(e,r,l===c?i?D:j:i?L:x,!0,i)),1!==t||"e:qvisible"!==n&&"d:qinit"!==n&&"d:qidle"!==n||F()}}else f.has(n)||(u.forEach(e=>{const{scope:t,eventName:r}=B(e),o=S(t),i=I(t);i!==s&&m(n,r,i===c?o?D:j:o?L:x,!0,o)}),f.add(n))}},M=o._qwikEv;M?.roots||(Array.isArray(M)?J(...M):J("e:click","e:input"),o._qwikEv={events:u,roots:f,push:J},m(n,"readystatechange",F),F());"` ); }); diff --git a/packages/supabase-auth-helpers-qwik/vite.config.ts b/packages/supabase-auth-helpers-qwik/vite.config.ts index 9fc503607a9..2c774117f94 100644 --- a/packages/supabase-auth-helpers-qwik/vite.config.ts +++ b/packages/supabase-auth-helpers-qwik/vite.config.ts @@ -13,7 +13,7 @@ export default defineConfig((config) => { formats: ['es'], fileName: () => `index.qwik.mjs`, }, - rollupOptions: { + rolldownOptions: { external: [ '@qwik.dev/core', '@qwik.dev/router', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 857e2d743b2..7354e59959e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -107,11 +107,11 @@ importers: specifier: 1.0.2 version: 1.0.2 '@vitejs/plugin-basic-ssl': - specifier: 2.1.4 - version: 2.1.4(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + specifier: 2.2.0 + version: 2.2.0(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/coverage-v8': specifier: 4.0.18 - version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) all-contributors-cli: specifier: 6.26.1 version: 6.26.1 @@ -184,9 +184,9 @@ importers: prompts: specifier: 2.4.2 version: 2.4.2 - rollup: - specifier: 4.59.0 - version: 4.59.0 + rolldown: + specifier: 1.0.0-rc.16 + version: 1.0.0-rc.16 semver: specifier: 7.7.3 version: 7.7.3 @@ -227,20 +227,20 @@ importers: specifier: 6.0.3 version: 6.0.3 vite: - specifier: 7.3.1 - version: 7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + specifier: 8.0.9 + version: 8.0.9(@types/node@24.10.0)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) vite-imagetools: specifier: 10.0.0 - version: 10.0.0(rollup@4.59.0)(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 10.0.0(rollup@4.60.2)(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@24.10.0)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.5.4(@types/node@24.10.0)(rollup@4.60.2)(typescript@5.9.3)(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) vite-tsconfig-paths: specifier: 6.0.4 - version: 6.0.4(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 6.0.4(typescript@5.9.3)(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) watchlist: specifier: 0.3.1 version: 0.3.1 @@ -311,6 +311,10 @@ importers: version: 17.7.2 packages/docs: + dependencies: + prismjs: + specifier: 1.30.0 + version: 1.30.0 devDependencies: '@emnapi/core': specifier: 1.9.2 @@ -335,7 +339,7 @@ importers: version: 8.11.3(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@mui/material@7.3.2(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@mui/system@7.3.2(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@qds.dev/tools': specifier: 0.14.3 - version: 0.14.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + version: 0.14.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) '@qds.dev/ui': specifier: 0.14.3 version: 0.14.3(@qwik.dev/core@packages+qwik) @@ -344,7 +348,7 @@ importers: version: link:../qwik '@qwik.dev/devtools': specifier: 0.2.5 - version: 0.2.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@qwik.dev/core@packages+qwik)(@qwik.dev/router@packages+qwik-router)(@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)))(tailwindcss@4.1.18)(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 0.2.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@qwik.dev/core@packages+qwik)(@qwik.dev/router@packages+qwik-router)(@tailwindcss/postcss@4.2.2)(@tailwindcss/vite@4.2.2(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)))(tailwindcss@4.2.1)(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) '@qwik.dev/optimizer': specifier: workspace:* version: link:../optimizer @@ -358,8 +362,8 @@ importers: specifier: workspace:* version: link:../qwik-router '@rolldown/browser': - specifier: 1.0.0-beta.59 - version: 1.0.0-beta.59(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + specifier: 1.0.0-rc.12 + version: 1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) '@shikijs/colorized-brackets': specifier: 3.21.0 version: 3.21.0 @@ -381,9 +385,12 @@ importers: '@supabase/supabase-js': specifier: 2.53.0 version: 2.53.0 + '@tailwindcss/postcss': + specifier: 4.2.2 + version: 4.2.2 '@tailwindcss/vite': - specifier: 4.1.18 - version: 4.1.18(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + specifier: 4.2.2 + version: 4.2.2(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) '@types/leaflet': specifier: 1.9.21 version: 1.9.21 @@ -429,9 +436,6 @@ importers: prism-themes: specifier: 1.9.0 version: 1.9.0 - prismjs: - specifier: 1.30.0 - version: 1.30.0 qwik-image: specifier: 0.0.16 version: 0.0.16 @@ -448,8 +452,8 @@ importers: specifier: 2.0.0 version: 2.0.0 tailwindcss: - specifier: 4.1.18 - version: 4.1.18 + specifier: 4.2.1 + version: 4.2.1 terser: specifier: 5.46.0 version: 5.46.0 @@ -463,11 +467,11 @@ importers: specifier: 1.2.0 version: 1.2.0(typescript@5.9.3) vite: - specifier: 7.3.1 - version: 7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + specifier: 8.0.9 + version: 8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) vite-tsconfig-paths: specifier: 6.0.4 - version: 6.0.4(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 6.0.4(typescript@5.9.3)(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) wrangler: specifier: 4.80.0 version: 4.80.0 @@ -476,7 +480,7 @@ importers: dependencies: '@typescript-eslint/utils': specifier: ^8.56.1 - version: 8.58.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + version: 8.59.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) jsx-ast-utils: specifier: ^3.3.5 version: 3.3.5 @@ -543,8 +547,8 @@ importers: specifier: workspace:* version: link:../qwik-router '@tailwindcss/vite': - specifier: 4.1.18 - version: 4.1.18(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + specifier: 4.2.2 + version: 4.2.2(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) '@types/density-clustering': specifier: 1.3.3 version: 1.3.3 @@ -565,7 +569,7 @@ importers: version: 17.0.0 netlify-cli: specifier: 24.5.1 - version: 24.5.1(@types/node@24.10.0)(picomatch@4.0.4)(rollup@4.59.0) + version: 24.5.1(@types/node@24.10.0)(picomatch@4.0.4)(rollup@4.60.2) postcss: specifier: 8.5.6 version: 8.5.6 @@ -576,8 +580,8 @@ importers: specifier: 0.7.2 version: 0.7.2(prettier-plugin-jsdoc@1.8.0(prettier@3.7.4))(prettier@3.7.4) tailwindcss: - specifier: 4.1.18 - version: 4.1.18 + specifier: 4.2.1 + version: 4.2.1 typescript: specifier: 5.9.3 version: 5.9.3 @@ -585,14 +589,14 @@ importers: specifier: 8.56.1 version: 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) vite: - specifier: 7.3.1 - version: 7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + specifier: 8.0.9 + version: 8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) vite-tsconfig-paths: specifier: 6.0.4 - version: 6.0.4(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 6.0.4(typescript@5.9.3)(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) zod: specifier: 3.25.48 version: 3.25.48 @@ -610,9 +614,6 @@ importers: launch-editor: specifier: ^2.12.0 version: 2.13.2 - rollup: - specifier: ^4.59.0 - version: 4.59.0 devDependencies: '@croct/json5-parser': specifier: 0.2.2 @@ -638,9 +639,12 @@ importers: prettier: specifier: 3.7.4 version: 3.7.4 + rolldown: + specifier: 1.0.0-rc.16 + version: 1.0.0-rc.16 vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) packages/qwik-dom: {} @@ -665,8 +669,8 @@ importers: specifier: 5.9.3 version: 5.9.3 vite: - specifier: 7.3.1 - version: 7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + specifier: 8.0.9 + version: 8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) packages/qwik-router: dependencies: @@ -736,12 +740,9 @@ importers: vfile: specifier: 6.0.3 version: 6.0.3 - vite: - specifier: '>=6 <9' - version: 7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) vite-imagetools: specifier: 10.0.0 - version: 10.0.0(rollup@4.59.0)(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 10.0.0(rollup@4.60.2)(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) yaml: specifier: ^2.8.2 version: 2.8.3 @@ -776,12 +777,24 @@ importers: uvu: specifier: 0.5.6 version: 0.5.6 + vite: + specifier: 8.0.9 + version: 8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) packages/qwik-vite: devDependencies: image-size: specifier: 1.2.1 version: 1.2.1 + rolldown: + specifier: 1.0.0-rc.16 + version: 1.0.0-rc.16 + rollup: + specifier: 4.60.2 + version: 4.60.2 + vite: + specifier: 8.0.9 + version: 8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) packages/supabase-auth-helpers-qwik: devDependencies: @@ -842,6 +855,10 @@ packages: '@algolia/transporter@4.16.0': resolution: {integrity: sha512-H9BVB2EAjT65w7XGBNf5drpsW39x2aSZ942j4boSAAJPPlLmjtj5IpAP7UAtsV8g9Beslonh0bLa1XGmE/P0BA==} + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} @@ -921,8 +938,8 @@ packages: '@bugsnag/core@8.9.0': resolution: {integrity: sha512-SrXO0isIZfrCem06/WDvC5MSd1Tj6Yjm4Wqdlv6jyjTvsow+cppvt7rS9Bps3qOeXfYCqWHN4ev02OdwnfZ1PQ==} - '@bugsnag/cuid@3.2.1': - resolution: {integrity: sha512-zpvN8xQ5rdRWakMd/BcVkdn2F8HKlDSbM3l7duueK590WmI1T0ObTLc1V/1e55r14WNjPd5AJTYX4yPEAFVi+Q==} + '@bugsnag/cuid@3.2.2': + resolution: {integrity: sha512-7onuYLTMqMmHE9BBPG0YER4nFsU1rB+me1/YIeMusqcLbVbKKuG9u9+BDVDpje5e0llkkrVNOKYwmzM9DRIo7A==} '@bugsnag/js@8.9.0': resolution: {integrity: sha512-ChjKFVBF2CgepDXfMBkbEdcFUniJNN8py5V+tinaB8+vpJbr/fD1+VLFhkruSEn3jOafXrc1XJe9WHtsu9ht0g==} @@ -933,11 +950,11 @@ packages: '@bugsnag/safe-json-stringify@6.1.0': resolution: {integrity: sha512-ImA35rnM7bGr+J30R979FQ95BhRB4UO1KfJA0J2sVqc8nwnrS9hhE5mkTmQWMs8Vh1Da+hkLKs5jJB4JjNZp4A==} - '@changesets/apply-release-plan@7.1.0': - resolution: {integrity: sha512-yq8ML3YS7koKQ/9bk1PqO0HMzApIFNwjlwCnwFEXMzNe8NpzeeYYKCmnhWJGkN8g7E51MnWaSbqRcTcdIxUgnQ==} + '@changesets/apply-release-plan@7.1.1': + resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} - '@changesets/assemble-release-plan@6.0.9': - resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} + '@changesets/assemble-release-plan@6.0.10': + resolution: {integrity: sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==} '@changesets/changelog-git@0.2.1': resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} @@ -946,20 +963,20 @@ packages: resolution: {integrity: sha512-0j0cPq3fgxt2dPdFsg4XvO+6L66RC0pZybT9F4dG5TBrLA3jA/1pNkdTXH9IBBVHkgsKrNKenI3n1mPyPlIydg==} hasBin: true - '@changesets/config@3.1.3': - resolution: {integrity: sha512-vnXjcey8YgBn2L1OPWd3ORs0bGC4LoYcK/ubpgvzNVr53JXV5GiTVj7fWdMRsoKUH7hhhMAQnsJUqLr21EncNw==} + '@changesets/config@3.1.4': + resolution: {integrity: sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - '@changesets/get-dependents-graph@2.1.3': - resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} + '@changesets/get-dependents-graph@2.1.4': + resolution: {integrity: sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==} '@changesets/get-github-info@0.6.0': resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==} - '@changesets/get-release-plan@4.0.15': - resolution: {integrity: sha512-Q04ZaRPuEVZtA+auOYgFaVQQSA98dXiVe/yFaZfY7hoSmQICHGvP0TF4u3EDNHWmmCS4ekA/XSpKlSM2PyTS2g==} + '@changesets/get-release-plan@4.0.16': + resolution: {integrity: sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} @@ -1057,8 +1074,8 @@ packages: '@dabh/diagnostics@2.0.8': resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} - '@dependents/detective-less@5.0.1': - resolution: {integrity: sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==} + '@dependents/detective-less@5.0.3': + resolution: {integrity: sha512-v6oD9Ukp+N7V4n6p5I/+mM5fIohSfkrDSGlFm5w/pYmchvbk+sMIHsLxrFJ5Lnujewj1BzWL0K84d88lwZAMQA==} engines: {node: '>=18'} '@drizzle-team/brocli@0.10.2': @@ -1070,6 +1087,9 @@ packages: '@emnapi/core@1.9.2': resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.9.2': resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} @@ -1827,12 +1847,16 @@ packages: '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': @@ -1850,14 +1874,14 @@ packages: '@iarna/toml@2.2.5': resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} - '@iconify/json@2.2.461': - resolution: {integrity: sha512-UiujJDldh6bD5v0EDbB6aKgye1tW3mteqmjHAwXi1bLQm9OYnHAWBIe8ogVZB2ttEFFraOBFkpe3VFwtxRSKSQ==} + '@iconify/json@2.2.467': + resolution: {integrity: sha512-vjw27l6Sp6OJnCSNAhE6PGCZFYNSp68j1xK+hws0T5mptSEez0EjmmJBQLUk4yM5nhA9G5H5mW3EF2/yRfk74Q==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@3.1.0': - resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} + '@iconify/utils@3.1.1': + resolution: {integrity: sha512-MwzoDtw9rO1x+qfgLTV/IVXsHDBqeYZoMIQC8SfxfYSlaSUG+oWiAcoiB1yajAda6mqblm4/1/w2E8tRu7a7Tw==} '@img/colour@1.1.0': resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} @@ -2290,8 +2314,8 @@ packages: '@napi-rs/triples@1.2.0': resolution: {integrity: sha512-HAPjR3bnCsdXBsATpDIP5WCrw0JcACwhhrwIAQhiR46n+jm+a2F8kBsfseAuWtSyQ+H3Yebt2k43B5dy+04yMA==} - '@napi-rs/wasm-runtime@1.1.3': - resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 @@ -2385,8 +2409,8 @@ packages: resolution: {integrity: sha512-Ejrb+1HL11zgVgaaMHWukH4hOXFy3FUtue8hD5rgBiLWeGp03uOlGehmbRz47FXvGBMK7Z4t7HZRZU/vpaN5+g==} engines: {node: '>=20.6.1'} - '@netlify/functions-utils@6.2.29': - resolution: {integrity: sha512-82VfLDTEXLl6LKKMlBUIektOOaIz4Bhdn1FI6zgRhE4uPDnDd1rhJZPZ1JXf7QUaj0xUfVQAf9cALnQR0y+8Qw==} + '@netlify/functions-utils@6.2.30': + resolution: {integrity: sha512-UpYeqEWXpheOrq6vmQJq/SBWToHpi0qxHoUNNr2dSUrplJa+ehUnEujaDE2kiQnuux88cM9Zt9x+KmBVTYG12g==} engines: {node: '>=18.14.0'} '@netlify/functions@5.1.5': @@ -2485,8 +2509,8 @@ packages: resolution: {integrity: sha512-siVwmrp7Ow+7jLALi6jXOja4Y4uHMMgOLLQMgd+OZ1TESOstrJvkUisJEDAc9hx7u0v/B0mh5g1g1huiH3uS3A==} engines: {node: '>=18.14.0'} - '@netlify/open-api@2.52.0': - resolution: {integrity: sha512-QkWQu0vz3uBcxjSslA0N6Njo0x1ndkhEIVEmdwcmxfufX8wA0d9WjiU2sWuHYw11Mrf5pkMUQHvZy+6V4A9TYQ==} + '@netlify/open-api@2.53.0': + resolution: {integrity: sha512-CcIhcB+XzY77nze7vLTdxkqS/uX5DXleo3adE8H+M7TapLX6GTXp5qMIsq8bAuHy5eGw0ijRrAnSUmkOP4DM2w==} engines: {node: '>=14.8.0'} '@netlify/opentelemetry-utils@2.0.2': @@ -2527,8 +2551,8 @@ packages: resolution: {integrity: sha512-4DoMV6nJRpBNkWUHCyyhovZxMQNHYO0/oiK1TDe+Kx+pDycqCO3YqbqFDgPwZg807H/L5SnsZF9JgPgu2ACKIw==} engines: {node: '>=18.0.0'} - '@netlify/serverless-functions-api@2.14.0': - resolution: {integrity: sha512-6UwJ9Fm8NU9LPBa5zV5Gv20JgSEPOOwZ7oUbNYbB7SUnNTmIBccafgZF3+xXqSpI3hxXn4/l5xxCO+Pc2KURZA==} + '@netlify/serverless-functions-api@2.15.0': + resolution: {integrity: sha512-FDZwRBWq6zgmuYkszHGcN1qYliTOY7/ZzuWWxJy1WoB4cZt6gdzgN5Gx9zuIKfiL9KelL0iAnd/bZrrfLZZ5ig==} engines: {node: '>=18.0.0'} '@netlify/static@3.1.7': @@ -2544,8 +2568,8 @@ packages: engines: {node: '>=18.14.0'} hasBin: true - '@netlify/zip-it-and-ship-it@14.5.3': - resolution: {integrity: sha512-7CCFbfEs11WZmY2ddXR85q6O6dHr8aWA/fcdw+7ftwtIaajQKWGDduZT5lI+u7i60wVymt8CEu2Et/hKOhFtzQ==} + '@netlify/zip-it-and-ship-it@14.5.4': + resolution: {integrity: sha512-kaX/03YsBy/9ZOTNF/EtbBkof/Uukul5mnxs/SHD8LPY9Co6TcdMz61ZfDNyAYeIdfTMDIs4EFNBQPvzHexEMg==} engines: {node: '>=18.14.0'} hasBin: true @@ -3075,6 +3099,9 @@ packages: '@oxc-project/types@0.115.0': resolution: {integrity: sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==} + '@oxc-project/types@0.126.0': + resolution: {integrity: sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ==} + '@oxc-project/types@0.82.3': resolution: {integrity: sha512-6nCUxBnGX0c6qfZW5MaF6/fmu5dHJDMiMPaioKHKs5mi5+8/FHQ7WGjgQIz1zxpmceMYfdIXkOaLYE+ejbuOtA==} @@ -3392,10 +3419,102 @@ packages: resolution: {integrity: sha512-e0wY8vmx0nDSUiuCATlk+ojTvdBV4txIGHHWjZW5SRkv4XB8H9+3WSDcLPz0ItUdRyzcrohE9k2jtQI/98aRPA==} engines: {node: '>=15.0.0'} - '@rolldown/browser@1.0.0-beta.59': - resolution: {integrity: sha512-4mPCTcp0HHFOfaQTz+Qb7bFHovQFWadTAX+GgbGwGXGUi41xMv6epDtIBpC+O/+odX2n0z1nXyOPGvra4ufW4Q==} + '@rolldown/binding-android-arm64@1.0.0-rc.16': + resolution: {integrity: sha512-rhY3k7Bsae9qQfOtph2Pm2jZEA+s8Gmjoz4hhmx70K9iMQ/ddeae+xhRQcM5IuVx5ry1+bGfkvMn7D6MJggVSA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.16': + resolution: {integrity: sha512-rNz0yK078yrNn3DrdgN+PKiMOW8HfQ92jQiXxwX8yW899ayV00MLVdaCNeVBhG/TbH3ouYVObo8/yrkiectkcQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.16': + resolution: {integrity: sha512-r/OmdR00HmD4i79Z//xO06uEPOq5hRXdhw7nzkxQxwSavs3PSHa1ijntdpOiZ2mzOQ3fVVu8C1M19FoNM+dMUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.16': + resolution: {integrity: sha512-KcRE5w8h0OnjUatG8pldyD14/CQ5Phs1oxfR+3pKDjboHRo9+MkqQaiIZlZRpsxC15paeXme/I127tUa9TXJ6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.16': + resolution: {integrity: sha512-bT0guA1bpxEJ/ZhTRniQf7rNF8ybvXOuWbNIeLABaV5NGjx4EtOWBTSRGWFU9ZWVkPOZ+HNFP8RMcBokBiZ0Kg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.16': + resolution: {integrity: sha512-+tHktCHWV8BDQSjemUqm/Jl/TPk3QObCTIjmdDy/nlupcujZghmKK2962LYrqFpWu+ai01AN/REOH3NEpqvYQg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.16': + resolution: {integrity: sha512-3fPzdREH806oRLxpTWW1Gt4tQHs0TitZFOECB2xzCFLPKnSOy90gwA7P29cksYilFO6XVRY1kzga0cL2nRjKPg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.16': + resolution: {integrity: sha512-EKwI1tSrLs7YVw+JPJT/G2dJQ1jl9qlTTTEG0V2Ok/RdOenRfBw2PQdLPyjhIu58ocdBfP7vIRN/pvMsPxs/AQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.16': + resolution: {integrity: sha512-Uknladnb3Sxqu6SEcqBldQyJUpk8NleooZEc0MbRBJ4inEhRYWZX0NJu12vNf2mqAq7gsofAxHrGghiUYjhaLQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.16': + resolution: {integrity: sha512-FIb8+uG49sZBtLTn+zt1AJ20TqVcqWeSIyoVt0or7uAWesgKaHbiBh6OpA/k9v0LTt+PTrb1Lao133kP4uVxkg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.16': + resolution: {integrity: sha512-RuERhF9/EgWxZEXYWCOaViUWHIboceK4/ivdtQ3R0T44NjLkIIlGIAVAuCddFxsZ7vnRHtNQUrt2vR2n2slB2w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.16': + resolution: {integrity: sha512-mXcXnvd9GpazCxeUCCnZ2+YF7nut+ZOEbE4GtaiPtyY6AkhZWbK70y1KK3j+RDhjVq5+U8FySkKRb/+w0EeUwA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.16': + resolution: {integrity: sha512-3Q2KQxnC8IJOLqXmUMoYwyIPZU9hzRbnHaoV3Euz+VVnjZKcY8ktnNP8T9R4/GGQtb27C/UYKABxesKWb8lsvQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.16': + resolution: {integrity: sha512-tj7XRemQcOcFwv7qhpUxMTBbI5mWMlE4c1Omhg5+h8GuLXzyj8HviYgR+bB2DMDgRqUE+jiDleqSCRjx4aYk/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.16': + resolution: {integrity: sha512-PH5DRZT+F4f2PTXRXR8uJxnBq2po/xFtddyabTJVJs/ZYVHqXPEgNIr35IHTEa6bpa0Q8Awg+ymkTaGnKITw4g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/browser@1.0.0-rc.12': + resolution: {integrity: sha512-E6XVYtkrEiHE2JzKr4Bntzi/yvYDXZi9RNCYtgoZ7i9fqn9W8sTlReV2KO2H8nc2mN+0YHZeKmeuKf8ct4r1CQ==} hasBin: true + '@rolldown/pluginutils@1.0.0-rc.16': + resolution: {integrity: sha512-45+YtqxLYKDWQouLKCrpIZhke+nXxhsw+qAHVzHDVwttyBlHNBVs2K25rDXrZzhpTp9w1FlAlvweV1H++fdZoA==} + '@rollup/pluginutils@5.3.0': resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} @@ -3405,128 +3524,128 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.59.0': - resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} + '@rollup/rollup-android-arm-eabi@4.60.2': + resolution: {integrity: sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.59.0': - resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} + '@rollup/rollup-android-arm64@4.60.2': + resolution: {integrity: sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.59.0': - resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} + '@rollup/rollup-darwin-arm64@4.60.2': + resolution: {integrity: sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.59.0': - resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} + '@rollup/rollup-darwin-x64@4.60.2': + resolution: {integrity: sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.59.0': - resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} + '@rollup/rollup-freebsd-arm64@4.60.2': + resolution: {integrity: sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.59.0': - resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} + '@rollup/rollup-freebsd-x64@4.60.2': + resolution: {integrity: sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': - resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} + '@rollup/rollup-linux-arm-gnueabihf@4.60.2': + resolution: {integrity: sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.59.0': - resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} + '@rollup/rollup-linux-arm-musleabihf@4.60.2': + resolution: {integrity: sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.59.0': - resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} + '@rollup/rollup-linux-arm64-gnu@4.60.2': + resolution: {integrity: sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.59.0': - resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} + '@rollup/rollup-linux-arm64-musl@4.60.2': + resolution: {integrity: sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.59.0': - resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} + '@rollup/rollup-linux-loong64-gnu@4.60.2': + resolution: {integrity: sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loong64-musl@4.59.0': - resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} + '@rollup/rollup-linux-loong64-musl@4.60.2': + resolution: {integrity: sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.59.0': - resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} + '@rollup/rollup-linux-ppc64-gnu@4.60.2': + resolution: {integrity: sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-musl@4.59.0': - resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} + '@rollup/rollup-linux-ppc64-musl@4.60.2': + resolution: {integrity: sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.59.0': - resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} + '@rollup/rollup-linux-riscv64-gnu@4.60.2': + resolution: {integrity: sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.59.0': - resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} + '@rollup/rollup-linux-riscv64-musl@4.60.2': + resolution: {integrity: sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.59.0': - resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} + '@rollup/rollup-linux-s390x-gnu@4.60.2': + resolution: {integrity: sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.59.0': - resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} + '@rollup/rollup-linux-x64-gnu@4.60.2': + resolution: {integrity: sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.59.0': - resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} + '@rollup/rollup-linux-x64-musl@4.60.2': + resolution: {integrity: sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==} cpu: [x64] os: [linux] - '@rollup/rollup-openbsd-x64@4.59.0': - resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} + '@rollup/rollup-openbsd-x64@4.60.2': + resolution: {integrity: sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.59.0': - resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} + '@rollup/rollup-openharmony-arm64@4.60.2': + resolution: {integrity: sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.59.0': - resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} + '@rollup/rollup-win32-arm64-msvc@4.60.2': + resolution: {integrity: sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.59.0': - resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} + '@rollup/rollup-win32-ia32-msvc@4.60.2': + resolution: {integrity: sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.59.0': - resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} + '@rollup/rollup-win32-x64-gnu@4.60.2': + resolution: {integrity: sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.59.0': - resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} + '@rollup/rollup-win32-x64-msvc@4.60.2': + resolution: {integrity: sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==} cpu: [x64] os: [win32] @@ -3646,8 +3765,8 @@ packages: peerDependencies: '@supabase/supabase-js': ^2.43.4 - '@supabase/storage-js@2.103.0': - resolution: {integrity: sha512-DHmlvdAXwtOmZNbkIZi4lkobPR3XjIzoOgzoz5duMf6G+sDeY015YrzMJCnqdccuYr7X5x4yYuSwF//RoN2dvQ==} + '@supabase/storage-js@2.105.1': + resolution: {integrity: sha512-owfdCNH5ikXXDusjzsgU6LavEBqGUoueOnL/9XIucld70/WJ/rbqp89K//c9QPICDNuegsmpoeasydDAiucLKQ==} engines: {node: '>=20.0.0'} '@supabase/supabase-js@2.53.0': @@ -3658,65 +3777,65 @@ packages: peerDependencies: acorn: ^8.9.0 - '@tailwindcss/node@4.1.18': - resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} + '@tailwindcss/node@4.2.2': + resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} - '@tailwindcss/oxide-android-arm64@4.1.18': - resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} - engines: {node: '>= 10'} + '@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.18': - resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} - engines: {node: '>= 10'} + '@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.18': - resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} - engines: {node: '>= 10'} + '@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.18': - resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} - engines: {node: '>= 10'} + '@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.18': - resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} - engines: {node: '>= 10'} + '@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.18': - resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} - engines: {node: '>= 10'} + '@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.18': - resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} - engines: {node: '>= 10'} + '@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.18': - resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} - engines: {node: '>= 10'} + '@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.18': - resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} - engines: {node: '>= 10'} + '@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.18': - resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -3727,26 +3846,29 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': - resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} - engines: {node: '>= 10'} + '@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.18': - resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} - engines: {node: '>= 10'} + '@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.18': - resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} - engines: {node: '>= 10'} + '@tailwindcss/oxide@4.2.2': + resolution: {integrity: sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==} + engines: {node: '>= 20'} - '@tailwindcss/vite@4.1.18': - resolution: {integrity: sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==} + '@tailwindcss/postcss@4.2.2': + resolution: {integrity: sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==} + + '@tailwindcss/vite@4.2.2': + resolution: {integrity: sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==} peerDependencies: - vite: ^5.2.0 || ^6 || ^7 + vite: ^5.2.0 || ^6 || ^7 || ^8 '@ts-morph/common@0.28.1': resolution: {integrity: sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==} @@ -3957,8 +4079,8 @@ packages: peerDependencies: typescript: 5.9.3 - '@typescript-eslint/project-service@8.58.1': - resolution: {integrity: sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==} + '@typescript-eslint/project-service@8.59.1': + resolution: {integrity: sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 5.9.3 @@ -3973,8 +4095,8 @@ packages: resolution: {integrity: sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.58.1': - resolution: {integrity: sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==} + '@typescript-eslint/scope-manager@8.59.1': + resolution: {integrity: sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/tsconfig-utils@8.56.1': @@ -3983,8 +4105,8 @@ packages: peerDependencies: typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.58.1': - resolution: {integrity: sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==} + '@typescript-eslint/tsconfig-utils@8.59.1': + resolution: {integrity: sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 5.9.3 @@ -4000,8 +4122,8 @@ packages: resolution: {integrity: sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.58.1': - resolution: {integrity: sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==} + '@typescript-eslint/types@8.59.1': + resolution: {integrity: sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.56.1': @@ -4010,8 +4132,8 @@ packages: peerDependencies: typescript: 5.9.3 - '@typescript-eslint/typescript-estree@8.58.1': - resolution: {integrity: sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==} + '@typescript-eslint/typescript-estree@8.59.1': + resolution: {integrity: sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 5.9.3 @@ -4023,8 +4145,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: 5.9.3 - '@typescript-eslint/utils@8.58.1': - resolution: {integrity: sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==} + '@typescript-eslint/utils@8.59.1': + resolution: {integrity: sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -4034,8 +4156,8 @@ packages: resolution: {integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.58.1': - resolution: {integrity: sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==} + '@typescript-eslint/visitor-keys@8.59.1': + resolution: {integrity: sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript/analyze-trace@0.10.1': @@ -4057,11 +4179,11 @@ packages: engines: {node: '>=18'} hasBin: true - '@vitejs/plugin-basic-ssl@2.1.4': - resolution: {integrity: sha512-HXciTXN/sDBYWgeAD4V4s0DN0g72x5mlxQhHxtYu3Tt8BLa6MzcJZUyDVFCdtjNs3bfENVHVzOsmooTVuNgAAw==} + '@vitejs/plugin-basic-ssl@2.2.0': + resolution: {integrity: sha512-nmyQ1HGRkfUxjsv3jw0+hMhEdZdrtkvMTdkzRUaRWfiO6PCWw2V2Pz3gldCq96Tn9S8htcgdTxw/gmbLLEbfYw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} peerDependencies: - vite: ^6.0.0 || ^7.0.0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 '@vitest/coverage-v8@4.0.18': resolution: {integrity: sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==} @@ -4110,17 +4232,17 @@ packages: '@volar/typescript@2.4.28': resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} - '@vue/compiler-core@3.5.32': - resolution: {integrity: sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ==} + '@vue/compiler-core@3.5.33': + resolution: {integrity: sha512-3PZLQwFw4Za3TC8t0FvTy3wI16Kt+pmwcgNZca4Pj9iWL2E72a/gZlpBtAJvEdDMdCxdG/qq0C7PN0bsJuv0Rw==} - '@vue/compiler-dom@3.5.32': - resolution: {integrity: sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q==} + '@vue/compiler-dom@3.5.33': + resolution: {integrity: sha512-PXq0yrfCLzzL07rbXO4awtXY1Z06LG2eu6Adg3RJFa/j3Cii217XxxLXG22N330gw7GmALCY0Z8RgXEviwgpjA==} - '@vue/compiler-sfc@3.5.32': - resolution: {integrity: sha512-8UYUYo71cP/0YHMO814TRZlPuUUw3oifHuMR7Wp9SNoRSrxRQnhMLNlCeaODNn6kNTJsjFoQ/kqIj4qGvya4Xg==} + '@vue/compiler-sfc@3.5.33': + resolution: {integrity: sha512-UTUvRO9cY+rROrx/pvN9P5Z7FgA6QGfokUCfhQE4EnmUj3rVnK+CHI0LsEO1pg+I7//iRYMUfcNcCPe7tg0CoA==} - '@vue/compiler-ssr@3.5.32': - resolution: {integrity: sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw==} + '@vue/compiler-ssr@3.5.33': + resolution: {integrity: sha512-IErjYdnj1qIupG5xxiVIYiiRvDhGWV4zuh/RCrwfYpuL+HWQzeU6lCk/nF9r7olWMnjKxCAkOctT2qFWFkzb1A==} '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} @@ -4133,8 +4255,8 @@ packages: typescript: optional: true - '@vue/shared@3.5.32': - resolution: {integrity: sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==} + '@vue/shared@3.5.33': + resolution: {integrity: sha512-5vR2QIlmaLG77Ygd4pMP6+SGQ5yox9VhtnbDWTy9DzMzdmeLxZ1QqxrywEZ9sa1AVubfIJyaCG3ytyWU81ufcQ==} '@whatwg-node/disposablestack@0.0.6': resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} @@ -4218,12 +4340,15 @@ packages: ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + algoliasearch@4.16.0: resolution: {integrity: sha512-HAjKJ6bBblaXqO4dYygF4qx251GuJ6zCZt+qbJ+kU7sOC+yc84pawEjVpJByh+cGP2APFCsao2Giz50cDlKNPA==} @@ -4413,8 +4538,8 @@ packages: bare-abort-controller: optional: true - bare-fs@4.7.0: - resolution: {integrity: sha512-xzqKsCFxAek9aezYhjJuJRXBIaYlg/0OGDTZp+T8eYmYMlm66cs6cYko02drIyjN2CBbi+I6L7YfXyqpqtKRXA==} + bare-fs@4.7.1: + resolution: {integrity: sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -4422,15 +4547,15 @@ packages: bare-buffer: optional: true - bare-os@3.8.7: - resolution: {integrity: sha512-G4Gr1UsGeEy2qtDTZwL7JFLo2wapUarz7iTMcYcMFdS89AIQuBoyjgXZz0Utv7uHs3xA9LckhVbeBi8lEQrC+w==} + bare-os@3.9.0: + resolution: {integrity: sha512-JTjuZyNIDpw+GytMO4a6TK1VXdVKKJr6DRxEHasyuYyShV2deuiHJK/ahGZlebc+SG0/wJCB9XK8gprBGDFi/Q==} engines: {bare: '>=1.14.0'} bare-path@3.0.0: resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.12.0: - resolution: {integrity: sha512-w28i8lkBgREV3rPXGbgK+BO66q+ZpKqRWrZLiCdmmUlLPrQ45CzkvRhN+7lnv00Gpi2zy5naRxnUFAxCECDm9g==} + bare-stream@2.13.1: + resolution: {integrity: sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow==} peerDependencies: bare-abort-controller: '*' bare-buffer: '*' @@ -4443,14 +4568,14 @@ packages: bare-events: optional: true - bare-url@2.4.0: - resolution: {integrity: sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==} + bare-url@2.4.2: + resolution: {integrity: sha512-/9a2j4ac6ckpmAHvod/ob7x439OAHst/drc2Clnq+reRYd/ovddwcF4LfoxHyNk5AuGBnPg+HqFjmE/Zpq6v0A==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.17: - resolution: {integrity: sha512-HdrkN8eVG2CXxeifv/VdJ4A4RSra1DTW8dc/hdxzhGHN8QePs6gKaWM9pHPcpCoxYZJuOZ8drHmbdpLHjCYjLA==} + baseline-browser-mapping@2.10.24: + resolution: {integrity: sha512-I2NkZOOrj2XuguvWCK6OVh9GavsNjZjK908Rq3mIBK25+GD8vPX5w2WdxVqnQ7xx3SrZJiCiZFu+/Oz50oSYSA==} engines: {node: '>=6.0.0'} hasBin: true @@ -4488,8 +4613,8 @@ packages: blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} - body-parser@1.20.4: - resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} + body-parser@1.20.5: + resolution: {integrity: sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} body-parser@2.2.2: @@ -4503,11 +4628,11 @@ packages: resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} engines: {node: '>=18'} - brace-expansion@1.1.13: - resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==} + brace-expansion@1.1.14: + resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} - brace-expansion@2.0.3: - resolution: {integrity: sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==} + brace-expansion@2.1.0: + resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} brace-expansion@5.0.5: resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} @@ -4586,8 +4711,8 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - caniuse-lite@1.0.30001787: - resolution: {integrity: sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==} + caniuse-lite@1.0.30001791: + resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -4882,10 +5007,10 @@ packages: crossws@0.3.5: resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} - crossws@0.4.4: - resolution: {integrity: sha512-w6c4OdpRNnudVmcgr7brb/+/HmYjMQvYToO/oTrprTwxRUiom3LYWU1PMWuD006okbUWpII1Ea9/+kwpUfmyRg==} + crossws@0.4.5: + resolution: {integrity: sha512-wUR89x/Rw7/8t+vn0CmGDYM9TD6VtARGb0LD5jq2wjtMy1vCP4M+sm6N6TigWeTYvnA8MoW29NqqXD0ep0rfBA==} peerDependencies: - srvx: '>=0.7.1' + srvx: '>=0.11.5' peerDependenciesMeta: srvx: optional: true @@ -5056,17 +5181,17 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - detective-amd@6.0.1: - resolution: {integrity: sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==} + detective-amd@6.1.0: + resolution: {integrity: sha512-fmI6LGMvotqd49QaA3ZYw+q0aGp2yXmMjzIuY6fH9j9YFIXY/73yDhMwhX9cPbhWd+AH06NH1Di/LKOuCH0Ubg==} engines: {node: '>=18'} hasBin: true - detective-cjs@6.1.0: - resolution: {integrity: sha512-Qt3S4IddVNDb+71lm+jmt5NznIsgcKlibTnrw9Zr91rT9vRwKp+73+ImqLTNrQj4YuOxnzrC7GwIAVwF7136XQ==} + detective-cjs@6.1.1: + resolution: {integrity: sha512-pSh7mkCKEtLlmANqLu3KDFS3NV8Hx41jy/JF1/gAWOgU+Uo5QTkeI1tWNP4dWGo4L0E9j18Ez9EPsTleautKqA==} engines: {node: '>=18'} - detective-es6@5.0.1: - resolution: {integrity: sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==} + detective-es6@5.0.2: + resolution: {integrity: sha512-+qHHGYhjupiVs4rnIpI9nZ5B130A4AmE35ZX1w33hb46vcZ7T3jfDbvmPw0FhWtMHn5BS5HHu7ZtnZ53bMcXZA==} engines: {node: '>=18'} detective-postcss@7.0.1: @@ -5075,26 +5200,26 @@ packages: peerDependencies: postcss: ^8.4.47 - detective-sass@6.0.1: - resolution: {integrity: sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==} + detective-sass@6.0.2: + resolution: {integrity: sha512-i3xpXHDKS0qI2aFW4asQ7fqlPK00ndOVZELvQapFJCaF0VxYmsNWtd0AmvXbTLMk7bfO5VdIeorhY9KfmHVoVA==} engines: {node: '>=18'} - detective-scss@5.0.1: - resolution: {integrity: sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==} + detective-scss@5.0.2: + resolution: {integrity: sha512-9JOEMZ8pDh3ShXmftq7hoQqqJsClaGgxo1hghfCeFlmKf5TC/Twtwb0PAaK8dXwpg9Z0uCmEYSrCxO+kel2eEg==} engines: {node: '>=18'} detective-stylus@5.0.1: resolution: {integrity: sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==} engines: {node: '>=18'} - detective-typescript@14.0.0: - resolution: {integrity: sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==} + detective-typescript@14.1.2: + resolution: {integrity: sha512-bIeEn0eVi/JRsE1YizBR2ilnMlWRAIBJJ6kXCKNFxEEWhUcEY3R6I3KYIAy48ieURbD1hcb3Ebvl8AqeoPMSzg==} engines: {node: '>=18'} peerDependencies: typescript: 5.9.3 - detective-vue2@2.2.0: - resolution: {integrity: sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==} + detective-vue2@2.3.0: + resolution: {integrity: sha512-3gwbZPqVTm9sL9XdZsgEJ7x4x99O853VVZHapQAiEkGuMJMpFPjHDrecSgfqnS5JW3FJfYXesLZGvUOibjn49g==} engines: {node: '>=18'} peerDependencies: typescript: 5.9.3 @@ -5283,11 +5408,11 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - effect@3.21.0: - resolution: {integrity: sha512-PPN80qRokCd1f015IANNhrwOnLO7GrrMQfk4/lnZRE/8j7UPWrNNjPV0uBrZutI/nHzernbW+J0hdqQysHiSnQ==} + effect@3.21.2: + resolution: {integrity: sha512-rXd2FGDM8KdjSIrc+mqEELo7ScW7xTVxEf1iInmPSpIde9/nyGuFM710cjTo7/EreGXiUX2MOonPpprbz2XHCg==} - electron-to-chromium@1.5.334: - resolution: {integrity: sha512-mgjZAz7Jyx1SRCwEpy9wefDS7GvNPazLthHg8eQMJ76wBdGQQDW33TCrUTvQ4wzpmOrv2zrFoD3oNufMdyMpog==} + electron-to-chromium@1.5.344: + resolution: {integrity: sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -5312,8 +5437,8 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.20.1: - resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} + enhanced-resolve@5.21.0: + resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==} engines: {node: '>=10.13.0'} enquirer@2.4.1: @@ -5914,8 +6039,8 @@ packages: folder-walker@3.2.0: resolution: {integrity: sha512-VjAQdSLsl6AkpZNyrQJfO7BXLo4chnStqb055bumZMbRUPpVuPN3a4ktsnRCmrFZjtMlYLkyXiR5rAs4WOpC4Q==} - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -5997,8 +6122,8 @@ packages: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} - get-amd-module-type@6.0.1: - resolution: {integrity: sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==} + get-amd-module-type@6.0.2: + resolution: {integrity: sha512-7zShVYAYtMnj9S65CfN+hvpBCByfuB1OY8xID01nZEzXTZbx4YyysAfi+nMl95JSR6odt4q8TCj2W63KAoyVLQ==} engines: {node: '>=18'} get-caller-file@2.0.5: @@ -6048,8 +6173,8 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.13.7: - resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} git-repo-info@2.1.1: resolution: {integrity: sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg==} @@ -6156,8 +6281,8 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} hast-util-heading-rank@2.1.1: @@ -6687,8 +6812,8 @@ packages: jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - jose@6.2.2: - resolution: {integrity: sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==} + jose@6.2.3: + resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} jpeg-js@0.4.4: resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} @@ -6753,8 +6878,8 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.2.0: - resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} @@ -6855,74 +6980,74 @@ packages: light-my-request@6.6.0: resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} - lightningcss-android-arm64@1.30.2: - resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + 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.2: - resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + 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.2: - resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + 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.2: - resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + 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.2: - resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + 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.2: - resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + 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.2: - resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + 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.2: - resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + 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.2: - resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + 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.2: - resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + 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.2: - resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + 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.2: - resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} lines-and-columns@1.2.4: @@ -7024,8 +7149,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.3.3: - resolution: {integrity: sha512-JvNw9Y81y33E+BEYPr0U7omo+U9AySnsMsEiXgwT6yqd31VQWTLNQqmT4ou5eqPFUrTfIDFta2wKhB1hyohtAQ==} + lru-cache@11.3.5: + resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} engines: {node: 20 || >=22} lru-cache@6.0.0: @@ -7382,8 +7507,8 @@ packages: resolution: {integrity: sha512-YTefgdpKKFgoTDbEUqXqgUJct2OG6/4hs4XWLsxcHkDLj/x/V8WmKIRppPnXP5feQ7d1vuYWSp3qKkxfwaFaxA==} engines: {node: '>=18.0.0'} - module-definition@6.0.1: - resolution: {integrity: sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g==} + module-definition@6.0.2: + resolution: {integrity: sha512-SvAU3lB0+Yjbq55yHY3wkRZBOh+fhU1SnIF3IFbTewv6mtAh7yUT8ACHAJ2mGIJ7tCes2QuCL/cl6m0JSZ/ArA==} engines: {node: '>=18'} hasBin: true @@ -7429,8 +7554,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.1.7: - resolution: {integrity: sha512-ua3NDgISf6jdwezAheMOk4mbE1LXjm1DfMUDMuJf4AqxLFK3ccGpgWizwa5YV7Yz9EpXwEaWoRXSb/BnV0t5dQ==} + nanoid@5.1.9: + resolution: {integrity: sha512-ZUvP7KeBLe3OZ1ypw6dI/TzYJuvHP77IM4Ry73waSQTLn8/g8rpdjfyVAh7t1/+FjBtG4lCP42MEbDxOsRpBMw==} engines: {node: ^18 || >=20} hasBin: true @@ -7495,11 +7620,11 @@ packages: node-mock-http@1.0.4: resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} - node-releases@2.0.37: - resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==} + node-releases@2.0.38: + resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} - node-source-walk@7.0.1: - resolution: {integrity: sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==} + node-source-walk@7.0.2: + resolution: {integrity: sha512-71kFFjYaSshDTA8/a2HiTYPLdASWjLJxUyJxGE+ffxU+KhxSBtM9kiLUX+R2yooFdSFKMFpi4n3PFtDy6qXv8A==} engines: {node: '>=18'} node-stream-zip@1.15.0: @@ -7554,8 +7679,8 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - oauth4webapi@3.8.5: - resolution: {integrity: sha512-A8jmyUckVhRJj5lspguklcl90Ydqk61H3dcU0oLhH3Yv13KpAliKTt5hknpGGPZSSfOwGyraNEFmofDYH+1kSg==} + oauth4webapi@3.8.6: + resolution: {integrity: sha512-iwemM91xz8nryHti2yTmg5fhyEMVOkOXwHNqbvcATjyajb5oQxCQzrNOA6uElRHuMhQQTKUyFKV9y/CNyg25BQ==} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -7631,11 +7756,11 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} - oniguruma-parser@0.12.1: - resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} - oniguruma-to-es@4.3.5: - resolution: {integrity: sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ==} + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} open@10.2.0: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} @@ -7957,8 +8082,8 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - pkg-types@2.3.0: - resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + pkg-types@2.3.1: + resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} playwright-core@1.57.0: resolution: {integrity: sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==} @@ -7983,12 +8108,12 @@ packages: peerDependencies: postcss: ^8.2.9 - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.12: + resolution: {integrity: sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.9: - resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -8019,8 +8144,8 @@ packages: preact@10.24.3: resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} - precinct@12.2.0: - resolution: {integrity: sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w==} + precinct@12.3.1: + resolution: {integrity: sha512-wGyTIvtxh2S2NAHxTJj0YymxWOIcEDotu17yHoQUd2Bz2C07LrS28L1nvXDMxrCHvHmV6KTlaIQy5PzRm7Y8rg==} engines: {node: '>=18'} hasBin: true @@ -8421,8 +8546,8 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} engines: {node: '>= 0.4'} hasBin: true @@ -8454,8 +8579,13 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.59.0: - resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} + rolldown@1.0.0-rc.16: + resolution: {integrity: sha512-rzi5WqKzEZw3SooTt7cgm4eqIoujPIyGcJNGFL7iPEuajQw7vxMHUkXylu4/vhCkJGXsgRmxqMKXUpT6FEgl0g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rollup@4.60.2: + resolution: {integrity: sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -8485,8 +8615,8 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} safe-buffer@5.1.2: @@ -8506,8 +8636,8 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} - safe-regex2@5.1.0: - resolution: {integrity: sha512-pNHAuBW7TrcleFHsxBr5QMi/Iyp0ENjUKz7GCcX1UO7cMh+NmVK6HxQckNL1tJp1XAJVjG6B8OKIPqodqj9rtw==} + safe-regex2@5.1.1: + resolution: {integrity: sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA==} hasBin: true safe-stable-stringify@2.5.0: @@ -8748,8 +8878,8 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - std-env@4.0.0: - resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} stdin-discarder@0.2.2: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} @@ -8778,8 +8908,8 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string-width@8.2.0: - resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} + string-width@8.2.1: + resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==} engines: {node: '>=20'} string.prototype.trim@1.2.10: @@ -8909,11 +9039,14 @@ packages: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} - tailwindcss@4.1.18: - resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} + tailwindcss@4.2.1: + resolution: {integrity: sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==} + + tailwindcss@4.2.2: + resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} - tapable@2.3.2: - resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} tar-stream@3.1.8: @@ -9127,8 +9260,8 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - type-fest@5.5.0: - resolution: {integrity: sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==} + type-fest@5.6.0: + resolution: {integrity: sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==} engines: {node: '>=20'} type-is@1.6.18: @@ -9191,8 +9324,8 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - undici@6.24.1: - resolution: {integrity: sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==} + undici@6.25.0: + resolution: {integrity: sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==} engines: {node: '>=18.17'} undici@7.24.4: @@ -9473,8 +9606,8 @@ packages: vite: optional: true - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + vite@7.3.2: + resolution: {integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -9513,6 +9646,49 @@ packages: yaml: optional: true + vite@8.0.9: + resolution: {integrity: sha512-t7g7GVRpMXjNpa67HaVWI/8BWtdVIQPCL2WoozXXA7LBGEFK4AkkKkHx2hAQf5x1GZSlcmEDPkVLSGahxnEEZw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vitest@4.0.18: resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -9878,6 +10054,8 @@ snapshots: '@algolia/logger-common': 4.16.0 '@algolia/requester-common': 4.16.0 + '@alloc/quick-lru@5.2.0': {} + '@antfu/install-pkg@1.1.0': dependencies: package-manager-detector: 1.6.0 @@ -9886,8 +10064,8 @@ snapshots: '@auth/core@0.41.1': dependencies: '@panva/hkdf': 1.2.1 - jose: 6.2.2 - oauth4webapi: 3.8.5 + jose: 6.2.3 + oauth4webapi: 3.8.6 preact: 10.24.3 preact-render-to-string: 6.5.11(preact@10.24.3) @@ -9970,13 +10148,13 @@ snapshots: '@bugsnag/core@8.9.0': dependencies: - '@bugsnag/cuid': 3.2.1 + '@bugsnag/cuid': 3.2.2 '@bugsnag/safe-json-stringify': 6.1.0 error-stack-parser: 2.1.4 iserror: 0.0.2 stack-generator: 2.0.10 - '@bugsnag/cuid@3.2.1': {} + '@bugsnag/cuid@3.2.2': {} '@bugsnag/js@8.9.0': dependencies: @@ -9994,9 +10172,9 @@ snapshots: '@bugsnag/safe-json-stringify@6.1.0': {} - '@changesets/apply-release-plan@7.1.0': + '@changesets/apply-release-plan@7.1.1': dependencies: - '@changesets/config': 3.1.3 + '@changesets/config': 3.1.4 '@changesets/get-version-range-type': 0.4.0 '@changesets/git': 3.0.4 '@changesets/should-skip-package': 0.1.2 @@ -10010,10 +10188,10 @@ snapshots: resolve-from: 5.0.0 semver: 7.7.3 - '@changesets/assemble-release-plan@6.0.9': + '@changesets/assemble-release-plan@6.0.10': dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-dependents-graph': 2.1.4 '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 @@ -10025,13 +10203,13 @@ snapshots: '@changesets/cli@2.29.5': dependencies: - '@changesets/apply-release-plan': 7.1.0 - '@changesets/assemble-release-plan': 6.0.9 + '@changesets/apply-release-plan': 7.1.1 + '@changesets/assemble-release-plan': 6.0.10 '@changesets/changelog-git': 0.2.1 - '@changesets/config': 3.1.3 + '@changesets/config': 3.1.4 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.15 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/get-release-plan': 4.0.16 '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 '@changesets/pre': 2.0.2 @@ -10054,10 +10232,10 @@ snapshots: spawndamnit: 3.0.1 term-size: 2.2.1 - '@changesets/config@3.1.3': + '@changesets/config@3.1.4': dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-dependents-graph': 2.1.4 '@changesets/logger': 0.1.1 '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 @@ -10069,7 +10247,7 @@ snapshots: dependencies: extendable-error: 0.1.7 - '@changesets/get-dependents-graph@2.1.3': + '@changesets/get-dependents-graph@2.1.4': dependencies: '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 @@ -10083,10 +10261,10 @@ snapshots: transitivePeerDependencies: - encoding - '@changesets/get-release-plan@4.0.15': + '@changesets/get-release-plan@4.0.16': dependencies: - '@changesets/assemble-release-plan': 6.0.9 - '@changesets/config': 3.1.3 + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/config': 3.1.4 '@changesets/pre': 2.0.2 '@changesets/read': 0.6.7 '@changesets/types': 6.1.0 @@ -10196,10 +10374,10 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 - '@dependents/detective-less@5.0.1': + '@dependents/detective-less@5.0.3': dependencies: gonzales-pe: 4.3.0 - node-source-walk: 7.0.1 + node-source-walk: 7.0.2 '@drizzle-team/brocli@0.10.2': {} @@ -10210,9 +10388,14 @@ snapshots: '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + '@emnapi/runtime@1.9.2': dependencies: tslib: 2.8.1 + optional: true '@emnapi/wasi-threads@1.2.1': dependencies: @@ -10314,7 +10497,7 @@ snapshots: '@esbuild-kit/esm-loader@2.6.5': dependencies: '@esbuild-kit/core-utils': 3.3.2 - get-tsconfig: 4.13.7 + get-tsconfig: 4.14.0 '@esbuild/aix-ppc64@0.25.12': optional: true @@ -10658,7 +10841,7 @@ snapshots: '@fastify/ajv-compiler@4.0.5': dependencies: - ajv: 8.18.0 + ajv: 8.20.0 ajv-formats: 3.0.1 fast-uri: 3.1.0 @@ -10709,13 +10892,18 @@ snapshots: '@floating-ui/utils@0.2.11': {} - '@humanfs/core@0.19.1': {} + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 - '@humanfs/node@0.16.7': + '@humanfs/node@0.16.8': dependencies: - '@humanfs/core': 0.19.1 + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 '@humanwhocodes/retry': 0.4.3 + '@humanfs/types@0.15.0': {} + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/momoa@2.0.4': {} @@ -10724,14 +10912,14 @@ snapshots: '@iarna/toml@2.2.5': {} - '@iconify/json@2.2.461': + '@iconify/json@2.2.467': dependencies: '@iconify/types': 2.0.0 pathe: 2.0.3 '@iconify/types@2.0.0': {} - '@iconify/utils@3.1.0': + '@iconify/utils@3.1.1': dependencies: '@antfu/install-pkg': 1.1.0 '@iconify/types': 2.0.0 @@ -10821,7 +11009,7 @@ snapshots: '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.9.2 + '@emnapi/runtime': 1.10.0 optional: true '@img/sharp-win32-arm64@0.34.5': @@ -11051,7 +11239,7 @@ snapshots: '@rushstack/terminal': 0.22.3(@types/node@24.10.0) '@rushstack/ts-command-line': 5.3.3(@types/node@24.10.0) js-yaml: 4.1.1 - resolve: 1.22.11 + resolve: 1.22.12 transitivePeerDependencies: - '@types/node' @@ -11075,7 +11263,7 @@ snapshots: diff: 8.0.4 lodash: 4.17.23 minimatch: 10.2.1 - resolve: 1.22.11 + resolve: 1.22.12 semver: 7.5.4 source-map: 0.6.1 typescript: 5.9.3 @@ -11087,7 +11275,7 @@ snapshots: '@microsoft/tsdoc': 0.16.0 ajv: 8.18.0 jju: 1.4.0 - resolve: 1.22.11 + resolve: 1.22.12 '@microsoft/tsdoc@0.16.0': {} @@ -11222,11 +11410,18 @@ snapshots: '@napi-rs/triples@1.2.0': {} - '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.1 + + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: '@emnapi/core': 1.9.2 '@emnapi/runtime': 1.9.2 '@tybys/wasm-util': 0.10.1 + optional: true '@neon-rs/load@0.0.4': {} @@ -11236,7 +11431,7 @@ snapshots: '@netlify/api@14.0.18': dependencies: - '@netlify/open-api': 2.52.0 + '@netlify/open-api': 2.53.0 node-fetch: 3.3.2 p-wait-for: 5.0.2 picoquery: 2.5.0 @@ -11271,19 +11466,19 @@ snapshots: yaml: 2.8.3 yargs: 17.7.2 - '@netlify/build@35.11.1(@opentelemetry/api@1.8.0)(@types/node@24.10.0)(picomatch@4.0.4)(rollup@4.59.0)': + '@netlify/build@35.11.1(@opentelemetry/api@1.8.0)(@types/node@24.10.0)(picomatch@4.0.4)(rollup@4.60.2)': dependencies: '@bugsnag/js': 8.9.0 '@netlify/blobs': 10.7.4(supports-color@10.2.2) '@netlify/cache-utils': 6.0.5 '@netlify/config': 24.4.4 '@netlify/edge-bundler': 14.9.19 - '@netlify/functions-utils': 6.2.29(rollup@4.59.0)(supports-color@10.2.2) + '@netlify/functions-utils': 6.2.30(rollup@4.60.2)(supports-color@10.2.2) '@netlify/git-utils': 6.0.4 '@netlify/opentelemetry-utils': 2.0.2(@opentelemetry/api@1.8.0) '@netlify/plugins-list': 6.81.3 '@netlify/run-utils': 6.0.3 - '@netlify/zip-it-and-ship-it': 14.5.2(rollup@4.59.0)(supports-color@10.2.2) + '@netlify/zip-it-and-ship-it': 14.5.2(rollup@4.60.2)(supports-color@10.2.2) '@opentelemetry/api': 1.8.0 '@sindresorhus/slugify': 2.2.1 ansi-escapes: 7.3.0 @@ -11419,7 +11614,7 @@ snapshots: uuid: 13.0.0 write-file-atomic: 5.0.1 - '@netlify/dev@4.16.4(rollup@4.59.0)': + '@netlify/dev@4.16.4(rollup@4.60.2)': dependencies: '@netlify/ai': 0.4.1 '@netlify/blobs': 10.7.4(supports-color@10.2.2) @@ -11427,7 +11622,7 @@ snapshots: '@netlify/db-dev': 0.7.0 '@netlify/dev-utils': 4.4.3 '@netlify/edge-functions-dev': 1.0.16 - '@netlify/functions-dev': 1.2.4(rollup@4.59.0) + '@netlify/functions-dev': 1.2.4(rollup@4.60.2) '@netlify/headers': 2.1.8 '@netlify/images': 1.3.7(@netlify/blobs@10.7.4) '@netlify/redirects': 3.1.10 @@ -11466,9 +11661,9 @@ snapshots: '@import-maps/resolve': 2.0.0 '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) acorn: 8.16.0 - ajv: 8.18.0 - ajv-errors: 3.0.0(ajv@8.18.0) - better-ajv-errors: 1.2.0(ajv@8.18.0) + ajv: 8.20.0 + ajv-errors: 3.0.0(ajv@8.20.0) + better-ajv-errors: 1.2.0(ajv@8.20.0) common-path-prefix: 3.0.0 env-paths: 3.0.0 esbuild: 0.27.3 @@ -11503,12 +11698,12 @@ snapshots: dependencies: '@netlify/types': 2.6.0 - '@netlify/functions-dev@1.2.4(rollup@4.59.0)': + '@netlify/functions-dev@1.2.4(rollup@4.60.2)': dependencies: '@netlify/blobs': 10.7.4(supports-color@10.2.2) '@netlify/dev-utils': 4.4.3 '@netlify/functions': 5.1.5 - '@netlify/zip-it-and-ship-it': 14.5.3(rollup@4.59.0)(supports-color@10.2.2) + '@netlify/zip-it-and-ship-it': 14.5.4(rollup@4.60.2)(supports-color@10.2.2) cron-parser: 4.9.0 decache: 4.6.2 extract-zip: 2.0.1 @@ -11526,9 +11721,9 @@ snapshots: - rollup - supports-color - '@netlify/functions-utils@6.2.29(rollup@4.59.0)(supports-color@10.2.2)': + '@netlify/functions-utils@6.2.30(rollup@4.60.2)(supports-color@10.2.2)': dependencies: - '@netlify/zip-it-and-ship-it': 14.5.3(rollup@4.59.0)(supports-color@10.2.2) + '@netlify/zip-it-and-ship-it': 14.5.4(rollup@4.60.2)(supports-color@10.2.2) cpy: 11.1.0 path-exists: 5.0.0 transitivePeerDependencies: @@ -11664,7 +11859,7 @@ snapshots: '@netlify/local-functions-proxy-win32-ia32': 1.1.1 '@netlify/local-functions-proxy-win32-x64': 1.1.1 - '@netlify/open-api@2.52.0': {} + '@netlify/open-api@2.53.0': {} '@netlify/opentelemetry-utils@2.0.2(@opentelemetry/api@1.8.0)': dependencies: @@ -11716,7 +11911,7 @@ snapshots: dependencies: '@netlify/types': 2.6.0 - '@netlify/serverless-functions-api@2.14.0': + '@netlify/serverless-functions-api@2.15.0': dependencies: '@netlify/types': 2.6.0 @@ -11726,13 +11921,13 @@ snapshots: '@netlify/types@2.6.0': {} - '@netlify/zip-it-and-ship-it@14.5.2(rollup@4.59.0)(supports-color@10.2.2)': + '@netlify/zip-it-and-ship-it@14.5.2(rollup@4.60.2)(supports-color@10.2.2)': dependencies: '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@netlify/binary-info': 1.0.0 '@netlify/serverless-functions-api': 2.13.0 - '@vercel/nft': 0.29.4(rollup@4.59.0)(supports-color@10.2.2) + '@vercel/nft': 0.29.4(rollup@4.60.2)(supports-color@10.2.2) archiver: 7.0.1 common-path-prefix: 3.0.0 copy-file: 11.1.0 @@ -11750,7 +11945,7 @@ snapshots: normalize-path: 3.0.0 p-map: 7.0.3 path-exists: 5.0.0 - precinct: 12.2.0(supports-color@10.2.2) + precinct: 12.3.1(supports-color@10.2.2) require-package-name: 2.0.1 resolve: 2.0.0-next.6 semver: 7.7.3 @@ -11768,13 +11963,13 @@ snapshots: - rollup - supports-color - '@netlify/zip-it-and-ship-it@14.5.3(rollup@4.59.0)(supports-color@10.2.2)': + '@netlify/zip-it-and-ship-it@14.5.4(rollup@4.60.2)(supports-color@10.2.2)': dependencies: '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@netlify/binary-info': 1.0.0 - '@netlify/serverless-functions-api': 2.14.0 - '@vercel/nft': 0.29.4(rollup@4.59.0)(supports-color@10.2.2) + '@netlify/serverless-functions-api': 2.15.0 + '@vercel/nft': 0.29.4(rollup@4.60.2)(supports-color@10.2.2) archiver: 7.0.1 common-path-prefix: 3.0.0 copy-file: 11.1.0 @@ -11792,7 +11987,7 @@ snapshots: normalize-path: 3.0.0 p-map: 7.0.3 path-exists: 5.0.0 - precinct: 12.2.0(supports-color@10.2.2) + precinct: 12.3.1(supports-color@10.2.2) require-package-name: 2.0.1 resolve: 2.0.0-next.6 semver: 7.7.3 @@ -11833,7 +12028,7 @@ snapshots: '@octokit/plugin-paginate-rest': 9.2.2(@octokit/core@5.2.2) '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.2.2) '@octokit/types': 12.6.0 - undici: 6.24.1 + undici: 6.25.0 '@octokit/auth-action@4.1.0': dependencies: @@ -11972,7 +12167,7 @@ snapshots: '@floating-ui/dom': 1.7.6 '@types/css-tree': 2.3.11 css-tree: 3.2.1 - nanoid: 5.1.7 + nanoid: 5.1.9 '@opentelemetry/api-logs@0.203.0': dependencies: @@ -12083,9 +12278,9 @@ snapshots: '@oxc-minify/binding-openharmony-arm64@0.115.0': optional: true - '@oxc-minify/binding-wasm32-wasi@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@oxc-minify/binding-wasm32-wasi@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -12184,17 +12379,17 @@ snapshots: '@oxc-parser/binding-openharmony-arm64@0.115.0': optional: true - '@oxc-parser/binding-wasm32-wasi@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@oxc-parser/binding-wasm32-wasi@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' optional: true - '@oxc-parser/binding-wasm32-wasi@0.82.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@oxc-parser/binding-wasm32-wasi@0.82.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -12217,6 +12412,8 @@ snapshots: '@oxc-project/types@0.115.0': {} + '@oxc-project/types@0.126.0': {} + '@oxc-project/types@0.82.3': {} '@oxc-transform/binding-android-arm-eabi@0.115.0': @@ -12267,9 +12464,9 @@ snapshots: '@oxc-transform/binding-openharmony-arm64@0.115.0': optional: true - '@oxc-transform/binding-wasm32-wasi@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@oxc-transform/binding-wasm32-wasi@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -12417,16 +12614,16 @@ snapshots: '@poppinss/exception@1.2.3': {} - '@qds.dev/tools@0.14.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@qds.dev/tools@0.14.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)': dependencies: - '@iconify/json': 2.2.461 - '@iconify/utils': 3.1.0 + '@iconify/json': 2.2.467 + '@iconify/utils': 3.1.1 '@oxc-project/types': 0.115.0 magic-regexp: 0.10.0 - oxc-minify: 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - oxc-parser: 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - oxc-transform: 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - oxc-walker: 0.7.0(oxc-parser@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)) + oxc-minify: 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) + oxc-parser: 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) + oxc-transform: 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) + oxc-walker: 0.7.0(oxc-parser@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)) remark: 15.0.1 remark-mdx: 3.1.1 transitivePeerDependencies: @@ -12440,20 +12637,21 @@ snapshots: '@qwik.dev/core': link:packages/qwik temporal-polyfill: 0.3.2 - '@qwik.dev/devtools@0.2.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@qwik.dev/core@packages+qwik)(@qwik.dev/router@packages+qwik-router)(@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)))(tailwindcss@4.1.18)(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3))': + '@qwik.dev/devtools@0.2.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@qwik.dev/core@packages+qwik)(@qwik.dev/router@packages+qwik-router)(@tailwindcss/postcss@4.2.2)(@tailwindcss/vite@4.2.2(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)))(tailwindcss@4.2.1)(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@qwik.dev/core': link:packages/qwik '@qwik.dev/router': link:packages/qwik-router '@qwikest/icons': 0.0.13 - '@tailwindcss/vite': 4.1.18(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + '@tailwindcss/postcss': 4.2.2 + '@tailwindcss/vite': 4.2.2(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) birpc: 0.2.19 dree: 5.1.5 - oxc-parser: 0.82.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + oxc-parser: 0.82.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) superjson: 2.2.6 - tailwindcss: 4.1.18 - vite: 7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) - vite-hot-client: 0.2.4(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) - vite-plugin-inspect: 11.3.3(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + tailwindcss: 4.2.1 + vite: 8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + vite-hot-client: 0.2.4(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + vite-plugin-inspect: 11.3.3(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -12468,94 +12666,145 @@ snapshots: dependencies: '@builder.io/qwik': link:packages/qwik - '@rolldown/browser@1.0.0-beta.59(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@rolldown/binding-android-arm64@1.0.0-rc.16': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.16': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.16': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-rc.16': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.16': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.16': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.16': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.16': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.16': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.16': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.16': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.16': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.16': dependencies: - '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.16': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.16': + optional: true + + '@rolldown/browser@1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)': + dependencies: + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' - '@rollup/pluginutils@5.3.0(rollup@4.59.0)': + '@rolldown/pluginutils@1.0.0-rc.16': {} + + '@rollup/pluginutils@5.3.0(rollup@4.60.2)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.4 optionalDependencies: - rollup: 4.59.0 + rollup: 4.60.2 - '@rollup/rollup-android-arm-eabi@4.59.0': + '@rollup/rollup-android-arm-eabi@4.60.2': optional: true - '@rollup/rollup-android-arm64@4.59.0': + '@rollup/rollup-android-arm64@4.60.2': optional: true - '@rollup/rollup-darwin-arm64@4.59.0': + '@rollup/rollup-darwin-arm64@4.60.2': optional: true - '@rollup/rollup-darwin-x64@4.59.0': + '@rollup/rollup-darwin-x64@4.60.2': optional: true - '@rollup/rollup-freebsd-arm64@4.59.0': + '@rollup/rollup-freebsd-arm64@4.60.2': optional: true - '@rollup/rollup-freebsd-x64@4.59.0': + '@rollup/rollup-freebsd-x64@4.60.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + '@rollup/rollup-linux-arm-gnueabihf@4.60.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.59.0': + '@rollup/rollup-linux-arm-musleabihf@4.60.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.59.0': + '@rollup/rollup-linux-arm64-gnu@4.60.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.59.0': + '@rollup/rollup-linux-arm64-musl@4.60.2': optional: true - '@rollup/rollup-linux-loong64-gnu@4.59.0': + '@rollup/rollup-linux-loong64-gnu@4.60.2': optional: true - '@rollup/rollup-linux-loong64-musl@4.59.0': + '@rollup/rollup-linux-loong64-musl@4.60.2': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.59.0': + '@rollup/rollup-linux-ppc64-gnu@4.60.2': optional: true - '@rollup/rollup-linux-ppc64-musl@4.59.0': + '@rollup/rollup-linux-ppc64-musl@4.60.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.59.0': + '@rollup/rollup-linux-riscv64-gnu@4.60.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.59.0': + '@rollup/rollup-linux-riscv64-musl@4.60.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.59.0': + '@rollup/rollup-linux-s390x-gnu@4.60.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.59.0': + '@rollup/rollup-linux-x64-gnu@4.60.2': optional: true - '@rollup/rollup-linux-x64-musl@4.59.0': + '@rollup/rollup-linux-x64-musl@4.60.2': optional: true - '@rollup/rollup-openbsd-x64@4.59.0': + '@rollup/rollup-openbsd-x64@4.60.2': optional: true - '@rollup/rollup-openharmony-arm64@4.59.0': + '@rollup/rollup-openharmony-arm64@4.60.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.59.0': + '@rollup/rollup-win32-arm64-msvc@4.60.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.59.0': + '@rollup/rollup-win32-ia32-msvc@4.60.2': optional: true - '@rollup/rollup-win32-x64-gnu@4.59.0': + '@rollup/rollup-win32-x64-gnu@4.60.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.59.0': + '@rollup/rollup-win32-x64-msvc@4.60.2': optional: true '@rtsao/scc@1.1.0': {} @@ -12568,7 +12817,7 @@ snapshots: fs-extra: 11.3.4 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.11 + resolve: 1.22.12 semver: 7.5.4 optionalDependencies: '@types/node': 24.10.0 @@ -12579,7 +12828,7 @@ snapshots: '@rushstack/rig-package@0.7.2': dependencies: - resolve: 1.22.11 + resolve: 1.22.12 strip-json-comments: 3.1.1 '@rushstack/terminal@0.22.3(@types/node@24.10.0)': @@ -12616,7 +12865,7 @@ snapshots: dependencies: '@shikijs/types': 3.21.0 '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 4.3.5 + oniguruma-to-es: 4.3.6 '@shikijs/engine-oniguruma@3.21.0': dependencies: @@ -12708,7 +12957,7 @@ snapshots: '@supabase/supabase-js': 2.53.0 cookie: 1.1.1 - '@supabase/storage-js@2.103.0': + '@supabase/storage-js@2.105.1': dependencies: iceberg-js: 0.8.1 tslib: 2.8.1 @@ -12720,7 +12969,7 @@ snapshots: '@supabase/node-fetch': 2.6.15 '@supabase/postgrest-js': 1.19.4 '@supabase/realtime-js': 2.11.15 - '@supabase/storage-js': 2.103.0 + '@supabase/storage-js': 2.105.1 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -12729,73 +12978,81 @@ snapshots: dependencies: acorn: 8.16.0 - '@tailwindcss/node@4.1.18': + '@tailwindcss/node@4.2.2': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.20.1 + enhanced-resolve: 5.21.0 jiti: 2.6.1 - lightningcss: 1.30.2 + lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.1.18 + tailwindcss: 4.2.2 - '@tailwindcss/oxide-android-arm64@4.1.18': + '@tailwindcss/oxide-android-arm64@4.2.2': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.18': + '@tailwindcss/oxide-darwin-arm64@4.2.2': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.18': + '@tailwindcss/oxide-darwin-x64@4.2.2': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.18': + '@tailwindcss/oxide-freebsd-x64@4.2.2': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.18': + '@tailwindcss/oxide-linux-x64-musl@4.2.2': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.18': + '@tailwindcss/oxide-wasm32-wasi@4.2.2': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': optional: true - '@tailwindcss/oxide@4.1.18': + '@tailwindcss/oxide@4.2.2': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.18 - '@tailwindcss/oxide-darwin-arm64': 4.1.18 - '@tailwindcss/oxide-darwin-x64': 4.1.18 - '@tailwindcss/oxide-freebsd-x64': 4.1.18 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 - '@tailwindcss/oxide-linux-x64-musl': 4.1.18 - '@tailwindcss/oxide-wasm32-wasi': 4.1.18 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - - '@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3))': - dependencies: - '@tailwindcss/node': 4.1.18 - '@tailwindcss/oxide': 4.1.18 - tailwindcss: 4.1.18 - vite: 7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + '@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.2.2': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.2.2 + '@tailwindcss/oxide': 4.2.2 + postcss: 8.5.6 + tailwindcss: 4.2.2 + + '@tailwindcss/vite@4.2.2(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3))': + dependencies: + '@tailwindcss/node': 4.2.2 + '@tailwindcss/oxide': 4.2.2 + tailwindcss: 4.2.2 + vite: 8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) '@ts-morph/common@0.28.1': dependencies: @@ -13017,17 +13274,17 @@ snapshots: '@typescript-eslint/project-service@8.56.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@5.9.3) - '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@5.9.3) + '@typescript-eslint/types': 8.59.1 debug: 4.4.3(supports-color@10.2.2) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.1(supports-color@10.2.2)(typescript@5.9.3)': + '@typescript-eslint/project-service@8.59.1(supports-color@10.2.2)(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@5.9.3) - '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@5.9.3) + '@typescript-eslint/types': 8.59.1 debug: 4.4.3(supports-color@10.2.2) typescript: 5.9.3 transitivePeerDependencies: @@ -13038,7 +13295,7 @@ snapshots: '@typescript-eslint/parser': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) '@typescript-eslint/utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - ajv: 6.14.0 + ajv: 6.15.0 eslint: 10.0.2(jiti@2.6.1) json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 @@ -13052,16 +13309,16 @@ snapshots: '@typescript-eslint/types': 8.56.1 '@typescript-eslint/visitor-keys': 8.56.1 - '@typescript-eslint/scope-manager@8.58.1': + '@typescript-eslint/scope-manager@8.59.1': dependencies: - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/visitor-keys': 8.58.1 + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/visitor-keys': 8.59.1 '@typescript-eslint/tsconfig-utils@8.56.1(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.58.1(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.59.1(typescript@5.9.3)': dependencies: typescript: 5.9.3 @@ -13079,7 +13336,7 @@ snapshots: '@typescript-eslint/types@8.56.1': {} - '@typescript-eslint/types@8.58.1': {} + '@typescript-eslint/types@8.59.1': {} '@typescript-eslint/typescript-estree@8.56.1(typescript@5.9.3)': dependencies: @@ -13096,12 +13353,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.58.1(supports-color@10.2.2)(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.59.1(supports-color@10.2.2)(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.58.1(supports-color@10.2.2)(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@5.9.3) - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/visitor-keys': 8.58.1 + '@typescript-eslint/project-service': 8.59.1(supports-color@10.2.2)(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@5.9.3) + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/visitor-keys': 8.59.1 debug: 4.4.3(supports-color@10.2.2) minimatch: 10.2.5 semver: 7.7.3 @@ -13122,12 +13379,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.59.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.2(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.58.1 - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/typescript-estree': 8.58.1(supports-color@10.2.2)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.59.1 + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/typescript-estree': 8.59.1(supports-color@10.2.2)(typescript@5.9.3) eslint: 10.0.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: @@ -13138,9 +13395,9 @@ snapshots: '@typescript-eslint/types': 8.56.1 eslint-visitor-keys: 5.0.1 - '@typescript-eslint/visitor-keys@8.58.1': + '@typescript-eslint/visitor-keys@8.59.1': dependencies: - '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/types': 8.59.1 eslint-visitor-keys: 5.0.1 '@typescript/analyze-trace@0.10.1': @@ -13164,10 +13421,10 @@ snapshots: dependencies: '@builder.io/qwik': link:packages/qwik - '@vercel/nft@0.29.4(rollup@4.59.0)(supports-color@10.2.2)': + '@vercel/nft@0.29.4(rollup@4.60.2)(supports-color@10.2.2)': dependencies: '@mapbox/node-pre-gyp': 2.0.3(supports-color@10.2.2) - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@rollup/pluginutils': 5.3.0(rollup@4.60.2) acorn: 8.16.0 acorn-import-attributes: 1.9.5(acorn@8.16.0) async-sema: 3.1.1 @@ -13183,11 +13440,11 @@ snapshots: - rollup - supports-color - '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3))': + '@vitejs/plugin-basic-ssl@2.2.0(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: - vite: 7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.9(@types/node@24.10.0)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3))': + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.18 @@ -13199,7 +13456,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.1.0 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) '@vitest/expect@4.0.18': dependencies: @@ -13210,13 +13467,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3))': + '@vitest/mocker@4.0.18(vite@7.3.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) '@vitest/pretty-format@4.0.18': dependencies: @@ -13252,35 +13509,35 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.1.0 - '@vue/compiler-core@3.5.32': + '@vue/compiler-core@3.5.33': dependencies: '@babel/parser': 7.29.2 - '@vue/shared': 3.5.32 + '@vue/shared': 3.5.33 entities: 7.0.1 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.32': + '@vue/compiler-dom@3.5.33': dependencies: - '@vue/compiler-core': 3.5.32 - '@vue/shared': 3.5.32 + '@vue/compiler-core': 3.5.33 + '@vue/shared': 3.5.33 - '@vue/compiler-sfc@3.5.32': + '@vue/compiler-sfc@3.5.33': dependencies: '@babel/parser': 7.29.2 - '@vue/compiler-core': 3.5.32 - '@vue/compiler-dom': 3.5.32 - '@vue/compiler-ssr': 3.5.32 - '@vue/shared': 3.5.32 + '@vue/compiler-core': 3.5.33 + '@vue/compiler-dom': 3.5.33 + '@vue/compiler-ssr': 3.5.33 + '@vue/shared': 3.5.33 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.9 + postcss: 8.5.12 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.32': + '@vue/compiler-ssr@3.5.33': dependencies: - '@vue/compiler-dom': 3.5.32 - '@vue/shared': 3.5.32 + '@vue/compiler-dom': 3.5.33 + '@vue/shared': 3.5.33 '@vue/compiler-vue2@2.7.16': dependencies: @@ -13290,9 +13547,9 @@ snapshots: '@vue/language-core@2.2.0(typescript@5.9.3)': dependencies: '@volar/language-core': 2.4.28 - '@vue/compiler-dom': 3.5.32 + '@vue/compiler-dom': 3.5.33 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.32 + '@vue/shared': 3.5.33 alien-signals: 0.4.14 minimatch: 9.0.9 muggle-string: 0.4.1 @@ -13300,7 +13557,7 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@vue/shared@3.5.32': {} + '@vue/shared@3.5.33': {} '@whatwg-node/disposablestack@0.0.6': dependencies: @@ -13371,15 +13628,15 @@ snapshots: optionalDependencies: ajv: 8.18.0 - ajv-errors@3.0.0(ajv@8.18.0): + ajv-errors@3.0.0(ajv@8.20.0): dependencies: - ajv: 8.18.0 + ajv: 8.20.0 ajv-formats@3.0.1: dependencies: - ajv: 8.18.0 + ajv: 8.20.0 - ajv@6.14.0: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -13393,6 +13650,13 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + algoliasearch@4.16.0: dependencies: '@algolia/cache-browser-local-storage': 4.16.0 @@ -13582,7 +13846,7 @@ snapshots: autoprefixer@10.4.23(postcss@8.5.6): dependencies: browserslist: 4.28.2 - caniuse-lite: 1.0.30001787 + caniuse-lite: 1.0.30001791 fraction.js: 5.3.4 picocolors: 1.1.1 postcss: 8.5.6 @@ -13603,7 +13867,7 @@ snapshots: dependencies: '@babel/runtime': 7.29.2 cosmiconfig: 7.1.0 - resolve: 1.22.11 + resolve: 1.22.12 backoff@2.5.0: dependencies: @@ -13617,24 +13881,24 @@ snapshots: bare-events@2.8.2: {} - bare-fs@4.7.0: + bare-fs@4.7.1: dependencies: bare-events: 2.8.2 bare-path: 3.0.0 - bare-stream: 2.12.0(bare-events@2.8.2) - bare-url: 2.4.0 + bare-stream: 2.13.1(bare-events@2.8.2) + bare-url: 2.4.2 fast-fifo: 1.3.2 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - bare-os@3.8.7: {} + bare-os@3.9.0: {} bare-path@3.0.0: dependencies: - bare-os: 3.8.7 + bare-os: 3.9.0 - bare-stream@2.12.0(bare-events@2.8.2): + bare-stream@2.13.1(bare-events@2.8.2): dependencies: streamx: 2.25.0 teex: 1.0.1 @@ -13643,23 +13907,23 @@ snapshots: transitivePeerDependencies: - react-native-b4a - bare-url@2.4.0: + bare-url@2.4.2: dependencies: bare-path: 3.0.0 base64-js@1.5.1: {} - baseline-browser-mapping@2.10.17: {} + baseline-browser-mapping@2.10.24: {} before-after-hook@2.2.3: {} before-after-hook@4.0.0: {} - better-ajv-errors@1.2.0(ajv@8.18.0): + better-ajv-errors@1.2.0(ajv@8.20.0): dependencies: '@babel/code-frame': 7.29.0 '@humanwhocodes/momoa': 2.0.4 - ajv: 8.18.0 + ajv: 8.20.0 chalk: 4.1.2 jsonpointer: 5.0.1 leven: 3.1.0 @@ -13686,7 +13950,7 @@ snapshots: blake3-wasm@2.1.5: {} - body-parser@1.20.4: + body-parser@1.20.5: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -13696,7 +13960,7 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.14.2 + qs: 6.15.1 raw-body: 2.5.3 type-is: 1.6.18 unpipe: 1.0.0 @@ -13730,12 +13994,12 @@ snapshots: widest-line: 5.0.0 wrap-ansi: 9.0.2 - brace-expansion@1.1.13: + brace-expansion@1.1.14: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.3: + brace-expansion@2.1.0: dependencies: balanced-match: 1.0.2 @@ -13753,10 +14017,10 @@ snapshots: browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.17 - caniuse-lite: 1.0.30001787 - electron-to-chromium: 1.5.334 - node-releases: 2.0.37 + baseline-browser-mapping: 2.10.24 + caniuse-lite: 1.0.30001791 + electron-to-chromium: 1.5.344 + node-releases: 2.0.38 update-browserslist-db: 1.2.3(browserslist@4.28.2) buffer-crc32@0.2.13: {} @@ -13814,7 +14078,7 @@ snapshots: camelcase@8.0.0: {} - caniuse-lite@1.0.30001787: {} + caniuse-lite@1.0.30001791: {} ccount@2.0.1: {} @@ -14071,7 +14335,7 @@ snapshots: dependencies: uncrypto: 0.1.3 - crossws@0.4.4: {} + crossws@0.4.5: {} css-select@5.2.2: dependencies: @@ -14211,58 +14475,58 @@ snapshots: detect-libc@2.1.2: {} - detective-amd@6.0.1: + detective-amd@6.1.0: dependencies: ast-module-types: 6.0.1 escodegen: 2.1.0 - get-amd-module-type: 6.0.1 - node-source-walk: 7.0.1 + get-amd-module-type: 6.0.2 + node-source-walk: 7.0.2 - detective-cjs@6.1.0: + detective-cjs@6.1.1: dependencies: ast-module-types: 6.0.1 - node-source-walk: 7.0.1 + node-source-walk: 7.0.2 - detective-es6@5.0.1: + detective-es6@5.0.2: dependencies: - node-source-walk: 7.0.1 + node-source-walk: 7.0.2 - detective-postcss@7.0.1(postcss@8.5.6): + detective-postcss@7.0.1(postcss@8.5.12): dependencies: is-url: 1.2.4 - postcss: 8.5.6 - postcss-values-parser: 6.0.2(postcss@8.5.6) + postcss: 8.5.12 + postcss-values-parser: 6.0.2(postcss@8.5.12) - detective-sass@6.0.1: + detective-sass@6.0.2: dependencies: gonzales-pe: 4.3.0 - node-source-walk: 7.0.1 + node-source-walk: 7.0.2 - detective-scss@5.0.1: + detective-scss@5.0.2: dependencies: gonzales-pe: 4.3.0 - node-source-walk: 7.0.1 + node-source-walk: 7.0.2 detective-stylus@5.0.1: {} - detective-typescript@14.0.0(supports-color@10.2.2)(typescript@5.9.3): + detective-typescript@14.1.2(supports-color@10.2.2)(typescript@5.9.3): dependencies: - '@typescript-eslint/typescript-estree': 8.58.1(supports-color@10.2.2)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.59.1(supports-color@10.2.2)(typescript@5.9.3) ast-module-types: 6.0.1 - node-source-walk: 7.0.1 + node-source-walk: 7.0.2 typescript: 5.9.3 transitivePeerDependencies: - supports-color - detective-vue2@2.2.0(supports-color@10.2.2)(typescript@5.9.3): + detective-vue2@2.3.0(supports-color@10.2.2)(typescript@5.9.3): dependencies: - '@dependents/detective-less': 5.0.1 - '@vue/compiler-sfc': 3.5.32 - detective-es6: 5.0.1 - detective-sass: 6.0.1 - detective-scss: 5.0.1 + '@dependents/detective-less': 5.0.3 + '@vue/compiler-sfc': 3.5.33 + detective-es6: 5.0.2 + detective-sass: 6.0.2 + detective-scss: 5.0.2 detective-stylus: 5.0.1 - detective-typescript: 14.0.0(supports-color@10.2.2)(typescript@5.9.3) + detective-typescript: 14.1.2(supports-color@10.2.2)(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -14318,7 +14582,7 @@ snapshots: dot-prop@10.1.0: dependencies: - type-fest: 5.5.0 + type-fest: 5.6.0 dot-prop@9.0.0: dependencies: @@ -14364,12 +14628,12 @@ snapshots: ee-first@1.1.1: {} - effect@3.21.0: + effect@3.21.2: dependencies: '@standard-schema/spec': 1.1.0 fast-check: 3.23.2 - electron-to-chromium@1.5.334: {} + electron-to-chromium@1.5.344: {} emoji-regex@10.6.0: {} @@ -14387,10 +14651,10 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.20.1: + enhanced-resolve@5.21.0: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.2 + tapable: 2.3.3 enquirer@2.4.1: dependencies: @@ -14449,7 +14713,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.3 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -14467,7 +14731,7 @@ snapshots: object.assign: 4.1.7 own-keys: 1.0.1 regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 + safe-array-concat: 1.1.4 safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 @@ -14497,11 +14761,11 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 es-to-primitive@1.3.0: dependencies: @@ -14773,7 +15037,7 @@ snapshots: eslint: 10.0.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.10 eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.10)(eslint@10.0.2(jiti@2.6.1)) - hasown: 2.0.2 + hasown: 2.0.3 is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.5 @@ -14809,11 +15073,11 @@ snapshots: '@eslint/config-helpers': 0.5.5 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.6.1 - '@humanfs/node': 0.16.7 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - ajv: 6.14.0 + ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3(supports-color@10.2.2) escape-string-regexp: 4.0.0 @@ -14962,7 +15226,7 @@ snapshots: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.4 + body-parser: 1.20.5 content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.7.2 @@ -15080,7 +15344,7 @@ snapshots: fast-json-stringify@6.3.0: dependencies: '@fastify/merge-json-schemas': 0.2.1 - ajv: 8.18.0 + ajv: 8.20.0 ajv-formats: 3.0.1 fast-uri: 3.1.0 json-schema-ref-resolver: 3.0.0 @@ -15192,7 +15456,7 @@ snapshots: dependencies: fast-deep-equal: 3.1.3 fast-querystring: 1.1.2 - safe-regex2: 5.1.0 + safe-regex2: 5.1.1 find-root@1.1.0: {} @@ -15232,7 +15496,7 @@ snapshots: dependencies: from2: 2.3.0 - follow-redirects@1.15.11(debug@4.4.3): + follow-redirects@1.16.0(debug@4.4.3): optionalDependencies: debug: 4.4.3(supports-color@10.2.2) @@ -15267,7 +15531,7 @@ snapshots: fs-extra@11.3.4: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.2.0 + jsonfile: 6.2.1 universalify: 2.0.1 fs-extra@7.0.1: @@ -15296,7 +15560,7 @@ snapshots: call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 - hasown: 2.0.2 + hasown: 2.0.3 is-callable: 1.2.7 functions-have-names@1.2.3: {} @@ -15305,10 +15569,10 @@ snapshots: generator-function@2.0.1: {} - get-amd-module-type@6.0.1: + get-amd-module-type@6.0.2: dependencies: ast-module-types: 6.0.1 - node-source-walk: 7.0.1 + node-source-walk: 7.0.2 get-caller-file@2.0.5: {} @@ -15324,7 +15588,7 @@ snapshots: get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.3 math-intrinsics: 1.1.0 get-port-please@3.2.0: {} @@ -15357,7 +15621,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.13.7: + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -15476,7 +15740,7 @@ snapshots: dependencies: has-symbols: 1.1.0 - hasown@2.0.2: + hasown@2.0.3: dependencies: function-bind: 1.1.2 @@ -15587,7 +15851,7 @@ snapshots: hosted-git-info@9.0.2: dependencies: - lru-cache: 11.3.3 + lru-cache: 11.3.5 hot-shots@11.4.0: optionalDependencies: @@ -15635,7 +15899,7 @@ snapshots: http-proxy@1.18.1(debug@4.4.3): dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.11(debug@4.4.3) + follow-redirects: 1.16.0(debug@4.4.3) requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -15778,7 +16042,7 @@ snapshots: internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.2 + hasown: 2.0.3 side-channel: 1.1.0 ipaddr.js@1.9.1: {} @@ -15903,7 +16167,7 @@ snapshots: is-core-module@2.16.1: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 is-data-view@1.0.2: dependencies: @@ -15999,7 +16263,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 is-safe-filename@0.1.1: {} @@ -16104,7 +16368,7 @@ snapshots: jju@1.4.0: {} - jose@6.2.2: {} + jose@6.2.3: {} jpeg-js@0.4.4: {} @@ -16161,7 +16425,7 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.2.0: + jsonfile@6.2.1: dependencies: universalify: 2.0.1 optionalDependencies: @@ -16280,54 +16544,54 @@ snapshots: process-warning: 4.0.1 set-cookie-parser: 2.7.2 - lightningcss-android-arm64@1.30.2: + lightningcss-android-arm64@1.32.0: optional: true - lightningcss-darwin-arm64@1.30.2: + lightningcss-darwin-arm64@1.32.0: optional: true - lightningcss-darwin-x64@1.30.2: + lightningcss-darwin-x64@1.32.0: optional: true - lightningcss-freebsd-x64@1.30.2: + lightningcss-freebsd-x64@1.32.0: optional: true - lightningcss-linux-arm-gnueabihf@1.30.2: + lightningcss-linux-arm-gnueabihf@1.32.0: optional: true - lightningcss-linux-arm64-gnu@1.30.2: + lightningcss-linux-arm64-gnu@1.32.0: optional: true - lightningcss-linux-arm64-musl@1.30.2: + lightningcss-linux-arm64-musl@1.32.0: optional: true - lightningcss-linux-x64-gnu@1.30.2: + lightningcss-linux-x64-gnu@1.32.0: optional: true - lightningcss-linux-x64-musl@1.30.2: + lightningcss-linux-x64-musl@1.32.0: optional: true - lightningcss-win32-arm64-msvc@1.30.2: + lightningcss-win32-arm64-msvc@1.32.0: optional: true - lightningcss-win32-x64-msvc@1.30.2: + lightningcss-win32-x64-msvc@1.32.0: optional: true - lightningcss@1.30.2: + lightningcss@1.32.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.30.2 - lightningcss-darwin-arm64: 1.30.2 - lightningcss-darwin-x64: 1.30.2 - lightningcss-freebsd-x64: 1.30.2 - lightningcss-linux-arm-gnueabihf: 1.30.2 - lightningcss-linux-arm64-gnu: 1.30.2 - lightningcss-linux-arm64-musl: 1.30.2 - lightningcss-linux-x64-gnu: 1.30.2 - lightningcss-linux-x64-musl: 1.30.2 - lightningcss-win32-arm64-msvc: 1.30.2 - lightningcss-win32-x64-msvc: 1.30.2 + 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 lines-and-columns@1.2.4: {} @@ -16337,7 +16601,7 @@ snapshots: '@parcel/watcher-wasm': 2.5.6 citty: 0.2.2 consola: 3.4.2 - crossws: 0.4.4 + crossws: 0.4.5 defu: 6.1.7 get-port-please: 3.2.0 h3: 1.15.11 @@ -16346,7 +16610,7 @@ snapshots: mlly: 1.8.2 node-forge: 1.4.0 pathe: 2.0.3 - std-env: 4.0.0 + std-env: 4.1.0 tinyclip: 0.1.12 ufo: 1.6.3 untun: 0.1.3 @@ -16357,7 +16621,7 @@ snapshots: local-pkg@1.1.2: dependencies: mlly: 1.8.2 - pkg-types: 2.3.0 + pkg-types: 2.3.1 quansync: 0.2.11 locate-path@5.0.0: @@ -16446,7 +16710,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.3.3: {} + lru-cache@11.3.5: {} lru-cache@6.0.0: dependencies: @@ -17037,19 +17301,19 @@ snapshots: minimatch@3.1.5: dependencies: - brace-expansion: 1.1.13 + brace-expansion: 1.1.14 minimatch@5.1.9: dependencies: - brace-expansion: 2.0.3 + brace-expansion: 2.1.0 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.3 + brace-expansion: 2.1.0 minimatch@9.0.9: dependencies: - brace-expansion: 2.0.3 + brace-expansion: 2.1.0 minimist@1.2.8: {} @@ -17068,10 +17332,10 @@ snapshots: modern-tar@0.7.5: {} - module-definition@6.0.1: + module-definition@6.0.2: dependencies: ast-module-types: 6.0.1 - node-source-walk: 7.0.1 + node-source-walk: 7.0.2 module-details-from-path@1.0.4: {} @@ -17107,7 +17371,7 @@ snapshots: nanoid@3.3.11: {} - nanoid@5.1.7: {} + nanoid@5.1.9: {} nanospinner@1.2.2: dependencies: @@ -17119,16 +17383,16 @@ snapshots: negotiator@1.0.0: {} - netlify-cli@24.5.1(@types/node@24.10.0)(picomatch@4.0.4)(rollup@4.59.0): + netlify-cli@24.5.1(@types/node@24.10.0)(picomatch@4.0.4)(rollup@4.60.2): dependencies: '@fastify/static': 9.0.0 '@netlify/ai': 0.4.1 '@netlify/api': 14.0.18 '@netlify/blobs': 10.7.0 - '@netlify/build': 35.11.1(@opentelemetry/api@1.8.0)(@types/node@24.10.0)(picomatch@4.0.4)(rollup@4.59.0) + '@netlify/build': 35.11.1(@opentelemetry/api@1.8.0)(@types/node@24.10.0)(picomatch@4.0.4)(rollup@4.60.2) '@netlify/build-info': 10.4.0 '@netlify/config': 24.4.4 - '@netlify/dev': 4.16.4(rollup@4.59.0) + '@netlify/dev': 4.16.4(rollup@4.60.2) '@netlify/dev-utils': 4.4.3 '@netlify/edge-bundler': 14.9.19 '@netlify/edge-functions': 3.0.6 @@ -17137,7 +17401,7 @@ snapshots: '@netlify/images': 1.3.7(@netlify/blobs@10.7.0) '@netlify/local-functions-proxy': 2.0.3 '@netlify/redirect-parser': 15.0.4 - '@netlify/zip-it-and-ship-it': 14.5.2(rollup@4.59.0)(supports-color@10.2.2) + '@netlify/zip-it-and-ship-it': 14.5.2(rollup@4.60.2)(supports-color@10.2.2) '@octokit/rest': 22.0.0 '@opentelemetry/api': 1.8.0 '@pnpm/tabtab': 0.5.4 @@ -17284,9 +17548,9 @@ snapshots: node-mock-http@1.0.4: {} - node-releases@2.0.37: {} + node-releases@2.0.38: {} - node-source-walk@7.0.1: + node-source-walk@7.0.2: dependencies: '@babel/parser': 7.29.2 @@ -17349,7 +17613,7 @@ snapshots: dependencies: boolbase: 1.0.0 - oauth4webapi@3.8.5: {} + oauth4webapi@3.8.6: {} object-assign@4.1.1: {} @@ -17433,11 +17697,11 @@ snapshots: dependencies: mimic-function: 5.0.1 - oniguruma-parser@0.12.1: {} + oniguruma-parser@0.12.2: {} - oniguruma-to-es@4.3.5: + oniguruma-to-es@4.3.6: dependencies: - oniguruma-parser: 0.12.1 + oniguruma-parser: 0.12.2 regex: 6.1.0 regex-recursion: 6.0.2 @@ -17505,7 +17769,7 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - oxc-minify@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + oxc-minify@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0): optionalDependencies: '@oxc-minify/binding-android-arm-eabi': 0.115.0 '@oxc-minify/binding-android-arm64': 0.115.0 @@ -17523,7 +17787,7 @@ snapshots: '@oxc-minify/binding-linux-x64-gnu': 0.115.0 '@oxc-minify/binding-linux-x64-musl': 0.115.0 '@oxc-minify/binding-openharmony-arm64': 0.115.0 - '@oxc-minify/binding-wasm32-wasi': 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@oxc-minify/binding-wasm32-wasi': 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) '@oxc-minify/binding-win32-arm64-msvc': 0.115.0 '@oxc-minify/binding-win32-ia32-msvc': 0.115.0 '@oxc-minify/binding-win32-x64-msvc': 0.115.0 @@ -17531,7 +17795,7 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - oxc-parser@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + oxc-parser@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0): dependencies: '@oxc-project/types': 0.115.0 optionalDependencies: @@ -17551,7 +17815,7 @@ snapshots: '@oxc-parser/binding-linux-x64-gnu': 0.115.0 '@oxc-parser/binding-linux-x64-musl': 0.115.0 '@oxc-parser/binding-openharmony-arm64': 0.115.0 - '@oxc-parser/binding-wasm32-wasi': 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@oxc-parser/binding-wasm32-wasi': 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) '@oxc-parser/binding-win32-arm64-msvc': 0.115.0 '@oxc-parser/binding-win32-ia32-msvc': 0.115.0 '@oxc-parser/binding-win32-x64-msvc': 0.115.0 @@ -17559,7 +17823,7 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - oxc-parser@0.82.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + oxc-parser@0.82.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0): dependencies: '@oxc-project/types': 0.82.3 optionalDependencies: @@ -17575,14 +17839,14 @@ snapshots: '@oxc-parser/binding-linux-s390x-gnu': 0.82.3 '@oxc-parser/binding-linux-x64-gnu': 0.82.3 '@oxc-parser/binding-linux-x64-musl': 0.82.3 - '@oxc-parser/binding-wasm32-wasi': 0.82.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@oxc-parser/binding-wasm32-wasi': 0.82.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) '@oxc-parser/binding-win32-arm64-msvc': 0.82.3 '@oxc-parser/binding-win32-x64-msvc': 0.82.3 transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' - oxc-transform@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + oxc-transform@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0): optionalDependencies: '@oxc-transform/binding-android-arm-eabi': 0.115.0 '@oxc-transform/binding-android-arm64': 0.115.0 @@ -17600,7 +17864,7 @@ snapshots: '@oxc-transform/binding-linux-x64-gnu': 0.115.0 '@oxc-transform/binding-linux-x64-musl': 0.115.0 '@oxc-transform/binding-openharmony-arm64': 0.115.0 - '@oxc-transform/binding-wasm32-wasi': 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@oxc-transform/binding-wasm32-wasi': 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) '@oxc-transform/binding-win32-arm64-msvc': 0.115.0 '@oxc-transform/binding-win32-ia32-msvc': 0.115.0 '@oxc-transform/binding-win32-x64-msvc': 0.115.0 @@ -17608,10 +17872,10 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - oxc-walker@0.7.0(oxc-parser@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)): + oxc-walker@0.7.0(oxc-parser@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)): dependencies: magic-regexp: 0.10.0 - oxc-parser: 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + oxc-parser: 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) p-event@6.0.1: dependencies: @@ -17764,7 +18028,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.3.3 + lru-cache: 11.3.5 minipass: 7.1.3 path-to-regexp@0.1.13: {} @@ -17862,7 +18126,7 @@ snapshots: mlly: 1.8.2 pathe: 2.0.3 - pkg-types@2.3.0: + pkg-types@2.3.1: dependencies: confbox: 0.2.4 exsolve: 1.0.8 @@ -17880,20 +18144,20 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss-values-parser@6.0.2(postcss@8.5.6): + postcss-values-parser@6.0.2(postcss@8.5.12): dependencies: color-name: 1.1.4 is-url-superb: 4.0.0 - postcss: 8.5.6 + postcss: 8.5.12 quote-unquote: 1.0.0 - postcss@8.5.6: + postcss@8.5.12: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.9: + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -17917,22 +18181,22 @@ snapshots: preact@10.24.3: {} - precinct@12.2.0(supports-color@10.2.2): + precinct@12.3.1(supports-color@10.2.2): dependencies: - '@dependents/detective-less': 5.0.1 + '@dependents/detective-less': 5.0.3 commander: 12.1.0 - detective-amd: 6.0.1 - detective-cjs: 6.1.0 - detective-es6: 5.0.1 - detective-postcss: 7.0.1(postcss@8.5.6) - detective-sass: 6.0.1 - detective-scss: 5.0.1 + detective-amd: 6.1.0 + detective-cjs: 6.1.1 + detective-es6: 5.0.2 + detective-postcss: 7.0.1(postcss@8.5.12) + detective-sass: 6.0.2 + detective-scss: 5.0.2 detective-stylus: 5.0.1 - detective-typescript: 14.0.0(supports-color@10.2.2)(typescript@5.9.3) - detective-vue2: 2.2.0(supports-color@10.2.2)(typescript@5.9.3) - module-definition: 6.0.1 - node-source-walk: 7.0.1 - postcss: 8.5.6 + detective-typescript: 14.1.2(supports-color@10.2.2)(typescript@5.9.3) + detective-vue2: 2.3.0(supports-color@10.2.2)(typescript@5.9.3) + module-definition: 6.0.2 + node-source-walk: 7.0.2 + postcss: 8.5.12 typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -18117,14 +18381,14 @@ snapshots: dependencies: find-up-simple: 1.0.1 read-pkg: 10.1.0 - type-fest: 5.5.0 + type-fest: 5.6.0 read-pkg@10.1.0: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 8.0.0 parse-json: 8.3.0 - type-fest: 5.5.0 + type-fest: 5.6.0 unicorn-magic: 0.4.0 read-pkg@9.0.1: @@ -18348,7 +18612,7 @@ snapshots: dependencies: debug: 4.4.3(supports-color@10.2.2) module-details-from-path: 1.0.4 - resolve: 1.22.11 + resolve: 1.22.12 transitivePeerDependencies: - supports-color @@ -18366,8 +18630,9 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.22.11: + resolve@1.22.12: dependencies: + es-errors: 1.3.0 is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -18399,35 +18664,56 @@ snapshots: rfdc@1.4.1: {} - rollup@4.59.0: + rolldown@1.0.0-rc.16: + dependencies: + '@oxc-project/types': 0.126.0 + '@rolldown/pluginutils': 1.0.0-rc.16 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.16 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.16 + '@rolldown/binding-darwin-x64': 1.0.0-rc.16 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.16 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.16 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.16 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.16 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.16 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.16 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.16 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.16 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.16 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.16 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.16 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.16 + + rollup@4.60.2: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.59.0 - '@rollup/rollup-android-arm64': 4.59.0 - '@rollup/rollup-darwin-arm64': 4.59.0 - '@rollup/rollup-darwin-x64': 4.59.0 - '@rollup/rollup-freebsd-arm64': 4.59.0 - '@rollup/rollup-freebsd-x64': 4.59.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 - '@rollup/rollup-linux-arm-musleabihf': 4.59.0 - '@rollup/rollup-linux-arm64-gnu': 4.59.0 - '@rollup/rollup-linux-arm64-musl': 4.59.0 - '@rollup/rollup-linux-loong64-gnu': 4.59.0 - '@rollup/rollup-linux-loong64-musl': 4.59.0 - '@rollup/rollup-linux-ppc64-gnu': 4.59.0 - '@rollup/rollup-linux-ppc64-musl': 4.59.0 - '@rollup/rollup-linux-riscv64-gnu': 4.59.0 - '@rollup/rollup-linux-riscv64-musl': 4.59.0 - '@rollup/rollup-linux-s390x-gnu': 4.59.0 - '@rollup/rollup-linux-x64-gnu': 4.59.0 - '@rollup/rollup-linux-x64-musl': 4.59.0 - '@rollup/rollup-openbsd-x64': 4.59.0 - '@rollup/rollup-openharmony-arm64': 4.59.0 - '@rollup/rollup-win32-arm64-msvc': 4.59.0 - '@rollup/rollup-win32-ia32-msvc': 4.59.0 - '@rollup/rollup-win32-x64-gnu': 4.59.0 - '@rollup/rollup-win32-x64-msvc': 4.59.0 + '@rollup/rollup-android-arm-eabi': 4.60.2 + '@rollup/rollup-android-arm64': 4.60.2 + '@rollup/rollup-darwin-arm64': 4.60.2 + '@rollup/rollup-darwin-x64': 4.60.2 + '@rollup/rollup-freebsd-arm64': 4.60.2 + '@rollup/rollup-freebsd-x64': 4.60.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.2 + '@rollup/rollup-linux-arm-musleabihf': 4.60.2 + '@rollup/rollup-linux-arm64-gnu': 4.60.2 + '@rollup/rollup-linux-arm64-musl': 4.60.2 + '@rollup/rollup-linux-loong64-gnu': 4.60.2 + '@rollup/rollup-linux-loong64-musl': 4.60.2 + '@rollup/rollup-linux-ppc64-gnu': 4.60.2 + '@rollup/rollup-linux-ppc64-musl': 4.60.2 + '@rollup/rollup-linux-riscv64-gnu': 4.60.2 + '@rollup/rollup-linux-riscv64-musl': 4.60.2 + '@rollup/rollup-linux-s390x-gnu': 4.60.2 + '@rollup/rollup-linux-x64-gnu': 4.60.2 + '@rollup/rollup-linux-x64-musl': 4.60.2 + '@rollup/rollup-openbsd-x64': 4.60.2 + '@rollup/rollup-openharmony-arm64': 4.60.2 + '@rollup/rollup-win32-arm64-msvc': 4.60.2 + '@rollup/rollup-win32-ia32-msvc': 4.60.2 + '@rollup/rollup-win32-x64-gnu': 4.60.2 + '@rollup/rollup-win32-x64-msvc': 4.60.2 fsevents: 2.3.3 router@2.2.0: @@ -18460,7 +18746,7 @@ snapshots: dependencies: mri: 1.2.0 - safe-array-concat@1.1.3: + safe-array-concat@1.1.4: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -18485,7 +18771,7 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 - safe-regex2@5.1.0: + safe-regex2@5.1.1: dependencies: ret: 0.5.0 @@ -18775,7 +19061,7 @@ snapshots: std-env@3.10.0: {} - std-env@4.0.0: {} + std-env@4.1.0: {} stdin-discarder@0.2.2: {} @@ -18813,7 +19099,7 @@ snapshots: get-east-asian-width: 1.5.0 strip-ansi: 7.2.0 - string-width@8.2.0: + string-width@8.2.1: dependencies: get-east-asian-width: 1.5.0 strip-ansi: 7.2.0 @@ -18948,7 +19234,7 @@ snapshots: chalk-template: 1.1.2 commander: 13.1.0 cosmiconfig: 9.0.1(typescript@5.9.3) - effect: 3.21.0 + effect: 3.21.2 enquirer: 2.4.1 fast-check: 3.23.2 globby: 14.1.0 @@ -18966,14 +19252,16 @@ snapshots: tagged-tag@1.0.0: {} - tailwindcss@4.1.18: {} + tailwindcss@4.2.1: {} + + tailwindcss@4.2.2: {} - tapable@2.3.2: {} + tapable@2.3.3: {} tar-stream@3.1.8: dependencies: b4a: 1.8.0 - bare-fs: 4.7.0 + bare-fs: 4.7.1 fast-fifo: 1.3.2 streamx: 2.25.0 transitivePeerDependencies: @@ -19156,7 +19444,7 @@ snapshots: tsx@4.21.0: dependencies: esbuild: 0.27.2 - get-tsconfig: 4.13.7 + get-tsconfig: 4.14.0 optionalDependencies: fsevents: 2.3.3 @@ -19168,7 +19456,7 @@ snapshots: type-fest@4.41.0: {} - type-fest@5.5.0: + type-fest@5.6.0: dependencies: tagged-tag: 1.0.0 @@ -19250,7 +19538,7 @@ snapshots: undici-types@7.16.0: {} - undici@6.24.1: {} + undici@6.25.0: {} undici@7.24.4: {} @@ -19341,7 +19629,7 @@ snapshots: chokidar: 5.0.0 destr: 2.0.5 h3: 1.15.11 - lru-cache: 11.3.3 + lru-cache: 11.3.5 node-fetch-native: 1.6.7 ofetch: 1.5.1 ufo: 1.6.3 @@ -19354,7 +19642,7 @@ snapshots: chokidar: 5.0.0 destr: 2.0.5 h3: 1.15.11 - lru-cache: 11.3.3 + lru-cache: 11.3.5 node-fetch-native: 1.6.7 ofetch: 1.5.1 ufo: 1.6.3 @@ -19446,33 +19734,42 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-dev-rpc@1.1.0(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): + vite-dev-rpc@1.1.0(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: birpc: 2.9.0 - vite: 7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) - vite-hot-client: 2.1.0(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + vite: 8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + vite-hot-client: 2.1.0(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + + vite-hot-client@0.2.4(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): + dependencies: + vite: 8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) - vite-hot-client@0.2.4(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): + vite-hot-client@2.1.0(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: - vite: 7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) - vite-hot-client@2.1.0(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): + vite-imagetools@10.0.0(rollup@4.60.2)(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: - vite: 7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + '@rollup/pluginutils': 5.3.0(rollup@4.60.2) + imagetools-core: 9.1.0 + sharp: 0.34.5 + vite: 8.0.9(@types/node@24.10.0)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + transitivePeerDependencies: + - rollup - vite-imagetools@10.0.0(rollup@4.59.0)(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): + vite-imagetools@10.0.0(rollup@4.60.2)(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@rollup/pluginutils': 5.3.0(rollup@4.60.2) imagetools-core: 9.1.0 sharp: 0.34.5 - vite: 7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - rollup - vite-plugin-dts@4.5.4(@types/node@24.10.0)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): + vite-plugin-dts@4.5.4(@types/node@24.10.0)(rollup@4.60.2)(typescript@5.9.3)(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@microsoft/api-extractor': 7.57.6(@types/node@24.10.0) - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@rollup/pluginutils': 5.3.0(rollup@4.60.2) '@volar/typescript': 2.4.28 '@vue/language-core': 2.2.0(typescript@5.9.3) compare-versions: 6.1.1 @@ -19482,13 +19779,13 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.9(@types/node@24.10.0)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-inspect@11.3.3(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): + vite-plugin-inspect@11.3.3(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: ansis: 4.2.0 debug: 4.4.3(supports-color@10.2.2) @@ -19498,43 +19795,86 @@ snapshots: perfect-debounce: 2.1.0 sirv: 3.0.2 unplugin-utils: 0.3.1 - vite: 7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) - vite-dev-rpc: 1.1.0(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + vite: 8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + vite-dev-rpc: 1.1.0(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) transitivePeerDependencies: - supports-color - vite-tsconfig-paths@6.0.4(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): + vite-tsconfig-paths@6.0.4(typescript@5.9.3)(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: debug: 4.4.3(supports-color@10.2.2) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.9(@types/node@24.10.0)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - supports-color - typescript - vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3): + vite-tsconfig-paths@6.0.4(typescript@5.9.3)(vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): + dependencies: + debug: 4.4.3(supports-color@10.2.2) + globrex: 0.1.2 + tsconfck: 3.1.6(typescript@5.9.3) + optionalDependencies: + vite: 8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + transitivePeerDependencies: + - supports-color + - typescript + + vite@7.3.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 postcss: 8.5.6 - rollup: 4.59.0 + rollup: 4.60.2 tinyglobby: 0.2.16 optionalDependencies: '@types/node': 24.10.0 fsevents: 2.3.3 jiti: 2.6.1 - lightningcss: 1.30.2 + lightningcss: 1.32.0 + terser: 5.46.0 + tsx: 4.21.0 + yaml: 2.8.3 + + vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.12 + rolldown: 1.0.0-rc.16 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 24.10.0 + esbuild: 0.27.2 + fsevents: 2.3.3 + jiti: 2.6.1 + terser: 5.46.0 + tsx: 4.21.0 + yaml: 2.8.3 + + vite@8.0.9(@types/node@24.10.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.12 + rolldown: 1.0.0-rc.16 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 24.10.0 + esbuild: 0.27.3 + fsevents: 2.3.3 + jiti: 2.6.1 terser: 5.46.0 tsx: 4.21.0 yaml: 2.8.3 - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/mocker': 4.0.18(vite@7.3.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -19551,7 +19891,7 @@ snapshots: tinyexec: 1.1.1 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 7.3.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -19703,7 +20043,7 @@ snapshots: wrap-ansi@10.0.0: dependencies: ansi-styles: 6.2.3 - string-width: 8.2.0 + string-width: 8.2.1 strip-ansi: 7.2.0 wrap-ansi@6.2.0: diff --git a/scripts/binding-wasm.ts b/scripts/binding-wasm.ts index 1c1738bdb96..5593947e488 100644 --- a/scripts/binding-wasm.ts +++ b/scripts/binding-wasm.ts @@ -1,7 +1,7 @@ import { type BuildConfig, copyFile, emptyDir, ensureDir } from './util.ts'; import { execa } from 'execa'; import { join } from 'node:path'; -import { rollup } from 'rollup'; +import { rolldown } from 'rolldown'; export async function buildWasmBinding(config: BuildConfig) { const srcWasmDir = config.srcWasmDir; @@ -39,7 +39,7 @@ export async function buildWasmBinding(config: BuildConfig) { CARGO_PROFILE_RELEASE_OPT_LEVEL: 'z', }); - const build = await rollup({ + const build = await rolldown({ input: wasmJsBuildPath, }); diff --git a/scripts/compiled-string-plugin.ts b/scripts/compiled-string-plugin.ts index 12fffdf2710..412093cadf0 100644 --- a/scripts/compiled-string-plugin.ts +++ b/scripts/compiled-string-plugin.ts @@ -9,7 +9,6 @@ const isCompiledStringId = (id: string) => /[?&]compiled-string/.test(id); */ export function compiledStringPlugin(): Plugin { let devServer: any; - const originals = new Map(); return { name: 'compiled-string-plugin', @@ -26,25 +25,6 @@ export function compiledStringPlugin(): Plugin { const cleanId = id.replace(/([?&])compiled-string/, '$1').replace(/[?&]$/, ''); const resolved = await this.resolve(cleanId, importer, { skipSelf: true }); if (resolved) { - /** - * Note: we load the code here instead of in the load hook to prevent a bug in Vite when - * `rollupOptions.maxParallelFileOps=1`. See - * https://github.com/vitejs/vite/issues/20775 - */ - let code: string | null; - if (devServer) { - // in dev mode, you need to use the dev server to transform the request - const transformResult = await devServer.transformRequest(resolved.id); - code = transformResult?.code; - this.addWatchFile(resolved.id); - } else { - const loaded = await this.load({ id: resolved.id }); - code = loaded.code; - } - if (!code) { - throw new Error(`compiled-string: Unable to load code for ${resolved.id}`); - } - originals.set(resolved.id, code); return `virtual:compiled-string:${resolved.id}`; } } else if (id.startsWith('virtual:compiled-string:')) { @@ -59,9 +39,18 @@ export function compiledStringPlugin(): Plugin { async handler(id) { if (id.startsWith('virtual:compiled-string:')) { const originalId = id.slice('virtual:compiled-string:'.length); - const code = originals.get(originalId); + let code: string | null | undefined; + if (devServer) { + // in dev mode, you need to use the dev server to transform the request + const transformResult = await devServer.transformRequest(originalId); + code = transformResult?.code; + this.addWatchFile(originalId); + } else { + const loaded = await this.load({ id: originalId, moduleSideEffects: true }); + code = loaded.code; + } if (!code) { - throw new Error(`compiled-string: Unable to retrieve loaded code for ${originalId}`); + throw new Error(`compiled-string: Unable to load code for ${originalId}`); } const minified = await minify(code); if (!minified.code) { diff --git a/scripts/submodule-core.ts b/scripts/submodule-core.ts index 6fb93336b5c..55cc69c7322 100644 --- a/scripts/submodule-core.ts +++ b/scripts/submodule-core.ts @@ -1,16 +1,8 @@ import { build, type BuildOptions } from 'esbuild'; import { join } from 'node:path'; -import { type InputOptions, type OutputOptions, rollup } from 'rollup'; +import { type InputOptions, type OutputOptions, rolldown } from 'rolldown'; import { minify } from 'terser'; -import { - type BuildConfig, - fileSize, - getBanner, - readFile, - rollupOnWarn, - target, - writeFile, -} from './util.ts'; +import { type BuildConfig, fileSize, getBanner, rollupOnWarn, target, writeFile } from './util.ts'; /** * Regex for property names that should be mangled consistently across all bundles (core + server). @@ -66,7 +58,7 @@ async function submoduleCoreProd(config: BuildConfig): Promise { ], }; - const prodBuild = await rollup(inputProd); + const prodBuild = await rolldown(inputProd); const chunks: string[] = []; await prodBuild.generate({ format: 'es', diff --git a/scripts/submodule-insights.ts b/scripts/submodule-insights.ts index 8700c34ae24..22dd74f4718 100644 --- a/scripts/submodule-insights.ts +++ b/scripts/submodule-insights.ts @@ -24,7 +24,7 @@ async function buildComponents(config: BuildConfig) { emptyOutDir: false, target: 'es2022', minify: false, - rollupOptions: { + rolldownOptions: { external: (id) => /^(@|node:)/i.test(id), }, }, @@ -44,7 +44,7 @@ async function buildVite(config: BuildConfig) { }, outDir: distBase, emptyOutDir: false, - rollupOptions: { + rolldownOptions: { external: (id) => /^(@|node:)/i.test(id), }, }, diff --git a/scripts/submodule-optimizer.ts b/scripts/submodule-optimizer.ts index 6130a7e8e3a..3c3336b5829 100644 --- a/scripts/submodule-optimizer.ts +++ b/scripts/submodule-optimizer.ts @@ -37,7 +37,7 @@ export async function submoduleOptimizer(config: BuildConfig) { sourcemap: false, target: target, minify: !config.dev, - rollupOptions: { + rolldownOptions: { external: ['node:fs', 'node:path', 'launch-editor', '@qwik.dev/optimizer'], output: { banner: getBanner('@qwik.dev/core/optimizer', config.distVersion), diff --git a/scripts/submodule-preloader.ts b/scripts/submodule-preloader.ts index a5981bc349a..34a869aab33 100644 --- a/scripts/submodule-preloader.ts +++ b/scripts/submodule-preloader.ts @@ -34,9 +34,6 @@ function customTerserPlugin(): Plugin { regex: MANGLE_PROPS_REGEX, }, }, - format: { - comments: true, - }, }); return result.code || null; @@ -59,7 +56,7 @@ export async function submodulePreloader(config: BuildConfig): Promise { formats: ['es'], fileName: () => 'preloader.mjs', }, - rollupOptions: { + rolldownOptions: { external: ['@qwik.dev/core/build'], }, minify: false, // This is the default, just to be explicit diff --git a/scripts/submodule-qwikloader.ts b/scripts/submodule-qwikloader.ts index 5db6b796f00..c261f031830 100644 --- a/scripts/submodule-qwikloader.ts +++ b/scripts/submodule-qwikloader.ts @@ -68,12 +68,8 @@ export const minifyClientScript = async (content: string) => { export const getLoaderJsonString = async (config: BuildConfig, name: string) => { const filePath = join(config.distQwikPkgDir, name); const content = await readFile(filePath, 'utf-8'); - // Remove vite comments and leading/trailing whitespace - let cleaned = content.trim().replace(/\n?\/\*\s*@vite[^*]+\*\/\n?/g, ''); - if (cleaned.endsWith(';')) { - cleaned = cleaned.slice(0, -1); - } - return JSON.stringify(cleaned); + + return JSON.stringify(content); }; /** Load each of the qwik scripts to be inlined with esbuild "define" as const variables. */ diff --git a/scripts/util.ts b/scripts/util.ts index 6464e3bf200..2d8d3086c96 100644 --- a/scripts/util.ts +++ b/scripts/util.ts @@ -16,7 +16,7 @@ import { } from 'node:fs'; import { join } from 'node:path'; import { fileURLToPath } from 'node:url'; -import type { Plugin as RollupPlugin } from 'rollup'; +import type { Plugin as RolldownPlugin } from 'rolldown'; import { minify, type MinifyOptions } from 'terser'; import { promisify } from 'util'; import { readPackageJson } from './package-json.ts'; @@ -160,7 +160,7 @@ export function loadConfig(args: string[] = []): BuildConfig { }; } -export function terser(opts: MinifyOptions): RollupPlugin { +export function terser(opts: MinifyOptions): RolldownPlugin { return { name: 'terser', async generateBundle(_, bundle) { diff --git a/scripts/validate-build.ts b/scripts/validate-build.ts index 5cf58af6ac3..a22447598e1 100644 --- a/scripts/validate-build.ts +++ b/scripts/validate-build.ts @@ -1,7 +1,7 @@ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'; import { basename, extname, join } from 'node:path'; import { pathToFileURL } from 'node:url'; -import { rollup } from 'rollup'; +import { rolldown } from 'rolldown'; import ts from 'typescript'; import { access, type BuildConfig, type PackageJSON, panic, readFile } from './util.ts'; @@ -210,7 +210,7 @@ async function validateModuleTreeshake( external: string[] = [] ): Promise { const virtualInputId = `@index`; - const bundle = await rollup({ + const bundle = await rolldown({ input: virtualInputId, treeshake: { moduleSideEffects: 'no-external', diff --git a/starters/adapters/aws-lambda/adapters/aws-lambda/vite.config.ts b/starters/adapters/aws-lambda/adapters/aws-lambda/vite.config.ts index 2d89c8f0d02..ce1326cc4d0 100755 --- a/starters/adapters/aws-lambda/adapters/aws-lambda/vite.config.ts +++ b/starters/adapters/aws-lambda/adapters/aws-lambda/vite.config.ts @@ -2,17 +2,18 @@ import { nodeServerAdapter } from "@qwik.dev/router/adapters/node-server/vite"; import { extendConfig } from "@qwik.dev/router/vite"; import { builtinModules } from "module"; import baseConfig from "../../vite.config.ts"; + export default extendConfig(baseConfig, () => { return { ssr: { // This configuration will bundle all dependencies, except the node builtins (path, fs, etc.) - external: builtinModules, + external: [...builtinModules], noExternal: /./, }, build: { minify: false, ssr: true, - rollupOptions: { + rolldownOptions: { input: ["./src/entry_aws-lambda.tsx"], }, }, diff --git a/starters/adapters/azure-swa/adapters/azure-swa/vite.config.ts b/starters/adapters/azure-swa/adapters/azure-swa/vite.config.ts index 574dd67768f..89914fbaba9 100644 --- a/starters/adapters/azure-swa/adapters/azure-swa/vite.config.ts +++ b/starters/adapters/azure-swa/adapters/azure-swa/vite.config.ts @@ -7,7 +7,7 @@ export default extendConfig(baseConfig, () => { build: { ssr: true, outDir: "azure-functions/render", - rollupOptions: { + rolldownOptions: { input: ["src/entry.azure-swa.tsx"], output: { entryFileNames: `[name].[hash].mjs`, diff --git a/starters/adapters/bun/adapters/bun/vite.config.ts b/starters/adapters/bun/adapters/bun/vite.config.ts index d3b70610629..387554983e7 100644 --- a/starters/adapters/bun/adapters/bun/vite.config.ts +++ b/starters/adapters/bun/adapters/bun/vite.config.ts @@ -10,7 +10,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: ["src/entry.bun.ts"], }, minify: false, diff --git a/starters/adapters/cloud-run/adapters/cloud-run/vite.config.ts b/starters/adapters/cloud-run/adapters/cloud-run/vite.config.ts index 158b31cdd09..63e1fd375ff 100644 --- a/starters/adapters/cloud-run/adapters/cloud-run/vite.config.ts +++ b/starters/adapters/cloud-run/adapters/cloud-run/vite.config.ts @@ -6,7 +6,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: ["src/entry.cloud-run.tsx"], }, }, diff --git a/starters/adapters/cloudflare-pages/adapters/cloudflare-pages/vite.config.ts b/starters/adapters/cloudflare-pages/adapters/cloudflare-pages/vite.config.ts index c89a2d7929f..f7968c0b6a0 100644 --- a/starters/adapters/cloudflare-pages/adapters/cloudflare-pages/vite.config.ts +++ b/starters/adapters/cloudflare-pages/adapters/cloudflare-pages/vite.config.ts @@ -6,7 +6,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: ["src/entry.cloudflare-pages.tsx"], }, }, diff --git a/starters/adapters/cloudflare-workers/adapters/cloudflare-workers/vite.config.ts b/starters/adapters/cloudflare-workers/adapters/cloudflare-workers/vite.config.ts index d25fb89668c..e9f6aef861a 100644 --- a/starters/adapters/cloudflare-workers/adapters/cloudflare-workers/vite.config.ts +++ b/starters/adapters/cloudflare-workers/adapters/cloudflare-workers/vite.config.ts @@ -6,7 +6,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: ["src/entry.cloudflare-pages.tsx", "@qwik-city-plan"], }, }, diff --git a/starters/adapters/deno/adapters/deno/vite.config.ts b/starters/adapters/deno/adapters/deno/vite.config.ts index dea4f679ff1..549d338ca3f 100644 --- a/starters/adapters/deno/adapters/deno/vite.config.ts +++ b/starters/adapters/deno/adapters/deno/vite.config.ts @@ -6,7 +6,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: ["src/entry.deno.ts"], }, minify: false, diff --git a/starters/adapters/express/adapters/express/vite.config.ts b/starters/adapters/express/adapters/express/vite.config.ts index f277be8a398..c3875283204 100644 --- a/starters/adapters/express/adapters/express/vite.config.ts +++ b/starters/adapters/express/adapters/express/vite.config.ts @@ -6,7 +6,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: ["src/entry.express.tsx"], }, }, diff --git a/starters/adapters/fastify/adapters/fastify/vite.config.ts b/starters/adapters/fastify/adapters/fastify/vite.config.ts index 3837c87ba23..f035c546e21 100644 --- a/starters/adapters/fastify/adapters/fastify/vite.config.ts +++ b/starters/adapters/fastify/adapters/fastify/vite.config.ts @@ -6,7 +6,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: ["src/entry.fastify.tsx"], }, }, diff --git a/starters/adapters/firebase/adapters/firebase/vite.config.ts b/starters/adapters/firebase/adapters/firebase/vite.config.ts index 51b4e830ad0..e34ded92fa9 100755 --- a/starters/adapters/firebase/adapters/firebase/vite.config.ts +++ b/starters/adapters/firebase/adapters/firebase/vite.config.ts @@ -2,16 +2,17 @@ import { nodeServerAdapter } from "@qwik.dev/router/adapters/node-server/vite"; import { extendConfig } from "@qwik.dev/router/vite"; import { builtinModules } from "module"; import baseConfig from "../../vite.config.ts"; + export default extendConfig(baseConfig, () => { return { ssr: { - external: builtinModules, + external: [...builtinModules], noExternal: /./, }, build: { minify: false, ssr: true, - rollupOptions: { + rolldownOptions: { input: ["./src/entry-firebase.tsx"], }, outDir: "./functions/server", diff --git a/starters/adapters/netlify-edge/adapters/netlify-edge/vite.config.ts b/starters/adapters/netlify-edge/adapters/netlify-edge/vite.config.ts index 41577ea2d44..daffed1391b 100644 --- a/starters/adapters/netlify-edge/adapters/netlify-edge/vite.config.ts +++ b/starters/adapters/netlify-edge/adapters/netlify-edge/vite.config.ts @@ -6,7 +6,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: ["src/entry.netlify-edge.tsx"], }, outDir: ".netlify/edge-functions/entry.netlify-edge", diff --git a/starters/adapters/node-server/adapters/node-server/vite.config.ts b/starters/adapters/node-server/adapters/node-server/vite.config.ts index 9934ff8addf..eb118243438 100644 --- a/starters/adapters/node-server/adapters/node-server/vite.config.ts +++ b/starters/adapters/node-server/adapters/node-server/vite.config.ts @@ -6,7 +6,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: ["src/entry.node-server.tsx"], }, }, diff --git a/starters/adapters/ssg/adapters/ssg/vite.config.ts b/starters/adapters/ssg/adapters/ssg/vite.config.ts index 7cc862948fc..657eef3beea 100644 --- a/starters/adapters/ssg/adapters/ssg/vite.config.ts +++ b/starters/adapters/ssg/adapters/ssg/vite.config.ts @@ -6,7 +6,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: ["@qwik-router-config"], }, }, diff --git a/starters/adapters/vercel-edge/adapters/vercel-edge/vite.config.ts b/starters/adapters/vercel-edge/adapters/vercel-edge/vite.config.ts index f71383b9efb..e49bb65030b 100644 --- a/starters/adapters/vercel-edge/adapters/vercel-edge/vite.config.ts +++ b/starters/adapters/vercel-edge/adapters/vercel-edge/vite.config.ts @@ -6,7 +6,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: ["src/entry.vercel-edge.tsx"], }, outDir: ".vercel/output/functions/_qwik-router.func", diff --git a/starters/apps/library/vite.config.ts b/starters/apps/library/vite.config.ts index eea914de756..ee8b72bac21 100644 --- a/starters/apps/library/vite.config.ts +++ b/starters/apps/library/vite.config.ts @@ -20,7 +20,7 @@ export default defineConfig(() => { fileName: (format, entryName) => `${entryName}.qwik.${format === "es" ? "mjs" : "cjs"}`, }, - rollupOptions: { + rolldownOptions: { output: { preserveModules: true, preserveModulesRoot: "src", diff --git a/starters/features/tailwind/package.json b/starters/features/tailwind/package.json index 0eab8ccdf4e..1203ed1bb7e 100644 --- a/starters/features/tailwind/package.json +++ b/starters/features/tailwind/package.json @@ -22,7 +22,7 @@ "devDependencies": { "prettier-plugin-tailwindcss": "^0.6.11", "tailwindcss": "^4.1.4", - "@tailwindcss/vite": "^4.1.4" + "@tailwindcss/vite": "^4.2.0" }, "type": "module" } diff --git a/starters/features/vitest/package.json b/starters/features/vitest/package.json index bb7ac472e1f..a02b8f9d919 100644 --- a/starters/features/vitest/package.json +++ b/starters/features/vitest/package.json @@ -10,8 +10,8 @@ ] }, "devDependencies": { - "@vitest/ui": "^0.34.6", - "vitest": "^0.34.6" + "@vitest/ui": "^4.0.18", + "vitest": "^4.0.18" }, "scripts": { "test.unit": "vitest components",