diff --git a/README.md b/README.md index 30defce..d285cda 100644 --- a/README.md +++ b/README.md @@ -174,10 +174,7 @@ import { useSafeRuntimeConfig } from '#imports' | `$schema` | `StandardSchemaV1` | — | Your validation schema (required) | | `validateAtBuild` | `boolean` | `true` | Validate during dev/build | | `validateAtRuntime` | `boolean` | `false` | Validate when server starts | -| `onBuildError` | `'throw' \| 'warn' \| 'ignore'` | `'throw'` | How to handle build validation errors | -| `onRuntimeError` | `'throw' \| 'warn' \| 'ignore'` | `'throw'` | How to handle runtime validation errors | -| `logSuccess` | `boolean` | `true` | Log successful validation | -| `logFallback` | `boolean` | `true` | Log when using JSON Schema fallback | +| `onError` | `'throw' \| 'warn' \| 'ignore'` | `'throw'` | How to handle validation errors | | `jsonSchemaTarget` | `string` | `'draft-2020-12'` | JSON Schema version for runtime validation | | `shelve` | `boolean \| ShelveOptions` | `undefined` | Shelve secrets integration (see below) | @@ -278,6 +275,7 @@ export default defineNuxtConfig({ safeRuntimeConfig: { $schema: runtimeConfigSchema, validateAtRuntime: true, + onError: 'throw', }, }) ``` diff --git a/docs/content/1.guide/2.configuration.md b/docs/content/1.guide/2.configuration.md index 05fa4c1..80e4d5f 100644 --- a/docs/content/1.guide/2.configuration.md +++ b/docs/content/1.guide/2.configuration.md @@ -12,10 +12,7 @@ All options for `safeRuntimeConfig` in your `nuxt.config.ts`. | `$schema` | `StandardSchemaV1` | - | Your validation schema (required) | | `validateAtBuild` | `boolean` | `true` | Validate during dev/build | | `validateAtRuntime` | `boolean` | `false` | Validate when server starts | -| `onBuildError` | `'throw' \| 'warn' \| 'ignore'` | `'throw'` | Build validation error behavior | -| `onRuntimeError` | `'throw' \| 'warn' \| 'ignore'` | `'throw'` | Runtime validation error behavior | -| `logSuccess` | `boolean` | `true` | Log successful validation | -| `logFallback` | `boolean` | `true` | Log JSON Schema fallback warnings | +| `onError` | `'throw' \| 'warn' \| 'ignore'` | `'throw'` | Validation error behavior | | `jsonSchemaTarget` | `string` | `'draft-2020-12'` | JSON Schema version for runtime | ## Example Configuration @@ -30,12 +27,7 @@ export default defineNuxtConfig({ validateAtRuntime: false, // opt-in // Error handling - onBuildError: 'throw', // stop build on error - onRuntimeError: 'warn', // log warning, don't crash - - // Logging - logSuccess: true, - logFallback: true, + onError: 'throw', // 'throw' | 'warn' | 'ignore' // JSON Schema jsonSchemaTarget: 'draft-2020-12', diff --git a/docs/content/1.guide/4.validation.md b/docs/content/1.guide/4.validation.md index a760c2b..13a3167 100644 --- a/docs/content/1.guide/4.validation.md +++ b/docs/content/1.guide/4.validation.md @@ -43,6 +43,7 @@ export default defineNuxtConfig({ safeRuntimeConfig: { $schema: runtimeConfigSchema, validateAtRuntime: true, + onError: 'throw', }, }) ``` @@ -61,14 +62,13 @@ What it catches: ## Error Handling -Control how validation errors are handled: +Use `onError` to control how both build-time and runtime validation errors are handled: ```ts [nuxt.config.ts] export default defineNuxtConfig({ safeRuntimeConfig: { $schema: runtimeConfigSchema, - onBuildError: 'throw', // 'throw' | 'warn' | 'ignore' - onRuntimeError: 'throw', // 'throw' | 'warn' | 'ignore' + onError: 'throw', // 'throw' | 'warn' | 'ignore' }, }) ``` @@ -98,6 +98,7 @@ export default defineNuxtConfig({ $schema: runtimeConfigSchema, validateAtBuild: true, // catch dev errors validateAtRuntime: true, // catch prod errors + onError: 'throw', }, }) ``` diff --git a/package.json b/package.json index 11ba93d..7279720 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "test": "vitest run", "test:watch": "vitest watch", "test:types": "vue-tsc --noEmit && cd playground && vue-tsc --noEmit", + "test:packed-release": "node scripts/smoke-packed-release.mjs", "test:nuxt5-nightly": "node scripts/smoke-nuxt5-nightly.mjs" }, "peerDependencies": { @@ -64,6 +65,7 @@ "@cfworker/json-schema": "catalog:", "@standard-community/standard-json": "catalog:", "@standard-schema/spec": "catalog:", + "@typescript-eslint/utils": "catalog:", "@valibot/to-json-schema": "catalog:", "consola": "catalog:", "defu": "catalog:", @@ -84,7 +86,7 @@ "@types/node": "catalog:", "@typescript-eslint/parser": "catalog:", "@typescript-eslint/rule-tester": "catalog:", - "@typescript-eslint/utils": "catalog:", + "arktype": "catalog:", "bumpp": "catalog:", "changelogen": "catalog:", "eslint": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a5ac25c..3425410 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -54,6 +54,9 @@ catalogs: '@valibot/to-json-schema': specifier: 1.3.0 version: 1.3.0 + arktype: + specifier: ^2.2.0 + version: 2.2.0 better-sqlite3: specifier: ^12.5.0 version: 12.8.0 @@ -130,10 +133,13 @@ importers: version: 4.4.2(magicast@0.3.5) '@standard-community/standard-json': specifier: 'catalog:' - version: 0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(@valibot/to-json-schema@1.3.0(valibot@1.1.0(typescript@5.8.3)))(quansync@0.2.11)(valibot@1.1.0(typescript@5.8.3))(zod-to-json-schema@3.25.1(zod@4.2.1))(zod@4.2.1) + version: 0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(@valibot/to-json-schema@1.3.0(valibot@1.1.0(typescript@5.8.3)))(arktype@2.2.0)(quansync@0.2.11)(valibot@1.1.0(typescript@5.8.3))(zod-to-json-schema@3.25.1(zod@4.2.1))(zod@4.2.1) '@standard-schema/spec': specifier: 'catalog:' version: 1.1.0 + '@typescript-eslint/utils': + specifier: 'catalog:' + version: 8.50.0(eslint@9.28.0(jiti@2.6.1))(typescript@5.8.3) '@valibot/to-json-schema': specifier: 'catalog:' version: 1.3.0(valibot@1.1.0(typescript@5.8.3)) @@ -189,9 +195,9 @@ importers: '@typescript-eslint/rule-tester': specifier: 'catalog:' version: 8.50.0(eslint@9.28.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/utils': + arktype: specifier: 'catalog:' - version: 8.50.0(eslint@9.28.0(jiti@2.6.1))(typescript@5.8.3) + version: 2.2.0 bumpp: specifier: 'catalog:' version: 10.1.1(magicast@0.3.5) @@ -239,10 +245,10 @@ importers: version: 12.8.0 docus: specifier: catalog:default - version: 5.8.1(t4cg44m4akyr66x4oqv7hg6kre) + version: 5.8.1(lm5hnwzjdjozjmwueejgquhx54) nuxt: specifier: catalog:default - version: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2) + version: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.3.5)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2) zod: specifier: ^3.25.76 version: 3.25.76 @@ -262,6 +268,16 @@ importers: specifier: 'catalog:' version: 1.1.0(typescript@5.9.3) + test/fixtures/arktype: + dependencies: + arktype: + specifier: 'catalog:' + version: 2.2.0 + devDependencies: + nuxt: + specifier: 'catalog:' + version: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2) + test/fixtures/cloudflare-auto-import: dependencies: valibot: @@ -438,6 +454,12 @@ packages: resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} engines: {node: '>= 16'} + '@ark/schema@0.56.0': + resolution: {integrity: sha512-ECg3hox/6Z/nLajxXqNhgPtNdHWC9zNsDyskwO28WinoFEnWow4IsERNz9AnXRhTZJnYIlAJ4uGn3nlLk65vZA==} + + '@ark/util@0.56.0': + resolution: {integrity: sha512-BghfRC8b9pNs3vBoDJhcta0/c1J1rsoS1+HgVUreMFPdhz/CRAKReAu57YEllNaSy98rWAdY1gE+gFup7OXpgA==} + '@babel/code-frame@7.28.6': resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} engines: {node: '>=6.9.0'} @@ -4160,6 +4182,12 @@ packages: resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} engines: {node: '>=10'} + arkregex@0.0.5: + resolution: {integrity: sha512-ncYjBdLlh5/QnVsAA8De16Tc9EqmYM7y/WU9j+236KcyYNUXogpz3sC4ATIZYzzLxwI+0sEOaQLEmLmRleaEXw==} + + arktype@2.2.0: + resolution: {integrity: sha512-t54MZ7ti5BhOEvzEkgKnWvqj+UbDfWig+DHr5I34xatymPusKLS0lQpNJd8M6DzmIto2QGszHfNKoFIT8tMCZQ==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -9029,6 +9057,12 @@ snapshots: '@types/json-schema': 7.0.15 js-yaml: 4.1.0 + '@ark/schema@0.56.0': + dependencies: + '@ark/util': 0.56.0 + + '@ark/util@0.56.0': {} + '@babel/code-frame@7.28.6': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -9292,6 +9326,17 @@ snapshots: transitivePeerDependencies: - magicast + '@dxup/nuxt@0.4.0(magicast@0.3.5)(typescript@5.9.3)': + dependencies: + '@dxup/unimport': 0.1.2 + '@nuxt/kit': 4.4.2(magicast@0.3.5) + chokidar: 5.0.0 + pathe: 2.0.3 + tinyglobby: 0.2.15 + typescript: 5.9.3 + transitivePeerDependencies: + - magicast + '@dxup/nuxt@0.4.0(magicast@0.5.2)(typescript@5.9.3)': dependencies: '@dxup/unimport': 0.1.2 @@ -10155,15 +10200,15 @@ snapshots: - magicast - supports-color - '@nuxt/content@3.12.0(@valibot/to-json-schema@1.3.0(valibot@1.1.0(typescript@5.8.3)))(better-sqlite3@12.8.0)(magicast@0.5.2)(valibot@1.1.0(typescript@5.8.3))': + '@nuxt/content@3.12.0(@valibot/to-json-schema@1.3.0(valibot@1.1.0(typescript@5.8.3)))(better-sqlite3@12.8.0)(magicast@0.3.5)(valibot@1.1.0(typescript@5.8.3))': dependencies: - '@nuxt/kit': 4.4.2(magicast@0.5.2) - '@nuxtjs/mdc': 0.20.2(magicast@0.5.2) + '@nuxt/kit': 4.4.2(magicast@0.3.5) + '@nuxtjs/mdc': 0.20.2(magicast@0.3.5) '@shikijs/langs': 3.23.0 '@sqlite.org/sqlite-wasm': 3.50.4-build1 '@standard-schema/spec': 1.1.0 '@webcontainer/env': 1.1.1 - c12: 3.3.3(magicast@0.5.2) + c12: 3.3.3(magicast@0.3.5) chokidar: 5.0.0 consola: 3.4.2 db0: 0.3.4(better-sqlite3@12.8.0) @@ -10184,7 +10229,7 @@ snapshots: micromatch: 4.0.8 minimark: 0.2.0 minimatch: 10.2.4 - nuxt-component-meta: 0.17.2(magicast@0.5.2) + nuxt-component-meta: 0.17.2(magicast@0.3.5) nypm: 0.6.5 ohash: 2.0.11 pathe: 2.0.3 @@ -10227,9 +10272,17 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/devtools-kit@3.1.1(magicast@0.5.2)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))': + '@nuxt/devtools-kit@3.1.1(magicast@0.3.5)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))': dependencies: - '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/kit': 4.4.2(magicast@0.3.5) + execa: 8.0.1 + vite: 7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2) + transitivePeerDependencies: + - magicast + + '@nuxt/devtools-kit@3.2.3(magicast@0.3.5)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))': + dependencies: + '@nuxt/kit': 4.4.2(magicast@0.3.5) execa: 8.0.1 vite: 7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2) transitivePeerDependencies: @@ -10386,7 +10439,7 @@ snapshots: structured-clone-es: 1.0.0 tinyglobby: 0.2.15 vite: 7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2) - vite-plugin-inspect: 11.3.3(@nuxt/kit@4.4.2(magicast@0.5.2))(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)) + vite-plugin-inspect: 11.3.3(@nuxt/kit@4.4.2(magicast@0.3.5))(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)) vite-plugin-vue-tracer: 1.3.0(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) which: 5.0.0 ws: 8.19.0 @@ -10465,10 +10518,10 @@ snapshots: - utf-8-validate - vite - '@nuxt/fonts@0.14.0(@netlify/blobs@9.1.2)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2)(magicast@0.5.2)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))': + '@nuxt/fonts@0.14.0(@netlify/blobs@9.1.2)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2)(magicast@0.3.5)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))': dependencies: - '@nuxt/devtools-kit': 3.2.3(magicast@0.5.2)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)) - '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/devtools-kit': 3.2.3(magicast@0.3.5)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)) + '@nuxt/kit': 4.4.2(magicast@0.3.5) consola: 3.4.2 defu: 6.1.4 fontless: 0.2.1(@netlify/blobs@9.1.2)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)) @@ -10505,14 +10558,14 @@ snapshots: - uploadthing - vite - '@nuxt/icon@2.2.1(magicast@0.5.2)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))': + '@nuxt/icon@2.2.1(magicast@0.3.5)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))': dependencies: '@iconify/collections': 1.0.642 '@iconify/types': 2.0.0 '@iconify/utils': 3.1.0 '@iconify/vue': 5.0.0(vue@3.5.30(typescript@5.9.3)) - '@nuxt/devtools-kit': 3.1.1(magicast@0.5.2)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)) - '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/devtools-kit': 3.1.1(magicast@0.3.5)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)) + '@nuxt/kit': 4.4.2(magicast@0.3.5) consola: 3.4.2 local-pkg: 1.1.2 mlly: 1.8.1 @@ -10526,9 +10579,9 @@ snapshots: - vite - vue - '@nuxt/image@2.0.0(@netlify/blobs@9.1.2)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2)(magicast@0.5.2)': + '@nuxt/image@2.0.0(@netlify/blobs@9.1.2)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2)(magicast@0.3.5)': dependencies: - '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/kit': 4.4.2(magicast@0.3.5) consola: 3.4.2 defu: 6.1.4 h3: 1.15.5 @@ -10589,33 +10642,6 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/kit@3.17.5(magicast@0.5.2)': - dependencies: - c12: 3.0.4(magicast@0.5.2) - consola: 3.4.2 - defu: 6.1.4 - destr: 2.0.5 - errx: 0.1.0 - exsolve: 1.0.5 - ignore: 7.0.5 - jiti: 2.4.2 - klona: 2.0.6 - knitwork: 1.2.0 - mlly: 1.7.4 - ohash: 2.0.11 - pathe: 2.0.3 - pkg-types: 2.1.0 - scule: 1.3.0 - semver: 7.7.2 - std-env: 3.10.0 - tinyglobby: 0.2.14 - ufo: 1.6.1 - unctx: 2.4.1 - unimport: 5.0.1 - untyped: 2.0.0 - transitivePeerDependencies: - - magicast - '@nuxt/kit@4.4.2(magicast@0.3.5)': dependencies: c12: 3.3.3(magicast@0.3.5) @@ -10689,12 +10715,12 @@ snapshots: - vue - vue-tsc - '@nuxt/nitro-server@4.4.2(@babel/core@7.29.0)(@netlify/blobs@9.1.2)(better-sqlite3@12.8.0)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2)(magicast@0.3.5)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.3.5)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.41.1))(rollup@4.41.1)(terser@5.40.0)(typescript@5.8.3)(vite@6.3.5(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.8.3))(yaml@2.8.2))(typescript@5.8.3)': + '@nuxt/nitro-server@4.4.2(@babel/core@7.29.0)(@netlify/blobs@9.1.2)(better-sqlite3@12.8.0)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2)(magicast@0.3.5)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.3.5)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2))(typescript@5.9.3)': dependencies: '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) '@nuxt/devalue': 2.0.2 '@nuxt/kit': 4.4.2(magicast@0.3.5) - '@unhead/vue': 2.1.12(vue@3.5.30(typescript@5.8.3)) + '@unhead/vue': 2.1.12(vue@3.5.30(typescript@5.9.3)) '@vue/shared': 3.5.30 consola: 3.4.2 defu: 6.1.4 @@ -10708,7 +10734,7 @@ snapshots: klona: 2.0.6 mocked-exports: 0.1.1 nitropack: 2.13.1(@netlify/blobs@9.1.2)(better-sqlite3@12.8.0) - nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.3.5)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.41.1))(rollup@4.41.1)(terser@5.40.0)(typescript@5.8.3)(vite@6.3.5(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.8.3))(yaml@2.8.2) + nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.3.5)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2) nypm: 0.6.5 ohash: 2.0.11 pathe: 2.0.3 @@ -10718,7 +10744,7 @@ snapshots: ufo: 1.6.3 unctx: 2.5.0 unstorage: 1.17.4(@netlify/blobs@9.1.2)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2) - vue: 3.5.30(typescript@5.8.3) + vue: 3.5.30(typescript@5.9.3) vue-bundle-renderer: 2.2.0 vue-devtools-stub: 0.1.0 transitivePeerDependencies: @@ -10755,12 +10781,12 @@ snapshots: - uploadthing - xml2js - '@nuxt/nitro-server@4.4.2(@babel/core@7.29.0)(@netlify/blobs@9.1.2)(better-sqlite3@12.8.0)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2)(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2))(typescript@5.9.3)': + '@nuxt/nitro-server@4.4.2(@babel/core@7.29.0)(@netlify/blobs@9.1.2)(better-sqlite3@12.8.0)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2)(magicast@0.3.5)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.3.5)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.41.1))(rollup@4.41.1)(terser@5.40.0)(typescript@5.8.3)(vite@6.3.5(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.8.3))(yaml@2.8.2))(typescript@5.8.3)': dependencies: '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) '@nuxt/devalue': 2.0.2 - '@nuxt/kit': 4.4.2(magicast@0.5.2) - '@unhead/vue': 2.1.12(vue@3.5.30(typescript@5.9.3)) + '@nuxt/kit': 4.4.2(magicast@0.3.5) + '@unhead/vue': 2.1.12(vue@3.5.30(typescript@5.8.3)) '@vue/shared': 3.5.30 consola: 3.4.2 defu: 6.1.4 @@ -10774,7 +10800,7 @@ snapshots: klona: 2.0.6 mocked-exports: 0.1.1 nitropack: 2.13.1(@netlify/blobs@9.1.2)(better-sqlite3@12.8.0) - nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2) + nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.3.5)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.41.1))(rollup@4.41.1)(terser@5.40.0)(typescript@5.8.3)(vite@6.3.5(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.8.3))(yaml@2.8.2) nypm: 0.6.5 ohash: 2.0.11 pathe: 2.0.3 @@ -10784,7 +10810,7 @@ snapshots: ufo: 1.6.3 unctx: 2.5.0 unstorage: 1.17.4(@netlify/blobs@9.1.2)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2) - vue: 3.5.30(typescript@5.9.3) + vue: 3.5.30(typescript@5.8.3) vue-bundle-renderer: 2.2.0 vue-devtools-stub: 0.1.0 transitivePeerDependencies: @@ -10912,15 +10938,6 @@ snapshots: rc9: 3.0.0 std-env: 3.10.0 - '@nuxt/telemetry@2.7.0(@nuxt/kit@4.4.2(magicast@0.5.2))': - dependencies: - '@nuxt/kit': 4.4.2(magicast@0.5.2) - citty: 0.2.1 - consola: 3.4.2 - ofetch: 2.0.0-alpha.3 - rc9: 3.0.0 - std-env: 3.10.0 - '@nuxt/test-utils@3.19.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(magicast@0.3.5)(playwright-core@1.58.2)(terser@5.40.0)(typescript@5.8.3)(vitest@3.2.1(@types/debug@4.1.12)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(yaml@2.8.2)': dependencies: '@nuxt/kit': 3.17.5(magicast@0.3.5) @@ -10967,17 +10984,17 @@ snapshots: - typescript - yaml - '@nuxt/ui@4.5.1(@netlify/blobs@9.1.2)(@nuxt/content@3.12.0(@valibot/to-json-schema@1.3.0(valibot@1.1.0(typescript@5.8.3)))(better-sqlite3@12.8.0)(magicast@0.5.2)(valibot@1.1.0(typescript@5.8.3)))(@tiptap/extensions@3.20.2(@tiptap/core@3.20.2(@tiptap/pm@3.20.2))(@tiptap/pm@3.20.2))(@tiptap/y-tiptap@3.0.2(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(db0@0.3.4(better-sqlite3@12.8.0))(embla-carousel@8.6.0)(ioredis@5.9.2)(jwt-decode@4.0.0)(magicast@0.5.2)(tailwindcss@4.2.1)(typescript@5.9.3)(valibot@1.1.0(typescript@5.8.3))(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))(yjs@13.6.29)(zod@4.3.6)': + '@nuxt/ui@4.5.1(@netlify/blobs@9.1.2)(@nuxt/content@3.12.0(@valibot/to-json-schema@1.3.0(valibot@1.1.0(typescript@5.8.3)))(better-sqlite3@12.8.0)(magicast@0.3.5)(valibot@1.1.0(typescript@5.8.3)))(@tiptap/extensions@3.20.2(@tiptap/core@3.20.2(@tiptap/pm@3.20.2))(@tiptap/pm@3.20.2))(@tiptap/y-tiptap@3.0.2(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(db0@0.3.4(better-sqlite3@12.8.0))(embla-carousel@8.6.0)(ioredis@5.9.2)(jwt-decode@4.0.0)(magicast@0.3.5)(tailwindcss@4.2.1)(typescript@5.9.3)(valibot@1.1.0(typescript@5.8.3))(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))(yjs@13.6.29)(zod@4.3.6)': dependencies: '@floating-ui/dom': 1.7.6 '@iconify/vue': 5.0.0(vue@3.5.30(typescript@5.9.3)) '@internationalized/date': 3.12.0 '@internationalized/number': 3.6.5 - '@nuxt/fonts': 0.14.0(@netlify/blobs@9.1.2)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2)(magicast@0.5.2)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)) - '@nuxt/icon': 2.2.1(magicast@0.5.2)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) - '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/fonts': 0.14.0(@netlify/blobs@9.1.2)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2)(magicast@0.3.5)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)) + '@nuxt/icon': 2.2.1(magicast@0.3.5)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) + '@nuxt/kit': 4.4.2(magicast@0.3.5) '@nuxt/schema': 4.4.2 - '@nuxtjs/color-mode': 3.5.2(magicast@0.5.2) + '@nuxtjs/color-mode': 3.5.2(magicast@0.3.5) '@standard-schema/spec': 1.1.0 '@tailwindcss/postcss': 4.2.1 '@tailwindcss/vite': 4.2.1(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)) @@ -11031,12 +11048,12 @@ snapshots: typescript: 5.9.3 ufo: 1.6.3 unplugin: 3.0.0 - unplugin-auto-import: 21.0.0(@nuxt/kit@4.4.2(magicast@0.5.2))(@vueuse/core@14.2.1(vue@3.5.30(typescript@5.9.3))) - unplugin-vue-components: 31.0.0(@nuxt/kit@4.4.2(magicast@0.5.2))(vue@3.5.30(typescript@5.9.3)) + unplugin-auto-import: 21.0.0(@nuxt/kit@4.4.2(magicast@0.3.5))(@vueuse/core@14.2.1(vue@3.5.30(typescript@5.9.3))) + unplugin-vue-components: 31.0.0(@nuxt/kit@4.4.2(magicast@0.3.5))(vue@3.5.30(typescript@5.9.3)) vaul-vue: 0.4.1(reka-ui@2.8.2(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)) vue-component-type-helpers: 3.2.5 optionalDependencies: - '@nuxt/content': 3.12.0(@valibot/to-json-schema@1.3.0(valibot@1.1.0(typescript@5.8.3)))(better-sqlite3@12.8.0)(magicast@0.5.2)(valibot@1.1.0(typescript@5.8.3)) + '@nuxt/content': 3.12.0(@valibot/to-json-schema@1.3.0(valibot@1.1.0(typescript@5.8.3)))(better-sqlite3@12.8.0)(magicast@0.3.5)(valibot@1.1.0(typescript@5.8.3)) valibot: 1.1.0(typescript@5.8.3) vue-router: 4.6.4(vue@3.5.30(typescript@5.9.3)) zod: 4.3.6 @@ -11082,12 +11099,12 @@ snapshots: - vue - yjs - '@nuxt/vite-builder@4.4.2(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@types/node@25.6.0)(eslint@9.28.0(jiti@2.6.1))(lightningcss@1.31.1)(magicast@0.3.5)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.3.5)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.41.1))(rollup@4.41.1)(terser@5.40.0)(typescript@5.8.3)(vite@6.3.5(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.8.3))(yaml@2.8.2))(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.41.1))(rollup@4.41.1)(terser@5.40.0)(typescript@5.8.3)(vue-tsc@2.2.10(typescript@5.8.3))(vue@3.5.30(typescript@5.8.3))(yaml@2.8.2)': + '@nuxt/vite-builder@4.4.2(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@types/node@25.6.0)(eslint@9.28.0(jiti@2.6.1))(lightningcss@1.31.1)(magicast@0.3.5)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.3.5)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vue-tsc@2.2.10(typescript@5.9.3))(vue@3.5.30(typescript@5.9.3))(yaml@2.8.2)': dependencies: '@nuxt/kit': 4.4.2(magicast@0.3.5) - '@rollup/plugin-replace': 6.0.3(rollup@4.41.1) - '@vitejs/plugin-vue': 6.0.5(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.8.3)) - '@vitejs/plugin-vue-jsx': 5.1.5(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.8.3)) + '@rollup/plugin-replace': 6.0.3(rollup@4.56.0) + '@vitejs/plugin-vue': 6.0.5(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) + '@vitejs/plugin-vue-jsx': 5.1.5(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) autoprefixer: 10.4.27(postcss@8.5.8) consola: 3.4.2 cssnano: 7.1.3(postcss@8.5.8) @@ -11100,7 +11117,7 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.1 mocked-exports: 0.1.1 - nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.3.5)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.41.1))(rollup@4.41.1)(terser@5.40.0)(typescript@5.8.3)(vite@6.3.5(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.8.3))(yaml@2.8.2) + nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.3.5)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2) nypm: 0.6.5 pathe: 2.0.3 pkg-types: 2.3.0 @@ -11111,12 +11128,12 @@ snapshots: unenv: 2.0.0-rc.24 vite: 7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2) vite-node: 5.3.0(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2) - vite-plugin-checker: 0.12.0(eslint@9.28.0(jiti@2.6.1))(optionator@0.9.4)(typescript@5.8.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.8.3)) - vue: 3.5.30(typescript@5.8.3) + vite-plugin-checker: 0.12.0(eslint@9.28.0(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3)) + vue: 3.5.30(typescript@5.9.3) vue-bundle-renderer: 2.2.0 optionalDependencies: '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) - rollup-plugin-visualizer: 6.0.5(rollup@4.41.1) + rollup-plugin-visualizer: 6.0.5(rollup@4.56.0) transitivePeerDependencies: - '@biomejs/biome' - '@types/node' @@ -11142,12 +11159,12 @@ snapshots: - vue-tsc - yaml - '@nuxt/vite-builder@4.4.2(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@types/node@25.6.0)(eslint@9.28.0(jiti@2.6.1))(lightningcss@1.31.1)(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vue-tsc@2.2.10(typescript@5.9.3))(vue@3.5.30(typescript@5.9.3))(yaml@2.8.2)': + '@nuxt/vite-builder@4.4.2(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@types/node@25.6.0)(eslint@9.28.0(jiti@2.6.1))(lightningcss@1.31.1)(magicast@0.3.5)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.3.5)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.41.1))(rollup@4.41.1)(terser@5.40.0)(typescript@5.8.3)(vite@6.3.5(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.8.3))(yaml@2.8.2))(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.41.1))(rollup@4.41.1)(terser@5.40.0)(typescript@5.8.3)(vue-tsc@2.2.10(typescript@5.8.3))(vue@3.5.30(typescript@5.8.3))(yaml@2.8.2)': dependencies: - '@nuxt/kit': 4.4.2(magicast@0.5.2) - '@rollup/plugin-replace': 6.0.3(rollup@4.56.0) - '@vitejs/plugin-vue': 6.0.5(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) - '@vitejs/plugin-vue-jsx': 5.1.5(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) + '@nuxt/kit': 4.4.2(magicast@0.3.5) + '@rollup/plugin-replace': 6.0.3(rollup@4.41.1) + '@vitejs/plugin-vue': 6.0.5(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.8.3)) + '@vitejs/plugin-vue-jsx': 5.1.5(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.8.3)) autoprefixer: 10.4.27(postcss@8.5.8) consola: 3.4.2 cssnano: 7.1.3(postcss@8.5.8) @@ -11160,7 +11177,7 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.1 mocked-exports: 0.1.1 - nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2) + nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.3.5)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.41.1))(rollup@4.41.1)(terser@5.40.0)(typescript@5.8.3)(vite@6.3.5(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.8.3))(yaml@2.8.2) nypm: 0.6.5 pathe: 2.0.3 pkg-types: 2.3.0 @@ -11171,12 +11188,12 @@ snapshots: unenv: 2.0.0-rc.24 vite: 7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2) vite-node: 5.3.0(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2) - vite-plugin-checker: 0.12.0(eslint@9.28.0(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3)) - vue: 3.5.30(typescript@5.9.3) + vite-plugin-checker: 0.12.0(eslint@9.28.0(jiti@2.6.1))(optionator@0.9.4)(typescript@5.8.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.8.3)) + vue: 3.5.30(typescript@5.8.3) vue-bundle-renderer: 2.2.0 optionalDependencies: '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) - rollup-plugin-visualizer: 6.0.5(rollup@4.56.0) + rollup-plugin-visualizer: 6.0.5(rollup@4.41.1) transitivePeerDependencies: - '@biomejs/biome' - '@types/node' @@ -11262,16 +11279,16 @@ snapshots: - vue-tsc - yaml - '@nuxtjs/color-mode@3.5.2(magicast@0.5.2)': + '@nuxtjs/color-mode@3.5.2(magicast@0.3.5)': dependencies: - '@nuxt/kit': 3.17.5(magicast@0.5.2) + '@nuxt/kit': 3.17.5(magicast@0.3.5) pathe: 1.1.2 pkg-types: 1.3.1 semver: 7.7.4 transitivePeerDependencies: - magicast - '@nuxtjs/i18n@10.2.3(@netlify/blobs@9.1.2)(@vue/compiler-dom@3.5.30)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.2)(rollup@4.56.0)(vue@3.5.30(typescript@5.9.3))': + '@nuxtjs/i18n@10.2.3(@netlify/blobs@9.1.2)(@vue/compiler-dom@3.5.30)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.3.5)(rollup@4.56.0)(vue@3.5.30(typescript@5.9.3))': dependencies: '@intlify/core': 11.3.0 '@intlify/h3': 0.7.4 @@ -11279,7 +11296,7 @@ snapshots: '@intlify/unplugin-vue-i18n': 11.0.7(@vue/compiler-dom@3.5.30)(eslint@9.28.0(jiti@2.6.1))(rollup@4.56.0)(typescript@5.9.3)(vue-i18n@11.3.0(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)) '@intlify/utils': 0.13.0 '@miyaneee/rollup-plugin-json5': 1.2.0(rollup@4.56.0) - '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/kit': 4.4.2(magicast@0.3.5) '@rollup/plugin-yaml': 4.1.2(rollup@4.56.0) '@vue/compiler-sfc': 3.5.27 defu: 6.1.4 @@ -11329,10 +11346,10 @@ snapshots: - uploadthing - vue - '@nuxtjs/mcp-toolkit@0.7.0(@cfworker/json-schema@4.1.1)(magicast@0.5.2)(zod@4.3.6)': + '@nuxtjs/mcp-toolkit@0.7.0(@cfworker/json-schema@4.1.1)(magicast@0.3.5)(zod@4.3.6)': dependencies: '@modelcontextprotocol/sdk': 1.27.1(@cfworker/json-schema@4.1.1)(zod@4.3.6) - '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/kit': 4.4.2(magicast@0.3.5) defu: 6.1.4 ms: 2.1.3 pathe: 2.0.3 @@ -11345,9 +11362,9 @@ snapshots: - magicast - supports-color - '@nuxtjs/mdc@0.20.2(magicast@0.5.2)': + '@nuxtjs/mdc@0.20.2(magicast@0.3.5)': dependencies: - '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/kit': 4.4.2(magicast@0.3.5) '@shikijs/core': 3.23.0 '@shikijs/langs': 3.23.0 '@shikijs/themes': 3.23.0 @@ -11394,15 +11411,15 @@ snapshots: - magicast - supports-color - '@nuxtjs/robots@5.7.1(magicast@0.5.2)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))(zod@4.3.6)': + '@nuxtjs/robots@5.7.1(magicast@0.3.5)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))(zod@4.3.6)': dependencies: '@fingerprintjs/botd': 2.0.0 - '@nuxt/devtools-kit': 3.2.3(magicast@0.5.2)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)) - '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/devtools-kit': 3.2.3(magicast@0.3.5)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)) + '@nuxt/kit': 4.4.2(magicast@0.3.5) consola: 3.4.2 defu: 6.1.4 h3: 1.15.5 - nuxt-site-config: 3.2.21(magicast@0.5.2)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) + nuxt-site-config: 3.2.21(magicast@0.3.5)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) pathe: 2.0.3 pkg-types: 2.3.0 sirv: 3.0.2 @@ -11884,7 +11901,7 @@ snapshots: '@rollup/plugin-commonjs@29.0.0(rollup@4.56.0)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.56.0) + '@rollup/pluginutils': 5.3.0(rollup@4.56.0) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.5.0(picomatch@4.0.3) @@ -11896,7 +11913,7 @@ snapshots: '@rollup/plugin-inject@5.0.5(rollup@4.56.0)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.56.0) + '@rollup/pluginutils': 5.3.0(rollup@4.56.0) estree-walker: 2.0.2 magic-string: 0.30.21 optionalDependencies: @@ -12251,13 +12268,14 @@ snapshots: '@sqlite.org/sqlite-wasm@3.50.4-build1': {} - '@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(@valibot/to-json-schema@1.3.0(valibot@1.1.0(typescript@5.8.3)))(quansync@0.2.11)(valibot@1.1.0(typescript@5.8.3))(zod-to-json-schema@3.25.1(zod@4.2.1))(zod@4.2.1)': + '@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(@valibot/to-json-schema@1.3.0(valibot@1.1.0(typescript@5.8.3)))(arktype@2.2.0)(quansync@0.2.11)(valibot@1.1.0(typescript@5.8.3))(zod-to-json-schema@3.25.1(zod@4.2.1))(zod@4.2.1)': dependencies: '@standard-schema/spec': 1.1.0 '@types/json-schema': 7.0.15 quansync: 0.2.11 optionalDependencies: '@valibot/to-json-schema': 1.3.0(valibot@1.1.0(typescript@5.8.3)) + arktype: 2.2.0 valibot: 1.1.0(typescript@5.8.3) zod: 4.2.1 zod-to-json-schema: 3.25.1(zod@4.2.1) @@ -12967,7 +12985,7 @@ snapshots: '@vercel/nft@1.3.0(rollup@4.56.0)': dependencies: '@mapbox/node-pre-gyp': 2.0.0 - '@rollup/pluginutils': 5.1.4(rollup@4.56.0) + '@rollup/pluginutils': 5.3.0(rollup@4.56.0) acorn: 8.16.0 acorn-import-attributes: 1.9.5(acorn@8.16.0) async-sema: 3.1.1 @@ -13572,6 +13590,16 @@ snapshots: dependencies: tslib: 2.8.1 + arkregex@0.0.5: + dependencies: + '@ark/util': 0.56.0 + + arktype@2.2.0: + dependencies: + '@ark/schema': 0.56.0 + '@ark/util': 0.56.0 + arkregex: 0.0.5 + assertion-error@2.0.1: {} ast-kit@2.2.0: @@ -13742,23 +13770,6 @@ snapshots: optionalDependencies: magicast: 0.3.5 - c12@3.0.4(magicast@0.5.2): - dependencies: - chokidar: 4.0.3 - confbox: 0.2.2 - defu: 6.1.4 - dotenv: 16.5.0 - exsolve: 1.0.5 - giget: 2.0.0 - jiti: 2.4.2 - ohash: 2.0.11 - pathe: 2.0.3 - perfect-debounce: 1.0.0 - pkg-types: 2.3.0 - rc9: 2.1.2 - optionalDependencies: - magicast: 0.5.2 - c12@3.3.3(magicast@0.3.5): dependencies: chokidar: 5.0.0 @@ -14213,7 +14224,7 @@ snapshots: diff@8.0.3: {} - docus@5.8.1(t4cg44m4akyr66x4oqv7hg6kre): + docus@5.8.1(lm5hnwzjdjozjmwueejgquhx54): dependencies: '@ai-sdk/gateway': 3.0.66(zod@4.3.6) '@ai-sdk/mcp': 1.0.25(zod@4.3.6) @@ -14221,14 +14232,14 @@ snapshots: '@iconify-json/lucide': 1.2.98 '@iconify-json/simple-icons': 1.2.74 '@iconify-json/vscode-icons': 1.2.45 - '@nuxt/content': 3.12.0(@valibot/to-json-schema@1.3.0(valibot@1.1.0(typescript@5.8.3)))(better-sqlite3@12.8.0)(magicast@0.5.2)(valibot@1.1.0(typescript@5.8.3)) - '@nuxt/image': 2.0.0(@netlify/blobs@9.1.2)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2)(magicast@0.5.2) - '@nuxt/kit': 4.4.2(magicast@0.5.2) - '@nuxt/ui': 4.5.1(@netlify/blobs@9.1.2)(@nuxt/content@3.12.0(@valibot/to-json-schema@1.3.0(valibot@1.1.0(typescript@5.8.3)))(better-sqlite3@12.8.0)(magicast@0.5.2)(valibot@1.1.0(typescript@5.8.3)))(@tiptap/extensions@3.20.2(@tiptap/core@3.20.2(@tiptap/pm@3.20.2))(@tiptap/pm@3.20.2))(@tiptap/y-tiptap@3.0.2(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(db0@0.3.4(better-sqlite3@12.8.0))(embla-carousel@8.6.0)(ioredis@5.9.2)(jwt-decode@4.0.0)(magicast@0.5.2)(tailwindcss@4.2.1)(typescript@5.9.3)(valibot@1.1.0(typescript@5.8.3))(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))(yjs@13.6.29)(zod@4.3.6) - '@nuxtjs/i18n': 10.2.3(@netlify/blobs@9.1.2)(@vue/compiler-dom@3.5.30)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.5.2)(rollup@4.56.0)(vue@3.5.30(typescript@5.9.3)) - '@nuxtjs/mcp-toolkit': 0.7.0(@cfworker/json-schema@4.1.1)(magicast@0.5.2)(zod@4.3.6) - '@nuxtjs/mdc': 0.20.2(magicast@0.5.2) - '@nuxtjs/robots': 5.7.1(magicast@0.5.2)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))(zod@4.3.6) + '@nuxt/content': 3.12.0(@valibot/to-json-schema@1.3.0(valibot@1.1.0(typescript@5.8.3)))(better-sqlite3@12.8.0)(magicast@0.3.5)(valibot@1.1.0(typescript@5.8.3)) + '@nuxt/image': 2.0.0(@netlify/blobs@9.1.2)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2)(magicast@0.3.5) + '@nuxt/kit': 4.4.2(magicast@0.3.5) + '@nuxt/ui': 4.5.1(@netlify/blobs@9.1.2)(@nuxt/content@3.12.0(@valibot/to-json-schema@1.3.0(valibot@1.1.0(typescript@5.8.3)))(better-sqlite3@12.8.0)(magicast@0.3.5)(valibot@1.1.0(typescript@5.8.3)))(@tiptap/extensions@3.20.2(@tiptap/core@3.20.2(@tiptap/pm@3.20.2))(@tiptap/pm@3.20.2))(@tiptap/y-tiptap@3.0.2(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(db0@0.3.4(better-sqlite3@12.8.0))(embla-carousel@8.6.0)(ioredis@5.9.2)(jwt-decode@4.0.0)(magicast@0.3.5)(tailwindcss@4.2.1)(typescript@5.9.3)(valibot@1.1.0(typescript@5.8.3))(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))(yjs@13.6.29)(zod@4.3.6) + '@nuxtjs/i18n': 10.2.3(@netlify/blobs@9.1.2)(@vue/compiler-dom@3.5.30)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(magicast@0.3.5)(rollup@4.56.0)(vue@3.5.30(typescript@5.9.3)) + '@nuxtjs/mcp-toolkit': 0.7.0(@cfworker/json-schema@4.1.1)(magicast@0.3.5)(zod@4.3.6) + '@nuxtjs/mdc': 0.20.2(magicast@0.3.5) + '@nuxtjs/robots': 5.7.1(magicast@0.3.5)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))(zod@4.3.6) '@shikijs/core': 3.23.0 '@shikijs/engine-javascript': 3.23.0 '@shikijs/langs': 3.23.0 @@ -14240,9 +14251,9 @@ snapshots: exsolve: 1.0.8 git-url-parse: 16.1.0 motion-v: 1.10.3(@vueuse/core@14.2.1(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)) - nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2) - nuxt-llms: 0.2.0(magicast@0.5.2) - nuxt-og-image: 5.1.13(@unhead/vue@2.1.12(vue@3.5.30(typescript@5.9.3)))(magicast@0.5.2)(unstorage@1.17.4(@netlify/blobs@9.1.2)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2))(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) + nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.3.5)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2) + nuxt-llms: 0.2.0(magicast@0.3.5) + nuxt-og-image: 5.1.13(@unhead/vue@2.1.12(vue@3.5.30(typescript@5.9.3)))(magicast@0.3.5)(unstorage@1.17.4(@netlify/blobs@9.1.2)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2))(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) pkg-types: 2.3.0 scule: 1.3.0 shiki-stream: 0.1.4(vue@3.5.30(typescript@5.9.3)) @@ -16742,9 +16753,9 @@ snapshots: dependencies: boolbase: 1.0.0 - nuxt-component-meta@0.17.2(magicast@0.5.2): + nuxt-component-meta@0.17.2(magicast@0.3.5): dependencies: - '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/kit': 4.4.2(magicast@0.3.5) citty: 0.1.6 mlly: 1.8.1 ohash: 2.0.11 @@ -16757,16 +16768,16 @@ snapshots: nuxt-define@1.0.0: {} - nuxt-llms@0.2.0(magicast@0.5.2): + nuxt-llms@0.2.0(magicast@0.3.5): dependencies: - '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/kit': 4.4.2(magicast@0.3.5) transitivePeerDependencies: - magicast - nuxt-og-image@5.1.13(@unhead/vue@2.1.12(vue@3.5.30(typescript@5.9.3)))(magicast@0.5.2)(unstorage@1.17.4(@netlify/blobs@9.1.2)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2))(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)): + nuxt-og-image@5.1.13(@unhead/vue@2.1.12(vue@3.5.30(typescript@5.9.3)))(magicast@0.3.5)(unstorage@1.17.4(@netlify/blobs@9.1.2)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2))(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)): dependencies: - '@nuxt/devtools-kit': 3.1.1(magicast@0.5.2)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)) - '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/devtools-kit': 3.1.1(magicast@0.3.5)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)) + '@nuxt/kit': 4.4.2(magicast@0.3.5) '@resvg/resvg-js': 2.6.2 '@resvg/resvg-wasm': 2.6.2 '@unhead/vue': 2.1.12(vue@3.5.30(typescript@5.9.3)) @@ -16779,7 +16790,7 @@ snapshots: image-size: 2.0.2 magic-string: 0.30.21 mocked-exports: 0.1.1 - nuxt-site-config: 3.2.21(magicast@0.5.2)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) + nuxt-site-config: 3.2.21(magicast@0.3.5)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) nypm: 0.6.4 ofetch: 1.5.1 ohash: 2.0.11 @@ -16803,9 +16814,9 @@ snapshots: - vite - vue - nuxt-site-config-kit@3.2.21(magicast@0.5.2)(vue@3.5.30(typescript@5.9.3)): + nuxt-site-config-kit@3.2.21(magicast@0.3.5)(vue@3.5.30(typescript@5.9.3)): dependencies: - '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/kit': 4.4.2(magicast@0.3.5) pkg-types: 2.3.0 site-config-stack: 3.2.21(vue@3.5.30(typescript@5.9.3)) std-env: 3.10.0 @@ -16814,12 +16825,12 @@ snapshots: - magicast - vue - nuxt-site-config@3.2.21(magicast@0.5.2)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)): + nuxt-site-config@3.2.21(magicast@0.3.5)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)): dependencies: - '@nuxt/devtools-kit': 3.2.3(magicast@0.5.2)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)) - '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/devtools-kit': 3.2.3(magicast@0.3.5)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)) + '@nuxt/kit': 4.4.2(magicast@0.3.5) h3: 1.15.5 - nuxt-site-config-kit: 3.2.21(magicast@0.5.2)(vue@3.5.30(typescript@5.9.3)) + nuxt-site-config-kit: 3.2.21(magicast@0.3.5)(vue@3.5.30(typescript@5.9.3)) pathe: 2.0.3 pkg-types: 2.3.0 sirv: 3.0.2 @@ -16830,19 +16841,19 @@ snapshots: - vite - vue - nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2): + nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.3.5)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2): dependencies: - '@dxup/nuxt': 0.4.0(magicast@0.5.2)(typescript@5.9.3) - '@nuxt/cli': 3.34.0(@nuxt/schema@4.4.2)(cac@6.7.14)(magicast@0.5.2) + '@dxup/nuxt': 0.4.0(magicast@0.3.5)(typescript@5.9.3) + '@nuxt/cli': 3.34.0(@nuxt/schema@4.4.2)(cac@6.7.14)(magicast@0.3.5) '@nuxt/devtools': 3.2.3(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) - '@nuxt/kit': 4.4.2(magicast@0.5.2) - '@nuxt/nitro-server': 4.4.2(@babel/core@7.29.0)(@netlify/blobs@9.1.2)(better-sqlite3@12.8.0)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2)(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2))(typescript@5.9.3) + '@nuxt/kit': 4.4.2(magicast@0.3.5) + '@nuxt/nitro-server': 4.4.2(@babel/core@7.29.0)(@netlify/blobs@9.1.2)(better-sqlite3@12.8.0)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.9.2)(magicast@0.3.5)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.3.5)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2))(typescript@5.9.3) '@nuxt/schema': 4.4.2 - '@nuxt/telemetry': 2.7.0(@nuxt/kit@4.4.2(magicast@0.5.2)) - '@nuxt/vite-builder': 4.4.2(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@types/node@25.6.0)(eslint@9.28.0(jiti@2.6.1))(lightningcss@1.31.1)(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vue-tsc@2.2.10(typescript@5.9.3))(vue@3.5.30(typescript@5.9.3))(yaml@2.8.2) + '@nuxt/telemetry': 2.7.0(@nuxt/kit@4.4.2(magicast@0.3.5)) + '@nuxt/vite-builder': 4.4.2(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@types/node@25.6.0)(eslint@9.28.0(jiti@2.6.1))(lightningcss@1.31.1)(magicast@0.3.5)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.6.0)(@vue/compiler-sfc@3.5.27)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@9.28.0(jiti@2.6.1))(ioredis@5.9.2)(lightningcss@1.31.1)(magicast@0.3.5)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2))(vue-tsc@2.2.10(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(rollup-plugin-visualizer@6.0.5(rollup@4.56.0))(rollup@4.56.0)(terser@5.40.0)(typescript@5.9.3)(vue-tsc@2.2.10(typescript@5.9.3))(vue@3.5.30(typescript@5.9.3))(yaml@2.8.2) '@unhead/vue': 2.1.12(vue@3.5.30(typescript@5.9.3)) '@vue/shared': 3.5.30 - c12: 3.3.3(magicast@0.5.2) + c12: 3.3.3(magicast@0.3.5) chokidar: 5.0.0 compatx: 0.2.0 consola: 3.4.2 @@ -19153,7 +19164,7 @@ snapshots: unpipe@1.0.0: {} - unplugin-auto-import@21.0.0(@nuxt/kit@4.4.2(magicast@0.5.2))(@vueuse/core@14.2.1(vue@3.5.30(typescript@5.9.3))): + unplugin-auto-import@21.0.0(@nuxt/kit@4.4.2(magicast@0.3.5))(@vueuse/core@14.2.1(vue@3.5.30(typescript@5.9.3))): dependencies: local-pkg: 1.1.2 magic-string: 0.30.21 @@ -19162,7 +19173,7 @@ snapshots: unplugin: 2.3.11 unplugin-utils: 0.3.1 optionalDependencies: - '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/kit': 4.4.2(magicast@0.3.5) '@vueuse/core': 14.2.1(vue@3.5.30(typescript@5.9.3)) unplugin-utils@0.2.4: @@ -19175,7 +19186,7 @@ snapshots: pathe: 2.0.3 picomatch: 4.0.3 - unplugin-vue-components@31.0.0(@nuxt/kit@4.4.2(magicast@0.5.2))(vue@3.5.30(typescript@5.9.3)): + unplugin-vue-components@31.0.0(@nuxt/kit@4.4.2(magicast@0.3.5))(vue@3.5.30(typescript@5.9.3)): dependencies: chokidar: 5.0.0 local-pkg: 1.1.2 @@ -19188,7 +19199,7 @@ snapshots: unplugin-utils: 0.3.1 vue: 3.5.30(typescript@5.9.3) optionalDependencies: - '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/kit': 4.4.2(magicast@0.3.5) unplugin-vue-router@0.16.2(@vue/compiler-sfc@3.5.27)(vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)): dependencies: @@ -19491,7 +19502,7 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-inspect@11.3.3(@nuxt/kit@4.4.2(magicast@0.5.2))(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)): + vite-plugin-inspect@11.3.3(@nuxt/kit@4.4.2(magicast@0.3.5))(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)): dependencies: ansis: 4.1.0 debug: 4.4.3 @@ -19504,7 +19515,7 @@ snapshots: vite: 7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2) vite-dev-rpc: 1.1.0(vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.40.0)(yaml@2.8.2)) optionalDependencies: - '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/kit': 4.4.2(magicast@0.3.5) transitivePeerDependencies: - supports-color diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index cfcfdfa..3d2bec6 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -20,6 +20,7 @@ catalog: '@typescript-eslint/rule-tester': ^8.50.0 '@typescript-eslint/utils': ^8.50.0 '@valibot/to-json-schema': 1.3.0 + arktype: ^2.2.0 better-sqlite3: ^12.5.0 bumpp: ^10.1.1 changelogen: ^0.6.1 diff --git a/scripts/smoke-packed-release.mjs b/scripts/smoke-packed-release.mjs new file mode 100644 index 0000000..75eaf9d --- /dev/null +++ b/scripts/smoke-packed-release.mjs @@ -0,0 +1,225 @@ +import { spawnSync } from 'node:child_process' +import { mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs' +import { dirname, join } from 'node:path' +import process from 'node:process' +import { fileURLToPath } from 'node:url' + +const repoRoot = dirname(fileURLToPath(new URL('../package.json', import.meta.url))) +const tempRoot = mkdtempSync(join('/tmp', 'safe-runtime-config-packed-')) +const packDir = join(tempRoot, 'pack') + +function writeJson(path, value) { + writeFileSync(path, `${JSON.stringify(value, null, 2)}\n`) +} + +function tail(output) { + return output.split('\n').slice(-80).join('\n') +} + +function run(name, command, args, options = {}) { + const cwd = options.cwd || repoRoot + const result = spawnSync(command, args, { + cwd, + encoding: 'utf8', + env: { ...process.env, ...options.env }, + shell: false, + timeout: options.timeout || 180_000, + }) + + const output = `${result.stdout || ''}${result.stderr || ''}` + const logPath = join(cwd, `${name.replaceAll(/[^\w.-]+/g, '-')}.log`) + writeFileSync(logPath, output) + + if (result.status !== 0 && !options.allowFailure) { + throw new Error(`${name} failed with exit code ${result.status ?? result.signal}\nLog: ${logPath}\n${tail(output)}`) + } + + return { ...result, output, logPath } +} + +function createRuntimeValidationConsumer(appDir, tarballPath) { + rmSync(appDir, { recursive: true, force: true }) + mkdirSync(join(appDir, 'server/api'), { recursive: true }) + writeJson(join(appDir, 'package.json'), { + type: 'module', + private: true, + scripts: { + build: 'nuxt build', + }, + dependencies: { + 'nuxt-safe-runtime-config': `file:${tarballPath}`, + 'nuxt': '^4', + 'typescript': '^5.8.3', + 'valibot': '^1.1.0', + }, + }) + writeFileSync(join(appDir, 'app.vue'), ` + + +`) + writeFileSync(join(appDir, 'server/api/config.get.ts'), `export default defineEventHandler(() => { + const config = useSafeRuntimeConfig() + return { port: config.port } +}) +`) + writeFileSync(join(appDir, 'nuxt.config.ts'), `import { number, object, string } from 'valibot' + +const runtimeConfigSchema = object({ + port: number(), + secretKey: string(), + public: object({ apiBase: string() }), +}) + +export default defineNuxtConfig({ + modules: ['nuxt-safe-runtime-config'], + runtimeConfig: { + port: 3000, + secretKey: 'test-secret', + public: { apiBase: 'https://api.example.com' }, + }, + safeRuntimeConfig: { + $schema: runtimeConfigSchema, + validateAtRuntime: true, + }, +}) +`) +} + +function createEslintConsumer(appDir, tarballPath) { + rmSync(appDir, { recursive: true, force: true }) + mkdirSync(appDir, { recursive: true }) + writeJson(join(appDir, 'package.json'), { + type: 'module', + private: true, + dependencies: { + 'nuxt-safe-runtime-config': `file:${tarballPath}`, + 'eslint': '^9.0.0', + 'typescript': '^5.8.3', + }, + }) + writeFileSync(join(appDir, 'eslint.config.mjs'), `import safeRuntimeConfig from 'nuxt-safe-runtime-config/eslint' + +export default [ + safeRuntimeConfig.configs.recommended, +] +`) + writeFileSync(join(appDir, 'sample.js'), `const config = useRuntimeConfig() +console.log(config.public) +`) +} + +function createArkTypeConsumer(appDir, tarballPath) { + rmSync(appDir, { recursive: true, force: true }) + mkdirSync(appDir, { recursive: true }) + writeJson(join(appDir, 'package.json'), { + type: 'module', + private: true, + scripts: { + prepare: 'nuxt prepare', + build: 'nuxt build', + }, + dependencies: { + 'nuxt-safe-runtime-config': `file:${tarballPath}`, + 'arktype': '^2.2.0', + 'nuxt': '^4', + 'typescript': '^5.8.3', + }, + }) + writeFileSync(join(appDir, 'app.vue'), ` + + +`) + writeFileSync(join(appDir, 'nuxt.config.ts'), `import { type } from 'arktype' + +const runtimeConfigSchema = type({ + 'public': { + 'apiBase': 'string', + 'appName?': 'string', + }, + 'databaseUrl': 'string', + 'secretKey': 'string', + 'port?': 'number', +}) + +export default defineNuxtConfig({ + modules: ['nuxt-safe-runtime-config'], + runtimeConfig: { + databaseUrl: 'postgresql://localhost:5432/app', + secretKey: 'test-secret', + port: 3000, + public: { + apiBase: 'https://api.example.com', + appName: 'ArkType Test', + }, + }, + safeRuntimeConfig: { + $schema: runtimeConfigSchema, + }, +}) +`) +} + +try { + mkdirSync(packDir, { recursive: true }) + run('pack', 'pnpm', ['pack', '--pack-destination', packDir], { cwd: repoRoot }) + + const tarball = readdirSync(packDir).find(file => file.endsWith('.tgz')) + if (!tarball) + throw new Error(`No package tarball found in ${packDir}`) + + const tarballPath = join(packDir, tarball) + + const runtimeDir = join(tempRoot, 'runtime-validation') + createRuntimeValidationConsumer(runtimeDir, tarballPath) + run('runtime-install', 'pnpm', ['install', '--ignore-workspace', '--no-frozen-lockfile'], { cwd: runtimeDir, timeout: 240_000 }) + run('runtime-build', 'pnpm', ['build'], { cwd: runtimeDir, timeout: 240_000 }) + const runtimeServer = run('runtime-server-invalid-env', 'node', ['.output/server/index.mjs'], { + cwd: runtimeDir, + env: { + NUXT_PORT: 'not-a-number', + PORT: '48765', + }, + allowFailure: true, + timeout: 8_000, + }) + if (runtimeServer.status === 0) + throw new Error(`runtime validation server unexpectedly succeeded\nLog: ${runtimeServer.logPath}`) + if (runtimeServer.output.includes('ReferenceError: defineNitroPlugin is not defined')) + throw new Error(`runtime validation server still has an unbound defineNitroPlugin\nLog: ${runtimeServer.logPath}`) + if (!runtimeServer.output.includes('Runtime validation failed') || !runtimeServer.output.includes('port')) + throw new Error(`runtime validation server did not report the invalid port\nLog: ${runtimeServer.logPath}\n${tail(runtimeServer.output)}`) + + const eslintDir = join(tempRoot, 'eslint-consumer') + createEslintConsumer(eslintDir, tarballPath) + run('eslint-install', 'pnpm', ['install', '--ignore-workspace', '--no-frozen-lockfile'], { cwd: eslintDir, timeout: 240_000 }) + const eslintOutput = run('eslint-detect', 'pnpm', ['exec', 'eslint', '.'], { cwd: eslintDir }) + if (!eslintOutput.output.includes('Use useSafeRuntimeConfig()')) + throw new Error(`eslint rule did not report useRuntimeConfig()\nLog: ${eslintOutput.logPath}`) + run('eslint-fix', 'pnpm', ['exec', 'eslint', '.', '--fix'], { cwd: eslintDir }) + const fixedSample = readFileSync(join(eslintDir, 'sample.js'), 'utf8') + if (!fixedSample.includes('useSafeRuntimeConfig()')) + throw new Error(`eslint --fix did not rewrite sample.js\n${fixedSample}`) + + const arktypeDir = join(tempRoot, 'arktype-consumer') + createArkTypeConsumer(arktypeDir, tarballPath) + run('arktype-install', 'pnpm', ['install', '--ignore-workspace', '--no-frozen-lockfile'], { cwd: arktypeDir, timeout: 240_000 }) + run('arktype-prepare', 'pnpm', ['prepare'], { cwd: arktypeDir }) + const arktypeBuild = run('arktype-build', 'pnpm', ['build'], { cwd: arktypeDir, timeout: 240_000 }) + if (arktypeBuild.output.includes('Schema is not Standard Schema compatible')) + throw new Error(`ArkType build still rejected the callable Standard Schema\nLog: ${arktypeBuild.logPath}`) + + console.log(`Packed release smoke test passed in ${tempRoot}`) +} +catch (error) { + console.error(error instanceof Error ? error.message : error) + console.error(`Packed release smoke test temp directory: ${tempRoot}`) + process.exit(1) +} diff --git a/src/module.ts b/src/module.ts index d03db07..a674e0d 100644 --- a/src/module.ts +++ b/src/module.ts @@ -2,6 +2,8 @@ import type { Nuxt } from '@nuxt/schema' import type { StandardSchemaV1 } from '@standard-schema/spec' import type { ErrorBehavior, ModuleOptions } from './types' +import { createRequire } from 'node:module' +import { join } from 'node:path' import process from 'node:process' import { addImports, addServerImports, addServerPlugin, addTemplate, addTypeTemplate, createResolver, defineNuxtModule, useLogger } from '@nuxt/kit' import defu from 'defu' @@ -35,6 +37,99 @@ function addNitroAlias(nuxt: Nuxt, name: string, dst: string): void { }) } +function resolveRuntimeConfigImport(rootDir: string): string { + const require = createRequire(join(rootDir, 'package.json')) + try { + require.resolve('nitro/package.json') + return 'nitro/runtime-config' + } + catch { + return 'nitropack/runtime' + } +} + +function getRuntimeValidationPluginContents(runtimeConfigImport: string): string { + return `import { Validator } from '@cfworker/json-schema' +import { consola } from 'consola' +import { draft, onError, schema } from '#safe-runtime-config/validate' +import { useRuntimeConfig } from ${JSON.stringify(runtimeConfigImport)} + +const logger = consola.withTag('safe-runtime-config') + +export default () => { + const config = useRuntimeConfig() + const validator = new Validator(schema, draft) + const result = validator.validate(config) + + if (!result.valid) { + const errors = result.errors.map(e => \`\${e.instanceLocation}: \${e.error}\`).join(', ') + const msg = \`Runtime validation failed: \${errors}\` + + if (onError === 'throw') { + logger.error(msg) + throw new Error(msg) + } + else if (onError === 'warn') { + logger.warn(msg) + } + return + } + + logger.success('Runtime config validated (server start)') +} +` +} + +function getShelveRuntimePluginContents( + shelveClientPath: string, + transformPath: string, + runtimeConfigImport: string, +): string { + return `import process from 'node:process' +import { shelveRuntimeConfig } from '#safe-runtime-config/shelve' +import { consola } from 'consola' +import defu from 'defu' +import { createShelveClient } from ${JSON.stringify(shelveClientPath)} +import { transformEnvVars } from ${JSON.stringify(transformPath)} +import { useRuntimeConfig } from ${JSON.stringify(runtimeConfigImport)} + +const logger = consola.withTag('safe-runtime-config') + +export default async () => { + const cfg = shelveRuntimeConfig + const token = process.env.SHELVE_TOKEN + if (!token) { + logger.warn('SHELVE_TOKEN not set, skipping runtime secrets fetch') + return + } + + const client = createShelveClient({ token, url: cfg.url }) + + try { + const [project, environment] = await Promise.all([ + client.getProjectByName(cfg.slug, cfg.project), + client.getEnvironment(cfg.slug, cfg.environment), + ]) + const variables = await client.getVariables(cfg.slug, project.id, environment.id) + + if (variables.length === 0) { + logger.info('No Shelve variables found') + return + } + + const secrets = transformEnvVars(variables) + const config = useRuntimeConfig() + Object.assign(config, defu(secrets, config)) + logger.success(\`Loaded \${variables.length} secrets from Shelve (runtime)\`) + } + catch (error) { + const msg = error instanceof Error ? error.message : String(error) + logger.error(\`Failed to fetch Shelve secrets: \${msg}\`) + } +} +` +} + export default defineNuxtModule({ meta: { name: 'nuxt-safe-runtime-config', @@ -59,6 +154,7 @@ export default defineNuxtModule({ async setup(options, nuxt) { const resolver = createResolver(import.meta.url) const onError = options.onError! + const runtimeConfigImport = resolveRuntimeConfigImport(nuxt.options.rootDir) const shelveOpts = resolveShelveOptions(options.shelve) if (shelveOpts) { @@ -105,7 +201,16 @@ export default defineNuxtModule({ nuxt.options.alias['#safe-runtime-config/shelve'] = tpl.dst addNitroAlias(nuxt, '#safe-runtime-config/shelve', tpl.dst) - addServerPlugin(resolver.resolve('./runtime/nitro/shelve-plugin')) + const shelvePlugin = addTemplate({ + filename: 'safe-runtime-config/shelve-plugin.mjs', + write: true, + getContents: () => getShelveRuntimePluginContents( + resolver.resolve('./runtime/shelve-client'), + resolver.resolve('./runtime/utils/transform'), + runtimeConfigImport, + ), + }) + addServerPlugin(shelvePlugin.dst) } } @@ -151,7 +256,12 @@ export default defineNuxtModule({ nuxt.options.alias['#safe-runtime-config/validate'] = tpl.dst addNitroAlias(nuxt, '#safe-runtime-config/validate', tpl.dst) - addServerPlugin(resolver.resolve('./runtime/nitro/validate-plugin')) + const validatePlugin = addTemplate({ + filename: 'safe-runtime-config/validate-plugin.mjs', + write: true, + getContents: () => getRuntimeValidationPluginContents(runtimeConfigImport), + }) + addServerPlugin(validatePlugin.dst) } const composable = { @@ -211,7 +321,7 @@ async function validateRuntimeConfig(config: any, schema: StandardSchemaV1, onEr function isStandardSchema(schema: any): schema is StandardSchemaV1 { return schema - && typeof schema === 'object' + && (typeof schema === 'object' || typeof schema === 'function') && '~standard' in schema && typeof schema['~standard'] === 'object' && typeof schema['~standard'].validate === 'function' diff --git a/src/runtime/nitro/shelve-plugin.ts b/src/runtime/nitro/shelve-plugin.ts deleted file mode 100644 index 831be54..0000000 --- a/src/runtime/nitro/shelve-plugin.ts +++ /dev/null @@ -1,49 +0,0 @@ -import process from 'node:process' -// @ts-expect-error - virtual module created by module setup when fetchAtRuntime: true -import { shelveRuntimeConfig } from '#safe-runtime-config/shelve' -import { consola } from 'consola' -import defu from 'defu' -import { createShelveClient } from '../shelve-client' -import { transformEnvVars } from '../utils/transform' - -const logger = consola.withTag('safe-runtime-config') - -interface ShelveRuntimeConfig { - url: string - slug: string - project: string - environment: string -} - -export default defineNitroPlugin(async () => { - const cfg = shelveRuntimeConfig as ShelveRuntimeConfig - const token = process.env.SHELVE_TOKEN - if (!token) { - logger.warn('SHELVE_TOKEN not set, skipping runtime secrets fetch') - return - } - - const client = createShelveClient({ token, url: cfg.url }) - - try { - const [project, environment] = await Promise.all([ - client.getProjectByName(cfg.slug, cfg.project), - client.getEnvironment(cfg.slug, cfg.environment), - ]) - const variables = await client.getVariables(cfg.slug, project.id, environment.id) - - if (variables.length === 0) { - logger.info('No Shelve variables found') - return - } - - const secrets = transformEnvVars(variables) - const config = useRuntimeConfig() - Object.assign(config, defu(secrets, config)) - logger.success(`Loaded ${variables.length} secrets from Shelve (runtime)`) - } - catch (error) { - const msg = error instanceof Error ? error.message : String(error) - logger.error(`Failed to fetch Shelve secrets: ${msg}`) - } -}) diff --git a/src/runtime/nitro/validate-plugin.ts b/src/runtime/nitro/validate-plugin.ts deleted file mode 100644 index c0b1bd7..0000000 --- a/src/runtime/nitro/validate-plugin.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { draft, onError, schema } from '#safe-runtime-config/validate' -import { Validator } from '@cfworker/json-schema' -import { consola } from 'consola' - -const logger = consola.withTag('safe-runtime-config') - -export default defineNitroPlugin(() => { - const config = useRuntimeConfig() - const validator = new Validator(schema as any, draft as any) - const result = validator.validate(config) - - if (!result.valid) { - const errors = result.errors.map((e: any) => `${e.instanceLocation}: ${e.error}`).join(', ') - const msg = `Runtime validation failed: ${errors}` - - if (onError === 'throw') { - logger.error(msg) - throw new Error(msg) - } - else if (onError === 'warn') { - logger.warn(msg) - } - return - } - - logger.success('Runtime config validated (server start)') -}) diff --git a/test/fixtures/arktype/app.vue b/test/fixtures/arktype/app.vue new file mode 100644 index 0000000..029ac71 --- /dev/null +++ b/test/fixtures/arktype/app.vue @@ -0,0 +1,7 @@ + + + diff --git a/test/fixtures/arktype/nuxt.config.ts b/test/fixtures/arktype/nuxt.config.ts new file mode 100644 index 0000000..994ff45 --- /dev/null +++ b/test/fixtures/arktype/nuxt.config.ts @@ -0,0 +1,28 @@ +import { type } from 'arktype' +import SafeRuntimeConfig from '../../../src/module' + +const runtimeConfigSchema = type({ + 'public': { + 'apiBase': 'string', + 'appName?': 'string', + }, + 'databaseUrl': 'string', + 'secretKey': 'string', + 'port?': 'number', +}) + +export default defineNuxtConfig({ + modules: [SafeRuntimeConfig], + runtimeConfig: { + databaseUrl: 'postgresql://localhost:5432/app', + secretKey: 'test-secret', + port: 3000, + public: { + apiBase: 'https://api.example.com', + appName: 'ArkType Test', + }, + }, + safeRuntimeConfig: { + $schema: runtimeConfigSchema, + }, +}) diff --git a/test/fixtures/arktype/package.json b/test/fixtures/arktype/package.json new file mode 100644 index 0000000..bab9e14 --- /dev/null +++ b/test/fixtures/arktype/package.json @@ -0,0 +1,14 @@ +{ + "name": "nuxt-safe-runtime-config-test-arktype", + "type": "module", + "private": true, + "scripts": { + "prepare": "nuxt prepare" + }, + "dependencies": { + "arktype": "catalog:" + }, + "devDependencies": { + "nuxt": "catalog:" + } +} diff --git a/test/json-schema.test.ts b/test/json-schema.test.ts index 8f2dd44..ca4d290 100644 --- a/test/json-schema.test.ts +++ b/test/json-schema.test.ts @@ -1,4 +1,5 @@ import type { StandardSchemaV1 } from '@standard-schema/spec' +import { type } from 'arktype' import { object, optional, string } from 'valibot' import { describe, expect, it } from 'vitest' import { z } from 'zod' @@ -55,4 +56,13 @@ describe('json-schema detection', () => { expect(jsonSchema).toHaveProperty('properties') expect((jsonSchema.properties as Record)).toHaveProperty('name') }) + + it('detects native JSON Schema on callable ArkType schemas', async () => { + const schema = type({ name: 'string' }) + expect(hasNativeJSONSchema(schema as any)).toBe(true) + + const jsonSchema = await getJSONSchema(schema as any, 'draft-2020-12') + expect(jsonSchema).toHaveProperty('type', 'object') + expect(jsonSchema).toHaveProperty('properties') + }) }) diff --git a/test/validation.test.ts b/test/validation.test.ts index d830a0c..f93ffdb 100644 --- a/test/validation.test.ts +++ b/test/validation.test.ts @@ -52,6 +52,13 @@ describe('build-time validation', () => { }) expect(true).toBe(true) }, 30000) + + it('validates with ArkType callable Standard Schema', async () => { + await setup({ + rootDir: fileURLToPath(new URL('./fixtures/arktype', import.meta.url)), + }) + expect(true).toBe(true) + }, 30000) }) describe('runtime JSON Schema generation', () => {