@nuxt/nitro-server 3.20.2 → 4.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -14,13 +14,13 @@
14
14
  Nuxt is a free and open-source framework with an intuitive and extendable way to create type-safe, performant and production-grade full-stack web applications and websites with Vue.js.
15
15
 
16
16
  It provides a number of features that make it easy to build fast, SEO-friendly, and scalable web applications, including:
17
- - Server-side rendering, static site generation, hybrid rendering and edge-side rendering
17
+ - Server-side rendering, Static Site Generation, Hybrid Rendering and Edge-Side Rendering
18
18
  - Automatic routing with code-splitting and pre-fetching
19
19
  - Data fetching and state management
20
- - Search engine optimization and defining meta tags
20
+ - SEO Optimization and Meta tags definition
21
21
  - Auto imports of components, composables and utils
22
22
  - TypeScript with zero configuration
23
- - Go full-stack with our server/ directory
23
+ - Go fullstack with our server/ directory
24
24
  - Extensible with [200+ modules](https://nuxt.com/modules)
25
25
  - Deployment to a variety of [hosting platforms](https://nuxt.com/deploy)
26
26
  - ...[and much more](https://nuxt.com) 🚀
@@ -31,7 +31,7 @@ It provides a number of features that make it easy to build fast, SEO-friendly,
31
31
  - 💻 [ Vue Development](#vue-development)
32
32
  - 📖 [Documentation](#documentation)
33
33
  - 🧩 [Modules](#modules)
34
- - ❤️ [Contribute](#contribute)
34
+ - ❤️ [Contribute](#contribute)
35
35
  - 🏠 [Local Development](#local-development)
36
36
  - 🛟 [Professional Support](#professional-support)
37
37
  - 🔗 [Follow Us](#follow-us)
@@ -93,13 +93,13 @@ Discover our [list of modules](https://nuxt.com/modules) to supercharge your Nux
93
93
  We invite you to contribute and help improve Nuxt 💚
94
94
 
95
95
  Here are a few ways you can get involved:
96
- - **Reporting Bugs:** If you come across any bugs or issues, please check out the [reporting bugs guide](https://nuxt.com/docs/community/reporting-bugs) to learn how to submit a bug report.
97
- - **Suggestions:** Have ideas to enhance Nuxt? We'd love to hear them! Check out the [contribution guide](https://nuxt.com/docs/community/contribution) to share your suggestions.
98
- - **Questions:** If you have questions or need assistance, the [getting help guide](https://nuxt.com/docs/community/getting-help) provides resources to help you out.
96
+ - **Reporting Bugs:** If you come across any bugs or issues, please check out the [reporting bugs guide](https://nuxt.com/docs/4.x/community/reporting-bugs) to learn how to submit a bug report.
97
+ - **Suggestions:** Have ideas to enhance Nuxt? We'd love to hear them! Check out the [contribution guide](https://nuxt.com/docs/4.x/community/contribution) to share your suggestions.
98
+ - **Questions:** If you have questions or need assistance, the [getting help guide](https://nuxt.com/docs/4.x/community/getting-help) provides resources to help you out.
99
99
 
100
100
  ## <a name="local-development">🏠 Local Development</a>
101
101
 
102
- Follow the docs to [Set Up Your Local Development Environment](https://nuxt.com/docs/community/framework-contribution#setup) to contribute to the framework and documentation.
102
+ Follow the docs to [Set Up Your Local Development Environment](https://nuxt.com/docs/4.x/community/framework-contribution#setup) to contribute to the framework and documentation.
103
103
 
104
104
  ## <a name="professional-support">🛟 Professional Support</a>
105
105
 
package/dist/index.d.mts CHANGED
@@ -10,6 +10,15 @@ declare module 'nitropack' {
10
10
  buildAssetsDir: string;
11
11
  cdnURL: string;
12
12
  }
13
+ interface NitroRouteRules {
14
+ ssr?: boolean;
15
+ noScripts?: boolean;
16
+ /** @deprecated Use `noScripts` instead */
17
+ experimentalNoScripts?: boolean;
18
+ appMiddleware?: Record<string, boolean>;
19
+ }
20
+ }
21
+ declare module 'nitropack' {
13
22
  interface NitroRuntimeConfig extends RuntimeConfig {
14
23
  }
15
24
  interface NitroRouteConfig {
@@ -18,6 +27,25 @@ declare module 'nitropack' {
18
27
  /** @deprecated Use `noScripts` instead */
19
28
  experimentalNoScripts?: boolean;
20
29
  }
30
+ interface NitroRuntimeHooks {
31
+ 'dev:ssr-logs': (ctx: {
32
+ logs: LogObject[];
33
+ path: string;
34
+ }) => void | Promise<void>;
35
+ 'render:html': (htmlContext: NuxtRenderHTMLContext, context: {
36
+ event: H3Event;
37
+ }) => void | Promise<void>;
38
+ 'render:island': (islandResponse: NuxtIslandResponse, context: {
39
+ event: H3Event;
40
+ islandContext: NuxtIslandContext;
41
+ }) => void | Promise<void>;
42
+ }
43
+ }
44
+ declare module 'nitropack/types' {
45
+ interface NitroRuntimeConfigApp {
46
+ buildAssetsDir: string;
47
+ cdnURL: string;
48
+ }
21
49
  interface NitroRouteRules {
22
50
  ssr?: boolean;
23
51
  noScripts?: boolean;
@@ -25,6 +53,16 @@ declare module 'nitropack' {
25
53
  experimentalNoScripts?: boolean;
26
54
  appMiddleware?: Record<string, boolean>;
27
55
  }
56
+ }
57
+ declare module 'nitropack/types' {
58
+ interface NitroRuntimeConfig extends RuntimeConfig {
59
+ }
60
+ interface NitroRouteConfig {
61
+ ssr?: boolean;
62
+ noScripts?: boolean;
63
+ /** @deprecated Use `noScripts` instead */
64
+ experimentalNoScripts?: boolean;
65
+ }
28
66
  interface NitroRuntimeHooks {
29
67
  'dev:ssr-logs': (ctx: {
30
68
  logs: LogObject[];
package/dist/index.d.ts CHANGED
@@ -10,6 +10,15 @@ declare module 'nitropack' {
10
10
  buildAssetsDir: string;
11
11
  cdnURL: string;
12
12
  }
13
+ interface NitroRouteRules {
14
+ ssr?: boolean;
15
+ noScripts?: boolean;
16
+ /** @deprecated Use `noScripts` instead */
17
+ experimentalNoScripts?: boolean;
18
+ appMiddleware?: Record<string, boolean>;
19
+ }
20
+ }
21
+ declare module 'nitropack' {
13
22
  interface NitroRuntimeConfig extends RuntimeConfig {
14
23
  }
15
24
  interface NitroRouteConfig {
@@ -18,6 +27,25 @@ declare module 'nitropack' {
18
27
  /** @deprecated Use `noScripts` instead */
19
28
  experimentalNoScripts?: boolean;
20
29
  }
30
+ interface NitroRuntimeHooks {
31
+ 'dev:ssr-logs': (ctx: {
32
+ logs: LogObject[];
33
+ path: string;
34
+ }) => void | Promise<void>;
35
+ 'render:html': (htmlContext: NuxtRenderHTMLContext, context: {
36
+ event: H3Event;
37
+ }) => void | Promise<void>;
38
+ 'render:island': (islandResponse: NuxtIslandResponse, context: {
39
+ event: H3Event;
40
+ islandContext: NuxtIslandContext;
41
+ }) => void | Promise<void>;
42
+ }
43
+ }
44
+ declare module 'nitropack/types' {
45
+ interface NitroRuntimeConfigApp {
46
+ buildAssetsDir: string;
47
+ cdnURL: string;
48
+ }
21
49
  interface NitroRouteRules {
22
50
  ssr?: boolean;
23
51
  noScripts?: boolean;
@@ -25,6 +53,16 @@ declare module 'nitropack' {
25
53
  experimentalNoScripts?: boolean;
26
54
  appMiddleware?: Record<string, boolean>;
27
55
  }
56
+ }
57
+ declare module 'nitropack/types' {
58
+ interface NitroRuntimeConfig extends RuntimeConfig {
59
+ }
60
+ interface NitroRouteConfig {
61
+ ssr?: boolean;
62
+ noScripts?: boolean;
63
+ /** @deprecated Use `noScripts` instead */
64
+ experimentalNoScripts?: boolean;
65
+ }
28
66
  interface NitroRuntimeHooks {
29
67
  'dev:ssr-logs': (ctx: {
30
68
  logs: LogObject[];
package/dist/index.mjs CHANGED
@@ -17,7 +17,7 @@ import { isWindows } from 'std-env';
17
17
  import { ImpoundPlugin } from 'impound';
18
18
  import { resolveModulePath } from 'exsolve';
19
19
 
20
- const version = "3.20.2";
20
+ const version = "4.2.1";
21
21
 
22
22
  function toArray(value) {
23
23
  return Array.isArray(value) ? value : [value];
@@ -29,7 +29,7 @@ if (/(?:chunks|shared)$/.test(_distDir)) {
29
29
  const distDir = _distDir;
30
30
 
31
31
  const template = () => {
32
- return '<svg xmlns="http://www.w3.org/2000/svg" width="80" fill="none" class="nuxt-spa-loading" viewBox="0 0 37 25"><path d="M24.236 22.006h10.742L25.563 5.822l-8.979 14.31a4 4 0 0 1-3.388 1.874H2.978l11.631-20 5.897 10.567"/></svg><style>.nuxt-spa-loading{left:50%;position:fixed;top:50%;transform:translate(-50%,-50%)}.nuxt-spa-loading>path{fill:none;stroke:#00dc82;stroke-width:4px;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:128;stroke-dashoffset:128;animation:nuxt-spa-loading-move 3s linear infinite}@keyframes nuxt-spa-loading-move{to{stroke-dashoffset:-128}}</style>';
32
+ return '<svg xmlns="http://www.w3.org/2000/svg" width="80" fill="none" class="nuxt-spa-loading" viewBox="0 0 37 25"><path d="M24.236 22.006h10.742L25.563 5.822l-8.979 14.31a4 4 0 0 1-3.388 1.874H2.978l11.631-20 5.897 10.567"/></svg><style>.nuxt-spa-loading{left:50%;position:fixed;top:50%;transform:translate(-50%,-50%)}.nuxt-spa-loading>path{animation:nuxt-spa-loading-move 3s linear infinite;fill:none;stroke:#00dc82;stroke-dasharray:128;stroke-dashoffset:128;stroke-linecap:round;stroke-linejoin:round;stroke-width:4px}@keyframes nuxt-spa-loading-move{to{stroke-dashoffset:-128}}</style>';
33
33
  };
34
34
 
35
35
  function createImportProtectionPatterns(nuxt, options) {
@@ -44,13 +44,11 @@ function createImportProtectionPatterns(nuxt, options) {
44
44
  "Importing directly from a `nuxt.config` file is not allowed. Instead, use runtime config or a module."
45
45
  ]);
46
46
  patterns.push([/(^|node_modules\/)@vue\/composition-api/]);
47
- for (const mod of nuxt.options._installedModules) {
48
- if (mod.entryPath) {
49
- patterns.push([
50
- new RegExp(`^${escapeRE(mod.entryPath)}$`),
51
- "Importing directly from module entry-points is not allowed."
52
- ]);
53
- }
47
+ for (const mod of nuxt.options.modules.filter((m) => typeof m === "string")) {
48
+ patterns.push([
49
+ new RegExp(`^${escapeRE(mod)}$`),
50
+ "Importing directly from module entry-points is not allowed."
51
+ ]);
54
52
  }
55
53
  for (const i of [/(^|node_modules\/)@nuxt\/(cli|kit|test-utils)/, /(^|node_modules\/)nuxi/, /(^|node_modules\/)nitro(?:pack)?(?:-nightly)?(?:$|\/)(?!(?:dist\/)?(?:node_modules|presets|runtime|types))/, /(^|node_modules\/)nuxt\/(config|kit|schema)/]) {
56
54
  patterns.push([i, `This module cannot be imported in ${context}.`]);
@@ -94,7 +92,6 @@ const nitroSchemaTemplate = {
94
92
  /* typescript */
95
93
  `
96
94
  ${lines.join("\n")}
97
- /// <reference path="./schema.d.ts" />
98
95
 
99
96
  import type { RuntimeConfig } from 'nuxt/schema'
100
97
  import type { H3Event } from 'h3'
@@ -126,6 +123,31 @@ declare module 'nitropack' {
126
123
  'render:island': (islandResponse: NuxtIslandResponse, context: { event: H3Event, islandContext: NuxtIslandContext }) => void | Promise<void>
127
124
  }
128
125
  }
126
+ declare module 'nitropack/types' {
127
+ interface NitroRuntimeConfigApp {
128
+ buildAssetsDir: string
129
+ cdnURL: string
130
+ }
131
+ interface NitroRuntimeConfig extends RuntimeConfig {}
132
+ interface NitroRouteConfig {
133
+ ssr?: boolean
134
+ noScripts?: boolean
135
+ /** @deprecated Use \`noScripts\` instead */
136
+ experimentalNoScripts?: boolean
137
+ }
138
+ interface NitroRouteRules {
139
+ ssr?: boolean
140
+ noScripts?: boolean
141
+ /** @deprecated Use \`noScripts\` instead */
142
+ experimentalNoScripts?: boolean
143
+ appMiddleware?: Record<string, boolean>
144
+ }
145
+ interface NitroRuntimeHooks {
146
+ 'dev:ssr-logs': (ctx: { logs: LogObject[], path: string }) => void | Promise<void>
147
+ 'render:html': (htmlContext: NuxtRenderHTMLContext, context: { event: H3Event }) => void | Promise<void>
148
+ 'render:island': (islandResponse: NuxtIslandResponse, context: { event: H3Event, islandContext: NuxtIslandContext }) => void | Promise<void>
149
+ }
150
+ }
129
151
  `
130
152
  );
131
153
  }
@@ -180,8 +202,7 @@ async function bundle(nuxt) {
180
202
  const modules = await resolveNuxtModule(rootDirWithSlash, moduleEntryPaths);
181
203
  addTemplate(nitroSchemaTemplate);
182
204
  const sharedDirs = /* @__PURE__ */ new Set();
183
- const isNuxtV4 = nuxt.options.future?.compatibilityVersion === 4;
184
- if (isNuxtV4 && (nuxt.options.nitro.imports !== false && nuxt.options.imports.scan !== false)) {
205
+ if (nuxt.options.nitro.imports !== false && nuxt.options.imports.scan !== false) {
185
206
  for (const layer of nuxt.options._layers) {
186
207
  if (layer.config?.imports?.scan === false) {
187
208
  continue;
@@ -272,13 +293,13 @@ async function bundle(nuxt) {
272
293
  } : false,
273
294
  scanDirs: layerDirs.map((dirs) => dirs.server),
274
295
  renderer: resolve(distDir, "runtime/handlers/renderer"),
275
- errorHandler: resolve(distDir, "runtime/handlers/error"),
276
296
  nodeModulesDirs: nuxt.options.modulesDir,
277
297
  handlers: nuxt.options.serverHandlers,
278
298
  devHandlers: [],
279
299
  baseURL: nuxt.options.app.baseURL,
280
300
  virtual: {
281
- "#internal/nuxt.config.mjs": () => nuxt.vfs["#build/nuxt.config.mjs"],
301
+ "#internal/nuxt.config.mjs": () => nuxt.vfs["#build/nuxt.config.mjs"] || "",
302
+ "#internal/nuxt/app-config": () => nuxt.vfs["#build/app.config.mjs"]?.replace(/\/\*\* client \*\*\/[\s\S]*\/\*\* client-end \*\*\//, "") || "",
282
303
  "#spa-template": async () => `export const template = ${JSON.stringify(await spaLoadingTemplate(nuxt))}`,
283
304
  // this will be overridden in vite plugin
284
305
  "#internal/entry-chunk.mjs": () => `export const entryFileName = undefined`,
@@ -295,7 +316,8 @@ async function bundle(nuxt) {
295
316
  tsconfigPath: "tsconfig.server.json",
296
317
  tsConfig: {
297
318
  compilerOptions: {
298
- lib: ["esnext", "webworker", "dom.iterable"]
319
+ lib: ["esnext", "webworker", "dom.iterable"],
320
+ skipLibCheck: true
299
321
  },
300
322
  include: [
301
323
  join(nuxt.options.buildDir, "types/nitro-nuxt.d.ts"),
@@ -306,12 +328,10 @@ async function bundle(nuxt) {
306
328
  join(moduleDir, "dist/runtime/server")
307
329
  ];
308
330
  }),
309
- ...layerDirs.map((dirs) => relativeWithDot(nuxt.options.buildDir, join(dirs.server, "**/*"))),
310
331
  ...layerDirs.map((dirs) => relativeWithDot(nuxt.options.buildDir, join(dirs.shared, "**/*.d.ts")))
311
332
  ],
312
333
  exclude: [
313
334
  ...nuxt.options.modulesDir.map((m) => relativeWithDot(nuxt.options.buildDir, m)),
314
- // nitro generate output: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/core/nitro.ts#L186
315
335
  relativeWithDot(nuxt.options.buildDir, resolve(nuxt.options.rootDir, "dist"))
316
336
  ]
317
337
  }
@@ -375,16 +395,16 @@ async function bundle(nuxt) {
375
395
  "#internal/nuxt/paths": resolve(distDir, "runtime/utils/paths")
376
396
  },
377
397
  replace: {
378
- "process.env.NUXT_NO_SSR": nuxt.options.ssr === false,
379
- "process.env.NUXT_EARLY_HINTS": nuxt.options.experimental.writeEarlyHints !== false,
398
+ "process.env.NUXT_NO_SSR": String(nuxt.options.ssr === false),
399
+ "process.env.NUXT_EARLY_HINTS": String(nuxt.options.experimental.writeEarlyHints !== false),
380
400
  "process.env.NUXT_NO_SCRIPTS": String(nuxt.options.features.noScripts === "all" || !!nuxt.options.features.noScripts && !nuxt.options.dev),
381
- "process.env.NUXT_INLINE_STYLES": !!nuxt.options.features.inlineStyles,
401
+ "process.env.NUXT_INLINE_STYLES": String(!!nuxt.options.features.inlineStyles),
382
402
  "process.env.PARSE_ERROR_DATA": String(!!nuxt.options.experimental.parseErrorData),
383
- "process.env.NUXT_JSON_PAYLOADS": !!nuxt.options.experimental.renderJsonPayloads,
384
- "process.env.NUXT_ASYNC_CONTEXT": !!nuxt.options.experimental.asyncContext,
385
- "process.env.NUXT_SHARED_DATA": !!nuxt.options.experimental.sharedPrerenderData,
386
- "process.dev": nuxt.options.dev,
387
- "__VUE_PROD_DEVTOOLS__": false
403
+ "process.env.NUXT_JSON_PAYLOADS": String(!!nuxt.options.experimental.renderJsonPayloads),
404
+ "process.env.NUXT_ASYNC_CONTEXT": String(!!nuxt.options.experimental.asyncContext),
405
+ "process.env.NUXT_SHARED_DATA": String(!!nuxt.options.experimental.sharedPrerenderData),
406
+ "process.dev": String(nuxt.options.dev),
407
+ "__VUE_PROD_DEVTOOLS__": String(false)
388
408
  },
389
409
  rollupConfig: {
390
410
  output: {
@@ -397,6 +417,17 @@ async function bundle(nuxt) {
397
417
  },
398
418
  logLevel: logLevelMapReverse[nuxt.options.logLevel]
399
419
  });
420
+ if (nuxt.options.experimental.serverAppConfig && nitroConfig.imports) {
421
+ nitroConfig.imports.imports ||= [];
422
+ nitroConfig.imports.imports.push({
423
+ name: "useAppConfig",
424
+ from: resolve(distDir, "runtime/utils/app-config"),
425
+ priority: -1
426
+ });
427
+ }
428
+ if (!nitroConfig.errorHandler && (nuxt.options.dev || !nuxt.options.experimental.noVueServer)) {
429
+ nitroConfig.errorHandler = resolve(distDir, "runtime/handlers/error");
430
+ }
400
431
  nitroConfig.srcDir = resolve(nuxt.options.rootDir, nuxt.options.srcDir, nitroConfig.srcDir);
401
432
  nitroConfig.ignore ||= [];
402
433
  nitroConfig.ignore.push(
@@ -432,16 +463,6 @@ async function bundle(nuxt) {
432
463
  await promises.writeFile(join(tempDir, `meta/${buildId}.json`), JSON.stringify({}));
433
464
  });
434
465
  }
435
- if (nuxt.options.future.compatibilityVersion !== 4) {
436
- nuxt.hook("nitro:config", (config) => {
437
- for (const value of Object.values(config.routeRules || {})) {
438
- if ("experimentalNoScripts" in value) {
439
- value.noScripts = value.experimentalNoScripts;
440
- delete value.experimentalNoScripts;
441
- }
442
- }
443
- });
444
- }
445
466
  nuxt.hook("nitro:config", (config) => {
446
467
  config.alias ||= {};
447
468
  config.alias["#app-manifest"] = join(tempDir, `meta/${buildId}.json`);
@@ -535,13 +556,6 @@ async function bundle(nuxt) {
535
556
  nitroConfig.virtual["#build/dist/server/styles.mjs".replace(FORWARD_SLASH_RE, "\\")] = "export default {}";
536
557
  }
537
558
  }
538
- if (nuxt.options.experimental.respectNoSSRHeader) {
539
- nitroConfig.handlers ||= [];
540
- nitroConfig.handlers.push({
541
- handler: resolve(distDir, "runtime/middleware/no-ssr"),
542
- middleware: true
543
- });
544
- }
545
559
  nitroConfig.rollupConfig.plugins = await nitroConfig.rollupConfig.plugins || [];
546
560
  nitroConfig.rollupConfig.plugins = toArray(nitroConfig.rollupConfig.plugins);
547
561
  const sharedDir = withTrailingSlash(resolve(nuxt.options.rootDir, nuxt.options.dir.shared));
@@ -688,6 +702,7 @@ async function bundle(nuxt) {
688
702
  if (!nuxt.options.dev && nuxt.options.experimental.noVueServer) {
689
703
  nitro.hooks.hook("rollup:before", (nitro2) => {
690
704
  if (nitro2.options.preset === "nitro-prerender") {
705
+ nitro2.options.errorHandler = resolve(distDir, "runtime/handlers/error");
691
706
  return;
692
707
  }
693
708
  const nuxtErrorHandler = nitro2.options.handlers.findIndex((h) => h.route === "/__nuxt_error");
@@ -695,9 +710,13 @@ async function bundle(nuxt) {
695
710
  nitro2.options.handlers.splice(nuxtErrorHandler, 1);
696
711
  }
697
712
  nitro2.options.renderer = void 0;
698
- nitro2.options.errorHandler = "#internal/nitro/error";
699
713
  });
700
714
  }
715
+ nitro.hooks.hook("types:extend", (types) => {
716
+ types.tsConfig ||= {};
717
+ const rootDirGlob = relativeWithDot(nuxt.options.buildDir, join(nuxt.options.rootDir, "**/*"));
718
+ types.tsConfig.include = types.tsConfig.include?.filter((i) => i !== rootDirGlob);
719
+ });
701
720
  nuxt.hook("prepare:types", async (opts) => {
702
721
  if (!nuxt.options.dev) {
703
722
  await scanHandlers(nitro);
@@ -705,7 +724,21 @@ async function bundle(nuxt) {
705
724
  }
706
725
  opts.tsConfig.exclude ||= [];
707
726
  opts.tsConfig.exclude.push(relative(nuxt.options.buildDir, resolve(nuxt.options.rootDir, nitro.options.output.dir)));
727
+ opts.tsConfig.exclude.push(relative(nuxt.options.buildDir, resolve(nuxt.options.rootDir, nuxt.options.serverDir)));
708
728
  opts.references.push({ path: resolve(nuxt.options.buildDir, "types/nitro.d.ts") });
729
+ opts.sharedTsConfig.compilerOptions ||= {};
730
+ opts.sharedTsConfig.compilerOptions.paths ||= {};
731
+ for (const key in nuxt.options.alias) {
732
+ if (nitro.options.alias[key] && nitro.options.alias[key] === nuxt.options.alias[key]) {
733
+ const dirKey = join(key, "*");
734
+ if (opts.tsConfig.compilerOptions?.paths[key]) {
735
+ opts.sharedTsConfig.compilerOptions.paths[key] = opts.tsConfig.compilerOptions.paths[key];
736
+ }
737
+ if (opts.tsConfig.compilerOptions?.paths[dirKey]) {
738
+ opts.sharedTsConfig.compilerOptions.paths[dirKey] = opts.tsConfig.compilerOptions.paths[dirKey];
739
+ }
740
+ }
741
+ }
709
742
  });
710
743
  if (nitro.options.static) {
711
744
  nitro.hooks.hook("prerender:routes", (routes) => {
@@ -1,3 +1,3 @@
1
- import type { NitroErrorHandler } from 'nitropack';
1
+ import type { NitroErrorHandler } from 'nitropack/types';
2
2
  declare const _default: NitroErrorHandler;
3
3
  export default _default;
@@ -1,8 +1,7 @@
1
1
  import { joinURL, withQuery, withoutBase } from "ufo";
2
2
  import { appendResponseHeader, getRequestHeaders, send, setResponseHeader, setResponseHeaders, setResponseStatus } from "h3";
3
+ import { useNitroApp, useRuntimeConfig } from "nitropack/runtime";
3
4
  import { isJsonRequest } from "../utils/error.js";
4
- import { useRuntimeConfig } from "#internal/nitro";
5
- import { useNitroApp } from "#internal/nitro/app";
6
5
  import { generateErrorOverlayHTML } from "../utils/dev.js";
7
6
  export default (async function errorhandler(error, event, { defaultHandler }) {
8
7
  if (event.handled || isJsonRequest(event)) {
@@ -56,7 +55,7 @@ export default (async function errorhandler(error, event, { defaultHandler }) {
56
55
  setResponseHeader(event, header, value);
57
56
  }
58
57
  setResponseStatus(event, res.status && res.status !== 200 ? res.status : defaultRes.status, res.statusText || defaultRes.statusText);
59
- if (import.meta.dev && !import.meta.test && typeof html === "string") {
58
+ if (import.meta.dev) {
60
59
  const prettyResponse = await defaultHandler(error, event, { json: false });
61
60
  return send(event, html.replace("</body>", `${generateErrorOverlayHTML(prettyResponse.body, { startMinimized: 300 <= statusCode && statusCode < 500 })}</body>`));
62
61
  }
@@ -1,4 +1,4 @@
1
- import type { RenderResponse } from 'nitropack';
1
+ import type { RenderResponse } from 'nitropack/types';
2
2
  import type { NuxtIslandResponse } from 'nuxt/app';
3
3
  declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<NuxtIslandResponse | Partial<RenderResponse>>>;
4
4
  export default _default;
@@ -1,3 +1,4 @@
1
+ import { useNitroApp } from "nitropack/runtime";
1
2
  import { destr } from "destr";
2
3
  import { defineEventHandler, getQuery, readBody, setResponseHeaders } from "h3";
3
4
  import { resolveUnrefHeadInput } from "@unhead/vue";
@@ -8,7 +9,6 @@ import { createSSRContext } from "../utils/renderer/app.js";
8
9
  import { getSSRRenderer } from "../utils/renderer/build-files.js";
9
10
  import { renderInlineStyles } from "../utils/renderer/inline-styles.js";
10
11
  import { getClientIslandResponse, getServerComponentHTML, getSlotIslandResponse } from "../utils/renderer/islands.js";
11
- import { useNitroApp } from "#internal/nitro";
12
12
  const ISLAND_SUFFIX_RE = /\.json(?:\?.*)?$/;
13
13
  export default defineEventHandler(async (event) => {
14
14
  const nitroApp = useNitroApp();
@@ -64,8 +64,6 @@ export default defineEventHandler(async (event) => {
64
64
  islandHead[key] = value;
65
65
  }
66
66
  }
67
- islandHead.link ||= [];
68
- islandHead.style ||= [];
69
67
  const islandResponse = {
70
68
  id: islandContext.id,
71
69
  head: islandHead,
@@ -4,5 +4,5 @@ export interface NuxtRenderResponse {
4
4
  statusMessage?: string;
5
5
  headers: Record<string, string>;
6
6
  }
7
- declare const _default: any;
7
+ declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<any>>;
8
8
  export default _default;
@@ -10,13 +10,13 @@ import { appendResponseHeader, createError, getQuery, getResponseStatus, getResp
10
10
  import { getQuery as getURLQuery, joinURL } from "ufo";
11
11
  import { propsToString, renderSSRHead } from "@unhead/vue/server";
12
12
  import destr from "destr";
13
+ import { defineRenderHandler, getRouteRules, useNitroApp } from "nitropack/runtime";
13
14
  import { getRenderer } from "../utils/renderer/build-files.js";
14
15
  import { payloadCache } from "../utils/cache.js";
15
16
  import { renderPayloadJsonScript, renderPayloadResponse, renderPayloadScript, splitPayload } from "../utils/renderer/payload.js";
16
17
  import { createSSRContext, setSSRError } from "../utils/renderer/app.js";
17
18
  import { renderInlineStyles } from "../utils/renderer/inline-styles.js";
18
19
  import { replaceIslandTeleports } from "../utils/renderer/islands.js";
19
- import { defineRenderHandler, getRouteRules, useNitroApp } from "#internal/nitro";
20
20
  import { renderSSRHeadOptions } from "#internal/unhead.config.mjs";
21
21
  import { appHead, appTeleportAttrs, appTeleportTag, componentIslands, appManifest as isAppManifestEnabled } from "#internal/nuxt.config.mjs";
22
22
  import entryIds from "#internal/nuxt/entry-ids.mjs";
@@ -1,3 +1,3 @@
1
- import type { NitroApp } from '#internal/nitro/app';
1
+ import type { NitroApp } from 'nitropack/types';
2
2
  declare const _default: (nitroApp: NitroApp) => void;
3
3
  export default _default;
@@ -67,7 +67,7 @@ export default (nitroApp) => {
67
67
  htmlContext.bodyAppend.unshift(`<script type="application/json" data-nuxt-logs="${appId}">${stringify(ctx.logs, reducers)}<\/script>`);
68
68
  } catch (e) {
69
69
  const shortError = e instanceof Error && "toString" in e ? ` Received \`${e.toString()}\`.` : "";
70
- console.warn(`[nuxt] Failed to stringify dev server logs.${shortError} You can define your own reducer/reviver for rich types following the instructions in https://nuxt.com/docs/api/composables/use-nuxt-app#payload.`);
70
+ console.warn(`[nuxt] Failed to stringify dev server logs.${shortError} You can define your own reducer/reviver for rich types following the instructions in https://nuxt.com/docs/4.x/api/composables/use-nuxt-app#payload.`);
71
71
  }
72
72
  });
73
73
  };
@@ -1,2 +1,2 @@
1
- export type DefaultMessages = Record<"appName" | "version" | "statusCode" | "statusMessage" | "description", string | boolean | number>;
1
+ export type DefaultMessages = Record<"appName" | "statusCode" | "statusMessage" | "description" | "refresh", string | boolean | number>;
2
2
  export declare const template: (messages: Partial<DefaultMessages>) => string;
@@ -1,6 +1,6 @@
1
1
  import { escapeHtml } from "@vue/shared";
2
- const _messages = { "appName": "Nuxt", "version": "", "statusCode": 500, "statusMessage": "Server error", "description": "This page is temporarily unavailable." };
2
+ const _messages = { "appName": "Nuxt", "statusCode": 500, "statusMessage": "Internal server error", "description": "This page is temporarily unavailable.", "refresh": "Refresh this page" };
3
3
  export const template = (messages) => {
4
4
  messages = { ..._messages, ...messages };
5
- return '<!DOCTYPE html><html lang="en"><head><title>' + escapeHtml(messages.statusCode) + " - " + escapeHtml(messages.statusMessage) + " | " + escapeHtml(messages.appName) + `</title><meta charset="utf-8"><meta content="width=device-width,initial-scale=1.0,minimum-scale=1.0" name="viewport"><style>.spotlight{background:linear-gradient(45deg,#00dc82,#36e4da 50%,#0047e1);filter:blur(20vh)}*,:after,:before{border-color:var(--un-default-border-color,#e5e7eb);border-style:solid;border-width:0;box-sizing:border-box}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}h1{font-size:inherit;font-weight:inherit}h1,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }.fixed{position:fixed}.-bottom-1\\/2{bottom:-50%}.left-0{left:0}.right-0{right:0}.grid{display:grid}.mb-16{margin-bottom:4rem}.mb-8{margin-bottom:2rem}.h-1\\/2{height:50%}.max-w-520px{max-width:520px}.min-h-screen{min-height:100vh}.place-content-center{place-content:center}.overflow-hidden{overflow:hidden}.bg-white{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-8{padding-left:2rem;padding-right:2rem}.text-center{text-align:center}.text-8xl{font-size:6rem;line-height:1}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-black{--un-text-opacity:1;color:rgb(0 0 0/var(--un-text-opacity))}.font-light{font-weight:300}.font-medium{font-weight:500}.leading-tight{line-height:1.25}.font-sans{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media(prefers-color-scheme:dark){.dark\\:bg-black{--un-bg-opacity:1;background-color:rgb(0 0 0/var(--un-bg-opacity))}.dark\\:text-white{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media(min-width:640px){.sm\\:px-0{padding-left:0;padding-right:0}.sm\\:text-4xl{font-size:2.25rem;line-height:2.5rem}}</style><script>!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver((e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)})).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();<\/script></head><body class="antialiased bg-white dark:bg-black dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-black"><div class="-bottom-1/2 fixed h-1/2 left-0 right-0 spotlight"></div><div class="max-w-520px text-center"><h1 class="font-medium mb-8 sm:text-10xl text-8xl">` + escapeHtml(messages.statusCode) + '</h1><p class="font-light leading-tight mb-16 px-8 sm:px-0 sm:text-4xl text-xl">' + escapeHtml(messages.description) + "</p></div></body></html>";
5
+ return '<!DOCTYPE html><html lang="en"><head><title>' + escapeHtml(messages.statusCode) + " - " + escapeHtml(messages.statusMessage) + " | " + escapeHtml(messages.appName) + `</title><meta charset="utf-8"><meta content="width=device-width,initial-scale=1.0,minimum-scale=1.0" name="viewport"><script>!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();<\/script><style>*,:after,:before{border-color:var(--un-default-border-color,#e5e7eb);border-style:solid;border-width:0;box-sizing:border-box}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}h1,h2{font-size:inherit;font-weight:inherit}h1,h2,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }.grid{display:grid}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.max-w-520px{max-width:520px}.min-h-screen{min-height:100vh}.place-content-center{place-content:center}.overflow-hidden{overflow:hidden}.bg-white{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-2{padding-left:.5rem;padding-right:.5rem}.text-center{text-align:center}.text-\\[80px\\]{font-size:80px}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\\[\\#020420\\]{--un-text-opacity:1;color:rgb(2 4 32/var(--un-text-opacity))}.text-\\[\\#64748B\\]{--un-text-opacity:1;color:rgb(100 116 139/var(--un-text-opacity))}.font-semibold{font-weight:600}.leading-none{line-height:1}.tracking-wide{letter-spacing:.025em}.font-sans{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.tabular-nums{--un-numeric-spacing:tabular-nums;font-variant-numeric:var(--un-ordinal) var(--un-slashed-zero) var(--un-numeric-figure) var(--un-numeric-spacing) var(--un-numeric-fraction)}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media(prefers-color-scheme:dark){.dark\\:bg-\\[\\#020420\\]{--un-bg-opacity:1;background-color:rgb(2 4 32/var(--un-bg-opacity))}.dark\\:text-white{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media(min-width:640px){.sm\\:text-\\[110px\\]{font-size:110px}.sm\\:text-3xl{font-size:1.875rem;line-height:2.25rem}}</style></head><body class="antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide"><div class="max-w-520px text-center"><h1 class="font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]">` + escapeHtml(messages.statusCode) + '</h1><h2 class="font-semibold mb-2 sm:text-3xl text-2xl">' + escapeHtml(messages.statusMessage) + '</h2><p class="mb-4 px-2 text-[#64748B] text-md">' + escapeHtml(messages.description) + "</p></div></body></html>";
6
6
  };
@@ -0,0 +1,2 @@
1
+ import type { H3Event } from 'h3';
2
+ export declare function useAppConfig(event?: H3Event): any;
@@ -0,0 +1,25 @@
1
+ import { klona } from "klona";
2
+ import _inlineAppConfig from "#internal/nuxt/app-config";
3
+ const _sharedAppConfig = _deepFreeze(klona(_inlineAppConfig));
4
+ export function useAppConfig(event) {
5
+ if (!event) {
6
+ return _sharedAppConfig;
7
+ }
8
+ event.context.nuxt ||= {};
9
+ if (event.context.nuxt.appConfig) {
10
+ return event.context.nuxt.appConfig;
11
+ }
12
+ const appConfig = klona(_inlineAppConfig);
13
+ event.context.nuxt.appConfig = appConfig;
14
+ return appConfig;
15
+ }
16
+ function _deepFreeze(object) {
17
+ const propNames = Object.getOwnPropertyNames(object);
18
+ for (const name of propNames) {
19
+ const value = object[name];
20
+ if (value && typeof value === "object") {
21
+ _deepFreeze(value);
22
+ }
23
+ }
24
+ return Object.freeze(object);
25
+ }
@@ -1,6 +1,6 @@
1
- export declare const payloadCache: any;
2
- export declare const islandCache: any;
3
- export declare const islandPropCache: any;
1
+ export declare const payloadCache: import("unstorage").Storage<import("unstorage").StorageValue> | null;
2
+ export declare const islandCache: import("unstorage").Storage<import("unstorage").StorageValue> | null;
3
+ export declare const islandPropCache: import("unstorage").Storage<import("unstorage").StorageValue> | null;
4
4
  export declare const sharedPrerenderPromises: Map<string, Promise<any>> | null;
5
5
  export declare const sharedPrerenderCache: {
6
6
  get<T = unknown>(key: string): Promise<T> | undefined;
@@ -1,4 +1,4 @@
1
- import { useStorage } from "#internal/nitro";
1
+ import { useStorage } from "nitropack/runtime";
2
2
  import process from "node:process";
3
3
  export const payloadCache = import.meta.prerender ? useStorage("internal:nuxt:prerender:payload") : null;
4
4
  export const islandCache = import.meta.prerender ? useStorage("internal:nuxt:prerender:island") : null;
@@ -1,5 +1,5 @@
1
1
  import { joinRelativeURL } from "ufo";
2
- import { useRuntimeConfig } from "#internal/nitro";
2
+ import { useRuntimeConfig } from "nitropack/runtime";
3
3
  export function baseURL() {
4
4
  return useRuntimeConfig().app.baseURL;
5
5
  }
@@ -1,7 +1,7 @@
1
1
  import process from "node:process";
2
+ import { useRuntimeConfig } from "nitropack/runtime";
2
3
  import { createHead } from "@unhead/vue/server";
3
4
  import { sharedPrerenderCache } from "../cache.js";
4
- import { useRuntimeConfig } from "#internal/nitro";
5
5
  import unheadOptions from "#internal/unhead-options.mjs";
6
6
  const PRERENDER_NO_SSR_ROUTES = /* @__PURE__ */ new Set(["/index.html", "/200.html", "/404.html"]);
7
7
  export function createSSRContext(event) {
@@ -2,7 +2,7 @@ import process from "node:process";
2
2
  import { createRenderer } from "vue-bundle-renderer/runtime";
3
3
  import { renderToString as _renderToString } from "vue/server-renderer";
4
4
  import { propsToString } from "@unhead/vue/server";
5
- import { useRuntimeConfig } from "#internal/nitro";
5
+ import { useRuntimeConfig } from "nitropack/runtime";
6
6
  import { appRootAttrs, appRootTag, appSpaLoaderAttrs, appSpaLoaderTag, spaLoadingTemplateOutside } from "#internal/nuxt.config.mjs";
7
7
  import { buildAssetsURL } from "#internal/nuxt/paths";
8
8
  const APP_ROOT_OPEN_TAG = `<${appRootTag}${propsToString(appRootAttrs)}>`;
@@ -27,8 +27,8 @@ export declare function splitPayload(ssrContext: NuxtSSRContext): {
27
27
  state?: Record<string, any> | undefined;
28
28
  once?: Set<string> | undefined;
29
29
  config?: Pick<import("nuxt/schema").RuntimeConfig, "public" | "app"> | undefined;
30
- error?: (import("nuxt/app").NuxtError | import("nuxt/app/defaults").DefaultErrorValue) | undefined;
31
- _errors?: Record<string, import("nuxt/app").NuxtError<unknown> | null> | undefined;
30
+ error?: import("nuxt/app").NuxtError<unknown> | undefined;
31
+ _errors?: Record<string, import("nuxt/app").NuxtError<unknown> | undefined> | undefined;
32
32
  };
33
33
  payload: {
34
34
  data: Record<string, any> | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nuxt/nitro-server",
3
- "version": "3.20.2",
3
+ "version": "4.2.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/nuxt/nuxt.git",
@@ -20,14 +20,14 @@
20
20
  "dependencies": {
21
21
  "@nuxt/devalue": "^2.0.2",
22
22
  "@unhead/vue": "^2.0.19",
23
- "@vue/shared": "^3.5.25",
23
+ "@vue/shared": "^3.5.23",
24
24
  "consola": "^3.4.2",
25
25
  "defu": "^6.1.4",
26
26
  "destr": "^2.0.5",
27
- "devalue": "^5.6.0",
27
+ "devalue": "^5.4.2",
28
28
  "errx": "^0.1.0",
29
29
  "escape-string-regexp": "^5.0.0",
30
- "exsolve": "^1.0.8",
30
+ "exsolve": "^1.0.7",
31
31
  "h3": "^1.15.4",
32
32
  "impound": "^1.0.0",
33
33
  "klona": "^2.0.6",
@@ -39,20 +39,20 @@
39
39
  "std-env": "^3.10.0",
40
40
  "ufo": "^1.6.1",
41
41
  "unctx": "^2.4.1",
42
- "unstorage": "^1.17.3",
43
- "vue": "^3.5.25",
42
+ "unstorage": "^1.17.2",
43
+ "vue": "^3.5.23",
44
44
  "vue-bundle-renderer": "^2.2.0",
45
45
  "vue-devtools-stub": "^0.1.0",
46
- "@nuxt/kit": "3.20.2"
46
+ "@nuxt/kit": "4.2.1"
47
47
  },
48
48
  "peerDependencies": {
49
- "nuxt": "^3.20.2"
49
+ "nuxt": "^4.2.1"
50
50
  },
51
51
  "devDependencies": {
52
52
  "unbuild": "3.6.1",
53
53
  "vitest": "3.2.4",
54
- "@nuxt/schema": "3.20.2",
55
- "nuxt": "3.20.2"
54
+ "nuxt": "4.2.1",
55
+ "@nuxt/schema": "4.2.1"
56
56
  },
57
57
  "engines": {
58
58
  "node": "^20.19.0 || >=22.12.0"