vinext 1.0.0-beta.0 → 1.0.0-beta.2
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 +21 -2
- package/dist/build/assets-ignore.js +1 -1
- package/dist/build/clean-output.js +1 -1
- package/dist/build/client-build-config.js +7 -4
- package/dist/build/css-url-assets.js +3 -3
- package/dist/build/google-fonts/fallback-metrics.js +1 -1
- package/dist/build/google-fonts/font-metadata.js +1 -1
- package/dist/build/inject-pregenerated-paths.js +1 -1
- package/dist/build/inline-css.js +2 -5
- package/dist/build/module-dependency-cache.d.ts +4 -0
- package/dist/build/module-dependency-cache.js +13 -0
- package/dist/build/next-client-runtime-manifests.js +1 -1
- package/dist/build/pages-client-assets-module.js +1 -1
- package/dist/build/precompress.js +7 -7
- package/dist/build/prerender-paths.d.ts +2 -2
- package/dist/build/prerender-paths.js +10 -15
- package/dist/build/prerender-server-pool.js +2 -2
- package/dist/build/prerender.js +1 -1
- package/dist/build/preview-credentials.d.ts +11 -0
- package/dist/build/preview-credentials.js +19 -0
- package/dist/build/report.d.ts +8 -4
- package/dist/build/report.js +14 -6
- package/dist/build/run-prerender.d.ts +2 -11
- package/dist/build/run-prerender.js +2 -10
- package/dist/build/server-manifest.js +1 -1
- package/dist/build/ssr-manifest.d.ts +4 -0
- package/dist/build/ssr-manifest.js +10 -6
- package/dist/build/standalone.js +37 -37
- package/dist/cache/cache-adapters-virtual.d.ts +1 -17
- package/dist/cache/cache-adapters-virtual.js +20 -11
- package/dist/check.d.ts +0 -16
- package/dist/check.js +27 -36
- package/dist/cli.js +61 -55
- package/dist/client/instrumentation-client-inject.js +1 -1
- package/dist/client/pages-router-link-navigation.js +1 -1
- package/dist/config/config-matchers.d.ts +13 -37
- package/dist/config/config-matchers.js +33 -123
- package/dist/config/dotenv.js +1 -1
- package/dist/config/next-config.d.ts +7 -3
- package/dist/config/next-config.js +84 -15
- package/dist/config/prerender.d.ts +2 -2
- package/dist/config/prerender.js +7 -15
- package/dist/config/request-context.d.ts +14 -0
- package/dist/config/request-context.js +26 -0
- package/dist/config/server-external-packages.js +1 -1
- package/dist/config/tsconfig-paths.js +2 -2
- package/dist/{node_modules/.pnpm/am-i-vibing@0.5.0/node_modules → deps/.pnpm/am-i-vibing@0.5.0/deps}/am-i-vibing/dist/detector-1yx2Hoe0.js +2 -2
- package/dist/deps/.pnpm/pathslash@0.1.0/deps/pathslash/dist/index.js +50 -0
- package/dist/entries/app-rsc-entry.js +39 -14
- package/dist/entries/app-rsc-manifest.js +21 -4
- package/dist/entries/pages-client-entry.js +6 -5
- package/dist/entries/pages-server-entry.js +18 -28
- package/dist/entries/runtime-entry-module.js +2 -2
- package/dist/index.js +314 -230
- package/dist/init-cloudflare.js +1 -1
- package/dist/init-platform.js +1 -1
- package/dist/init.d.ts +6 -4
- package/dist/init.js +25 -27
- package/dist/plugins/ast-utils.js +1 -1
- package/dist/plugins/dynamic-preload-metadata.js +7 -7
- package/dist/plugins/extensionless-dynamic-import.js +1 -1
- package/dist/plugins/fonts.js +3 -3
- package/dist/plugins/ignore-dynamic-requests.js +13 -8
- package/dist/plugins/import-meta-url.js +16 -17
- package/dist/plugins/middleware-export-validation.js +1 -1
- package/dist/plugins/middleware-server-only.js +2 -2
- package/dist/plugins/og-asset-ownership.js +7 -6
- package/dist/plugins/og-assets.js +5 -6
- package/dist/plugins/optimize-imports.js +12 -13
- package/dist/plugins/postcss.js +1 -1
- package/dist/plugins/remove-console.js +1 -1
- package/dist/plugins/require-context.js +1 -1
- package/dist/plugins/sass.js +2 -2
- package/dist/plugins/server-externals-manifest.js +1 -1
- package/dist/plugins/strip-server-exports.js +1 -1
- package/dist/plugins/styled-jsx.js +3 -2
- package/dist/plugins/typeof-window.js +1 -1
- package/dist/routing/app-route-graph.d.ts +16 -15
- package/dist/routing/app-route-graph.js +86 -88
- package/dist/routing/app-router.d.ts +0 -5
- package/dist/routing/app-router.js +12 -11
- package/dist/routing/file-matcher.d.ts +13 -28
- package/dist/routing/file-matcher.js +31 -44
- package/dist/routing/pages-router.js +26 -32
- package/dist/routing/route-matching.d.ts +14 -1
- package/dist/routing/route-matching.js +13 -1
- package/dist/routing/route-pattern.d.ts +2 -1
- package/dist/routing/route-pattern.js +7 -4
- package/dist/routing/route-trie.d.ts +5 -1
- package/dist/routing/route-trie.js +5 -2
- package/dist/server/api-handler.js +41 -33
- package/dist/server/app-browser-entry.js +18 -11
- package/dist/server/app-browser-history-controller.d.ts +1 -1
- package/dist/server/app-browser-history-controller.js +3 -3
- package/dist/server/app-browser-navigation-controller.js +4 -2
- package/dist/server/app-browser-server-action-client.js +1 -1
- package/dist/server/app-elements-wire.d.ts +2 -1
- package/dist/server/app-fallback-renderer.d.ts +11 -0
- package/dist/server/app-fallback-renderer.js +16 -2
- package/dist/server/app-middleware.js +2 -1
- package/dist/server/app-page-boundary-render.d.ts +26 -2
- package/dist/server/app-page-boundary-render.js +190 -55
- package/dist/server/app-page-cache-finalizer.d.ts +1 -1
- package/dist/server/app-page-cache.d.ts +1 -1
- package/dist/server/app-page-dispatch.d.ts +12 -2
- package/dist/server/app-page-dispatch.js +37 -51
- package/dist/server/app-page-element-builder.d.ts +8 -2
- package/dist/server/app-page-element-builder.js +112 -27
- package/dist/server/app-page-execution.d.ts +3 -1
- package/dist/server/app-page-execution.js +31 -39
- package/dist/server/app-page-head.d.ts +54 -2
- package/dist/server/app-page-head.js +164 -78
- package/dist/server/app-page-http-access-fallback-metadata.d.ts +29 -0
- package/dist/server/app-page-http-access-fallback-metadata.js +106 -0
- package/dist/server/app-page-render.d.ts +2 -2
- package/dist/server/app-page-render.js +1 -1
- package/dist/server/app-page-request.d.ts +12 -0
- package/dist/server/app-page-request.js +134 -14
- package/dist/server/app-page-route-wiring.d.ts +9 -0
- package/dist/server/app-page-route-wiring.js +44 -4
- package/dist/server/app-post-middleware-context.d.ts +1 -1
- package/dist/server/app-post-middleware-context.js +1 -1
- package/dist/server/app-route-handler-dispatch.js +31 -17
- package/dist/server/app-route-handler-execution.d.ts +6 -1
- package/dist/server/app-route-handler-execution.js +41 -15
- package/dist/server/app-route-handler-policy.d.ts +2 -0
- package/dist/server/app-route-handler-policy.js +3 -3
- package/dist/server/app-route-module-loader.d.ts +3 -1
- package/dist/server/app-route-module-loader.js +1 -0
- package/dist/server/app-route-tree-prefetch.js +1 -1
- package/dist/server/app-rsc-cache-busting.d.ts +1 -1
- package/dist/server/app-rsc-cache-busting.js +1 -1
- package/dist/server/app-rsc-errors.d.ts +1 -1
- package/dist/server/app-rsc-errors.js +12 -2
- package/dist/server/app-rsc-handler.d.ts +10 -5
- package/dist/server/app-rsc-handler.js +51 -23
- package/dist/server/app-rsc-redirect-flight.d.ts +66 -0
- package/dist/server/app-rsc-redirect-flight.js +71 -0
- package/dist/server/app-rsc-request-normalization.d.ts +3 -2
- package/dist/server/app-rsc-request-normalization.js +8 -2
- package/dist/server/app-rsc-response-finalizer.d.ts +2 -2
- package/dist/server/app-rsc-response-finalizer.js +5 -11
- package/dist/server/app-rsc-route-matching.d.ts +20 -0
- package/dist/server/app-rsc-route-matching.js +87 -11
- package/dist/server/app-segment-config.js +15 -5
- package/dist/server/app-server-action-execution.d.ts +3 -1
- package/dist/server/app-server-action-execution.js +8 -6
- package/dist/server/app-ssr-entry.js +4 -1
- package/dist/server/app-ssr-stream.d.ts +2 -7
- package/dist/server/app-ssr-stream.js +5 -10
- package/dist/server/cache-proof.js +1 -1
- package/dist/server/config-headers.d.ts +24 -0
- package/dist/server/config-headers.js +52 -0
- package/dist/server/default-global-error-module.d.ts +3 -1
- package/dist/server/default-not-found-module.d.ts +3 -1
- package/dist/server/dev-initial-server-error.d.ts +1 -1
- package/dist/server/dev-lockfile.js +2 -3
- package/dist/server/dev-route-files.js +1 -1
- package/dist/server/dev-server.js +281 -173
- package/dist/server/dev-stack-sourcemap.js +4 -3
- package/dist/server/headers.d.ts +3 -1
- package/dist/server/headers.js +3 -1
- package/dist/server/image-optimization.js +2 -2
- package/dist/server/implicit-tags.js +2 -1
- package/dist/server/instrumentation.js +2 -2
- package/dist/server/isr-cache.d.ts +1 -1
- package/dist/server/isr-cache.js +1 -1
- package/dist/server/metadata-routes.js +4 -4
- package/dist/server/middleware-matcher-pattern.d.ts +22 -0
- package/dist/server/middleware-matcher-pattern.js +219 -0
- package/dist/server/middleware-matcher.d.ts +2 -7
- package/dist/server/middleware-matcher.js +13 -60
- package/dist/server/middleware-path-to-regexp.d.ts +14 -0
- package/dist/server/middleware-path-to-regexp.js +228 -0
- package/dist/server/middleware-response-headers.js +1 -1
- package/dist/server/middleware-runtime.js +5 -4
- package/dist/server/middleware.d.ts +2 -1
- package/dist/server/middleware.js +3 -2
- package/dist/server/navigation-planner.d.ts +2 -0
- package/dist/server/navigation-planner.js +8 -2
- package/dist/server/next-error-digest.d.ts +9 -24
- package/dist/server/next-error-digest.js +23 -15
- package/dist/server/operation-token.js +1 -1
- package/dist/server/pages-body-parser-config.js +2 -1
- package/dist/server/pages-data-route.d.ts +11 -1
- package/dist/server/pages-data-route.js +16 -1
- package/dist/server/pages-dev-hydration.d.ts +14 -0
- package/dist/server/pages-dev-hydration.js +83 -0
- package/dist/server/pages-dev-module-url.js +2 -2
- package/dist/server/pages-get-initial-props.d.ts +15 -2
- package/dist/server/pages-get-initial-props.js +16 -6
- package/dist/server/pages-node-compat.d.ts +13 -6
- package/dist/server/pages-node-compat.js +44 -45
- package/dist/server/pages-page-data.d.ts +4 -2
- package/dist/server/pages-page-data.js +20 -10
- package/dist/server/pages-page-handler.d.ts +4 -2
- package/dist/server/pages-page-handler.js +74 -43
- package/dist/server/pages-page-response.d.ts +2 -2
- package/dist/server/pages-page-response.js +1 -1
- package/dist/server/pages-preview.d.ts +26 -0
- package/dist/server/pages-preview.js +165 -0
- package/dist/server/pages-readiness.d.ts +5 -4
- package/dist/server/pages-readiness.js +4 -2
- package/dist/server/pages-request-pipeline.d.ts +1 -0
- package/dist/server/pages-request-pipeline.js +25 -11
- package/dist/server/pages-router-entry.js +6 -0
- package/dist/server/prerender-route-params.js +2 -2
- package/dist/server/prod-server.d.ts +1 -4
- package/dist/server/prod-server.js +44 -30
- package/dist/server/request-pipeline.d.ts +15 -29
- package/dist/server/request-pipeline.js +25 -60
- package/dist/server/rsc-stream-hints.js +122 -18
- package/dist/server/seed-cache.js +1 -1
- package/dist/server/socket-error-backstop.js +1 -1
- package/dist/server/static-file-cache.js +7 -8
- package/dist/server/worker-utils.js +1 -1
- package/dist/shims/app.d.ts +1 -1
- package/dist/shims/cache-request-state.d.ts +27 -1
- package/dist/shims/cache-request-state.js +60 -1
- package/dist/shims/cache-runtime.d.ts +12 -1
- package/dist/shims/cache-runtime.js +22 -7
- package/dist/shims/cache.d.ts +5 -5
- package/dist/shims/cache.js +28 -11
- package/dist/shims/constants.js +1 -1
- package/dist/shims/document.d.ts +42 -83
- package/dist/shims/document.js +62 -53
- package/dist/shims/dynamic.d.ts +5 -25
- package/dist/shims/dynamic.js +29 -8
- package/dist/shims/error-boundary.d.ts +4 -4
- package/dist/shims/error.d.ts +22 -6
- package/dist/shims/error.js +53 -15
- package/dist/shims/fetch-cache.js +13 -4
- package/dist/shims/font-google-base.d.ts +11 -4
- package/dist/shims/font-local.d.ts +10 -3
- package/dist/shims/font-utils.js +1 -1
- package/dist/shims/form.d.ts +1 -1
- package/dist/shims/head.d.ts +13 -2
- package/dist/shims/head.js +6 -6
- package/dist/shims/headers.d.ts +28 -31
- package/dist/shims/headers.js +115 -53
- package/dist/shims/image.d.ts +27 -37
- package/dist/shims/image.js +21 -14
- package/dist/shims/internal/cookie-serialize.d.ts +3 -1
- package/dist/shims/internal/cookie-serialize.js +3 -1
- package/dist/shims/internal/hybrid-client-route-owner.js +3 -1
- package/dist/shims/internal/pages-data-fetch-dedup.js +5 -3
- package/dist/shims/internal/utils.d.ts +3 -3
- package/dist/shims/layout-segment-context.d.ts +1 -1
- package/dist/shims/legacy-image.d.ts +3 -37
- package/dist/shims/legacy-image.js +6 -16
- package/dist/shims/link.d.ts +16 -21
- package/dist/shims/link.js +25 -13
- package/dist/shims/navigation-context-state.d.ts +1 -1
- package/dist/shims/navigation-errors.d.ts +2 -1
- package/dist/shims/navigation-errors.js +9 -13
- package/dist/shims/navigation.d.ts +8 -4
- package/dist/shims/navigation.js +29 -18
- package/dist/shims/next-shims-augmentations.d.ts +1 -0
- package/dist/shims/next-shims-public.d.ts +1 -0
- package/dist/shims/public-shim-map.json.js +103 -0
- package/dist/shims/readonly-url-search-params.d.ts +3 -3
- package/dist/shims/readonly-url-search-params.js +3 -3
- package/dist/shims/request-state-types.d.ts +1 -1
- package/dist/shims/router-state.d.ts +1 -0
- package/dist/shims/router.d.ts +57 -22
- package/dist/shims/router.js +178 -46
- package/dist/shims/script.d.ts +6 -10
- package/dist/shims/script.js +7 -4
- package/dist/shims/server.d.ts +45 -22
- package/dist/shims/server.js +46 -7
- package/dist/shims/slot.d.ts +1 -1
- package/dist/shims/thenable-params.js +1 -1
- package/dist/shims/unified-request-context.d.ts +1 -1
- package/dist/shims/unified-request-context.js +2 -0
- package/dist/shims/url-safety.d.ts +1 -1
- package/dist/shims/url-safety.js +2 -2
- package/dist/typegen.d.ts +8 -2
- package/dist/typegen.js +84 -25
- package/dist/utils/client-build-manifest.js +2 -2
- package/dist/utils/client-entry-manifest.js +1 -1
- package/dist/utils/client-runtime-metadata.js +1 -1
- package/dist/utils/commonjs-loader.js +3 -3
- package/dist/utils/domain-locale.d.ts +2 -2
- package/dist/utils/external-url.d.ts +5 -0
- package/dist/utils/external-url.js +7 -0
- package/dist/utils/mdx-scan.js +1 -1
- package/dist/utils/path.d.ts +1 -13
- package/dist/utils/path.js +1 -15
- package/dist/utils/plugin-options.d.ts +4 -0
- package/dist/utils/plugin-options.js +8 -0
- package/dist/utils/project.d.ts +0 -6
- package/dist/utils/project.js +2 -8
- package/dist/utils/public-routes.js +2 -2
- package/dist/utils/react-version.js +1 -1
- package/dist/utils/redirect-digest.d.ts +9 -0
- package/dist/utils/redirect-digest.js +25 -0
- package/dist/utils/regex-safety.d.ts +8 -0
- package/dist/utils/regex-safety.js +737 -0
- package/dist/utils/vinext-root.js +1 -1
- package/dist/utils/vite-version.d.ts +5 -2
- package/dist/utils/vite-version.js +43 -17
- package/package.json +16 -4
- /package/dist/build/google-fonts/{fallback-metrics-data.js → fallback-metrics-data.json.js} +0 -0
- /package/dist/build/google-fonts/{font-data.js → font-data.json.js} +0 -0
- /package/dist/{node_modules/.pnpm/process-ancestry@0.1.0/node_modules → deps/.pnpm/process-ancestry@0.1.0/deps}/process-ancestry/dist/index.js +0 -0
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { createRequestContext, runWithRequestContext } from "../shims/unified-request-context.js";
|
|
2
|
+
import path from "../deps/.pnpm/pathslash@0.1.0/deps/pathslash/dist/index.js";
|
|
2
3
|
import { createValidFileMatcher, findFileWithExtensions, findFileWithExts } from "../routing/file-matcher.js";
|
|
3
4
|
import { patternToNextFormat } from "../routing/route-validation.js";
|
|
4
5
|
import { matchRoute } from "../routing/pages-router.js";
|
|
5
6
|
import { NEXTJS_DEPLOYMENT_ID_HEADER } from "./headers.js";
|
|
7
|
+
import { isDangerousScheme } from "../shims/url-safety.js";
|
|
6
8
|
import { importModule, reportRequestError } from "./instrumentation.js";
|
|
7
9
|
import { buildCacheStateHeaders } from "./cache-headers.js";
|
|
8
10
|
import { isUnknownRecord } from "../utils/record.js";
|
|
@@ -32,9 +34,10 @@ import { isSerializableProps } from "./pages-serializable-props.js";
|
|
|
32
34
|
import { isBotUserAgent } from "../utils/html-limited-bots.js";
|
|
33
35
|
import { getPagesRouteParams, matchesPagesStaticPath } from "./pages-page-data.js";
|
|
34
36
|
import { createPagesDevAssetUrl, createPagesDevModuleUrl } from "./pages-dev-module-url.js";
|
|
37
|
+
import { createPagesDevHydrationScript } from "./pages-dev-hydration.js";
|
|
35
38
|
import { getManifestFilesForModule } from "./pages-asset-tags.js";
|
|
36
|
-
import {
|
|
37
|
-
import
|
|
39
|
+
import { PAGES_PREVIEW_CACHE_CONTROL, appendPagesPreviewClearCookies, getPagesPreviewState } from "./pages-preview.js";
|
|
40
|
+
import { attachPagesRequestCookies } from "./pages-node-compat.js";
|
|
38
41
|
import React from "react";
|
|
39
42
|
import { renderToReadableStream } from "react-dom/server.edge";
|
|
40
43
|
//#region src/server/dev-server.ts
|
|
@@ -50,10 +53,37 @@ async function renderToStringAsync(element) {
|
|
|
50
53
|
await stream.allReady;
|
|
51
54
|
return new Response(stream).text();
|
|
52
55
|
}
|
|
56
|
+
function applyDevPagesPreviewHeaders(headers, preview) {
|
|
57
|
+
const removeHeader = (name) => {
|
|
58
|
+
for (const key of Object.keys(headers)) if (key.toLowerCase() === name) delete headers[key];
|
|
59
|
+
};
|
|
60
|
+
if (preview.data !== false) {
|
|
61
|
+
removeHeader("cache-control");
|
|
62
|
+
headers["Cache-Control"] = PAGES_PREVIEW_CACHE_CONTROL;
|
|
63
|
+
}
|
|
64
|
+
if (preview.shouldClear) {
|
|
65
|
+
const clearHeaders = new Headers();
|
|
66
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
67
|
+
if (key.toLowerCase() !== "set-cookie") continue;
|
|
68
|
+
if (Array.isArray(value)) for (const cookie of value) clearHeaders.append("Set-Cookie", String(cookie));
|
|
69
|
+
else clearHeaders.append("Set-Cookie", String(value));
|
|
70
|
+
delete headers[key];
|
|
71
|
+
}
|
|
72
|
+
appendPagesPreviewClearCookies(clearHeaders);
|
|
73
|
+
headers["Set-Cookie"] = clearHeaders.getSetCookie();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function applyDevPagesPreviewResponse(res, preview) {
|
|
77
|
+
const headers = res.getHeaders();
|
|
78
|
+
applyDevPagesPreviewHeaders(headers, preview);
|
|
79
|
+
for (const [name, value] of Object.entries(headers)) res.setHeader(name, value);
|
|
80
|
+
}
|
|
53
81
|
async function renderIsrPassToStringAsync(element) {
|
|
54
82
|
return await runWithServerInsertedHTMLState(() => runWithHeadState(() => _runWithCacheState(() => runWithPrivateCache(() => runWithFetchCache(async () => renderToStringAsync(element))))));
|
|
55
83
|
}
|
|
56
84
|
const DEV_STYLESHEET_ASSET_RE = /\.(?:css|scss|sass)$/i;
|
|
85
|
+
const transformedStylesheetAssetsCache = /* @__PURE__ */ new WeakMap();
|
|
86
|
+
const transformedStylesheetAssetsWatchers = /* @__PURE__ */ new WeakSet();
|
|
57
87
|
function createDevInitialStylesheetHeadHTML(options) {
|
|
58
88
|
const { ssrManifest, moduleIds, nonceAttr } = options;
|
|
59
89
|
if (!ssrManifest || moduleIds.length === 0) return "";
|
|
@@ -71,16 +101,64 @@ function createDevInitialStylesheetHeadHTML(options) {
|
|
|
71
101
|
}
|
|
72
102
|
return html;
|
|
73
103
|
}
|
|
74
|
-
async function
|
|
104
|
+
async function collectTransformedStylesheetAssets(server, moduleIds) {
|
|
105
|
+
const clientEnvironment = server.environments.client;
|
|
106
|
+
if (!clientEnvironment) return [];
|
|
107
|
+
const cachedServerAssets = transformedStylesheetAssetsCache.get(server);
|
|
108
|
+
const cache = cachedServerAssets ?? /* @__PURE__ */ new Map();
|
|
109
|
+
if (!cachedServerAssets) transformedStylesheetAssetsCache.set(server, cache);
|
|
110
|
+
if (!transformedStylesheetAssetsWatchers.has(server)) {
|
|
111
|
+
transformedStylesheetAssetsWatchers.add(server);
|
|
112
|
+
const clearCache = () => cache.clear();
|
|
113
|
+
server.watcher.on("add", clearCache);
|
|
114
|
+
server.watcher.on("change", clearCache);
|
|
115
|
+
server.watcher.on("unlink", clearCache);
|
|
116
|
+
}
|
|
117
|
+
const cacheKey = moduleIds.filter((moduleId) => Boolean(moduleId)).join("\0");
|
|
118
|
+
const cachedAssets = cache.get(cacheKey);
|
|
119
|
+
if (cachedAssets) return cachedAssets;
|
|
120
|
+
const assets = /* @__PURE__ */ new Set();
|
|
121
|
+
const seenModules = /* @__PURE__ */ new Set();
|
|
122
|
+
async function visitModule(moduleUrl) {
|
|
123
|
+
if (seenModules.has(moduleUrl)) return;
|
|
124
|
+
seenModules.add(moduleUrl);
|
|
125
|
+
try {
|
|
126
|
+
await clientEnvironment.transformRequest(moduleUrl);
|
|
127
|
+
const moduleNode = await clientEnvironment.moduleGraph.getModuleByUrl(moduleUrl);
|
|
128
|
+
if (!moduleNode) return;
|
|
129
|
+
for (const importedModule of moduleNode.importedModules) if (importedModule.type === "css" || /\.(?:css|scss|sass)(?:$|[?#])/i.test(importedModule.url)) {
|
|
130
|
+
if (importedModule.url.startsWith("//")) continue;
|
|
131
|
+
const assetUrl = importedModule.url.startsWith("\0") ? `/@id/__x00__${importedModule.url.slice(1)}${importedModule.url.includes("?") ? "&" : "?"}direct` : importedModule.url;
|
|
132
|
+
assets.add(assetUrl);
|
|
133
|
+
} else if (importedModule.type === "js") await visitModule(importedModule.url);
|
|
134
|
+
} catch {}
|
|
135
|
+
}
|
|
136
|
+
for (const moduleId of moduleIds) {
|
|
137
|
+
if (!moduleId) continue;
|
|
138
|
+
await visitModule(createPagesDevModuleUrl(server.config.root, moduleId, "/"));
|
|
139
|
+
}
|
|
140
|
+
const result = [...assets];
|
|
141
|
+
cache.set(cacheKey, result);
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
async function collectDevInitialStylesheetHeadHTML(server, runner, moduleIds, nonceAttr) {
|
|
145
|
+
let manifestHTML = "";
|
|
75
146
|
try {
|
|
76
|
-
|
|
147
|
+
manifestHTML = createDevInitialStylesheetHeadHTML({
|
|
77
148
|
ssrManifest: (await runner.import("virtual:vinext-pages-client-assets")).default?.ssrManifest,
|
|
78
149
|
moduleIds,
|
|
79
150
|
nonceAttr
|
|
80
151
|
});
|
|
81
|
-
} catch {
|
|
82
|
-
|
|
152
|
+
} catch {}
|
|
153
|
+
const transformedAssets = await collectTransformedStylesheetAssets(server, moduleIds);
|
|
154
|
+
if (transformedAssets.length === 0) return manifestHTML;
|
|
155
|
+
let html = manifestHTML;
|
|
156
|
+
for (const asset of transformedAssets) {
|
|
157
|
+
const href = asset.startsWith("/") ? asset : createPagesDevAssetUrl(asset);
|
|
158
|
+
if (html.includes(`href="${escapeHtmlAttr(href)}"`)) continue;
|
|
159
|
+
html += `<link rel="stylesheet"${nonceAttr} href="${escapeHtmlAttr(href)}" />\n `;
|
|
83
160
|
}
|
|
161
|
+
return html;
|
|
84
162
|
}
|
|
85
163
|
/**
|
|
86
164
|
* Emit a `getServerSideProps` / `getStaticProps` `{ redirect }` result.
|
|
@@ -98,6 +176,17 @@ function writeGsspRedirect(res, redirect, isDataReq, props) {
|
|
|
98
176
|
const status = redirect.statusCode ?? (redirect.permanent ? 308 : 307);
|
|
99
177
|
let dest = redirect.destination;
|
|
100
178
|
if (!dest.startsWith("http://") && !dest.startsWith("https://")) dest = dest.replace(/^[\\/]+/, "/");
|
|
179
|
+
if (isDangerousScheme(dest)) {
|
|
180
|
+
const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
|
|
181
|
+
const headers = {
|
|
182
|
+
"Cache-Control": "private, no-cache, no-store, max-age=0, must-revalidate",
|
|
183
|
+
"Content-Type": "text/plain; charset=utf-8"
|
|
184
|
+
};
|
|
185
|
+
if (deploymentId) headers[NEXTJS_DEPLOYMENT_ID_HEADER] = deploymentId;
|
|
186
|
+
res.writeHead(500, headers);
|
|
187
|
+
res.end("Invalid redirect destination");
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
101
190
|
if (isDataReq) {
|
|
102
191
|
const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
|
|
103
192
|
const dataHeaders = { "Content-Type": "application/json" };
|
|
@@ -288,7 +377,10 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
288
377
|
res.end("{}");
|
|
289
378
|
return;
|
|
290
379
|
}
|
|
291
|
-
await
|
|
380
|
+
await runWithRequestContext(createRequestContext(), async () => {
|
|
381
|
+
await _alsRegistration;
|
|
382
|
+
await renderErrorPage(server, runner, req, res, url, pagesDir, 404, void 0, matcher, void 0, reactStrictMode);
|
|
383
|
+
});
|
|
292
384
|
return;
|
|
293
385
|
}
|
|
294
386
|
const { route, params } = match;
|
|
@@ -296,9 +388,9 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
296
388
|
const parsedResolvedUrl = new URL(localeStrippedUrl, "http://vinext.local");
|
|
297
389
|
const originalRequestSearch = new URL(originalUrl, "http://vinext.local").search;
|
|
298
390
|
const gsspResolvedUrl = parsedResolvedUrl.pathname + originalRequestSearch;
|
|
299
|
-
|
|
391
|
+
let requestAsPath = isDataReq ? gsspResolvedUrl : i18nConfig ? extractLocaleFromUrl$1(originalUrl, i18nConfig, locale).url : originalUrl;
|
|
300
392
|
const userFacingParams = route.isDynamic ? params : null;
|
|
301
|
-
|
|
393
|
+
let query = mergeRouteParamsIntoQuery(parseQueryString(url), params);
|
|
302
394
|
return runWithRequestContext(createRequestContext(), async () => {
|
|
303
395
|
ensureFetchPatch();
|
|
304
396
|
try {
|
|
@@ -316,17 +408,30 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
316
408
|
});
|
|
317
409
|
}
|
|
318
410
|
const pageModule = await importModule(runner, route.filePath);
|
|
411
|
+
const isStaticPropsRender = typeof pageModule.getStaticProps === "function" && typeof pageModule.getServerSideProps !== "function";
|
|
412
|
+
if (isStaticPropsRender) {
|
|
413
|
+
query = mergeRouteParamsIntoQuery({}, params);
|
|
414
|
+
requestAsPath = localeStrippedUrl.split("?")[0];
|
|
415
|
+
}
|
|
416
|
+
const requestPreview = typeof pageModule.getStaticProps === "function" || typeof pageModule.getServerSideProps === "function" ? getPagesPreviewState(req.headers.cookie, { isOnDemandRevalidate: isOnDemandRevalidateRequest(req.headers[PRERENDER_REVALIDATE_HEADER]) }) : {
|
|
417
|
+
data: false,
|
|
418
|
+
shouldClear: false
|
|
419
|
+
};
|
|
420
|
+
const requestPreviewData = requestPreview.data;
|
|
319
421
|
let AppComponent = null;
|
|
320
422
|
const appPath = path.join(pagesDir, "_app");
|
|
321
423
|
if (findFileWithExtensions(appPath, matcher)) try {
|
|
322
424
|
AppComponent = (await importModule(runner, appPath)).default ?? null;
|
|
323
425
|
} catch {}
|
|
324
|
-
const pagesNextData =
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
426
|
+
const pagesNextData = {
|
|
427
|
+
...buildPagesReadinessNextData({
|
|
428
|
+
pageModule,
|
|
429
|
+
appComponent: AppComponent,
|
|
430
|
+
hasRewrites
|
|
431
|
+
}),
|
|
432
|
+
...requestPreviewData === false ? {} : { isPreview: true }
|
|
433
|
+
};
|
|
434
|
+
const navigationIsReady = isStaticPropsRender ? false : typeof routerShim.getPagesNavigationIsReadyFromSerializedState === "function" ? routerShim.getPagesNavigationIsReadyFromSerializedState(patternToNextFormat(route.pattern), new URL(url, "http://_").search, pagesNextData) : true;
|
|
330
435
|
if (typeof routerShim.setSSRContext === "function") routerShim.setSSRContext({
|
|
331
436
|
pathname: patternToNextFormat(route.pattern),
|
|
332
437
|
query,
|
|
@@ -336,7 +441,8 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
336
441
|
locale: locale ?? currentDefaultLocale,
|
|
337
442
|
locales: i18nConfig?.locales,
|
|
338
443
|
defaultLocale: currentDefaultLocale,
|
|
339
|
-
domainLocales
|
|
444
|
+
domainLocales,
|
|
445
|
+
isPreview: requestPreviewData !== false
|
|
340
446
|
});
|
|
341
447
|
_compileEnd = now();
|
|
342
448
|
const PageComponent = pageModule.default;
|
|
@@ -365,10 +471,11 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
365
471
|
}
|
|
366
472
|
let pageProps = {};
|
|
367
473
|
let renderProps = { pageProps };
|
|
474
|
+
if (requestPreviewData !== false) renderProps.__N_PREVIEW = true;
|
|
368
475
|
let isrRevalidateSeconds = null;
|
|
369
476
|
let isFallbackRender = false;
|
|
370
477
|
let shouldPersistFallbackData = false;
|
|
371
|
-
let staticPropsPreviewData =
|
|
478
|
+
let staticPropsPreviewData = requestPreviewData;
|
|
372
479
|
if (typeof pageModule.getStaticPaths === "function" && route.isDynamic) {
|
|
373
480
|
const pathsResult = await pageModule.getStaticPaths({
|
|
374
481
|
locales: i18nConfig?.locales ?? [],
|
|
@@ -378,7 +485,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
378
485
|
const paths = pathsResult?.paths ?? [];
|
|
379
486
|
const routeParams = getPagesRouteParams(patternToNextFormat(route.pattern));
|
|
380
487
|
const isValidPath = paths.some((pathEntry) => matchesPagesStaticPath(pathEntry, params, routeParams, url));
|
|
381
|
-
if (fallback === false && !isValidPath) {
|
|
488
|
+
if (fallback === false && !isValidPath && requestPreviewData === false) {
|
|
382
489
|
if (isDataReq) {
|
|
383
490
|
const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
|
|
384
491
|
const notFoundHeaders = { "Content-Type": "application/json" };
|
|
@@ -387,18 +494,18 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
387
494
|
res.end("{}");
|
|
388
495
|
return;
|
|
389
496
|
}
|
|
390
|
-
await renderErrorPage(server, runner, req, res, url, pagesDir, 404, routerShim.wrapWithRouterContext, matcher);
|
|
497
|
+
await renderErrorPage(server, runner, req, res, url, pagesDir, 404, routerShim.wrapWithRouterContext, matcher, void 0, reactStrictMode);
|
|
391
498
|
return;
|
|
392
499
|
}
|
|
393
500
|
const userAgentHeader = req.headers["user-agent"];
|
|
394
501
|
const userAgent = Array.isArray(userAgentHeader) ? userAgentHeader[0] : userAgentHeader;
|
|
395
502
|
const isBotRequest = !!userAgent && isBotUserAgent(userAgent, htmlLimitedBots);
|
|
396
|
-
if (fallback === true && !isValidPath && !isDataReq && !isBotRequest) {
|
|
503
|
+
if (fallback === true && !isValidPath && !isDataReq && !isBotRequest && requestPreviewData === false) {
|
|
397
504
|
isFallbackRender = (await isrGet(pagesIsrCacheKey(url.split("?")[0])))?.value.value?.kind !== "PAGES";
|
|
398
505
|
if (isFallbackRender && typeof routerShim.setSSRContext === "function") routerShim.setSSRContext({
|
|
399
506
|
pathname: patternToNextFormat(route.pattern),
|
|
400
|
-
query,
|
|
401
|
-
asPath:
|
|
507
|
+
query: {},
|
|
508
|
+
asPath: patternToNextFormat(route.pattern),
|
|
402
509
|
navigationIsReady: false,
|
|
403
510
|
locale: locale ?? currentDefaultLocale,
|
|
404
511
|
locales: i18nConfig?.locales,
|
|
@@ -430,6 +537,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
430
537
|
pathname: patternToNextFormat(route.pattern),
|
|
431
538
|
query,
|
|
432
539
|
asPath: requestAsPath,
|
|
540
|
+
router: routerShim.default,
|
|
433
541
|
locale: locale ?? currentDefaultLocale,
|
|
434
542
|
locales: i18nConfig?.locales,
|
|
435
543
|
defaultLocale: currentDefaultLocale
|
|
@@ -438,6 +546,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
438
546
|
if (appResult.kind === "render") {
|
|
439
547
|
pageProps = appResult.pageProps;
|
|
440
548
|
renderProps = appResult.renderProps;
|
|
549
|
+
if (requestPreviewData !== false) renderProps.__N_PREVIEW = true;
|
|
441
550
|
}
|
|
442
551
|
return false;
|
|
443
552
|
}
|
|
@@ -448,7 +557,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
448
557
|
__N_SSP: true
|
|
449
558
|
};
|
|
450
559
|
const headersBeforeGSSP = new Set(Object.keys(res.getHeaders()));
|
|
451
|
-
const previewData =
|
|
560
|
+
const previewData = requestPreviewData;
|
|
452
561
|
const previewContext = previewData === false ? {} : {
|
|
453
562
|
draftMode: true,
|
|
454
563
|
preview: true,
|
|
@@ -482,6 +591,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
482
591
|
return;
|
|
483
592
|
}
|
|
484
593
|
if (result && "notFound" in result && result.notFound) {
|
|
594
|
+
applyDevPagesPreviewResponse(res, requestPreview);
|
|
485
595
|
if (isDataReq) {
|
|
486
596
|
const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
|
|
487
597
|
const notFoundHeaders = { "Content-Type": "application/json" };
|
|
@@ -490,7 +600,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
490
600
|
res.end("{}");
|
|
491
601
|
return;
|
|
492
602
|
}
|
|
493
|
-
await renderErrorPage(server, runner, req, res, url, pagesDir, 404, routerShim.wrapWithRouterContext);
|
|
603
|
+
await renderErrorPage(server, runner, req, res, url, pagesDir, 404, routerShim.wrapWithRouterContext, void 0, void 0, reactStrictMode);
|
|
494
604
|
return;
|
|
495
605
|
}
|
|
496
606
|
if (result && "props" in result) isSerializableProps(patternToNextFormat(route.pattern), "getServerSideProps", pageProps);
|
|
@@ -519,7 +629,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
519
629
|
const cacheKey = pagesIsrCacheKey(url.split("?")[0]);
|
|
520
630
|
const cached = await isrGet(cacheKey);
|
|
521
631
|
const isOnDemandRevalidate = isOnDemandRevalidateRequest(req.headers[PRERENDER_REVALIDATE_HEADER]);
|
|
522
|
-
const previewData =
|
|
632
|
+
const previewData = requestPreviewData;
|
|
523
633
|
staticPropsPreviewData = previewData;
|
|
524
634
|
const previewContext = previewData === false ? {} : {
|
|
525
635
|
draftMode: true,
|
|
@@ -600,11 +710,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
600
710
|
return typeof routerShim.wrapWithRouterContext === "function" ? routerShim.wrapWithRouterContext(appTree) : appTree;
|
|
601
711
|
},
|
|
602
712
|
Component: pageModule.default,
|
|
603
|
-
router:
|
|
604
|
-
pathname: patternToNextFormat(route.pattern),
|
|
605
|
-
query,
|
|
606
|
-
asPath: requestAsPath
|
|
607
|
-
},
|
|
713
|
+
router: routerShim.default,
|
|
608
714
|
ctx: {
|
|
609
715
|
req: regenReq,
|
|
610
716
|
res: regenRes,
|
|
@@ -679,10 +785,11 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
679
785
|
...pagesNextData.__vinext,
|
|
680
786
|
pageModuleUrl: regenPageUrl,
|
|
681
787
|
appModuleUrl: regenAppUrl,
|
|
682
|
-
hasMiddleware
|
|
788
|
+
hasMiddleware,
|
|
789
|
+
routeUrl: requestAsPath
|
|
683
790
|
}
|
|
684
791
|
};
|
|
685
|
-
|
|
792
|
+
const freshHtml = `<!DOCTYPE html><html><head></head><body><div id="__next">${freshBody}</div>${`<script id="__NEXT_DATA__" type="application/json">${safeJsonStringify({
|
|
686
793
|
props: freshRenderProps,
|
|
687
794
|
page: patternToNextFormat(route.pattern),
|
|
688
795
|
query: params,
|
|
@@ -693,7 +800,8 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
693
800
|
defaultLocale: currentDefaultLocale,
|
|
694
801
|
domainLocales,
|
|
695
802
|
...freshPagesNextData
|
|
696
|
-
})}<\/script>`}\n ${cachedHtml.match(/<script type="module">[\s\S]*?<\/script>/)?.[0] ?? ""}</body></html
|
|
803
|
+
})}<\/script>`}\n ${cachedHtml.match(/<script type="module">[\s\S]*?<\/script>/)?.[0] ?? ""}</body></html>`;
|
|
804
|
+
await isrSet(cacheKey, buildPagesCacheValue(freshHtml, freshRenderProps), revalidate);
|
|
697
805
|
setRevalidateDuration(cacheKey, revalidate);
|
|
698
806
|
}
|
|
699
807
|
}
|
|
@@ -748,6 +856,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
748
856
|
return;
|
|
749
857
|
}
|
|
750
858
|
if (result && "notFound" in result && result.notFound) {
|
|
859
|
+
applyDevPagesPreviewResponse(res, requestPreview);
|
|
751
860
|
if (isDataReq) {
|
|
752
861
|
const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
|
|
753
862
|
const notFoundHeaders = { "Content-Type": "application/json" };
|
|
@@ -756,7 +865,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
756
865
|
res.end("{}");
|
|
757
866
|
return;
|
|
758
867
|
}
|
|
759
|
-
await renderErrorPage(server, runner, req, res, url, pagesDir, 404, routerShim.wrapWithRouterContext);
|
|
868
|
+
await renderErrorPage(server, runner, req, res, url, pagesDir, 404, routerShim.wrapWithRouterContext, void 0, void 0, reactStrictMode);
|
|
760
869
|
return;
|
|
761
870
|
}
|
|
762
871
|
if (result && "props" in result) isSerializableProps(patternToNextFormat(route.pattern), "getStaticProps", pageProps);
|
|
@@ -806,6 +915,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
806
915
|
const dataHeaders = { "Content-Type": "application/json" };
|
|
807
916
|
if ((statusCode ?? 200) === 200) dataHeaders["x-nextjs-matched-path"] = `${locale ? `/${locale}` : ""}${patternToNextFormat(route.pattern)}`;
|
|
808
917
|
if (gsspExtraHeaders) for (const [k, v] of Object.entries(gsspExtraHeaders)) dataHeaders[k] = v;
|
|
918
|
+
applyDevPagesPreviewHeaders(dataHeaders, requestPreview);
|
|
809
919
|
const dataRoutePattern = patternToNextFormat(route.pattern);
|
|
810
920
|
if (dataRoutePattern !== "/_error" && dataRoutePattern !== "/500") {
|
|
811
921
|
const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
|
|
@@ -833,7 +943,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
833
943
|
if (typeof dynamicShim.flushPreloads === "function") await dynamicShim.flushPreloads();
|
|
834
944
|
const nonceAttr = createNonceAttribute(scriptNonce);
|
|
835
945
|
let fontHeadHTML = "";
|
|
836
|
-
const assetHeadHTML = await collectDevInitialStylesheetHeadHTML(runner, [AppComponent ? findFileWithExts(pagesDir, "_app", matcher) : null, route.filePath], nonceAttr);
|
|
946
|
+
const assetHeadHTML = await collectDevInitialStylesheetHeadHTML(server, runner, [AppComponent ? findFileWithExts(pagesDir, "_app", matcher) : null, route.filePath], nonceAttr);
|
|
837
947
|
const allFontStyles = [];
|
|
838
948
|
const allFontPreloads = [];
|
|
839
949
|
try {
|
|
@@ -871,84 +981,21 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
|
|
|
871
981
|
...pagesNextData.__vinext,
|
|
872
982
|
pageModuleUrl,
|
|
873
983
|
appModuleUrl,
|
|
874
|
-
hasMiddleware
|
|
984
|
+
hasMiddleware,
|
|
985
|
+
routeUrl: requestAsPath
|
|
875
986
|
}
|
|
876
987
|
};
|
|
877
|
-
const hydrationScript =
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
const nextDataElement = document.getElementById("__NEXT_DATA__");
|
|
885
|
-
if (nextDataElement?.textContent) {
|
|
886
|
-
window.__NEXT_DATA__ = JSON.parse(nextDataElement.textContent);
|
|
887
|
-
window.__VINEXT_LOCALE__ = window.__NEXT_DATA__.locale;
|
|
888
|
-
window.__VINEXT_LOCALES__ = window.__NEXT_DATA__.locales;
|
|
889
|
-
window.__VINEXT_DEFAULT_LOCALE__ = window.__NEXT_DATA__.defaultLocale;
|
|
890
|
-
}
|
|
891
|
-
const nextData = window.__NEXT_DATA__;
|
|
892
|
-
_initializePagesRouterReadyFromNextData(nextData);
|
|
893
|
-
const props = nextData.props && typeof nextData.props === "object" ? nextData.props : {};
|
|
894
|
-
const rawPageProps = props.pageProps;
|
|
895
|
-
const pageProps = rawPageProps && typeof rawPageProps === "object" ? rawPageProps : {};
|
|
896
|
-
window.__VINEXT_PAGE_LOADERS__ = { [nextData.page]: () => import("${pageModuleSource}") };
|
|
897
|
-
window.__VINEXT_APP_LOADER__ = ${appModuleSource ? `() => import("${appModuleSource}")` : "undefined"};
|
|
898
|
-
// reactStrictMode flag — read by wrapWithRouterContext so the <React.StrictMode>
|
|
899
|
-
// wrap is applied on initial hydration and every navigation (matches Next.js).
|
|
900
|
-
window.__VINEXT_REACT_STRICT_MODE__ = ${JSON.stringify(reactStrictMode === true)};
|
|
901
|
-
|
|
902
|
-
async function hydrate() {
|
|
903
|
-
let hydrateRootOptions;
|
|
904
|
-
if (import.meta.env.DEV) {
|
|
905
|
-
const overlay = await import("vinext/dev-error-overlay");
|
|
906
|
-
overlay.installDevErrorOverlay();
|
|
907
|
-
overlay.installViteHmrErrorHandler(import.meta.hot);
|
|
908
|
-
overlay.reportInitialDevServerErrors();
|
|
909
|
-
hydrateRootOptions = {
|
|
910
|
-
onCaughtError: overlay.devOnCaughtError,
|
|
911
|
-
onUncaughtError: overlay.devOnUncaughtError,
|
|
912
|
-
};
|
|
913
|
-
}
|
|
914
|
-
|
|
915
|
-
const pageModule = await import("${pageModuleSource}");
|
|
916
|
-
const PageComponent = pageModule.default;
|
|
917
|
-
let element;
|
|
918
|
-
${appModuleSource ? `
|
|
919
|
-
const appModule = await import("${appModuleSource}");
|
|
920
|
-
const AppComponent = appModule.default;
|
|
921
|
-
window.__VINEXT_APP__ = AppComponent;
|
|
922
|
-
element = React.createElement(AppComponent, {
|
|
923
|
-
...props,
|
|
924
|
-
Component: PageComponent,
|
|
925
|
-
pageProps: rawPageProps,
|
|
926
|
-
router: Router,
|
|
927
|
-
});
|
|
928
|
-
` : `
|
|
929
|
-
element = React.createElement(PageComponent, pageProps);
|
|
930
|
-
`}
|
|
931
|
-
let resolveHydrationCommit;
|
|
932
|
-
const hydrationCommitted = new Promise((resolve) => { resolveHydrationCommit = resolve; });
|
|
933
|
-
element = wrapWithRouterContext(element, resolveHydrationCommit);
|
|
934
|
-
const root = hydrateRoot(document.getElementById("__next"), element, hydrateRootOptions);
|
|
935
|
-
window.__VINEXT_ROOT__ = root;
|
|
936
|
-
await hydrationCommitted;
|
|
937
|
-
const hydratedAt = performance.now();
|
|
938
|
-
window.__VINEXT_HYDRATED_AT = hydratedAt;
|
|
939
|
-
window.__NEXT_HYDRATED = true;
|
|
940
|
-
window.__NEXT_HYDRATED_AT = hydratedAt;
|
|
941
|
-
window.__NEXT_HYDRATED_CB?.();
|
|
942
|
-
if (nextData.isFallback) {
|
|
943
|
-
await Router.replace(window.location.pathname + window.location.search + window.location.hash, undefined, { _h: 1, scroll: false });
|
|
944
|
-
}
|
|
945
|
-
}
|
|
946
|
-
hydrate();
|
|
947
|
-
<\/script>`;
|
|
988
|
+
const hydrationScript = createPagesDevHydrationScript({
|
|
989
|
+
appModuleSource,
|
|
990
|
+
pageModuleSource,
|
|
991
|
+
reactStrictMode: reactStrictMode === true,
|
|
992
|
+
replaceFallbackRoute: true,
|
|
993
|
+
scriptNonce
|
|
994
|
+
});
|
|
948
995
|
const nextDataScript = `<script id="__NEXT_DATA__" type="application/json"${nonceAttr}>${safeJsonStringify({
|
|
949
996
|
props: renderProps,
|
|
950
997
|
page: patternToNextFormat(route.pattern),
|
|
951
|
-
query: params,
|
|
998
|
+
query: isFallbackRender ? {} : params,
|
|
952
999
|
buildId: process.env.__VINEXT_BUILD_ID,
|
|
953
1000
|
isFallback: isFallbackRender,
|
|
954
1001
|
locale: locale ?? currentDefaultLocale,
|
|
@@ -964,11 +1011,12 @@ hydrate();
|
|
|
964
1011
|
} catch {}
|
|
965
1012
|
const allScripts = `${nextDataScript}\n ${createInlineScriptTag(`window.__VINEXT_PAGE_PATTERNS__=${safeJsonStringify(pagePatterns)}`, scriptNonce)}\n ${hydrationScript}`;
|
|
966
1013
|
const extraHeaders = { ...gsspExtraHeaders };
|
|
967
|
-
if (isrRevalidateSeconds) if (scriptNonce) extraHeaders["Cache-Control"] = NO_STORE_CACHE_CONTROL;
|
|
1014
|
+
if (requestPreviewData === false && isrRevalidateSeconds) if (scriptNonce) extraHeaders["Cache-Control"] = NO_STORE_CACHE_CONTROL;
|
|
968
1015
|
else {
|
|
969
1016
|
extraHeaders["Cache-Control"] = buildMissIsrCacheControl(isrRevalidateSeconds);
|
|
970
1017
|
Object.assign(extraHeaders, buildCacheStateHeaders("MISS"));
|
|
971
1018
|
}
|
|
1019
|
+
applyDevPagesPreviewHeaders(extraHeaders, requestPreview);
|
|
972
1020
|
if (allFontPreloads.length > 0) extraHeaders["Link"] = allFontPreloads.map((p) => `<${p.href}>; rel=preload; as=font; type=${p.type}; crossorigin`).join(", ");
|
|
973
1021
|
await streamPageToResponse(res, withScriptNonce(element, scriptNonce), {
|
|
974
1022
|
url,
|
|
@@ -1038,7 +1086,7 @@ hydrate();
|
|
|
1038
1086
|
routeType: "render"
|
|
1039
1087
|
}).catch(() => {});
|
|
1040
1088
|
try {
|
|
1041
|
-
await renderErrorPage(server, runner, req, res, url, pagesDir, 500, void 0, matcher, e instanceof Error ? e : new Error(String(e)));
|
|
1089
|
+
await renderErrorPage(server, runner, req, res, url, pagesDir, 500, void 0, matcher, e instanceof Error ? e : new Error(String(e)), reactStrictMode);
|
|
1042
1090
|
} catch (fallbackErr) {
|
|
1043
1091
|
res.statusCode = 500;
|
|
1044
1092
|
res.end(`Internal Server Error: ${fallbackErr.message}`);
|
|
@@ -1055,71 +1103,127 @@ hydrate();
|
|
|
1055
1103
|
* - 500: pages/500.tsx -> pages/_error.tsx -> default
|
|
1056
1104
|
* - other: pages/_error.tsx -> default
|
|
1057
1105
|
*/
|
|
1058
|
-
async function renderErrorPage(server, runner, req, res, url, pagesDir, statusCode, wrapWithRouterContext, fileMatcher, err) {
|
|
1106
|
+
async function renderErrorPage(server, runner, req, res, url, pagesDir, statusCode, wrapWithRouterContext, fileMatcher, err, reactStrictMode = false) {
|
|
1059
1107
|
attachPagesRequestCookies(req);
|
|
1060
1108
|
const matcher = fileMatcher ?? createValidFileMatcher();
|
|
1061
1109
|
const candidates = statusCode === 404 ? ["404", "_error"] : statusCode === 500 ? ["500", "_error"] : ["_error"];
|
|
1062
|
-
for (const candidate of candidates)
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
res
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1110
|
+
for (const candidate of candidates) {
|
|
1111
|
+
let errorRouterShim = null;
|
|
1112
|
+
try {
|
|
1113
|
+
const errorAssetPath = findFileWithExts(pagesDir, candidate, matcher);
|
|
1114
|
+
if (!errorAssetPath && candidate !== "_error") continue;
|
|
1115
|
+
const ErrorComponent = (await importModule(runner, errorAssetPath ?? "next/error")).default;
|
|
1116
|
+
if (!ErrorComponent) continue;
|
|
1117
|
+
let AppComponent = null;
|
|
1118
|
+
const appPathErr = path.join(pagesDir, "_app");
|
|
1119
|
+
const appAssetPath = findFileWithExts(pagesDir, "_app", matcher);
|
|
1120
|
+
if (findFileWithExtensions(appPathErr, matcher)) try {
|
|
1121
|
+
AppComponent = (await importModule(runner, appAssetPath ?? appPathErr)).default ?? null;
|
|
1122
|
+
} catch {}
|
|
1123
|
+
const createElement = React.createElement;
|
|
1124
|
+
res.statusCode = statusCode;
|
|
1125
|
+
const errorPage = candidate === "_error" ? "/_error" : `/${candidate}`;
|
|
1126
|
+
const errorRouter = {
|
|
1127
|
+
pathname: errorPage,
|
|
1128
|
+
query: parseQueryString(url),
|
|
1129
|
+
asPath: url
|
|
1130
|
+
};
|
|
1131
|
+
try {
|
|
1132
|
+
errorRouterShim = await importModule(runner, "next/router");
|
|
1133
|
+
if (typeof errorRouterShim.setSSRContext === "function") errorRouterShim.setSSRContext({
|
|
1134
|
+
...errorRouter,
|
|
1135
|
+
navigationIsReady: true
|
|
1136
|
+
});
|
|
1137
|
+
} catch {}
|
|
1138
|
+
const serverRouter = errorRouterShim?.default ?? errorRouter;
|
|
1139
|
+
const wrapFn = wrapWithRouterContext ?? errorRouterShim?.wrapWithRouterContext;
|
|
1140
|
+
const initialErrorProps = await loadPagesGetInitialProps(ErrorComponent, {
|
|
1141
|
+
req,
|
|
1142
|
+
res,
|
|
1143
|
+
err,
|
|
1144
|
+
pathname: errorPage,
|
|
1145
|
+
query: errorRouter.query,
|
|
1146
|
+
asPath: url
|
|
1147
|
+
});
|
|
1148
|
+
if (res.headersSent || res.writableEnded) return;
|
|
1149
|
+
const errorProps = {
|
|
1150
|
+
...initialErrorProps,
|
|
1151
|
+
statusCode
|
|
1152
|
+
};
|
|
1153
|
+
let renderProps;
|
|
1154
|
+
if (AppComponent && hasPagesGetInitialProps(AppComponent)) {
|
|
1155
|
+
const appInitialProps = await loadPagesGetInitialProps(AppComponent, {
|
|
1156
|
+
AppTree: (appTreeProps) => {
|
|
1157
|
+
const appTree = createElement(AppComponent, {
|
|
1158
|
+
...appTreeProps,
|
|
1159
|
+
Component: ErrorComponent,
|
|
1160
|
+
router: serverRouter
|
|
1161
|
+
});
|
|
1162
|
+
return wrapFn ? wrapFn(appTree) : appTree;
|
|
1163
|
+
},
|
|
1164
|
+
Component: ErrorComponent,
|
|
1165
|
+
router: serverRouter,
|
|
1166
|
+
ctx: {
|
|
1167
|
+
req,
|
|
1168
|
+
res,
|
|
1169
|
+
err,
|
|
1170
|
+
pathname: errorPage,
|
|
1171
|
+
query: errorRouter.query,
|
|
1172
|
+
asPath: url
|
|
1173
|
+
}
|
|
1174
|
+
});
|
|
1175
|
+
if (res.headersSent || res.writableEnded) return;
|
|
1176
|
+
renderProps = appInitialProps ?? {};
|
|
1177
|
+
} else renderProps = { pageProps: errorProps };
|
|
1178
|
+
let DocumentComponent = null;
|
|
1179
|
+
const docPathErr = path.join(pagesDir, "_document");
|
|
1180
|
+
if (findFileWithExtensions(docPathErr, matcher)) try {
|
|
1181
|
+
DocumentComponent = (await importModule(runner, docPathErr)).default ?? null;
|
|
1182
|
+
} catch {}
|
|
1183
|
+
const createErrorElement = (FinalApp, FinalComponent) => {
|
|
1184
|
+
let errorElement = FinalApp ? createElement(FinalApp, {
|
|
1185
|
+
...renderProps,
|
|
1186
|
+
Component: FinalComponent,
|
|
1187
|
+
router: serverRouter
|
|
1188
|
+
}) : createElement(FinalComponent, errorProps);
|
|
1189
|
+
if (wrapFn) errorElement = wrapFn(errorElement);
|
|
1190
|
+
return errorElement;
|
|
1191
|
+
};
|
|
1192
|
+
const element = createErrorElement(AppComponent, ErrorComponent);
|
|
1193
|
+
const headShim = await importModule(runner, "next/head");
|
|
1194
|
+
if (typeof headShim.resetSSRHead === "function") headShim.resetSSRHead();
|
|
1195
|
+
const responseHeaders = typeof res.getHeaders === "function" ? res.getHeaders() : void 0;
|
|
1196
|
+
const scriptNonce = getScriptNonceFromNodeHeaderSources(req.headers, responseHeaders);
|
|
1197
|
+
const nonceAttr = createNonceAttribute(scriptNonce);
|
|
1198
|
+
const assetHeadHTML = await collectDevInitialStylesheetHeadHTML(server, runner, [appAssetPath, errorAssetPath], nonceAttr);
|
|
1199
|
+
const errorModuleSource = errorAssetPath ? createPagesDevModuleUrl(server.config.root, errorAssetPath, "/") : "next/error";
|
|
1200
|
+
const appModuleSource = appAssetPath ? createPagesDevModuleUrl(server.config.root, appAssetPath, "/") : null;
|
|
1201
|
+
const errorScripts = `${`<script id="__NEXT_DATA__" type="application/json"${nonceAttr}>${safeJsonStringify({
|
|
1202
|
+
props: renderProps,
|
|
1203
|
+
page: errorPage,
|
|
1204
|
+
query: parseQueryString(url),
|
|
1205
|
+
buildId: process.env.__VINEXT_BUILD_ID,
|
|
1206
|
+
isFallback: false
|
|
1207
|
+
})}<\/script>`}\n${createPagesDevHydrationScript({
|
|
1208
|
+
appModuleSource,
|
|
1209
|
+
forceRouterReady: true,
|
|
1210
|
+
normalizePageProps: false,
|
|
1211
|
+
pageModuleSource: errorModuleSource,
|
|
1212
|
+
reactStrictMode: reactStrictMode === true,
|
|
1213
|
+
scriptNonce,
|
|
1214
|
+
setPagePatternsFromNextData: true
|
|
1215
|
+
})}`;
|
|
1216
|
+
if (DocumentComponent) await streamPageToResponse(res, element, {
|
|
1113
1217
|
url,
|
|
1114
1218
|
server,
|
|
1115
1219
|
fontHeadHTML: "",
|
|
1116
1220
|
assetHeadHTML,
|
|
1117
|
-
scripts:
|
|
1221
|
+
scripts: errorScripts,
|
|
1118
1222
|
DocumentComponent,
|
|
1119
1223
|
statusCode,
|
|
1120
1224
|
documentContext: {
|
|
1121
1225
|
err,
|
|
1122
|
-
pathname:
|
|
1226
|
+
pathname: errorPage,
|
|
1123
1227
|
query: parseQueryString(url),
|
|
1124
1228
|
asPath: url,
|
|
1125
1229
|
req,
|
|
@@ -1135,8 +1239,8 @@ async function renderErrorPage(server, runner, req, res, url, pagesDir, statusCo
|
|
|
1135
1239
|
getHeadHTML: () => typeof headShim.getSSRHeadHTML === "function" ? headShim.getSSRHeadHTML() : "",
|
|
1136
1240
|
setDocumentInitialHead: typeof headShim.setDocumentInitialHead === "function" ? headShim.setDocumentInitialHead : void 0
|
|
1137
1241
|
});
|
|
1138
|
-
|
|
1139
|
-
|
|
1242
|
+
else {
|
|
1243
|
+
const html = `<!DOCTYPE html>
|
|
1140
1244
|
<html>
|
|
1141
1245
|
<head>
|
|
1142
1246
|
<meta charset="utf-8" />
|
|
@@ -1145,16 +1249,20 @@ async function renderErrorPage(server, runner, req, res, url, pagesDir, statusCo
|
|
|
1145
1249
|
</head>
|
|
1146
1250
|
<body>
|
|
1147
1251
|
<div id="__next">${await renderToStringAsync(element)}</div>
|
|
1252
|
+
${errorScripts}
|
|
1148
1253
|
</body>
|
|
1149
1254
|
</html>`;
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1255
|
+
const transformedHtml = await server.transformIndexHtml(url, html);
|
|
1256
|
+
res.writeHead(statusCode, { "Content-Type": "text/html; charset=utf-8" });
|
|
1257
|
+
res.end(transformedHtml);
|
|
1258
|
+
}
|
|
1259
|
+
return;
|
|
1260
|
+
} catch {
|
|
1261
|
+
if (res.headersSent || res.writableEnded) return;
|
|
1262
|
+
continue;
|
|
1263
|
+
} finally {
|
|
1264
|
+
if (typeof errorRouterShim?.setSSRContext === "function") errorRouterShim.setSSRContext(null);
|
|
1153
1265
|
}
|
|
1154
|
-
return;
|
|
1155
|
-
} catch {
|
|
1156
|
-
if (res.headersSent || res.writableEnded) return;
|
|
1157
|
-
continue;
|
|
1158
1266
|
}
|
|
1159
1267
|
if (statusCode === 404) {
|
|
1160
1268
|
const defaultResponse = buildDefaultPagesNotFoundResponse();
|