From 201fd4224be1fe298143fcb7ed79a52180e3d440 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Tue, 10 Nov 2026 12:28:46 +0000 Subject: [PATCH 01/19] feat!: build with tsdown instead of unbuild --- example/src/runtime/assets/config.json | 3 + example/src/runtime/components/TestMe.css | 3 + .../src/runtime/composables/useAliasedApp.ts | 9 + example/src/runtime/composables/useAppNuxt.ts | 3 + knip.json | 6 - package.json | 25 +- pnpm-lock.yaml | 1528 ++++------------- pnpm-workspace.yaml | 1 + src/build/advice.ts | 10 + src/build/aliases.ts | 69 + src/build/build.ts | 199 +++ src/build/deprecations.ts | 76 + src/build/entries.ts | 24 + src/build/externals.ts | 48 + src/build/guide.ts | 28 + src/build/loader.ts | 50 + src/build/meta.ts | 24 + src/build/runtime-externals.ts | 92 + src/build/stub.ts | 49 + src/build/tsconfig.ts | 42 + src/build/types.ts | 94 + src/commands/build.ts | 299 +--- src/rolldown/declarations.ts | 167 ++ src/rolldown/index.ts | 3 + src/rolldown/resolve.ts | 104 ++ src/rolldown/stylesheets.ts | 71 + src/rolldown/transpile-dir.ts | 612 +++++++ src/rolldown/tsconfig.ts | 333 ++++ src/rolldown/vue.ts | 78 + test/__snapshots__/JsxComponent.js | 4 +- test/__snapshots__/TestMe.vue | 12 +- test/__snapshots__/TestMe.vue.d.ts | 6 +- test/__snapshots__/TestMeSetup.d.vue.ts | 2 +- test/__snapshots__/TestMeSetup.vue | 7 +- test/__snapshots__/TestMeSetup.vue.d.ts | 2 +- test/build.spec.ts | 818 ++++++++- test/rolldown.spec.ts | 278 +++ test/unit.spec.ts | 357 ++++ tsdown.config.ts | 2 +- 39 files changed, 3999 insertions(+), 1539 deletions(-) create mode 100644 example/src/runtime/assets/config.json create mode 100644 example/src/runtime/components/TestMe.css create mode 100644 example/src/runtime/composables/useAliasedApp.ts create mode 100644 example/src/runtime/composables/useAppNuxt.ts create mode 100644 src/build/advice.ts create mode 100644 src/build/aliases.ts create mode 100644 src/build/build.ts create mode 100644 src/build/deprecations.ts create mode 100644 src/build/entries.ts create mode 100644 src/build/externals.ts create mode 100644 src/build/guide.ts create mode 100644 src/build/loader.ts create mode 100644 src/build/meta.ts create mode 100644 src/build/runtime-externals.ts create mode 100644 src/build/stub.ts create mode 100644 src/build/tsconfig.ts create mode 100644 src/build/types.ts create mode 100644 src/rolldown/declarations.ts create mode 100644 src/rolldown/index.ts create mode 100644 src/rolldown/resolve.ts create mode 100644 src/rolldown/stylesheets.ts create mode 100644 src/rolldown/transpile-dir.ts create mode 100644 src/rolldown/tsconfig.ts create mode 100644 src/rolldown/vue.ts create mode 100644 test/rolldown.spec.ts create mode 100644 test/unit.spec.ts diff --git a/example/src/runtime/assets/config.json b/example/src/runtime/assets/config.json new file mode 100644 index 00000000..1127abef --- /dev/null +++ b/example/src/runtime/assets/config.json @@ -0,0 +1,3 @@ +{ + "greeting": "hello from a non-code runtime file" +} diff --git a/example/src/runtime/components/TestMe.css b/example/src/runtime/components/TestMe.css new file mode 100644 index 00000000..f760fc74 --- /dev/null +++ b/example/src/runtime/components/TestMe.css @@ -0,0 +1,3 @@ +.test-me { + color: rebeccapurple; +} diff --git a/example/src/runtime/composables/useAliasedApp.ts b/example/src/runtime/composables/useAliasedApp.ts new file mode 100644 index 00000000..fbc215cb --- /dev/null +++ b/example/src/runtime/composables/useAliasedApp.ts @@ -0,0 +1,9 @@ +import { useNuxtApp } from '#app' +import { useRouter } from '#app/composables/router' +import { useCookie } from '#app/composables/cookie' + +export const useAppRouter = () => useRouter() + +export const useAppCookie = (name: string) => useCookie(name) + +export const useAppInstance = () => useNuxtApp() diff --git a/example/src/runtime/composables/useAppNuxt.ts b/example/src/runtime/composables/useAppNuxt.ts new file mode 100644 index 00000000..b59d1cd7 --- /dev/null +++ b/example/src/runtime/composables/useAppNuxt.ts @@ -0,0 +1,3 @@ +import { useNuxtApp } from '#app/nuxt' + +export const useAppFromNuxt = () => useNuxtApp() diff --git a/knip.json b/knip.json index 0a1a1fb7..0e04da40 100644 --- a/knip.json +++ b/knip.json @@ -4,12 +4,6 @@ "test/__snapshots__/**" ], "workspaces": { - ".": { - "ignoreDependencies": [ - "mkdist", - "vue-sfc-transformer" - ] - }, "example": { "entry": [ "src/module.ts", diff --git a/package.json b/package.json index e67ff096..1d523d1d 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "type": "module", "exports": { ".": "./dist/index.mjs", + "./rolldown": "./dist/rolldown.mjs", "./package.json": "./package.json" }, "typesVersions": { @@ -14,6 +15,9 @@ "*": [ "./dist/*.d.mts" ], + "rolldown": [ + "./dist/rolldown.d.mts" + ], "package.json": [ "package.json" ] @@ -54,23 +58,29 @@ } }, "dependencies": { + "browserslist": "^4.29.5", "citty": "^0.2.2", "consola": "^3.4.2", - "defu": "^6.1.7", "get-tsconfig": "^4.14.3", "jiti": "^2.7.0", - "magic-regexp": "^0.11.2", - "mkdist": "^2.4.1", + "lightningcss": "^1.33.0", "mlly": "^1.8.2", "pathe": "^2.0.3", "pkg-types": "^2.4.0", - "unbuild": "^3.6.1", - "vue-sfc-transformer": "^0.3.1" + "tinyglobby": "^0.2.17", + "tsdown": "^0.23.7", + "vue-sfc-transformer": "^0.3.3" }, "peerDependencies": { "@nuxt/cli": "^3.37.0 || ^4.0.0", + "rolldown": "^1.0.0", "typescript": "^5.9.3" }, + "peerDependenciesMeta": { + "rolldown": { + "optional": true + } + }, "devDependencies": { "@arethetypeswrong/cli": "^0.18.5", "@arethetypeswrong/core": "^0.18.5", @@ -86,8 +96,9 @@ "ofetch": "^1.5.1", "pkg-pr-new": "^0.0.93", "publint": "^0.3.25", + "rolldown": "^1.3.0", + "sass": "^1.108.1", "tinyexec": "^1.3.1", - "tsdown": "^0.23.7", "typescript": "~5.9.3", "verkit": "^0.5.0", "vitest": "^5.1.0", @@ -95,6 +106,6 @@ "vue-tsc": "^3.3.14" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c153783c..d0217edc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -175,27 +175,24 @@ importers: .: dependencies: + browserslist: + specifier: ^4.29.5 + version: 4.29.5 citty: specifier: ^0.2.2 version: 0.2.2 consola: specifier: ^3.4.2 version: 3.4.2 - defu: - specifier: ^6.1.7 - version: 6.1.7 get-tsconfig: specifier: ^4.14.3 version: 4.14.3 jiti: specifier: ^2.7.0 version: 2.7.0 - magic-regexp: - specifier: ^0.11.2 - version: 0.11.2(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) - mkdist: - specifier: ^2.4.1 - version: 2.4.1(typescript@5.9.3)(vue-sfc-transformer@0.3.1(@volar/typescript@2.4.30(typescript@5.9.3))(@vue/compiler-core@3.5.45)(@vue/language-core@3.3.14)(esbuild@0.28.2)(rolldown@1.2.18)(typescript@5.9.3)(vue@3.5.45(typescript@5.9.3)))(vue-tsc@3.3.14(typescript@5.9.3))(vue@3.5.45(typescript@5.9.3)) + lightningcss: + specifier: ^1.33.0 + version: 1.33.0 mlly: specifier: ^1.8.2 version: 1.8.2 @@ -205,12 +202,15 @@ importers: pkg-types: specifier: ^2.4.0 version: 2.4.0 - unbuild: - specifier: ^3.6.1 - version: 3.6.1(typescript@5.9.3)(vue-sfc-transformer@0.3.1(@volar/typescript@2.4.30(typescript@5.9.3))(@vue/compiler-core@3.5.45)(@vue/language-core@3.3.14)(esbuild@0.28.2)(rolldown@1.2.18)(typescript@5.9.3)(vue@3.5.45(typescript@5.9.3)))(vue-tsc@3.3.14(typescript@5.9.3))(vue@3.5.45(typescript@5.9.3)) + tinyglobby: + specifier: ^0.2.17 + version: 0.2.17 + tsdown: + specifier: ^0.23.7 + version: 0.23.7(@arethetypeswrong/core@0.18.5)(@volar/typescript@2.4.30(typescript@5.9.3))(@vue/language-core@3.3.14)(oxc-resolver@11.24.2)(publint@0.3.25)(typescript@5.9.3)(vue-tsc@3.3.14(typescript@5.9.3)) vue-sfc-transformer: - specifier: ^0.3.1 - version: 0.3.1(@volar/typescript@2.4.30(typescript@5.9.3))(@vue/compiler-core@3.5.45)(@vue/language-core@3.3.14)(esbuild@0.28.2)(rolldown@1.2.18)(typescript@5.9.3)(vue@3.5.45(typescript@5.9.3)) + specifier: ^0.3.3 + version: 0.3.3(@volar/typescript@2.4.30(typescript@5.9.3))(@vue/compiler-core@3.5.45)(@vue/language-core@3.3.14)(esbuild@0.28.2)(rolldown@1.3.1)(typescript@5.9.3)(vue@3.5.45(typescript@5.9.3)) devDependencies: '@arethetypeswrong/cli': specifier: ^0.18.5 @@ -220,7 +220,7 @@ importers: version: 0.18.5 '@nuxt/cli': specifier: ^4.0.3 - version: 4.0.3(@nuxt/schema@4.6.4)(jiti@2.7.0)(oxc-parser@0.156.0)(rolldown@1.2.18)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + version: 4.0.3(@nuxt/schema@4.6.4)(jiti@2.7.0)(oxc-parser@0.156.0)(rolldown@1.3.1)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) '@nuxt/eslint-config': specifier: ^1.17.0 version: 1.17.0(@typescript-eslint/utils@8.72.2(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.9.3))(@vue/compiler-sfc@3.5.45)(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.9.3) @@ -247,7 +247,7 @@ importers: version: runtime:26.13.0 nuxt: specifier: ~4.6.4 - version: 4.6.4(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@oxc-project/types@0.157.0)(@types/node@26.6.6)(@vue/compiler-sfc@3.5.45)(acorn@8.19.0)(bare-buffer@3.7.1)(confbox@0.3.2)(db0@0.3.4)(dotenv@17.4.2)(esbuild@0.28.2)(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(giget@3.3.1)(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(mlly@1.8.2)(optionator@0.9.4)(oxc-parser@0.156.0)(rolldown@1.2.18)(rollup-plugin-visualizer@7.1.3(rolldown@1.2.18)(rollup@4.68.2))(rollup@4.68.2)(srvx@1.0.8)(supports-color@10.2.2)(terser@5.51.2)(typescript@5.9.3)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue-tsc@3.3.14(typescript@5.9.3))(yaml@2.9.1) + version: 4.6.4(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@oxc-project/types@0.157.0)(@parcel/watcher@2.6.0)(@types/node@26.6.6)(@vue/compiler-sfc@3.5.45)(acorn@8.19.0)(bare-buffer@3.7.1)(confbox@0.3.2)(db0@0.3.4)(dotenv@17.4.2)(esbuild@0.28.2)(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(giget@3.3.1)(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(mlly@1.8.2)(optionator@0.9.4)(oxc-parser@0.156.0)(rolldown@1.3.1)(rollup-plugin-visualizer@7.1.3(rolldown@1.3.1)(rollup@4.68.2))(rollup@4.68.2)(sass@1.108.1)(srvx@1.0.8)(supports-color@10.2.2)(terser@5.51.2)(typescript@5.9.3)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue-tsc@3.3.14(typescript@5.9.3))(yaml@2.9.1) ofetch: specifier: ^1.5.1 version: 1.5.1 @@ -257,12 +257,15 @@ importers: publint: specifier: ^0.3.25 version: 0.3.25 + rolldown: + specifier: ^1.3.0 + version: 1.3.1 + sass: + specifier: ^1.108.1 + version: 1.108.1 tinyexec: specifier: ^1.3.1 version: 1.3.1 - tsdown: - specifier: ^0.23.7 - version: 0.23.7(@arethetypeswrong/core@0.18.5)(@volar/typescript@2.4.30(typescript@5.9.3))(@vue/language-core@3.3.14)(oxc-resolver@11.24.2)(publint@0.3.25)(typescript@5.9.3)(vue-tsc@3.3.14(typescript@5.9.3)) typescript: specifier: ~5.9.3 version: 5.9.3 @@ -271,7 +274,7 @@ importers: version: 0.5.0 vitest: specifier: ^5.1.0 - version: 5.1.0(@types/node@26.6.6)(@vitest/coverage-v8@5.1.0)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + version: 5.1.0(@types/node@26.6.6)(@vitest/coverage-v8@5.1.0)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) vue: specifier: ^3.5.45 version: 3.5.45(typescript@5.9.3) @@ -283,14 +286,14 @@ importers: dependencies: '@nuxt/kit': specifier: ~4.6.4 - version: 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))) + version: 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))) devDependencies: '@nuxt/module-builder': specifier: workspace:* version: link:.. nuxt: specifier: ~4.6.4 - version: 4.6.4(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@oxc-project/types@0.157.0)(@types/node@26.6.6)(@vue/compiler-sfc@3.5.45)(acorn@8.19.0)(bare-buffer@3.7.1)(confbox@0.3.2)(db0@0.3.4)(dotenv@17.4.2)(esbuild@0.28.2)(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(giget@3.3.1)(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(mlly@1.8.2)(optionator@0.9.4)(oxc-parser@0.156.0)(rolldown@1.2.18)(rollup-plugin-visualizer@7.1.3(rolldown@1.2.18)(rollup@4.68.2))(rollup@4.68.2)(srvx@1.0.8)(supports-color@10.2.2)(terser@5.51.2)(typescript@5.9.3)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue-tsc@3.3.14(typescript@5.9.3))(yaml@2.9.1) + version: 4.6.4(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@oxc-project/types@0.157.0)(@parcel/watcher@2.6.0)(@types/node@26.6.6)(@vue/compiler-sfc@3.5.45)(acorn@8.19.0)(bare-buffer@3.7.1)(confbox@0.3.2)(db0@0.3.4)(dotenv@17.4.2)(esbuild@0.28.2)(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(giget@3.3.1)(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(mlly@1.8.2)(optionator@0.9.4)(oxc-parser@0.156.0)(rolldown@1.3.1)(rollup-plugin-visualizer@7.1.3(rolldown@1.3.1)(rollup@4.68.2))(rollup@4.68.2)(sass@1.108.1)(srvx@1.0.8)(supports-color@10.2.2)(terser@5.51.2)(typescript@5.9.3)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue-tsc@3.3.14(typescript@5.9.3))(yaml@2.9.1) example/playground: dependencies: @@ -299,7 +302,7 @@ importers: version: link:.. nuxt: specifier: ~4.6.4 - version: 4.6.4(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@oxc-project/types@0.157.0)(@types/node@26.6.6)(@vue/compiler-sfc@3.5.45)(acorn@8.19.0)(bare-buffer@3.7.1)(confbox@0.3.2)(db0@0.3.4)(dotenv@17.4.2)(esbuild@0.28.2)(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(giget@3.3.1)(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(mlly@1.8.2)(optionator@0.9.4)(oxc-parser@0.156.0)(rolldown@1.2.18)(rollup-plugin-visualizer@7.1.3(rolldown@1.2.18)(rollup@4.68.2))(rollup@4.68.2)(srvx@1.0.8)(supports-color@10.2.2)(terser@5.51.2)(typescript@5.9.3)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue-tsc@3.3.14(typescript@5.9.3))(yaml@2.9.1) + version: 4.6.4(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@oxc-project/types@0.157.0)(@parcel/watcher@2.6.0)(@types/node@26.6.6)(@vue/compiler-sfc@3.5.45)(acorn@8.19.0)(bare-buffer@3.7.1)(confbox@0.3.2)(db0@0.3.4)(dotenv@17.4.2)(esbuild@0.28.2)(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(giget@3.3.1)(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(mlly@1.8.2)(optionator@0.9.4)(oxc-parser@0.156.0)(rolldown@1.3.1)(rollup-plugin-visualizer@7.1.3(rolldown@1.3.1)(rollup@4.68.2))(rollup@4.68.2)(sass@1.108.1)(srvx@1.0.8)(supports-color@10.2.2)(terser@5.51.2)(typescript@5.9.3)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue-tsc@3.3.14(typescript@5.9.3))(yaml@2.9.1) devDependencies: typescript: specifier: ~5.9.3 @@ -329,10 +332,6 @@ packages: resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/code-frame@8.0.6': - resolution: {integrity: sha512-uMHhvmDmwFiLuiozaoRYTZHqMFuu3fem/X9JY78lohAuLoh8LSGGC8JqUzo2cVuBsBxkjMZNk56CE7ock8Xxkw==} - engines: {node: ^22.18.0 || >=24.11.0} - '@babel/compat-data@7.29.7': resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} @@ -488,9 +487,6 @@ packages: resolution: {integrity: sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==} engines: {node: '>=18.0.0'} - '@colordx/core@5.8.0': - resolution: {integrity: sha512-cG0QJAO6VkaRUlIb0zOzX9gfJgs1pjoOL9gZ/PK1kfvBs0GCkADu5oQh6gPxXgQnZ3gV575h+lQRC0NlMDTclA==} - '@colordx/core@7.3.0': resolution: {integrity: sha512-LVzTTPhX7wpy7TkGjouA9zbbCBIw92RGm7ZQqSKFE0oYE3sMx2FGXz90eVpgw7k/+wrrY+qJ86nHXifZWMS5jA==} @@ -534,312 +530,156 @@ packages: resolution: {integrity: sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==} engines: {node: '>=10'} - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.28.2': resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.28.2': resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.28.2': resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.28.2': resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.28.2': resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.28.2': resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.28.2': resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.28.2': resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.28.2': resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.28.2': resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.28.2': resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.28.2': resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.28.2': resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.28.2': resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.28.2': resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.28.2': resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.28.2': resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.28.2': resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.28.2': resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.28.2': resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.28.2': resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - '@esbuild/openharmony-arm64@0.28.2': resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.28.2': resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.28.2': resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.28.2': resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.28.2': resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} engines: {node: '>=18'} @@ -1394,12 +1234,94 @@ packages: cpu: [x64] os: [win32] + '@parcel/watcher-android-arm64@2.6.0': + resolution: {integrity: sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.6.0': + resolution: {integrity: sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.6.0': + resolution: {integrity: sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.6.0': + resolution: {integrity: sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.6.0': + resolution: {integrity: sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.6.0': + resolution: {integrity: sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.6.0': + resolution: {integrity: sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.6.0': + resolution: {integrity: sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.6.0': + resolution: {integrity: sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.6.0': + resolution: {integrity: sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + '@parcel/watcher-wasm@2.6.0': resolution: {integrity: sha512-dtjbDxKSDPQ8AmA+pS4OFaHE1FKrjtGpLGBxw85uKFkRorjNbvDM/aFPgqosu40wprbp1xw2ZSxIKqghCUHe2w==} engines: {node: '>= 10.0.0'} bundledDependencies: - napi-wasm + '@parcel/watcher-win32-arm64@2.6.0': + resolution: {integrity: sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-x64@2.6.0': + resolution: {integrity: sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.6.0': + resolution: {integrity: sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==} + engines: {node: '>= 10.0.0'} + '@pnpm/constants@1001.3.1': resolution: {integrity: sha512-2hf0s4pVrVEH8RvdJJ7YRKjQdiG8m0iAT26TTqXnCbK30kKwJW69VLmP5tED5zstmDRXcOeH5eRcrpkdwczQ9g==} engines: {node: '>=18.12'} @@ -1635,15 +1557,6 @@ packages: '@rolldown/pluginutils@1.1.0': resolution: {integrity: sha512-K+NU2HDCEem4sClgHH4ZZXwdJeNFkJo+hRk479DIwdIviAPN2hFJH1KHHwg8CxHQXvi0M5XY4deTXINfIiSG6w==} - '@rollup/plugin-alias@5.1.1': - resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/plugin-alias@6.0.1': resolution: {integrity: sha512-08wjv2HEuyxIuriLELnksoX+so83XnJ5E4hbVeCHkWlwOcaRQaHYxpUTAplnZjrlh/l5mZgvH1itNC9kcTfTTA==} engines: {node: '>=20.19.0'} @@ -1653,15 +1566,6 @@ packages: rollup: optional: true - '@rollup/plugin-commonjs@28.0.9': - resolution: {integrity: sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA==} - engines: {node: '>=16.0.0 || 14 >= 14.17'} - peerDependencies: - rollup: ^2.68.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/plugin-commonjs@29.0.3': resolution: {integrity: sha512-ZaOxZceP7SOUW7Lqw5IRVweSQYWaeIPnXIGLiB690EBA3FGJTO40EEr2L5yZplJWsgTCogILRSpcAe7+U0Otdg==} engines: {node: '>=16.0.0 || 14 >= 14.17'} @@ -2548,9 +2452,6 @@ packages: cacheable@2.5.0: resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==} - caniuse-api@3.0.0: - resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-api@4.0.0: resolution: {integrity: sha512-B0hQ1OLyJuHTQSOWXvwibWqM6DCoqJdvBA6X1S/53bd4XU7LJ1yurIPlrsouol3mw1jh9pGI4ivubSpmJeIqCA==} @@ -2643,10 +2544,6 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} - commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -2732,60 +2629,12 @@ packages: srvx: optional: true - css-declaration-sorter@7.4.0: - resolution: {integrity: sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.0.9 - - css-select@6.0.0: - resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==} - - css-tree@2.2.1: - resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - - css-tree@3.2.1: - resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - - css-what@7.0.0: - resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==} - engines: {node: '>= 6'} - - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - - cssnano-preset-default@7.0.17: - resolution: {integrity: sha512-11qO63A+czwguQFJCaTdICvbaxn0pJzz/XghLlv+OT7WyToDxAMR0Xb3/26/l0y0hQJywwNbj/SLSQlGBHE1OA==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - cssnano-utils@5.0.3: - resolution: {integrity: sha512-ynIREMICLxkxm7e9bCR9sh75s4Q5drICi0ua1yxo5jH2XPBqSKkl4dOh4EbFqtUmnTMhRffHgYL0EKKkMjtJTg==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - cssnano@7.1.9: - resolution: {integrity: sha512-uPR75+5Dk/WJ/YSPR1/YDHdwMM9c5FsaARljfKWgeCKLKOtJ0we21xy/RcCjn53fZnD/f6yYEIZ8pu18+GnbNQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - cssnano@9.9.0: resolution: {integrity: sha512-JS914Th2NRk2979JHJvbE3UjPtLmyXtPnr23NNul9BOQwEt9r/A2aM1STrKtKHAPc3XRaUDwMoqkXnjEpgHkAw==} engines: {node: ^22.22.3 || ^24.15.0 || >=26.0} peerDependencies: postcss: ^8.5.29 - csso@5.0.5: - resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -2870,19 +2719,6 @@ packages: resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} engines: {node: '>=0.3.1'} - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - - domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dot-prop@10.2.0: resolution: {integrity: sha512-BTJ9aZYL3vCfZlZOBLy9v8TUqWGQ0pzFnygKwFZt5udj6viBoFIBviKPUoZLDCPn1FoXffv6McQFDenrm5Krfw==} engines: {node: '>=20'} @@ -2957,11 +2793,6 @@ packages: es-module-lexer@3.0.4: resolution: {integrity: sha512-BldNY5mwkVu+cQ5Ymn3e6hB9Sx8XHx4ZevWbiUyZbfKxJxYO27Hf0wfzkxIaD5CAJMaGl3YspKELj0ff/7nCMA==} - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.28.2: resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} engines: {node: '>=18'} @@ -3211,9 +3042,6 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - fix-dts-default-cjs-exports@1.0.1: - resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} - flat-cache@6.1.23: resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} @@ -3396,6 +3224,9 @@ packages: image-meta@0.3.1: resolution: {integrity: sha512-rKANCbmsJCZ3/q87GTWZ+8MhOvhPLjsScznVtqvBoTu6Tyq8FzdPoBUMl/ZxQXy+/5I+C1vxXwS1jSwmHgmDLQ==} + immutable@5.1.10: + resolution: {integrity: sha512-Uu72qZXUtm+n98uML3Xr6pVFHl4xnmeCuAsrm0VqFlQim/Ib6NrPSJLpx6CrZ/G6DnoGaCUgtx8gY+o+ovxnCw==} + import-without-cache@0.4.1: resolution: {integrity: sha512-vXoV9PjKHEednCUu01e98TkImxy67e3BJXbTIOmIq4Hyzw3IAwYRcuPkfeTzJzwyyts4kjuA73x+pWJLc4f86A==} engines: {node: ^22.18.0 || >=24.0.0} @@ -3523,10 +3354,6 @@ packages: resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} engines: {node: '>=20'} - jiti@1.21.7: - resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} - hasBin: true - jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true @@ -3673,10 +3500,6 @@ packages: resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} - lilconfig@3.1.4: - resolution: {integrity: sha512-zJZyBmQhArDRefuWTypZxwDpFDIYmrj8ypSBvwGD5P13Y95s6DjzKgu4DVdGbeQa5PDEsAOCAPNk4X+QOR006w==} - engines: {node: '>=14'} - list-installed@7.0.0: resolution: {integrity: sha512-LB24pyC5ciM0Wt70ivQgFpWxGZMVE9kmfGdXnoXvEa5dq6HeIw/LylX+SH2ws0dYMQXsyx3giN/QMAkoyuEzSA==} engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} @@ -3702,12 +3525,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - - lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - lru-cache@11.5.3: resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} engines: {node: 20 || >=22} @@ -3715,9 +3532,6 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - magic-regexp@0.11.2: - resolution: {integrity: sha512-s4i7mq2jJnkB5J1HDX67GmdRoWrgo8tE0cL91bKO+HaquxyR5TiqkjVfLhgS2PXretsN/Gv9kSnRBgQxrLO/Qw==} - magic-string-ast@1.0.3: resolution: {integrity: sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==} engines: {node: '>=20.19.0'} @@ -3746,12 +3560,6 @@ packages: engines: {node: '>= 16'} hasBin: true - mdn-data@2.0.28: - resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} - - mdn-data@2.27.1: - resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} - mdn-data@2.37.2: resolution: {integrity: sha512-rz9YOBGItdSbe7HcSArUbhiAv4SB/4DKRYg96CSFS2CcIYMbUvBtZlzA1NCbk2AdgbmYwMqwNblLpR441lLeiQ==} @@ -3802,27 +3610,6 @@ packages: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} - mkdist@2.4.1: - resolution: {integrity: sha512-Ezk0gi04GJBkqMfsksICU5Rjoemc4biIekwgrONWVPor2EO/N9nBgN6MZXAf7Yw4mDDhrNyKbdETaHNevfumKg==} - hasBin: true - peerDependencies: - sass: ^1.92.1 - typescript: ~5.9.3 - vue: ^3.5.45 - vue-sfc-transformer: ^0.1.1 - vue-tsc: ^3.3.14 - peerDependenciesMeta: - sass: - optional: true - typescript: - optional: true - vue: - optional: true - vue-sfc-transformer: - optional: true - vue-tsc: - optional: true - mlly@1.8.2: resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} @@ -3881,6 +3668,9 @@ packages: xml2js: optional: true + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-emoji@2.2.0: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} engines: {node: '>=18'} @@ -4269,186 +4059,18 @@ packages: resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} engines: {node: '>=12.0.0'} - postcss-calc@10.1.1: - resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==} - engines: {node: ^18.12 || ^20.9 || >=22.0} - peerDependencies: - postcss: ^8.4.38 - postcss-calc@11.2.3: resolution: {integrity: sha512-pFW3MR2a4W7uHcSGUiyQGGXZWHon83ljbNwnUJ1mRKublWQbv+3o9NiqhlV4TJfNby+U+zLY2OgiywzhA5eFqw==} engines: {node: ^22.22.3 || ^24.15 || >=26.0} peerDependencies: postcss: ^8.5.29 - postcss-colormin@7.0.10: - resolution: {integrity: sha512-yFr6JezOolHLta/buLE71VKPh2mXursp4saVe98/ol8ZnEWhL+racShqPKlvd/DKWLre/39B6HhcMXf7RZ3hxg==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-convert-values@7.0.12: - resolution: {integrity: sha512-xurKu5qqk4viR3Cp3p4xBR4KfnZm4w4ys6+UBwBmeuBSNkH7+DtLnYOYnOffgtE4yx8sH9S1VZ6RAAvROXzP2Q==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 + postcss-selector-parser@7.2.0: + resolution: {integrity: sha512-Khh/tERVBn0I1499dvBSHY0pWJloMJWUxDsOBM0CCDPAcVZ10Jl2L1qy1f19uEX22spa8Mv7DCdEQJc0cGwBhQ==} + engines: {node: '>=4'} - postcss-discard-comments@7.0.8: - resolution: {integrity: sha512-CvvS5S9WrXblFXCEJ9nVo+4z+eA7zSC7Z88V1HEJuwlQhlFnYTIjg1xJY+BCUiG2bvICap2tXii4mP22BD108Q==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-discard-duplicates@7.0.4: - resolution: {integrity: sha512-VBNn1+EuMZkeGVVtz0gRfbNGtx9IFgAsAV+E2pHtXPrp4qfGBkhTIiAuE/wrb+Y6Pakg9NewAlfTpYIFAWODtw==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-discard-empty@7.0.3: - resolution: {integrity: sha512-M2pyjQCU+/7cMHVtL6bKTHjv0lZnPLMpicgr67Dlth7AbuV9gjVTtUqaRwn6Pp6BwSDspUzhz8SaUrRykJU5Dw==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-discard-overridden@7.0.3: - resolution: {integrity: sha512-aNovXo9UsZuRNLzHJtp13lHIvinDPfiXBPePpXkSjCbgp++iU2FqE+YxvjIsg6EdyPZsASFbfu+JcBFVsErXIQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-merge-longhand@7.0.7: - resolution: {integrity: sha512-b3mfYUxR388u5Pt0HPcVIUtUDn/k15UfTY9M+ORW+meCR6JLNxoZffiYvXyOYQoRYQNZyX/UFkMCM/mNHxe1qA==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-merge-rules@7.0.11: - resolution: {integrity: sha512-SJUPM18g2BmPhf8BVlbwqWz4aK3pLu6u6xjfwEzra7xL6IBR10sUaiB++EzqcVfadPHrKBSMlNdP+XieykhI+Q==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-minify-font-values@7.0.3: - resolution: {integrity: sha512-yilG/VOaNI74IylQvAQQxm3/wZVBkXyYUqNUAdxqwtbWUXPsbK1q8Ms0mL83v+f8YicgcyfYCRZtWACUdYajpA==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-minify-gradients@7.0.5: - resolution: {integrity: sha512-YraROyQRg3BI1+Hg8E05B/JPdnTm8EDSVu4P2BxdM+CRiOyfmou809+chGIqo6fQqwjPGQ947nbGncSjmTU1WQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-minify-params@7.0.9: - resolution: {integrity: sha512-R8itbB8BhlpoYyBm1ou0dD+vJnQ3F6adQipR4UnkCHUwlo+S9WXJaDRg1RHjC8YVAtIdrQzSWvJl40HnGDTKjA==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-minify-selectors@7.1.2: - resolution: {integrity: sha512-aQtrEWKwqafNlExcKHQvPGsXR2+vlUqqJtf5XsCQcgsSb5PL4wlujWBYDJuWsP4UnQX1YHDHU8qRlD+1PzTQ+Q==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-nested@7.0.2: - resolution: {integrity: sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==} - engines: {node: '>=18.0'} - peerDependencies: - postcss: ^8.2.14 - - postcss-normalize-charset@7.0.3: - resolution: {integrity: sha512-NoBfZu8PR4c2NlmjvrqQTzCzLY79hwcSRgNQ3ZiNK0ABzf9kYKloE/jNj+/8GQY1wsm8pRRgANk6ydLH8cwo0Q==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-normalize-display-values@7.0.3: - resolution: {integrity: sha512-ldsCX0QIt05pKIOobZtVQ48wXJecr+czw4+e1/YjVhLMqslShgpVxgPtI2CefURR8oyVoYaU/l829MMwExDMLw==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-normalize-positions@7.0.4: - resolution: {integrity: sha512-VEvlpeGd3Ju1Hqa/oN4jaP3+ms4laYwkEL9N9u+B6k54PZjXbW1n6wI+aVprf1BQXlCYpS5+1pl/7/vHiKgARg==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-normalize-repeat-style@7.0.4: - resolution: {integrity: sha512-6mPKlY/8cSaDHxX502wERADarJsccwlky6yIrOapHH2ZgfoKAV94SbiTKfKEs4EEpdazuc3J72WsqeYk7hp9+Q==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-normalize-string@7.0.3: - resolution: {integrity: sha512-HnEQPUchi1eznmDKEYrKUTqrprEq97SrpUYClgUkv7V2zRODD9DFoUsYU+m9ZOetmD5ku7fEMZB/lwy8IT6xVQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-normalize-timing-functions@7.0.3: - resolution: {integrity: sha512-zmEzHdvpZBZu0OKlbJSfgASQvaayyAoVuWtvyr34IJ/LyS+DaOKvvR3EvFJ9RWWtNIx+CMvO125OVophaxNYew==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-normalize-unicode@7.0.9: - resolution: {integrity: sha512-DRAdWfeh/TjmhLJsw91vdiWCnUod9iwvM7xyS02/nF/sLsCR3A8l3pztrSUrWG8DSBqfX7yEk9FM0USaVJ2mSg==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-normalize-url@7.0.3: - resolution: {integrity: sha512-CL93wmloq5qsffmFv+bw24MIRbmhHrp53qoh1LDAb/5TtjWEXI/np4xcP/Gw9oWCb2XyWnqHYLDUwiKRoJBA1Q==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-normalize-whitespace@7.0.3: - resolution: {integrity: sha512-FdHjjn+Ht5Z2ZRjNOmeCbNq6lq09sUYKpmlF/Aq0XjVNSLTL6fmHlA/3swN2wP2caY9GV/tjSDcIIyS7aN7W0A==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-ordered-values@7.0.4: - resolution: {integrity: sha512-nubSi49hDHQk4E8KIj+IbLY8Bg+8OcSUEhgyolgM+atnOvXjV7EjaR6bac4YGZoFyPa9mWoAF3EaYbWdFkKqVg==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-reduce-initial@7.0.9: - resolution: {integrity: sha512-ztTNPdIxXTxtBcG03E9u8v44M4ElXbMIRT7pf2onlquGula0Y83nKKxqM22FA/hMgkfCjN7ohevkVlaNwI8iOQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-reduce-transforms@7.0.3: - resolution: {integrity: sha512-FXsnN9ZwcZTT8Yf8cAHA8qIGUXcX6WfLd9JoYhrdDfmvsVhhfqkkv7m4AC3rwFOfz+GzkUa87OCKF9dUcicd+g==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-selector-parser@7.2.0: - resolution: {integrity: sha512-Khh/tERVBn0I1499dvBSHY0pWJloMJWUxDsOBM0CCDPAcVZ10Jl2L1qy1f19uEX22spa8Mv7DCdEQJc0cGwBhQ==} - engines: {node: '>=4'} - - postcss-svgo@7.1.3: - resolution: {integrity: sha512-2QfoFOYMcj8lwcVEf9WeTlkVIAm7u2QvOEhMzkQU3KUhhGX/l8hVV9EtjMv4iq3E9iI3OeeMN0YoMLbGusuigw==} - engines: {node: ^18.12.0 || ^20.9.0 || >= 18} - peerDependencies: - postcss: ^8.5.13 - - postcss-unique-selectors@7.0.7: - resolution: {integrity: sha512-d+sCkaRnSefghOUdH8CMJZV9yUQhj2ojpe8Nw/lA+LV1UOfeleGkLTl6XdCFFSai9UJ+DJPb69FFuqthXYsY8w==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} postcss@8.5.32: resolution: {integrity: sha512-LJlKCCAUFKOuZxipUdYw1NzIITEsPcgyOG9LkvRJvuKj/bRzbuRY0ARXvL0pWGpsZvn8jku+LMep2eU0seHp8g==} @@ -4559,10 +4181,6 @@ packages: resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - regjsparser@0.13.4: resolution: {integrity: sha512-EWV80YgFaVgFrjGCAsV7oybp4GOxbls5RzBg8OB0nKEVXsBJR1JlV8Di1JhCROg3MzTfe1RI8yitIm1eOs68iA==} hasBin: true @@ -4639,17 +4257,6 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rollup-plugin-dts@6.5.1: - resolution: {integrity: sha512-jODTXp3H7MK/Ur/ErtsrQ0G1GvaCmc3du+y5pNrdBMf6d7HlL2Nd/N6TkEr+f75CkUj01zEoEd7y2elH0eHi1Q==} - engines: {node: '>=20'} - peerDependencies: - '@typescript/typescript6': ^6 - rollup: ^3 || ^4 - typescript: ~5.9.3 - peerDependenciesMeta: - '@typescript/typescript6': - optional: true - rollup-plugin-visualizer@7.1.3: resolution: {integrity: sha512-P7G0p9RowDd0ahXXBtx4MOHlSVzclyW5pDeZ2Z0HensWSI9vJdu2bqdZDsD375g+0AxND8VJzWYuKD9yH38etw==} engines: {node: '>=22'} @@ -4688,9 +4295,10 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - sax@1.6.1: - resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} - engines: {node: '>=11.0.0'} + sass@1.108.1: + resolution: {integrity: sha512-sIYgSvOPeD9wABwDS/ofNjHASSck+7h3jLkk7wG1NPFL3XeS6vOQjBlAFSmRV09kZr1yt/Tuayt6kKtBbLjHNQ==} + engines: {node: '>=20.19.0'} + hasBin: true scslre@0.3.0: resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} @@ -4885,12 +4493,6 @@ packages: structured-clone-es@2.0.1: resolution: {integrity: sha512-10ZL5r77LhknxlP1FBiCW+VdnuWOEFLdSS2SKtjyEV+L4qP1hUEIMIZW94LC3jKxRmT/Dj7KkD1mqh/IY6lhKQ==} - stylehacks@7.0.11: - resolution: {integrity: sha512-iODNfhXVLqc5LADs+Y6Oh5wJuK5ZcHbVng8aiK3y9pjMQdc5hLrBW0eFU6FtnpNrE6PoEg/MmFTU4waotj5WNg==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.5.13 - super-regex@1.1.0: resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} engines: {node: '>=18'} @@ -4911,11 +4513,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svgo@4.1.0: - resolution: {integrity: sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==} - engines: {node: '>=16'} - hasBin: true - tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} @@ -5053,9 +4650,6 @@ packages: resolution: {integrity: sha512-NoSdpq/WEiAg5sjmBkmV/hfxv6HJH4NqPNrqjtSO5CwRmpsDfaf4begxW34KdJykH/l1yHtwBWQkCRdoXO8mPA==} engines: {node: '>=20'} - type-level-regexp@0.1.17: - resolution: {integrity: sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg==} - typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -5075,15 +4669,6 @@ packages: resolution: {integrity: sha512-t3OptUArewg9OpYGDskTSlxhyLDahfmZ4d36hE44Efb1y3HRLLpzsVqwH+AwBVymP4t7pP71xN+nnduudn2awA==} engines: {node: '>=14'} - unbuild@3.6.1: - resolution: {integrity: sha512-+U5CdtrdjfWkZhuO4N9l5UhyiccoeMEXIc2Lbs30Haxb+tRwB3VwB8AoZRxlAzORXunenSo+j6lh45jx+xkKgg==} - hasBin: true - peerDependencies: - typescript: ~5.9.3 - peerDependenciesMeta: - typescript: - optional: true - unconfig-core@7.5.0: resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} @@ -5374,7 +4959,7 @@ packages: resolution: {integrity: sha512-ShOFe2PURXGvRS5OrgmOLZOCwDTD7dEBVt0tMpFPKb9AsvqXKCRGM8QgKrUbRbJYFXScHvDPpGRd28rYidC0tA==} engines: {node: '>=14'} peerDependencies: - '@nuxt/kit': '*' + '@nuxt/kit': ~4.6.4 vite: ^6.0.0 || ^7.0.0-0 || ^8.0.0-0 peerDependenciesMeta: '@nuxt/kit': @@ -5519,8 +5104,8 @@ packages: vite: optional: true - vue-sfc-transformer@0.3.1: - resolution: {integrity: sha512-GxRDX31O3B20+nZ+8TS5yNlGqSTE3VPvTwyAukyLPdpZUprrdFXmKgJmBRFtaJdS3hcxgWI8NBR/k6KuQiPsVQ==} + vue-sfc-transformer@0.3.3: + resolution: {integrity: sha512-LnAtfF7HnseNl0iMEtYXgesT9LSaNfgHLTkwqgnYLOnEdOrKBdA1nxUTH3XvdCljzdyhTTJuSCT5IpP2G/Cvsw==} engines: {node: '>=18.0.0'} peerDependencies: '@volar/typescript': ^2.4.0 @@ -5718,12 +5303,6 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/code-frame@8.0.6': - dependencies: - '@babel/helper-validator-identifier': 8.0.6 - js-tokens: 10.0.0 - optional: true - '@babel/compat-data@7.29.7': {} '@babel/core@7.29.13(supports-color@10.2.2)': @@ -5929,8 +5508,6 @@ snapshots: '@cloudflare/kv-asset-handler@0.4.2': {} - '@colordx/core@5.8.0': {} - '@colordx/core@7.3.0': {} '@colors/colors@1.5.0': @@ -5938,17 +5515,17 @@ snapshots: '@csstools/css-tokenizer@4.0.2': {} - '@dxup/nuxt@0.5.11(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(esbuild@0.28.2)(giget@3.3.1)(jiti@2.7.0)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))': + '@dxup/nuxt@0.5.11(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(esbuild@0.28.2)(giget@3.3.1)(jiti@2.7.0)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))': dependencies: '@dxup/unimport': 0.1.2 - '@nuxt/kit': 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))) + '@nuxt/kit': 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))) '@vue/compiler-dom': 3.5.45 chokidar: 6.0.0 knitwork: 1.3.0 magic-string: 1.4.5 pathe: 2.0.3 tinyglobby: 0.2.17 - unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) transitivePeerDependencies: - '@farmfe/core' - '@nuxt/schema' @@ -6012,159 +5589,81 @@ snapshots: '@es-joy/resolve.exports@1.2.0': {} - '@esbuild/aix-ppc64@0.25.12': - optional: true - '@esbuild/aix-ppc64@0.28.2': optional: true - '@esbuild/android-arm64@0.25.12': - optional: true - '@esbuild/android-arm64@0.28.2': optional: true - '@esbuild/android-arm@0.25.12': - optional: true - '@esbuild/android-arm@0.28.2': optional: true - '@esbuild/android-x64@0.25.12': - optional: true - '@esbuild/android-x64@0.28.2': optional: true - '@esbuild/darwin-arm64@0.25.12': - optional: true - '@esbuild/darwin-arm64@0.28.2': optional: true - '@esbuild/darwin-x64@0.25.12': - optional: true - '@esbuild/darwin-x64@0.28.2': optional: true - '@esbuild/freebsd-arm64@0.25.12': - optional: true - '@esbuild/freebsd-arm64@0.28.2': optional: true - '@esbuild/freebsd-x64@0.25.12': - optional: true - '@esbuild/freebsd-x64@0.28.2': optional: true - '@esbuild/linux-arm64@0.25.12': - optional: true - '@esbuild/linux-arm64@0.28.2': optional: true - '@esbuild/linux-arm@0.25.12': - optional: true - '@esbuild/linux-arm@0.28.2': optional: true - '@esbuild/linux-ia32@0.25.12': - optional: true - '@esbuild/linux-ia32@0.28.2': optional: true - '@esbuild/linux-loong64@0.25.12': - optional: true - '@esbuild/linux-loong64@0.28.2': optional: true - '@esbuild/linux-mips64el@0.25.12': - optional: true - '@esbuild/linux-mips64el@0.28.2': optional: true - '@esbuild/linux-ppc64@0.25.12': - optional: true - '@esbuild/linux-ppc64@0.28.2': optional: true - '@esbuild/linux-riscv64@0.25.12': - optional: true - '@esbuild/linux-riscv64@0.28.2': optional: true - '@esbuild/linux-s390x@0.25.12': - optional: true - '@esbuild/linux-s390x@0.28.2': optional: true - '@esbuild/linux-x64@0.25.12': - optional: true - '@esbuild/linux-x64@0.28.2': optional: true - '@esbuild/netbsd-arm64@0.25.12': - optional: true - '@esbuild/netbsd-arm64@0.28.2': optional: true - '@esbuild/netbsd-x64@0.25.12': - optional: true - '@esbuild/netbsd-x64@0.28.2': optional: true - '@esbuild/openbsd-arm64@0.25.12': - optional: true - '@esbuild/openbsd-arm64@0.28.2': optional: true - '@esbuild/openbsd-x64@0.25.12': - optional: true - '@esbuild/openbsd-x64@0.28.2': optional: true - '@esbuild/openharmony-arm64@0.25.12': - optional: true - '@esbuild/openharmony-arm64@0.28.2': optional: true - '@esbuild/sunos-x64@0.25.12': - optional: true - '@esbuild/sunos-x64@0.28.2': optional: true - '@esbuild/win32-arm64@0.25.12': - optional: true - '@esbuild/win32-arm64@0.28.2': optional: true - '@esbuild/win32-ia32@0.25.12': - optional: true - '@esbuild/win32-ia32@0.28.2': optional: true - '@esbuild/win32-x64@0.25.12': - optional: true - '@esbuild/win32-x64@0.28.2': optional: true @@ -6352,7 +5851,7 @@ snapshots: dependencies: which: 7.0.0 - '@nuxt/cli@4.0.3(@nuxt/schema@4.6.4)(jiti@2.7.0)(oxc-parser@0.156.0)(rolldown@1.2.18)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))': + '@nuxt/cli@4.0.3(@nuxt/schema@4.6.4)(jiti@2.7.0)(oxc-parser@0.156.0)(rolldown@1.3.1)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))': dependencies: '@clack/prompts': 1.9.0 args-tokenizer: 0.3.0 @@ -6363,7 +5862,7 @@ snapshots: exsolve: 1.2.0 fuzzysort: 4.0.2 get-port-please: 3.2.0 - my-bad: 0.2.12(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + my-bad: 0.2.12(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) obug: 3.0.0 package-manager-detector: 1.9.0 pathe: 2.0.3 @@ -6381,17 +5880,17 @@ snapshots: '@nuxt/schema': 4.6.4 jiti: 2.7.0 oxc-parser: 0.156.0 - rolldown: 1.2.18 + rolldown: 1.3.1 transitivePeerDependencies: - vite '@nuxt/devalue@2.0.2': {} - '@nuxt/devtools-kit@3.4.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)))(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))': + '@nuxt/devtools-kit@3.4.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)))(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))': dependencies: - '@nuxt/kit': 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))) + '@nuxt/kit': 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))) execa: 8.0.1 - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@nuxt/schema' - confbox @@ -6415,11 +5914,11 @@ snapshots: pkg-types: 2.4.0 semver: 7.8.6 - '@nuxt/devtools@3.4.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(db0@0.3.4)(dotenv@17.4.2)(giget@3.3.1)(ioredis@5.11.1(supports-color@10.2.2))(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)))(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3))': + '@nuxt/devtools@3.4.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(db0@0.3.4)(dotenv@17.4.2)(giget@3.3.1)(ioredis@5.11.1(supports-color@10.2.2))(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)))(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3))': dependencies: - '@nuxt/devtools-kit': 3.4.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)))(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + '@nuxt/devtools-kit': 3.4.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)))(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) '@nuxt/devtools-wizard': 3.4.4 - '@nuxt/kit': 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))) + '@nuxt/kit': 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))) '@vue/devtools-core': 8.2.1(vue@3.5.45(typescript@5.9.3)) '@vue/devtools-kit': 8.2.1 birpc: 4.2.0 @@ -6446,9 +5945,9 @@ snapshots: tinyexec: 1.3.1 tinyglobby: 0.2.17 unstorage: 1.17.6(db0@0.3.4)(ioredis@5.11.1(supports-color@10.2.2)) - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) - vite-plugin-inspect: 11.4.1(@nuxt/kit@4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))))(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) - vite-plugin-vue-tracer: 1.7.0(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3)) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) + vite-plugin-inspect: 11.4.1(@nuxt/kit@4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))))(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) + vite-plugin-vue-tracer: 1.7.0(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3)) which: 6.0.1 ws: 8.22.2 transitivePeerDependencies: @@ -6525,7 +6024,7 @@ snapshots: - supports-color - typescript - '@nuxt/kit@4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)))': + '@nuxt/kit@4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)))': dependencies: consola: 3.4.2 defu: 6.1.7 @@ -6543,7 +6042,7 @@ snapshots: std-env: 4.3.0 tinyexec: 1.3.1 tinyglobby: 0.2.17 - unctx: 3.0.1(magic-string@1.4.5)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))) + unctx: 3.0.1(magic-string@1.4.5)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))) verkit: 0.5.0 optionalDependencies: '@nuxt/schema': 4.6.4 @@ -6553,15 +6052,15 @@ snapshots: jiti: 2.7.0 mlly: 1.8.2 oxc-parser: 0.156.0 - rolldown: 1.2.18 + rolldown: 1.3.1 transitivePeerDependencies: - magic-string - unplugin - '@nuxt/nitro-server@4.6.4(ce0a269fd58f7c15a95e11f24ec9d965)': + '@nuxt/nitro-server@4.6.4(5bea7f6b290acd2fe4f06d51466ab340)': dependencies: - '@nuxt/kit': 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))) - '@unhead/vue': 3.4.3(@oxc-project/types@0.157.0)(esbuild@0.28.2)(lightningcss@1.33.0)(oxc-parser@0.156.0)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3)) + '@nuxt/kit': 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))) + '@unhead/vue': 3.4.3(@oxc-project/types@0.157.0)(esbuild@0.28.2)(lightningcss@1.33.0)(oxc-parser@0.156.0)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3)) consola: 3.4.2 defu: 6.1.7 destr: 2.0.5 @@ -6571,20 +6070,20 @@ snapshots: exsolve: 1.2.0 flru: 1.0.2 h3: 1.15.11 - impound: 1.2.1(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + impound: 1.2.1(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) klona: 2.0.6 mocked-exports: 0.1.1 - my-bad: 0.2.12(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) - nitropack: 2.13.6(bare-buffer@3.7.1)(oxc-parser@0.156.0)(rolldown@1.2.18)(srvx@1.0.8)(supports-color@10.2.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + my-bad: 0.2.12(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) + nitropack: 2.13.6(@parcel/watcher@2.6.0)(bare-buffer@3.7.1)(oxc-parser@0.156.0)(rolldown@1.3.1)(srvx@1.0.8)(supports-color@10.2.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) nostics: 1.3.0 - nuxt: 4.6.4(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@oxc-project/types@0.157.0)(@types/node@26.6.6)(@vue/compiler-sfc@3.5.45)(acorn@8.19.0)(bare-buffer@3.7.1)(confbox@0.3.2)(db0@0.3.4)(dotenv@17.4.2)(esbuild@0.28.2)(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(giget@3.3.1)(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(mlly@1.8.2)(optionator@0.9.4)(oxc-parser@0.156.0)(rolldown@1.2.18)(rollup-plugin-visualizer@7.1.3(rolldown@1.2.18)(rollup@4.68.2))(rollup@4.68.2)(srvx@1.0.8)(supports-color@10.2.2)(terser@5.51.2)(typescript@5.9.3)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue-tsc@3.3.14(typescript@5.9.3))(yaml@2.9.1) + nuxt: 4.6.4(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@oxc-project/types@0.157.0)(@parcel/watcher@2.6.0)(@types/node@26.6.6)(@vue/compiler-sfc@3.5.45)(acorn@8.19.0)(bare-buffer@3.7.1)(confbox@0.3.2)(db0@0.3.4)(dotenv@17.4.2)(esbuild@0.28.2)(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(giget@3.3.1)(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(mlly@1.8.2)(optionator@0.9.4)(oxc-parser@0.156.0)(rolldown@1.3.1)(rollup-plugin-visualizer@7.1.3(rolldown@1.3.1)(rollup@4.68.2))(rollup@4.68.2)(sass@1.108.1)(srvx@1.0.8)(supports-color@10.2.2)(terser@5.51.2)(typescript@5.9.3)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue-tsc@3.3.14(typescript@5.9.3))(yaml@2.9.1) ohash: 2.0.12 pathe: 2.0.3 radix3: 1.1.2 rou3: 0.9.2 std-env: 4.3.0 ufo: 1.6.4 - unctx: 3.0.1(magic-string@1.4.5)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))) + unctx: 3.0.1(magic-string@1.4.5)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))) unrouting: 0.3.2 unstorage: 1.17.6(db0@0.3.4)(ioredis@5.11.1(supports-color@10.2.2)) vue: 3.5.45(typescript@5.9.3) @@ -6660,19 +6159,19 @@ snapshots: pkg-types: 2.4.0 std-env: 4.3.0 - '@nuxt/telemetry@2.9.1(@nuxt/kit@4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))))': + '@nuxt/telemetry@2.9.1(@nuxt/kit@4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))))': dependencies: - '@nuxt/kit': 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))) + '@nuxt/kit': 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))) citty: 0.2.2 consola: 3.4.2 rc9: 3.1.0 std-env: 4.3.0 - '@nuxt/vite-builder@4.6.4(54cb2de56acb6a12a874ef88753904bc)': + '@nuxt/vite-builder@4.6.4(892dfc6a6a336a94f10dde46a3802f2b)': dependencies: - '@nuxt/kit': 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))) - '@vitejs/plugin-vue': 6.0.10(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3)) - '@vitejs/plugin-vue-jsx': 5.1.6(supports-color@10.2.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3)) + '@nuxt/kit': 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))) + '@vitejs/plugin-vue': 6.0.10(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3)) + '@vitejs/plugin-vue-jsx': 5.1.6(supports-color@10.2.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3)) autoprefixer: 10.6.2(postcss@8.5.32) clickable-path: 0.1.1 consola: 3.4.2 @@ -6685,26 +6184,26 @@ snapshots: js-tokens: 10.0.0 knitwork: 1.3.0 mocked-exports: 0.1.1 - my-bad: 0.2.12(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) - nuxt: 4.6.4(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@oxc-project/types@0.157.0)(@types/node@26.6.6)(@vue/compiler-sfc@3.5.45)(acorn@8.19.0)(bare-buffer@3.7.1)(confbox@0.3.2)(db0@0.3.4)(dotenv@17.4.2)(esbuild@0.28.2)(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(giget@3.3.1)(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(mlly@1.8.2)(optionator@0.9.4)(oxc-parser@0.156.0)(rolldown@1.2.18)(rollup-plugin-visualizer@7.1.3(rolldown@1.2.18)(rollup@4.68.2))(rollup@4.68.2)(srvx@1.0.8)(supports-color@10.2.2)(terser@5.51.2)(typescript@5.9.3)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue-tsc@3.3.14(typescript@5.9.3))(yaml@2.9.1) + my-bad: 0.2.12(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) + nuxt: 4.6.4(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@oxc-project/types@0.157.0)(@parcel/watcher@2.6.0)(@types/node@26.6.6)(@vue/compiler-sfc@3.5.45)(acorn@8.19.0)(bare-buffer@3.7.1)(confbox@0.3.2)(db0@0.3.4)(dotenv@17.4.2)(esbuild@0.28.2)(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(giget@3.3.1)(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(mlly@1.8.2)(optionator@0.9.4)(oxc-parser@0.156.0)(rolldown@1.3.1)(rollup-plugin-visualizer@7.1.3(rolldown@1.3.1)(rollup@4.68.2))(rollup@4.68.2)(sass@1.108.1)(srvx@1.0.8)(supports-color@10.2.2)(terser@5.51.2)(typescript@5.9.3)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue-tsc@3.3.14(typescript@5.9.3))(yaml@2.9.1) pathe: 2.0.3 pkg-types: 2.4.0 postcss: 8.5.32 - rolldown-string: 0.3.1(rolldown@1.2.18) + rolldown-string: 0.3.1(rolldown@1.3.1) seroval: 1.8.0 std-env: 4.3.0 ufo: 1.6.4 unenv: 2.0.0-rc.24 - unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) - vite-node: 6.0.0(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) - vite-plugin-checker: 0.14.5(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(optionator@0.9.4)(typescript@5.9.3)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue-tsc@3.3.14(typescript@5.9.3)) + unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) + vite-node: 6.0.0(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) + vite-plugin-checker: 0.14.5(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(optionator@0.9.4)(typescript@5.9.3)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue-tsc@3.3.14(typescript@5.9.3)) vue: 3.5.45(typescript@5.9.3) vue-bundle-renderer: 2.5.0 optionalDependencies: '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.13(supports-color@10.2.2)) - rolldown: 1.2.18 - rollup-plugin-visualizer: 7.1.3(rolldown@1.2.18)(rollup@4.68.2) + rolldown: 1.3.1 + rollup-plugin-visualizer: 7.1.3(rolldown@1.3.1)(rollup@4.68.2) transitivePeerDependencies: - '@biomejs/biome' - '@farmfe/core' @@ -6742,21 +6241,21 @@ snapshots: - webpack - yaml - '@nuxt/vite-server@4.6.4(48ec9e489245b30169489a59b4bb1e18)': + '@nuxt/vite-server@4.6.4(cb777f354adb56aee8c01d4104c5e92a)': dependencies: - '@nuxt/kit': 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))) + '@nuxt/kit': 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))) clickable-path: 0.1.1 defu: 6.1.7 exsolve: 1.2.0 mocked-exports: 0.1.1 - my-bad: 0.2.12(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) - nuxt: 4.6.4(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@oxc-project/types@0.157.0)(@types/node@26.6.6)(@vue/compiler-sfc@3.5.45)(acorn@8.19.0)(bare-buffer@3.7.1)(confbox@0.3.2)(db0@0.3.4)(dotenv@17.4.2)(esbuild@0.28.2)(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(giget@3.3.1)(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(mlly@1.8.2)(optionator@0.9.4)(oxc-parser@0.156.0)(rolldown@1.2.18)(rollup-plugin-visualizer@7.1.3(rolldown@1.2.18)(rollup@4.68.2))(rollup@4.68.2)(srvx@1.0.8)(supports-color@10.2.2)(terser@5.51.2)(typescript@5.9.3)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue-tsc@3.3.14(typescript@5.9.3))(yaml@2.9.1) + my-bad: 0.2.12(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) + nuxt: 4.6.4(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@oxc-project/types@0.157.0)(@parcel/watcher@2.6.0)(@types/node@26.6.6)(@vue/compiler-sfc@3.5.45)(acorn@8.19.0)(bare-buffer@3.7.1)(confbox@0.3.2)(db0@0.3.4)(dotenv@17.4.2)(esbuild@0.28.2)(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(giget@3.3.1)(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(mlly@1.8.2)(optionator@0.9.4)(oxc-parser@0.156.0)(rolldown@1.3.1)(rollup-plugin-visualizer@7.1.3(rolldown@1.3.1)(rollup@4.68.2))(rollup@4.68.2)(sass@1.108.1)(srvx@1.0.8)(supports-color@10.2.2)(terser@5.51.2)(typescript@5.9.3)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue-tsc@3.3.14(typescript@5.9.3))(yaml@2.9.1) pathe: 2.0.3 rou3: 0.9.2 srvx: 1.0.5 ufo: 1.6.4 ultrahtml: 1.7.0 - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@nuxt/schema' - confbox @@ -6891,11 +6390,68 @@ snapshots: '@oxc-resolver/binding-win32-x64-msvc@11.24.2': optional: true + '@parcel/watcher-android-arm64@2.6.0': + optional: true + + '@parcel/watcher-darwin-arm64@2.6.0': + optional: true + + '@parcel/watcher-darwin-x64@2.6.0': + optional: true + + '@parcel/watcher-freebsd-x64@2.6.0': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.6.0': + optional: true + + '@parcel/watcher-linux-arm-musl@2.6.0': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.6.0': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.6.0': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.6.0': + optional: true + + '@parcel/watcher-linux-x64-musl@2.6.0': + optional: true + '@parcel/watcher-wasm@2.6.0': dependencies: is-glob: 4.0.3 picomatch: 4.0.7 + '@parcel/watcher-win32-arm64@2.6.0': + optional: true + + '@parcel/watcher-win32-x64@2.6.0': + optional: true + + '@parcel/watcher@2.6.0': + dependencies: + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.7 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.6.0 + '@parcel/watcher-darwin-arm64': 2.6.0 + '@parcel/watcher-darwin-x64': 2.6.0 + '@parcel/watcher-freebsd-x64': 2.6.0 + '@parcel/watcher-linux-arm-glibc': 2.6.0 + '@parcel/watcher-linux-arm-musl': 2.6.0 + '@parcel/watcher-linux-arm64-glibc': 2.6.0 + '@parcel/watcher-linux-arm64-musl': 2.6.0 + '@parcel/watcher-linux-x64-glibc': 2.6.0 + '@parcel/watcher-linux-x64-musl': 2.6.0 + '@parcel/watcher-win32-arm64': 2.6.0 + '@parcel/watcher-win32-x64': 2.6.0 + optional: true + '@pnpm/constants@1001.3.1': {} '@pnpm/error@1000.1.0': @@ -7032,26 +6588,10 @@ snapshots: '@rolldown/pluginutils@1.1.0': {} - '@rollup/plugin-alias@5.1.1(rollup@4.68.2)': - optionalDependencies: - rollup: 4.68.2 - '@rollup/plugin-alias@6.0.1(rollup@4.68.2)': optionalDependencies: rollup: 4.68.2 - '@rollup/plugin-commonjs@28.0.9(rollup@4.68.2)': - dependencies: - '@rollup/pluginutils': 5.5.1(rollup@4.68.2) - commondir: 1.0.1 - estree-walker: 2.0.2 - fdir: 6.5.0(picomatch@4.0.7) - is-reference: 1.2.1 - magic-string: 0.30.21 - picomatch: 4.0.7 - optionalDependencies: - rollup: 4.68.2 - '@rollup/plugin-commonjs@29.0.3(rollup@4.68.2)': dependencies: '@rollup/pluginutils': 5.5.1(rollup@4.68.2) @@ -7326,18 +6866,18 @@ snapshots: '@typescript-eslint/types': 8.72.2 eslint-visitor-keys: 5.0.1 - '@unhead/bundler@3.4.3(@oxc-project/types@0.157.0)(esbuild@0.28.2)(lightningcss@1.33.0)(oxc-parser@0.156.0)(rolldown@1.2.18)(rollup@4.68.2)(unhead@3.4.3(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)))(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))': + '@unhead/bundler@3.4.3(@oxc-project/types@0.157.0)(esbuild@0.28.2)(lightningcss@1.33.0)(oxc-parser@0.156.0)(rolldown@1.3.1)(rollup@4.68.2)(unhead@3.4.3(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)))(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))': dependencies: magic-string: 1.4.5 - oxc-walker: 1.1.1(@oxc-project/types@0.157.0)(oxc-parser@0.156.0)(rolldown@1.2.18) - unhead: 3.4.3(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) - unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + oxc-walker: 1.1.1(@oxc-project/types@0.157.0)(oxc-parser@0.156.0)(rolldown@1.3.1) + unhead: 3.4.3(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) + unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) optionalDependencies: esbuild: 0.28.2 lightningcss: 1.33.0 oxc-parser: 0.156.0 - rolldown: 1.2.18 - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) + rolldown: 1.3.1 + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@farmfe/core' - '@oxc-project/types' @@ -7347,15 +6887,15 @@ snapshots: - rollup - unloader - '@unhead/vue@3.4.3(@oxc-project/types@0.157.0)(esbuild@0.28.2)(lightningcss@1.33.0)(oxc-parser@0.156.0)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3))': + '@unhead/vue@3.4.3(@oxc-project/types@0.157.0)(esbuild@0.28.2)(lightningcss@1.33.0)(oxc-parser@0.156.0)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3))': dependencies: - '@unhead/bundler': 3.4.3(@oxc-project/types@0.157.0)(esbuild@0.28.2)(lightningcss@1.33.0)(oxc-parser@0.156.0)(rolldown@1.2.18)(rollup@4.68.2)(unhead@3.4.3(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)))(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + '@unhead/bundler': 3.4.3(@oxc-project/types@0.157.0)(esbuild@0.28.2)(lightningcss@1.33.0)(oxc-parser@0.156.0)(rolldown@1.3.1)(rollup@4.68.2)(unhead@3.4.3(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)))(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) hookable: 6.1.2 - unhead: 3.4.3(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) - unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + unhead: 3.4.3(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) + unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) vue: 3.5.45(typescript@5.9.3) optionalDependencies: - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@farmfe/core' - '@oxc-project/types' @@ -7453,22 +6993,22 @@ snapshots: - rollup - supports-color - '@vitejs/plugin-vue-jsx@5.1.6(supports-color@10.2.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3))': + '@vitejs/plugin-vue-jsx@5.1.6(supports-color@10.2.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3))': dependencies: '@babel/core': 7.29.13(supports-color@10.2.2) '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.13(supports-color@10.2.2)) '@babel/plugin-transform-typescript': 7.29.9(@babel/core@7.29.13(supports-color@10.2.2))(supports-color@10.2.2) '@rolldown/pluginutils': 1.1.0 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.13(supports-color@10.2.2))(supports-color@10.2.2) - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) vue: 3.5.45(typescript@5.9.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.10(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.10(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.1.0 - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) vue: 3.5.45(typescript@5.9.3) '@vitest/coverage-v8@5.1.0(vitest@5.1.0)': @@ -7481,7 +7021,7 @@ snapshots: obug: 3.0.0 std-env: 4.3.0 tinyrainbow: 3.2.0 - vitest: 5.1.0(@types/node@26.6.6)(@vitest/coverage-v8@5.1.0)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + vitest: 5.1.0(@types/node@26.6.6)(@vitest/coverage-v8@5.1.0)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) '@vitest/istanbul-lib-coverage@2.1.0': {} @@ -7489,14 +7029,14 @@ snapshots: dependencies: '@vitest/istanbul-lib-coverage': 2.1.0 - '@vitest/mocker@5.1.0(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))': + '@vitest/mocker@5.1.0(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))': dependencies: '@jridgewell/trace-mapping': 0.3.31 '@vitest/spy': 5.1.0 estree-walker: 3.0.3 magic-string: 1.4.5 optionalDependencies: - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) '@vitest/spy@5.1.0': {} @@ -7893,13 +7433,6 @@ snapshots: keyv: 5.6.0 qified: 0.10.1 - caniuse-api@3.0.0: - dependencies: - browserslist: 4.29.5 - caniuse-lite: 1.0.30001823 - lodash.memoize: 4.1.2 - lodash.uniq: 4.5.0 - caniuse-api@4.0.0: dependencies: browserslist: 4.29.5 @@ -7983,8 +7516,6 @@ snapshots: commander@10.0.1: {} - commander@11.1.0: {} - commander@2.20.3: {} comment-parser@1.4.7: {} @@ -8050,76 +7581,6 @@ snapshots: optionalDependencies: srvx: 1.0.8 - css-declaration-sorter@7.4.0(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - - css-select@6.0.0: - dependencies: - boolbase: 1.0.0 - css-what: 7.0.0 - domhandler: 5.0.3 - domutils: 3.2.2 - nth-check: 2.1.1 - - css-tree@2.2.1: - dependencies: - mdn-data: 2.0.28 - source-map-js: 1.2.2 - - css-tree@3.2.1: - dependencies: - mdn-data: 2.27.1 - source-map-js: 1.2.2 - - css-what@7.0.0: {} - - cssesc@3.0.0: {} - - cssnano-preset-default@7.0.17(postcss@8.5.32): - dependencies: - browserslist: 4.29.5 - css-declaration-sorter: 7.4.0(postcss@8.5.32) - cssnano-utils: 5.0.3(postcss@8.5.32) - postcss: 8.5.32 - postcss-calc: 10.1.1(postcss@8.5.32) - postcss-colormin: 7.0.10(postcss@8.5.32) - postcss-convert-values: 7.0.12(postcss@8.5.32) - postcss-discard-comments: 7.0.8(postcss@8.5.32) - postcss-discard-duplicates: 7.0.4(postcss@8.5.32) - postcss-discard-empty: 7.0.3(postcss@8.5.32) - postcss-discard-overridden: 7.0.3(postcss@8.5.32) - postcss-merge-longhand: 7.0.7(postcss@8.5.32) - postcss-merge-rules: 7.0.11(postcss@8.5.32) - postcss-minify-font-values: 7.0.3(postcss@8.5.32) - postcss-minify-gradients: 7.0.5(postcss@8.5.32) - postcss-minify-params: 7.0.9(postcss@8.5.32) - postcss-minify-selectors: 7.1.2(postcss@8.5.32) - postcss-normalize-charset: 7.0.3(postcss@8.5.32) - postcss-normalize-display-values: 7.0.3(postcss@8.5.32) - postcss-normalize-positions: 7.0.4(postcss@8.5.32) - postcss-normalize-repeat-style: 7.0.4(postcss@8.5.32) - postcss-normalize-string: 7.0.3(postcss@8.5.32) - postcss-normalize-timing-functions: 7.0.3(postcss@8.5.32) - postcss-normalize-unicode: 7.0.9(postcss@8.5.32) - postcss-normalize-url: 7.0.3(postcss@8.5.32) - postcss-normalize-whitespace: 7.0.3(postcss@8.5.32) - postcss-ordered-values: 7.0.4(postcss@8.5.32) - postcss-reduce-initial: 7.0.9(postcss@8.5.32) - postcss-reduce-transforms: 7.0.3(postcss@8.5.32) - postcss-svgo: 7.1.3(postcss@8.5.32) - postcss-unique-selectors: 7.0.7(postcss@8.5.32) - - cssnano-utils@5.0.3(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - - cssnano@7.1.9(postcss@8.5.32): - dependencies: - cssnano-preset-default: 7.0.17(postcss@8.5.32) - lilconfig: 3.1.4 - postcss: 8.5.32 - cssnano@9.9.0(postcss@8.5.32): dependencies: '@colordx/core': 7.3.0 @@ -8129,10 +7590,6 @@ snapshots: postcss: 8.5.32 postcss-calc: 11.2.3(postcss@8.5.32) - csso@5.0.5: - dependencies: - css-tree: 2.2.1 - csstype@3.2.3: {} db0@0.3.4: {} @@ -8172,24 +7629,6 @@ snapshots: diff@9.0.0: {} - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - - domelementtype@2.3.0: {} - - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 - - domutils@3.2.2: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dot-prop@10.2.0: dependencies: type-fest: 5.10.0 @@ -8234,35 +7673,6 @@ snapshots: es-module-lexer@3.0.4: {} - esbuild@0.25.12: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.12 - '@esbuild/android-arm': 0.25.12 - '@esbuild/android-arm64': 0.25.12 - '@esbuild/android-x64': 0.25.12 - '@esbuild/darwin-arm64': 0.25.12 - '@esbuild/darwin-x64': 0.25.12 - '@esbuild/freebsd-arm64': 0.25.12 - '@esbuild/freebsd-x64': 0.25.12 - '@esbuild/linux-arm': 0.25.12 - '@esbuild/linux-arm64': 0.25.12 - '@esbuild/linux-ia32': 0.25.12 - '@esbuild/linux-loong64': 0.25.12 - '@esbuild/linux-mips64el': 0.25.12 - '@esbuild/linux-ppc64': 0.25.12 - '@esbuild/linux-riscv64': 0.25.12 - '@esbuild/linux-s390x': 0.25.12 - '@esbuild/linux-x64': 0.25.12 - '@esbuild/netbsd-arm64': 0.25.12 - '@esbuild/netbsd-x64': 0.25.12 - '@esbuild/openbsd-arm64': 0.25.12 - '@esbuild/openbsd-x64': 0.25.12 - '@esbuild/openharmony-arm64': 0.25.12 - '@esbuild/sunos-x64': 0.25.12 - '@esbuild/win32-arm64': 0.25.12 - '@esbuild/win32-ia32': 0.25.12 - '@esbuild/win32-x64': 0.25.12 - esbuild@0.28.2: optionalDependencies: '@esbuild/aix-ppc64': 0.28.2 @@ -8589,12 +7999,6 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - fix-dts-default-cjs-exports@1.0.1: - dependencies: - magic-string: 0.30.21 - mlly: 1.8.2 - rollup: 4.68.2 - flat-cache@6.1.23: dependencies: cacheable: 2.5.0 @@ -8760,14 +8164,16 @@ snapshots: image-meta@0.3.1: {} + immutable@5.1.10: {} + import-without-cache@0.4.1: {} - impound@1.2.1(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)): + impound@1.2.1(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)): dependencies: '@jridgewell/trace-mapping': 0.3.31 es-module-lexer: 3.0.4 pathe: 2.0.3 - unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) unplugin-utils: 0.3.2 transitivePeerDependencies: - '@farmfe/core' @@ -8887,8 +8293,6 @@ snapshots: isexe@4.0.0: {} - jiti@1.21.7: {} - jiti@2.7.0: {} js-tokens@10.0.0: {} @@ -9003,8 +8407,6 @@ snapshots: lightningcss-win32-arm64-msvc: 1.33.0 lightningcss-win32-x64-msvc: 1.33.0 - lilconfig@3.1.4: {} - list-installed@7.0.0: dependencies: buffered-async-iterable: 1.0.1 @@ -9012,7 +8414,7 @@ snapshots: read-pkg: 10.1.0 read-workspaces: 2.0.0 - listhen@1.10.1(srvx@1.0.8): + listhen@1.10.1(@parcel/watcher@2.6.0)(srvx@1.0.8): dependencies: '@parcel/watcher-wasm': 2.6.0 citty: 0.2.2 @@ -9030,6 +8432,8 @@ snapshots: ufo: 1.6.4 untun: 0.2.2 uqr: 0.1.3 + optionalDependencies: + '@parcel/watcher': 2.6.0 transitivePeerDependencies: - srvx @@ -9045,34 +8449,12 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.memoize@4.1.2: {} - - lodash.uniq@4.5.0: {} - lru-cache@11.5.3: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 - magic-regexp@0.11.2(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)): - dependencies: - magic-string: 1.4.5 - regexp-tree: 0.1.27 - type-level-regexp: 0.1.17 - unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) - transitivePeerDependencies: - - '@farmfe/core' - - '@rsbuild/core' - - '@rspack/core' - - bun-types-no-globals - - esbuild - - rolldown - - rollup - - unloader - - vite - - webpack - magic-string-ast@1.0.3: dependencies: magic-string: 0.30.21 @@ -9110,10 +8492,6 @@ snapshots: marked@9.1.6: {} - mdn-data@2.0.28: {} - - mdn-data@2.27.1: {} - mdn-data@2.37.2: {} merge-stream@2.0.0: {} @@ -9152,27 +8530,6 @@ snapshots: dependencies: minipass: 7.1.3 - mkdist@2.4.1(typescript@5.9.3)(vue-sfc-transformer@0.3.1(@volar/typescript@2.4.30(typescript@5.9.3))(@vue/compiler-core@3.5.45)(@vue/language-core@3.3.14)(esbuild@0.28.2)(rolldown@1.2.18)(typescript@5.9.3)(vue@3.5.45(typescript@5.9.3)))(vue-tsc@3.3.14(typescript@5.9.3))(vue@3.5.45(typescript@5.9.3)): - dependencies: - autoprefixer: 10.6.2(postcss@8.5.32) - citty: 0.1.6 - cssnano: 7.1.9(postcss@8.5.32) - defu: 6.1.7 - esbuild: 0.25.12 - jiti: 1.21.7 - mlly: 1.8.2 - pathe: 2.0.3 - pkg-types: 2.4.0 - postcss: 8.5.32 - postcss-nested: 7.0.2(postcss@8.5.32) - semver: 7.8.6 - tinyglobby: 0.2.17 - optionalDependencies: - typescript: 5.9.3 - vue: 3.5.45(typescript@5.9.3) - vue-sfc-transformer: 0.3.1(@volar/typescript@2.4.30(typescript@5.9.3))(@vue/compiler-core@3.5.45)(@vue/language-core@3.3.14)(esbuild@0.28.2)(rolldown@1.2.18)(typescript@5.9.3)(vue@3.5.45(typescript@5.9.3)) - vue-tsc: 3.3.14(typescript@5.9.3) - mlly@1.8.2: dependencies: acorn: 8.19.0 @@ -9190,13 +8547,13 @@ snapshots: muggle-string@0.4.1: {} - my-bad@0.2.12(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)): + my-bad@0.2.12(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)): dependencies: clickable-path: 0.1.1 errx: 0.2.2 fnv1a-64: 0.1.2 optionalDependencies: - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) mz@2.7.0: dependencies: @@ -9212,7 +8569,7 @@ snapshots: natural-compare@1.4.0: {} - nitropack@2.13.6(bare-buffer@3.7.1)(oxc-parser@0.156.0)(rolldown@1.2.18)(srvx@1.0.8)(supports-color@10.2.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)): + nitropack@2.13.6(@parcel/watcher@2.6.0)(bare-buffer@3.7.1)(oxc-parser@0.156.0)(rolldown@1.3.1)(srvx@1.0.8)(supports-color@10.2.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 6.0.1(rollup@4.68.2) @@ -9250,7 +8607,7 @@ snapshots: jiti: 2.7.0 klona: 2.0.6 knitwork: 1.3.0 - listhen: 1.10.1(srvx@1.0.8) + listhen: 1.10.1(@parcel/watcher@2.6.0)(srvx@1.0.8) magic-string: 0.30.21 magicast: 0.5.5 mime: 4.1.2 @@ -9265,7 +8622,7 @@ snapshots: pretty-bytes: 7.2.0 radix3: 1.1.2 rollup: 4.68.2 - rollup-plugin-visualizer: 7.1.3(rolldown@1.2.18)(rollup@4.68.2) + rollup-plugin-visualizer: 7.1.3(rolldown@1.3.1)(rollup@4.68.2) scule: 1.3.0 semver: 7.8.6 serve-placeholder: 2.0.2 @@ -9277,7 +8634,7 @@ snapshots: uncrypto: 0.1.3 unctx: 2.5.0 unenv: 2.0.0-rc.24 - unimport: 6.5.0(esbuild@0.28.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + unimport: 6.5.0(esbuild@0.28.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) unplugin-utils: 0.3.2 unstorage: 1.17.6(db0@0.3.4)(ioredis@5.11.1(supports-color@10.2.2)) untyped: 2.0.0 @@ -9325,6 +8682,9 @@ snapshots: - vite - webpack + node-addon-api@7.1.1: + optional: true + node-emoji@2.2.0: dependencies: '@sindresorhus/is': 4.6.0 @@ -9395,20 +8755,20 @@ snapshots: dependencies: boolbase: 1.0.0 - nuxt@4.6.4(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@oxc-project/types@0.157.0)(@types/node@26.6.6)(@vue/compiler-sfc@3.5.45)(acorn@8.19.0)(bare-buffer@3.7.1)(confbox@0.3.2)(db0@0.3.4)(dotenv@17.4.2)(esbuild@0.28.2)(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(giget@3.3.1)(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(mlly@1.8.2)(optionator@0.9.4)(oxc-parser@0.156.0)(rolldown@1.2.18)(rollup-plugin-visualizer@7.1.3(rolldown@1.2.18)(rollup@4.68.2))(rollup@4.68.2)(srvx@1.0.8)(supports-color@10.2.2)(terser@5.51.2)(typescript@5.9.3)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue-tsc@3.3.14(typescript@5.9.3))(yaml@2.9.1): + nuxt@4.6.4(@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.13(supports-color@10.2.2)))(@oxc-project/types@0.157.0)(@parcel/watcher@2.6.0)(@types/node@26.6.6)(@vue/compiler-sfc@3.5.45)(acorn@8.19.0)(bare-buffer@3.7.1)(confbox@0.3.2)(db0@0.3.4)(dotenv@17.4.2)(esbuild@0.28.2)(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(giget@3.3.1)(ioredis@5.11.1(supports-color@10.2.2))(lightningcss@1.33.0)(mlly@1.8.2)(optionator@0.9.4)(oxc-parser@0.156.0)(rolldown@1.3.1)(rollup-plugin-visualizer@7.1.3(rolldown@1.3.1)(rollup@4.68.2))(rollup@4.68.2)(sass@1.108.1)(srvx@1.0.8)(supports-color@10.2.2)(terser@5.51.2)(typescript@5.9.3)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue-tsc@3.3.14(typescript@5.9.3))(yaml@2.9.1): dependencies: - '@dxup/nuxt': 0.5.11(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(esbuild@0.28.2)(giget@3.3.1)(jiti@2.7.0)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + '@dxup/nuxt': 0.5.11(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(esbuild@0.28.2)(giget@3.3.1)(jiti@2.7.0)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) '@jridgewell/trace-mapping': 0.3.31 - '@nuxt/cli': 4.0.3(@nuxt/schema@4.6.4)(jiti@2.7.0)(oxc-parser@0.156.0)(rolldown@1.2.18)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + '@nuxt/cli': 4.0.3(@nuxt/schema@4.6.4)(jiti@2.7.0)(oxc-parser@0.156.0)(rolldown@1.3.1)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 3.4.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(db0@0.3.4)(dotenv@17.4.2)(giget@3.3.1)(ioredis@5.11.1(supports-color@10.2.2))(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)))(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3)) - '@nuxt/kit': 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))) - '@nuxt/nitro-server': 4.6.4(ce0a269fd58f7c15a95e11f24ec9d965) + '@nuxt/devtools': 3.4.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(db0@0.3.4)(dotenv@17.4.2)(giget@3.3.1)(ioredis@5.11.1(supports-color@10.2.2))(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)))(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3)) + '@nuxt/kit': 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))) + '@nuxt/nitro-server': 4.6.4(5bea7f6b290acd2fe4f06d51466ab340) '@nuxt/schema': 4.6.4 - '@nuxt/telemetry': 2.9.1(@nuxt/kit@4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)))) - '@nuxt/vite-builder': 4.6.4(54cb2de56acb6a12a874ef88753904bc) - '@nuxt/vite-server': 4.6.4(48ec9e489245b30169489a59b4bb1e18) - '@unhead/vue': 3.4.3(@oxc-project/types@0.157.0)(esbuild@0.28.2)(lightningcss@1.33.0)(oxc-parser@0.156.0)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3)) + '@nuxt/telemetry': 2.9.1(@nuxt/kit@4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)))) + '@nuxt/vite-builder': 4.6.4(892dfc6a6a336a94f10dde46a3802f2b) + '@nuxt/vite-server': 4.6.4(cb777f354adb56aee8c01d4104c5e92a) + '@unhead/vue': 3.4.3(@oxc-project/types@0.157.0)(esbuild@0.28.2)(lightningcss@1.33.0)(oxc-parser@0.156.0)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3)) '@vue/shared': 3.5.45 chokidar: 5.0.0 clickable-path: 0.1.1 @@ -9425,26 +8785,26 @@ snapshots: fnv1a-64: 0.1.2 hookable: 6.1.2 ignore: 7.0.14 - impound: 1.2.1(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + impound: 1.2.1(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) iron-webcrypto: 2.0.0 jiti: 2.7.0 klona: 2.0.6 knitwork: 1.3.0 magic-string: 1.4.5 - my-bad: 0.2.12(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + my-bad: 0.2.12(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) nanotar: 0.3.0 nostics: 1.3.0 object-identity: 0.2.3 ofetch: 1.5.1 ohash: 2.0.12 on-change: 6.0.2 - oxc-walker: 1.1.1(@oxc-project/types@0.157.0)(oxc-parser@0.156.0)(rolldown@1.2.18) + oxc-walker: 1.1.1(@oxc-project/types@0.157.0)(oxc-parser@0.156.0)(rolldown@1.3.1) pathe: 2.0.3 perfect-debounce: 2.1.0 picomatch: 4.0.7 pkg-types: 2.4.0 - rolldown: 1.2.18 - rolldown-string: 0.3.1(rolldown@1.2.18) + rolldown: 1.3.1 + rolldown-string: 0.3.1(rolldown@1.3.1) rou3: 0.9.2 scule: 1.3.0 std-env: 4.3.0 @@ -9452,19 +8812,20 @@ snapshots: ufo: 1.6.4 ultrahtml: 1.7.0 uncrypto: 0.1.3 - unctx: 3.0.1(magic-string@1.4.5)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))) + unctx: 3.0.1(magic-string@1.4.5)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))) undici: 8.12.4 - unhead: 3.4.3(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) - unimport: 7.0.2(acorn@8.19.0)(esbuild@0.28.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) - unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + unhead: 3.4.3(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) + unimport: 7.0.2(acorn@8.19.0)(esbuild@0.28.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) + unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) unrouting: 0.3.2 untyped: 2.0.0 verkit: 0.5.0 vue: 3.5.45(typescript@5.9.3) vue-bundle-renderer: 2.5.0 vue-component-type-helpers: 3.3.14 - vue-router: 5.4.0(@vue/compiler-sfc@3.5.45)(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3)) + vue-router: 5.4.0(@vue/compiler-sfc@3.5.45)(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3)) optionalDependencies: + '@parcel/watcher': 2.6.0 '@types/node': 26.6.6 transitivePeerDependencies: - '@azure/app-configuration' @@ -9640,11 +9001,11 @@ snapshots: '@oxc-resolver/binding-win32-arm64-msvc': 11.24.2 '@oxc-resolver/binding-win32-x64-msvc': 11.24.2 - oxc-walker@1.1.1(@oxc-project/types@0.157.0)(oxc-parser@0.156.0)(rolldown@1.2.18): + oxc-walker@1.1.1(@oxc-project/types@0.157.0)(oxc-parser@0.156.0)(rolldown@1.3.1): optionalDependencies: '@oxc-project/types': 0.157.0 oxc-parser: 0.156.0 - rolldown: 1.2.18 + rolldown: 1.3.1 p-event@6.0.1: dependencies: @@ -9729,171 +9090,15 @@ snapshots: pony-cause@2.1.11: {} - postcss-calc@10.1.1(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - postcss-selector-parser: 7.2.0 - postcss-value-parser: 4.2.0 - postcss-calc@11.2.3(postcss@8.5.32): dependencies: '@csstools/css-tokenizer': 4.0.2 postcss: 8.5.32 - postcss-colormin@7.0.10(postcss@8.5.32): - dependencies: - '@colordx/core': 5.8.0 - browserslist: 4.29.5 - caniuse-api: 3.0.0 - postcss: 8.5.32 - postcss-value-parser: 4.2.0 - - postcss-convert-values@7.0.12(postcss@8.5.32): - dependencies: - browserslist: 4.29.5 - postcss: 8.5.32 - postcss-value-parser: 4.2.0 - - postcss-discard-comments@7.0.8(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - postcss-selector-parser: 7.2.0 - - postcss-discard-duplicates@7.0.4(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - - postcss-discard-empty@7.0.3(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - - postcss-discard-overridden@7.0.3(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - - postcss-merge-longhand@7.0.7(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - postcss-value-parser: 4.2.0 - stylehacks: 7.0.11(postcss@8.5.32) - - postcss-merge-rules@7.0.11(postcss@8.5.32): - dependencies: - browserslist: 4.29.5 - caniuse-api: 3.0.0 - cssnano-utils: 5.0.3(postcss@8.5.32) - postcss: 8.5.32 - postcss-selector-parser: 7.2.0 - - postcss-minify-font-values@7.0.3(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - postcss-value-parser: 4.2.0 - - postcss-minify-gradients@7.0.5(postcss@8.5.32): - dependencies: - '@colordx/core': 5.8.0 - cssnano-utils: 5.0.3(postcss@8.5.32) - postcss: 8.5.32 - postcss-value-parser: 4.2.0 - - postcss-minify-params@7.0.9(postcss@8.5.32): - dependencies: - browserslist: 4.29.5 - cssnano-utils: 5.0.3(postcss@8.5.32) - postcss: 8.5.32 - postcss-value-parser: 4.2.0 - - postcss-minify-selectors@7.1.2(postcss@8.5.32): - dependencies: - browserslist: 4.29.5 - caniuse-api: 3.0.0 - cssesc: 3.0.0 - postcss: 8.5.32 - postcss-selector-parser: 7.2.0 - - postcss-nested@7.0.2(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - postcss-selector-parser: 7.2.0 - - postcss-normalize-charset@7.0.3(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - - postcss-normalize-display-values@7.0.3(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - postcss-value-parser: 4.2.0 - - postcss-normalize-positions@7.0.4(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - postcss-value-parser: 4.2.0 - - postcss-normalize-repeat-style@7.0.4(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - postcss-value-parser: 4.2.0 - - postcss-normalize-string@7.0.3(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - postcss-value-parser: 4.2.0 - - postcss-normalize-timing-functions@7.0.3(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - postcss-value-parser: 4.2.0 - - postcss-normalize-unicode@7.0.9(postcss@8.5.32): - dependencies: - browserslist: 4.29.5 - postcss: 8.5.32 - postcss-value-parser: 4.2.0 - - postcss-normalize-url@7.0.3(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - postcss-value-parser: 4.2.0 - - postcss-normalize-whitespace@7.0.3(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - postcss-value-parser: 4.2.0 - - postcss-ordered-values@7.0.4(postcss@8.5.32): - dependencies: - cssnano-utils: 5.0.3(postcss@8.5.32) - postcss: 8.5.32 - postcss-value-parser: 4.2.0 - - postcss-reduce-initial@7.0.9(postcss@8.5.32): - dependencies: - browserslist: 4.29.5 - caniuse-api: 3.0.0 - postcss: 8.5.32 - - postcss-reduce-transforms@7.0.3(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - postcss-value-parser: 4.2.0 - postcss-selector-parser@7.2.0: dependencies: util-deprecate: 1.0.2 - postcss-svgo@7.1.3(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - postcss-value-parser: 4.2.0 - svgo: 4.1.0 - - postcss-unique-selectors@7.0.7(postcss@8.5.32): - dependencies: - postcss: 8.5.32 - postcss-selector-parser: 7.2.0 - postcss-value-parser@4.2.0: {} postcss@8.5.32: @@ -10009,8 +9214,6 @@ snapshots: '@eslint-community/regexpp': 4.12.3 refa: 0.12.1 - regexp-tree@0.1.27: {} - regjsparser@0.13.4: dependencies: jsesc: 3.1.0 @@ -10052,11 +9255,11 @@ snapshots: - '@yuku-toolchain/wasm' - oxc-resolver - rolldown-string@0.3.1(rolldown@1.2.18): + rolldown-string@0.3.1(rolldown@1.3.1): dependencies: magic-string: 1.4.5 optionalDependencies: - rolldown: 1.2.18 + rolldown: 1.3.1 rolldown@1.2.18: dependencies: @@ -10101,25 +9304,14 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.3.1 '@rolldown/binding-win32-x64-msvc': 1.3.1 - rollup-plugin-dts@6.5.1(rollup@4.68.2)(typescript@5.9.3): - dependencies: - '@jridgewell/remapping': 2.3.5 - '@jridgewell/sourcemap-codec': 1.6.0 - convert-source-map: 2.0.0 - magic-string: 0.30.21 - rollup: 4.68.2 - typescript: 5.9.3 - optionalDependencies: - '@babel/code-frame': 8.0.6 - - rollup-plugin-visualizer@7.1.3(rolldown@1.2.18)(rollup@4.68.2): + rollup-plugin-visualizer@7.1.3(rolldown@1.3.1)(rollup@4.68.2): dependencies: open: 11.0.4 picomatch: 4.0.7 source-map: 0.8.0 yargs: 18.2.0 optionalDependencies: - rolldown: 1.2.18 + rolldown: 1.3.1 rollup: 4.68.2 rollup@4.68.2: @@ -10170,7 +9362,13 @@ snapshots: safe-buffer@5.2.1: {} - sax@1.6.1: {} + sass@1.108.1: + dependencies: + chokidar: 5.0.0 + immutable: 5.1.10 + source-map-js: 1.2.2 + optionalDependencies: + '@parcel/watcher': 2.6.0 scslre@0.3.0: dependencies: @@ -10354,12 +9552,6 @@ snapshots: structured-clone-es@2.0.1: {} - stylehacks@7.0.11(postcss@8.5.32): - dependencies: - browserslist: 4.29.5 - postcss: 8.5.32 - postcss-selector-parser: 7.2.0 - super-regex@1.1.0: dependencies: function-timeout: 1.0.2 @@ -10379,16 +9571,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svgo@4.1.0: - dependencies: - commander: 11.1.0 - css-select: 6.0.0 - css-tree: 3.2.1 - css-what: 7.0.0 - csso: 5.0.5 - picocolors: 1.1.1 - sax: 1.6.1 - tagged-tag@1.0.0: {} tar-stream@3.2.2(bare-buffer@3.7.1): @@ -10521,8 +9703,6 @@ snapshots: dependencies: tagged-tag: 1.0.0 - type-level-regexp@0.1.17: {} - typescript@5.9.3: {} ufo@1.6.4: {} @@ -10533,41 +9713,6 @@ snapshots: unbash@6.0.4: {} - unbuild@3.6.1(typescript@5.9.3)(vue-sfc-transformer@0.3.1(@volar/typescript@2.4.30(typescript@5.9.3))(@vue/compiler-core@3.5.45)(@vue/language-core@3.3.14)(esbuild@0.28.2)(rolldown@1.2.18)(typescript@5.9.3)(vue@3.5.45(typescript@5.9.3)))(vue-tsc@3.3.14(typescript@5.9.3))(vue@3.5.45(typescript@5.9.3)): - dependencies: - '@rollup/plugin-alias': 5.1.1(rollup@4.68.2) - '@rollup/plugin-commonjs': 28.0.9(rollup@4.68.2) - '@rollup/plugin-json': 6.1.0(rollup@4.68.2) - '@rollup/plugin-node-resolve': 16.0.3(rollup@4.68.2) - '@rollup/plugin-replace': 6.0.3(rollup@4.68.2) - '@rollup/pluginutils': 5.5.1(rollup@4.68.2) - citty: 0.1.6 - consola: 3.4.2 - defu: 6.1.7 - esbuild: 0.25.12 - fix-dts-default-cjs-exports: 1.0.1 - hookable: 5.5.3 - jiti: 2.7.0 - magic-string: 0.30.21 - mkdist: 2.4.1(typescript@5.9.3)(vue-sfc-transformer@0.3.1(@volar/typescript@2.4.30(typescript@5.9.3))(@vue/compiler-core@3.5.45)(@vue/language-core@3.3.14)(esbuild@0.28.2)(rolldown@1.2.18)(typescript@5.9.3)(vue@3.5.45(typescript@5.9.3)))(vue-tsc@3.3.14(typescript@5.9.3))(vue@3.5.45(typescript@5.9.3)) - mlly: 1.8.2 - pathe: 2.0.3 - pkg-types: 2.4.0 - pretty-bytes: 7.2.0 - rollup: 4.68.2 - rollup-plugin-dts: 6.5.1(rollup@4.68.2)(typescript@5.9.3) - scule: 1.3.0 - tinyglobby: 0.2.17 - untyped: 2.0.0 - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - '@typescript/typescript6' - - sass - - vue - - vue-sfc-transformer - - vue-tsc - unconfig-core@7.5.0: dependencies: '@quansync/fs': 1.1.0 @@ -10582,12 +9727,12 @@ snapshots: magic-string: 0.30.21 unplugin: 2.3.11 - unctx@3.0.1(magic-string@1.4.5)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))): + unctx@3.0.1(magic-string@1.4.5)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))): optionalDependencies: magic-string: 1.4.5 oxc-parser: 0.156.0 - rolldown: 1.2.18 - unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + rolldown: 1.3.1 + unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) undici-types@8.9.0: {} @@ -10597,12 +9742,12 @@ snapshots: dependencies: pathe: 2.0.3 - unhead@3.4.3(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)): + unhead@3.4.3(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)): dependencies: hookable: 6.1.2 - unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) optionalDependencies: - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@farmfe/core' - '@rsbuild/core' @@ -10620,7 +9765,7 @@ snapshots: unicorn-magic@0.4.1: {} - unimport@6.5.0(esbuild@0.28.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)): + unimport@6.5.0(esbuild@0.28.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)): dependencies: acorn: 8.19.0 escape-string-regexp: 5.0.0 @@ -10634,11 +9779,11 @@ snapshots: scule: 1.3.0 strip-literal: 4.0.0 tinyglobby: 0.2.17 - unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) unplugin-utils: 0.3.2 optionalDependencies: oxc-parser: 0.156.0 - rolldown: 1.2.18 + rolldown: 1.3.1 transitivePeerDependencies: - '@farmfe/core' - '@rsbuild/core' @@ -10650,7 +9795,7 @@ snapshots: - vite - webpack - unimport@7.0.2(acorn@8.19.0)(esbuild@0.28.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)): + unimport@7.0.2(acorn@8.19.0)(esbuild@0.28.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)): dependencies: escape-string-regexp: 5.0.0 estree-walker: 3.0.3 @@ -10663,12 +9808,12 @@ snapshots: scule: 1.3.0 strip-literal: 4.0.0 tinyglobby: 0.2.17 - unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) unplugin-utils: 0.3.2 optionalDependencies: acorn: 8.19.0 oxc-parser: 0.156.0 - rolldown: 1.2.18 + rolldown: 1.3.1 transitivePeerDependencies: - '@farmfe/core' - '@rsbuild/core' @@ -10692,7 +9837,7 @@ snapshots: picomatch: 4.0.7 webpack-virtual-modules: 0.6.2 - unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)): + unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)): dependencies: '@jridgewell/remapping': 2.3.5 '@rolldown/pluginutils': 1.1.0 @@ -10700,9 +9845,9 @@ snapshots: webpack-virtual-modules: 0.6.2 optionalDependencies: esbuild: 0.28.2 - rolldown: 1.2.18 + rolldown: 1.3.1 rollup: 4.68.2 - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) unrouting@0.3.2: dependencies: @@ -10795,23 +9940,23 @@ snapshots: version-guard@1.1.3: {} - vite-dev-rpc@2.0.0(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)): + vite-dev-rpc@2.0.0(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)): dependencies: birpc: 4.2.0 - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) - vite-hot-client: 2.2.0(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) + vite-hot-client: 2.2.0(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) - vite-hot-client@2.2.0(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)): + vite-hot-client@2.2.0(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)): dependencies: - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) - vite-node@6.0.0(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1): + vite-node@6.0.0(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1): dependencies: cac: 7.1.0 es-module-lexer: 2.3.2 obug: 2.2.1 pathe: 2.0.3 - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@types/node' - '@vitejs/devtools' @@ -10826,7 +9971,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.14.5(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(optionator@0.9.4)(typescript@5.9.3)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue-tsc@3.3.14(typescript@5.9.3)): + vite-plugin-checker@0.14.5(eslint@10.14.0(jiti@2.7.0)(supports-color@10.2.2))(optionator@0.9.4)(typescript@5.9.3)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue-tsc@3.3.14(typescript@5.9.3)): dependencies: '@babel/code-frame': 7.29.7 chokidar: 5.0.0 @@ -10835,14 +9980,14 @@ snapshots: picomatch: 4.0.7 proper-lockfile: 4.1.2 tiny-invariant: 1.3.3 - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) optionalDependencies: eslint: 10.14.0(jiti@2.7.0)(supports-color@10.2.2) optionator: 0.9.4 typescript: 5.9.3 vue-tsc: 3.3.14(typescript@5.9.3) - vite-plugin-inspect@11.4.1(@nuxt/kit@4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))))(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)): + vite-plugin-inspect@11.4.1(@nuxt/kit@4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))))(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)): dependencies: ansis: 4.5.0 error-stack-parser-es: 1.0.5 @@ -10852,22 +9997,22 @@ snapshots: perfect-debounce: 2.1.0 sirv: 3.0.2 unplugin-utils: 0.3.2 - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) - vite-dev-rpc: 2.0.0(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) + vite-dev-rpc: 2.0.0(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) optionalDependencies: - '@nuxt/kit': 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.2.18)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))) + '@nuxt/kit': 4.6.4(@nuxt/schema@4.6.4)(confbox@0.3.2)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(magic-string@1.4.5)(mlly@1.8.2)(oxc-parser@0.156.0)(rolldown@1.3.1)(unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))) - vite-plugin-vue-tracer@1.7.0(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3)): + vite-plugin-vue-tracer@1.7.0(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3)): dependencies: estree-walker: 3.0.3 exsolve: 1.2.0 magic-string: 1.4.5 pathe: 2.0.3 source-map-js: 1.2.2 - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) vue: 3.5.45(typescript@5.9.3) - vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1): + vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 @@ -10879,13 +10024,14 @@ snapshots: esbuild: 0.28.2 fsevents: 2.3.3 jiti: 2.7.0 + sass: 1.108.1 terser: 5.51.2 yaml: 2.9.1 - vitest@5.1.0(@types/node@26.6.6)(@vitest/coverage-v8@5.1.0)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)): + vitest@5.1.0(@types/node@26.6.6)(@vitest/coverage-v8@5.1.0)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.1.0(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + '@vitest/mocker': 5.1.0(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) chai: 6.3.0 es-module-lexer: 2.3.2 expect-type: 1.4.0 @@ -10896,7 +10042,7 @@ snapshots: tinybench: 6.2.3 tinyexec: 1.3.1 tinyglobby: 0.2.17 - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) why-is-node-running: 3.2.1 optionalDependencies: '@types/node': 26.6.6 @@ -10937,7 +10083,7 @@ snapshots: transitivePeerDependencies: - supports-color - vue-router@5.4.0(@vue/compiler-sfc@3.5.45)(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3)): + vue-router@5.4.0(@vue/compiler-sfc@3.5.45)(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.45(typescript@5.9.3)): dependencies: '@vue-macros/common': 3.1.4(vue@3.5.45(typescript@5.9.3)) '@vue/devtools-api': 8.2.1 @@ -10953,12 +10099,12 @@ snapshots: picomatch: 4.0.7 scule: 1.3.0 tinyglobby: 0.2.17 - unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.2.18)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1)) + unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.3.1)(rollup@4.68.2)(vite@8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1)) unplugin-utils: 0.3.2 vue: 3.5.45(typescript@5.9.3) optionalDependencies: '@vue/compiler-sfc': 3.5.45 - vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(yaml@2.9.1) + vite: 8.3.7(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.108.1)(terser@5.51.2)(yaml@2.9.1) transitivePeerDependencies: - '@farmfe/core' - '@rsbuild/core' @@ -10970,7 +10116,7 @@ snapshots: - unloader - webpack - vue-sfc-transformer@0.3.1(@volar/typescript@2.4.30(typescript@5.9.3))(@vue/compiler-core@3.5.45)(@vue/language-core@3.3.14)(esbuild@0.28.2)(rolldown@1.2.18)(typescript@5.9.3)(vue@3.5.45(typescript@5.9.3)): + vue-sfc-transformer@0.3.3(@volar/typescript@2.4.30(typescript@5.9.3))(@vue/compiler-core@3.5.45)(@vue/language-core@3.3.14)(esbuild@0.28.2)(rolldown@1.3.1)(typescript@5.9.3)(vue@3.5.45(typescript@5.9.3)): dependencies: '@vue/compiler-core': 3.5.45 tinyglobby: 0.2.17 @@ -10979,7 +10125,7 @@ snapshots: '@volar/typescript': 2.4.30(typescript@5.9.3) '@vue/language-core': 3.3.14 esbuild: 0.28.2 - rolldown: 1.2.18 + rolldown: 1.3.1 typescript: 5.9.3 vue-tsc@3.3.14(typescript@5.9.3): diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 518fbb3c..22beb490 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -24,3 +24,4 @@ minimumReleaseAgeExclude: - '@nuxt/*' - vue - '@vue/*' + - vue-sfc-transformer@0.3.3 diff --git a/src/build/advice.ts b/src/build/advice.ts new file mode 100644 index 00000000..07e70df6 --- /dev/null +++ b/src/build/advice.ts @@ -0,0 +1,10 @@ +const shown = new Set() + +/** Advice is shown at most once per process, and never in CI. */ +export function shouldAdvise(key: string) { + if (process.env.CI || shown.has(key)) { + return false + } + shown.add(key) + return true +} diff --git a/src/build/aliases.ts b/src/build/aliases.ts new file mode 100644 index 00000000..699fe0fc --- /dev/null +++ b/src/build/aliases.ts @@ -0,0 +1,69 @@ +import { existsSync, promises as fsp } from 'node:fs' +import { dirname, join, resolve } from 'pathe' + +const RELATIVE_SPECIFIER_RE = /(\bfrom\s*|\bimport\s*\(\s*|\bimport\s+)(['"])(\.\.?\/[^'"]*)\2/g +const DECLARATION_TARGETS = [ + ['.d.ts', '.js'], + ['.d.mts', '.mjs'], + ['/index.d.ts', '/index.js'], + ['/index.d.mts', '/index.mjs'], +] as const + +/** + * Rewrites the declarations emitted for `outputs` (paths relative to `outDir`) so they + * resolve outside the module. + * + * - Relative specifiers without an extension get the one of the file they resolve to in + * `outDir`, so they resolve under `node16` and `nodenext` module resolution. + * - `#app` aliases, which tsc prints whenever the real path is not reachable through + * `node_modules` and which only resolve inside a Nuxt app, become `nuxt/app`. + */ +export async function rewriteRuntimeDeclarations(outDir: string, outputs: string[]) { + const files = outputs.flatMap(output => declarationsOf(join(outDir, output))).filter(file => existsSync(file)) + await Promise.all(files.map(async (file) => { + const contents = await fsp.readFile(file, 'utf8') + const rewritten = contents + .replace(RELATIVE_SPECIFIER_RE, (match, prefix: string, quote: string, specifier: string) => { + const resolved = resolveDeclarationSpecifier(dirname(file), specifier) ?? specifier + return resolved === specifier ? match : `${prefix}${quote}${resolved}${quote}` + }) + .replace(/import\("#app(?:\/[^"]*)?"\)/g, 'import("nuxt/app")') + .replace(/(\bfrom\s*)(['"])#app(?:\/[^'"]*)?\2/g, '$1$2nuxt/app$2') + + if (rewritten !== contents) { + await fsp.writeFile(file, rewritten, 'utf8') + } + })) +} + +function declarationsOf(output: string) { + if (/\.d\.[cm]?ts$/.test(output)) { + return [output] + } + if (output.endsWith('.vue')) { + return [`${output}.d.ts`, output.replace(/\.vue$/, '.d.vue.ts')] + } + return /\.[cm]?js$/.test(output) ? [output.replace(/\.(m?)js$/, '.d.$1ts')] : [] +} + +function resolveDeclarationSpecifier(dir: string, specifier: string): string | undefined { + if (/\.(?:vue|json|css)$/.test(specifier)) { + return + } + const script = specifier.match(/^(.*)\.(m?)js$/) + if (script) { + const target = resolve(dir, specifier) + return existsSync(target) || existsSync(target.replace(/\.(m?)js$/, '.d.$1ts')) + ? undefined + : resolveDeclarationSpecifier(dir, script[1]!) + } + const base = resolve(dir, specifier) + for (const [declaration, extension] of DECLARATION_TARGETS) { + if (existsSync(base + declaration)) { + return specifier.replace(/\/$/, '') + extension + } + } + if (existsSync(`${base}.vue`)) { + return `${specifier}.vue` + } +} diff --git a/src/build/build.ts b/src/build/build.ts new file mode 100644 index 00000000..f8da5055 --- /dev/null +++ b/src/build/build.ts @@ -0,0 +1,199 @@ +import { createHash } from 'node:crypto' +import { readFile, rm } from 'node:fs/promises' +import { dirname, join, normalize, relative, resolve } from 'pathe' +import { consola } from 'consola' +import { readPackageJSON } from 'pkg-types' +import { glob } from 'tinyglobby' +import { build as tsdownBuild } from 'tsdown' +import type { InlineConfig } from 'tsdown' + +import builderPkg from '../../package.json' with { type: 'json' } +import { transpileDir, TYPE_ERRORS_WARNING } from '../rolldown/transpile-dir.ts' +import { createTsconfigResolver, declarationPaths, findPackageDir, tsconfigPaths, writeDerivedTsconfig, writeServerRoutesStub } from '../rolldown/tsconfig.ts' +import { shouldAdvise } from './advice.ts' +import { rewriteRuntimeDeclarations } from './aliases.ts' +import { externalDependencyDeclarations, NUXT_EXTERNALS } from './externals.ts' +import { checkDeprecatedPackageFields } from './deprecations.ts' +import { bundledEntries } from './entries.ts' +import { guide } from './guide.ts' +import { loadOxc, probe } from './loader.ts' +import { writeModuleMeta } from './meta.ts' +import { runtimeExternals } from './runtime-externals.ts' +import { hasIsolatedDeclarations, selfReferencePaths } from './tsconfig.ts' +import { writeTypes } from './types.ts' + +export interface BuildOptions { + outDir: string + sourcemap: boolean +} + +const ISOLATED_DECLARATIONS_HINT = [ + 'Declaration generation failed under `isolatedDeclarations`.', + 'Every exported value needs an explicit type annotation. In particular, a module entry has to be written as:', + '', + ' const module: NuxtModule = defineNuxtModule({ /* ... */ })', + ' export default module', + '', + `rather than \`export default defineNuxtModule({ /* ... */ })\`. ${guide('isolated-declarations')}`, +].join('\n') + +const TYPE_ERROR_HINT = [ + 'Type declarations could not be generated because of TypeScript errors.', + `An inferred type that cannot be named (TS2742) needs an explicit type annotation on the export. ${guide('portability-errors')}`, + `If \`.nuxt\` is out of date, run \`nuxt-module-build prepare\` and build again. ${guide('declaration-errors')}`, +].join('\n') + +const SCRIPT_RE = /\.[cm]?[jt]sx?$/ + +export function shouldNudge(isolatedDeclarations: boolean) { + return !isolatedDeclarations && shouldAdvise('isolated-declarations') +} + +export async function build(cwd: string, options: BuildOptions) { + const pkg = await readPackageJSON(cwd) + const outDir = resolve(cwd, options.outDir) + const runtimeSrcDir = resolve(cwd, 'src/runtime') + const tsconfigs = await createTsconfigResolver(cwd) + if (tsconfigs.replaced) { + const path = relative(cwd, tsconfigs.replaced) + const advice = path.startsWith('..') ? 'Add a `tsconfig.json` in the module directory that extends `./.nuxt/tsconfig.json`.' : 'Extend `./.nuxt/tsconfig.json` in the module\'s tsconfig.' + consola.info(`\`${path}\` takes its generated types from another app's \`.nuxt\`; declarations are generated with \`.nuxt/tsconfig.json\` instead. ${advice} ${guide('module-tsconfig')}`) + } + const selfPaths = selfReferencePaths(cwd, pkg, outDir) + + const directories = [{ srcDir: runtimeSrcDir, outDir: join(outDir, 'runtime'), ext: 'js' as const }] + const sourcemap = options.sourcemap + + await rm(outDir, { recursive: true, force: true }) + + const entries = bundledEntries(cwd, pkg) + const moduleTsconfig = tsconfigs.resolve(resolve(cwd, entries.module)) + const isolatedDeclarations = hasIsolatedDeclarations(moduleTsconfig) + // `eager` puts every file of the tsconfig in the program, so ambient declarations such + // as `.nuxt/nuxt.d.ts` apply and inferred types can be named by their package. + const moduleDeclarationPaths = declarationPaths({ ...selfPaths, ...tsconfigPaths(moduleTsconfig) }, cwd) + await writeServerRoutesStub(cwd) + const moduleDts = { + tsconfig: moduleTsconfig ? await writeDerivedTsconfig(cwd, moduleTsconfig, selfPaths) : false, + generator: isolatedDeclarations ? 'oxc' : 'tsc', + tsc: { eager: true, parallel: true }, + compilerOptions: { paths: moduleDeclarationPaths.paths }, + } as const + + const bundledSources = new Map() + for (const [name, input] of Object.entries(entries)) { + const file = probe(resolve(cwd, input)) + if (file) { + bundledSources.set(normalize(file), `${name}.mjs`) + } + } + const reserved = new Set([...Object.keys(entries), 'types']) + const nuxtDir = findPackageDir('nuxt', cwd) + const vue = { cacheVersion: await hashGeneratedTypes(cwd) } + const directoryPlugins = directories.map(directory => transpileDir({ + cwd, + srcDir: directory.srcDir, + outBase: relative(outDir, directory.outDir), + extension: directory.ext, + paths: { ...selfPaths, ...nuxtDir && { '#app/nuxt': [join(nuxtDir, 'dist/app/nuxt')] } }, + transform: loadOxc()?.transform, + sourcemap, + vue, + // The module entry keeps its own output. Any other file is mirrored where the + // specifier already points, or under `_external/` when that would take the name of + // the module entry or `types`. + resolveExternal(_specifier, _importer, { file, kind, from, output }) { + const bundled = bundledSources.get(file) + if (bundled) { + return relativeSpecifier(from, bundled) + } + if (reserved.has(output.replace(SCRIPT_RE, ''))) { + const segments = relative(cwd, file).replace(SCRIPT_RE, `.${directory.ext}`).split('/').map(segment => segment === '..' ? '_' : segment) + return { mirror: kind, output: join('_external', ...segments) } + } + return { mirror: kind } + }, + })) + + const start = Date.now() + await tsdownBuild({ + cwd, + config: false, + format: 'esm', + outDir, + clean: false, + report: false, + sourcemap, + deps: { neverBundle: NUXT_EXTERNALS }, + entry: entries, + dts: moduleDts, + inputOptions: options => ({ + ...options, + makeAbsoluteExternalsRelative: false, + onLog(level, log, handler) { + const linked = log.pluginCode === TYPE_ERRORS_WARNING ? { ...log, message: `${log.message}\n${guide('other-type-errors')}` } : log + return options.onLog ? options.onLog(level, linked, handler) : handler(level, linked) + }, + }), + plugins: [ + externalDependencyDeclarations(), + runtimeExternals({ outDir, directories, packageName: pkg.name }), + ...directoryPlugins, + ], + } satisfies InlineConfig).catch(async (error) => { + await rm(outDir, { recursive: true, force: true }) + if (isolatedDeclarations && !isDirectoryError(error)) { + consola.error(ISOLATED_DECLARATIONS_HINT) + } + else if (/\bTS\d{4}\b/.test(String(error?.message))) { + consola.error(TYPE_ERROR_HINT) + } + throw error + }) + const duration = Date.now() - start + + await writeModuleMeta({ + cwd, + outDir, + pkg, + builder: { + [builderPkg.name]: builderPkg.version, + tsdown: await readPackageJSON('tsdown', { from: import.meta.url }).then(r => r.version || 'unknown').catch(() => 'unknown'), + }, + }).catch((error) => { + consola.error(error) + consola.error('Cannot load module. Please check dist:', resolve(outDir, 'module.mjs')) + }) + await writeTypes(outDir, false) + const outputs = await Promise.all(directoryPlugins.map(plugin => plugin.api.outputs)) + await rewriteRuntimeDeclarations(outDir, outputs.flatMap(map => [...map.values()])) + + if (shouldNudge(isolatedDeclarations)) { + consola.info(`Built in ${duration}ms. Set \`isolatedDeclarations: true\` in your \`tsconfig.json\` to use the faster oxc declaration generator. ${guide('isolated-declarations')}`) + } + + await checkDeprecatedPackageFields(cwd) +} + +function isDirectoryError(error: unknown) { + const errors = (error as { errors?: Array<{ plugin?: string }> } | undefined)?.errors + return Array.isArray(errors) && errors.some(nested => nested.plugin === 'transpile-dir') +} + +function relativeSpecifier(from: string, to: string) { + const path = relative(dirname(from), to) + return path.startsWith('.') ? path : `./${path}` +} + +/** + * A hash of the types Nuxt generates in `.nuxt/`, which augment what single-file + * component declarations refer to without being visible to the declaration cache. + */ +async function hashGeneratedTypes(cwd: string) { + const files = await glob(['tsconfig.json', '**/*.d.ts'], { cwd: join(cwd, '.nuxt'), absolute: true, onlyFiles: true }) + const hash = createHash('sha256') + for (const file of files.sort()) { + hash.update(relative(cwd, file)).update(await readFile(file)) + } + return hash.digest('hex').slice(0, 12) +} diff --git a/src/build/deprecations.ts b/src/build/deprecations.ts new file mode 100644 index 00000000..80087116 --- /dev/null +++ b/src/build/deprecations.ts @@ -0,0 +1,76 @@ +import { existsSync } from 'node:fs' +import { resolve } from 'pathe' +import { consola } from 'consola' +import { readPackageJSON } from 'pkg-types' + +import { guide } from './guide.ts' + +/** Warn about `package.json` fields that point at output this builder no longer produces. */ +export async function checkDeprecatedPackageFields(cwd: string) { + const pkg = await readPackageJSON(cwd).catch(() => undefined) + if (!pkg) { + return + } + + checkLegacyDeclarationPaths(cwd, pkg) + checkLegacyCJSPaths(cwd, pkg) + checkStaleTypesField(cwd, pkg) +} + +type PackageJSON = Awaited> + +const DECLARATION_RE = /(?:^|\/)(?:module|types)\.d\.ts$/ +const CJS_MODULE_RE = /module\.cjs$/ + +export function checkLegacyDeclarationPaths(cwd: string, pkg: PackageJSON) { + if (!missingPaths(cwd, pkg).some(path => DECLARATION_RE.test(path))) { + return false + } + consola.warn(`\`@nuxt/module-builder\` no longer generates \`.d.ts\` declarations for the module entry. Replace \`.d.ts\` with \`.d.mts\` in these \`package.json\` paths: ${list(missingPaths(cwd, pkg).filter(path => DECLARATION_RE.test(path)))}. ${guide('declaration-paths')}`) + return true +} + +export function checkLegacyCJSPaths(cwd: string, pkg: PackageJSON) { + if (!missingPaths(cwd, pkg).some(path => CJS_MODULE_RE.test(path))) { + return false + } + consola.warn(`\`@nuxt/module-builder\` no longer generates \`module.cjs\`, which Nuxt 3 and later do not need. Replace it with \`./dist/module.mjs\` in \`package.json\`. ${guide('modulecjs')}`) + return true +} + +export function checkStaleTypesField(cwd: string, pkg: PackageJSON) { + if (!pkg.types || existsSync(resolve(cwd, pkg.types))) { + return false + } + consola.warn(`Remove the \`types\` field from \`package.json\`: it points at \`${pkg.types}\`, which the build does not produce, and bundler module resolution reads \`exports\` instead. Use \`typesVersions\` for subpath export types under Node10 resolution, if required. ${guide('the-types-field')}`) + return true +} + +function list(paths: string[]) { + return [...new Set(paths)].map(path => `\`${path}\``).join(', ') +} + +function missingPaths(cwd: string, pkg: PackageJSON): string[] { + return referencedPaths(pkg).filter(path => path.startsWith('.') && !existsSync(resolve(cwd, path))) +} + +function referencedPaths(pkg: PackageJSON): string[] { + const paths: string[] = [] + const visit = (value: unknown) => { + if (typeof value === 'string') { + paths.push(value) + } + else if (Array.isArray(value)) { + value.forEach(visit) + } + else if (value && typeof value === 'object') { + Object.values(value).forEach(visit) + } + } + visit(pkg.exports) + visit(pkg.typesVersions) + visit(pkg.types) + visit(pkg.main) + visit(pkg.module) + return paths +} diff --git a/src/build/entries.ts b/src/build/entries.ts new file mode 100644 index 00000000..e346bea4 --- /dev/null +++ b/src/build/entries.ts @@ -0,0 +1,24 @@ +import { relative, resolve } from 'pathe' +import type { PackageJson } from 'pkg-types' + +import { probe } from './loader.ts' + +/** + * The files bundled on their own, by output name: `src/module` plus any `build.entries` + * of `package.json`, which unbuild read and named after their path under `src/`. + */ +export function bundledEntries(cwd: string, pkg: PackageJson) { + const entries: Record = {} + for (const entry of (pkg as { build?: { entries?: string[] } }).build?.entries ?? []) { + const input = probe(resolve(cwd, entry)) + if (input) { + entries[entryName(input, cwd)] = `./${relative(cwd, input)}` + } + } + const module = probe(resolve(cwd, 'src/module')) ?? resolve(cwd, 'src/module.ts') + return { ...entries, module: `./${relative(cwd, module)}` } +} + +function entryName(input: string, cwd: string) { + return relative(cwd, input).replace(/^src\//, '').replace(/\.(?:js|mjs|cjs|ts|mts|cts|json|jsx|tsx)$/, '') +} diff --git a/src/build/externals.ts b/src/build/externals.ts new file mode 100644 index 00000000..f6643bdd --- /dev/null +++ b/src/build/externals.ts @@ -0,0 +1,48 @@ +import { isAbsolute } from 'pathe' +import type { Rolldown } from 'tsdown' + +export const NUXT_EXTERNALS = [ + '@nuxt/schema', + '@nuxt/schema-nightly', + '@nuxt/schema-edge', + '@nuxt/kit', + '@nuxt/kit-nightly', + '@nuxt/kit-edge', + /^#app(\/|$)/, + /^#build(\/|$)/, + /^#imports$/, + /^nuxt(\/|$)/, + 'nuxt-nightly', + 'nuxt-edge', + 'nuxt3', + 'vue', + 'vue-demi', +] + +const DECLARATION_RE = /\.d\.[cm]?ts$/ +const NODE_MODULES_RE = /[\\/]node_modules[\\/]/ + +/** + * Keeps declaration imports of installed packages external, whether or not the package + * is a dependency. Aliases that resolve into the module's own source are bundled. + */ +export function externalDependencyDeclarations(): Rolldown.Plugin { + return { + name: 'nuxt-module-builder:external-dependency-declarations', + resolveId: { + order: 'pre', + async handler(id, importer, options) { + if (!importer || !DECLARATION_RE.test(importer) || id.startsWith('.') || id.startsWith('\0') || isAbsolute(id)) { + return + } + const resolved = await this.resolve(id, importer, { ...options, skipSelf: true }) + if (resolved?.external) { + return resolved + } + if (!resolved || NODE_MODULES_RE.test(resolved.id)) { + return { id, external: true } + } + }, + }, + } +} diff --git a/src/build/guide.ts b/src/build/guide.ts new file mode 100644 index 00000000..16d3831b --- /dev/null +++ b/src/build/guide.ts @@ -0,0 +1,28 @@ +const GUIDE_URL = 'https://github.com/nuxt/module-builder/blob/main/docs/upgrade-v2.md' + +export type GuideSection + = | 'node-engines' + | 'install-tsdown' + | 'build-configuration' + | 'unsupported-build-options' + | 'hooks' + | 'rollup-options' + | 'commonjs-output' + | 'mkdist-options' + | 'other-options' + | 'declaration-paths' + | 'modulecjs' + | 'the-types-field' + | 'paths-the-build-does-not-produce' + | 'stub-builds' + | 'declaration-errors' + | 'portability-errors' + | 'other-type-errors' + | 'isolated-declarations' + | 'preparing-nuxt' + | 'module-tsconfig' + +/** The URL of a section of the upgrade guide. */ +export function guide(section: GuideSection) { + return `${GUIDE_URL}#${section}` +} diff --git a/src/build/loader.ts b/src/build/loader.ts new file mode 100644 index 00000000..8e06d37b --- /dev/null +++ b/src/build/loader.ts @@ -0,0 +1,50 @@ +import { existsSync, statSync } from 'node:fs' +import { createRequire } from 'node:module' +import { resolve } from 'pathe' + +import type { Transform } from '../rolldown/transpile-dir.ts' + +const EXTENSIONS = ['.ts', '.mts', '.cts', '.tsx', '.js', '.mjs', '.cjs', '.jsx'] + +interface Oxc { + transform: Transform +} + +let oxc: Oxc | null | undefined + +/** The oxc bindings of the `rolldown` that `tsdown` depends on, or `null` when `tsdown` is not installed. */ +export function loadOxc() { + if (oxc === undefined) { + try { + oxc = createRequire(import.meta.resolve('tsdown'))('rolldown/utils') as Oxc + } + catch { + oxc = null + } + } + return oxc +} + +/** + * Find the source file a specifier refers to, trying the path as written, its + * TypeScript counterpart, each source extension, then an `index` file. + */ +export function probe(path: string) { + if (existsSync(path) && statSync(path).isFile()) { + return path + } + const source = path.replace(/\.([cm]?)js(x?)$/, '.$1ts$2') + if (source !== path && existsSync(source)) { + return source + } + for (const extension of EXTENSIONS) { + if (existsSync(path + extension)) { + return path + extension + } + } + for (const extension of EXTENSIONS) { + if (existsSync(resolve(path, `index${extension}`))) { + return resolve(path, `index${extension}`) + } + } +} diff --git a/src/build/meta.ts b/src/build/meta.ts new file mode 100644 index 00000000..cd23a51c --- /dev/null +++ b/src/build/meta.ts @@ -0,0 +1,24 @@ +import { writeFile } from 'node:fs/promises' +import { pathToFileURL } from 'node:url' +import { createJiti } from 'jiti' +import { resolve } from 'pathe' +import type { NuxtModule } from '@nuxt/schema' + +export interface WriteModuleMetaOptions { + cwd: string + outDir: string + pkg: { name?: string, version?: string } + builder: Record +} + +export async function writeModuleMeta({ cwd, outDir, pkg, builder }: WriteModuleMetaOptions) { + const jiti = createJiti(cwd) + const moduleFn = await jiti.import>>(pathToFileURL(resolve(outDir, 'module.mjs')).href, { default: true }) + + const moduleMeta = await moduleFn.getMeta?.() || {} + moduleMeta.name ||= pkg.name + moduleMeta.version ||= pkg.version + moduleMeta.builder = builder + + await writeFile(resolve(outDir, 'module.json'), JSON.stringify(moduleMeta, null, 2), 'utf8') +} diff --git a/src/build/runtime-externals.ts b/src/build/runtime-externals.ts new file mode 100644 index 00000000..05c44b48 --- /dev/null +++ b/src/build/runtime-externals.ts @@ -0,0 +1,92 @@ +import { existsSync, statSync } from 'node:fs' +import { dirname, isAbsolute, join, normalize, relative } from 'pathe' +import type { Rolldown } from 'tsdown' + +const CODE_EXTENSION_RE = /\.[cm]?[tj]sx?$/ +const CODE_EXTENSIONS = ['.ts', '.mts', '.cts', '.tsx', '.js', '.mjs', '.cjs', '.jsx'] + +export interface RuntimeExternalsOptions { + /** Absolute path of the build's output directory. */ + outDir: string + /** The directories transpiled file by file, with their absolute source and output paths. */ + directories: Array<{ srcDir: string, outDir: string, ext: 'js' | 'mjs' }> + /** The module's own package name, so self-referencing imports are caught. */ + packageName?: string +} + +/** + * Rewrites imports of the module's runtime tree to the absolute paths they will occupy + * in `dist/`, and marks them external so the runtime tree is never inlined into the + * bundled module entry. The build has to set `makeAbsoluteExternalsRelative: false`: + * the specifiers are made relative to each chunk's own location when it is rendered. + * + * `this.resolve()` is used rather than pattern-matching the specifier so that + * tsconfig path aliases resolving into `src/runtime/` are handled too. + */ +export function runtimeExternals({ outDir, directories, packageName }: RuntimeExternalsOptions): Rolldown.Plugin { + const selfPrefix = packageName ? `${packageName}/` : undefined + + return { + name: 'nuxt-module-builder:runtime-externals', + async resolveId(id, importer) { + if (selfPrefix && id.startsWith(selfPrefix)) { + const target = join(outDir, id.slice(selfPrefix.length)) + for (const directory of directories) { + const subpath = relative(directory.outDir, target) + if (subpath && !subpath.startsWith('..') && !isAbsolute(subpath)) { + return { id: join(directory.outDir, distSubpath(subpath, directory)), external: true } + } + } + } + + if (!importer) { + return + } + + const resolved = await this.resolve(id, importer, { skipSelf: true }) + if (!resolved || resolved.external) { + return + } + + for (const directory of directories) { + const subpath = relative(directory.srcDir, normalize(resolved.id)) + if (subpath && !subpath.startsWith('..') && !isAbsolute(subpath)) { + return { id: join(directory.outDir, distSubpath(subpath, directory)), external: true } + } + } + }, + renderChunk(code, chunk, { dir }) { + if (!dir) { + return + } + const chunkDir = dirname(join(dir, chunk.fileName)) + let result = code + for (const id of new Set([...chunk.imports, ...chunk.dynamicImports])) { + if (!directories.some(directory => id.startsWith(`${directory.outDir}/`))) { + continue + } + const specifier = relative(chunkDir, id) + result = result.replaceAll(JSON.stringify(id), JSON.stringify(specifier.startsWith('.') ? specifier : `./${specifier}`)) + } + return result === code ? undefined : { code: result, map: null } + }, + } +} + +function distSubpath(subpath: string, { srcDir, ext }: { srcDir: string, ext: string }) { + if (CODE_EXTENSION_RE.test(subpath)) { + return subpath.replace(CODE_EXTENSION_RE, `.${ext}`) + } + const source = join(srcDir, subpath) + if (subpath.endsWith('.vue') || isFile(source)) { + return subpath + } + if (!CODE_EXTENSIONS.some(extension => isFile(source + extension)) && CODE_EXTENSIONS.some(extension => isFile(join(source, `index${extension}`)))) { + return `${subpath}/index.${ext}` + } + return `${subpath}.${ext}` +} + +function isFile(path: string) { + return existsSync(path) && statSync(path).isFile() +} diff --git a/src/build/stub.ts b/src/build/stub.ts new file mode 100644 index 00000000..b35d5230 --- /dev/null +++ b/src/build/stub.ts @@ -0,0 +1,49 @@ +import { promises as fsp } from 'node:fs' +import { rm } from 'node:fs/promises' +import { dirname, relative, resolve } from 'pathe' +import { findExports } from 'mlly' +import { readPackageJSON } from 'pkg-types' + +import builderPkg from '../../package.json' with { type: 'json' } +import { checkDeprecatedPackageFields } from './deprecations.ts' +import { bundledEntries } from './entries.ts' +import { writeModuleMeta } from './meta.ts' +import { writeTypes } from './types.ts' + +export interface StubOptions { + outDir: string +} + +/** + * Write plain re-export files pointing back at the module's TypeScript sources. + * Node's type stripping loads them directly, so no bundler is involved. + */ +export async function stub(cwd: string, options: StubOptions) { + const pkg = await readPackageJSON(cwd) + const outDir = resolve(cwd, options.outDir) + + await rm(outDir, { recursive: true, force: true }) + await fsp.mkdir(outDir, { recursive: true }) + + for (const [name, input] of Object.entries(bundledEntries(cwd, pkg))) { + const entry = resolve(cwd, input) + const source = await fsp.readFile(entry, 'utf8') + const hasDefaultExport = findExports(source).some(e => e.type === 'default' || e.names?.includes('default')) + + await fsp.mkdir(dirname(resolve(outDir, name)), { recursive: true }) + const specifier = relative(dirname(resolve(outDir, name)), entry) + const reExports = [ + `export * from '${specifier}'`, + ...hasDefaultExport ? [`export { default } from '${specifier}'`] : [], + ].join('\n') + '\n' + + await fsp.writeFile(resolve(outDir, `${name}.mjs`), reExports, 'utf8') + // TypeScript resolves the `.js` specifier back to the `.ts` source without + // requiring consumers to enable `allowImportingTsExtensions`. + await fsp.writeFile(resolve(outDir, `${name}.d.mts`), reExports.replace(/\.([cm]?)tsx?'/g, '.$1js\''), 'utf8') + } + + await writeModuleMeta({ cwd, outDir, pkg, builder: { [builderPkg.name]: builderPkg.version } }) + await writeTypes(outDir, true) + await checkDeprecatedPackageFields(cwd) +} diff --git a/src/build/tsconfig.ts b/src/build/tsconfig.ts new file mode 100644 index 00000000..9512612a --- /dev/null +++ b/src/build/tsconfig.ts @@ -0,0 +1,42 @@ +import type { TsConfigResult } from 'get-tsconfig' +import { relative, resolve } from 'pathe' +import type { PackageJson } from 'pkg-types' + +/** + * `paths` pointing the package's own name and `exports` subpaths at its sources, so + * self-referencing imports type-check before `dist` exists. + */ +export function selfReferencePaths(cwd: string, pkg: PackageJson, outDir: string): Record { + if (!pkg.name) { + return {} + } + const paths: Record = { [pkg.name]: [resolve(cwd, 'src/module')] } + if (!pkg.exports || typeof pkg.exports !== 'object' || Array.isArray(pkg.exports)) { + return paths + } + for (const [subpath, target] of Object.entries(pkg.exports)) { + const file = exportTarget(target) + if (!subpath.startsWith('./') || !file) { + continue + } + const distPath = relative(outDir, resolve(cwd, file)) + if (!distPath.startsWith('..')) { + paths[`${pkg.name}/${subpath.slice(2)}`] = [resolve(cwd, 'src', distPath.replace(/(?:\.d)?\.[cm]?[jt]s$/, ''))] + } + } + return paths +} + +function exportTarget(target: unknown): string | undefined { + if (typeof target === 'string') { + return target + } + if (target && typeof target === 'object' && !Array.isArray(target)) { + const conditions = target as Record + return exportTarget(conditions.import ?? conditions.default ?? conditions.types) + } +} + +export function hasIsolatedDeclarations(tsconfig: TsConfigResult | undefined) { + return tsconfig?.config.compilerOptions?.isolatedDeclarations === true +} diff --git a/src/build/types.ts b/src/build/types.ts new file mode 100644 index 00000000..3bcc9dfc --- /dev/null +++ b/src/build/types.ts @@ -0,0 +1,94 @@ +import { existsSync, promises as fsp } from 'node:fs' +import { resolve } from 'pathe' +import { findExports, findTypeExports } from 'mlly' +import type { ESMExport } from 'mlly' + +export async function writeTypes(distDir: string, isStub: boolean) { + const dtsFile = resolve(distDir, 'types.d.mts') + if (existsSync(dtsFile)) { + return + } + + const moduleReExports: ESMExport[] = [] + if (!isStub) { + // Read generated module types + const moduleTypesFile = resolve(distDir, 'module.d.mts') + const moduleTypes = await fsp.readFile(moduleTypesFile, 'utf8').catch(() => '') + const normalisedModuleTypes = moduleTypes + // Replace `export { type Foo }` with `export { Foo }` + .replace(/export\s*\{.*?\}/gs, match => match.replace(/\b(type|interface)\b/g, '')) + for (const e of findExports(normalisedModuleTypes)) { + moduleReExports.push(e) + } + for (const i of findTypeExports(normalisedModuleTypes)) { + moduleReExports.push(i) + } + } + + const appShims: string[] = [] + const schemaShims: string[] = [] + const moduleImports: string[] = [] + const schemaImports: string[] = [] + const moduleExports: string[] = [] + + const hasTypeExport = (name: string) => isStub || moduleReExports.find(exp => exp.names?.includes(name)) + + if (!hasTypeExport('ModuleOptions')) { + schemaImports.push('NuxtModule') + moduleImports.push('default as Module') + moduleExports.push(`export type ModuleOptions = typeof Module extends NuxtModule ? Partial : Record`) + } + + if (hasTypeExport('ModuleHooks')) { + moduleImports.push('ModuleHooks') + schemaShims.push(' interface NuxtHooks extends ModuleHooks {}') + } + + if (hasTypeExport('ModuleRuntimeHooks')) { + moduleImports.push('ModuleRuntimeHooks') + appShims.push(` interface RuntimeNuxtHooks extends ModuleRuntimeHooks {}`) + } + + if (hasTypeExport('ModuleRuntimeConfig')) { + moduleImports.push('ModuleRuntimeConfig') + schemaShims.push(' interface RuntimeConfig extends ModuleRuntimeConfig {}') + } + if (hasTypeExport('ModulePublicRuntimeConfig')) { + moduleImports.push('ModulePublicRuntimeConfig') + schemaShims.push(' interface PublicRuntimeConfig extends ModulePublicRuntimeConfig {}') + } + + const dtsContents = ` + ${schemaImports.length ? `import type { ${schemaImports.join(', ')} } from '@nuxt/schema'` : ''} + +${moduleImports.length ? `import type { ${moduleImports.join(', ')} } from './module.mjs'` : ''} + +${appShims.length ? `declare module '#app' {\n${appShims.join('\n')}\n}\n` : ''} +${schemaShims.length ? `declare module '@nuxt/schema' {\n${schemaShims.join('\n')}\n}\n` : ''} +${moduleExports.length ? `\n${moduleExports.join('\n')}` : ''} +${isStub ? 'export * from "./module.mjs"' : ''} +${[...groupNamedReExports(moduleReExports)].map(([specifier, names]) => `\nexport { ${names.map(n => (n === 'default' ? '' : 'type ') + n).join(', ')} } from '${specifier}'`).join('\n')} +${moduleReExports.filter(e => e.type === 'star').map(e => `\nexport * from '${e.specifier || './module.mjs'}'`).join('\n')} +`.trim().replace(/[\n\r]{3,}/g, '\n\n') + '\n' + + await fsp.writeFile(dtsFile, dtsContents, 'utf8') +} + +function groupNamedReExports(exports: ESMExport[]) { + const groups = new Map>() + for (const e of exports) { + if (e.type !== 'named' && e.type !== 'default' && e.type !== 'declaration') { + continue + } + const specifier = e.specifier || './module.mjs' + const names = groups.get(specifier) ?? new Set() + for (const name of e.names) { + names.add(name) + } + groups.set(specifier, names) + } + return new Map([...groups].map(([specifier, names]) => [ + specifier, + [...names].sort((a, b) => a === 'default' ? 1 : b === 'default' ? -1 : a.localeCompare(b)), + ])) +} diff --git a/src/commands/build.ts b/src/commands/build.ts index 3ec68354..4246ea62 100644 --- a/src/commands/build.ts +++ b/src/commands/build.ts @@ -1,24 +1,7 @@ -import { existsSync, promises as fsp } from 'node:fs' -import { pathToFileURL } from 'node:url' -import { basename, dirname, extname, join, normalize, resolve } from 'pathe' -import { filename } from 'pathe/utils' -import { readPackageJSON } from 'pkg-types' -import { createPathsMatcher, getTsconfig } from 'get-tsconfig' -import { defu } from 'defu' -import { createJiti } from 'jiti' -import { anyOf, createRegExp } from 'magic-regexp' -import { consola } from 'consola' -import type { NuxtModule } from '@nuxt/schema' -import { findExports, resolvePath, findTypeExports } from 'mlly' -import type { ESMExport } from 'mlly' import { defineCommand } from 'citty' -import { convertCompilerOptionsFromJson } from 'typescript' -import pkg from '../../package.json' with { type: 'json' } import { resolveCwdArg, sharedArgs } from './_shared.ts' -const { name, version } = pkg - export default defineCommand({ meta: { name: 'build', @@ -43,284 +26,14 @@ export default defineCommand({ }, }, async run(context) { - const { build } = await import('unbuild') - const cwd = resolveCwdArg(context.args) - const jiti = createJiti(cwd) - - await build(cwd, false, { - declaration: 'node16', - sourcemap: context.args.sourcemap, - stub: context.args.stub, - stubOptions: { absoluteJitiPath: true }, - outDir: context.args.outDir, - entries: [ - 'src/module', - { - input: 'src/runtime/', - outDir: `${context.args.outDir}/runtime`, - addRelativeDeclarationExtensions: true, - ext: 'js', - pattern: [ - '**', - '!**/*.stories.{js,cts,mts,ts,jsx,tsx}', // ignore storybook files - '!**/*.{spec,test}.{js,cts,mts,ts,jsx,tsx}', // ignore tests - ], - esbuild: { - jsxImportSource: 'vue', - jsx: 'automatic', - jsxFactory: 'h', - }, - }, - ], - rollup: { - esbuild: { - target: 'esnext', - }, - emitCJS: false, - cjsBridge: false, - }, - externals: [ - /dist[\\/]runtime[\\/]/, - '@nuxt/schema', - '@nuxt/schema-nightly', - '@nuxt/schema-edge', - '@nuxt/kit', - '@nuxt/kit-nightly', - '@nuxt/kit-edge', - '#app', - '#app/nuxt', - 'nuxt', - 'nuxt-nightly', - 'nuxt-edge', - 'nuxt3', - 'vue', - 'vue-demi', - ], - hooks: { - async 'mkdist:entry:options'(_ctx, entry, options) { - options.typescript = defu(options.typescript, { - compilerOptions: loadTSCompilerOptions(entry.input), - }) as typeof options.typescript - }, - async 'rollup:options'(ctx, options) { - const [entry] = ctx.buildEntries - const mergedCompilerOptions = defu({ - noEmit: false, - paths: { - '#app/nuxt': ['./node_modules/nuxt/dist/app/nuxt'], - }, - }, ctx.options.rollup.dts.compilerOptions, loadTSCompilerOptions(entry!.path)) - ctx.options.rollup.dts.compilerOptions = convertCompilerOptionsFromJson(mergedCompilerOptions, entry!.path).options - options.plugins ||= [] - if (!Array.isArray(options.plugins)) - options.plugins = [options.plugins] - - const runtimeEntries = ctx.options.entries.filter(entry => entry.builder === 'mkdist') - - const runtimeDirs = runtimeEntries.map(entry => basename(entry.input)) - const RUNTIME_RE = createRegExp(anyOf(...runtimeDirs).and(anyOf('/', '\\'))) - - // Add extension for imports of runtime files in build - options.plugins.unshift({ - name: 'nuxt-module-builder:runtime-externals', - async resolveId(id, importer) { - if (!RUNTIME_RE.test(id)) - return - - const resolved = await this.resolve(id, importer, { skipSelf: true }) - if (!resolved) - return - - const normalizedId = normalize(resolved.id) - for (const entry of runtimeEntries) { - if (!entry.outDir || !normalizedId.includes(entry.input)) - continue - - const name = filename(normalizedId) || basename(normalizedId, extname(normalizedId)) - const distFile = await resolvePath(join(dirname(pathToFileURL(normalizedId.replace(entry.input, entry.outDir)).href), name)) - if (distFile) { - return { - external: true, - id: distFile, - } - } - } - }, - }) - }, - async 'rollup:done'(ctx) { - // Load module meta - const moduleEntryPath = resolve(ctx.options.outDir, 'module.mjs') - const moduleFn = await jiti.import>>(pathToFileURL(moduleEntryPath).toString(), { default: true }).catch((err) => { - consola.error(err) - consola.error('Cannot load module. Please check dist:', moduleEntryPath) - return null - }) - - if (!moduleFn) { - return - } - const moduleMeta = await moduleFn.getMeta?.() || {} - - // Enhance meta using package.json - if (ctx.pkg) { - if (!moduleMeta.name) { - moduleMeta.name = ctx.pkg.name - } - if (!moduleMeta.version) { - moduleMeta.version = ctx.pkg.version - } - } - - // Add module builder metadata - moduleMeta.builder = { - [name]: version, - unbuild: await readPackageJSON('unbuild').then(r => r.version).catch(() => 'unknown'), - } - - // Write meta - const metaFile = resolve(ctx.options.outDir, 'module.json') - await fsp.writeFile(metaFile, JSON.stringify(moduleMeta, null, 2), 'utf8') - - // Generate types - await writeTypes(ctx.options.outDir, ctx.options.stub) - - if (!ctx.options.stub) { - await rewriteRuntimeTypeAliases(resolve(ctx.options.outDir, 'runtime')) - } - }, - async 'build:done'(ctx) { - const logs = [...ctx.warnings].filter(l => l.startsWith('Potential missing package.json files:')) - if (logs.filter(l => l.match(/\.d\.ts/)).length > 0) { - consola.warn(`\`@nuxt/module-builder\` will no longer generate \`.d.ts\` declaration files. You can update these paths to use the \`.d.mts\` extension instead.`) - } - - if (logs.filter(l => l.match(/module\.cjs/)).length > 0) { - consola.warn(`\`@nuxt/module-builder\` will no longer generate \`module.cjs\` as this is not required for Nuxt v3+. You can safely remove replace this with \`module.mjs\` in your \`package.json\`.`) - } + if (context.args.stub) { + const { stub } = await import('../build/stub.ts') + return stub(cwd, { outDir: context.args.outDir }) + } - const pkg = await readPackageJSON(cwd) - if (pkg?.types && !existsSync(resolve(cwd, pkg.types))) { - consola.warn(`Please remove the \`types\` field from package.json as it is no longer required for Bundler TypeScript module resolution. Instead, you can use \`typesVersions\` to support subpath export types for Node10, if required.`) - } - }, - }, - }) + const { build } = await import('../build/build.ts') + return build(cwd, { outDir: context.args.outDir, sourcemap: context.args.sourcemap }) }, }) - -async function writeTypes(distDir: string, isStub: boolean) { - const dtsFile = resolve(distDir, 'types.d.mts') - if (existsSync(dtsFile)) { - return - } - - const moduleReExports: ESMExport[] = [] - if (!isStub) { - // Read generated module types - const moduleTypesFile = resolve(distDir, 'module.d.mts') - const moduleTypes = await fsp.readFile(moduleTypesFile, 'utf8').catch(() => '') - const normalisedModuleTypes = moduleTypes - // Replace `export { type Foo }` with `export { Foo }` - .replace(/export\s*\{.*?\}/gs, match => match.replace(/\b(type|interface)\b/g, '')) - for (const e of findExports(normalisedModuleTypes)) { - moduleReExports.push(e) - } - for (const i of findTypeExports(normalisedModuleTypes)) { - moduleReExports.push(i) - } - } - - const appShims: string[] = [] - const schemaShims: string[] = [] - const moduleImports: string[] = [] - const schemaImports: string[] = [] - const moduleExports: string[] = [] - - const hasTypeExport = (name: string) => isStub || moduleReExports.find(exp => exp.names?.includes(name)) - - if (!hasTypeExport('ModuleOptions')) { - schemaImports.push('NuxtModule') - moduleImports.push('default as Module') - moduleExports.push(`export type ModuleOptions = typeof Module extends NuxtModule ? Partial : Record`) - } - - if (hasTypeExport('ModuleHooks')) { - moduleImports.push('ModuleHooks') - schemaShims.push(' interface NuxtHooks extends ModuleHooks {}') - } - - if (hasTypeExport('ModuleRuntimeHooks')) { - moduleImports.push('ModuleRuntimeHooks') - appShims.push(` interface RuntimeNuxtHooks extends ModuleRuntimeHooks {}`) - } - - if (hasTypeExport('ModuleRuntimeConfig')) { - moduleImports.push('ModuleRuntimeConfig') - schemaShims.push(' interface RuntimeConfig extends ModuleRuntimeConfig {}') - } - if (hasTypeExport('ModulePublicRuntimeConfig')) { - moduleImports.push('ModulePublicRuntimeConfig') - schemaShims.push(' interface PublicRuntimeConfig extends ModulePublicRuntimeConfig {}') - } - - const dtsContents = ` - ${schemaImports.length ? `import type { ${schemaImports.join(', ')} } from '@nuxt/schema'` : ''} - -${moduleImports.length ? `import type { ${moduleImports.join(', ')} } from './module.mjs'` : ''} - -${appShims.length ? `declare module '#app' {\n${appShims.join('\n')}\n}\n` : ''} -${schemaShims.length ? `declare module '@nuxt/schema' {\n${schemaShims.join('\n')}\n}\n` : ''} -${moduleExports.length ? `\n${moduleExports.join('\n')}` : ''} -${isStub ? 'export * from "./module.mjs"' : ''} -${moduleReExports.filter(e => e.type === 'named' || e.type === 'default').map(e => `\nexport { ${e.names.map(n => (n === 'default' ? '' : 'type ') + n).join(', ')} } from '${e.specifier || './module.mjs'}'`).join('\n')} -${moduleReExports.filter(e => e.type === 'star').map(e => `\nexport * from '${e.specifier || './module.mjs'}'`).join('\n')} -`.trim().replace(/[\n\r]{3,}/g, '\n\n') + '\n' - - await fsp.writeFile(dtsFile, dtsContents, 'utf8') -} - -const DECLARATION_RE = /\.d\.[^/]*ts$/ - -// `#app`/`#app/*` are build-time-only aliases with no package resolution, so leaking -// them into emitted declarations breaks `tsc`/`attw` for consumers. `nuxt/app` is the -// resolvable public entry and re-exports the `#app/*` symbols. -async function rewriteRuntimeTypeAliases(runtimeDir: string) { - if (!existsSync(runtimeDir)) { - return - } - - const entries = await fsp.readdir(runtimeDir, { recursive: true }) - await Promise.all(entries.map(async (entry) => { - if (!DECLARATION_RE.test(entry)) { - return - } - - const file = join(runtimeDir, entry) - const contents = await fsp.readFile(file, 'utf8') - const rewritten = contents - .replace(/import\("#app(?:\/[^"]*)?"\)/g, 'import("nuxt/app")') - .replace(/(\bfrom\s*)(['"])#app(?:\/[^'"]*)?\2/g, '$1$2nuxt/app$2') - - if (rewritten !== contents) { - await fsp.writeFile(file, rewritten, 'utf8') - } - })) -} - -function loadTSCompilerOptions(path: string) { - const tsconfig = getTsconfig(path) - const compilerOptions = tsconfig?.config.compilerOptions ?? {} - - const matchPath = tsconfig && createPathsMatcher(tsconfig) - - if (matchPath && compilerOptions.paths) { - for (const alias in compilerOptions.paths) { - compilerOptions.paths[alias] = matchPath(alias) - } - } - - return compilerOptions -} diff --git a/src/rolldown/declarations.ts b/src/rolldown/declarations.ts new file mode 100644 index 00000000..82245842 --- /dev/null +++ b/src/rolldown/declarations.ts @@ -0,0 +1,167 @@ +import type { TsConfigResult } from 'get-tsconfig' +import { dirname, relative } from 'pathe' +import type ts from 'typescript' + +import { declarationPaths, projectFiles, tsconfigPaths, writeAmbientModules, writeServerRoutesStub } from './tsconfig.ts' +import type { DeclarationPaths } from './tsconfig.ts' + +export interface DeclarationProgramOptions { + cwd: string + tsconfig: TsConfigResult | undefined + /** `paths` added to the tsconfig's. */ + paths: Record +} + +interface DeclarationEmit { + /** Declarations keyed by source path. */ + declarations: Map + /** Diagnostics that prevent correct declarations: syntax errors, emit errors and skipped files. */ + errors: string[] + /** Other type errors in the emitted files, which do not affect their declarations. */ + warnings: string[] +} + +export interface DeclarationProgram { + paths: DeclarationPaths + emit: (files: string[]) => Promise +} + +/** + * A declaration-only program over every file of the tsconfig plus `roots`, so ambient + * declarations apply and inferred types are named by package. + */ +export async function createDeclarationProgram({ cwd, tsconfig, paths }: DeclarationProgramOptions, roots: string[]): Promise { + const { default: ts } = await import('typescript') + const classifier = import('vue-sfc-transformer/core') + const parsed = tsconfig ? ts.getParsedCommandLineOfConfigFile(tsconfig.path, {}, configHost(ts)) : undefined + const declaration = declarationPaths({ ...tsconfigPaths(tsconfig), ...paths }, cwd) + const rootNames = new Set([...projectFiles(parsed, cwd), ...roots]) + await writeServerRoutesStub(cwd) + if (declaration.ambient.length) { + rootNames.add(await writeAmbientModules(cwd, declaration.ambient)) + } + + const options: ts.CompilerOptions = { + ...parsed?.options, + allowJs: true, + paths: declaration.paths, + pathsBasePath: undefined, + declaration: true, + emitDeclarationOnly: true, + declarationMap: false, + noEmit: false, + isolatedDeclarations: false, + composite: false, + incremental: false, + tsBuildInfoFile: undefined, + outDir: undefined, + declarationDir: undefined, + } + let program: ts.Program | undefined + + return { + paths: declaration, + async emit(files) { + program ??= ts.createProgram({ rootNames: [...rootNames], options, projectReferences: parsed?.projectReferences }) + const { isDeclarationEmitDiagnostic } = await classifier + const declarations = new Map() + const errors: ts.Diagnostic[] = [] + const warnings: ts.Diagnostic[] = [] + const skipped: string[] = [] + for (const file of files) { + const source = program.getSourceFile(file) + if (!source) { + skipped.push(file) + continue + } + const reported = errors.length + errors.push(...program.getSyntacticDiagnostics(source)) + for (const diagnostic of program.getSemanticDiagnostics(source)) { + (isDeclarationEmitDiagnostic({ code: diagnostic.code, kind: 'semantic' }) ? errors : warnings).push(diagnostic) + } + const result = program.emit(source, (_name, text, _bom, _error, sources) => { + const emitted = sources?.[0]?.fileName + if (emitted) { + declarations.set(emitted, text) + } + }, undefined, true) + errors.push(...result.diagnostics) + if ((result.emitSkipped || !declarations.has(file)) && errors.length === reported) { + skipped.push(file) + } + } + const isError = (diagnostic: ts.Diagnostic) => diagnostic.category === ts.DiagnosticCategory.Error + return { + declarations, + errors: [ + ...new Set(formatDiagnostics(ts, errors.filter(isError), cwd)), + ...skipped.map(file => `${relative(cwd, file)}: no declaration was emitted`), + ], + warnings: [...new Set(formatDiagnostics(ts, warnings.filter(isError), cwd))], + } + }, + } +} + +function configHost(ts: typeof import('typescript')): ts.ParseConfigFileHost { + return { + ...ts.sys, + onUnRecoverableConfigFileDiagnostic(diagnostic) { + throw new Error(ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n')) + }, + } +} + +function formatDiagnostics(ts: typeof import('typescript'), diagnostics: ts.Diagnostic[], cwd: string) { + return diagnostics.map((diagnostic) => { + const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n') + if (!diagnostic.file || diagnostic.start === undefined) { + return `error TS${diagnostic.code}: ${message}` + } + const { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start) + return `${relative(cwd, diagnostic.file.fileName)}(${line + 1},${character + 1}): error TS${diagnostic.code}: ${message}` + }) +} + +const UNNAMEABLE_TYPE_RE = /^(.+?)\((\d+),\d+\): error TS\d+: (.*cannot be named.*)$/ + +/** The error for declaration diagnostics, carrying them so concurrent ones can be merged. */ +export class DeclarationError extends Error { + readonly diagnostics: string[] + constructor(message: string, diagnostics: string[]) { + super(message) + this.diagnostics = diagnostics + } +} + +/** + * The error for declaration diagnostics. Exports whose inferred type cannot be named + * (TS2742 and relatives) are listed with the file and line to annotate. + */ +export function declarationError(diagnostics: string[]) { + const unnameable = diagnostics.flatMap((diagnostic) => { + const match = diagnostic.match(UNNAMEABLE_TYPE_RE) + if (!match) { + return [] + } + const [, file, line, text] = match + const name = text!.match(/^(?:The inferred type of|Exported variable) '([^']+)'/)?.[1] + return [`- ${name ? `\`${name}\` in ` : ''}${file}:${line}`] + }) + return new DeclarationError([ + ...diagnostics, + ...unnameable.length + ? [ + '', + 'These exports have an inferred type from a package the module cannot reference by name, such as a dependency of a dependency or another version of a package the module uses. Give each an explicit type annotation, such as `ReturnType` for a value produced by an imported `fn`:', + ...unnameable, + ] + : [], + ].join('\n'), diagnostics) +} + +/** The relative specifier from the directory of `from` to `to`. */ +export function relativeSpecifier(from: string, to: string) { + const path = relative(dirname(from), to) + return path.startsWith('.') ? path : `./${path}` +} diff --git a/src/rolldown/index.ts b/src/rolldown/index.ts new file mode 100644 index 00000000..7e5b92cf --- /dev/null +++ b/src/rolldown/index.ts @@ -0,0 +1,3 @@ +export { emptyEntry, transpileDir, TYPE_ERRORS_WARNING } from './transpile-dir.ts' +export type { ExternalImport, ImportKind, MirrorExternal, ResolveExternal, Transform, TransformOptions, TransformResult, TranspileDirApi, TranspileDirOptions } from './transpile-dir.ts' +export type { VueOptions } from './vue.ts' diff --git a/src/rolldown/resolve.ts b/src/rolldown/resolve.ts new file mode 100644 index 00000000..d2aca290 --- /dev/null +++ b/src/rolldown/resolve.ts @@ -0,0 +1,104 @@ +import { existsSync, statSync } from 'node:fs' +import { findDynamicImports, findExports, findStaticImports, findTypeExports } from 'mlly' +import { resolve } from 'pathe' + +export const SCRIPT_RE = /\.[cm]?[jt]sx?$/ +export const DECLARATION_RE = /\.d\.[cm]?ts$/ +export const RELATIVE_RE = /^\.\.?(?:\/|$)/ + +const EXTENSIONS = ['.ts', '.mts', '.cts', '.tsx', '.js', '.mjs', '.cjs', '.jsx'] + +/** The file an extensionless or `.js`-suffixed specifier for a TypeScript source resolves to. */ +export function probe(path: string) { + if (existsSync(path) && statSync(path).isFile()) { + return path + } + const source = path.replace(/\.([cm]?)js(x?)$/, '.$1ts$2') + if (source !== path && existsSync(source)) { + return source + } + for (const extension of EXTENSIONS) { + if (existsSync(path + extension)) { + return path + extension + } + } + for (const extension of EXTENSIONS) { + if (existsSync(resolve(path, `index${extension}`))) { + return resolve(path, `index${extension}`) + } + } +} + +export interface Specifier { + specifier: string + /** Offset of the opening quote. */ + start: number + /** Offset after the closing quote. */ + end: number +} + +const TYPE_STAR_EXPORT_RE = /\bexport\s+type\s*\*(?:\s*as\s+[\w$]+)?\s*from\s*(['"])([^'"\n]+)\1/g + +/** Every string-literal module specifier in `code`: static imports, re-exports (type-only ones included) and `import()` calls. */ +export function moduleSpecifiers(code: string): Specifier[] { + const found = new Map() + const locate = (statement: { code: string, start: number }, specifier: string) => { + const index = Math.max(statement.code.indexOf(`'${specifier}'`), statement.code.indexOf(`"${specifier}"`)) + if (index !== -1) { + const start = statement.start + index + found.set(start, { specifier, start, end: start + specifier.length + 2 }) + } + } + for (const statement of findStaticImports(code)) { + locate(statement, statement.specifier) + } + for (const statement of [...findExports(code), ...findTypeExports(code)]) { + if (statement.specifier) { + locate(statement, statement.specifier) + } + } + for (const match of code.matchAll(TYPE_STAR_EXPORT_RE)) { + locate({ code: match[0], start: match.index }, match[2]!) + } + for (const statement of findDynamicImports(code)) { + const literal = statement.expression.match(/^\s*(['"])([^'"]+)\1\s*$/) + if (literal) { + locate(statement, literal[2]!) + } + } + return [...found.values()].sort((a, b) => a.start - b.start) +} + +/** `code` with each specifier replaced by what `replace` returns for it, when that differs. */ +export function rewriteSpecifiers(code: string, replace: (specifier: string) => string | undefined) { + let result = '' + let cursor = 0 + for (const { specifier, start, end } of moduleSpecifiers(code)) { + const replacement = replace(specifier) + if (replacement === undefined || replacement === specifier) { + continue + } + result += code.slice(cursor, start) + code[start] + replacement + code[end - 1] + cursor = end + } + return result + code.slice(cursor) +} + +const TYPE_ONLY_RE = /^\s*(?:import|export)\s+type\b/ + +/** The relative specifiers of `code` that are not `import type` or `export type` statements. */ +export function valueSpecifiers(code: string) { + const values = new Set() + for (const statement of [...findStaticImports(code), ...findExports(code)]) { + if (statement.specifier && RELATIVE_RE.test(statement.specifier) && !TYPE_ONLY_RE.test(statement.code)) { + values.add(statement.specifier) + } + } + for (const statement of findDynamicImports(code)) { + const literal = statement.expression.match(/^\s*(['"])(\.\.?\/[^'"]*)\1\s*$/) + if (literal) { + values.add(literal[2]!) + } + } + return values +} diff --git a/src/rolldown/stylesheets.ts b/src/rolldown/stylesheets.ts new file mode 100644 index 00000000..6eae4873 --- /dev/null +++ b/src/rolldown/stylesheets.ts @@ -0,0 +1,71 @@ +import { promises as fsp } from 'node:fs' +import { pathToFileURL } from 'node:url' +import { resolvePath } from 'mlly' +import { join, relative } from 'pathe' + +export const SASS_RE = /\.s[ac]ss$/ + +interface SassCompiler { + compileString: (source: string, options: { loadPaths: string[], url: URL, syntax: 'scss' | 'indented' }) => { css: string } +} + +let lightningcss: Promise | undefined + +/** + * Flatten nesting, add the vendor prefixes the browserslist targets of `file` need, and + * minify. Other syntax is left alone, whatever the targets. Unknown at-rules pass through + * silently; other problems go to `warn`. + */ +export async function transformCss(file: string, cwd: string, warn: (message: string) => void) { + const { browserslistToTargets, Features, transform } = await (lightningcss ??= import('lightningcss')) + const { default: browserslist } = await import('browserslist') + + const allFeatures = Object.values(Features).reduce((all, feature) => all | feature, 0) + const result = transform({ + filename: file, + code: await fsp.readFile(file), + minify: true, + errorRecovery: true, + targets: browserslistToTargets(browserslist(undefined, { path: file })), + include: Features.Nesting, + exclude: allFeatures & ~(Features.Nesting | Features.VendorPrefixes), + }) + + for (const warning of result.warnings) { + if (warning.type === 'AtRuleInvalid' && warning.message.startsWith('Unknown at rule')) { + continue + } + warn(`${relative(cwd, file)}:${warning.loc.line}:${warning.loc.column}: ${warning.message}`) + } + + return result.code +} + +const sassCompilers = new Map>() + +/** Compile a Sass stylesheet with the `sass` or `sass-embedded` installed under `cwd`. */ +export async function compileSass(file: string, cwd: string) { + let compiler = sassCompilers.get(cwd) + if (!compiler) { + compiler = loadSass(cwd) + sassCompilers.set(cwd, compiler) + } + + const { compileString } = await compiler + return compileString(await fsp.readFile(file, 'utf8'), { + loadPaths: [join(cwd, 'node_modules')], + url: pathToFileURL(file), + syntax: file.endsWith('.sass') ? 'indented' : 'scss', + }).css +} + +async function loadSass(cwd: string): Promise { + for (const name of ['sass', 'sass-embedded']) { + const path = await resolvePath(name, { url: pathToFileURL(join(cwd, 'package.json')) }).catch(() => undefined) + if (path) { + const sass = await import(pathToFileURL(path).href) + return sass.compileString ? sass : sass.default + } + } + throw new Error('Compiling Sass stylesheets requires `sass` or `sass-embedded` to be installed.') +} diff --git a/src/rolldown/transpile-dir.ts b/src/rolldown/transpile-dir.ts new file mode 100644 index 00000000..938d3ff6 --- /dev/null +++ b/src/rolldown/transpile-dir.ts @@ -0,0 +1,612 @@ +import { readFile } from 'node:fs/promises' +import type { TsConfigResult } from 'get-tsconfig' +import { basename, dirname, join, normalize, relative, resolve } from 'pathe' +import { glob } from 'tinyglobby' +import type { Rolldown } from 'tsdown' + +import type { Transform as VueTransform } from 'vue-sfc-transformer/core' + +import { createDeclarationProgram, DeclarationError, declarationError, relativeSpecifier } from './declarations.ts' +import type { DeclarationProgram } from './declarations.ts' +import { DECLARATION_RE, moduleSpecifiers, probe, RELATIVE_RE, rewriteSpecifiers, SCRIPT_RE, valueSpecifiers } from './resolve.ts' +import { compileSass, SASS_RE, transformCss } from './stylesheets.ts' +import { createTsconfigResolver, writeDerivedTsconfig } from './tsconfig.ts' +import { declarationPath, emitDeclarations, transformVueRuntime } from './vue.ts' +import type { VueDeclarations, VueOptions } from './vue.ts' + +export interface TransformResult { + code: string + map?: object + errors: Array<{ message: string }> +} + +export interface TransformOptions { + lang?: string + sourcemap?: boolean + jsx?: 'preserve' | { runtime?: 'automatic' | 'classic', importSource?: string } + typescript?: { onlyRemoveTypeImports?: boolean } +} + +/** The shape of `transform` from `rolldown/utils`. */ +export type Transform = (filename: string, source: string, options?: TransformOptions) => Promise + +export type ImportKind = 'value' | 'type' + +export interface ExternalImport { + /** Absolute path of the file the specifier resolves to. */ + file: string + /** Whether the import remains in the emitted script, or only its types are used. */ + kind: ImportKind + /** Where the importer is emitted, relative to the output directory. */ + from: string + /** Where the plugin would emit the file, relative to the output directory. */ + output: string +} + +export interface MirrorExternal { + /** Emit the file alongside the directory: as a script and declaration, or as a declaration only. */ + mirror: ImportKind + /** Where to emit it, relative to the output directory. Defaults to the proposed `output`. */ + output?: string +} + +/** + * Decides what happens to a relative import that resolves outside `srcDir`: a replacement + * specifier, a mirrored copy of the file, or `undefined` to keep the specifier as written. + */ +export type ResolveExternal = (specifier: string, importer: string, context: ExternalImport) => string | MirrorExternal | undefined | Promise + +export interface TranspileDirOptions { + /** The directory whose files are transpiled one by one. */ + srcDir: string + /** Where the outputs go, relative to the build's output directory. Defaults to its root. */ + outBase?: string + /** The project root: where `srcDir` is resolved, the tsconfig search starts and `node_modules` is read. Defaults to the build's `cwd`. */ + cwd?: string + /** Globs of files to include, relative to `srcDir`. Defaults to every file. */ + include?: string[] + /** Globs of files to exclude. Defaults to test and story files. */ + exclude?: string[] + /** The extension of emitted scripts; declarations follow (`.d.ts` or `.d.mts`). Defaults to `js`. */ + extension?: 'js' | 'mjs' + /** The tsconfig to compile with, or `false` for none. Defaults to the nearest one above `cwd`. */ + tsconfig?: string | false + /** `paths` added to the tsconfig's when generating declarations. */ + paths?: Record + /** JSX compilation for `.tsx` and `.jsx` files. Defaults to the automatic runtime from `vue`. */ + jsx?: TransformOptions['jsx'] + /** The oxc `transform` to use. Defaults to the one of the `rolldown` installed. */ + transform?: Transform + /** Emit source maps next to scripts. */ + sourcemap?: boolean + /** Generate declarations. Defaults to `true`. */ + declaration?: boolean + /** Process `.css` with lightningcss and compile Sass. Defaults to `true`; `false` copies stylesheets as they are. */ + stylesheets?: boolean + /** Options for `.vue` files, or `false` to leave them out. */ + vue?: VueOptions | false + /** Relative imports that resolve outside `srcDir`. By default they are kept as written. */ + resolveExternal?: ResolveExternal +} + +export interface TranspileDirApi { + /** Every discovered or mirrored source, mapped to the path it is emitted at, relative to the output directory. */ + outputs: Promise> +} + +const EMPTY_ENTRY_ID = '\0transpile-dir:empty-entry' + +/** + * An entry for a build that has nothing to bundle, only directories to transpile. Pass it + * as tsdown's `entry` (or rolldown's `input`); `transpileDir` resolves it to an empty module + * and removes its chunk from the output. + */ +export const emptyEntry: Record = { 'transpile-dir': EMPTY_ENTRY_ID } + +/** `pluginCode` of the warning that lists type errors which do not affect the emitted declarations. */ +export const TYPE_ERRORS_WARNING = 'TYPE_ERRORS' + +type Warning = string | { pluginCode: string, message: string } + +interface Edge { + specifier: string + target: string + value: boolean +} + +type Resolution = { specifier: string } | { target: string, kind: ImportKind, output?: string } | undefined + +interface Emitted { + fileName: string + source: string | Uint8Array + map?: { source: string, map: object } +} + +const EMPTY_IMPORT_RE = /^[ \t]*import\s*\{\s*\}\s*from\s*(['"])[^'"\n]+\1\s*;?/gm +const DEFAULT_EXCLUDE = ['**/*.{stories,spec,test}.{js,jsx,ts,tsx,mjs,cjs,mts,cts}', '**/node_modules/**'] +const STYLESHEET_RE = /\.(?:css|s[ac]ss)$/ +const VUE_DECLARATION_RE = /\.(?:d\.vue\.ts|vue\.d\.ts)$/ +const TYPESCRIPT_RE = /\.(?:[cm]?ts|tsx)$/ + +interface Emitter { + /** Rewritten declarations keyed by source path. */ + emitted: Map + /** The program shared by single-file components and TypeScript sources, when the directory has components. */ + vue?: () => Promise + emit: (files: string[]) => Promise +} + +/** + * Transpiles the files of a directory one by one: each script keeps its own imports and + * exports, `.vue` files go through `vue-sfc-transformer`, stylesheets are processed, other + * files are copied, and declarations come from one TypeScript program over the directory. + */ +export function transpileDir(options: TranspileDirOptions): Rolldown.Plugin & { api: TranspileDirApi } { + let cwd = process.cwd() + let resolveOutputs: (outputs: Map) => void + let rejectOutputs: (error: unknown) => void + const outputs = new Promise>((resolve, reject) => { + resolveOutputs = resolve + rejectOutputs = reject + }) + outputs.catch(() => {}) + let work: Promise<{ build: DirectoryBuild, files: Emitted[] } | { error: unknown }> | undefined + + return { + name: 'transpile-dir', + api: { outputs }, + resolveId: { + filter: { id: /^\0transpile-dir:empty-entry$/ }, + handler: id => id, + }, + load: { + filter: { id: /^\0transpile-dir:empty-entry$/ }, + handler: () => ({ code: 'export {}', moduleSideEffects: false }), + }, + async buildStart(inputOptions) { + cwd = resolve(inputOptions.cwd, options.cwd ?? '') + const srcDir = resolve(cwd, options.srcDir) + const files = await glob(options.include ?? ['**/*'], { cwd: srcDir, ignore: options.exclude ?? DEFAULT_EXCLUDE, absolute: true, onlyFiles: true }) + for (const file of files) { + this.addWatchFile(file) + } + const build = new DirectoryBuild({ ...options, cwd, srcDir }, files.map(file => normalize(file)).sort()) + work = build.run() + .then((files) => { + resolveOutputs(build.outputs) + return { build, files } + }) + .catch((error) => { + rejectOutputs(error) + return { error } + }) + }, + async generateBundle(outputOptions, bundle) { + for (const [fileName, output] of Object.entries(bundle)) { + if (output.type === 'chunk' && output.facadeModuleId === EMPTY_ENTRY_ID) { + Reflect.deleteProperty(bundle, fileName) + } + } + const result = await work! + if ('error' in result) { + this.error(result.error instanceof Error ? result.error : new Error(String(result.error))) + } + for (const warning of result.build.warnings) { + this.warn(warning) + } + const outDir = resolve(cwd, outputOptions.dir ?? '') + for (const { fileName, source, map } of result.files) { + this.emitFile({ type: 'asset', fileName, source }) + if (map) { + const sources = [relative(dirname(join(outDir, fileName)), map.source)] + this.emitFile({ type: 'asset', fileName: `${fileName}.map`, source: JSON.stringify({ ...map.map, sources, file: basename(fileName) }) }) + } + } + }, + } +} + +class DirectoryBuild { + /** Source path to output path, relative to the output directory. */ + outputs = new Map() + warnings: Warning[] = [] + private typeErrors: string[] = [] + private scripts: string[] = [] + private vue: string[] = [] + private assets: string[] = [] + private outside = new Map() + private edges = new Map>() + private resolutions = new Map>() + private references = new Map>() + private transform: Promise | undefined + private extension: string + private dtsExtension: string + private outBase: string + private options: TranspileDirOptions & { cwd: string, srcDir: string } + + constructor(options: TranspileDirOptions & { cwd: string, srcDir: string }, files: string[]) { + this.options = options + this.extension = `.${options.extension ?? 'js'}` + this.dtsExtension = options.extension === 'mjs' ? '.d.mts' : '.d.ts' + this.outBase = options.outBase ?? '' + for (const file of files) { + const path = join(this.outBase, relative(options.srcDir, file)) + if (file.endsWith('.vue')) { + if (options.vue !== false) { + this.vue.push(file) + this.outputs.set(file, path) + } + } + else if (SCRIPT_RE.test(file) && !DECLARATION_RE.test(file)) { + this.scripts.push(file) + this.outputs.set(file, path.replace(SCRIPT_RE, this.extension)) + } + else if (options.stylesheets === false) { + this.assets.push(file) + this.outputs.set(file, path) + } + else if (!(SASS_RE.test(file) && basename(file).startsWith('_'))) { + this.assets.push(file) + this.outputs.set(file, path.replace(SASS_RE, '.css')) + } + } + } + + async run(): Promise { + await this.plan() + const valueFiles = [...this.outside].filter(([, kind]) => kind === 'value').map(([file]) => file) + const emitter = this.options.declaration === false ? undefined : await this.createEmitter() + const settled = await Promise.allSettled([ + Promise.all([...this.scripts, ...valueFiles].map(file => this.transpile(file))), + Promise.all(this.assets.map(file => this.asset(file))), + this.transformVue(emitter), + emitter?.emit([...this.scripts, ...valueFiles]), + ]) + const failures = settled.flatMap(result => result.status === 'rejected' ? [result.reason as unknown] : []) + if (failures.length) { + throw failures.every(failure => failure instanceof DeclarationError) + ? declarationError([...new Set(failures.flatMap(failure => failure.diagnostics))]) + : failures.find(failure => !(failure instanceof DeclarationError)) + } + const [scripts, assets, vue] = settled.map(result => (result as PromiseFulfilledResult).value) as [Emitted[], Emitted[], Emitted[]] + const declarations: Emitted[] = [] + if (emitter) { + const requested = new Set([...this.scripts, ...valueFiles]) + let referenced = this.referencedOutside([...this.scripts, ...valueFiles, ...this.vue], requested) + while (referenced.length) { + await emitter.emit(referenced) + referenced = this.referencedOutside(referenced, requested) + } + for (const [source, text] of emitter.emitted) { + declarations.push({ fileName: this.declarationOutput(source), source: text }) + } + } + if (this.typeErrors.length) { + this.warnings.push({ pluginCode: TYPE_ERRORS_WARNING, message: typeErrorsWarning([...new Set(this.typeErrors)], relative(this.options.cwd, this.options.srcDir)) }) + } + return [...scripts, ...assets, ...vue, ...declarations] + } + + private declarationOutput(source: string) { + return this.outputs.get(source)!.replace(SCRIPT_RE, this.dtsExtension) + } + + private async plan() { + const kinds = new Map([...this.scripts, ...this.vue].map(file => [file, 'value'])) + const queue = [...kinds.keys()] + const taken = new Set([...this.outputs.values()].map(stem)) + while (queue.length) { + const importer = queue.shift()! + const importerKind = kinds.get(importer)! + for (const edge of await this.edgesOf(importer)) { + if (this.outputs.has(edge.target) && !this.outside.has(edge.target)) { + continue + } + const kind: ImportKind = importerKind === 'value' && edge.value ? 'value' : 'type' + const from = this.outputs.get(importer)! + const proposed = this.proposedOutput(importer, edge.target, taken) + const result = await this.resolveExternal(edge, importer, { file: edge.target, kind, from, output: proposed }) + if (!result || !('target' in result)) { + continue + } + const existing = this.outside.get(edge.target) + if (existing === 'value' || existing === result.kind) { + continue + } + if (!existing) { + const output = result.output ?? proposed + this.outputs.set(edge.target, output) + taken.add(stem(output)) + } + this.outside.set(edge.target, result.kind) + kinds.set(edge.target, result.kind) + queue.push(edge.target) + } + } + } + + private resolveExternal(edge: Edge, importer: string, context: ExternalImport) { + const key = `${importer}\0${edge.specifier}\0${context.kind}` + let pending = this.resolutions.get(key) + if (!pending) { + pending = Promise.resolve(this.options.resolveExternal?.(edge.specifier, importer, context)).then((result): Resolution => { + if (typeof result === 'string') { + return { specifier: result } + } + if (result) { + return { target: edge.target, kind: result.mirror, output: result.output } + } + }) + this.resolutions.set(key, pending) + } + return pending + } + + /** + * Where a file outside the directory goes: where the importer's relative specifier + * already points, or under `_external/` (with `..` segments as `_`) when that leaves the + * output directory or takes another output's name. + */ + private proposedOutput(importer: string, target: string, taken: Set) { + const mirrored = stem(join(dirname(this.outputs.get(importer)!), relative(dirname(importer), target))) + if (!mirrored.startsWith('..') && !taken.has(mirrored)) { + return mirrored + this.extension + } + const segments = stem(relative(this.options.cwd, target)).split('/').map(segment => segment === '..' ? '_' : segment) + return join('_external', ...segments) + this.extension + } + + private edgesOf(importer: string) { + let edges = this.edges.get(importer) + if (!edges) { + edges = this.readEdges(importer) + this.edges.set(importer, edges) + } + return edges + } + + private async readEdges(importer: string): Promise { + const source = await readFile(importer, 'utf8') + const values = importer.endsWith('.vue') ? valueSpecifiers(source) : valueSpecifiers((await this.transpileSource(importer, source)).code) + const edges: Edge[] = [] + const seen = new Set() + for (const { specifier } of moduleSpecifiers(source)) { + if (!RELATIVE_RE.test(specifier) || seen.has(specifier)) { + continue + } + seen.add(specifier) + const target = probe(resolve(dirname(importer), specifier)) + if (target && SCRIPT_RE.test(target) && !DECLARATION_RE.test(target)) { + edges.push({ specifier, target: normalize(target), value: values.has(specifier) }) + } + } + return edges + } + + private loadTransform() { + if (this.options.transform) { + return this.options.transform + } + this.transform ??= import('rolldown/utils').then(utils => utils.transform as Transform, (cause) => { + throw new Error('`transpileDir` needs `rolldown` to transpile scripts. Install it, or pass its `transform` in the `transform` option.', { cause }) + }) + return this.transform + } + + private async transpileSource(file: string, source: string, sourcemap = false) { + const transform = await this.loadTransform() + const result = await transform(file, /\.[cm]?tsx?$/.test(file) ? source.replace(EMPTY_IMPORT_RE, match => ' '.repeat(match.length)) : source, { + lang: file.match(/\.[cm]?([jt]sx?)$/)![1], + sourcemap, + jsx: this.options.jsx ?? { runtime: 'automatic', importSource: 'vue' }, + typescript: { onlyRemoveTypeImports: false }, + }) + if (result.errors.length) { + throw new Error(`Failed to transpile ${relative(this.options.cwd, file)}:\n${result.errors.map(error => error.message).join('\n')}`) + } + return result + } + + private async transpile(file: string): Promise { + const fileName = this.outputs.get(file)! + const result = await this.transpileSource(file, await readFile(file, 'utf8'), this.options.sourcemap) + const code = await this.rewriteSpecifiers(file, fileName, result.code) + if (!this.options.sourcemap || !result.map) { + return { fileName, source: code } + } + return { fileName, source: `${code}\n//# sourceMappingURL=${basename(fileName)}.map\n`, map: { source: file, map: result.map } } + } + + /** + * `code` of `source`, emitted at `output`, with relative specifiers pointing at planned + * outputs. For declarations, the files referred to are recorded. + */ + private async rewriteSpecifiers(source: string, output: string, code: string, declaration = false) { + const replacements = new Map() + const referenced = new Set() + for (const { specifier } of moduleSpecifiers(code)) { + if (!RELATIVE_RE.test(specifier) || replacements.has(specifier)) { + continue + } + replacements.set(specifier, await this.replacement(source, specifier, output, referenced)) + } + if (declaration) { + this.references.set(source, referenced) + } + return rewriteSpecifiers(code, specifier => replacements.get(specifier)) + } + + private async replacement(source: string, specifier: string, output: string, referenced: Set) { + const target = probe(resolve(dirname(source), specifier)) + if (!target) { + return + } + const file = normalize(target) + referenced.add(file) + for (const kind of ['value', 'type'] as const) { + const resolution = await this.resolutions.get(`${source}\0${specifier}\0${kind}`) + if (resolution && 'specifier' in resolution) { + return resolution.specifier + } + } + const planned = this.outputs.get(file) + if (planned && !DECLARATION_RE.test(file) && (SCRIPT_RE.test(file) || file.endsWith('.vue'))) { + return relativeSpecifier(output, planned) + } + } + + private async asset(file: string): Promise { + const fileName = this.outputs.get(file)! + if (this.options.stylesheets !== false && STYLESHEET_RE.test(file)) { + const source = SASS_RE.test(file) + ? await compileSass(file, this.options.cwd) + : await transformCss(file, this.options.cwd, message => this.warnings.push(message)) + return { fileName, source } + } + return { fileName, source: await readFile(file) } + } + + private tsconfigs() { + return this.options.tsconfig === false ? undefined : createTsconfigResolver(this.options.cwd, this.options.tsconfig) + } + + private async transformVue(emitter: Emitter | undefined): Promise { + if (!this.vue.length) { + return [] + } + const runtime = await transformVueRuntime(this.vue, await this.loadTransform() as VueTransform) + const results: Promise[] = [...runtime].map(async ([file, source]) => { + const fileName = this.outputs.get(file)! + return { fileName, source: await this.rewriteSpecifiers(file, fileName, source) } + }) + if (!emitter) { + return Promise.all(results) + } + const { declarations, errors, warnings } = await emitter.vue!() + const selected = new Set(this.vue) + const errorMessages = errors.filter(({ file }) => file === undefined || selected.has(file)).map(({ message }) => message) + for (const file of this.vue) { + if (!declarations.has(declarationPath(file)) && !errors.some(error => error.file === file)) { + errorMessages.push(`${relative(this.options.cwd, file)}: no declaration was emitted`) + } + } + if (errorMessages.length) { + throw declarationError([...new Set(errorMessages)]) + } + this.typeErrors.push(...warnings.filter(({ file }) => file !== undefined && selected.has(file)).map(({ message }) => message)) + for (const [path, source] of declarations) { + const vueFile = path.replace(VUE_DECLARATION_RE, '.vue') + if (!selected.has(vueFile)) { + continue + } + const output = this.outputs.get(vueFile)!.replace(/\.vue$/, path.slice(vueFile.length - '.vue'.length)) + results.push(this.rewriteSpecifiers(vueFile, output, source, true).then(source => ({ fileName: output, source }))) + } + return Promise.all(results) + } + + /** + * Declarations for the directory's scripts. With single-file components present, + * TypeScript sources join their program so that types imported from a component + * resolve; other scripts get one program per tsconfig project. + */ + private async createEmitter(): Promise { + const resolver = await this.tsconfigs() + const programs = new Map>() + const programFor = (tsconfig: TsConfigResult | undefined) => { + let program = programs.get(tsconfig?.path) + if (!program) { + program = createDeclarationProgram({ cwd: this.options.cwd, tsconfig, paths: this.options.paths ?? {} }, [...this.scripts, ...this.outside.keys()]) + programs.set(tsconfig?.path, program) + } + return program + } + let vue: Promise | undefined + const vueProgram = this.vue.length + ? () => vue ??= (async () => { + const tsconfig = resolver?.root + return emitDeclarations([...this.vue, ...[...this.scripts, ...this.outside.keys()].filter(file => TYPESCRIPT_RE.test(file))], { + ...this.options.vue || {}, + cwd: this.options.cwd, + tsconfig: tsconfig && await writeDerivedTsconfig(this.options.cwd, tsconfig, this.options.paths ?? {}), + }) + })() + : undefined + const emitted = new Map() + + return { + emitted, + vue: vueProgram, + emit: async (files: string[]) => { + const errors: string[] = [] + const warnings: string[] = [] + const groups = new Map, string[]>() + const shared: string[] = [] + for (const file of files) { + if (vueProgram && TYPESCRIPT_RE.test(file)) { + shared.push(file) + continue + } + const program = programFor(resolver?.resolve(file)) + groups.set(program, [...groups.get(program) ?? [], file]) + } + if (shared.length) { + const result = await vueProgram!() + const selected = new Set(shared) + errors.push(...result.errors.filter(({ file }) => file !== undefined && selected.has(file)).map(({ message }) => message)) + warnings.push(...result.warnings.filter(({ file }) => file !== undefined && selected.has(file)).map(({ message }) => message)) + for (const file of shared) { + const text = result.declarations.get(declarationPath(file)) + if (text === undefined) { + if (!result.errors.some(error => error.file === file)) { + errors.push(`${relative(this.options.cwd, file)}: no declaration was emitted`) + } + continue + } + emitted.set(file, await this.rewriteSpecifiers(file, this.declarationOutput(file), text, true)) + } + } + for (const [pending, groupFiles] of groups) { + const result = await (await pending).emit(groupFiles) + errors.push(...result.errors) + warnings.push(...result.warnings) + for (const [source, text] of result.declarations) { + emitted.set(source, await this.rewriteSpecifiers(source, this.declarationOutput(source), text, true)) + } + } + if (errors.length) { + throw declarationError([...new Set(errors)]) + } + this.typeErrors.push(...warnings) + }, + } + } + + private referencedOutside(sources: string[], requested: Set) { + const referenced = new Set() + for (const source of sources) { + for (const target of this.references.get(source) ?? []) { + if (this.outside.has(target) && !requested.has(target)) { + referenced.add(target) + requested.add(target) + } + } + } + return [...referenced] + } +} + +function stem(path: string) { + return path.replace(SCRIPT_RE, '') +} + +const SHOWN_TYPE_ERRORS = 3 + +function typeErrorsWarning(diagnostics: string[], directory: string) { + const hidden = diagnostics.length - SHOWN_TYPE_ERRORS + return [ + `${diagnostics.length} type error${diagnostics.length === 1 ? ' was' : 's were'} reported while generating declarations for \`${directory}\`; the declarations were emitted. If the module's own type check (for example \`nuxt typecheck\` or \`vue-tsc --noEmit\`) passes, these come from build-time aliases typed as \`any\` during declaration generation and can be ignored.`, + ...diagnostics.slice(0, SHOWN_TYPE_ERRORS), + ...hidden > 0 ? [`... and ${hidden} more`] : [], + ].join('\n') +} diff --git a/src/rolldown/tsconfig.ts b/src/rolldown/tsconfig.ts new file mode 100644 index 00000000..e76b8dfd --- /dev/null +++ b/src/rolldown/tsconfig.ts @@ -0,0 +1,333 @@ +import { createHash } from 'node:crypto' +import { existsSync, mkdirSync, statSync, writeFileSync } from 'node:fs' +import { createRequire } from 'node:module' +import { mkdir, writeFile } from 'node:fs/promises' +import { createFilesMatcher, createPathsMatcher, getTsconfig, parseTsconfig } from 'get-tsconfig' +import type { TsConfigResult } from 'get-tsconfig' +import { dirname, isAbsolute, join, relative, resolve } from 'pathe' +import type ts from 'typescript' + +export interface TsconfigResolver { + /** The nearest tsconfig, which may delegate files to `references`. */ + root: TsConfigResult | undefined + /** The tsconfig a source file is compiled with. */ + resolve: (file: string) => TsConfigResult | undefined + /** The tsconfig found above `dir` when it took its generated types from another app's `.nuxt`, which `.nuxt/tsconfig.json` replaces in `root`. */ + replaced?: string +} + +/** + * Finds the nearest tsconfig above `dir`, or reads `file`. When it has `references`, each + * source file is compiled with the referenced project that includes it, falling back to + * the tsconfig itself. A tsconfig whose generated types come from a `.nuxt` other than + * `dir`'s own (a playground's, typically) is rebuilt on `dir/.nuxt/tsconfig.json`, see + * {@link rebaseOnOwnBuildDir}. + */ +export async function createTsconfigResolver(dir: string, file?: string): Promise { + let root = file ? { path: file, config: parseTsconfig(file) } : getTsconfig(dir) ?? undefined + let replaced: string | undefined + const own = join(dir, '.nuxt/tsconfig.json') + if (root && !file && usesForeignBuildDir(root, dir) && existsSync(own)) { + replaced = root.path + root = await rebaseOnOwnBuildDir(root.path, own, dir) + } + const projects = referencedProjects(root).map(project => ({ project, matches: createFilesMatcher(project) })) + + const scriptPath = (file: string) => file.endsWith('.vue') ? `${file}.ts` : file + + return { + root, + resolve: file => projects.find(({ matches }) => matches(scriptPath(file)))?.project ?? root, + ...replaced && { replaced }, + } +} + +function usesForeignBuildDir(tsconfig: TsConfigResult, dir: string) { + const targets = Object.values(tsconfigPaths(tsconfig)).flat() + const projects = referencedProjects(tsconfig).map(project => project.path) + return [...targets, ...projects].some(file => NUXT_BUILD_DIR_RE.test(file) && !isOwnBuildFile(file, dir)) +} + +function isOwnBuildFile(file: string, dir: string) { + return !relative(join(dir, '.nuxt'), file).startsWith('..') +} + +function isForeignBuildFile(file: string, dir: string) { + return NUXT_BUILD_DIR_RE.test(file) && !isOwnBuildFile(file, dir) +} + +const PATH_OPTIONS = ['baseUrl', 'rootDir', 'outDir', 'declarationDir', 'tsBuildInfoFile'] as const +const PATH_LIST_OPTIONS = ['rootDirs', 'typeRoots'] as const + +/** + * Writes a tsconfig that extends `own` with the `compilerOptions` of `tsconfig` and of the + * tsconfigs it extends, apart from those inside a `.nuxt` other than `dir`'s. `types` are the + * union of both, `paths` into another `.nuxt` are dropped and `own`'s win on conflicts, and + * `references` into another `.nuxt` are dropped. + */ +async function rebaseOnOwnBuildDir(tsconfig: string, own: string, dir: string): Promise { + const { default: ts } = await import('typescript') + const read = (file: string) => ts.readConfigFile(file, ts.sys.readFile).config as RawTsconfig | undefined + const layerOptions = (file: string): Record => { + const raw = read(file) + const base = (Array.isArray(raw?.extends) ? raw.extends : raw?.extends ? [raw.extends] : []) + .map(target => resolveExtends(target, dirname(file))) + .filter(target => target !== undefined && !isForeignBuildFile(target, dir)) + .map(target => layerOptions(target!)) + return Object.assign({}, ...base, absoluteOptions(raw?.compilerOptions ?? {}, dirname(file))) + } + const ownConfig = parseTsconfig(own) + const ownPaths = tsconfigPaths({ path: own, config: ownConfig }) + const { paths, types, ...options } = layerOptions(tsconfig) + const ownTypes = ownConfig.compilerOptions?.types + const config = { + extends: own, + compilerOptions: { + ...options, + paths: { ...Object.fromEntries(Object.entries((paths ?? {}) as Record).filter(([, targets]) => !targets.some(target => isForeignBuildFile(target, dir)))), ...ownPaths }, + ...(ownTypes || types) ? { types: [...new Set([...ownTypes ?? [], ...(types ?? []) as string[]])] } : {}, + }, + } + const references = (read(tsconfig)?.references ?? []) + .map(reference => ({ path: resolve(dirname(tsconfig), reference.path) })) + .filter(reference => !isForeignBuildFile(reference.path, dir)) + const contents = JSON.stringify({ ...config, ...references.length && { references } }) + const file = cachedPath(dir, '.json', contents) + mkdirSync(dirname(file), { recursive: true }) + writeFileSync(file, contents) + return { path: file, config: parseTsconfig(file) } +} + +interface RawTsconfig { + extends?: string | string[] + compilerOptions?: Record + references?: { path: string }[] +} + +function resolveExtends(target: string, from: string) { + if (target.startsWith('.') || isAbsolute(target)) { + const path = resolve(from, target) + return [path, `${path}.json`, join(path, 'tsconfig.json')].find(candidate => existsSync(candidate) && statSync(candidate).isFile()) + } + const require = createRequire(join(from, 'tsconfig.json')) + for (const candidate of [target, `${target}.json`, `${target}/tsconfig.json`]) { + try { + return require.resolve(candidate) + } + catch { + continue + } + } +} + +function absoluteOptions(options: Record, from: string) { + const dir = (value: string) => resolve(from, value.replace('${configDir}', from)) + const result = { ...options } + for (const key of PATH_OPTIONS) { + if (typeof result[key] === 'string') { + result[key] = dir(result[key]) + } + } + for (const key of PATH_LIST_OPTIONS) { + if (Array.isArray(result[key])) { + result[key] = result[key].map(value => dir(value as string)) + } + } + if (result.paths && typeof result.paths === 'object') { + const base = typeof options.baseUrl === 'string' ? dir(options.baseUrl) : from + result.paths = Object.fromEntries(Object.entries(result.paths as Record).map(([alias, targets]) => [alias, targets.map(target => resolve(base, target.replace('${configDir}', from)))])) + } + return result +} + +const FOREIGN_DIR_RE = /^(?:playgrounds?(?:-.*)?|docs|tests?|fixtures|examples?|node_modules)$/ + +/** + * The files of a parsed tsconfig that belong to the module in `dir`: inside `dir`, outside + * its playground, docs, test, fixture and example directories, and not generated for + * another app. + */ +export function projectFiles(parsed: ts.ParsedCommandLine | undefined, dir: string) { + return (parsed?.fileNames ?? []).filter((file) => { + const path = relative(dir, file) + if (path.startsWith('..') || isAbsolute(path) || FOREIGN_DIR_RE.test(path.split('/')[0]!) || NODE_MODULES_RE.test(file)) { + return false + } + return !NUXT_BUILD_DIR_RE.test(file) || isOwnBuildFile(file, dir) + }) +} + +function referencedProjects(tsconfig: TsConfigResult | undefined): TsConfigResult[] { + return (tsconfig?.config.references ?? []).flatMap((reference) => { + const path = resolve(dirname(tsconfig!.path), reference.path) + const config = path.endsWith('.json') ? path : join(path, 'tsconfig.json') + return existsSync(config) ? [{ path: config, config: parseTsconfig(config) }] : [] + }) +} + +/** The tsconfig's `paths` made absolute. */ +export function tsconfigPaths(tsconfig: TsConfigResult | undefined): Record { + const paths = tsconfig?.config.compilerOptions?.paths + const matchPath = tsconfig && createPathsMatcher(tsconfig) + if (!paths || !matchPath) { + return {} + } + return Object.fromEntries(Object.keys(paths).map(alias => [alias, matchPath(alias)])) +} + +const BUILD_ALIAS_RE = /^#(?:build|internal)(?:\/|$)/ +const SERVER_ROUTES_ALIAS = '#build/server-routes' +const NUXT_BUILD_DIR_RE = /[\\/]\.nuxt(?:[\\/]|$)/ +const NODE_MODULES_RE = /[\\/]node_modules[\\/]/ +const PACKAGE_NAME_RE = /^(?:@[\w.-]+\/)?[\w.-]+/ + +export interface DeclarationPaths { + paths: Record + /** Aliases left to an ambient `declare module`, so their imports are typed `any`. */ + ambient: string[] +} + +/** + * The `paths` declarations are generated with. Aliases of files generated for the + * local app (`#build/*`, `#internal/*` and anything else inside `.nuxt/`, apart from + * `#imports`) are not followed, so published types do not depend on it. `#build/server-routes`, + * which Nuxt's own fetch types import, maps to the module's own route table (which types + * the routes the module registers) or, without one, to {@link SERVER_ROUTES_STUB}. Entries + * mapping an installed package into `node_modules` are dropped, so tsc names it by its package. + */ +export function declarationPaths(paths: Record, cwd: string): DeclarationPaths { + const result: DeclarationPaths = { paths: { [SERVER_ROUTES_ALIAS]: [serverRoutesTable(paths, cwd) ?? cachedPath(cwd, '.d.ts', SERVER_ROUTES_STUB)] }, ambient: [] } + for (const [alias, targets] of Object.entries(paths)) { + if (alias === SERVER_ROUTES_ALIAS) { + continue + } + if (BUILD_ALIAS_RE.test(alias) || (alias.startsWith('#') && alias !== '#imports' && targets.some(target => NUXT_BUILD_DIR_RE.test(target)))) { + result.ambient.push(alias) + continue + } + const name = /^[#~@]\//.test(alias) || alias.startsWith('#') ? undefined : alias.match(PACKAGE_NAME_RE)?.[0] + if (name && targets.every(target => NODE_MODULES_RE.test(target)) && findPackageDir(name, cwd)) { + continue + } + result.paths[alias] = targets + } + return result +} + +function serverRoutesTable(paths: Record, cwd: string) { + const targets = [...paths[SERVER_ROUTES_ALIAS] ?? [], ...(paths['#build/*'] ?? []).map(target => target.replace('*', 'server-routes'))] + for (const target of targets) { + const file = target.endsWith('.d.ts') ? target : `${target}.d.ts` + if (isOwnBuildFile(file, cwd) && existsSync(file)) { + return file + } + } +} + +/** The directory of an installed package, found the way Node looks up `node_modules`. */ +export function findPackageDir(name: string, cwd: string) { + for (let dir = cwd; ; dir = dirname(dir)) { + const packageDir = join(dir, 'node_modules', name) + if (existsSync(join(packageDir, 'package.json'))) { + return packageDir + } + if (dirname(dir) === dir) { + return + } + } +} + +const cacheDir = (cwd: string) => join(cwd, 'node_modules/.cache/transpile-dir') + +function cachedPath(cwd: string, extension: string, contents: string) { + return join(cacheDir(cwd), `${createHash('sha256').update(contents).digest('hex').slice(0, 12)}${extension}`) +} + +async function writeCached(cwd: string, extension: string, contents: string) { + const file = cachedPath(cwd, extension, contents) + await mkdir(dirname(file), { recursive: true }) + await writeFile(file, contents) + return file +} + +/** An ambient declaration file declaring each alias as a module. */ +export function writeAmbientModules(cwd: string, ambient: string[]) { + return writeCached(cwd, '.d.ts', ambient.map(alias => `declare module '${alias}'\n`).join('')) +} + +/** + * The module `#build/server-routes` resolves to while declarations are generated when the + * module's `.nuxt` has no route table: the one Nuxt generates for an app without server + * routes, so a `useFetch` or `$fetch` response is typed `unknown`. + */ +export const SERVER_ROUTES_STUB = `import type { AnyHTTPMethod, TypedFetchErrorBody, TypedFetchMethods, TypedFetchRequestBody, TypedFetchRequestHeaders, TypedFetchRequestQuery, TypedFetchRequires, TypedFetchResponseBody, TypedFetchResponseHeaders, ValidFetchInput } from 'nuxt/app' + +export interface GeneratedServerRoutes {} + +export type Path = never + +export type ValidInput = ValidFetchInput + +export type Response = TypedFetchResponseBody + +export type Methods = TypedFetchMethods + +export type ResponseHeaders = TypedFetchResponseHeaders + +export type ErrorBody = TypedFetchErrorBody + +export type RequestBody = TypedFetchRequestBody + +export type RequestQuery> = TypedFetchRequestQuery + +export type RequestHeaders = TypedFetchRequestHeaders + +export type Requires = TypedFetchRequires + +export type StrictFetchPaths = false + +export type RouteTypesEngine = 'generated' +` + +/** Writes {@link SERVER_ROUTES_STUB} where {@link declarationPaths} maps `#build/server-routes`. */ +export function writeServerRoutesStub(cwd: string) { + return writeCached(cwd, '.d.ts', SERVER_ROUTES_STUB) +} + +/** + * Writes a tsconfig extending `tsconfig`, for tools that take a tsconfig file. Its `paths` + * are the tsconfig's plus `paths`, less what {@link declarationPaths} drops; the aliases + * that are not followed get an ambient `declare module` through `types`. Declarations are + * inferred, so `isolatedDeclarations` is off. The files are listed rather than inherited, + * less those of a playground (see {@link projectFiles}). Each project in `references` is + * derived the same way. + */ +export async function writeDerivedTsconfig(cwd: string, tsconfig: TsConfigResult | undefined, paths: Record): Promise { + const declaration = declarationPaths({ ...tsconfigPaths(tsconfig), ...paths }, cwd) + await writeServerRoutesStub(cwd) + const compilerOptions: Record = { paths: declaration.paths, isolatedDeclarations: false } + if (declaration.ambient.length) { + compilerOptions.types = [ + ...tsconfig?.config.compilerOptions?.types ?? await automaticTypes(tsconfig, cwd), + await writeAmbientModules(cwd, declaration.ambient), + ] + } + const references = await Promise.all(referencedProjects(tsconfig).map(async project => ({ path: await writeDerivedTsconfig(cwd, project, paths) }))) + const { default: ts } = await import('typescript') + const parsed = tsconfig && ts.getParsedCommandLineOfConfigFile(tsconfig.path, {}, { ...ts.sys, onUnRecoverableConfigFileDiagnostic: () => {} }) + return writeCached(cwd, '.json', JSON.stringify({ + ...tsconfig && { extends: tsconfig.path }, + ...tsconfig && { files: projectFiles(parsed, cwd).map(file => relative(cacheDir(cwd), file)), include: [] }, + compilerOptions, + ...references.length && { references }, + })) +} + +async function automaticTypes(tsconfig: TsConfigResult | undefined, cwd: string) { + const { default: ts } = await import('typescript') + const base = tsconfig ? dirname(tsconfig.path) : cwd + return ts.getAutomaticTypeDirectiveNames({ + configFilePath: tsconfig?.path ?? join(cwd, 'tsconfig.json'), + typeRoots: tsconfig?.config.compilerOptions?.typeRoots?.map(root => resolve(base, root)), + }, ts.sys) +} diff --git a/src/rolldown/vue.ts b/src/rolldown/vue.ts new file mode 100644 index 00000000..70d59bff --- /dev/null +++ b/src/rolldown/vue.ts @@ -0,0 +1,78 @@ +import { readFile } from 'node:fs/promises' +import { relative } from 'pathe' +import type { DeclarationDiagnostic, DtsCache, Transform } from 'vue-sfc-transformer/core' + +export interface VueOptions { + /** Extra key for the declaration cache, for inputs the cache cannot see, such as generated type augmentations. */ + cacheVersion?: string + /** The declaration cache, or `false` to disable it. Defaults to `node_modules/.cache/vue-sfc-dts`. */ + cache?: DtsCache | false + /** Also emit each declaration as `.vue.d.ts`, the file name older toolchains resolve. Defaults to `true`. */ + emitLegacyDeclarationAlias?: boolean +} + +export interface VueDeclarationOptions extends VueOptions { + cwd: string + /** The tsconfig to emit declarations from. */ + tsconfig?: string +} + +interface DeclarationMessage { + /** The source file the diagnostic is reported in, if any. */ + file?: string + /** The diagnostic, formatted like tsc's. */ + message: string +} + +export interface VueDeclarations { + /** Declarations keyed by the path next to their source: `Foo.d.vue.ts` and, by default, `Foo.vue.d.ts`; `foo.d.ts` for a script. */ + declarations: Map + /** Diagnostics that prevent correct declarations. */ + errors: DeclarationMessage[] + /** Other type errors in the sources, which do not affect their declarations. */ + warnings: DeclarationMessage[] +} + +/** Transforms `.vue` files into their runtime form with TypeScript stripped, keyed by source path. */ +export async function transformVueRuntime(files: string[], transform?: Transform): Promise> { + const { transformVueSfc } = await import('vue-sfc-transformer/core') + return new Map(await Promise.all(files.map(async (id) => { + const { code } = await transformVueSfc(await readFile(id, 'utf8'), id, { transform }) + return [id, code] as const + }))) +} + +/** + * Emits declarations for `.vue` files and TypeScript sources from one program over + * `tsconfig`, so scripts can import types from single-file components. + */ +export async function emitDeclarations(files: string[], options: VueDeclarationOptions): Promise { + const { emitVueDeclarations, isDeclarationEmitDiagnostic } = await import('vue-sfc-transformer/core') + const sources = await Promise.all(files.map(async id => ({ id, source: await readFile(id, 'utf8') }))) + const { files: declarations, diagnostics } = await emitVueDeclarations(sources, { + cwd: options.cwd, + tsconfig: options.tsconfig, + cache: options.cache, + cacheVersion: options.cacheVersion, + emitLegacyDeclarationAlias: options.emitLegacyDeclarationAlias ?? true, + }) + const errors = diagnostics.filter(diagnostic => diagnostic.category === 'error') + const format = (diagnostic: DeclarationDiagnostic): DeclarationMessage => ({ file: diagnostic.file, message: formatDiagnostic(diagnostic, options.cwd) }) + return { + declarations, + errors: errors.filter(diagnostic => isDeclarationEmitDiagnostic(diagnostic)).map(format), + warnings: errors.filter(diagnostic => !isDeclarationEmitDiagnostic(diagnostic)).map(format), + } +} + +/** The declaration emitted next to a source file. */ +export function declarationPath(id: string) { + return id.replace(/\.(vue|[cm]?ts|tsx)$/, (_, extension: string) => extension === 'vue' ? '.d.vue.ts' : extension === 'tsx' ? '.d.ts' : `.d.${extension}`) +} + +function formatDiagnostic(diagnostic: DeclarationDiagnostic, cwd: string) { + const location = diagnostic.file + ? `${relative(cwd, diagnostic.file)}${diagnostic.line === undefined ? '' : `(${diagnostic.line},${diagnostic.column})`}: ` + : '' + return `${location}error TS${diagnostic.code}: ${diagnostic.message}` +} diff --git a/test/__snapshots__/JsxComponent.js b/test/__snapshots__/JsxComponent.js index ea56e413..7060acbb 100644 --- a/test/__snapshots__/JsxComponent.js +++ b/test/__snapshots__/JsxComponent.js @@ -1,4 +1,4 @@ -import { jsx } from "vue/jsx-runtime"; +import { jsx as _jsx } from "vue/jsx-runtime"; export default function MyJSXComponent() { - return /* @__PURE__ */ jsx("div", { children: "My JSX Component" }); + return /* @__PURE__ */ _jsx("div", { children: "My JSX Component" }); } diff --git a/test/__snapshots__/TestMe.vue b/test/__snapshots__/TestMe.vue index 974b9562..cb9da314 100644 --- a/test/__snapshots__/TestMe.vue +++ b/test/__snapshots__/TestMe.vue @@ -1,13 +1,9 @@