diff --git a/.changeset/vite-8-rolldown.md b/.changeset/vite-8-rolldown.md new file mode 100644 index 00000000000..af9a4b628b4 --- /dev/null +++ b/.changeset/vite-8-rolldown.md @@ -0,0 +1,7 @@ +--- +'@qwik.dev/core': minor +'@qwik.dev/router': minor +'@qwik.dev/react': minor +--- + +feat: support Vite 8 with the Rolldown bundler (Vite 8 is now required) diff --git a/e2e/adapters-e2e/adapters/bun/vite.config.ts b/e2e/adapters-e2e/adapters/bun/vite.config.ts index cfc89311456..44d939bf837 100644 --- a/e2e/adapters-e2e/adapters/bun/vite.config.ts +++ b/e2e/adapters-e2e/adapters/bun/vite.config.ts @@ -6,7 +6,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: ['src/entry.bun.tsx'], }, }, diff --git a/e2e/adapters-e2e/adapters/deno/vite.config.ts b/e2e/adapters-e2e/adapters/deno/vite.config.ts index fda6844bdbc..0468f5eca25 100644 --- a/e2e/adapters-e2e/adapters/deno/vite.config.ts +++ b/e2e/adapters-e2e/adapters/deno/vite.config.ts @@ -6,7 +6,7 @@ export default extendConfig(baseConfig, () => { return { build: { ssr: true, - rollupOptions: { + rolldownOptions: { input: ['src/entry.deno.tsx'], }, }, 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..1a9c920b072 100644 --- a/e2e/qwik-e2e/apps/preloader-test/vite.config.ts +++ b/e2e/qwik-e2e/apps/preloader-test/vite.config.ts @@ -75,7 +75,7 @@ export default defineConfig((): UserConfig => { ], build: { minify: false, - rollupOptions: { + rolldownOptions: { output: { manualChunks: (id) => { // Put library code in separate chunks diff --git a/e2e/qwik-e2e/dev-server.ts b/e2e/qwik-e2e/dev-server.ts index fd910f0fc72..b4ce046dfaa 100644 --- a/e2e/qwik-e2e/dev-server.ts +++ b/e2e/qwik-e2e/dev-server.ts @@ -220,7 +220,7 @@ export { router } getInlineConf({ build: { minify: false, - rollupOptions: clientInput + rolldownOptions: clientInput ? { input: { 'entry.dev': clientInput, diff --git a/e2e/qwik-e2e/tests/server-only-modules.e2e.ts b/e2e/qwik-e2e/tests/server-only-modules.e2e.ts index 7ad79d8be7c..3bc4f47e572 100644 --- a/e2e/qwik-e2e/tests/server-only-modules.e2e.ts +++ b/e2e/qwik-e2e/tests/server-only-modules.e2e.ts @@ -198,7 +198,7 @@ async function buildFixtureApp(appDir: string, input = './src/root.tsx') { plugins: [qwikRouter(), qwikVite()], build: { minify: false, - rollupOptions: input ? { input: resolve(appDir, input) } : undefined, + rolldownOptions: input ? { input: resolve(appDir, input) } : undefined, }, }; diff --git a/e2e/qwik-e2e/tests/style.e2e.ts b/e2e/qwik-e2e/tests/style.e2e.ts index a463f5acef2..64e8114f69c 100644 --- a/e2e/qwik-e2e/tests/style.e2e.ts +++ b/e2e/qwik-e2e/tests/style.e2e.ts @@ -1,6 +1,7 @@ import { test, expect } from '@playwright/test'; -const USE_STYLES_DEDUPE_MARKER = '--use-styles-dedupe-marker: dedupe-ok'; +// No space after the colon: the bundler minifies the inline CSS. +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 f3dba04911d..033868eb054 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": "Vite 8 only", "dependencyTypes": [ "prod", "peer" @@ -19,7 +19,7 @@ "dependencies": [ "vite" ], - "pinVersion": ">=6 <9" + "pinVersion": ">=8 <9" }, { "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.3.0", "@vitest/coverage-v8": "4.0.18", "all-contributors-cli": "6.26.1", "brotli": "1.3.3", @@ -169,9 +169,9 @@ "typescript": "5.9.3", "typescript-eslint": "8.56.1", "vfile": "6.0.3", - "vite": "7.3.5", + "vite": "8.2.0", "vite-imagetools": "10.0.0", - "vite-plugin-dts": "4.5.4", + "vite-plugin-dts": "5.0.3", "vite-tsconfig-paths": "6.1.1", "vitest": "4.1.10", "watchlist": "0.3.1", diff --git a/packages/devtools/package.json b/packages/devtools/package.json index 768eeaf0114..f0b30a294ca 100644 --- a/packages/devtools/package.json +++ b/packages/devtools/package.json @@ -9,10 +9,10 @@ "dree": "^5.1.5", "fast-glob": "^3.3.3", "oxc-parser": "^0.120.0", - "rollup-plugin-visualizer": "^6.0.3", + "rollup-plugin-visualizer": "^7.0.1", "superjson": "^2.2.6", "vite-hot-client": "^2.1.0", - "vite-plugin-inspect": "^11.3.3", + "vite-plugin-inspect": "^12.0.2", "yaml": "^2.8.2" }, "devDependencies": { @@ -46,7 +46,7 @@ "tsdown": "0.22.0", "tsx": "4.21.0", "typescript": "5.9.3", - "vite": "7.3.5", + "vite": "8.2.0", "vite-tsconfig-paths": "6.1.1", "vitest": "4.1.10" }, @@ -87,7 +87,7 @@ "@tailwindcss/postcss": "^4.2.1", "@tailwindcss/vite": "^4.2.1", "tailwindcss": "^4.2.1", - "vite": ">=6 <9" + "vite": ">=8 <9" }, "private": false, "publishConfig": { diff --git a/packages/devtools/ui/vite.config.mts b/packages/devtools/ui/vite.config.mts index 37e069ffddf..038a9b478c5 100644 --- a/packages/devtools/ui/vite.config.mts +++ b/packages/devtools/ui/vite.config.mts @@ -31,7 +31,7 @@ export default defineConfig(() => { fileName: (format, entryName) => `${entryName}.qwik.mjs`, cssFileName: 'styles', }, - rollupOptions: { + rolldownOptions: { output: { preserveModules: true, preserveModulesRoot: 'src', 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 8cd4e518789..182e0021ef8 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -20,7 +20,7 @@ "@qwik.dev/partytown": "0.13.2", "@qwik.dev/react": "workspace:*", "@qwik.dev/router": "workspace:*", - "@rolldown/browser": "1.0.0-beta.59", + "@rolldown/browser": "1.2.2", "@shikijs/colorized-brackets": "3.21.0", "@shikijs/langs": "3.21.0", "@shikijs/rehype": "3.21.0", @@ -56,7 +56,7 @@ "tsm": "2.3.0", "typescript": "5.9.3", "valibot": "1.4.2", - "vite": "7.3.5", + "vite": "8.2.0", "vite-tsconfig-paths": "6.1.1", "wrangler": "4.80.0" }, diff --git a/packages/docs/src/repl/bundler/repl-bundler-worker.ts b/packages/docs/src/repl/bundler/repl-bundler-worker.ts index 3efcdca4b61..b0dea918fff 100644 --- a/packages/docs/src/repl/bundler/repl-bundler-worker.ts +++ b/packages/docs/src/repl/bundler/repl-bundler-worker.ts @@ -6,7 +6,7 @@ import { replMinify, replResolver, replWorkerQrlChunks, -} from './rollup-plugins'; +} from './rolldown-plugins'; import { QWIK_PKG_NAME_V1 } from '../repl-constants'; // Worker message types @@ -179,7 +179,7 @@ async function performBundle(message: BundleMessage): Promise { plugins: [ definesPlugin(defines), replCss({ srcInputs }), - qwikViteModule!.qwikRollup({ + qwikViteModule!.qwikRolldown({ optimizerOptions: { binding, _optimizer: qwikOptimizerModule }, target: 'client', buildMode, @@ -226,7 +226,7 @@ async function performBundle(message: BundleMessage): Promise { plugins: [ definesPlugin(defines), replCss({ srcInputs }), - qwikViteModule!.qwikRollup({ + qwikViteModule!.qwikRolldown({ optimizerOptions: { binding, _optimizer: qwikOptimizerModule }, target: 'ssr', buildMode, diff --git a/packages/docs/src/repl/bundler/rollup-plugins.ts b/packages/docs/src/repl/bundler/rolldown-plugins.ts similarity index 100% rename from packages/docs/src/repl/bundler/rollup-plugins.ts rename to packages/docs/src/repl/bundler/rolldown-plugins.ts diff --git a/packages/docs/src/repl/bundler/rollup-plugins.unit.ts b/packages/docs/src/repl/bundler/rolldown-plugins.unit.ts similarity index 96% rename from packages/docs/src/repl/bundler/rollup-plugins.unit.ts rename to packages/docs/src/repl/bundler/rolldown-plugins.unit.ts index 6429a511b0e..f149794c734 100644 --- a/packages/docs/src/repl/bundler/rollup-plugins.unit.ts +++ b/packages/docs/src/repl/bundler/rolldown-plugins.unit.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from 'vitest'; import type { QwikManifest } from '@qwik.dev/core/optimizer'; -import { replWorkerQrlChunks } from './rollup-plugins'; +import { replWorkerQrlChunks } from './rolldown-plugins'; describe('repl worker qrl chunk rewrites', () => { test('rewrites worker qrl placeholders to repl client bundle paths', () => { diff --git a/packages/docs/src/repl/types.ts b/packages/docs/src/repl/types.ts index 8ec7db3f873..04b30861bde 100644 --- a/packages/docs/src/repl/types.ts +++ b/packages/docs/src/repl/types.ts @@ -2,7 +2,7 @@ import type { NoSerialize, Signal } from '@qwik.dev/core'; import type { Diagnostic, QwikManifest, - QwikRollupPluginOptions, + QwikRolldownPluginOptions, TransformModule, } from '@qwik.dev/core/optimizer'; import type { ReplInstance } from './repl-instance'; @@ -17,7 +17,7 @@ export interface ReplAppInput { } export type PkgUrls = { [pkgName: string]: { [path: string]: string; version: string } }; -export interface ReplInputOptions extends Omit { +export interface ReplInputOptions extends Omit { replId: string; srcInputs: ReplModuleInput[]; version: string; diff --git a/packages/docs/src/routes/api/qwik-optimizer/api.json b/packages/docs/src/routes/api/qwik-optimizer/api.json index f820e57ec47..66476eeb128 100644 --- a/packages/docs/src/routes/api/qwik-optimizer/api.json +++ b/packages/docs/src/routes/api/qwik-optimizer/api.json @@ -196,6 +196,34 @@ "editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik-vite/src/types.ts", "mdFile": "qwik-vite.qwikmanifest.md" }, + { + "name": "qwikRolldown", + "id": "qwikrolldown", + "hierarchy": [ + { + "name": "qwikRolldown", + "id": "qwikrolldown" + } + ], + "kind": "Function", + "content": "```typescript\nexport declare function qwikRolldown(qwikRolldownOpts?: QwikRolldownPluginOptions): any;\n```\n\n\n\n\n
\n\nParameter\n\n\n\n\nType\n\n\n\n\nDescription\n\n\n
\n\nqwikRolldownOpts\n\n\n\n\n[QwikRolldownPluginOptions](#qwikrolldownpluginoptions)\n\n\n\n\n_(Optional)_\n\n\n
\n\n**Returns:**\n\nany", + "editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik-vite/src/plugins/rolldown.ts", + "mdFile": "qwik-vite.qwikrolldown.md" + }, + { + "name": "QwikRolldownPluginOptions", + "id": "qwikrolldownpluginoptions", + "hierarchy": [ + { + "name": "QwikRolldownPluginOptions", + "id": "qwikrolldownpluginoptions" + } + ], + "kind": "Interface", + "content": "```typescript\nexport interface QwikRolldownPluginOptions \n```\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
\n\nProperty\n\n\n\n\nModifiers\n\n\n\n\nType\n\n\n\n\nDescription\n\n\n
\n\nbuildMode?\n\n\n\n\n\n\n\n[QwikBuildMode](#qwikbuildmode)\n\n\n\n\n_(Optional)_ Build `production` or `development`.\n\nDefault `development`\n\n\n
\n\ncsr?\n\n\n\n\n\n\n\nboolean\n\n\n\n\n_(Optional)_\n\n\n
\n\ndebug?\n\n\n\n\n\n\n\nboolean\n\n\n\n\n_(Optional)_ Prints verbose Qwik plugin debug logs.\n\nDefault `false`\n\n\n
\n\nentryStrategy?\n\n\n\n\n\n\n\nEntryStrategy\n\n\n\n\n_(Optional)_ The Qwik entry strategy to use while building for production. During development the type is always `segment`.\n\nDefault `{ type: \"smart\" }`)\n\n\n
\n\nexperimental?\n\n\n\n\n\n\n\n(keyof typeof [ExperimentalFeatures](#experimentalfeatures))\\[\\]\n\n\n\n\n_(Optional)_ Experimental features. These can come and go in patch releases, and their API is not guaranteed to be stable between releases.\n\n\n
\n\nlint?\n\n\n\n\n\n\n\nboolean\n\n\n\n\n_(Optional)_ Run eslint on the source files for the ssr build or dev server. This can slow down startup on large projects. Defaults to `true`\n\n\n
\n\nmanifestInput?\n\n\n\n\n\n\n\n[QwikManifest](#qwikmanifest)\n\n\n\n\n_(Optional)_ The SSR build requires the manifest generated during the client build. The `manifestInput` option can be used to manually provide a manifest.\n\nDefault `undefined`\n\n\n
\n\nmanifestOutput?\n\n\n\n\n\n\n\n(manifest: [QwikManifest](#qwikmanifest)) => Promise<void> \\| void\n\n\n\n\n_(Optional)_ The client build will create a manifest and this hook is called with the generated build data.\n\nDefault `undefined`\n\n\n
\n\noptimizerOptions?\n\n\n\n\n\n\n\nOptimizerOptions\n\n\n\n\n_(Optional)_\n\n\n
\n\nrootDir?\n\n\n\n\n\n\n\nstring\n\n\n\n\n_(Optional)_ The root of the application, which is commonly the same directory as `package.json` and `rollup.config.js`.\n\nDefault `process.cwd()`\n\n\n
\n\nsrcDir?\n\n\n\n\n\n\n\nstring\n\n\n\n\n_(Optional)_ The source directory to find all the Qwik components. Since Qwik does not have a single input, the `srcDir` is used to recursively find Qwik files.\n\nDefault `src`\n\n\n
\n\nsrcInputs?\n\n\n\n\n\n\n\nTransformModuleInput\\[\\] \\| null\n\n\n\n\n_(Optional)_ Alternative to `srcDir`, where `srcInputs` is able to provide the files manually. This option is useful for an environment without a file system, such as a webworker.\n\nDefault: `null`\n\n\n
\n\ntarget?\n\n\n\n\n\n\n\n[QwikBuildTarget](#qwikbuildtarget)\n\n\n\n\n_(Optional)_ Target `client` or `ssr`.\n\nDefault `client`\n\n\n
\n\ntransformedModuleOutput?\n\n\n\n\n\n\n\n((transformedModules: TransformModule\\[\\]) => Promise<void> \\| void) \\| null\n\n\n\n\n_(Optional)_ Hook that's called after the build and provides all of the transformed modules that were used before bundling.\n\n\n
", + "editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik-vite/src/plugins/rolldown.ts", + "mdFile": "qwik-vite.qwikrolldownpluginoptions.md" + }, { "name": "qwikRollup", "id": "qwikrollup", @@ -205,9 +233,9 @@ "id": "qwikrollup" } ], - "kind": "Function", - "content": "```typescript\nexport declare function qwikRollup(qwikRollupOpts?: QwikRollupPluginOptions): any;\n```\n\n\n\n\n
\n\nParameter\n\n\n\n\nType\n\n\n\n\nDescription\n\n\n
\n\nqwikRollupOpts\n\n\n\n\n[QwikRollupPluginOptions](#qwikrolluppluginoptions)\n\n\n\n\n_(Optional)_\n\n\n
\n\n**Returns:**\n\nany", - "editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik-vite/src/plugins/rollup.ts", + "kind": "Variable", + "content": "> Warning: This API is now obsolete.\n> \n> Use `qwikRolldown`.\n> \n\nRenamed to `qwikRolldown`.\n\n\n```typescript\nqwikRollup: typeof qwikRolldown\n```", + "editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik-vite/src/plugins/rolldown.ts", "mdFile": "qwik-vite.qwikrollup.md" }, { @@ -219,9 +247,9 @@ "id": "qwikrolluppluginoptions" } ], - "kind": "Interface", - "content": "```typescript\nexport interface QwikRollupPluginOptions \n```\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
\n\nProperty\n\n\n\n\nModifiers\n\n\n\n\nType\n\n\n\n\nDescription\n\n\n
\n\nbuildMode?\n\n\n\n\n\n\n\n[QwikBuildMode](#qwikbuildmode)\n\n\n\n\n_(Optional)_ Build `production` or `development`.\n\nDefault `development`\n\n\n
\n\ncsr?\n\n\n\n\n\n\n\nboolean\n\n\n\n\n_(Optional)_\n\n\n
\n\ndebug?\n\n\n\n\n\n\n\nboolean\n\n\n\n\n_(Optional)_ Prints verbose Qwik plugin debug logs.\n\nDefault `false`\n\n\n
\n\nentryStrategy?\n\n\n\n\n\n\n\nEntryStrategy\n\n\n\n\n_(Optional)_ The Qwik entry strategy to use while building for production. During development the type is always `segment`.\n\nDefault `{ type: \"smart\" }`)\n\n\n
\n\nexperimental?\n\n\n\n\n\n\n\n(keyof typeof [ExperimentalFeatures](#experimentalfeatures))\\[\\]\n\n\n\n\n_(Optional)_ Experimental features. These can come and go in patch releases, and their API is not guaranteed to be stable between releases.\n\n\n
\n\nlint?\n\n\n\n\n\n\n\nboolean\n\n\n\n\n_(Optional)_ Run eslint on the source files for the ssr build or dev server. This can slow down startup on large projects. Defaults to `true`\n\n\n
\n\nmanifestInput?\n\n\n\n\n\n\n\n[QwikManifest](#qwikmanifest)\n\n\n\n\n_(Optional)_ The SSR build requires the manifest generated during the client build. The `manifestInput` option can be used to manually provide a manifest.\n\nDefault `undefined`\n\n\n
\n\nmanifestOutput?\n\n\n\n\n\n\n\n(manifest: [QwikManifest](#qwikmanifest)) => Promise<void> \\| void\n\n\n\n\n_(Optional)_ The client build will create a manifest and this hook is called with the generated build data.\n\nDefault `undefined`\n\n\n
\n\noptimizerOptions?\n\n\n\n\n\n\n\nOptimizerOptions\n\n\n\n\n_(Optional)_\n\n\n
\n\nrootDir?\n\n\n\n\n\n\n\nstring\n\n\n\n\n_(Optional)_ The root of the application, which is commonly the same directory as `package.json` and `rollup.config.js`.\n\nDefault `process.cwd()`\n\n\n
\n\nsrcDir?\n\n\n\n\n\n\n\nstring\n\n\n\n\n_(Optional)_ The source directory to find all the Qwik components. Since Qwik does not have a single input, the `srcDir` is used to recursively find Qwik files.\n\nDefault `src`\n\n\n
\n\nsrcInputs?\n\n\n\n\n\n\n\nTransformModuleInput\\[\\] \\| null\n\n\n\n\n_(Optional)_ Alternative to `srcDir`, where `srcInputs` is able to provide the files manually. This option is useful for an environment without a file system, such as a webworker.\n\nDefault: `null`\n\n\n
\n\ntarget?\n\n\n\n\n\n\n\n[QwikBuildTarget](#qwikbuildtarget)\n\n\n\n\n_(Optional)_ Target `client` or `ssr`.\n\nDefault `client`\n\n\n
\n\ntransformedModuleOutput?\n\n\n\n\n\n\n\n((transformedModules: TransformModule\\[\\]) => Promise<void> \\| void) \\| null\n\n\n\n\n_(Optional)_ Hook that's called after the build and provides all of the transformed modules that were used before bundling.\n\n\n
", - "editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik-vite/src/plugins/rollup.ts", + "kind": "TypeAlias", + "content": "> Warning: This API is now obsolete.\n> \n> Use `QwikRolldownPluginOptions`.\n> \n\nRenamed to `QwikRolldownPluginOptions`.\n\n\n```typescript\nexport type QwikRollupPluginOptions = QwikRolldownPluginOptions;\n```\n**References:** [QwikRolldownPluginOptions](#qwikrolldownpluginoptions)", + "editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik-vite/src/plugins/rolldown.ts", "mdFile": "qwik-vite.qwikrolluppluginoptions.md" }, { @@ -248,7 +276,7 @@ } ], "kind": "Function", - "content": "The types for Vite/Rollup don't allow us to be too specific about the return type. The correct return type is `[QwikVitePlugin, VitePlugin]`, and if you search the plugin by name you'll get the `QwikVitePlugin`.\n\n\n```typescript\nexport declare function qwikVite(qwikViteOpts?: QwikVitePluginOptions): any;\n```\n\n\n\n\n
\n\nParameter\n\n\n\n\nType\n\n\n\n\nDescription\n\n\n
\n\nqwikViteOpts\n\n\n\n\n[QwikVitePluginOptions](#qwikvitepluginoptions)\n\n\n\n\n_(Optional)_\n\n\n
\n\n**Returns:**\n\nany", + "content": "The types for Vite/Rolldown don't allow us to be too specific about the return type. The correct return type is `[QwikVitePlugin, VitePlugin]`, and if you search the plugin by name you'll get the `QwikVitePlugin`.\n\n\n```typescript\nexport declare function qwikVite(qwikViteOpts?: QwikVitePluginOptions): any;\n```\n\n\n\n\n
\n\nParameter\n\n\n\n\nType\n\n\n\n\nDescription\n\n\n
\n\nqwikViteOpts\n\n\n\n\n[QwikVitePluginOptions](#qwikvitepluginoptions)\n\n\n\n\n_(Optional)_\n\n\n
\n\n**Returns:**\n\nany", "editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik-vite/src/plugins/vite.ts", "mdFile": "qwik-vite.qwikvite.md" }, diff --git a/packages/docs/src/routes/api/qwik-optimizer/index.mdx b/packages/docs/src/routes/api/qwik-optimizer/index.mdx index d11d37271e3..7f09d180e4e 100644 --- a/packages/docs/src/routes/api/qwik-optimizer/index.mdx +++ b/packages/docs/src/routes/api/qwik-optimizer/index.mdx @@ -672,11 +672,11 @@ The version of the manifest [Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik-vite/src/types.ts) -

qwikRollup

+

qwikRolldown

```typescript -export declare function qwikRollup( - qwikRollupOpts?: QwikRollupPluginOptions, +export declare function qwikRolldown( + qwikRolldownOpts?: QwikRolldownPluginOptions, ): any; ``` @@ -695,11 +695,11 @@ Description -qwikRollupOpts +qwikRolldownOpts -[QwikRollupPluginOptions](#qwikrolluppluginoptions) +[QwikRolldownPluginOptions](#qwikrolldownpluginoptions) @@ -712,12 +712,12 @@ _(Optional)_ any -[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik-vite/src/plugins/rollup.ts) +[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik-vite/src/plugins/rolldown.ts) -

QwikRollupPluginOptions

+

QwikRolldownPluginOptions

```typescript -export interface QwikRollupPluginOptions +export interface QwikRolldownPluginOptions ```
@@ -967,7 +967,37 @@ _(Optional)_ Hook that's called after the build and provides all of the transfor
-[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik-vite/src/plugins/rollup.ts) +[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik-vite/src/plugins/rolldown.ts) + +

qwikRollup

+ +> Warning: This API is now obsolete. +> +> Use `qwikRolldown`. + +Renamed to `qwikRolldown`. + +```typescript +qwikRollup: typeof qwikRolldown; +``` + +[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik-vite/src/plugins/rolldown.ts) + +

QwikRollupPluginOptions

+ +> Warning: This API is now obsolete. +> +> Use `QwikRolldownPluginOptions`. + +Renamed to `QwikRolldownPluginOptions`. + +```typescript +export type QwikRollupPluginOptions = QwikRolldownPluginOptions; +``` + +**References:** [QwikRolldownPluginOptions](#qwikrolldownpluginoptions) + +[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik-vite/src/plugins/rolldown.ts)

QwikSymbol

@@ -1147,7 +1177,7 @@ string \| null

qwikVite

-The types for Vite/Rollup don't allow us to be too specific about the return type. The correct return type is `[QwikVitePlugin, VitePlugin]`, and if you search the plugin by name you'll get the `QwikVitePlugin`. +The types for Vite/Rolldown don't allow us to be too specific about the return type. The correct return type is `[QwikVitePlugin, VitePlugin]`, and if you search the plugin by name you'll get the `QwikVitePlugin`. ```typescript export declare function qwikVite(qwikViteOpts?: QwikVitePluginOptions): any; 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 dda4c9e6dc1..3af505a10c2 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 358925df058..cb6cdbbd924 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 { docsUpdatedData } from './vite-docs-updated'; import { examplesData, playgroundData, rawSource, tutorialData } from './vite.repl-apps'; @@ -28,10 +28,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) { @@ -99,42 +99,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'; @@ -267,12 +231,11 @@ export default defineConfig(({ mode }) => { qwikReact(), qwikInsights({ publicApiKey: insightsApiKey }), tailwindcss(), - overrideManualChunksForRepl(), // qwikDevtools(), ], build: { sourcemap: true, - rollupOptions: { + rolldownOptions: { output: { assetFileNames: 'assets/[hash]-[name].[ext]', }, diff --git a/packages/docs/vite.repl-apps.ts b/packages/docs/vite.repl-apps.ts index a8f70a854b1..eb7e71d814b 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'; @@ -323,31 +323,36 @@ export function rawSource(): Plugin { }, }, - load(id) { - if (id.startsWith('\0raw-source:')) { - let path = id.slice('\0raw-source:'.length); - if (path.startsWith('/@fs/')) { - path = path.slice('/@fs'.length); - } - if (path.startsWith('\x00')) { - // let's just assume it's a path - path = path.slice(1); - } - if (isDev) { - const devUrl = `${base}@raw-fs${path}`; - return `export default "${devUrl}";`; + // `pre` so we own `\0raw-source:` ids before Vite's wasm-helper, which would otherwise + // try to parse a `.wasm` raw source as a real WASM module. + load: { + order: 'pre', + handler(id) { + if (id.startsWith('\0raw-source:')) { + let path = id.slice('\0raw-source:'.length); + if (path.startsWith('/@fs/')) { + path = path.slice('/@fs'.length); + } + if (path.startsWith('\x00')) { + // let's just assume it's a path + path = path.slice(1); + } + if (isDev) { + const devUrl = `${base}@raw-fs${path}`; + return `export default "${devUrl}";`; + } + const fileContent = readFileSync(path); + const ref = this.emitFile({ + type: 'asset', + name: basename(path), + source: fileContent, + }); + return { + code: `export default "@@RAW-URL_${ref}@@";`, + map: { version: 3, sources: [path], mappings: '' }, + }; } - const fileContent = readFileSync(path); - const ref = this.emitFile({ - type: 'asset', - name: basename(path), - source: fileContent, - }); - return { - code: `export default "@@RAW-URL_${ref}@@";`, - map: { version: 3, sources: [path], mappings: '' }, - }; - } + }, }, renderChunk(code, chunk) { 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 bb7deda0cd6..4636be28782 100644 --- a/packages/insights/package.json +++ b/packages/insights/package.json @@ -33,7 +33,7 @@ "tailwindcss": "4.2.4", "typescript": "5.9.3", "typescript-eslint": "8.56.1", - "vite": "7.3.5", + "vite": "8.2.0", "vite-tsconfig-paths": "6.1.1", "vitest": "4.1.10", "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 0ba493f41ca..a5e4a0c02b7 100644 --- a/packages/qwik-react/package.json +++ b/packages/qwik-react/package.json @@ -10,7 +10,7 @@ "react": "19.2.4", "react-dom": "19.2.4", "typescript": "5.9.3", - "vite": "7.3.5" + "vite": "8.2.0" }, "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": ">=8 <9" }, "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 ea14d9be064..8d1b565742c 100644 --- a/packages/qwik-router/package.json +++ b/packages/qwik-router/package.json @@ -27,7 +27,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" @@ -41,7 +40,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.2.0" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -170,7 +170,7 @@ "main": "./lib/index.qwik.mjs", "peerDependencies": { "@qwik.dev/core": "workspace:^", - "vite": ">=6 <9" + "vite": ">=8 <9" }, "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 b8b9bbb54e3..bcc412541c1 100644 --- a/packages/qwik-router/src/adapters/cloudflare-pages/vite/index.ts +++ b/packages/qwik-router/src/adapters/cloudflare-pages/vite/index.ts @@ -27,10 +27,9 @@ 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..71f5c7c2349 100644 --- a/packages/qwik-router/src/adapters/deno-server/vite/index.ts +++ b/packages/qwik-router/src/adapters/deno-server/vite/index.ts @@ -23,10 +23,9 @@ 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..1bdc78c8cd8 100644 --- a/packages/qwik-router/src/adapters/netlify-edge/vite/index.ts +++ b/packages/qwik-router/src/adapters/netlify-edge/vite/index.ts @@ -27,10 +27,9 @@ 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/shared/vite/index.ts b/packages/qwik-router/src/adapters/shared/vite/index.ts index 66d3f9d71f7..fca121c1fe7 100644 --- a/packages/qwik-router/src/adapters/shared/vite/index.ts +++ b/packages/qwik-router/src/adapters/shared/vite/index.ts @@ -83,7 +83,7 @@ export function viteAdapter(opts: ViteAdapterPluginOptions) { // the inherited objects are shared by reference with the top-level (ssr) config. environmentOptions.build = { ...environmentOptions.build, - rollupOptions: { ...environmentOptions.build?.rollupOptions, input: {} }, + rolldownOptions: { ...environmentOptions.build?.rolldownOptions, input: {} }, }; } }, @@ -126,7 +126,7 @@ export function viteAdapter(opts: ViteAdapterPluginOptions) { `import render from '${srcDir}/entry.ssr';`, `import qwikRouterConfig from '@qwik-router-config';`, `import { startWorker } from '@qwik.dev/router/ssg';`, - // Fire-and-forget (no top-level await): avoids a Rollup inlined-dynamic-import init-order + // Fire-and-forget (no top-level await): avoids an inlined-dynamic-import init-order // bug on the SSR target. See rollup/rollup#4166. `startWorker({ render, qwikRouterConfig }).catch((err) => {`, ` console.error(err);`, diff --git a/packages/qwik-router/src/adapters/shared/vite/index.unit.ts b/packages/qwik-router/src/adapters/shared/vite/index.unit.ts index 735b4206412..c93849c1f41 100644 --- a/packages/qwik-router/src/adapters/shared/vite/index.unit.ts +++ b/packages/qwik-router/src/adapters/shared/vite/index.unit.ts @@ -6,15 +6,15 @@ describe('viteAdapter ssg environment', () => { const [plugin] = viteAdapter({ name: 'test', origin: 'https://example.com' }) as any[]; // Vite shares inherited option objects by reference with the top-level (ssr) config. - const sharedRollupOptions = { input: ['src/entry.express.tsx'] }; - const ssgOptions = { build: { rollupOptions: sharedRollupOptions } }; + const sharedRolldownOptions = { input: ['src/entry.express.tsx'] }; + const ssgOptions = { build: { rolldownOptions: sharedRolldownOptions } }; plugin.configEnvironment('ssg', ssgOptions); - expect(ssgOptions.build.rollupOptions.input).toEqual({}); - expect(sharedRollupOptions.input).toEqual(['src/entry.express.tsx']); + expect(ssgOptions.build.rolldownOptions.input).toEqual({}); + expect(sharedRolldownOptions.input).toEqual(['src/entry.express.tsx']); - const ssrOptions = { build: { rollupOptions: { input: ['src/entry.express.tsx'] } } }; + const ssrOptions = { build: { rolldownOptions: { input: ['src/entry.express.tsx'] } } }; plugin.configEnvironment('ssr', ssrOptions); - expect(ssrOptions.build.rollupOptions.input).toEqual(['src/entry.express.tsx']); + expect(ssrOptions.build.rolldownOptions.input).toEqual(['src/entry.express.tsx']); }); it('builds the throwaway ssg output without minify or sourcemaps', () => { diff --git a/packages/qwik-router/src/adapters/shared/vite/post-build.ts b/packages/qwik-router/src/adapters/shared/vite/post-build.ts index 8399b9143f3..20f272733cf 100644 --- a/packages/qwik-router/src/adapters/shared/vite/post-build.ts +++ b/packages/qwik-router/src/adapters/shared/vite/post-build.ts @@ -82,7 +82,7 @@ const injectStatics = async (staticPathsCode: string, outDir: string) => { const code = await fs.promises.readFile(path, 'utf-8'); let replaced = false; - const newCode = code.replace(/(['"])__QWIK_ROUTER_STATIC_PATHS_ARRAY__\1/g, () => { + const newCode = code.replace(/(['"`])__QWIK_ROUTER_STATIC_PATHS_ARRAY__\1/g, () => { replaced = true; return staticPathsCode; }); 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..bcf41e9fde9 100644 --- a/packages/qwik-router/src/adapters/vercel-edge/vite/index.ts +++ b/packages/qwik-router/src/adapters/vercel-edge/vite/index.ts @@ -29,10 +29,9 @@ export function vercelEdgeAdapter(opts: VercelEdgeAdapterOptions = {}): any { build: { ssr: true, outDir, - rollupOptions: { + rolldownOptions: { output: { format: 'es', - hoistTransitiveImports: false, }, }, }, diff --git a/packages/qwik-router/src/buildtime/vite/plugin.ts b/packages/qwik-router/src/buildtime/vite/plugin.ts index 2f30598940e..fa9b2d5bbf2 100644 --- a/packages/qwik-router/src/buildtime/vite/plugin.ts +++ b/packages/qwik-router/src/buildtime/vite/plugin.ts @@ -7,10 +7,10 @@ import { findExports } from 'mlly'; import type { ConfigEnv, EnvironmentOptions, - HmrContext, + HotUpdateOptions, Plugin, PluginOption, - Rollup, + Rolldown, UserConfig, ViteDevServer, } from 'vite'; @@ -88,22 +88,25 @@ export function replaceLoaderPlaceholders( // Replace `_R: "__LOADERS:path1|path2__"` with the actual hash array, or strip the whole // `_R: ...` entry when no routeLoader$ was found — that way the client-side routing code // never sees a stale placeholder string and spreads it character-by-character. - return code.replace(/_R\s*:\s*"__LOADERS:([^"]+)__"\s*,?/g, (_match, paths: string) => { - const filePaths = paths.split('|'); - const hashes: string[] = []; - for (const filePath of filePaths) { - const fileHashes = loadersByFile.get(filePath); - if (fileHashes) { - hashes.push(...fileHashes); + return code.replace( + /_R\s*:\s*(["'`])__LOADERS:([^"'`]+)__\1\s*,?/g, + (_match, _q, paths: string) => { + const filePaths = paths.split('|'); + const hashes: string[] = []; + for (const filePath of filePaths) { + const fileHashes = loadersByFile.get(filePath); + if (fileHashes) { + hashes.push(...fileHashes); + } } + if (hashes.length > 0) { + return `_R: ${JSON.stringify(hashes)},`; + } + // Trailing commas inside object literals are legal, so removing a mid-object entry + // (and the trailing comma it emitted with) leaves the surrounding trie literal valid. + return ''; } - if (hashes.length > 0) { - return `_R: ${JSON.stringify(hashes)},`; - } - // Trailing commas inside object literals are legal, so removing a mid-object entry - // (and the trailing comma it emitted with) leaves the surrounding trie literal valid. - return ''; - }); + ); } export function addRouteLoaderHash( @@ -360,12 +363,6 @@ function qwikRouterPlugin( 'zod', ], }, - server: { - watch: { - // needed for recursive watching of index and layout files in the src/routes directory - disableGlobbing: false, - }, - }, }; return updatedViteConfig; }, @@ -442,13 +439,8 @@ function qwikRouterPlugin( async configureServer(server) { devServer = server; // recursively watch all route files in the src/routes directory - const toWatch = [ - join( - ctx!.opts.routesDir, - '**/{index,index!,index@*,layout,layout!,layout-*,error,404,entry,service-worker,menu}.{ts,tsx,js,jsx,md,mdx}' - ), - join(ctx!.opts.serverPluginsDir, 'plugin{,@*}.{ts,tsx,js,jsx}'), - ]; + // chokidar 4 dropped glob support, so watch the directories and filter on change + const toWatch = [ctx!.opts.routesDir, ctx!.opts.serverPluginsDir]; server.watcher.add(toWatch); await new Promise((resolve) => setTimeout(resolve, 1000)); server.watcher.on('change', (path) => { @@ -468,7 +460,11 @@ function qwikRouterPlugin( } }, - handleHotUpdate({ file, modules, server, timestamp }: HmrContext) { + hotUpdate({ file, modules, timestamp }: HotUpdateOptions) { + const server = devServer; + if (!server) { + return; + } // Route CSS is injected as a ; swap it in place rather than forcing a restart. if (sendRouterCssHotUpdate(server, file, timestamp)) { return []; @@ -477,19 +473,21 @@ function qwikRouterPlugin( if (!ctx) { return; } + // hotUpdate runs per environment, so only this environment's config module can be returned. + const configModule = this.environment.moduleGraph.getModuleById(QWIK_ROUTER_CONFIG_ID); if (!isRouterSourceFileForContext(file, ctx)) { if ( clearedLoaderHashes || isDiscoveredRouteLoaderSource(file, reExportedRouteLoaderSources) ) { - const configModules = invalidateRouterConfigModules(server); - return [...modules, ...configModules]; + invalidateRouterConfigModules(server); + return configModule ? [...modules, configModule] : modules; } return; } ctx.isDirty = true; - const configModules = invalidateRouterConfigModules(server); - return [...modules, ...configModules]; + invalidateRouterConfigModules(server); + return configModule ? [...modules, configModule] : modules; }, transformIndexHtml() { @@ -599,7 +597,7 @@ function qwikRouterPlugin( if (e && typeof e == 'object' && 'position' in e && 'reason' in e) { const column = (e as any).position?.start.column; const line = (e as any).position?.start.line; - const err: Rollup.RollupError = Object.assign(new Error(e.reason), { + const err: Rolldown.RolldownError = Object.assign(new Error(e.reason), { id, plugin: 'qwik-router-mdx', loc: { @@ -717,7 +715,7 @@ function serverFnsPlugin(buildContextRef: BuildContextRef): Plugin { } reset(); - async function collectServerFnModules(this: Rollup.PluginContext) { + async function collectServerFnModules(this: Rolldown.PluginContext) { if (serverFnsReady) { await serverFnsReady; return; diff --git a/packages/qwik-router/src/ssg/bundle-isolation.unit.ts b/packages/qwik-router/src/ssg/bundle-isolation.unit.ts index 02d0ec99590..dfa5914a834 100644 --- a/packages/qwik-router/src/ssg/bundle-isolation.unit.ts +++ b/packages/qwik-router/src/ssg/bundle-isolation.unit.ts @@ -2,7 +2,7 @@ import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises'; import { tmpdir } from 'node:os'; import { basename, join } from 'node:path'; import { fileURLToPath } from 'node:url'; -import { build, type Rollup } from 'vite'; +import { build, type Rolldown } from 'vite'; import { describe, expect, it } from 'vitest'; // run-ssg builds as two entries: the worker entry owns the render machinery, the main entry's static @@ -58,7 +58,7 @@ describe('SSG worker bundle isolation', () => { minify: false, outDir, ssr: true, - rollupOptions: { + rolldownOptions: { input: { 'run-ssg': join(appDir, 'run-ssg.ts'), 'run-ssg-worker': join(appDir, 'run-ssg-worker.ts'), @@ -68,10 +68,10 @@ describe('SSG worker bundle isolation', () => { }, }); - const outputs = Array.isArray(result) ? result : [result as Rollup.RollupOutput]; + const outputs = Array.isArray(result) ? result : [result as Rolldown.RolldownOutput]; const chunks = outputs .flatMap((o) => o.output) - .filter((c): c is Rollup.OutputChunk => c.type === 'chunk'); + .filter((c): c is Rolldown.OutputChunk => c.type === 'chunk'); const byFile = new Map(chunks.map((c) => [c.fileName, c])); const mainEntry = chunks.find((c) => c.isEntry && /^run-ssg\./.test(basename(c.fileName))); diff --git a/packages/qwik-router/vite.config.ts b/packages/qwik-router/vite.config.ts index 731b55a9d45..7211b5b94e6 100644 --- a/packages/qwik-router/vite.config.ts +++ b/packages/qwik-router/vite.config.ts @@ -12,7 +12,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 d9719483068..ffb55d81f67 100644 --- a/packages/qwik-vite/package.json +++ b/packages/qwik-vite/package.json @@ -2,7 +2,9 @@ "name": "@qwik.dev/qwik-vite", "devDependencies": { "image-size": "1.2.1", - "magic-string": "0.30.21" + "magic-string": "0.30.21", + "rolldown": "1.2.2", + "vite": "8.2.0" }, "private": true } diff --git a/packages/qwik-vite/src/index.ts b/packages/qwik-vite/src/index.ts index 081cd5e857b..a2134196a81 100644 --- a/packages/qwik-vite/src/index.ts +++ b/packages/qwik-vite/src/index.ts @@ -1,5 +1,5 @@ /** - * The Qwik Vite/Rollup plugin. + * The Qwik Vite/Rolldown plugin. * * This is bundled as part of the Qwik Core package */ @@ -7,8 +7,8 @@ export type * from './types'; export type { BundleGraphAdder } from './plugins/bundle-graph'; export type { ExperimentalFeatures, QwikBuildMode, QwikBuildTarget } from './plugins/plugin'; -export type { QwikRollupPluginOptions } from './plugins/rollup'; +export type { QwikRolldownPluginOptions, QwikRollupPluginOptions } from './plugins/rolldown'; export type { QwikVitePlugin, QwikVitePluginApi, QwikVitePluginOptions } from './plugins/vite'; -export { qwikRollup } from './plugins/rollup'; +export { qwikRolldown, qwikRollup } from './plugins/rolldown'; export { qwikVite } from './plugins/vite'; diff --git a/packages/qwik-vite/src/manifest.ts b/packages/qwik-vite/src/manifest.ts index 8ab95b67e48..9b0a3deb416 100644 --- a/packages/qwik-vite/src/manifest.ts +++ b/packages/qwik-vite/src/manifest.ts @@ -1,4 +1,4 @@ -import type { Rollup } from 'vite'; +import type { Rolldown } from 'vite'; import { type NormalizedQwikPluginOptions } from './plugins/plugin'; import { condenseImportGraph } from './plugins/bundle-graph'; import type { GlobalInjections, Path, QwikBundle, QwikManifest, SegmentAnalysis } from './types'; @@ -346,9 +346,6 @@ 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$/; /** * 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. @@ -357,10 +354,11 @@ export function generateManifestFromBundles( path: Path, segments: SegmentAnalysis[], injections: GlobalInjections[], - outputBundles: Rollup.OutputBundle, + outputBundles: Rolldown.OutputBundle, opts: NormalizedQwikPluginOptions, debug: (...args: any[]) => void, - canonPath: (p: string) => string + canonPath: (p: string) => string, + qwikLoaderFileName?: string ) { // Note that this will be the order of the JSON file const manifest: QwikManifest = { @@ -397,16 +395,22 @@ export function generateManifestFromBundles( let preloaderBundleName: string | undefined; let qwikHandlersName: string | undefined; + // The qwikloader is emitFile'd, so its output name comes from the emit reference — never matched + // by chunk name, which a user route like /qwikloader would shadow. + manifest.qwikLoader = qwikLoaderFileName ? canonPath(qwikLoaderFileName) : undefined; + + // core and preloader are code-splitting groups (no emit reference), so we match them by the group + // name assigned in qwik-vite plugin.ts. The qwik-core group bundles core runtime + handlers. for (const outputBundle of Object.values(outputBundles)) { const bundleFileName = getBundleName(outputBundle.fileName); - if (outputBundle.name === 'core') { + if (outputBundle.name === 'qwik-core') { coreBundleName = bundleFileName; + qwikHandlersName = bundleFileName; + manifest.core = bundleFileName; } - if (outputBundle.name === 'preloader') { + if (outputBundle.name === 'qwik-preloader') { preloaderBundleName = bundleFileName; - } - if (outputBundle.name === 'handlers') { - qwikHandlersName = bundleFileName; + manifest.preloader = bundleFileName; } } // We need to find our QRL exports @@ -440,8 +444,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[]; @@ -449,40 +451,18 @@ 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) { bundle.dynamicImports = bundleDynamicImports; } - // It can happen that our modules end up in facades, not nice but needs handling - if (outputBundle.facadeModuleId) { - if (preloaderRegex.test(outputBundle.facadeModuleId)) { - manifest.preloader = bundleFileName; - } else if (coreRegex.test(outputBundle.facadeModuleId)) { - manifest.core = bundleFileName; - } else if (qwikLoaderRegex.test(outputBundle.facadeModuleId)) { - manifest.qwikLoader = bundleFileName; - } - } - // Rollup doesn't provide the moduleIds in the outputBundle but Vite does const ids = outputBundle.moduleIds || Object.keys(outputBundle.modules); const modulePaths = ids .filter((m) => !m.startsWith(`\u0000`)) .map((m) => path.relative(opts.rootDir, m)); if (modulePaths.length > 0) { bundle.origins = modulePaths; - // keep these if statements separate so that weird bundling still works - if (!manifest.preloader && modulePaths.some((m) => preloaderRegex.test(m))) { - manifest.preloader = bundleFileName; - } - if (!manifest.core && modulePaths.some((m) => coreRegex.test(m))) { - manifest.core = bundleFileName; - } - if (!manifest.qwikLoader && modulePaths.some((m) => qwikLoaderRegex.test(m))) { - manifest.qwikLoader = bundleFileName; - } } manifest.bundles[bundleFileName] = bundle; diff --git a/packages/qwik-vite/src/manifest.unit.ts b/packages/qwik-vite/src/manifest.unit.ts new file mode 100644 index 00000000000..ea585b589cc --- /dev/null +++ b/packages/qwik-vite/src/manifest.unit.ts @@ -0,0 +1,74 @@ +import path from 'node:path'; +import { describe, expect, test } from 'vitest'; +import { generateManifestFromBundles } from './manifest'; + +describe('generateManifestFromBundles', () => { + const chunk = (name: string, fileName: string, moduleIds: string[] = []) => ({ + type: 'chunk' as const, + name, + fileName, + code: '', + exports: [], + imports: [], + dynamicImports: [], + moduleIds, + modules: {}, + }); + + const generate = ( + bundles: Record>, + qwikLoaderFileName?: string + ) => + generateManifestFromBundles( + path as any, + [], + [], + bundles as any, + { rootDir: '/', outDir: '/' } as any, + () => {}, + (p) => p, + qwikLoaderFileName + ); + + test('identifies core/preloader by group name and the loader by its emit file name', () => { + const manifest = generate( + { + 'q-core.js': chunk('qwik-core', 'q-core.js', [ + '/app/node_modules/@qwik.dev/core/dist/core.prod.mjs', + '/app/node_modules/@qwik.dev/core/handlers.mjs', + ]), + 'q-loader.js': chunk('qwikloader', 'q-loader.js'), + 'q-preloader.js': chunk('qwik-preloader', 'q-preloader.js'), + 'q-app.js': chunk('app', 'q-app.js'), + }, + 'q-loader.js' + ); + + expect(manifest.core).toBe('q-core.js'); + expect(manifest.qwikLoader).toBe('q-loader.js'); + expect(manifest.preloader).toBe('q-preloader.js'); + // Core handler symbols (e.g. _run) map to the qwik-core chunk, which also holds handlers. + expect(manifest.mapping['_run']).toBe('q-core.js'); + expect(manifest.symbols['_run']?.origin).toBe('Qwik core'); + }); + + test('a user route named "qwikloader" does not shadow the real loader chunk', () => { + // Regression: a /qwikloader route chunk is also named "qwikloader"; the loader is taken from its + // emit file name, so the route chunk cannot hijack the manifest pointer. + const manifest = generate( + { + 'q-loader.js': chunk('qwikloader', 'q-loader.js'), + 'q-route.js': chunk('qwikloader', 'q-route.js'), + }, + 'q-loader.js' + ); + + expect(manifest.qwikLoader).toBe('q-loader.js'); + }); + + test('leaves core handler symbols unmapped when no qwik-core chunk exists', () => { + const manifest = generate({ 'q-app.js': chunk('app', 'q-app.js') }); + expect(manifest.core).toBeUndefined(); + expect(manifest.mapping['_run']).toBeUndefined(); + }); +}); diff --git a/packages/qwik-vite/src/plugins/bundle-graph.unit.ts b/packages/qwik-vite/src/plugins/bundle-graph.unit.ts index 6a705f1d6f9..3ba9cbd9db7 100644 --- a/packages/qwik-vite/src/plugins/bundle-graph.unit.ts +++ b/packages/qwik-vite/src/plugins/bundle-graph.unit.ts @@ -250,127 +250,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, @@ -379,19 +398,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/eslint-plugin.ts b/packages/qwik-vite/src/plugins/eslint-plugin.ts index 61627f752d6..27569e35803 100644 --- a/packages/qwik-vite/src/plugins/eslint-plugin.ts +++ b/packages/qwik-vite/src/plugins/eslint-plugin.ts @@ -1,9 +1,9 @@ -import type { Rollup } from 'vite'; +import type { Rolldown } from 'vite'; import type { ESLint, Linter } from 'eslint'; import type { OptimizerSystem } from '../types'; export interface QwikLinter { - lint(ctx: Rollup.PluginContext, code: string, id: string): void; + lint(ctx: Rolldown.PluginContext, code: string, id: string): void; } export async function createLinter( @@ -39,7 +39,7 @@ export async function createLinter( } return { - async lint(ctx: Rollup.PluginContext, code: string, id: string) { + async lint(ctx: Rolldown.PluginContext, code: string, id: string) { try { const filePath = parseRequest(id); if (await eslint.isPathIgnored(filePath)) { @@ -70,7 +70,7 @@ function parseRequest(id: string) { } function createRollupError(id: string, reportMessage: Linter.LintMessage) { - const err: Rollup.RollupError = Object.assign(new Error(reportMessage.message), { + const err: Rolldown.RolldownError = Object.assign(new Error(reportMessage.message), { id, plugin: 'vite-plugin-eslint', loc: { diff --git a/packages/qwik-vite/src/plugins/fixture-output-bundles.json b/packages/qwik-vite/src/plugins/fixture-output-bundles.json index d1a1ae3ea20..5cd6fe422bf 100644 --- a/packages/qwik-vite/src/plugins/fixture-output-bundles.json +++ b/packages/qwik-vite/src/plugins/fixture-output-bundles.json @@ -685,7 +685,7 @@ "\u0000vite/preload-helper.js", "/home/wmertens/Projects/qwik/packages/qwik/dist/preloader.mjs" ], - "name": "preloader", + "name": "qwik-preloader", "type": "chunk", "dynamicImports": [], "fileName": "build/preloader.js", @@ -768,7 +768,7 @@ "/home/wmertens/Projects/qwik/packages/qwik/dist/core.min.mjs", "/home/wmertens/Projects/qwik/packages/qwik/handlers.mjs" ], - "name": "handlers", + "name": "qwik-core", "type": "chunk", "dynamicImports": [], "fileName": "build/handlers.js", diff --git a/packages/qwik-vite/src/plugins/plugin.ts b/packages/qwik-vite/src/plugins/plugin.ts index d60ecccc5ae..2ffa61eaeac 100644 --- a/packages/qwik-vite/src/plugins/plugin.ts +++ b/packages/qwik-vite/src/plugins/plugin.ts @@ -1,4 +1,5 @@ -import type { DevEnvironment, HotUpdateOptions, Plugin, Rollup, ViteDevServer } from 'vite'; +import type { CodeSplittingOptions, ChunkingContext } from 'rolldown'; +import type { DevEnvironment, HotUpdateOptions, Plugin, Rolldown, ViteDevServer } from 'vite'; import { hashCode } from '../../../qwik/src/core/shared/utils/hash_code'; import { generateManifestFromBundles, getValidManifest } from '../manifest'; import type { @@ -24,7 +25,7 @@ import { isServerOnlyModule, mightContainServerOnlyImport, } from './server-only-modules'; -import { isVirtualId, isWin, parseId } from './vite-utils'; +import { isVirtualId, isWin, parseId, sanitizeChunkGroupName } from './vite-utils'; import MagicString from 'magic-string'; import { createDevWorkerQrlChunkResolver, @@ -425,7 +426,8 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { let optimizer: Optimizer; let shouldAddHandlers = false; - const buildStart = async (_ctx: Rollup.PluginContext) => { + let qwikLoaderChunkRef: string | undefined; + const buildStart = async (_ctx: Rolldown.PluginContext) => { debug(`buildStart()`, opts.buildMode, opts.scope, opts.target, opts.rootDir, opts.srcDir); optimizer = getOptimizer(); shouldAddHandlers = !devServer; @@ -441,13 +443,15 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { clientTransformedOutputs.clear(); serverTransformedOutputs.clear(); + qwikLoaderChunkRef = undefined; if (opts.target === 'client' && !devServer) { // emitFile() is only supported during build, not in Vite serve mode const ql = await _ctx.resolve('@qwik.dev/core/qwikloader.js', undefined, { skipSelf: true, }); if (ql) { - _ctx.emitFile({ + // Keep the reference so the manifest can resolve the loader's output name authoritatively. + qwikLoaderChunkRef = _ctx.emitFile({ id: ql.id, type: 'chunk', preserveSignature: 'allow-extension', @@ -457,7 +461,7 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { }; /** Determine if the current module is being processed for a server environment. */ - const getIsServer = (ctx: Rollup.PluginContext, viteOpts?: { ssr?: boolean }) => { + const getIsServer = (ctx: Rolldown.PluginContext, viteOpts?: { ssr?: boolean }) => { return ctx.environment ? ctx.environment.config.consumer === 'server' : devServer @@ -484,7 +488,7 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { return normalizedImportId.includes('.server') || /(^|\/)server(\/|$)/.test(normalizedImportId); }; - const getImportSpecifiers = (ctx: Rollup.PluginContext, code: string): string[] => { + const getImportSpecifiers = (ctx: Rolldown.PluginContext, code: string): string[] => { const imports = new Set(); const addSource = (source: any) => { @@ -532,7 +536,7 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { }; const assertClientTransformCanImport = async ( - ctx: Rollup.PluginContext, + ctx: Rolldown.PluginContext, code: string, resolveImporterId: string, importerId = resolveImporterId @@ -553,7 +557,7 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { }; const assertClientTransformOutputCanImport = async ( - ctx: Rollup.PluginContext, + ctx: Rolldown.PluginContext, output: TransformOutput, srcDir: string, importerId?: string, @@ -570,7 +574,7 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { }; const resolveTransformableImport = async ( - ctx: Rollup.PluginContext, + ctx: Rolldown.PluginContext, importId: string, importerId: string ) => { @@ -592,7 +596,7 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { }; const restoreSsrImportGraphEdges = async ( - ctx: Rollup.PluginContext, + ctx: Rolldown.PluginContext, inputImports: string[], importerId: string ): Promise => { @@ -624,7 +628,7 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { * `load()` phase ensure it is built first. */ const resolveId = async ( - ctx: Rollup.PluginContext, + ctx: Rolldown.PluginContext, id: string, importerId: string | undefined, resolveOpts?: QwikResolveIdOptions @@ -682,7 +686,7 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { const parsedId = parseId(id); const pathId = normalizePath(parsedId.pathId); - let result: Rollup.ResolveIdResult; + let result: Rolldown.ResolveIdResult; /** At this point, the request has been normalized. */ if (!(devServer && resolveOpts?.scan)) { @@ -818,10 +822,10 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { let loadCount = 0; const load = async ( - ctx: Rollup.PluginContext, + ctx: Rolldown.PluginContext, id: string, loadOpts?: Parameters>[1] - ): Promise => { + ): Promise => { if (id === '\0editor') { // This doesn't get used, but we need to return something return '"opening in editor"'; @@ -931,11 +935,11 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { let theManifest: string | null | undefined; let transformCount = 0; const transform = async function ( - ctx: Rollup.PluginContext, + ctx: Rolldown.PluginContext, code: string, id: string, transformOpts = {} as Parameters>[2] - ): Promise { + ): Promise { if (isVirtualId(id)) { return; } @@ -1099,6 +1103,9 @@ 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); + } // TODO handle noop modules if (mod !== module) { const key = normalizePath(path.join(srcDir, mod.path)); @@ -1176,7 +1183,10 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { canonPath: (p: string) => string; }; - const createOutputAnalyzer = (rollupBundle: Rollup.OutputBundle) => { + const createOutputAnalyzer = ( + rollupBundle: Rolldown.OutputBundle, + qwikLoaderFileName?: string + ) => { const injections: GlobalInjections[] = []; const outputAnalyzer: OutputAnalyzer = { @@ -1204,7 +1214,8 @@ export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) { rollupBundle, opts, debug, - canonPath + canonPath, + qwikLoaderFileName ); if (extra) { Object.assign(manifest, extra); @@ -1355,59 +1366,77 @@ export const isDev = ${JSON.stringify(isDev)}; } } - const manualChunks: NonNullable = ( - id: string, - { getModuleInfo } - ) => { - if (opts.target === 'client') { - if ( - // The preloader has to stay in a separate chunk if it's a client build - id.endsWith('@qwik.dev/core/build') || - /[/\\](core|qwik)[/\\]dist[/\\]preloader\.[cm]js$/.test(id) - ) { - return 'qwik-preloader'; - } else if ( - // likewise, core and handlers have to be in the same chunk so there's no import waterfall - /[/\\](core|qwik)[/\\](handlers|dist[/\\]core(\.prod|\.min)?)\.[cm]js$/.test(id) - ) { - return 'qwik-core'; - } else if (/[/\\](core|qwik)[/\\]dist[/\\]qwikloader\.js$/.test(id)) { - return 'qwik-loader'; - } + 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); + }; - const module = getModuleInfo(id); + // Eagerly-loaded contexts stay with their parent rather than grouping into a segment chunk. + const EAGER_CTX_NAMES = new Set(['qwikify$', 'useVisibleTask$', 'useComputed$']); + const mergeRelatedSegments = (id: string, ctx: ChunkingContext) => { + const module = ctx?.getModuleInfo(id); if (module) { const segment = module.meta.segment as SegmentAnalysis | undefined; if (segment) { // TODO: Remove useComputed$ once we don't need to eagerly load them anymore - if (['qwikify$', 'useVisibleTask$', 'useComputed$'].includes(segment.ctxName)) { + if (EAGER_CTX_NAMES.has(segment.ctxName)) { return null; } const { hash } = segment; - - // We use the manual entry strategy to group segments together based on their common entry or Qwik Insights provided hash + // Group segments by their common entry (or Qwik Insights hash), incl. node_modules qwik libs. + // segment.entry is already sanitized at transform; a user `manual` name may not be. const chunkName = (opts.entryStrategy as SmartEntryStrategy).manual?.[hash] || segment.entry; if (chunkName) { - // we group related segments together based on their common entry or Qwik Insights provided hash - // This not only applies to source files, but also qwik libraries files that are imported through node_modules - return chunkName; + return sanitizeChunkGroupName(chunkName); } } } - - // The rest is non-qwik code. We let rollup handle it. + // The rest is non-qwik code. We let the bundler handle it. return null; }; + /** + * Client-only chunking. The server bundle doesn't need it, and the manifest only ever reads + * client bundles. The qwikloader is resolved by its emit reference instead of a group, so a + * same-named route chunk can't shadow it. + */ + const codeSplitting = (): CodeSplittingOptions => ({ + includeDependenciesRecursively: false, + groups: [ + // core and handlers must share a chunk so there's no import waterfall + { + name: 'qwik-core', + test: /[/\\](core|qwik)[/\\](handlers|dist[/\\]core(\.prod|\.min)?)\.[cm]js$/, + }, + { + name: 'qwik-preloader', + test: /(?:@qwik\.dev\/core\/build|[/\\](?:core|qwik)[/\\]dist[/\\]preloader\.[cm]js)$/, + }, + { name: mergeRelatedSegments }, + ], + }); + async function generateManifest( - ctx: Rollup.PluginContext, - rollupBundle: Rollup.OutputBundle, + ctx: Rolldown.PluginContext, + rollupBundle: Rolldown.OutputBundle, bundleGraphAdders?: Set, manifestExtra?: Partial ) { - const outputAnalyzer = createOutputAnalyzer(rollupBundle); + const qwikLoaderFileName = qwikLoaderChunkRef ? ctx.getFileName(qwikLoaderChunkRef) : undefined; + const outputAnalyzer = createOutputAnalyzer(rollupBundle, qwikLoaderFileName); const manifest = await outputAnalyzer.generateManifest(manifestExtra); manifest.platform = { @@ -1475,7 +1504,7 @@ export const isDev = ${JSON.stringify(isDev)}; setSourceMapSupport, 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 2a0cc9ec0ae..6656fb8de17 100644 --- a/packages/qwik-vite/src/plugins/plugin.unit.ts +++ b/packages/qwik-vite/src/plugins/plugin.unit.ts @@ -5,7 +5,7 @@ import type { QwikManifest } from '../types'; import { ExperimentalFeatures, createQwikPlugin } from './plugin'; import { isServerOnlyModule } from './server-only-modules'; import { qwikVite } from './vite'; -import type { ResolvedId } from 'rollup'; +import type { ResolvedId } from 'rolldown'; const cwd = process.cwd(); diff --git a/packages/qwik-vite/src/plugins/rollup.ts b/packages/qwik-vite/src/plugins/rolldown.ts similarity index 55% rename from packages/qwik-vite/src/plugins/rollup.ts rename to packages/qwik-vite/src/plugins/rolldown.ts index 8408ea73a5f..f1e63452736 100644 --- a/packages/qwik-vite/src/plugins/rollup.ts +++ b/packages/qwik-vite/src/plugins/rolldown.ts @@ -1,4 +1,5 @@ -import type { Rollup } from 'vite'; +import type { OutputOptions } from 'rolldown'; +import type { Rolldown } from 'vite'; import type { Diagnostic, EntryStrategy, @@ -17,20 +18,19 @@ import { type QwikPlugin, type QwikPluginOptions, } from './plugin'; -import { findDepPkgJsonPath } from './utils'; -import { isVirtualId } from './vite-utils'; +import { createRolldownError, flattenToChunkName, isVirtualId } from './vite-utils'; -type QwikRollupPluginApi = { +type QwikRolldownPluginApi = { getOptimizer: () => Optimizer; getOptions: () => NormalizedQwikPluginOptions; }; /** @public */ -export function qwikRollup(qwikRollupOpts: QwikRollupPluginOptions = {}): any { - const qwikPlugin = createQwikPlugin(qwikRollupOpts.optimizerOptions); +export function qwikRolldown(qwikRolldownOpts: QwikRolldownPluginOptions = {}): any { + const qwikPlugin = createQwikPlugin(qwikRolldownOpts.optimizerOptions); - const rollupPlugin: QwikRollupPlugin = { - name: 'rollup-plugin-qwik', + const rolldownPlugin: QwikRolldownPlugin = { + name: 'rolldown-plugin-qwik', api: { getOptimizer: () => qwikPlugin.getOptimizer(), @@ -40,31 +40,23 @@ export function qwikRollup(qwikRollupOpts: QwikRollupPluginOptions = {}): any { async options(inputOpts) { await qwikPlugin.init(); - const origOnwarn = inputOpts.onwarn; - inputOpts.onwarn = (warning, warn) => { - if (warning.plugin === 'typescript' && warning.message.includes('outputToFilesystem')) { - return; - } - origOnwarn ? origOnwarn(warning, warn) : warn(warning); - }; - const pluginOpts: QwikPluginOptions = { - csr: qwikRollupOpts.csr, - target: qwikRollupOpts.target, - buildMode: qwikRollupOpts.buildMode, - debug: qwikRollupOpts.debug, - entryStrategy: qwikRollupOpts.entryStrategy, - rootDir: qwikRollupOpts.rootDir, - srcDir: qwikRollupOpts.srcDir, - srcInputs: qwikRollupOpts.srcInputs, + csr: qwikRolldownOpts.csr, + target: qwikRolldownOpts.target, + buildMode: qwikRolldownOpts.buildMode, + debug: qwikRolldownOpts.debug, + entryStrategy: qwikRolldownOpts.entryStrategy, + rootDir: qwikRolldownOpts.rootDir, + srcDir: qwikRolldownOpts.srcDir, + srcInputs: qwikRolldownOpts.srcInputs, input: inputOpts.input as string, resolveQwikBuild: true, - manifestOutput: qwikRollupOpts.manifestOutput, - manifestInput: qwikRollupOpts.manifestInput, - transformedModuleOutput: qwikRollupOpts.transformedModuleOutput, - inlineStylesUpToBytes: qwikRollupOpts.optimizerOptions?.inlineStylesUpToBytes, - lint: qwikRollupOpts.lint, - experimental: qwikRollupOpts.experimental, + manifestOutput: qwikRolldownOpts.manifestOutput, + manifestInput: qwikRolldownOpts.manifestInput, + transformedModuleOutput: qwikRolldownOpts.transformedModuleOutput, + inlineStylesUpToBytes: qwikRolldownOpts.optimizerOptions?.inlineStylesUpToBytes, + lint: qwikRolldownOpts.lint, + experimental: qwikRolldownOpts.experimental, }; await qwikPlugin.normalizeOptions(pluginOpts); @@ -75,10 +67,10 @@ export function qwikRollup(qwikRollupOpts: QwikRollupPluginOptions = {}): any { return inputOpts; }, - outputOptions(rollupOutputOpts) { - return normalizeRollupOutputOptionsObject( + outputOptions(outputOpts_arr) { + return normalizeRolldownOutputObject( qwikPlugin, - rollupOutputOpts, + outputOpts_arr, qwikPlugin.getOptions().outDir ) as any; }, @@ -88,9 +80,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)); } }); }); @@ -128,27 +120,25 @@ export function qwikRollup(qwikRollupOpts: QwikRollupPluginOptions = {}): any { }, }; - return rollupPlugin; + return rolldownPlugin; } -export async function normalizeRollupOutputOptions( +export function normalizeRolldownOutputOptions( qwikPlugin: QwikPlugin, - rollupOutputOpts: Rollup.OutputOptions | Rollup.OutputOptions[] | undefined -): Promise { - if (Array.isArray(rollupOutputOpts)) { + outputOpts_arr: OutputOptions | OutputOptions[] | undefined +): OutputOptions | OutputOptions[] { + if (Array.isArray(outputOpts_arr)) { // make sure at least one output is present in every case - if (!rollupOutputOpts.length) { - rollupOutputOpts.push({}); + if (!outputOpts_arr.length) { + outputOpts_arr.push({}); } - return await Promise.all( - rollupOutputOpts.map((outputOptsObj) => - normalizeRollupOutputOptionsObject(qwikPlugin, outputOptsObj) - ) + return outputOpts_arr.map((outputOptsObj) => + normalizeRolldownOutputObject(qwikPlugin, outputOptsObj) ); } - return normalizeRollupOutputOptionsObject(qwikPlugin, rollupOutputOpts); + return normalizeRolldownOutputObject(qwikPlugin, outputOpts_arr); } const normalizeChunkPathPrefix = (prefix: string) => { @@ -172,7 +162,7 @@ const getChunkFileName = ( return `${chunkPathPrefix}q-[hash].js`; } else { // Friendlier names in dev or preview with debug mode - return (chunkInfo: Rollup.PreRenderedChunk) => { + return (chunkInfo: Rolldown.PreRenderedChunk) => { if (chunkInfo.moduleIds?.some((id) => /core\.(prod|min)\.mjs$/.test(id))) { return `${chunkPathPrefix}core.js`; } @@ -181,28 +171,23 @@ 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. + // Besides, the bundler 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 - .replace(/^(\.\.\/)+/, '') - .replace(/^\/+/, '') - .replace(/\//g, '-'); - return `${chunkPathPrefix}${sanitized}.js`; + return `${chunkPathPrefix}${flattenToChunkName(relativePath)}.js`; }; } }; -export async function normalizeRollupOutputOptionsObject( +export function normalizeRolldownOutputObject( qwikPlugin: QwikPlugin, - rollupOutputOptsObj: Rollup.OutputOptions | undefined, - // Force `dir` for the standalone Rollup plugin (no Vite to derive it). Vite passes undefined so + rolldownOutputOptsObj: OutputOptions | undefined, + // Force `dir` for the standalone plugin (no Vite to derive it). Vite passes undefined so // each environment's `build.outDir` resolves it — letting a custom env (e.g. `ssg`) use its own. outDir?: string -): Promise { - const outputOpts: Rollup.OutputOptions = { ...rollupOutputOptsObj }; +): OutputOptions { + const outputOpts: OutputOptions = { ...rolldownOutputOptsObj }; const opts = qwikPlugin.getOptions(); const optimizer = qwikPlugin.getOptimizer(); - const manualChunks = qwikPlugin.manualChunks; if (!outputOpts.assetFileNames) { // SEO likes readable asset names. Set `output.assetFileNames` to relocate assets. @@ -223,18 +208,19 @@ 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'); + + const userCodeSplitting = outputOpts.codeSplitting; + if (typeof userCodeSplitting === 'boolean') { + throw new Error( + 'codeSplitting must be a `codeSplitting: { groups: [...] }` object so Qwik can group qrl segments back together without causing network waterfalls.' + ); } - // 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']); + // Qwik's groups come first; user groups can outrank them with an explicit `priority`. + const qwikCodeSplitting = qwikPlugin.codeSplitting(); + outputOpts.codeSplitting = { + includeDependenciesRecursively: qwikCodeSplitting.includeDependenciesRecursively, + groups: [...(qwikCodeSplitting.groups ?? []), ...(userCodeSplitting?.groups ?? [])], + }; } else { // server production output, try to be similar to client if (!outputOpts.chunkFileNames) { @@ -250,61 +236,21 @@ export async function normalizeRollupOutputOptionsObject( outputOpts.exports = 'auto'; } - /** - * Transitive imports must not be hoisted. Otherwise, the bundle-graph static imports will be - * incorrect; leading to over-preloading. - */ - outputOpts.hoistTransitiveImports = false; - - // V2 official release TODO: remove below checks and just keep `outputOpts.onlyExplicitManualChunks = true;` - const userPkgJsonPath = await findDepPkgJsonPath(optimizer.sys, 'rollup', optimizer.sys.cwd()); - if (userPkgJsonPath) { - try { - const fs: typeof import('fs') = await optimizer.sys.dynamicImport('node:fs'); - const pkgJsonStr = await fs.promises.readFile(userPkgJsonPath, 'utf-8'); - const pkgJson = JSON.parse(pkgJsonStr); - const version = String(pkgJson?.version || ''); - const [major, minor, patch] = version.split('.').map((n: string) => parseInt(n, 10)) as [ - number, - number, - number, - ]; - const isGte452 = - Number.isFinite(major) && - (major > 4 || (major === 4 && (minor > 52 || (minor === 52 && (patch || 0) >= 0)))); - if (isGte452) { - ( - outputOpts as Rollup.OutputOptions & { onlyExplicitManualChunks?: boolean } - ).onlyExplicitManualChunks = true; - } else { - console.warn( - `⚠️ We detected that you're using a Rollup version prior to 4.52.0 (${version}). For the latest and greatest, we recommend to let Vite install the latest version for you, or manually install the latest version of Rollup in your project if that doesn't work. It will enable the new Rollup \`outputOpts.onlyExplicitManualChunks\` feature flag, which improves preloading performance and reduces cache invalidation for a snappier user experience.` - ); - } - } catch { - // If we cannot determine the installed Rollup version, avoid warning - } - } - return outputOpts; } -export function createRollupError(id: string, diagnostic: Diagnostic) { +export function createBundlerError(id: string, diagnostic: Diagnostic) { const loc = diagnostic.highlights?.[0]; - const err: Rollup.RollupError = Object.assign(new Error(diagnostic.message), { + return createRolldownError( + diagnostic.message, id, - plugin: 'qwik', - loc: loc && { - column: loc.startCol, - line: loc.startLine, - }, - stack: '', - }); - return err; + 'qwik', + loc && { column: loc.startCol, line: loc.startLine } + ); } /** @public */ -export interface QwikRollupPluginOptions { +export interface QwikRolldownPluginOptions { csr?: boolean; /** * Build `production` or `development`. @@ -384,6 +330,21 @@ export interface QwikRollupPluginOptions { */ experimental?: (keyof typeof ExperimentalFeatures)[]; } +/** + * Renamed to `qwikRolldown`. + * + * @deprecated Use `qwikRolldown`. + * @public + */ +export const qwikRollup = qwikRolldown; +/** + * Renamed to `QwikRolldownPluginOptions`. + * + * @deprecated Use `QwikRolldownPluginOptions`. + * @public + */ +export type QwikRollupPluginOptions = QwikRolldownPluginOptions; + export { ExperimentalFeatures } from './plugin'; -type P = Rollup.Plugin & { api: T }; -export interface QwikRollupPlugin extends P {} +type P = Rolldown.Plugin & { api: T }; +export interface QwikRolldownPlugin extends P {} diff --git a/packages/qwik-vite/src/plugins/rollup.unit.ts b/packages/qwik-vite/src/plugins/rolldown.unit.ts similarity index 64% rename from packages/qwik-vite/src/plugins/rollup.unit.ts rename to packages/qwik-vite/src/plugins/rolldown.unit.ts index a0c97a59a4c..0911eb3fc30 100644 --- a/packages/qwik-vite/src/plugins/rollup.unit.ts +++ b/packages/qwik-vite/src/plugins/rolldown.unit.ts @@ -1,6 +1,6 @@ import path, { resolve } from 'node:path'; -import { qwikRollup } from './rollup'; -import type { Rollup } from 'vite'; +import { qwikRolldown } from './rolldown'; +import type { Rolldown } from 'vite'; import type { OptimizerOptions } from '../types'; import type { NormalizedQwikPluginOptions } from './plugin'; import { assert, test } from 'vitest'; @@ -22,31 +22,29 @@ function mockOptimizerOptions(): OptimizerOptions { }; } -test('rollup default input options, client', async () => { +test('rolldown default input options, client', async () => { const initOpts = { optimizerOptions: mockOptimizerOptions(), }; - const plugin = qwikRollup(initOpts); - const rollupInputOpts: Rollup.InputOptions = await plugin.options!({}); + const plugin = qwikRolldown(initOpts); + const rolldownInputOpts: Rolldown.InputOptions = await plugin.options!({}); - assert.deepEqual(typeof rollupInputOpts.onwarn, 'function'); - assert.deepEqual((rollupInputOpts.input as string[]).map(normalizePath), [ + assert.deepEqual((rolldownInputOpts.input as string[]).map(normalizePath), [ normalizePath(resolve(cwd, 'src', 'root')), ]); }); -test('rollup default input options, ssr', async () => { +test('rolldown default input options, ssr', async () => { const initOpts = { optimizerOptions: mockOptimizerOptions(), target: 'ssr', } as any; - const plugin = qwikRollup(initOpts); - const rollupInputOpts: Rollup.InputOptions = await plugin.options!({}); + const plugin = qwikRolldown(initOpts); + const rolldownInputOpts: Rolldown.InputOptions = await plugin.options!({}); const opts: NormalizedQwikPluginOptions = plugin.api.getOptions(); - assert.deepEqual(typeof rollupInputOpts.onwarn, 'function'); - assert.deepEqual(rollupInputOpts.treeshake, undefined); - assert.deepEqual((rollupInputOpts.input as string[]).map(normalizePath), [ + assert.deepEqual(rolldownInputOpts.treeshake, undefined); + assert.deepEqual((rolldownInputOpts.input as string[]).map(normalizePath), [ normalizePath(resolve(cwd, 'src', 'entry.ssr')), ]); assert.deepEqual((opts.input as string[]).map(normalizePath), [ @@ -54,55 +52,54 @@ test('rollup default input options, ssr', async () => { ]); }); -test('rollup default set input options, ssr', async () => { +test('rolldown default set input options, ssr', async () => { const initOpts = { optimizerOptions: mockOptimizerOptions(), target: 'ssr', } as any; - const plugin = qwikRollup(initOpts); + const plugin = qwikRolldown(initOpts); const input = normalizePath(resolve(cwd, 'src', 'my.ssr.tsx')); - const rollupInputOpts: Rollup.InputOptions = await plugin.options!({ + const rolldownInputOpts: Rolldown.InputOptions = await plugin.options!({ input, }); const opts: NormalizedQwikPluginOptions = plugin.api.getOptions(); - assert.deepEqual(typeof rollupInputOpts.onwarn, 'function'); - assert.deepEqual(rollupInputOpts.treeshake, undefined); - assert.deepEqual(rollupInputOpts.input, [input]); + assert.deepEqual(rolldownInputOpts.treeshake, undefined); + assert.deepEqual(rolldownInputOpts.input, [input]); assert.deepEqual(opts.input, [input]); }); -test('rollup default output options, client', async () => { +test('rolldown default output options, client', async () => { const initOpts = { optimizerOptions: mockOptimizerOptions(), } as any; - const plugin = qwikRollup(initOpts); + const plugin = qwikRolldown(initOpts); await plugin.options!({}); - const rollupOutputOpts: Rollup.OutputOptions = await plugin.outputOptions!({}); + const rolldownOutputOpts: Rolldown.OutputOptions = await plugin.outputOptions!({}); - assert.deepEqual(rollupOutputOpts.dir, normalizePath(resolve(cwd, 'dist'))); - assert.deepEqual(rollupOutputOpts.format, 'es'); + assert.deepEqual(rolldownOutputOpts.dir, normalizePath(resolve(cwd, 'dist'))); + assert.deepEqual(rolldownOutputOpts.format, 'es'); }); -test('rollup default output options, ssr', async () => { +test('rolldown default output options, ssr', async () => { const initOpts = { optimizerOptions: mockOptimizerOptions(), target: 'ssr', } as any; - const plugin = qwikRollup(initOpts); + const plugin = qwikRolldown(initOpts); await plugin.options!({}); - const rollupOutputOpts: Rollup.OutputOptions = await plugin.outputOptions!({ + const rolldownOutputOpts: Rolldown.OutputOptions = await plugin.outputOptions!({ format: 'cjs', }); - assert.deepEqual(rollupOutputOpts.dir, normalizePath(resolve(cwd, 'server'))); - assert.deepEqual(rollupOutputOpts.exports, 'auto'); + assert.deepEqual(rolldownOutputOpts.dir, normalizePath(resolve(cwd, 'server'))); + assert.deepEqual(rolldownOutputOpts.exports, 'auto'); }); -test('rollup input, default', async () => { +test('rolldown input, default', async () => { const initOpts = { optimizerOptions: mockOptimizerOptions(), } as any; - const plugin = qwikRollup(initOpts); + const plugin = qwikRolldown(initOpts); await plugin.options!({}); const opts: NormalizedQwikPluginOptions = plugin.api.getOptions(); @@ -113,12 +110,12 @@ test('rollup input, default', async () => { assert.deepEqual(opts.srcDir, normalizePath(resolve(cwd, 'src'))); }); -test('rollup input, client default', async () => { +test('rolldown input, client default', async () => { const initOpts = { optimizerOptions: mockOptimizerOptions(), target: 'client', } as any; - const plugin = qwikRollup(initOpts); + const plugin = qwikRolldown(initOpts); await plugin.options!({}); const opts: NormalizedQwikPluginOptions = plugin.api.getOptions(); @@ -127,13 +124,13 @@ test('rollup input, client default', async () => { assert.deepEqual(opts.entryStrategy, { type: 'segment' }); }); -test('rollup input, client/production default', async () => { +test('rolldown input, client/production default', async () => { const initOpts = { optimizerOptions: mockOptimizerOptions(), target: 'client', buildMode: 'production', } as any; - const plugin = qwikRollup(initOpts); + const plugin = qwikRolldown(initOpts); await plugin.options!({}); const opts: NormalizedQwikPluginOptions = plugin.api.getOptions(); @@ -142,13 +139,13 @@ test('rollup input, client/production default', async () => { assert.deepEqual(opts.entryStrategy, { type: 'smart' }); }); -test('rollup input, ssr/development default', async () => { +test('rolldown input, ssr/development default', async () => { const initOpts = { optimizerOptions: mockOptimizerOptions(), target: 'ssr', buildMode: 'development', } as any; - const plugin = qwikRollup(initOpts); + const plugin = qwikRolldown(initOpts); await plugin.options!({}); const opts: NormalizedQwikPluginOptions = plugin.api.getOptions(); @@ -157,13 +154,13 @@ test('rollup input, ssr/development default', async () => { assert.deepEqual(opts.entryStrategy, { type: 'hoist' }); }); -test('rollup input, ssr/production default', async () => { +test('rolldown input, ssr/production default', async () => { const initOpts = { optimizerOptions: mockOptimizerOptions(), target: 'ssr', buildMode: 'production', } as any; - const plugin = qwikRollup(initOpts); + const plugin = qwikRolldown(initOpts); await plugin.options!({}); const opts: NormalizedQwikPluginOptions = plugin.api.getOptions(); @@ -172,13 +169,13 @@ test('rollup input, ssr/production default', async () => { assert.deepEqual(opts.entryStrategy, { type: 'hoist' }); }); -test('rollup input, lib/production default', async () => { +test('rolldown input, lib/production default', async () => { const initOpts = { optimizerOptions: mockOptimizerOptions(), target: 'lib', buildMode: 'production', } as any; - const plugin = qwikRollup(initOpts); + const plugin = qwikRolldown(initOpts); await plugin.options!({}); const opts: NormalizedQwikPluginOptions = plugin.api.getOptions(); @@ -187,13 +184,13 @@ test('rollup input, lib/production default', async () => { assert.deepEqual(opts.entryStrategy, { type: 'inline' }); }); -test('rollup input, forceFullBuild true', async () => { +test('rolldown input, forceFullBuild true', async () => { const initOpts = { optimizerOptions: mockOptimizerOptions(), target: 'ssr', buildMode: 'development', } as any; - const plugin = qwikRollup(initOpts); + const plugin = qwikRolldown(initOpts); await plugin.options!({}); const opts: NormalizedQwikPluginOptions = plugin.api.getOptions(); diff --git a/packages/qwik-vite/src/plugins/utils.ts b/packages/qwik-vite/src/plugins/utils.ts deleted file mode 100644 index a1d6afa5812..00000000000 --- a/packages/qwik-vite/src/plugins/utils.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { OptimizerSystem } from '../types'; - -export async function findDepPkgJsonPath(sys: OptimizerSystem, dep: string, parent: string) { - if (sys.env === 'browsermain' || sys.env === 'webworker') { - return undefined; - } - const fs: typeof import('fs') = await sys.dynamicImport('node:fs'); - let root = parent; - while (root) { - const pkg = sys.path.join(root, 'node_modules', dep, 'package.json'); - try { - await fs.promises.access(pkg); - // use 'node:fs' version to match 'vite:resolve' and avoid realpath.native quirk - // https://github.com/sveltejs/vite-plugin-svelte/issues/525#issuecomment-1355551264 - return fs.promises.realpath(pkg); - } catch { - //empty - } - const nextRoot = sys.path.dirname(root); - if (nextRoot === root) { - break; - } - root = nextRoot; - } - return undefined; -} diff --git a/packages/qwik-vite/src/plugins/vite-utils.ts b/packages/qwik-vite/src/plugins/vite-utils.ts index b83306d70a8..f9437f22f6b 100644 --- a/packages/qwik-vite/src/plugins/vite-utils.ts +++ b/packages/qwik-vite/src/plugins/vite-utils.ts @@ -1,9 +1,18 @@ +import type { Rolldown } from 'vite'; + export interface Loc { file: string; line: number | undefined; column: number | undefined; } +export const createRolldownError = ( + message: string, + id: string, + plugin: string, + loc?: Rolldown.RolldownError['loc'] +): Rolldown.RolldownError => ({ message, id, plugin, loc }); + export const findLocation = (e: Error): Loc | undefined => { const stack = e.stack; if (typeof stack === 'string') { @@ -137,3 +146,35 @@ export function parseId(originalId: string) { export const getSymbolHash = (symbolName: string) => /_([a-zA-Z0-9]+)($|\.js($|\?))/.exec(symbolName)?.[1]; + +/** + * Flatten a path-like name into a chunk `[name]`-safe token (Rolldown rejects path separators + * there). + */ +export const flattenToChunkName = (name: string) => + name + .replace(/^[A-Za-z]:/, '') + .replace(/^(\.\.[/\\])+/, '') + .replace(/^\.[/\\]/, '') + .replace(/^[/\\]+/, '') + .replace(/[/\\]+/g, '-'); + +// Chunk names the manifest matches to find the core/preloader bundles; a user or segment chunk must +// never collide with one or it would hijack that manifest pointer. (The qwikloader is matched by its +// emit reference instead, so a same-named route chunk can't shadow it.) +const RESERVED_CHUNK_NAMES = new Set(['qwik-core', 'qwikloader', 'qwik-preloader']); + +/** + * Turn an entry/segment name into a chunk `[name]`, kept clear of path separators and reserved + * names. + */ +export const sanitizeChunkGroupName = (name: string | null | undefined) => { + if (!name) { + return null; + } + const chunkName = /[/\\]/.test(name) ? flattenToChunkName(name) : name; + if (!chunkName) { + return null; + } + return RESERVED_CHUNK_NAMES.has(chunkName) ? `${chunkName}-segment` : chunkName; +}; diff --git a/packages/qwik-vite/src/plugins/vite-utils.unit.ts b/packages/qwik-vite/src/plugins/vite-utils.unit.ts new file mode 100644 index 00000000000..1b53f4b0bff --- /dev/null +++ b/packages/qwik-vite/src/plugins/vite-utils.unit.ts @@ -0,0 +1,27 @@ +import { describe, expect, test } from 'vitest'; +import { sanitizeChunkGroupName } from './vite-utils'; + +describe('sanitizeChunkGroupName', () => { + test('returns null for empty names', () => { + expect(sanitizeChunkGroupName(null)).toBeNull(); + expect(sanitizeChunkGroupName(undefined)).toBeNull(); + expect(sanitizeChunkGroupName('')).toBeNull(); + }); + + test('keeps a plain name as-is', () => { + expect(sanitizeChunkGroupName('routes')).toBe('routes'); + }); + + test('flattens path separators, which the bundler rejects in [name]', () => { + expect(sanitizeChunkGroupName('src/routes/index')).toBe('src-routes-index'); + expect(sanitizeChunkGroupName('./src/routes')).toBe('src-routes'); + expect(sanitizeChunkGroupName('../../src/routes')).toBe('src-routes'); + expect(sanitizeChunkGroupName('src\\routes\\index')).toBe('src-routes-index'); + }); + + test('suffixes reserved names so a segment cannot hijack the manifest pointers', () => { + expect(sanitizeChunkGroupName('qwik-core')).toBe('qwik-core-segment'); + expect(sanitizeChunkGroupName('qwikloader')).toBe('qwikloader-segment'); + expect(sanitizeChunkGroupName('qwik-preloader')).toBe('qwik-preloader-segment'); + }); +}); diff --git a/packages/qwik-vite/src/plugins/vite.ts b/packages/qwik-vite/src/plugins/vite.ts index 7a7f168d322..de5593638b5 100644 --- a/packages/qwik-vite/src/plugins/vite.ts +++ b/packages/qwik-vite/src/plugins/vite.ts @@ -1,5 +1,4 @@ import type { - BuildOptions, ConfigEnv, EnvironmentOptions, UserConfig, @@ -35,7 +34,7 @@ import { type QwikPluginDevTools, type QwikPluginOptions, } from './plugin'; -import { createRollupError, normalizeRollupOutputOptions } from './rollup'; +import { createBundlerError, normalizeRolldownOutputOptions } from './rolldown'; import { isVirtualId } from './vite-utils'; import { emitQwikWorkerCoreChunk, @@ -104,7 +103,7 @@ const QWIK_HMR_BRIDGE_CODE = ` type P = VitePlugin & { api: T; config: Extract['config'], Function> }; /** - * The types for Vite/Rollup don't allow us to be too specific about the return type. The correct + * The types for Vite/Rolldown don't allow us to be too specific about the return type. The correct * return type is `[QwikVitePlugin, VitePlugin]`, and if you search the plugin by name you'll * get the `QwikVitePlugin`. * @@ -121,6 +120,7 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { let ssrOutDir: string | null = null; let buildMode: QwikBuildMode = 'development'; let viteServer: ViteDevServer | undefined; + let workerCoreChunkRef: string | undefined; // Cache the user-specified clientOutDir to use across multiple normalizeOptions calls const userClientOutDir = qwikViteOpts.client?.outDir; // Cache the resolved plugin options from config() to reuse in configResolved() @@ -204,7 +204,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?.rolldownOptions?.input || clientInput || ssrInput; if (input && typeof input === 'string') { input = [input]; } @@ -310,12 +310,11 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { dynamicImportVarsOptions: { exclude: [/./], }, - rollupOptions: { + rolldownOptions: { external: ['node:async_hooks'], // This will amend the existing input input, - // temporary fix for rolldown-vite types - } as BuildOptions['rollupOptions'], + }, }, worker: getQwikWorkerConfig(viteConfig.worker, target, viteCommand), define: { @@ -330,20 +329,14 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { if (opts.outDir) { updatedViteConfig.build!.outDir = opts.outDir; } - const origOnwarn = updatedViteConfig.build!.rollupOptions?.onwarn; - updatedViteConfig.build!.rollupOptions = { - ...updatedViteConfig.build!.rollupOptions, - output: await normalizeRollupOutputOptions( + updatedViteConfig.build!.rolldownOptions = { + ...updatedViteConfig.build!.rolldownOptions, + output: normalizeRolldownOutputOptions( qwikPlugin, - viteConfig.build?.rollupOptions?.output + viteConfig.build?.rolldownOptions?.output ), - preserveEntrySignatures: 'exports-only', - onwarn: (warning, warn) => { - if (warning.plugin === 'typescript' && warning.message.includes('outputToFilesystem')) { - return; - } - origOnwarn ? origOnwarn(warning, warn) : warn(warning); - }, + // Rolldown rejects 'exports-only' with includeDependenciesRecursively:false. + preserveEntrySignatures: 'allow-extension', }; if (opts.target === 'ssr') { @@ -360,7 +353,7 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { } else if (opts.target === 'lib') { // Library Build updatedViteConfig.build!.minify = false; - updatedViteConfig.build!.rollupOptions.external = [ + updatedViteConfig.build!.rolldownOptions.external = [ QWIK_CORE_ID, QWIK_CORE_INTERNAL_ID, QWIK_CORE_SERVER, @@ -437,7 +430,7 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { !qwikViteOpts.csr && qwikPlugin.getOptions().target === 'client' ) { - const names = ['vite:build-import-analysis']; + const names = ['vite:build-import-analysis', 'native:import-analysis-build']; const plugins = config.plugins as VitePlugin[]; for (const name of names) { const i = plugins.findIndex((p) => p?.name === name); @@ -460,16 +453,17 @@ 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)); } }); }); await qwikPlugin.buildStart(this); + workerCoreChunkRef = undefined; if (viteCommand === 'build' && qwikPlugin.getOptions().target === 'client') { - emitQwikWorkerCoreChunk(this); + workerCoreChunkRef = emitQwikWorkerCoreChunk(this); } }, @@ -606,7 +600,7 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any { output.code = rewriteWorkerQrlChunkPlaceholders(output.code, resolveChunkPath); } } - rewriteClientWorkerCorePlaceholders(rollupBundle); + rewriteClientWorkerCorePlaceholders(this, rollupBundle, workerCoreChunkRef); } else if (isSSR) { rewriteSsrWorkerCorePlaceholders(rollupBundle, qwikPlugin.getOptions().manifestInput); } diff --git a/packages/qwik-vite/src/plugins/vite.unit.ts b/packages/qwik-vite/src/plugins/vite.unit.ts index 1f07446e63b..e79822b4092 100644 --- a/packages/qwik-vite/src/plugins/vite.unit.ts +++ b/packages/qwik-vite/src/plugins/vite.unit.ts @@ -1,5 +1,5 @@ import path, { resolve } from 'node:path'; -import type { Rollup } from 'vite'; +import type { Rolldown } from 'vite'; import { assert, describe, test } from 'vitest'; import { normalizePath } from '../../../qwik/src/testing/util'; import type { OptimizerOptions } from '../types'; @@ -30,7 +30,7 @@ const chunkInfoMocks = [ facadeModuleId: cwd + '/app/chunk.tsx', moduleIds: [cwd + '/app/chunk.tsx'], }, -] as Rollup.PreRenderedChunk[]; +] as Rolldown.PreRenderedChunk[]; function mockOptimizerOptions(env: 'node' | 'deno' = 'node'): OptimizerOptions { return { @@ -83,13 +83,13 @@ test('command: serve, mode: development', async () => { ))!; const opts = await plugin.api?.getOptions(); const build = c.build!; - const rollupOptions = build!.rollupOptions!; - const outputOptions = rollupOptions.output as Rollup.OutputOptions; + const rolldownOptions = build!.rolldownOptions!; + const outputOptions = rolldownOptions.output as Rolldown.OutputOptions; const chunkFileNames = outputOptions.chunkFileNames as ( - chunkInfo: Rollup.PreRenderedChunk + chunkInfo: Rolldown.PreRenderedChunk ) => string; const entryFileNames = outputOptions.entryFileNames as ( - chunkInfo: Rollup.PreRenderedChunk + chunkInfo: Rolldown.PreRenderedChunk ) => string; assert.deepEqual(opts.target, 'client'); @@ -98,7 +98,7 @@ test('command: serve, mode: development', async () => { assert.deepEqual(opts.debug, false); assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'dist'))); - assert.deepEqual(rollupOptions.input, [normalizePath(resolve(cwd, 'src', 'root'))]); + assert.deepEqual(rolldownOptions.input, [normalizePath(resolve(cwd, 'src', 'root'))]); assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]'); assert.deepEqual(chunkFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`); @@ -133,8 +133,8 @@ test('command: serve, mode: production', async () => { ))!; const opts = await plugin.api?.getOptions(); const build = c.build!; - const rollupOptions = build!.rollupOptions!; - const outputOptions = rollupOptions.output as Rollup.OutputOptions; + const rolldownOptions = build!.rolldownOptions!; + const outputOptions = rolldownOptions.output as Rolldown.OutputOptions; assert.deepEqual(opts.target, 'client'); assert.deepEqual(opts.buildMode, 'production'); @@ -144,7 +144,7 @@ test('command: serve, mode: production', async () => { assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'dist'))); assert.deepEqual(build.emptyOutDir, undefined); - assert.deepEqual(rollupOptions.input, [normalizePath(resolve(cwd, 'src', 'root'))]); + assert.deepEqual(rolldownOptions.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'); @@ -169,13 +169,13 @@ test('command: build, mode: development', async () => { ))!; const opts = await plugin.api?.getOptions(); const build = c.build!; - const rollupOptions = build!.rollupOptions!; - const outputOptions = rollupOptions.output as Rollup.OutputOptions; + const rolldownOptions = build!.rolldownOptions!; + const outputOptions = rolldownOptions.output as Rolldown.OutputOptions; const chunkFileNames = outputOptions.chunkFileNames as ( - chunkInfo: Rollup.PreRenderedChunk + chunkInfo: Rolldown.PreRenderedChunk ) => string; const entryFileNames = outputOptions.entryFileNames as ( - chunkInfo: Rollup.PreRenderedChunk + chunkInfo: Rolldown.PreRenderedChunk ) => string; assert.deepEqual(opts.target, 'client'); @@ -187,7 +187,7 @@ test('command: build, mode: development', async () => { 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), [ + assert.deepEqual((rolldownOptions.input as string[]).map(normalizePath), [ normalizePath(resolve(cwd, 'src', 'root')), ]); @@ -222,8 +222,8 @@ test('command: build, mode: production', async () => { ))!; const opts = await plugin.api?.getOptions(); const build = c.build!; - const rollupOptions = build!.rollupOptions!; - const outputOptions = rollupOptions.output as Rollup.OutputOptions; + const rolldownOptions = build!.rolldownOptions!; + const outputOptions = rolldownOptions.output as Rolldown.OutputOptions; assert.deepEqual(opts.target, 'client'); assert.deepEqual(opts.buildMode, 'production'); @@ -234,7 +234,7 @@ test('command: build, mode: production', async () => { 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), [ + assert.deepEqual((rolldownOptions.input as string[]).map(normalizePath), [ normalizePath(resolve(cwd, 'src', 'root')), ]); @@ -267,12 +267,12 @@ test('command: build, --mode production (client)', async () => { ))!; const opts = await plugin.api?.getOptions(); const build = c.build!; - const rollupOptions = build!.rollupOptions!; + const rolldownOptions = build!.rolldownOptions!; assert.deepEqual(opts.resolveQwikBuild, true); assert.deepEqual(opts.target, 'client'); assert.deepEqual(opts.buildMode, 'production'); - assert.deepEqual((rollupOptions.input as string[]).map(normalizePath), [ + assert.deepEqual((rolldownOptions.input as string[]).map(normalizePath), [ normalizePath(resolve(cwd, 'src', 'root')), ]); assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'client-dist'))); @@ -291,8 +291,8 @@ test('command: build, --ssr entry.server.tsx', async () => { ))!; const opts = await plugin.api?.getOptions(); const build = c.build!; - const rollupOptions = build!.rollupOptions!; - const outputOptions = rollupOptions.output as Rollup.OutputOptions; + const rolldownOptions = build!.rolldownOptions!; + const outputOptions = rolldownOptions.output as Rolldown.OutputOptions; assert.deepEqual(opts.target, 'ssr'); assert.deepEqual(opts.buildMode, 'development'); @@ -303,7 +303,7 @@ test('command: build, --ssr entry.server.tsx', async () => { 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), [ + assert.deepEqual((rolldownOptions.input as string[]).map(normalizePath), [ normalizePath(resolve(cwd, 'src', 'entry.server.tsx')), ]); @@ -336,13 +336,13 @@ test('command: serve, --mode ssr', async () => { ))!; const opts = await plugin.api?.getOptions(); const build = c.build!; - const rollupOptions = build!.rollupOptions!; + const rolldownOptions = build!.rolldownOptions!; 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), [ + assert.deepEqual((rolldownOptions.input as string[]).map(normalizePath), [ normalizePath(resolve(cwd, 'src', 'renderz.tsx')), ]); assert.deepEqual(c.build.outDir, normalizePath(resolve(cwd, 'ssr-dist'))); @@ -367,13 +367,13 @@ test('command: serve, --mode ssr with build.assetsDir', async () => { ))!; const opts = plugin.api?.getOptions(); const build = c.build!; - const rollupOptions = build!.rollupOptions!; + const rolldownOptions = build!.rolldownOptions!; 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), [ + assert.deepEqual((rolldownOptions.input as string[]).map(normalizePath), [ normalizePath(resolve(cwd, 'src', 'renderz.tsx')), ]); assert.deepEqual(c.build.outDir, normalizePath(resolve(cwd, 'ssr-dist'))); @@ -417,7 +417,7 @@ test('build.assetsDir is ignored: it no longer relocates Qwik output', async () { build: { assetsDir: 'q' } }, { command: 'build', mode: 'production' } ))!; - const outputOptions = c.build.rollupOptions.output as Rollup.OutputOptions; + const outputOptions = c.build.rolldownOptions.output as Rolldown.OutputOptions; // assets stay at the default dir and chunks stay at build/ — assetsDir has no effect on Qwik output assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]'); assert.deepEqual(outputOptions.chunkFileNames, 'build/q-[hash].js'); @@ -427,10 +427,12 @@ test('user output.assetFileNames relocates assets but keeps chunks at build/', a const plugin = getPlugin({ optimizerOptions: mockOptimizerOptions() }); const c: any = (await plugin.config.call( configHookPluginContext, - { build: { rollupOptions: { output: { assetFileNames: 'q/assets/[hash]-[name][extname]' } } } }, + { + build: { rolldownOptions: { output: { assetFileNames: 'q/assets/[hash]-[name][extname]' } } }, + }, { command: 'build', mode: 'production' } ))!; - const outputOptions = c.build.rollupOptions.output as Rollup.OutputOptions; + const outputOptions = c.build.rolldownOptions.output as Rolldown.OutputOptions; assert.deepEqual(outputOptions.assetFileNames, 'q/assets/[hash]-[name][extname]'); assert.deepEqual(outputOptions.chunkFileNames, 'build/q-[hash].js'); assert.deepEqual(outputOptions.entryFileNames, 'build/q-[hash].js'); @@ -447,10 +449,12 @@ test('user output.assetFileNames also applies to the SSR build (client/SSR stay const plugin = getPlugin(initOpts); const c: any = (await plugin.config.call( configHookPluginContext, - { build: { rollupOptions: { output: { assetFileNames: 'q/assets/[hash]-[name][extname]' } } } }, + { + build: { rolldownOptions: { output: { assetFileNames: 'q/assets/[hash]-[name][extname]' } } }, + }, { command: 'serve', mode: 'ssr' } ))!; - const outputOptions = c.build.rollupOptions.output as Rollup.OutputOptions; + const outputOptions = c.build.rolldownOptions.output as Rolldown.OutputOptions; assert.deepEqual(outputOptions.assetFileNames, 'q/assets/[hash]-[name][extname]'); }); @@ -518,14 +522,14 @@ test('command: build, --mode lib', async () => { ))!; const opts = await plugin.api?.getOptions(); const build = c.build!; - const rollupOptions = build!.rollupOptions!; - const outputOptions = rollupOptions.output as Rollup.OutputOptions; + const rolldownOptions = build!.rolldownOptions!; + const outputOptions = rolldownOptions.output as Rolldown.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(rolldownOptions.input, undefined); assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]'); assert.isFunction(outputOptions.chunkFileNames); @@ -548,7 +552,7 @@ test('command: build, --mode lib with multiple outputs', async () => { lib: { entry: './src/index.ts', }, - rollupOptions: { + rolldownOptions: { output: [ { format: 'es', @@ -574,14 +578,14 @@ test('command: build, --mode lib with multiple outputs', async () => { ))!; const opts = await plugin.api?.getOptions(); const build = c.build!; - const rollupOptions = build!.rollupOptions!; - const outputOptions = rollupOptions.output as Rollup.OutputOptions[]; + const rolldownOptions = build!.rolldownOptions!; + const outputOptions = rolldownOptions.output as Rolldown.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(rolldownOptions.input, undefined); assert.ok(Array.isArray(outputOptions)); assert.lengthOf(outputOptions, 4); @@ -616,7 +620,7 @@ describe('input config', () => { {}, { command: 'build', mode: 'development' } ))!; - assert.deepEqual(c.build.rollupOptions.input, ['./src/widget/counter.tsx']); + assert.deepEqual(c.build.rolldownOptions.input, ['./src/widget/counter.tsx']); }); test('should handle ssr target', async () => { const plugin = getPlugin(initOpts); @@ -625,7 +629,7 @@ describe('input config', () => { {}, { command: 'build', mode: 'ssr' } ))!; - assert.deepEqual(c.build.rollupOptions.input, ['./src/widget/ssr.tsx']); + assert.deepEqual(c.build.rolldownOptions.input, ['./src/widget/ssr.tsx']); }); }); diff --git a/packages/qwik-vite/src/plugins/worker-core.ts b/packages/qwik-vite/src/plugins/worker-core.ts index 2fa4a6323b1..00899bbd8ab 100644 --- a/packages/qwik-vite/src/plugins/worker-core.ts +++ b/packages/qwik-vite/src/plugins/worker-core.ts @@ -1,4 +1,5 @@ -import type { Plugin as VitePlugin, Rollup, UserConfig } from 'vite'; +import type { OutputBundle, PluginContext } from 'rolldown'; +import type { Plugin as VitePlugin, UserConfig } from 'vite'; import type { QwikManifest } from '../types'; import { QWIK_CORE_ID, QWIK_CORE_INTERNAL_ID, type QwikBuildTarget } from './plugin'; import { @@ -27,8 +28,8 @@ export const loadQwikWorkerCore = () => { }; }; -export const emitQwikWorkerCoreChunk = (ctx: Rollup.PluginContext) => { - ctx.emitFile({ +export const emitQwikWorkerCoreChunk = (ctx: PluginContext) => { + return ctx.emitFile({ id: QWIK_WORKER_CORE_ID, name: 'qwik-worker-core', type: 'chunk', @@ -52,12 +53,14 @@ export const getQwikWorkerConfig = ( }; }; -export const rewriteClientWorkerCorePlaceholders = (rollupBundle: Rollup.OutputBundle) => { - const workerCoreChunk = Object.values(rollupBundle).find( - (output) => output.type === 'chunk' && output.facadeModuleId === QWIK_WORKER_CORE_ID - ); - const resolveWorkerCorePath = workerCoreChunk - ? createBuildWorkerCoreChunkResolver(workerCoreChunk.fileName) +export const rewriteClientWorkerCorePlaceholders = ( + ctx: PluginContext, + rollupBundle: OutputBundle, + workerCoreChunkRef: string | undefined +) => { + const workerCoreFileName = workerCoreChunkRef ? ctx.getFileName(workerCoreChunkRef) : undefined; + const resolveWorkerCorePath = workerCoreFileName + ? createBuildWorkerCoreChunkResolver(workerCoreFileName) : undefined; rewriteWorkerCorePlaceholdersInBundle(rollupBundle, (fileName) => resolveWorkerCorePath?.(fileName) @@ -65,7 +68,7 @@ export const rewriteClientWorkerCorePlaceholders = (rollupBundle: Rollup.OutputB }; export const rewriteSsrWorkerCorePlaceholders = ( - rollupBundle: Rollup.OutputBundle, + rollupBundle: OutputBundle, manifest: QwikManifest | null ) => { const workerCoreChunkFileName = getWorkerCoreChunkFileNameFromManifest(manifest); @@ -106,7 +109,7 @@ const createQwikWorkerPlugins = (userWorkerPlugins: WorkerConfig['plugins']) => }; const rewriteWorkerCorePlaceholdersInBundle = ( - rollupBundle: Rollup.OutputBundle, + rollupBundle: OutputBundle, resolveWorkerCorePath: (fileName: string) => string | undefined ) => { for (const output of Object.values(rollupBundle)) { diff --git a/packages/qwik-vite/src/qwik.optimizer.api.md b/packages/qwik-vite/src/qwik.optimizer.api.md index 031180ac2db..18877763e95 100644 --- a/packages/qwik-vite/src/qwik.optimizer.api.md +++ b/packages/qwik-vite/src/qwik.optimizer.api.md @@ -102,10 +102,10 @@ export interface QwikManifest { } // @public (undocumented) -export function qwikRollup(qwikRollupOpts?: QwikRollupPluginOptions): any; +export function qwikRolldown(qwikRolldownOpts?: QwikRolldownPluginOptions): any; // @public (undocumented) -export interface QwikRollupPluginOptions { +export interface QwikRolldownPluginOptions { buildMode?: QwikBuildMode; // (undocumented) csr?: boolean; @@ -124,6 +124,12 @@ export interface QwikRollupPluginOptions { transformedModuleOutput?: ((transformedModules: TransformModule[]) => Promise | void) | null; } +// @public @deprecated +export const qwikRollup: typeof qwikRolldown; + +// @public @deprecated +export type QwikRollupPluginOptions = QwikRolldownPluginOptions; + // @public (undocumented) export interface QwikSymbol { // (undocumented) diff --git a/packages/qwik/package.json b/packages/qwik/package.json index 5d1533ecf4e..155957b3aed 100644 --- a/packages/qwik/package.json +++ b/packages/qwik/package.json @@ -11,8 +11,7 @@ "@qwik.dev/optimizer": "workspace:*", "csstype": "^3.2.3", "launch-editor": "^2.14.1", - "magic-string": "0.30.21", - "rollup": "^4.61.0" + "magic-string": "0.30.21" }, "devDependencies": { "@croct/json5-parser": "0.2.2", @@ -23,6 +22,7 @@ "image-size": "1.2.1", "kleur": "4.1.5", "prettier": "3.7.4", + "rolldown": "1.2.2", "vitest": "4.1.10" }, "engines": { @@ -161,7 +161,7 @@ "main": "./src/index.ts", "peerDependencies": { "prettier": "*", - "vite": ">=6 <9", + "vite": ">=8 <9", "vitest": ">=2 <4" }, "peerDependenciesMeta": { diff --git a/packages/qwik/src/qwikloader.unit.ts b/packages/qwik/src/qwikloader.unit.ts index 0eb5068ee5e..9217fd5f763 100644 --- a/packages/qwik/src/qwikloader.unit.ts +++ b/packages/qwik/src/qwikloader.unit.ts @@ -14,7 +14,7 @@ test('qwikloader script', () => { // ignore, we didn't build yet } expect(qwikLoader).toMatchInlineSnapshot( - `"const e=document,t=window,n="w",r="wp",o="d",s="dp",i="e",a="ep",c="capture:",l="readystatechange",p=0,u=new Set,d=new Set([e]),f=new Map,h={};let q,b,g;const m=(e,t)=>Array.from(e.querySelectorAll(t)),v=e=>{const t=[];return d.forEach(n=>t.push(...m(n,e))),t},w=(e,t,n,r=!1,o=!1)=>e.addEventListener(t,n,{capture:r,passive:o}),y=e=>{H(e);const t=m(e,"[q\\\\:shadowroot]");for(let e=0;ee&&"function"==typeof e.then,E=async e=>{for(let t=0;t{if(e.length){const t=()=>E(e);g=g?g.then(t,t):t()}},S=t=>{if(void 0===t._qwikjson_){let n=(t===e.documentElement?e.body:t).lastElementChild;for(;n;){if("SCRIPT"===n.tagName&&"qwik/json"===n.getAttribute("type")){t._qwikjson_=JSON.parse(n.textContent.replace(/\\\\x3C(\\/?script)/gi,"<$1"));break}n=n.previousElementSibling}}},_=e=>{h[e]=1,I(l)},k=t=>{const n=t.getAttribute("q:instance");return"paused"===t.getAttribute("q:container")&&"loading"===e.readyState&&!h[n]&&new Promise(t=>{w(e,l,()=>{("loading"!==e.readyState||h[n])&&t()})})},$=(e,t)=>new CustomEvent(e,{detail:t}),I=(t,n)=>{e.dispatchEvent($(t,n))},N=e=>e.replace(/([A-Z-])/g,e=>"-"+e.toLowerCase()),R=e=>e.replace(/-./g,e=>e[1].toUpperCase()),T=e=>{const t=e.indexOf(":");return{scope:e.slice(0,t),eventName:R(e.slice(t+1))}},x=e=>2===e.length,B=e=>e.charAt(0),L=e=>!!e&&1===e.nodeType,U=(e,t,n)=>e.hasAttribute(n)&&(!!e._qDispatch?.[t]||e.hasAttribute("q-"+t)),j=(t,n,r,o,s,i,a,c=!0)=>{const l={qBase:r,symbol:i,element:n,reqTime:a};if(!s){const n=(e["qFuncs_"+t.getAttribute("q:instance")]||[])[+i];if(!n&&c){const e=Error("sym:"+i);I("qerror",{importError:"sync",error:e,...l}),console.error(e)}return n}const p=\`\${i}|\${r}|\${s}\`,u=f.get(p);if(u)return u;const d=new URL(s,o).href,h=import(d);return S(t),h.then(e=>{const t=e[i];if(t)f.set(p,t),I("qsymbol",l);else{const e=Error(\`\${i} not in \${d}\`);I("qerror",{importError:"no-symbol",error:e,...l}),console.error(e)}return t},e=>{I("qerror",{importError:"async",error:e,...l}),console.error(e)})},D=(t,n,r,o,s,i=!0)=>{let a=!1;s&&(i&&t.hasAttribute("preventdefault:"+s)&&n.preventDefault(),t.hasAttribute("stoppropagation:"+s)&&n.stopPropagation());const c=t._qDispatch?.[r];if(c){if("function"==typeof c){const e=()=>c(n,t);if(a)o.push(async()=>{const t=e();A(t)&&await t});else{const t=e();A(t)&&(a=!0,o.push(()=>t))}}else if(c.length)for(let e=0;er(n,t);if(a)o.push(async()=>{const t=e();A(t)&&await t});else{const t=e();A(t)&&(a=!0,o.push(()=>t))}}}return}const l=t.getAttribute("q-"+r);if(l){const r=t.closest("[q\\\\:container]:not([q\\\\:container=html]):not([q\\\\:container=text])"),s=r.getAttribute("q:base"),i=new URL(s,e.baseURI),c=l.split("|"),p=k(r);for(let e=0;e{if(e&&t.isConnected){const r=e=>{I("qerror",{error:e,qBase:s,symbol:f,element:t,reqTime:u})};try{const o=e.call(h,n,t);if(A(o))return o.catch(r)}catch(e){return r(e)}}},b=(e=!0)=>j(r,t,s,i,d,f,u,e),g=p?void 0:b();if(p)a=!0,o.push(async()=>{await p,await q(await b(!1)||await b())});else if(A(g))a=!0,o.push(()=>g.then(q));else if(a)a=!0,o.push(async()=>{await q(g||await b())});else{const e=q(g);A(e)&&(a=!0,o.push(()=>e))}}}},O=(e,t=i,n=!0)=>{const r=N(e.type),o=t+":"+r,s=c+r,a=[],l=[],p=[];let u=e.target;for(;u;)L(u)?(a.push(u),l.push(U(u,o,s)),u=u.parentElement):u=u.parentElement;for(let t=a.length-1;t>=0;t--)if(l[t]&&(D(a[t],e,o,p,r,n),e.cancelBubble))return void C(p);for(let t=0;tO(e,a,!1),F=(e,t,n=!0)=>{const r=N(t.type),o=e+":"+r,s=v("[q-"+e+"\\\\:"+r+"]"),i=[];for(let e=0;e{F(o,e)},M=e=>{F(s,e,!1)},Z=e=>{F(n,e)},z=e=>{F(r,e,!1)},G=()=>{const n=e.readyState;if("interactive"==n||"complete"==n){if(b=1,d.forEach(y),u.has("d:qinit")){u.delete("d:qinit");const e=$("qinit"),t=v("[q-d\\\\:qinit]"),n=[];for(let r=0;r{const e=$("qidle"),t=v("[q-d\\\\:qidle]"),n=[];for(let r=0;r{const t=[];for(let n=0;n{for(let r=0;rw(e,r,a===o?i?M:J:i?P:O,!0,i)),1!==b||"e:qvisible"!==s&&"d:qinit"!==s&&"d:qidle"!==s||G()}}else d.has(s)||(u.forEach(e=>{const{scope:t,eventName:r}=T(e),i=x(t),a=B(t);a!==n&&w(s,r,a===o?i?M:J:i?P:O,!0,i)}),d.add(s))}},K=t._qwikEv;K?.roots||(Array.isArray(K)?H(...K):H("e:click","e:input"),t._qwikEv={events:u,roots:d,push:H},w(e,l,G),G());"` + `"var e,t,n,r=document,o=window,s="w",i="wp",a="d",c="dp",l="e",p="ep",u="capture:",d="readystatechange",f=0,h=new Set,q=new Set([r]),b=new Map,g={},m=(e,t)=>Array.from(e.querySelectorAll(t)),v=e=>{const t=[];return q.forEach(n=>t.push(...m(n,e))),t},w=(e,t,n,r=!1,o=!1)=>e.addEventListener(t,n,{capture:r,passive:o}),y=e=>{H(e);const t=m(e,"[q\\\\:shadowroot]");for(let e=0;ee&&"function"==typeof e.then,E=async e=>{for(let t=0;t{if(e.length){const t=()=>E(e);n=n?n.then(t,t):t()}},S=e=>{if(void 0===e._qwikjson_){let t=(e===r.documentElement?r.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}}},_=e=>{g[e]=1,I(d)},k=e=>{const t=e.getAttribute("q:instance");return"paused"===e.getAttribute("q:container")&&"loading"===r.readyState&&!g[t]&&new Promise(e=>{w(r,d,()=>{("loading"!==r.readyState||g[t])&&e()})})},$=(e,t)=>new CustomEvent(e,{detail:t}),I=(e,t)=>{r.dispatchEvent($(e,t))},N=e=>e.replace(/([A-Z-])/g,e=>"-"+e.toLowerCase()),R=e=>e.replace(/-./g,e=>e[1].toUpperCase()),T=e=>{const t=e.indexOf(":");return{scope:e.slice(0,t),eventName:R(e.slice(t+1))}},x=e=>2===e.length,B=e=>e.charAt(0),L=e=>!!e&&1===e.nodeType,U=(e,t,n)=>e.hasAttribute(n)&&(!!e._qDispatch?.[t]||e.hasAttribute("q-"+t)),j=(e,t,n,o,s,i,a,c=!0)=>{const l={qBase:n,symbol:i,element:t,reqTime:a};if(!s){const t=(r["qFuncs_"+e.getAttribute("q:instance")]||[])[+i];if(!t&&c){const e=Error("sym:"+i);I("qerror",{importError:"sync",error:e,...l}),console.error(e)}return t}const p=\`\${i}|\${n}|\${s}\`,u=b.get(p);if(u)return u;const d=new URL(s,o).href,f=import(d);return S(e),f.then(e=>{const t=e[i];if(t)b.set(p,t),I("qsymbol",l);else{const e=Error(\`\${i} not in \${d}\`);I("qerror",{importError:"no-symbol",error:e,...l}),console.error(e)}return t},e=>{I("qerror",{importError:"async",error:e,...l}),console.error(e)})},D=(e,t,n,o,s,i=!0)=>{let a=!1;s&&(i&&e.hasAttribute("preventdefault:"+s)&&t.preventDefault(),e.hasAttribute("stoppropagation:"+s)&&t.stopPropagation());const c=e._qDispatch?.[n];if(c){if("function"==typeof c){const n=()=>c(t,e);if(a)o.push(async()=>{const e=n();A(e)&&await e});else{const e=n();A(e)&&(a=!0,o.push(()=>e))}}else if(c.length)for(let n=0;nr(t,e);if(a)o.push(async()=>{const e=n();A(e)&&await e});else{const e=n();A(e)&&(a=!0,o.push(()=>e))}}}return}const l=e.getAttribute("q-"+n);if(l){const n=e.closest("[q\\\\:container]:not([q\\\\:container=html]):not([q\\\\:container=text])"),s=n.getAttribute("q:base"),i=new URL(s,r.baseURI),c=l.split("|"),p=k(n);for(let r=0;r{if(n&&e.isConnected){const r=t=>{I("qerror",{error:t,qBase:s,symbol:f,element:e,reqTime:u})};try{const o=n.call(h,t,e);if(A(o))return o.catch(r)}catch(e){return r(e)}}},b=(t=!0)=>j(n,e,s,i,d,f,u,t),g=p?void 0:b();if(p)a=!0,o.push(async()=>{await p,await q(await b(!1)||await b())});else if(A(g))a=!0,o.push(()=>g.then(q));else if(a)a=!0,o.push(async()=>{await q(g||await b())});else{const e=q(g);A(e)&&(a=!0,o.push(()=>e))}}}},O=(e,t=l,n=!0)=>{const r=N(e.type),o=t+":"+r,s=u+r,i=[],a=[],c=[];let p=e.target;for(;p;)L(p)?(i.push(p),a.push(U(p,o,s)),p=p.parentElement):p=p.parentElement;for(let t=i.length-1;t>=0;t--)if(a[t]&&(D(i[t],e,o,c,r,n),e.cancelBubble))return void C(c);for(let t=0;tO(e,p,!1),F=(e,t,n=!0)=>{const r=N(t.type),o=e+":"+r,s=v("[q-"+e+"\\\\:"+r+"]"),i=[];for(let e=0;e{F(a,e)},M=e=>{F(c,e,!1)},Z=e=>{F(s,e)},z=e=>{F(i,e,!1)},G=()=>{const n=r.readyState;if("interactive"==n||"complete"==n){if(t=1,q.forEach(y),h.has("d:qinit")){h.delete("d:qinit");const e=$("qinit"),t=v("[q-d\\\\:qinit]"),n=[];for(let r=0;r{const e=$("qidle"),t=v("[q-d\\\\:qidle]"),n=[];for(let r=0;r{const n=[];for(let r=0;r{for(let n=0;nw(e,n,c===a?i?M:J:i?P:O,!0,i)),1!==t||"e:qvisible"!==r&&"d:qinit"!==r&&"d:qidle"!==r||G()}}else q.has(r)||(h.forEach(e=>{const{scope:t,eventName:n}=T(e),o=x(t),i=B(t);i!==s&&w(r,n,i===a?o?M:J:o?P:O,!0,o)}),q.add(r))}},K=o._qwikEv;K?.roots||(Array.isArray(K)?H(...K):H("e:click","e:input"),o._qwikEv={events:h,roots:q,push:H},w(r,d,G),G());"` ); }); diff --git a/packages/qwik/src/server/scripts.ts b/packages/qwik/src/server/scripts.ts index b60f836cef6..c07bbc16788 100644 --- a/packages/qwik/src/server/scripts.ts +++ b/packages/qwik/src/server/scripts.ts @@ -52,5 +52,5 @@ export function getQwikOutOfOrderExecutorScript(opts: { debug?: boolean } = {}) // OOOS uses classic scripts so qO() can run synchronously in stream order. Wrap the // whole executor so multiple streamed containers can include it without redeclaring // top-level consts; the first installed executor services every container. - return `if(!globalThis.qO||globalThis.qO.d!==document){${script}}`; + return `if(!globalThis.qO||globalThis.qO.d!==document){${script}\n}`; } diff --git a/packages/qwik/src/web-worker/vite.config.ts b/packages/qwik/src/web-worker/vite.config.ts index 17800907921..0d6622091b3 100644 --- a/packages/qwik/src/web-worker/vite.config.ts +++ b/packages/qwik/src/web-worker/vite.config.ts @@ -16,7 +16,7 @@ // formats: ['es'], // fileName: (format) => `index.qwik.${format === 'es' ? 'mjs' : 'cjs'}`, // }, -// rollupOptions: { +// rolldownOptions: { // external: (id) => { // if (['@qwik.dev/core', '@qwik.dev/router', '@qwik.dev/core/build'].includes(id)) { // return true; 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 6ee5189c6b4..78531df79b4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -107,8 +107,8 @@ importers: specifier: 1.0.2 version: 1.0.2 '@vitejs/plugin-basic-ssl': - specifier: 2.1.4 - version: 2.1.4(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + specifier: 2.3.0 + version: 2.3.0(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(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.1.10) @@ -227,20 +227,20 @@ importers: specifier: 6.0.3 version: 6.0.3 vite: - specifier: 7.3.5 - version: 7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + specifier: 8.2.0 + version: 8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(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.61.0)(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 10.0.0(rollup@4.61.0)(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(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.61.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + specifier: 5.0.3 + version: 5.0.3(@microsoft/api-extractor@7.57.6(@types/node@24.10.0))(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.61.0)(typescript@5.9.3)(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) vite-tsconfig-paths: specifier: 6.1.1 - version: 6.1.1(typescript@5.9.3)(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 6.1.1(typescript@5.9.3)(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) vitest: specifier: 4.1.10 - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(@vitest/coverage-v8@4.0.18(vitest@4.1.10))(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(@vitest/coverage-v8@4.0.18(vitest@4.1.10))(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) watchlist: specifier: 0.3.1 version: 0.3.1 @@ -301,7 +301,7 @@ importers: version: 3.3.2 wxt: specifier: ^0.20.20 - version: 0.20.25(@types/node@24.10.0)(eslint@10.0.3(jiti@2.6.1))(jiti@2.6.1)(lightningcss@1.33.0)(oxc-parser@0.120.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1))(rollup@4.61.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + version: 0.20.25(@types/node@24.10.0)(eslint@10.0.3(jiti@2.6.1))(jiti@2.6.1)(oxc-parser@0.120.0(@emnapi/core@2.0.0-alpha.3)(@emnapi/runtime@2.0.0-alpha.3))(rollup@4.61.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) devDependencies: '@types/chrome': specifier: 0.1.38 @@ -311,7 +311,7 @@ importers: version: 5.9.3 vitest: specifier: 4.1.10 - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(@vitest/coverage-v8@4.0.18(vitest@4.1.10))(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(@vitest/coverage-v8@4.0.18(vitest@4.1.10))(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) packages/create-qwik: dependencies: @@ -348,19 +348,19 @@ importers: version: 3.3.3 oxc-parser: specifier: ^0.120.0 - version: 0.120.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + version: 0.120.0(@emnapi/core@2.0.0-alpha.3)(@emnapi/runtime@2.0.0-alpha.3) rollup-plugin-visualizer: - specifier: ^6.0.3 - version: 6.0.11(rolldown@1.1.5)(rollup@4.61.0) + specifier: ^7.0.1 + version: 7.0.1(rolldown@1.2.2)(rollup@4.61.0) superjson: specifier: ^2.2.6 version: 2.2.6 vite-hot-client: specifier: ^2.1.0 - version: 2.1.0(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 2.1.0(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) vite-plugin-inspect: - specifier: ^11.3.3 - version: 11.3.3(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + specifier: ^12.0.2 + version: 12.0.2(cac@7.0.0)(srvx@0.12.5)(typescript@5.9.3)(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(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 @@ -385,7 +385,7 @@ importers: version: 4.2.4 '@tailwindcss/vite': specifier: 4.2.4 - version: 4.2.4(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.2.4(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) '@types/debug': specifier: 4.1.13 version: 4.1.13 @@ -456,14 +456,14 @@ importers: specifier: 5.9.3 version: 5.9.3 vite: - specifier: 7.3.5 - version: 7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + specifier: 8.2.0 + version: 8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) vite-tsconfig-paths: specifier: 6.1.1 - version: 6.1.1(typescript@5.9.3)(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 6.1.1(typescript@5.9.3)(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) vitest: specifier: 4.1.10 - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(@vitest/coverage-v8@4.0.18(vitest@4.1.10))(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(@vitest/coverage-v8@4.0.18(vitest@4.1.10))(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) packages/docs: devDependencies: @@ -490,7 +490,7 @@ importers: version: 8.11.3(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4))(@mui/material@7.3.2(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@mui/system@7.3.2(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@qds.dev/tools': specifier: 0.15.2 - version: 0.15.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.11.1) + version: 0.15.2(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3) '@qds.dev/ui': specifier: 0.15.2 version: 0.15.2(@qwik.dev/core@packages+qwik) @@ -513,8 +513,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.11.1) + specifier: 1.2.2 + version: 1.2.2 '@shikijs/colorized-brackets': specifier: 3.21.0 version: 3.21.0 @@ -538,7 +538,7 @@ importers: version: 2.53.0 '@tailwindcss/vite': specifier: 4.2.4 - version: 4.2.4(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.2.4(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(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 @@ -621,11 +621,11 @@ importers: specifier: 1.4.2 version: 1.4.2(typescript@5.9.3) vite: - specifier: 7.3.5 - version: 7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + specifier: 8.2.0 + version: 8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) vite-tsconfig-paths: specifier: 6.1.1 - version: 6.1.1(typescript@5.9.3)(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 6.1.1(typescript@5.9.3)(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(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 @@ -702,7 +702,7 @@ importers: version: link:../qwik-router '@tailwindcss/vite': specifier: 4.2.4 - version: 4.2.4(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.2.4(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(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 @@ -723,7 +723,7 @@ importers: version: 17.0.0 netlify-cli: specifier: 24.5.1 - version: 24.5.1(@types/node@24.10.0)(picomatch@4.0.5)(rollup@4.61.0) + version: 24.5.1(@types/node@24.10.0)(picomatch@4.0.5)(rollup@4.61.0)(srvx@0.12.5) postcss: specifier: 8.5.18 version: 8.5.18 @@ -743,14 +743,14 @@ importers: specifier: 8.56.1 version: 8.56.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) vite: - specifier: 7.3.5 - version: 7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + specifier: 8.2.0 + version: 8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) vite-tsconfig-paths: specifier: 6.1.1 - version: 6.1.1(typescript@5.9.3)(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 6.1.1(typescript@5.9.3)(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) vitest: specifier: 4.1.10 - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(@vitest/coverage-v8@4.0.18(vitest@4.1.10))(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(@vitest/coverage-v8@4.0.18(vitest@4.1.10))(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) zod: specifier: 3.25.48 version: 3.25.48 @@ -771,9 +771,6 @@ importers: magic-string: specifier: 0.30.21 version: 0.30.21 - rollup: - specifier: ^4.61.0 - version: 4.61.0 devDependencies: '@croct/json5-parser': specifier: 0.2.2 @@ -799,9 +796,12 @@ importers: prettier: specifier: 3.7.4 version: 3.7.4 + rolldown: + specifier: 1.2.2 + version: 1.2.2 vitest: specifier: 4.1.10 - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(@vitest/coverage-v8@4.0.18(vitest@4.1.10))(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(@vitest/coverage-v8@4.0.18(vitest@4.1.10))(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) packages/qwik-dom: {} @@ -826,8 +826,8 @@ importers: specifier: 5.9.3 version: 5.9.3 vite: - specifier: 7.3.5 - version: 7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + specifier: 8.2.0 + version: 8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) packages/qwik-router: dependencies: @@ -900,12 +900,9 @@ importers: vfile: specifier: 6.0.3 version: 6.0.3 - vite: - specifier: '>=6 <9' - version: 7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) vite-imagetools: specifier: 10.0.0 - version: 10.0.0(rollup@4.61.0)(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 10.0.0(rollup@4.61.0)(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(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 @@ -940,6 +937,9 @@ importers: uvu: specifier: 0.5.6 version: 0.5.6 + vite: + specifier: 8.2.0 + version: 8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) packages/qwik-vite: devDependencies: @@ -949,6 +949,12 @@ importers: magic-string: specifier: 0.30.21 version: 0.30.21 + rolldown: + specifier: 1.2.2 + version: 1.2.2 + vite: + specifier: 8.2.0 + version: 8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) packages/supabase-auth-helpers-qwik: devDependencies: @@ -1275,6 +1281,20 @@ packages: resolution: {integrity: sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==} engines: {node: '>=18'} + '@devframes/hub@0.7.16': + resolution: {integrity: sha512-/3k1A6ZcMudZ79nsclmKCn/nZ1AOwVsuo+OXRnrs5zxRkj6TmuK8FyBDF3Itpfsp/xJpNmmmYvQz6BbgDrsWRA==} + peerDependencies: + devframe: 0.7.16 + + '@devframes/json-render@0.7.16': + resolution: {integrity: sha512-QlFkGcUsCvgSzaFWmessQpco1AftECDmVX9lEq8rxrFlJvhGoNzTqL0NwKjG1mg99MFYk4nbwXpIK+S/TejFog==} + peerDependencies: + '@devframes/hub': 0.7.16 + devframe: 0.7.16 + peerDependenciesMeta: + '@devframes/hub': + optional: true + '@devicefarmer/adbkit-logcat@2.1.3': resolution: {integrity: sha512-yeaGFjNBc/6+svbDeul1tNHtNChw6h8pSHAt5D+JsedUrMTN7tla7B15WLDyekxsuS2XlZHRxpuC6m92wiwCNw==} engines: {node: '>= 4'} @@ -1300,15 +1320,24 @@ packages: '@emnapi/core@1.9.2': resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + '@emnapi/core@2.0.0-alpha.3': + resolution: {integrity: sha512-AZypUeJ/yByuxyS7BlSNRDOMLMlROYtjYdIAuBmJssVz1UJDSeYxLrdizhXCFYhedC5bqd/ASy8EuNXbVVXp9g==} + '@emnapi/runtime@1.11.1': resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + '@emnapi/runtime@2.0.0-alpha.3': + resolution: {integrity: sha512-hFPAhMUjJD9BSyCANEISPOogeXC9Zo9ZQl7L6vKnaVsMkCtzznaW/naYypeyl0Gv5rYfWYsZbpixTMpjDJzQeA==} + '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} '@emnapi/wasi-threads@1.2.2': resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@emnapi/wasi-threads@2.0.1': + resolution: {integrity: sha512-9DsSk+o5NBX0CCJT8s0EROGSGxjR/tKu6aBTaVyq+SjAEQH4XcdcRxPBRzsBLizTTJ49MJjF+jgu3qnO9GLQcQ==} + '@emotion/babel-plugin@11.13.5': resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} @@ -1369,11 +1398,11 @@ packages: '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} - deprecated: 'Merged into tsx: https://tsx.hirok.io' + deprecated: 'Merged into tsx: https://tsx.is' '@esbuild-kit/esm-loader@2.6.5': resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} - deprecated: 'Merged into tsx: https://tsx.hirok.io' + deprecated: 'Merged into tsx: https://tsx.is' '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} @@ -2561,6 +2590,9 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@json-render/core@0.19.0': + resolution: {integrity: sha512-vvcyZ+10EDZKbEyB1J2kXOGfDaiZR2LurZGSqi2r5STHyKr+Te85DWaBxTwRGgM7U1LtIvNx85BzzjElRKoAIg==} + '@jsonjoy.com/base64@1.1.2': resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} engines: {node: '>=10.0'} @@ -2825,6 +2857,13 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 + '@napi-rs/wasm-runtime@1.2.2': + resolution: {integrity: sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.3 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.3 + '@neon-rs/load@0.0.4': resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} @@ -3640,6 +3679,9 @@ packages: '@oxc-project/types@0.139.0': resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} + '@oxc-project/types@0.142.0': + resolution: {integrity: sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==} + '@oxc-transform/binding-android-arm-eabi@0.115.0': resolution: {integrity: sha512-CFsCfptAidZ7gocyIFgxu9/ZW0DbiS18Qf+CLN2ubydl7hNfRD67ucWaj9atbAC5tv/nlA334CHg65KdcCC4pg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3949,72 +3991,144 @@ packages: cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.2.2': + resolution: {integrity: sha512-l7x215OGvo1s52JWmR8U/DAVzEDWBCIbTm28aeJV/WDTSHgcKXaZTuBT0hJMs5NggilfJTW3clZVvd24yfKJxA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.1.5': resolution: {integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.2.2': + resolution: {integrity: sha512-9u9Xv6c1AJZT0FfwH5vrMG5Jjcwhc1MlyrPu0XfTqkzsmqfks2M6W/o5XwAJgVVN/jHpqqngC1WevHKKTIUtIA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.1.5': resolution: {integrity: sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.2.2': + resolution: {integrity: sha512-9W1mbGZAfW3oqd85bhBkmpyHCCzL1TeG/zFFP3vg7b0rlly8cxOcre5nXwz+LHazCwac2MNWgPdPCHndABjpWQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.1.5': resolution: {integrity: sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.2.2': + resolution: {integrity: sha512-0p1lhiCSCyaerFwtrdZQUx7NqGk6LQnaRKWX7tFQqwQgvX0rjM15cIkm3pax1UpEakK14C4mOxx/jSqCBdBRqQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': resolution: {integrity: sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.2.2': + resolution: {integrity: sha512-e+cOJXrJ2L3zx6YzqPg+f6Wbk3V1cKB8bOhbaYdVYN3DdquzNdRAmrbETz1qnt5yp/c7JNlNjmITiA2cVneQ7w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.1.5': resolution: {integrity: sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.2.2': + resolution: {integrity: sha512-JsSMsj6sNat/MuhG5fnBD7QgbtpHKVe30x5/bAVirDHdhoQRXJkF6xc0Jqk8O4fiCUQAzMOoH9wZi3m60c8wtg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + '@rolldown/binding-linux-arm64-musl@1.1.5': resolution: {integrity: sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + '@rolldown/binding-linux-arm64-musl@1.2.2': + resolution: {integrity: sha512-B5G/zJdHaoJn9vD50eGHWkiWfmq8Uhi3IiLPJTzmZTrAalk1bztUikSXo0qga18ibE0IXboyeMUnhPjhAJ45wQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + '@rolldown/binding-linux-ppc64-gnu@1.1.5': resolution: {integrity: sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + '@rolldown/binding-linux-ppc64-gnu@1.2.2': + resolution: {integrity: sha512-6mC/awzKka8W6EoekjegpfGkjz8jXWDX63pqu/HYVpyKtZfu65Jsh4QAH3Kej3CAv/c1oGX7psTmFEbr0mDxLA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + '@rolldown/binding-linux-s390x-gnu@1.1.5': resolution: {integrity: sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + '@rolldown/binding-linux-s390x-gnu@1.2.2': + resolution: {integrity: sha512-412MX9fJLdA1IK28EZnc8jYv2HRTleOZgfLQumJ5zy7OeJLZlg/CETwFaXjNmGVxG51cFHpKLqb5LKvBC+HsHA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + '@rolldown/binding-linux-x64-gnu@1.1.5': resolution: {integrity: sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + '@rolldown/binding-linux-x64-gnu@1.2.2': + resolution: {integrity: sha512-Q/+HI/ToJafZ1iCqGgVQXUEkIjufHCTF0gBQ2a5o3cg7GJ2h0qyq3nvvSmU+bGda2/7ygXpTY4TM6gO9OhQ0ZA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + '@rolldown/binding-linux-x64-musl@1.1.5': resolution: {integrity: sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + '@rolldown/binding-linux-x64-musl@1.2.2': + resolution: {integrity: sha512-ZKp/w41n6wCvxzxQHtQSbuphfX3Y4cCvbjkKHusrLx4lh+JWLTU7StSltO/DKARISzbj368d+qUaCjI8K2wzXw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + '@rolldown/binding-openharmony-arm64@1.1.5': resolution: {integrity: sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.2.2': + resolution: {integrity: sha512-pxE6xD4KS3eAROkKK5yrhB9/3+vhlhVGMvlQLbdpzrBGDbKrnzx3RLwPaHvasLo6jgaiBLn7e04Df9C4tYhjmA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.1.5': resolution: {integrity: sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4026,14 +4140,26 @@ packages: cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.2.2': + resolution: {integrity: sha512-4MqEue5re+xIZzAWsB8sj0P1kqZySWqIuN4t6QaIO/YA6SFwySOLruvWQFzfmqk8LBK2P30KCSJwf6mJCZZ5/A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.1.5': resolution: {integrity: sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/browser@1.0.0-beta.59': - resolution: {integrity: sha512-4mPCTcp0HHFOfaQTz+Qb7bFHovQFWadTAX+GgbGwGXGUi41xMv6epDtIBpC+O/+odX2n0z1nXyOPGvra4ufW4Q==} + '@rolldown/binding-win32-x64-msvc@1.2.2': + resolution: {integrity: sha512-NweNxxD0Nf9t8v7kodun45Ijp3EIwYY+uydPP6qBEYvfBqhIjN6dZMzlQja3tqX/aLs3F3Uz+AxDpKgRhpOZQg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/browser@1.2.2': + resolution: {integrity: sha512-TKVAciHZYpn/LRl0cDvywum9AwBhqUWUJDSWFjACmKzu1ZpR7fWXyqCk7Qc61QBhMym7ukWgnPH+QsKhCYpgeA==} hasBin: true '@rolldown/pluginutils@1.0.1': @@ -4833,16 +4959,26 @@ packages: resolution: {integrity: sha512-5I3M9a6VGrw9KF5B7GHxpvwU3VyRfJ1qCWNSlcdLxw8S6m0lapOXL5oJq0gnRlde7csMfyE12oogmtp8nAibbw==} engines: {node: '>=15.0.0'} + '@valibot/to-json-schema@1.7.1': + resolution: {integrity: sha512-3qkmU6KXWh8GIThEAW3kuRHPQBMjWkKy+Ppz3WkUucx53DTpOa6siMn4xDGSOhlVyMrDaJTCTMLYPZVAIk1P0A==} + peerDependencies: + valibot: ^1.4.0 + '@vercel/nft@0.29.4': resolution: {integrity: sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==} engines: {node: '>=18'} hasBin: true - '@vitejs/plugin-basic-ssl@2.1.4': - resolution: {integrity: sha512-HXciTXN/sDBYWgeAD4V4s0DN0g72x5mlxQhHxtYu3Tt8BLa6MzcJZUyDVFCdtjNs3bfENVHVzOsmooTVuNgAAw==} + '@vitejs/devtools-kit@0.4.10': + resolution: {integrity: sha512-jaA4FQKlUa5vKrCLSZSJWcZ9DpHSl8j4R7Dq4kPeOmtXngb5eap/ZdumY8f5soCPWarjDKdPi23sAkiLH6VT/g==} + peerDependencies: + vite: '*' + + '@vitejs/plugin-basic-ssl@2.3.0': + resolution: {integrity: sha512-bdyo8rB3NnQbikdMpHaML9Z1OZPBu6fFOBo+OtxsBlvMJtysWskmBcnbIDhUqgC8tcxNv/a+BcV5U+2nQMm1OQ==} 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==} @@ -4909,17 +5045,6 @@ packages: '@vue/compiler-ssr@3.5.32': resolution: {integrity: sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw==} - '@vue/compiler-vue2@2.7.16': - resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} - - '@vue/language-core@2.2.0': - resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} - peerDependencies: - typescript: 5.9.3 - peerDependenciesMeta: - typescript: - optional: true - '@vue/shared@3.5.32': resolution: {integrity: sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==} @@ -5033,9 +5158,6 @@ packages: algoliasearch@4.16.0: resolution: {integrity: sha512-HAjKJ6bBblaXqO4dYygF4qx251GuJ6zCZt+qbJ+kU7sOC+yc84pawEjVpJByh+cGP2APFCsao2Giz50cDlKNPA==} - alien-signals@0.4.14: - resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} - all-contributors-cli@6.26.1: resolution: {integrity: sha512-Ymgo3FJACRBEd1eE653FD1J/+uD0kqpUNYfr9zNC1Qby0LgbhDBzB3EF6uvkAbYpycStkk41J+0oo37Lc02yEw==} engines: {node: '>=4'} @@ -5105,6 +5227,10 @@ packages: resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} + ansis@4.3.1: + resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} + engines: {node: '>=14'} + any-observable@0.3.0: resolution: {integrity: sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==} engines: {node: '>=6'} @@ -5337,9 +5463,6 @@ packages: bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - birpc@2.9.0: - resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} - birpc@4.0.0: resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} @@ -5618,6 +5741,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -5841,6 +5968,14 @@ packages: crossws@0.3.5: resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + crossws@0.4.10: + resolution: {integrity: sha512-pz3oubH/dt12KjqsUB0IuXW4nwRDQ583iDsP4555Cpdqx0NoU7pGlWBcayyFI8f/l/idRpgjMEfwuOxSWJYlIA==} + peerDependencies: + srvx: '>=0.11.5' + peerDependenciesMeta: + srvx: + optional: true + crossws@0.4.4: resolution: {integrity: sha512-w6c4OdpRNnudVmcgr7brb/+/HmYjMQvYToO/oTrprTwxRUiom3LYWU1PMWuD006okbUWpII1Ea9/+kwpUfmyRg==} peerDependencies: @@ -5910,9 +6045,6 @@ packages: date-fns@1.30.1: resolution: {integrity: sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==} - de-indent@1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} @@ -6091,6 +6223,17 @@ packages: dettle@1.0.5: resolution: {integrity: sha512-ZVyjhAJ7sCe1PNXEGveObOH9AC8QvMga3HJIghHawtG7mE4K5pW9nz/vDGAr/U7a3LWgdOzEE7ac9MURnyfaTA==} + devframe@0.7.16: + resolution: {integrity: sha512-U4vqEPgjYfovFEyOAmUlNG5DVGnb6Sx0Tgy9QiQAbtGieC5zTraOBL7GUyXGqdc53SCx/DhFfwjJcebt85T/Bw==} + peerDependencies: + '@modelcontextprotocol/sdk': ^1.0.0 + cac: ^7.0.0 + peerDependenciesMeta: + '@modelcontextprotocol/sdk': + optional: true + cac: + optional: true + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -6364,6 +6507,9 @@ packages: error-stack-parser-es@1.0.5: resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + error-stack-parser-es@2.0.1: + resolution: {integrity: sha512-J36ntO+rMQVRuR/umlmxmfLi4TpWwtmTnHoJoXTiC2xDNazs0VDPKcX6pbhZMDd2HFtH9isMBJXMdbki+A++Pg==} + error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} @@ -7219,6 +7365,16 @@ packages: h3@1.15.11: resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + h3@2.0.1-rc.26: + resolution: {integrity: sha512-GDxlvDsKxgjRvG5UBRJYyGJTMWLV30CJ4cV+e7QCTgftDHihrvio1fVPbNembhEr6J4WNm8IWy3fookgyTweLw==} + engines: {node: '>=20.11.1'} + hasBin: true + peerDependencies: + crossws: ^0.4.9 + peerDependenciesMeta: + crossws: + optional: true + has-ansi@2.0.0: resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} engines: {node: '>=0.10.0'} @@ -7291,10 +7447,6 @@ packages: hastscript@7.2.0: resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -8310,6 +8462,10 @@ packages: resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} engines: {node: '>=14'} + local-pkg@1.2.1: + resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} + engines: {node: '>=14'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -8823,9 +8979,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - muggle-string@0.4.1: - resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - multimatch@6.0.0: resolution: {integrity: sha512-I7tSVxHGPlmPN/enE3mS1aOSo6bWBfls+3HmuEeCUBCE7gWnm3cBXCBkpurzFjVRwC6Kld8lLaZ1Iv5vOcjvcQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -8971,6 +9124,9 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + nostics@1.2.0: + resolution: {integrity: sha512-FGqEfhQjrvo1lL8KFifdTQiNwwQHJxC1jtYE1Rc54qF/jxONUNL+kC9gS1krX8Q65PgrQ5fCqH/I4NhWBvdSqg==} + np@11.0.2: resolution: {integrity: sha512-3dmJJUmJ81DijpXCow9+RmGM/Eb/I9pggql9O2vuATI3Y2xRhVkOBkxLfTHikoyIGqsQ4FiK00IBhnlh7cJdhg==} engines: {bun: '>=1', git: '>=2.11.0', node: '>=20', npm: '>=9', pnpm: '>=8', yarn: '>=1.7.0'} @@ -9008,6 +9164,11 @@ packages: engines: {node: '>=18'} hasBin: true + nypm@0.6.9: + resolution: {integrity: sha512-zxlE2yvSWZWmHcNdT3+5zV2lrCogeE9YOklHrR3dFjqutq5wO7GFDYLFDRXLsYnJzwvy/im9fYoxePvS0VTW0w==} + engines: {node: '>=18'} + hasBin: true + oauth4webapi@3.8.5: resolution: {integrity: sha512-A8jmyUckVhRJj5lspguklcl90Ydqk61H3dcU0oLhH3Yv13KpAliKTt5hknpGGPZSSfOwGyraNEFmofDYH+1kSg==} @@ -9096,10 +9257,6 @@ packages: oniguruma-to-es@4.3.5: resolution: {integrity: sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ==} - open@10.2.0: - resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} - engines: {node: '>=18'} - open@11.0.0: resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} engines: {node: '>=20'} @@ -9494,6 +9651,10 @@ packages: resolution: {integrity: sha512-xdB1oSLHbz1vRWgCDalrCqEFTWzFlhqFC5tIHLMOSUIjhm3XXQ1qrFy8S/ESr1JYRRXqM3c1QFiMZUJdUTqyMQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.25: + resolution: {integrity: sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==} + engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -10021,12 +10182,17 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rollup-plugin-visualizer@6.0.11: - resolution: {integrity: sha512-TBwVHVY7buHjIKVLqr9scTVFwqZqMXINcCphPwIWKPDCOBIa+jCQfafvbjRJDZgXdq/A996Dy6yGJ/+/NtAXDQ==} - engines: {node: '>=18'} + rolldown@1.2.2: + resolution: {integrity: sha512-opwpo1tQBAcpSUJDt94B7hhLNGOKjCdE//XXjeLrnx9b83bjnw45tXdg1b09yEw/VLFBJGZpwRULMmOZo7ol+A==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rollup-plugin-visualizer@7.0.1: + resolution: {integrity: sha512-UJUT4+1Ho4OcWmPYU3sYXgUqI8B8Ayfe06MX7y0qCJ1K8aGoKtR/NDd/2nZqM7ADkrzny+I99Ul7GgyoiVNAgg==} + engines: {node: '>=22'} hasBin: true peerDependencies: - rolldown: 1.x || ^1.0.0-beta + rolldown: 1.x || ^1.0.0-beta || ^1.0.0-rc rollup: 2.x || 3.x || 4.x peerDependenciesMeta: rolldown: @@ -10039,6 +10205,9 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rou3@0.9.1: + resolution: {integrity: sha512-z/sSmzvtwMDDnxsPVhfWMuG6F6mbmhFDXoVqLmMfbpDD9qfV3GDmSQpf0+W296/ZDIpW2wcMmBfpVFzcnOi/nA==} + router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -10356,6 +10525,11 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + srvx@0.12.5: + resolution: {integrity: sha512-IuvtDNQg5EIwv3c6dleyau7u8hCyGQ7D6+V/QM799Aud07z0wCUcurKLTRfyG33C8oUY+UWcVBFkfHMcbtmRLA==} + engines: {node: '>=20.16.0'} + hasBin: true + stack-generator@2.0.10: resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} @@ -10425,6 +10599,10 @@ packages: resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} engines: {node: '>=20'} + string-width@8.2.2: + resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==} + engines: {node: '>=20'} + string.prototype.trim@1.2.10: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} @@ -10924,6 +11102,9 @@ packages: ufo@1.6.3: resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + uhyphen@0.2.0: resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==} @@ -11033,10 +11214,44 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin-dts@1.0.3: + resolution: {integrity: sha512-/GR887wfG4r1cWyt1UZsLRuMIjsmEbGkS9yJrz+0dsToHAYUD5CTyP3JMGVLv25j9K0mJcwAVvZno/aTuSUvNg==} + peerDependencies: + '@microsoft/api-extractor': '>=7' + '@rspack/core': ^1 + '@vue/language-core': ^3.1.5 + esbuild: '*' + rolldown: '*' + rollup: '>=3' + typescript: 5.9.3 + vite: '>=3' + webpack: ^4 || ^5 + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@rspack/core': + optional: true + '@vue/language-core': + optional: true + esbuild: + optional: true + rolldown: + optional: true + rollup: + optional: true + vite: + optional: true + webpack: + optional: true + unplugin-utils@0.3.1: resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==} engines: {node: '>=20.19.0'} + unplugin-utils@0.3.2: + resolution: {integrity: sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==} + engines: {node: '>=20.19.0'} + unplugin@2.3.11: resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} engines: {node: '>=18.12.0'} @@ -11199,11 +11414,6 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-dev-rpc@1.1.0: - resolution: {integrity: sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==} - peerDependencies: - vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 - vite-hot-client@2.1.0: resolution: {integrity: sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==} peerDependencies: @@ -11220,21 +11430,26 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - vite-plugin-dts@4.5.4: - resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} + vite-plugin-dts@5.0.3: + resolution: {integrity: sha512-gIth6NdCEHWPiiRMCK3N6C8WjvdsrtEQrmsiG8h6Ov+lFP+b07Y+wcs9H0H7n146l0PDTYK4cQN1vgeG1pMdRQ==} peerDependencies: - typescript: 5.9.3 - vite: '*' + '@microsoft/api-extractor': '>=7' + rollup: '>=3' + vite: '>=3' peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + rollup: + optional: true vite: optional: true - vite-plugin-inspect@11.3.3: - resolution: {integrity: sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==} + vite-plugin-inspect@12.0.2: + resolution: {integrity: sha512-/Mm4kurRsH9rm4vFtRNi89n73dqEPmxDvSq27A5HFdZblpYCy4Vkli96UYrMWiMmj4gDLfDF+pvw0fqgN76FHg==} engines: {node: '>=14'} peerDependencies: '@nuxt/kit': '*' - vite: ^6.0.0 || ^7.0.0-0 + vite: ^8.0.0-0 peerDependenciesMeta: '@nuxt/kit': optional: true @@ -11244,53 +11459,13 @@ packages: peerDependencies: vite: '*' - vite@7.3.5: - resolution: {integrity: sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' - less: ^4.0.0 - lightningcss: ^1.21.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 - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - vite@8.1.5: - resolution: {integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==} + vite@8.2.0: + resolution: {integrity: sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.3.0 + '@vitejs/devtools': ^0.4.0 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 @@ -11548,10 +11723,6 @@ packages: utf-8-validate: optional: true - wsl-utils@0.1.0: - resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} - engines: {node: '>=18'} - wsl-utils@0.3.1: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} @@ -11622,6 +11793,10 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} @@ -11634,6 +11809,10 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yargs@18.1.0: + resolution: {integrity: sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} @@ -11659,6 +11838,9 @@ packages: youch@4.1.0-beta.10: resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} + zigpty@0.2.1: + resolution: {integrity: sha512-MR9JqJx2wf5f4wz8zpx050AlqrmWeIW+1h0SO5iEyhG3HFRjY5luC3szS2ux2EGuPjE5OU9ZAuiCBeMWBTrqZw==} + zip-dir@2.0.0: resolution: {integrity: sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==} @@ -11675,6 +11857,9 @@ packages: zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -12112,6 +12297,26 @@ snapshots: gonzales-pe: 4.3.0 node-source-walk: 7.0.1 + '@devframes/hub@0.7.16(devframe@0.7.16(cac@7.0.0)(srvx@0.12.5)(typescript@5.9.3))': + dependencies: + birpc: 4.0.0 + destr: 2.0.5 + devframe: 0.7.16(cac@7.0.0)(srvx@0.12.5)(typescript@5.9.3) + nostics: 1.2.0 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + tinyexec: 1.2.4 + zigpty: 0.2.1 + + '@devframes/json-render@0.7.16(@devframes/hub@0.7.16(devframe@0.7.16(cac@7.0.0)(srvx@0.12.5)(typescript@5.9.3)))(devframe@0.7.16(cac@7.0.0)(srvx@0.12.5)(typescript@5.9.3))': + dependencies: + '@json-render/core': 0.19.0 + devframe: 0.7.16(cac@7.0.0)(srvx@0.12.5)(typescript@5.9.3) + nostics: 1.2.0 + zod: 4.4.3 + optionalDependencies: + '@devframes/hub': 0.7.16(devframe@0.7.16(cac@7.0.0)(srvx@0.12.5)(typescript@5.9.3)) + '@devicefarmer/adbkit-logcat@2.1.3': {} '@devicefarmer/adbkit-monkey@1.2.1': {} @@ -12143,9 +12348,19 @@ snapshots: '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 + '@emnapi/core@2.0.0-alpha.3': + dependencies: + '@emnapi/wasi-threads': 2.0.1 + tslib: 2.8.1 + '@emnapi/runtime@1.11.1': dependencies: tslib: 2.8.1 + optional: true + + '@emnapi/runtime@2.0.0-alpha.3': + dependencies: + tslib: 2.8.1 '@emnapi/wasi-threads@1.2.1': dependencies: @@ -12156,6 +12371,10 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@2.0.1': + dependencies: + tslib: 2.8.1 + '@emotion/babel-plugin@11.13.5': dependencies: '@babel/helper-module-imports': 7.28.6 @@ -13019,6 +13238,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@json-render/core@0.19.0': + dependencies: + zod: 4.4.3 + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': dependencies: tslib: 2.8.1 @@ -13370,10 +13593,24 @@ snapshots: '@tybys/wasm-util': 0.10.3 optional: true - '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.9.2)(@emnapi/runtime@1.11.1)': + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3)': dependencies: '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.11.1 + '@emnapi/runtime': 2.0.0-alpha.3 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@2.0.0-alpha.3)(@emnapi/runtime@2.0.0-alpha.3)': + dependencies: + '@emnapi/core': 2.0.0-alpha.3 + '@emnapi/runtime': 2.0.0-alpha.3 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@napi-rs/wasm-runtime@1.2.2(@emnapi/core@2.0.0-alpha.3)(@emnapi/runtime@2.0.0-alpha.3)': + dependencies: + '@emnapi/core': 2.0.0-alpha.3 + '@emnapi/runtime': 2.0.0-alpha.3 '@tybys/wasm-util': 0.10.3 '@neon-rs/load@0.0.4': {} @@ -13567,7 +13804,7 @@ snapshots: uuid: 13.0.0 write-file-atomic: 5.0.1 - '@netlify/dev@4.16.4(rollup@4.61.0)': + '@netlify/dev@4.16.4(rollup@4.61.0)(srvx@0.12.5)': dependencies: '@netlify/ai': 0.4.1 '@netlify/blobs': 10.7.4(supports-color@10.2.2) @@ -13577,7 +13814,7 @@ snapshots: '@netlify/edge-functions-dev': 1.0.16 '@netlify/functions-dev': 1.2.4(rollup@4.61.0) '@netlify/headers': 2.1.8 - '@netlify/images': 1.3.7(@netlify/blobs@10.7.4) + '@netlify/images': 1.3.7(@netlify/blobs@10.7.4)(srvx@0.12.5) '@netlify/redirects': 3.1.10 '@netlify/runtime': 4.1.20 '@netlify/static': 3.1.7 @@ -13711,9 +13948,9 @@ snapshots: dependencies: '@netlify/headers-parser': 9.0.3 - '@netlify/images@1.3.7(@netlify/blobs@10.7.0)': + '@netlify/images@1.3.7(@netlify/blobs@10.7.0)(srvx@0.12.5)': dependencies: - ipx: 3.1.1(@netlify/blobs@10.7.0) + ipx: 3.1.1(@netlify/blobs@10.7.0)(srvx@0.12.5) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -13736,9 +13973,9 @@ snapshots: - srvx - uploadthing - '@netlify/images@1.3.7(@netlify/blobs@10.7.4)': + '@netlify/images@1.3.7(@netlify/blobs@10.7.4)(srvx@0.12.5)': dependencies: - ipx: 3.1.1(@netlify/blobs@10.7.4) + ipx: 3.1.1(@netlify/blobs@10.7.4)(srvx@0.12.5) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -14231,9 +14468,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.11.1)': + '@oxc-minify/binding-wasm32-wasi@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3)': dependencies: - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.9.2)(@emnapi/runtime@1.11.1) + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -14344,17 +14581,17 @@ snapshots: '@oxc-parser/binding-openharmony-arm64@0.120.0': optional: true - '@oxc-parser/binding-wasm32-wasi@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.11.1)': + '@oxc-parser/binding-wasm32-wasi@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3)': dependencies: - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.9.2)(@emnapi/runtime@1.11.1) + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' optional: true - '@oxc-parser/binding-wasm32-wasi@0.120.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + '@oxc-parser/binding-wasm32-wasi@0.120.0(@emnapi/core@2.0.0-alpha.3)(@emnapi/runtime@2.0.0-alpha.3)': dependencies: - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@2.0.0-alpha.3)(@emnapi/runtime@2.0.0-alpha.3) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -14384,6 +14621,8 @@ snapshots: '@oxc-project/types@0.139.0': {} + '@oxc-project/types@0.142.0': {} + '@oxc-transform/binding-android-arm-eabi@0.115.0': optional: true @@ -14432,9 +14671,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.11.1)': + '@oxc-transform/binding-wasm32-wasi@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3)': dependencies: - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.9.2)(@emnapi/runtime@1.11.1) + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -14582,16 +14821,16 @@ snapshots: '@poppinss/exception@1.2.3': {} - '@qds.dev/tools@0.15.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.11.1)': + '@qds.dev/tools@0.15.2(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3)': dependencies: '@iconify/json': 2.2.461 '@iconify/utils': 3.1.0 '@oxc-project/types': 0.115.0 magic-regexp: 0.10.0 - oxc-minify: 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.11.1) - oxc-parser: 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.11.1) - oxc-transform: 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.11.1) - oxc-walker: 0.7.0(oxc-parser@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.11.1)) + oxc-minify: 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3) + oxc-parser: 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3) + oxc-transform: 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3) + oxc-walker: 0.7.0(oxc-parser@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3)) remark: 15.0.1 remark-mdx: 3.1.1 transitivePeerDependencies: @@ -14616,39 +14855,75 @@ snapshots: '@rolldown/binding-android-arm64@1.1.5': optional: true + '@rolldown/binding-android-arm64@1.2.2': + optional: true + '@rolldown/binding-darwin-arm64@1.1.5': optional: true + '@rolldown/binding-darwin-arm64@1.2.2': + optional: true + '@rolldown/binding-darwin-x64@1.1.5': optional: true + '@rolldown/binding-darwin-x64@1.2.2': + optional: true + '@rolldown/binding-freebsd-x64@1.1.5': optional: true + '@rolldown/binding-freebsd-x64@1.2.2': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.2.2': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.1.5': optional: true + '@rolldown/binding-linux-arm64-gnu@1.2.2': + optional: true + '@rolldown/binding-linux-arm64-musl@1.1.5': optional: true + '@rolldown/binding-linux-arm64-musl@1.2.2': + optional: true + '@rolldown/binding-linux-ppc64-gnu@1.1.5': optional: true + '@rolldown/binding-linux-ppc64-gnu@1.2.2': + optional: true + '@rolldown/binding-linux-s390x-gnu@1.1.5': optional: true + '@rolldown/binding-linux-s390x-gnu@1.2.2': + optional: true + '@rolldown/binding-linux-x64-gnu@1.1.5': optional: true + '@rolldown/binding-linux-x64-gnu@1.2.2': + optional: true + '@rolldown/binding-linux-x64-musl@1.1.5': optional: true + '@rolldown/binding-linux-x64-musl@1.2.2': + optional: true + '@rolldown/binding-openharmony-arm64@1.1.5': optional: true + '@rolldown/binding-openharmony-arm64@1.2.2': + optional: true + '@rolldown/binding-wasm32-wasi@1.1.5': dependencies: '@emnapi/core': 1.11.1 @@ -14659,15 +14934,20 @@ snapshots: '@rolldown/binding-win32-arm64-msvc@1.1.5': optional: true + '@rolldown/binding-win32-arm64-msvc@1.2.2': + optional: true + '@rolldown/binding-win32-x64-msvc@1.1.5': optional: true - '@rolldown/browser@1.0.0-beta.59(@emnapi/core@1.9.2)(@emnapi/runtime@1.11.1)': + '@rolldown/binding-win32-x64-msvc@1.2.2': + optional: true + + '@rolldown/browser@1.2.2': dependencies: - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.9.2)(@emnapi/runtime@1.11.1) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + '@emnapi/core': 2.0.0-alpha.3 + '@emnapi/runtime': 2.0.0-alpha.3 + '@napi-rs/wasm-runtime': 1.2.2(@emnapi/core@2.0.0-alpha.3)(@emnapi/runtime@2.0.0-alpha.3) '@rolldown/pluginutils@1.0.1': {} @@ -15040,12 +15320,12 @@ snapshots: postcss: 8.5.18 tailwindcss: 4.2.4 - '@tailwindcss/vite@4.2.4(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3))': + '@tailwindcss/vite@4.2.4(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@tailwindcss/node': 4.2.4 '@tailwindcss/oxide': 4.2.4 tailwindcss: 4.2.4 - vite: 7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) '@ts-morph/common@0.28.1': dependencies: @@ -15543,6 +15823,10 @@ snapshots: dependencies: '@builder.io/qwik': link:packages/qwik + '@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@5.9.3))': + dependencies: + valibot: 1.4.2(typescript@5.9.3) + '@vercel/nft@0.29.4(rollup@4.61.0)(supports-color@10.2.2)': dependencies: '@mapbox/node-pre-gyp': 2.0.3(supports-color@10.2.2) @@ -15562,9 +15846,25 @@ snapshots: - rollup - supports-color - '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3))': + '@vitejs/devtools-kit@0.4.10(cac@7.0.0)(srvx@0.12.5)(typescript@5.9.3)(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: - vite: 7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + '@devframes/hub': 0.7.16(devframe@0.7.16(cac@7.0.0)(srvx@0.12.5)(typescript@5.9.3)) + '@devframes/json-render': 0.7.16(@devframes/hub@0.7.16(devframe@0.7.16(cac@7.0.0)(srvx@0.12.5)(typescript@5.9.3)))(devframe@0.7.16(cac@7.0.0)(srvx@0.12.5)(typescript@5.9.3)) + devframe: 0.7.16(cac@7.0.0)(srvx@0.12.5)(typescript@5.9.3) + local-pkg: 1.2.1 + mlly: 1.8.2 + nostics: 1.2.0 + nypm: 0.6.9 + vite: 8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - cac + - srvx + - typescript + + '@vitejs/plugin-basic-ssl@2.3.0(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3))': + dependencies: + vite: 8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) '@vitest/coverage-v8@4.0.18(vitest@4.1.10)': dependencies: @@ -15578,7 +15878,7 @@ snapshots: obug: 2.1.3 std-env: 3.10.0 tinyrainbow: 3.1.0 - vitest: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(@vitest/coverage-v8@4.0.18(vitest@4.1.10))(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(@vitest/coverage-v8@4.0.18(vitest@4.1.10))(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/expect@4.1.10': dependencies: @@ -15589,13 +15889,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.10(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3))': + '@vitest/mocker@4.1.10(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) '@vitest/pretty-format@4.0.18': dependencies: @@ -15672,24 +15972,6 @@ snapshots: '@vue/compiler-dom': 3.5.32 '@vue/shared': 3.5.32 - '@vue/compiler-vue2@2.7.16': - dependencies: - de-indent: 1.0.2 - he: 1.2.0 - - '@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-vue2': 2.7.16 - '@vue/shared': 3.5.32 - alien-signals: 0.4.14 - minimatch: 9.0.9 - muggle-string: 0.4.1 - path-browserify: 1.0.1 - optionalDependencies: - typescript: 5.9.3 - '@vue/shared@3.5.32': {} '@webext-core/fake-browser@1.3.4': @@ -15823,8 +16105,6 @@ snapshots: '@algolia/requester-node-http': 4.16.0 '@algolia/transporter': 4.16.0 - alien-signals@0.4.14: {} - all-contributors-cli@6.26.1: dependencies: '@babel/runtime': 7.29.7 @@ -15886,6 +16166,8 @@ snapshots: ansis@4.2.0: {} + ansis@4.3.1: {} + any-observable@0.3.0(rxjs@6.6.7): optionalDependencies: rxjs: 6.6.7 @@ -16121,8 +16403,6 @@ snapshots: dependencies: file-uri-to-path: 1.0.0 - birpc@2.9.0: {} - birpc@4.0.0: {} bl@4.1.0: @@ -16443,6 +16723,12 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 + clone@1.0.4: {} clsx@2.1.1: {} @@ -16645,7 +16931,13 @@ snapshots: dependencies: uncrypto: 0.1.3 - crossws@0.4.4: {} + crossws@0.4.10(srvx@0.12.5): + optionalDependencies: + srvx: 0.12.5 + + crossws@0.4.4(srvx@0.12.5): + optionalDependencies: + srvx: 0.12.5 crypto-random-string@4.0.0: dependencies: @@ -16712,8 +17004,6 @@ snapshots: date-fns@1.30.1: {} - de-indent@1.0.2: {} - debounce@1.2.1: {} debug@2.6.9: @@ -16875,6 +17165,24 @@ snapshots: dettle@1.0.5: {} + devframe@0.7.16(cac@7.0.0)(srvx@0.12.5)(typescript@5.9.3): + dependencies: + '@valibot/to-json-schema': 1.7.1(valibot@1.4.2(typescript@5.9.3)) + birpc: 4.0.0 + crossws: 0.4.10(srvx@0.12.5) + destr: 2.0.5 + h3: 2.0.1-rc.26(crossws@0.4.10(srvx@0.12.5)) + mrmime: 2.0.1 + nostics: 1.2.0 + pathe: 2.0.3 + ufo: 1.6.4 + valibot: 1.4.2(typescript@5.9.3) + optionalDependencies: + cac: 7.0.0 + transitivePeerDependencies: + - srvx + - typescript + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -17035,6 +17343,8 @@ snapshots: error-stack-parser-es@1.0.5: {} + error-stack-parser-es@2.0.1: {} + error-stack-parser@2.1.4: dependencies: stackframe: 1.3.4 @@ -18174,6 +18484,13 @@ snapshots: ufo: 1.6.3 uncrypto: 0.1.3 + h3@2.0.1-rc.26(crossws@0.4.10(srvx@0.12.5)): + dependencies: + rou3: 0.9.1 + srvx: 0.12.5 + optionalDependencies: + crossws: 0.4.10(srvx@0.12.5) + has-ansi@2.0.0: dependencies: ansi-regex: 2.1.1 @@ -18295,8 +18612,6 @@ snapshots: property-information: 6.5.0 space-separated-tokens: 2.0.2 - he@1.2.0: {} - hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 @@ -18573,7 +18888,7 @@ snapshots: ipaddr.js@2.3.0: {} - ipx@3.1.1(@netlify/blobs@10.7.0): + ipx@3.1.1(@netlify/blobs@10.7.0)(srvx@0.12.5): dependencies: '@fastify/accept-negotiator': 2.0.1 citty: 0.1.6 @@ -18583,7 +18898,7 @@ snapshots: etag: 1.8.1 h3: 1.15.11 image-meta: 0.2.2 - listhen: 1.9.1 + listhen: 1.9.1(srvx@0.12.5) ofetch: 1.5.1 pathe: 2.0.3 sharp: 0.34.5 @@ -18613,7 +18928,7 @@ snapshots: - srvx - uploadthing - ipx@3.1.1(@netlify/blobs@10.7.4): + ipx@3.1.1(@netlify/blobs@10.7.4)(srvx@0.12.5): dependencies: '@fastify/accept-negotiator': 2.0.1 citty: 0.1.6 @@ -18623,7 +18938,7 @@ snapshots: etag: 1.8.1 h3: 1.15.11 image-meta: 0.2.2 - listhen: 1.9.1 + listhen: 1.9.1(srvx@0.12.5) ofetch: 1.5.1 pathe: 2.0.3 sharp: 0.34.5 @@ -19260,13 +19575,13 @@ snapshots: htmlparser2: 10.1.0 uhyphen: 0.2.0 - listhen@1.9.1: + listhen@1.9.1(srvx@0.12.5): dependencies: '@parcel/watcher': 2.5.6 '@parcel/watcher-wasm': 2.5.6 citty: 0.2.2 consola: 3.4.2 - crossws: 0.4.4 + crossws: 0.4.4(srvx@0.12.5) defu: 6.1.7 get-port-please: 3.2.0 h3: 1.15.11 @@ -19356,6 +19671,12 @@ snapshots: pkg-types: 2.3.1 quansync: 0.2.11 + local-pkg@1.2.1: + dependencies: + mlly: 1.8.2 + pkg-types: 2.3.1 + quansync: 0.2.11 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -20125,8 +20446,6 @@ snapshots: ms@2.1.3: {} - muggle-string@0.4.1: {} - multimatch@6.0.0: dependencies: '@types/minimatch': 3.0.5 @@ -20162,7 +20481,7 @@ snapshots: negotiator@1.0.0: {} - netlify-cli@24.5.1(@types/node@24.10.0)(picomatch@4.0.5)(rollup@4.61.0): + netlify-cli@24.5.1(@types/node@24.10.0)(picomatch@4.0.5)(rollup@4.61.0)(srvx@0.12.5): dependencies: '@fastify/static': 9.0.0 '@netlify/ai': 0.4.1 @@ -20171,13 +20490,13 @@ snapshots: '@netlify/build': 35.11.1(@opentelemetry/api@1.8.0)(@types/node@24.10.0)(picomatch@4.0.5)(rollup@4.61.0) '@netlify/build-info': 10.4.0 '@netlify/config': 24.4.4 - '@netlify/dev': 4.16.4(rollup@4.61.0) + '@netlify/dev': 4.16.4(rollup@4.61.0)(srvx@0.12.5) '@netlify/dev-utils': 4.4.3 '@netlify/edge-bundler': 14.9.19 '@netlify/edge-functions': 3.0.6 '@netlify/edge-functions-bootstrap': 2.17.1 '@netlify/headers-parser': 9.0.3 - '@netlify/images': 1.3.7(@netlify/blobs@10.7.0) + '@netlify/images': 1.3.7(@netlify/blobs@10.7.0)(srvx@0.12.5) '@netlify/local-functions-proxy': 2.0.3 '@netlify/redirect-parser': 15.0.4 '@netlify/zip-it-and-ship-it': 14.5.2(rollup@4.61.0)(supports-color@10.2.2) @@ -20394,6 +20713,8 @@ snapshots: normalize-path@3.0.0: {} + nostics@1.2.0: {} + np@11.0.2(@types/node@24.10.0)(typescript@5.9.3): dependencies: chalk: 5.6.2 @@ -20482,6 +20803,12 @@ snapshots: pathe: 2.0.3 tinyexec: 1.2.4 + nypm@0.6.9: + dependencies: + citty: 0.2.2 + pathe: 2.0.3 + tinyexec: 1.2.4 + oauth4webapi@3.8.5: {} object-assign@4.1.1: {} @@ -20578,13 +20905,6 @@ snapshots: regex: 6.1.0 regex-recursion: 6.0.2 - open@10.2.0: - dependencies: - default-browser: 5.5.0 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - wsl-utils: 0.1.0 - open@11.0.0: dependencies: default-browser: 5.5.0 @@ -20652,7 +20972,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.11.1): + oxc-minify@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3): optionalDependencies: '@oxc-minify/binding-android-arm-eabi': 0.115.0 '@oxc-minify/binding-android-arm64': 0.115.0 @@ -20670,7 +20990,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.11.1) + '@oxc-minify/binding-wasm32-wasi': 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3) '@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 @@ -20678,7 +20998,7 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - oxc-parser@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.11.1): + oxc-parser@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3): dependencies: '@oxc-project/types': 0.115.0 optionalDependencies: @@ -20698,7 +21018,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.11.1) + '@oxc-parser/binding-wasm32-wasi': 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3) '@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 @@ -20706,7 +21026,7 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - oxc-parser@0.120.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1): + oxc-parser@0.120.0(@emnapi/core@2.0.0-alpha.3)(@emnapi/runtime@2.0.0-alpha.3): dependencies: '@oxc-project/types': 0.120.0 optionalDependencies: @@ -20726,7 +21046,7 @@ snapshots: '@oxc-parser/binding-linux-x64-gnu': 0.120.0 '@oxc-parser/binding-linux-x64-musl': 0.120.0 '@oxc-parser/binding-openharmony-arm64': 0.120.0 - '@oxc-parser/binding-wasm32-wasi': 0.120.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@oxc-parser/binding-wasm32-wasi': 0.120.0(@emnapi/core@2.0.0-alpha.3)(@emnapi/runtime@2.0.0-alpha.3) '@oxc-parser/binding-win32-arm64-msvc': 0.120.0 '@oxc-parser/binding-win32-ia32-msvc': 0.120.0 '@oxc-parser/binding-win32-x64-msvc': 0.120.0 @@ -20734,7 +21054,7 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - oxc-transform@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.11.1): + oxc-transform@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3): optionalDependencies: '@oxc-transform/binding-android-arm-eabi': 0.115.0 '@oxc-transform/binding-android-arm64': 0.115.0 @@ -20752,7 +21072,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.11.1) + '@oxc-transform/binding-wasm32-wasi': 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3) '@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 @@ -20760,10 +21080,10 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - oxc-walker@0.7.0(oxc-parser@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.11.1)): + oxc-walker@0.7.0(oxc-parser@0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3)): dependencies: magic-regexp: 0.10.0 - oxc-parser: 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.11.1) + oxc-parser: 0.115.0(@emnapi/core@1.9.2)(@emnapi/runtime@2.0.0-alpha.3) p-event@6.0.1: dependencies: @@ -21092,6 +21412,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.25: + dependencies: + nanoid: 3.3.16 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postgres-array@2.0.0: {} postgres-bytea@1.0.1: {} @@ -21673,14 +21999,34 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.1.5 '@rolldown/binding-win32-x64-msvc': 1.1.5 - rollup-plugin-visualizer@6.0.11(rolldown@1.1.5)(rollup@4.61.0): + rolldown@1.2.2: dependencies: - open: 8.4.2 + '@oxc-project/types': 0.142.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.2.2 + '@rolldown/binding-darwin-arm64': 1.2.2 + '@rolldown/binding-darwin-x64': 1.2.2 + '@rolldown/binding-freebsd-x64': 1.2.2 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.2 + '@rolldown/binding-linux-arm64-gnu': 1.2.2 + '@rolldown/binding-linux-arm64-musl': 1.2.2 + '@rolldown/binding-linux-ppc64-gnu': 1.2.2 + '@rolldown/binding-linux-s390x-gnu': 1.2.2 + '@rolldown/binding-linux-x64-gnu': 1.2.2 + '@rolldown/binding-linux-x64-musl': 1.2.2 + '@rolldown/binding-openharmony-arm64': 1.2.2 + '@rolldown/binding-win32-arm64-msvc': 1.2.2 + '@rolldown/binding-win32-x64-msvc': 1.2.2 + + rollup-plugin-visualizer@7.0.1(rolldown@1.2.2)(rollup@4.61.0): + dependencies: + open: 11.0.0 picomatch: 4.0.5 source-map: 0.7.6 - yargs: 17.7.2 + yargs: 18.1.0 optionalDependencies: - rolldown: 1.1.5 + rolldown: 1.2.2 rollup: 4.61.0 rollup@4.61.0: @@ -21714,6 +22060,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.61.0 fsevents: 2.3.3 + rou3@0.9.1: {} + router@2.2.0: dependencies: debug: 4.4.3(supports-color@10.2.2) @@ -22098,6 +22446,8 @@ snapshots: sprintf-js@1.0.3: {} + srvx@0.12.5: {} + stack-generator@2.0.10: dependencies: stackframe: 1.3.4 @@ -22170,6 +22520,11 @@ snapshots: get-east-asian-width: 1.5.0 strip-ansi: 7.2.0 + string-width@8.2.2: + dependencies: + get-east-asian-width: 1.5.0 + strip-ansi: 7.2.0 + string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.9 @@ -22664,6 +23019,8 @@ snapshots: ufo@1.6.3: {} + ufo@1.6.4: {} + uhyphen@0.2.0: {} uid-safe@2.1.5: @@ -22714,7 +23071,7 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 - unimport@6.2.0(oxc-parser@0.120.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)): + unimport@6.2.0(oxc-parser@0.120.0(@emnapi/core@2.0.0-alpha.3)(@emnapi/runtime@2.0.0-alpha.3)): dependencies: acorn: 8.16.0 escape-string-regexp: 5.0.0 @@ -22731,7 +23088,7 @@ snapshots: unplugin: 3.0.0 unplugin-utils: 0.3.1 optionalDependencies: - oxc-parser: 0.120.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + oxc-parser: 0.120.0(@emnapi/core@2.0.0-alpha.3)(@emnapi/runtime@2.0.0-alpha.3) unique-string@3.0.0: dependencies: @@ -22780,11 +23137,36 @@ snapshots: unpipe@1.0.0: {} + unplugin-dts@1.0.3(@microsoft/api-extractor@7.57.6(@types/node@24.10.0))(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.61.0)(typescript@5.9.3)(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.61.0) + '@volar/typescript': 2.4.28 + compare-versions: 6.1.1 + debug: 4.4.3(supports-color@10.2.2) + kolorist: 1.8.0 + local-pkg: 1.1.2 + magic-string: 0.30.21 + typescript: 5.9.3 + unplugin: 2.3.11 + optionalDependencies: + '@microsoft/api-extractor': 7.57.6(@types/node@24.10.0) + esbuild: 0.28.1 + rolldown: 1.2.2 + rollup: 4.61.0 + vite: 8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + transitivePeerDependencies: + - supports-color + unplugin-utils@0.3.1: dependencies: pathe: 2.0.3 picomatch: 4.0.5 + unplugin-utils@0.3.2: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.5 + unplugin@2.3.11: dependencies: '@jridgewell/remapping': 2.3.5 @@ -22909,22 +23291,16 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-dev-rpc@1.1.0(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): - dependencies: - birpc: 2.9.0 - vite: 7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) - vite-hot-client: 2.1.0(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) - - vite-hot-client@2.1.0(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): + vite-hot-client@2.1.0(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: - vite: 7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) - vite-imagetools@10.0.0(rollup@4.61.0)(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): + vite-imagetools@10.0.0(rollup@4.61.0)(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.61.0) imagetools-core: 9.1.0 sharp: 0.34.5 - vite: 7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - rollup @@ -22934,7 +23310,7 @@ snapshots: es-module-lexer: 2.3.1 obug: 2.1.3 pathe: 2.0.3 - vite: 8.1.5(@types/node@24.10.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.2.0(@types/node@24.10.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - '@types/node' - '@vitejs/devtools' @@ -22949,87 +23325,86 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.5.4(@types/node@24.10.0)(rollup@4.61.0)(typescript@5.9.3)(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): + vite-plugin-dts@5.0.3(@microsoft/api-extractor@7.57.6(@types/node@24.10.0))(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.61.0)(typescript@5.9.3)(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(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.61.0) - '@volar/typescript': 2.4.28 - '@vue/language-core': 2.2.0(typescript@5.9.3) - compare-versions: 6.1.1 - debug: 4.4.3(supports-color@10.2.2) - kolorist: 1.8.0 - local-pkg: 1.1.2 - magic-string: 0.30.21 - typescript: 5.9.3 + unplugin-dts: 1.0.3(@microsoft/api-extractor@7.57.6(@types/node@24.10.0))(esbuild@0.28.1)(rolldown@1.2.2)(rollup@4.61.0)(typescript@5.9.3)(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) optionalDependencies: - vite: 7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + '@microsoft/api-extractor': 7.57.6(@types/node@24.10.0) + rollup: 4.61.0 + vite: 8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - - '@types/node' - - rollup + - '@rspack/core' + - '@vue/language-core' + - esbuild + - rolldown - supports-color + - typescript + - webpack - vite-plugin-inspect@11.3.3(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): + vite-plugin-inspect@12.0.2(cac@7.0.0)(srvx@0.12.5)(typescript@5.9.3)(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(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) - error-stack-parser-es: 1.0.5 + '@vitejs/devtools-kit': 0.4.10(cac@7.0.0)(srvx@0.12.5)(typescript@5.9.3)(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + ansis: 4.3.1 + error-stack-parser-es: 2.0.1 + obug: 2.1.3 ohash: 2.0.11 - open: 10.2.0 + open: 11.0.0 perfect-debounce: 2.1.0 sirv: 3.0.2 - unplugin-utils: 0.3.1 - vite: 7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) - vite-dev-rpc: 1.1.0(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + unplugin-utils: 0.3.2 + vite: 8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - - supports-color + - '@modelcontextprotocol/sdk' + - cac + - srvx + - typescript - vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): + vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(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) - vite: 7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - supports-color - typescript - vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3): + vite@8.2.0(@types/node@24.10.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3): dependencies: - esbuild: 0.27.7 - fdir: 6.5.0(picomatch@4.0.5) + lightningcss: 1.33.0 picomatch: 4.0.5 - postcss: 8.5.18 - rollup: 4.61.0 + postcss: 8.5.25 + rolldown: 1.2.2 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.10.0 + esbuild: 0.27.7 fsevents: 2.3.3 jiti: 2.6.1 - lightningcss: 1.33.0 terser: 5.46.0 tsx: 4.21.0 yaml: 2.8.3 - vite@8.1.5(@types/node@24.10.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3): + vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3): dependencies: lightningcss: 1.33.0 picomatch: 4.0.5 - postcss: 8.5.18 - rolldown: 1.1.5 + postcss: 8.5.25 + rolldown: 1.2.2 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.10.0 - esbuild: 0.27.7 + esbuild: 0.28.1 fsevents: 2.3.3 jiti: 2.6.1 terser: 5.46.0 tsx: 4.21.0 yaml: 2.8.3 - vitest@4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(@vitest/coverage-v8@4.0.18(vitest@4.1.10))(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): + vitest@4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.0)(@vitest/coverage-v8@4.0.18(vitest@4.1.10))(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/mocker': 4.1.10(vite@8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 @@ -23046,7 +23421,7 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.2.0(@types/node@24.10.0)(esbuild@0.28.1)(jiti@2.6.1)(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 @@ -23273,16 +23648,12 @@ snapshots: ws@8.20.0: {} - wsl-utils@0.1.0: - dependencies: - is-wsl: 3.1.1 - wsl-utils@0.3.1: dependencies: is-wsl: 3.1.1 powershell-utils: 0.1.0 - wxt@0.20.25(@types/node@24.10.0)(eslint@10.0.3(jiti@2.6.1))(jiti@2.6.1)(lightningcss@1.33.0)(oxc-parser@0.120.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1))(rollup@4.61.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3): + wxt@0.20.25(@types/node@24.10.0)(eslint@10.0.3(jiti@2.6.1))(jiti@2.6.1)(oxc-parser@0.120.0(@emnapi/core@2.0.0-alpha.3)(@emnapi/runtime@2.0.0-alpha.3))(rollup@4.61.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3): dependencies: '@1natsu/wait-element': 4.2.0 '@aklinker1/rollup-plugin-visualizer': 5.12.0(rollup@4.61.0) @@ -23322,8 +23693,8 @@ snapshots: publish-browser-extension: 4.0.5 scule: 1.3.0 tinyglobby: 0.2.17 - unimport: 6.2.0(oxc-parser@0.120.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)) - vite: 7.3.5(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) + unimport: 6.2.0(oxc-parser@0.120.0(@emnapi/core@2.0.0-alpha.3)(@emnapi/runtime@2.0.0-alpha.3)) + vite: 8.2.0(@types/node@24.10.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) vite-node: 6.0.0(@types/node@24.10.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.3) web-ext-run: 0.2.4 optionalDependencies: @@ -23334,7 +23705,6 @@ snapshots: - canvas - jiti - less - - lightningcss - oxc-parser - rollup - sass @@ -23383,6 +23753,8 @@ snapshots: yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} + yargs@15.4.1: dependencies: cliui: 6.0.0 @@ -23417,6 +23789,15 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yargs@18.1.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 8.2.2 + y18n: 5.0.8 + yargs-parser: 22.0.0 + yauzl@2.10.0: dependencies: buffer-crc32: 0.2.13 @@ -23443,6 +23824,8 @@ snapshots: cookie: 1.1.1 youch-core: 0.3.3 + zigpty@0.2.1: {} + zip-dir@2.0.0: dependencies: async: 3.2.6 @@ -23460,4 +23843,6 @@ snapshots: zod@4.3.6: {} + zod@4.4.3: {} + zwitch@2.0.4: {} diff --git a/scripts/compiled-string-plugin.ts b/scripts/compiled-string-plugin.ts index 12fffdf2710..350139b966a 100644 --- a/scripts/compiled-string-plugin.ts +++ b/scripts/compiled-string-plugin.ts @@ -28,7 +28,7 @@ export function compiledStringPlugin(): Plugin { 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 + * `rolldownOptions.maxParallelFileOps=1`. See * https://github.com/vitejs/vite/issues/20775 */ let code: string | null; 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 3f2376e8790..2d96985c510 100644 --- a/scripts/submodule-preloader.ts +++ b/scripts/submodule-preloader.ts @@ -18,7 +18,7 @@ export async function submodulePreloader(config: BuildConfig): Promise { formats: ['es'], fileName: () => 'preloader.mjs', }, - rollupOptions: { + rolldownOptions: { external: ['@qwik.dev/core/build'], }, minify: 'terser', diff --git a/scripts/submodule-worker.ts b/scripts/submodule-worker.ts index 1ed1b8f6e08..9fc31cbb15d 100644 --- a/scripts/submodule-worker.ts +++ b/scripts/submodule-worker.ts @@ -30,7 +30,7 @@ export async function submoduleWorker(config: BuildConfig) { formats: ['es'], fileName: () => 'index.mjs', }, - rollupOptions: { + rolldownOptions: { external: [ /^@qwik\.dev\/core(?:\/|$)/, './worker.js?worker&url', 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..2e25118b013 100755 --- a/starters/adapters/aws-lambda/adapters/aws-lambda/vite.config.ts +++ b/starters/adapters/aws-lambda/adapters/aws-lambda/vite.config.ts @@ -12,7 +12,7 @@ export default extendConfig(baseConfig, () => { 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..48305734685 100755 --- a/starters/adapters/firebase/adapters/firebase/vite.config.ts +++ b/starters/adapters/firebase/adapters/firebase/vite.config.ts @@ -11,7 +11,7 @@ export default extendConfig(baseConfig, () => { 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",