@nuxt/nitro-server-nightly 4.3.0-29465977.c4f46c64 → 4.3.0-29466366.fa21bb17

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.
Files changed (63) hide show
  1. package/dist/index.d.mts +177 -177
  2. package/dist/index.mjs +664 -835
  3. package/dist/runtime/handlers/{error.d.ts → error.d.mts} +1 -1
  4. package/dist/runtime/handlers/error.mjs +77 -0
  5. package/dist/runtime/handlers/island.d.mts +2 -0
  6. package/dist/runtime/handlers/island.mjs +120 -0
  7. package/dist/runtime/handlers/renderer.d.mts +2 -0
  8. package/dist/runtime/handlers/renderer.mjs +298 -0
  9. package/dist/runtime/middleware/no-ssr.d.mts +2 -0
  10. package/dist/runtime/middleware/no-ssr.mjs +7 -0
  11. package/dist/runtime/plugins/dev-server-logs.d.mts +2 -0
  12. package/dist/runtime/plugins/dev-server-logs.mjs +94 -0
  13. package/dist/runtime/templates/error-500.mjs +15 -0
  14. package/dist/runtime/utils/app-config.d.mts +3 -0
  15. package/dist/runtime/utils/app-config.mjs +31 -0
  16. package/dist/runtime/utils/cache.d.mts +5 -0
  17. package/dist/runtime/utils/{cache.js → cache.mjs} +13 -12
  18. package/dist/runtime/utils/config.d.mts +1 -0
  19. package/dist/runtime/utils/{dev.d.ts → dev.d.mts} +1 -1
  20. package/dist/runtime/utils/{dev.js → dev.mjs} +15 -27
  21. package/dist/runtime/utils/error.d.mts +6 -0
  22. package/dist/runtime/utils/error.mjs +15 -0
  23. package/dist/runtime/utils/paths.mjs +19 -0
  24. package/dist/runtime/utils/renderer/{app.d.ts → app.d.mts} +4 -4
  25. package/dist/runtime/utils/renderer/app.mjs +39 -0
  26. package/dist/runtime/utils/renderer/build-files.d.mts +18 -0
  27. package/dist/runtime/utils/renderer/build-files.mjs +100 -0
  28. package/dist/runtime/utils/renderer/{inline-styles.d.ts → inline-styles.d.mts} +1 -1
  29. package/dist/runtime/utils/renderer/inline-styles.mjs +13 -0
  30. package/dist/runtime/utils/renderer/{islands.d.ts → islands.d.mts} +5 -5
  31. package/dist/runtime/utils/renderer/islands.mjs +87 -0
  32. package/dist/runtime/utils/renderer/payload.d.mts +24 -0
  33. package/dist/runtime/utils/renderer/payload.mjs +64 -0
  34. package/package.json +8 -8
  35. package/dist/index.d.ts +0 -185
  36. package/dist/runtime/handlers/error.js +0 -65
  37. package/dist/runtime/handlers/island.d.ts +0 -4
  38. package/dist/runtime/handlers/island.js +0 -101
  39. package/dist/runtime/handlers/renderer.d.ts +0 -2
  40. package/dist/runtime/handlers/renderer.js +0 -237
  41. package/dist/runtime/middleware/no-ssr.d.ts +0 -2
  42. package/dist/runtime/middleware/no-ssr.js +0 -7
  43. package/dist/runtime/plugins/dev-server-logs.d.ts +0 -3
  44. package/dist/runtime/plugins/dev-server-logs.js +0 -82
  45. package/dist/runtime/templates/error-500.js +0 -6
  46. package/dist/runtime/utils/app-config.d.ts +0 -3
  47. package/dist/runtime/utils/app-config.js +0 -25
  48. package/dist/runtime/utils/cache-driver.d.ts +0 -6
  49. package/dist/runtime/utils/cache.d.ts +0 -8
  50. package/dist/runtime/utils/config.d.ts +0 -1
  51. package/dist/runtime/utils/error.d.ts +0 -6
  52. package/dist/runtime/utils/error.js +0 -11
  53. package/dist/runtime/utils/paths.js +0 -16
  54. package/dist/runtime/utils/renderer/app.js +0 -34
  55. package/dist/runtime/utils/renderer/build-files.d.ts +0 -16
  56. package/dist/runtime/utils/renderer/build-files.js +0 -86
  57. package/dist/runtime/utils/renderer/inline-styles.js +0 -13
  58. package/dist/runtime/utils/renderer/islands.js +0 -82
  59. package/dist/runtime/utils/renderer/payload.d.ts +0 -24
  60. package/dist/runtime/utils/renderer/payload.js +0 -67
  61. /package/dist/runtime/templates/{error-500.d.ts → error-500.d.mts} +0 -0
  62. /package/dist/runtime/utils/{config.js → config.mjs} +0 -0
  63. /package/dist/runtime/utils/{paths.d.ts → paths.d.mts} +0 -0
package/dist/index.d.ts DELETED
@@ -1,185 +0,0 @@
1
- import { Nuxt } from '@nuxt/schema';
2
- import { NitroConfig, Nitro, NitroEventHandler, NitroDevEventHandler, NitroRuntimeConfigApp, NitroRuntimeConfig, NitroOptions, NitroRouteConfig } from 'nitropack/types';
3
- import { H3Event, EventHandler } from 'h3';
4
- import { LogObject } from 'consola';
5
- import { NuxtRenderHTMLContext, NuxtIslandResponse, NuxtIslandContext } from 'nuxt/app';
6
- import { RuntimeConfig, HookResult, TSReference } from 'nuxt/schema';
7
-
8
- declare module 'nitropack' {
9
- interface NitroRuntimeConfigApp {
10
- buildAssetsDir: string;
11
- cdnURL: string;
12
- }
13
- interface NitroRouteRules {
14
- ssr?: boolean;
15
- noScripts?: boolean;
16
- /** @deprecated Use `noScripts` instead */
17
- experimentalNoScripts?: boolean;
18
- appMiddleware?: Record<string, boolean>;
19
- appLayout?: string | false;
20
- }
21
- }
22
- declare module 'nitropack' {
23
- interface NitroRuntimeConfig extends RuntimeConfig {
24
- }
25
- interface NitroRouteConfig {
26
- ssr?: boolean;
27
- noScripts?: boolean;
28
- /** @deprecated Use `noScripts` instead */
29
- experimentalNoScripts?: boolean;
30
- }
31
- interface NitroRuntimeHooks {
32
- 'dev:ssr-logs': (ctx: {
33
- logs: LogObject[];
34
- path: string;
35
- }) => void | Promise<void>;
36
- 'render:html': (htmlContext: NuxtRenderHTMLContext, context: {
37
- event: H3Event;
38
- }) => void | Promise<void>;
39
- 'render:island': (islandResponse: NuxtIslandResponse, context: {
40
- event: H3Event;
41
- islandContext: NuxtIslandContext;
42
- }) => void | Promise<void>;
43
- }
44
- }
45
- declare module 'nitropack/types' {
46
- interface NitroRuntimeConfigApp {
47
- buildAssetsDir: string;
48
- cdnURL: string;
49
- }
50
- interface NitroRouteRules {
51
- ssr?: boolean;
52
- noScripts?: boolean;
53
- /** @deprecated Use `noScripts` instead */
54
- experimentalNoScripts?: boolean;
55
- appMiddleware?: Record<string, boolean>;
56
- appLayout?: string | false;
57
- }
58
- }
59
- declare module 'nitropack/types' {
60
- interface NitroRuntimeConfig extends RuntimeConfig {
61
- }
62
- interface NitroRouteConfig {
63
- ssr?: boolean;
64
- noScripts?: boolean;
65
- /** @deprecated Use `noScripts` instead */
66
- experimentalNoScripts?: boolean;
67
- }
68
- interface NitroRuntimeHooks {
69
- 'dev:ssr-logs': (ctx: {
70
- logs: LogObject[];
71
- path: string;
72
- }) => void | Promise<void>;
73
- 'render:html': (htmlContext: NuxtRenderHTMLContext, context: {
74
- event: H3Event;
75
- }) => void | Promise<void>;
76
- 'render:island': (islandResponse: NuxtIslandResponse, context: {
77
- event: H3Event;
78
- islandContext: NuxtIslandContext;
79
- }) => void | Promise<void>;
80
- }
81
- }
82
- declare module '@nuxt/schema' {
83
- interface NuxtHooks {
84
- /**
85
- * Called when the dev middleware is being registered on the Nitro dev server.
86
- * @param handler the Vite or Webpack event handler
87
- * @returns Promise
88
- */
89
- 'server:devHandler': (handler: EventHandler) => HookResult;
90
- /**
91
- * Called before Nitro writes `.nuxt/tsconfig.server.json`, allowing addition of custom references and declarations.
92
- * @param options Objects containing `references`, `declarations`
93
- * @returns Promise
94
- */
95
- 'nitro:prepare:types': (options: {
96
- references: TSReference[];
97
- declarations: string[];
98
- }) => HookResult;
99
- /**
100
- * Called before initializing Nitro, allowing customization of Nitro's configuration.
101
- * @param nitroConfig The nitro config to be extended
102
- * @returns Promise
103
- */
104
- 'nitro:config': (nitroConfig: NitroConfig) => HookResult;
105
- /**
106
- * Called after Nitro is initialized, which allows registering Nitro hooks and interacting directly with Nitro.
107
- * @param nitro The created nitro object
108
- * @returns Promise
109
- */
110
- 'nitro:init': (nitro: Nitro) => HookResult;
111
- /**
112
- * Called before building the Nitro instance.
113
- * @param nitro The created nitro object
114
- * @returns Promise
115
- */
116
- 'nitro:build:before': (nitro: Nitro) => HookResult;
117
- /**
118
- * Called after copying public assets. Allows modifying public assets before Nitro server is built.
119
- * @param nitro The created nitro object
120
- * @returns Promise
121
- */
122
- 'nitro:build:public-assets': (nitro: Nitro) => HookResult;
123
- }
124
- interface ConfigSchema {
125
- /**
126
- * Configuration for Nitro.
127
- *
128
- * @see [Nitro configuration docs](https://nitro.build/config)
129
- */
130
- nitro: NitroConfig;
131
- /**
132
- * Global route options applied to matching server routes.
133
- *
134
- * @experimental This is an experimental feature and API may change in the future.
135
- *
136
- * @see [Nitro route rules documentation](https://nitro.build/config#routerules)
137
- */
138
- routeRules: NitroConfig['routeRules'];
139
- /**
140
- * Nitro server handlers.
141
- *
142
- * Each handler accepts the following options:
143
- * - handler: The path to the file defining the handler. - route: The route under which the handler is available. This follows the conventions of [rou3](https://github.com/h3js/rou3). - method: The HTTP method of requests that should be handled. - middleware: Specifies whether it is a middleware handler. - lazy: Specifies whether to use lazy loading to import the handler.
144
- *
145
- * @see [`server/` directory documentation](https://nuxt.com/docs/4.x/directory-structure/server)
146
- *
147
- * @note Files from `server/api`, `server/middleware` and `server/routes` will be automatically registered by Nuxt.
148
- *
149
- * @example
150
- * ```js
151
- * serverHandlers: [
152
- * { route: '/path/foo/**:name', handler: '~/server/foohandler.ts' }
153
- * ]
154
- * ```
155
- */
156
- serverHandlers: NitroEventHandler[];
157
- /**
158
- * Nitro development-only server handlers.
159
- *
160
- * @see [Nitro server routes documentation](https://nitro.build/guide/routing)
161
- */
162
- devServerHandlers: NitroDevEventHandler[];
163
- }
164
- interface NuxtConfig {
165
- nitro?: NitroConfig;
166
- }
167
- interface RuntimeConfig {
168
- app: NitroRuntimeConfigApp;
169
- /** Only available on the server. */
170
- nitro?: NitroRuntimeConfig['nitro'];
171
- }
172
- interface NuxtDebugOptions {
173
- /** Debug options for Nitro */
174
- nitro?: NitroOptions['debug'];
175
- }
176
- interface NuxtPage {
177
- rules?: NitroRouteConfig;
178
- }
179
- }
180
-
181
- declare function bundle(nuxt: Nuxt & {
182
- _nitro?: Nitro;
183
- }): Promise<void>;
184
-
185
- export { bundle };
@@ -1,65 +0,0 @@
1
- import { joinURL, withQuery, withoutBase } from "ufo";
2
- import { appendResponseHeader, getRequestHeaders, send, setResponseHeader, setResponseHeaders, setResponseStatus } from "h3";
3
- import { useNitroApp, useRuntimeConfig } from "nitropack/runtime";
4
- import { isJsonRequest } from "../utils/error.js";
5
- import { generateErrorOverlayHTML } from "../utils/dev.js";
6
- export default (async function errorhandler(error, event, { defaultHandler }) {
7
- if (event.handled || isJsonRequest(event)) {
8
- return;
9
- }
10
- const defaultRes = await defaultHandler(error, event, { json: true });
11
- const status = error.status || error.statusCode || 500;
12
- if (status === 404 && defaultRes.status === 302) {
13
- setResponseHeaders(event, defaultRes.headers);
14
- setResponseStatus(event, defaultRes.status, defaultRes.statusText);
15
- return send(event, JSON.stringify(defaultRes.body, null, 2));
16
- }
17
- if (import.meta.dev && typeof defaultRes.body !== "string" && Array.isArray(defaultRes.body.stack)) {
18
- defaultRes.body.stack = defaultRes.body.stack.join("\n");
19
- }
20
- const errorObject = defaultRes.body;
21
- const url = new URL(errorObject.url);
22
- errorObject.url = withoutBase(url.pathname, useRuntimeConfig(event).app.baseURL) + url.search + url.hash;
23
- errorObject.message ||= "Server Error";
24
- errorObject.data ||= error.data;
25
- errorObject.statusText ||= error.statusText || error.statusMessage;
26
- delete defaultRes.headers["content-type"];
27
- delete defaultRes.headers["content-security-policy"];
28
- setResponseHeaders(event, defaultRes.headers);
29
- const reqHeaders = getRequestHeaders(event);
30
- const isRenderingError = event.path.startsWith("/__nuxt_error") || !!reqHeaders["x-nuxt-error"];
31
- const res = isRenderingError ? null : await useNitroApp().localFetch(
32
- withQuery(joinURL(useRuntimeConfig(event).app.baseURL, "/__nuxt_error"), errorObject),
33
- {
34
- headers: { ...reqHeaders, "x-nuxt-error": "true" },
35
- redirect: "manual"
36
- }
37
- ).catch(() => null);
38
- if (event.handled) {
39
- return;
40
- }
41
- if (!res) {
42
- const { template } = await import("../templates/error-500.js");
43
- if (import.meta.dev) {
44
- errorObject.description = errorObject.message;
45
- }
46
- setResponseHeader(event, "Content-Type", "text/html;charset=UTF-8");
47
- return send(event, template(errorObject));
48
- }
49
- const html = await res.text();
50
- for (const [header, value] of res.headers.entries()) {
51
- if (header === "set-cookie") {
52
- appendResponseHeader(event, header, value);
53
- continue;
54
- }
55
- setResponseHeader(event, header, value);
56
- }
57
- setResponseStatus(event, res.status && res.status !== 200 ? res.status : defaultRes.status, res.statusText || defaultRes.statusText);
58
- if (import.meta.dev && !import.meta.test && typeof html === "string") {
59
- const prettyResponse = await defaultHandler(error, event, { json: false });
60
- if (typeof prettyResponse.body === "string") {
61
- return send(event, html.replace("</body>", `${generateErrorOverlayHTML(prettyResponse.body, { startMinimized: 300 <= status && status < 500 })}</body>`));
62
- }
63
- }
64
- return send(event, html);
65
- });
@@ -1,4 +0,0 @@
1
- import type { RenderResponse } from 'nitropack/types';
2
- import type { NuxtIslandResponse } from 'nuxt/app';
3
- declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<NuxtIslandResponse | Partial<RenderResponse>>>;
4
- export default _default;
@@ -1,101 +0,0 @@
1
- import { useNitroApp } from "nitropack/runtime";
2
- import { destr } from "destr";
3
- import { defineEventHandler, getQuery, readBody, setResponseHeaders } from "h3";
4
- import { resolveUnrefHeadInput } from "@unhead/vue";
5
- import { getRequestDependencies } from "vue-bundle-renderer/runtime";
6
- import { getQuery as getURLQuery } from "ufo";
7
- import { islandCache, islandPropCache } from "../utils/cache.js";
8
- import { createSSRContext } from "../utils/renderer/app.js";
9
- import { getSSRRenderer } from "../utils/renderer/build-files.js";
10
- import { renderInlineStyles } from "../utils/renderer/inline-styles.js";
11
- import { getClientIslandResponse, getServerComponentHTML, getSlotIslandResponse } from "../utils/renderer/islands.js";
12
- const ISLAND_SUFFIX_RE = /\.json(?:\?.*)?$/;
13
- export default defineEventHandler(async (event) => {
14
- const nitroApp = useNitroApp();
15
- setResponseHeaders(event, {
16
- "content-type": "application/json;charset=utf-8",
17
- "x-powered-by": "Nuxt"
18
- });
19
- if (import.meta.prerender && event.path && await islandCache.hasItem(event.path)) {
20
- return islandCache.getItem(event.path);
21
- }
22
- const islandContext = await getIslandContext(event);
23
- const ssrContext = {
24
- ...createSSRContext(event),
25
- islandContext,
26
- noSSR: false,
27
- url: islandContext.url
28
- };
29
- const renderer = await getSSRRenderer();
30
- const renderResult = await renderer.renderToString(ssrContext).catch(async (err) => {
31
- await ssrContext.nuxt?.hooks.callHook("app:error", err);
32
- throw err;
33
- });
34
- if (ssrContext.payload?.error) {
35
- throw ssrContext.payload.error;
36
- }
37
- const inlinedStyles = await renderInlineStyles(ssrContext.modules ?? []);
38
- await ssrContext.nuxt?.hooks.callHook("app:rendered", { ssrContext, renderResult });
39
- if (inlinedStyles.length) {
40
- ssrContext.head.push({ style: inlinedStyles });
41
- }
42
- if (import.meta.dev) {
43
- const { styles } = getRequestDependencies(ssrContext, renderer.rendererContext);
44
- const link = [];
45
- for (const resource of Object.values(styles)) {
46
- if ("inline" in getURLQuery(resource.file)) {
47
- continue;
48
- }
49
- if (resource.file.includes("scoped") && !resource.file.includes("pages/")) {
50
- link.push({ rel: "stylesheet", href: renderer.rendererContext.buildAssetsURL(resource.file), crossorigin: "" });
51
- }
52
- }
53
- if (link.length) {
54
- ssrContext.head.push({ link }, { mode: "server" });
55
- }
56
- }
57
- const islandHead = {};
58
- for (const entry of ssrContext.head.entries.values()) {
59
- for (const [key, value] of Object.entries(resolveUnrefHeadInput(entry.input))) {
60
- const currentValue = islandHead[key];
61
- if (Array.isArray(currentValue)) {
62
- currentValue.push(...value);
63
- } else {
64
- islandHead[key] = value;
65
- }
66
- }
67
- }
68
- const islandResponse = {
69
- id: islandContext.id,
70
- head: islandHead,
71
- html: getServerComponentHTML(renderResult.html),
72
- components: getClientIslandResponse(ssrContext),
73
- slots: getSlotIslandResponse(ssrContext)
74
- };
75
- await nitroApp.hooks.callHook("render:island", islandResponse, { event, islandContext });
76
- if (import.meta.prerender) {
77
- await islandCache.setItem(`/__nuxt_island/${islandContext.name}_${islandContext.id}.json`, islandResponse);
78
- await islandPropCache.setItem(`/__nuxt_island/${islandContext.name}_${islandContext.id}.json`, event.path);
79
- }
80
- return islandResponse;
81
- });
82
- async function getIslandContext(event) {
83
- let url = event.path || "";
84
- if (import.meta.prerender && event.path && await islandPropCache.hasItem(event.path)) {
85
- url = await islandPropCache.getItem(event.path);
86
- }
87
- const componentParts = url.substring("/__nuxt_island".length + 1).replace(ISLAND_SUFFIX_RE, "").split("_");
88
- const hashId = componentParts.length > 1 ? componentParts.pop() : void 0;
89
- const componentName = componentParts.join("_");
90
- const context = event.method === "GET" ? getQuery(event) : await readBody(event);
91
- const ctx = {
92
- url: "/",
93
- ...context,
94
- id: hashId,
95
- name: componentName,
96
- props: destr(context.props) || {},
97
- slots: {},
98
- components: {}
99
- };
100
- return ctx;
101
- }
@@ -1,2 +0,0 @@
1
- declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<any>>;
2
- export default _default;
@@ -1,237 +0,0 @@
1
- import { AsyncLocalStorage } from "node:async_hooks";
2
- import { getPrefetchLinks, getPreloadLinks, getRequestDependencies, renderResourceHeaders } from "vue-bundle-renderer/runtime";
3
- import { appendResponseHeader, createError, getQuery, getResponseStatus, getResponseStatusText, writeEarlyHints } from "h3";
4
- import { getQuery as getURLQuery, joinURL } from "ufo";
5
- import { propsToString, renderSSRHead } from "@unhead/vue/server";
6
- import destr from "destr";
7
- import { defineRenderHandler, getRouteRules, useNitroApp } from "nitropack/runtime";
8
- import { getRenderer } from "../utils/renderer/build-files.js";
9
- import { payloadCache } from "../utils/cache.js";
10
- import { renderPayloadJsonScript, renderPayloadResponse, renderPayloadScript, splitPayload } from "../utils/renderer/payload.js";
11
- import { createSSRContext, setSSRError } from "../utils/renderer/app.js";
12
- import { renderInlineStyles } from "../utils/renderer/inline-styles.js";
13
- import { replaceIslandTeleports } from "../utils/renderer/islands.js";
14
- import { renderSSRHeadOptions } from "#internal/unhead.config.mjs";
15
- import { NUXT_ASYNC_CONTEXT, NUXT_EARLY_HINTS, NUXT_INLINE_STYLES, NUXT_JSON_PAYLOADS, NUXT_NO_SCRIPTS, NUXT_PAYLOAD_EXTRACTION, NUXT_RUNTIME_PAYLOAD_EXTRACTION, PARSE_ERROR_DATA } from "#internal/nuxt/nitro-config.mjs";
16
- import { appHead, appTeleportAttrs, appTeleportTag, componentIslands, appManifest as isAppManifestEnabled } from "#internal/nuxt.config.mjs";
17
- import entryIds from "#internal/nuxt/entry-ids.mjs";
18
- import { entryFileName } from "#internal/entry-chunk.mjs";
19
- import { buildAssetsURL, publicAssetsURL } from "#internal/nuxt/paths";
20
- import { relative } from "pathe";
21
- globalThis.__buildAssetsURL = buildAssetsURL;
22
- globalThis.__publicAssetsURL = publicAssetsURL;
23
- if (NUXT_ASYNC_CONTEXT && !("AsyncLocalStorage" in globalThis)) {
24
- globalThis.AsyncLocalStorage = AsyncLocalStorage;
25
- }
26
- const HAS_APP_TELEPORTS = !!(appTeleportTag && appTeleportAttrs.id);
27
- const APP_TELEPORT_OPEN_TAG = HAS_APP_TELEPORTS ? `<${appTeleportTag}${propsToString(appTeleportAttrs)}>` : "";
28
- const APP_TELEPORT_CLOSE_TAG = HAS_APP_TELEPORTS ? `</${appTeleportTag}>` : "";
29
- const PAYLOAD_URL_RE = NUXT_JSON_PAYLOADS ? /^[^?]*\/_payload.json(?:\?.*)?$/ : /^[^?]*\/_payload.js(?:\?.*)?$/;
30
- const PAYLOAD_FILENAME = NUXT_JSON_PAYLOADS ? "_payload.json" : "_payload.js";
31
- let entryPath;
32
- export default defineRenderHandler(async (event) => {
33
- const nitroApp = useNitroApp();
34
- const ssrError = event.path.startsWith("/__nuxt_error") ? getQuery(event) : null;
35
- if (ssrError && !("__unenv__" in event.node.req)) {
36
- throw createError({
37
- status: 404,
38
- statusText: "Page Not Found: /__nuxt_error",
39
- message: "Page Not Found: /__nuxt_error"
40
- });
41
- }
42
- const ssrContext = createSSRContext(event);
43
- const headEntryOptions = { mode: "server" };
44
- ssrContext.head.push(appHead, headEntryOptions);
45
- if (ssrError) {
46
- const status = ssrError.status || ssrError.statusCode;
47
- if (status) {
48
- ssrError.status = ssrError.statusCode = Number.parseInt(status);
49
- }
50
- if (PARSE_ERROR_DATA && typeof ssrError.data === "string") {
51
- try {
52
- ssrError.data = destr(ssrError.data);
53
- } catch {
54
- }
55
- }
56
- setSSRError(ssrContext, ssrError);
57
- }
58
- const routeOptions = getRouteRules(event);
59
- const _PAYLOAD_EXTRACTION = !ssrContext.noSSR && (import.meta.prerender && NUXT_PAYLOAD_EXTRACTION || NUXT_RUNTIME_PAYLOAD_EXTRACTION && (routeOptions.isr || routeOptions.cache));
60
- const isRenderingPayload = (_PAYLOAD_EXTRACTION || import.meta.dev && routeOptions.prerender) && PAYLOAD_URL_RE.test(ssrContext.url);
61
- if (isRenderingPayload) {
62
- const url = ssrContext.url.substring(0, ssrContext.url.lastIndexOf("/")) || "/";
63
- ssrContext.url = url;
64
- event._path = event.node.req.url = url;
65
- if (import.meta.prerender && await payloadCache.hasItem(url)) {
66
- return payloadCache.getItem(url);
67
- }
68
- }
69
- if (routeOptions.ssr === false) {
70
- ssrContext.noSSR = true;
71
- }
72
- const payloadURL = _PAYLOAD_EXTRACTION ? joinURL(ssrContext.runtimeConfig.app.cdnURL || ssrContext.runtimeConfig.app.baseURL, ssrContext.url.replace(/\?.*$/, ""), PAYLOAD_FILENAME) + "?" + ssrContext.runtimeConfig.app.buildId : void 0;
73
- const renderer = await getRenderer(ssrContext);
74
- if (NUXT_EARLY_HINTS && !isRenderingPayload && !import.meta.prerender) {
75
- const { link: link2 } = renderResourceHeaders({}, renderer.rendererContext);
76
- if (link2) {
77
- writeEarlyHints(event, link2);
78
- }
79
- }
80
- if (NUXT_INLINE_STYLES) {
81
- for (const id of entryIds) {
82
- ssrContext.modules.add(id);
83
- }
84
- }
85
- const _rendered = await renderer.renderToString(ssrContext).catch(async (error) => {
86
- if ((ssrContext["~renderResponse"] || ssrContext._renderResponse) && error.message === "skipping render") {
87
- return {};
88
- }
89
- const _err = !ssrError && ssrContext.payload?.error || error;
90
- await ssrContext.nuxt?.hooks.callHook("app:error", _err);
91
- throw _err;
92
- });
93
- const inlinedStyles = NUXT_INLINE_STYLES && !ssrContext["~renderResponse"] && !ssrContext._renderResponse && !isRenderingPayload ? await renderInlineStyles(ssrContext.modules ?? []) : [];
94
- await ssrContext.nuxt?.hooks.callHook("app:rendered", { ssrContext, renderResult: _rendered });
95
- if (ssrContext["~renderResponse"] || ssrContext._renderResponse) {
96
- return ssrContext["~renderResponse"] || ssrContext._renderResponse;
97
- }
98
- if (ssrContext.payload?.error && !ssrError) {
99
- throw ssrContext.payload.error;
100
- }
101
- if (isRenderingPayload) {
102
- const response = renderPayloadResponse(ssrContext);
103
- if (import.meta.prerender) {
104
- await payloadCache.setItem(ssrContext.url, response);
105
- }
106
- return response;
107
- }
108
- if (_PAYLOAD_EXTRACTION && import.meta.prerender) {
109
- appendResponseHeader(event, "x-nitro-prerender", joinURL(ssrContext.url.replace(/\?.*$/, ""), PAYLOAD_FILENAME));
110
- await payloadCache.setItem(ssrContext.url === "/" ? "/" : ssrContext.url.replace(/\/$/, ""), renderPayloadResponse(ssrContext));
111
- }
112
- const NO_SCRIPTS = NUXT_NO_SCRIPTS || routeOptions.noScripts;
113
- const { styles, scripts } = getRequestDependencies(ssrContext, renderer.rendererContext);
114
- if (entryFileName && !NO_SCRIPTS) {
115
- let path = entryPath;
116
- if (!path) {
117
- path = buildAssetsURL(entryFileName);
118
- if (ssrContext.runtimeConfig.app.cdnURL || /^(?:\/|\.+\/)/.test(path)) {
119
- entryPath = path;
120
- } else {
121
- path = relative(event.path.replace(/\/[^/]+$/, "/"), joinURL("/", path));
122
- if (!/^(?:\/|\.+\/)/.test(path)) {
123
- path = `./${path}`;
124
- }
125
- }
126
- }
127
- ssrContext.head.push({
128
- script: [{
129
- tagPosition: "head",
130
- tagPriority: -2,
131
- type: "importmap",
132
- innerHTML: JSON.stringify({ imports: { "#entry": path } })
133
- }]
134
- }, headEntryOptions);
135
- }
136
- if (_PAYLOAD_EXTRACTION && !NO_SCRIPTS) {
137
- ssrContext.head.push({
138
- link: [
139
- NUXT_JSON_PAYLOADS ? { rel: "preload", as: "fetch", crossorigin: "anonymous", href: payloadURL } : { rel: "modulepreload", crossorigin: "", href: payloadURL }
140
- ]
141
- }, headEntryOptions);
142
- }
143
- if (isAppManifestEnabled && ssrContext["~preloadManifest"] && !NO_SCRIPTS) {
144
- ssrContext.head.push({
145
- link: [
146
- { rel: "preload", as: "fetch", fetchpriority: "low", crossorigin: "anonymous", href: buildAssetsURL(`builds/meta/${ssrContext.runtimeConfig.app.buildId}.json`) }
147
- ]
148
- }, { ...headEntryOptions, tagPriority: "low" });
149
- }
150
- if (inlinedStyles.length) {
151
- ssrContext.head.push({ style: inlinedStyles });
152
- }
153
- const link = [];
154
- for (const resource of Object.values(styles)) {
155
- if (import.meta.dev && "inline" in getURLQuery(resource.file)) {
156
- continue;
157
- }
158
- link.push({ rel: "stylesheet", href: renderer.rendererContext.buildAssetsURL(resource.file), crossorigin: "" });
159
- }
160
- if (link.length) {
161
- ssrContext.head.push({ link }, headEntryOptions);
162
- }
163
- if (!NO_SCRIPTS) {
164
- ssrContext.head.push({
165
- link: getPreloadLinks(ssrContext, renderer.rendererContext)
166
- }, headEntryOptions);
167
- ssrContext.head.push({
168
- link: getPrefetchLinks(ssrContext, renderer.rendererContext)
169
- }, headEntryOptions);
170
- ssrContext.head.push({
171
- script: _PAYLOAD_EXTRACTION ? NUXT_JSON_PAYLOADS ? renderPayloadJsonScript({ ssrContext, data: splitPayload(ssrContext).initial, src: payloadURL }) : renderPayloadScript({ ssrContext, data: splitPayload(ssrContext).initial, routeOptions, src: payloadURL }) : NUXT_JSON_PAYLOADS ? renderPayloadJsonScript({ ssrContext, data: ssrContext.payload }) : renderPayloadScript({ ssrContext, data: ssrContext.payload, routeOptions })
172
- }, {
173
- ...headEntryOptions,
174
- // this should come before another end of body scripts
175
- tagPosition: "bodyClose",
176
- tagPriority: "high"
177
- });
178
- }
179
- if (!routeOptions.noScripts) {
180
- const tagPosition = _PAYLOAD_EXTRACTION && !NUXT_JSON_PAYLOADS ? "bodyClose" : "head";
181
- ssrContext.head.push({
182
- script: Object.values(scripts).map((resource) => ({
183
- type: resource.module ? "module" : null,
184
- src: renderer.rendererContext.buildAssetsURL(resource.file),
185
- defer: resource.module ? null : true,
186
- // if we are rendering script tag payloads that import an async payload
187
- // we need to ensure this resolves before executing the Nuxt entry
188
- tagPosition,
189
- crossorigin: ""
190
- }))
191
- }, headEntryOptions);
192
- }
193
- const { headTags, bodyTags, bodyTagsOpen, htmlAttrs, bodyAttrs } = await renderSSRHead(ssrContext.head, renderSSRHeadOptions);
194
- const htmlContext = {
195
- htmlAttrs: htmlAttrs ? [htmlAttrs] : [],
196
- head: normalizeChunks([headTags]),
197
- bodyAttrs: bodyAttrs ? [bodyAttrs] : [],
198
- bodyPrepend: normalizeChunks([bodyTagsOpen, ssrContext.teleports?.body]),
199
- body: [
200
- componentIslands ? replaceIslandTeleports(ssrContext, _rendered.html) : _rendered.html,
201
- APP_TELEPORT_OPEN_TAG + (HAS_APP_TELEPORTS ? joinTags([ssrContext.teleports?.[`#${appTeleportAttrs.id}`]]) : "") + APP_TELEPORT_CLOSE_TAG
202
- ],
203
- bodyAppend: [bodyTags]
204
- };
205
- await nitroApp.hooks.callHook("render:html", htmlContext, { event });
206
- return {
207
- body: renderHTMLDocument(htmlContext),
208
- statusCode: getResponseStatus(event),
209
- statusMessage: getResponseStatusText(event),
210
- headers: {
211
- "content-type": "text/html;charset=utf-8",
212
- "x-powered-by": "Nuxt"
213
- }
214
- };
215
- });
216
- function normalizeChunks(chunks) {
217
- const result = [];
218
- for (const _chunk of chunks) {
219
- const chunk = _chunk?.trim();
220
- if (chunk) {
221
- result.push(chunk);
222
- }
223
- }
224
- return result;
225
- }
226
- function joinTags(tags) {
227
- return tags.join("");
228
- }
229
- function joinAttrs(chunks) {
230
- if (chunks.length === 0) {
231
- return "";
232
- }
233
- return " " + chunks.join(" ");
234
- }
235
- function renderHTMLDocument(html) {
236
- return `<!DOCTYPE html><html${joinAttrs(html.htmlAttrs)}><head>${joinTags(html.head)}</head><body${joinAttrs(html.bodyAttrs)}>${joinTags(html.bodyPrepend)}${joinTags(html.body)}${joinTags(html.bodyAppend)}</body></html>`;
237
- }
@@ -1,2 +0,0 @@
1
- declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, void>;
2
- export default _default;
@@ -1,7 +0,0 @@
1
- import { defineEventHandler, getRequestHeader } from "h3";
2
- export default defineEventHandler((event) => {
3
- if (getRequestHeader(event, "x-nuxt-no-ssr")) {
4
- event.context.nuxt ||= {};
5
- event.context.nuxt.noSSR = true;
6
- }
7
- });
@@ -1,3 +0,0 @@
1
- import type { NitroApp } from 'nitropack/types';
2
- declare const _default: (nitroApp: NitroApp) => void;
3
- export default _default;