vinext 0.1.2 → 0.1.4
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/dist/build/client-build-config.d.ts +11 -2
- package/dist/build/client-build-config.js +17 -6
- package/dist/build/prerender.d.ts +9 -1
- package/dist/build/prerender.js +42 -12
- package/dist/build/run-prerender.d.ts +10 -2
- package/dist/build/run-prerender.js +15 -1
- package/dist/client/app-nav-failure-handler.d.ts +8 -0
- package/dist/client/app-nav-failure-handler.js +44 -0
- package/dist/client/pages-router-link-navigation.d.ts +33 -7
- package/dist/client/pages-router-link-navigation.js +32 -2
- package/dist/client/vinext-next-data.d.ts +18 -1
- package/dist/client/vinext-next-data.js +2 -0
- package/dist/client/window-next.d.ts +2 -1
- package/dist/client/window-next.js +12 -1
- package/dist/cloudflare/src/cache/cdn-adapter.runtime.js +6 -1
- package/dist/config/config-matchers.d.ts +11 -1
- package/dist/config/config-matchers.js +87 -16
- package/dist/config/next-config.d.ts +46 -4
- package/dist/config/next-config.js +147 -48
- package/dist/config/tsconfig-paths.js +14 -1
- package/dist/deploy.d.ts +30 -11
- package/dist/deploy.js +200 -112
- package/dist/entries/app-browser-entry.d.ts +9 -3
- package/dist/entries/app-browser-entry.js +21 -3
- package/dist/entries/app-rsc-entry.d.ts +2 -0
- package/dist/entries/app-rsc-entry.js +65 -5
- package/dist/entries/app-rsc-manifest.js +2 -0
- package/dist/entries/app-ssr-entry.js +1 -1
- package/dist/entries/pages-client-entry.js +66 -20
- package/dist/entries/pages-server-entry.js +47 -31
- package/dist/index.js +417 -102
- package/dist/plugins/dynamic-preload-metadata.js +2 -4
- package/dist/plugins/extensionless-dynamic-import.d.ts +6 -0
- package/dist/plugins/extensionless-dynamic-import.js +152 -0
- package/dist/plugins/fonts.js +5 -4
- package/dist/plugins/optimize-imports.d.ts +2 -1
- package/dist/plugins/optimize-imports.js +11 -9
- package/dist/plugins/postcss.js +7 -7
- package/dist/plugins/strip-server-exports.d.ts +9 -7
- package/dist/plugins/strip-server-exports.js +493 -46
- package/dist/plugins/typeof-window.d.ts +14 -0
- package/dist/plugins/typeof-window.js +150 -0
- package/dist/routing/app-route-graph.d.ts +2 -1
- package/dist/routing/app-route-graph.js +46 -16
- package/dist/routing/file-matcher.d.ts +10 -1
- package/dist/routing/file-matcher.js +22 -1
- package/dist/routing/pages-router.js +3 -3
- package/dist/routing/utils.d.ts +35 -6
- package/dist/routing/utils.js +59 -7
- package/dist/server/api-handler.d.ts +6 -1
- package/dist/server/api-handler.js +21 -15
- package/dist/server/app-browser-action-result.d.ts +19 -6
- package/dist/server/app-browser-action-result.js +20 -11
- package/dist/server/app-browser-entry.js +175 -91
- package/dist/server/app-browser-error.d.ts +10 -6
- package/dist/server/app-browser-error.js +43 -8
- package/dist/server/app-browser-hydration.d.ts +2 -0
- package/dist/server/app-browser-hydration.js +1 -0
- package/dist/server/app-browser-navigation-controller.d.ts +5 -3
- package/dist/server/app-browser-navigation-controller.js +23 -2
- package/dist/server/app-browser-server-action-navigation.d.ts +6 -0
- package/dist/server/app-browser-server-action-navigation.js +9 -0
- package/dist/server/app-browser-state.d.ts +1 -1
- package/dist/server/app-browser-state.js +19 -11
- package/dist/server/app-browser-stream.js +86 -43
- package/dist/server/app-browser-visible-commit.d.ts +1 -1
- package/dist/server/app-elements-wire.d.ts +6 -1
- package/dist/server/app-elements-wire.js +14 -4
- package/dist/server/app-elements.d.ts +2 -2
- package/dist/server/app-elements.js +2 -2
- package/dist/server/app-fallback-renderer.d.ts +1 -0
- package/dist/server/app-fallback-renderer.js +3 -1
- package/dist/server/app-optimistic-routing.js +2 -2
- package/dist/server/app-page-boundary-render.d.ts +1 -0
- package/dist/server/app-page-boundary-render.js +27 -14
- package/dist/server/app-page-cache-render.d.ts +53 -0
- package/dist/server/app-page-cache-render.js +91 -0
- package/dist/server/app-page-cache.d.ts +16 -2
- package/dist/server/app-page-cache.js +62 -1
- package/dist/server/app-page-dispatch.d.ts +26 -0
- package/dist/server/app-page-dispatch.js +149 -92
- package/dist/server/app-page-element-builder.d.ts +1 -0
- package/dist/server/app-page-element-builder.js +5 -2
- package/dist/server/app-page-execution.d.ts +6 -1
- package/dist/server/app-page-execution.js +21 -1
- package/dist/server/app-page-probe.d.ts +1 -0
- package/dist/server/app-page-probe.js +4 -0
- package/dist/server/app-page-render-observation.d.ts +3 -1
- package/dist/server/app-page-render-observation.js +17 -1
- package/dist/server/app-page-render.d.ts +12 -1
- package/dist/server/app-page-render.js +42 -4
- package/dist/server/app-page-request.d.ts +2 -0
- package/dist/server/app-page-request.js +2 -1
- package/dist/server/app-page-route-wiring.d.ts +3 -1
- package/dist/server/app-page-route-wiring.js +14 -5
- package/dist/server/app-page-stream.d.ts +15 -3
- package/dist/server/app-page-stream.js +11 -5
- package/dist/server/app-pages-bridge.d.ts +23 -1
- package/dist/server/app-pages-bridge.js +26 -17
- package/dist/server/app-ppr-fallback-shell-render.d.ts +17 -0
- package/dist/server/app-ppr-fallback-shell-render.js +26 -0
- package/dist/server/app-ppr-fallback-shell.d.ts +13 -1
- package/dist/server/app-ppr-fallback-shell.js +8 -1
- package/dist/server/app-route-handler-dispatch.js +9 -2
- package/dist/server/app-route-handler-policy.d.ts +1 -0
- package/dist/server/app-router-entry.js +5 -0
- package/dist/server/app-rsc-cache-busting.js +2 -0
- package/dist/server/app-rsc-handler.d.ts +28 -0
- package/dist/server/app-rsc-handler.js +195 -59
- package/dist/server/app-rsc-route-matching.d.ts +3 -0
- package/dist/server/app-rsc-route-matching.js +8 -2
- package/dist/server/app-segment-config.d.ts +9 -1
- package/dist/server/app-segment-config.js +12 -3
- package/dist/server/app-server-action-execution.d.ts +1 -0
- package/dist/server/app-server-action-execution.js +47 -15
- package/dist/server/app-ssr-entry.d.ts +2 -0
- package/dist/server/app-ssr-entry.js +84 -39
- package/dist/server/before-interactive-head.d.ts +17 -0
- package/dist/server/before-interactive-head.js +35 -0
- package/dist/server/cache-control.js +4 -0
- package/dist/server/csp.js +1 -4
- package/dist/server/dev-server.d.ts +2 -2
- package/dist/server/dev-server.js +321 -83
- package/dist/server/hybrid-route-priority.d.ts +22 -0
- package/dist/server/hybrid-route-priority.js +33 -0
- package/dist/server/image-optimization.d.ts +18 -9
- package/dist/server/image-optimization.js +37 -23
- package/dist/server/implicit-tags.d.ts +2 -1
- package/dist/server/implicit-tags.js +4 -1
- package/dist/server/middleware-matcher.js +12 -3
- package/dist/server/middleware-runtime.d.ts +3 -4
- package/dist/server/middleware-runtime.js +2 -0
- package/dist/server/navigation-planner.d.ts +135 -41
- package/dist/server/navigation-planner.js +138 -0
- package/dist/server/navigation-trace.d.ts +9 -1
- package/dist/server/navigation-trace.js +9 -1
- package/dist/server/operation-token.d.ts +40 -0
- package/dist/server/operation-token.js +85 -0
- package/dist/server/pages-api-route.d.ts +6 -0
- package/dist/server/pages-api-route.js +13 -2
- package/dist/server/pages-asset-tags.d.ts +2 -1
- package/dist/server/pages-asset-tags.js +6 -2
- package/dist/server/pages-data-route.d.ts +9 -2
- package/dist/server/pages-data-route.js +18 -6
- package/dist/server/pages-dev-module-url.d.ts +4 -0
- package/dist/server/pages-dev-module-url.js +15 -0
- package/dist/server/pages-document-initial-props.d.ts +4 -15
- package/dist/server/pages-document-initial-props.js +27 -56
- package/dist/server/pages-get-initial-props.d.ts +54 -4
- package/dist/server/pages-get-initial-props.js +43 -1
- package/dist/server/pages-i18n.js +2 -2
- package/dist/server/pages-node-compat.js +2 -2
- package/dist/server/pages-page-data.d.ts +11 -2
- package/dist/server/pages-page-data.js +207 -34
- package/dist/server/pages-page-handler.d.ts +4 -2
- package/dist/server/pages-page-handler.js +62 -23
- package/dist/server/pages-page-response.d.ts +4 -1
- package/dist/server/pages-page-response.js +11 -8
- package/dist/server/pages-readiness.js +1 -1
- package/dist/server/pages-request-pipeline.d.ts +8 -7
- package/dist/server/pages-request-pipeline.js +126 -47
- package/dist/server/pregenerated-concrete-paths.d.ts +1 -17
- package/dist/server/pregenerated-concrete-paths.js +2 -19
- package/dist/server/prerender-manifest.d.ts +33 -0
- package/dist/server/prerender-manifest.js +54 -0
- package/dist/server/prerender-route-params.d.ts +1 -2
- package/dist/server/prod-server.d.ts +3 -1
- package/dist/server/prod-server.js +50 -13
- package/dist/server/request-pipeline.d.ts +3 -15
- package/dist/server/request-pipeline.js +58 -47
- package/dist/server/rsc-stream-hints.d.ts +5 -1
- package/dist/server/rsc-stream-hints.js +6 -1
- package/dist/server/seed-cache.js +10 -18
- package/dist/server/static-file-cache.js +16 -4
- package/dist/shims/app-router-scroll-state.d.ts +3 -1
- package/dist/shims/app-router-scroll-state.js +14 -2
- package/dist/shims/app-router-scroll.d.ts +3 -0
- package/dist/shims/app-router-scroll.js +28 -18
- package/dist/shims/before-interactive-context.d.ts +14 -3
- package/dist/shims/cache-runtime.js +3 -2
- package/dist/shims/cache.d.ts +1 -0
- package/dist/shims/cache.js +1 -1
- package/dist/shims/cdn-cache.d.ts +5 -5
- package/dist/shims/document.d.ts +15 -20
- package/dist/shims/document.js +5 -8
- package/dist/shims/dynamic-preload-chunks.js +6 -4
- package/dist/shims/error-boundary.d.ts +2 -0
- package/dist/shims/error-boundary.js +7 -0
- package/dist/shims/error.js +3 -2
- package/dist/shims/error.react-server.d.ts +9 -0
- package/dist/shims/error.react-server.js +6 -0
- package/dist/shims/fetch-cache.d.ts +3 -1
- package/dist/shims/fetch-cache.js +45 -20
- package/dist/shims/hash-scroll.js +6 -1
- package/dist/shims/headers.js +29 -4
- package/dist/shims/image.js +9 -2
- package/dist/shims/internal/als-registry.js +28 -1
- package/dist/shims/internal/app-route-detection.js +8 -17
- package/dist/shims/internal/hybrid-client-route-owner.d.ts +31 -0
- package/dist/shims/internal/hybrid-client-route-owner.js +143 -0
- package/dist/shims/internal/navigation-untracked.d.ts +35 -0
- package/dist/shims/internal/navigation-untracked.js +55 -0
- package/dist/shims/internal/pages-data-fetch-dedup.d.ts +6 -7
- package/dist/shims/internal/pages-data-fetch-dedup.js +67 -14
- package/dist/shims/internal/pages-data-target.d.ts +7 -2
- package/dist/shims/internal/pages-data-target.js +17 -8
- package/dist/shims/internal/pages-router-accessor.d.ts +19 -0
- package/dist/shims/internal/pages-router-accessor.js +13 -0
- package/dist/shims/internal/router-context.d.ts +2 -1
- package/dist/shims/internal/router-context.js +3 -1
- package/dist/shims/link.js +47 -19
- package/dist/shims/metadata.js +4 -4
- package/dist/shims/navigation.d.ts +8 -2
- package/dist/shims/navigation.js +63 -31
- package/dist/shims/ppr-fallback-shell.d.ts +5 -1
- package/dist/shims/ppr-fallback-shell.js +28 -7
- package/dist/shims/router.d.ts +18 -3
- package/dist/shims/router.js +512 -142
- package/dist/shims/script.js +8 -4
- package/dist/shims/server.d.ts +16 -1
- package/dist/shims/server.js +44 -12
- package/dist/shims/unified-request-context.js +1 -0
- package/dist/utils/built-asset-url.d.ts +4 -0
- package/dist/utils/built-asset-url.js +11 -0
- package/dist/utils/commonjs-loader.d.ts +16 -0
- package/dist/utils/commonjs-loader.js +100 -0
- package/dist/utils/deployment-id.d.ts +8 -0
- package/dist/utils/deployment-id.js +22 -0
- package/dist/utils/has-trailing-comma.d.ts +24 -0
- package/dist/utils/has-trailing-comma.js +62 -0
- package/dist/utils/html-limited-bots.d.ts +18 -1
- package/dist/utils/html-limited-bots.js +23 -1
- package/dist/utils/parse-cookie.d.ts +13 -0
- package/dist/utils/parse-cookie.js +52 -0
- package/dist/utils/path.d.ts +7 -1
- package/dist/utils/path.js +9 -1
- package/dist/utils/text-stream.d.ts +1 -1
- package/dist/utils/text-stream.js +2 -2
- package/dist/utils/vite-version.d.ts +12 -1
- package/dist/utils/vite-version.js +9 -1
- package/package.json +2 -2
- package/dist/shims/internal/parse-cookie-header.d.ts +0 -14
- package/dist/shims/internal/parse-cookie-header.js +0 -30
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { NEXTJS_DEPLOYMENT_ID_HEADER } from "./headers.js";
|
|
2
2
|
import { normalizeStaticPathname } from "../routing/route-pattern.js";
|
|
3
3
|
import { buildCacheStateHeaders } from "./cache-headers.js";
|
|
4
|
+
import { isUnknownRecord } from "../utils/record.js";
|
|
4
5
|
import { applyCdnResponseHeaders } from "./cache-control.js";
|
|
5
6
|
import { decideIsr } from "./isr-decision.js";
|
|
6
7
|
import { buildPagesCacheValue } from "./isr-cache.js";
|
|
7
8
|
import { isSerializableProps } from "./pages-serializable-props.js";
|
|
8
9
|
import { hasPagesGetInitialProps, isResponseSent, loadPagesGetInitialProps } from "./pages-get-initial-props.js";
|
|
9
|
-
import {
|
|
10
|
+
import { isBotUserAgent } from "../utils/html-limited-bots.js";
|
|
11
|
+
import { buildNextDataPropsJsonResponse } from "./pages-data-route.js";
|
|
10
12
|
import { buildPagesNextDataScript, etagMatches, generatePagesETag, isPagesStreamingBot, requestsNoCache } from "./pages-page-response.js";
|
|
11
13
|
//#region src/server/pages-page-data.ts
|
|
12
14
|
function buildPagesDataNotFoundResponse(deploymentId) {
|
|
@@ -27,6 +29,65 @@ function buildPagesNotFoundResult(options) {
|
|
|
27
29
|
function resolvePagesRedirectStatus(redirect) {
|
|
28
30
|
return redirect.statusCode != null ? redirect.statusCode : redirect.permanent ? 308 : 307;
|
|
29
31
|
}
|
|
32
|
+
function normalizePagesRenderProps(props) {
|
|
33
|
+
return {
|
|
34
|
+
...props,
|
|
35
|
+
pageProps: props.pageProps
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Load `_app.getInitialProps` and return the normalized render props and the
|
|
40
|
+
* extracted `pageProps`. This is shared between the foreground render path and
|
|
41
|
+
* the stale-while-revalidate background regeneration path so both produce the
|
|
42
|
+
* same full props envelope (app-level props plus the page's `pageProps`).
|
|
43
|
+
*
|
|
44
|
+
* `getSharedReqRes` lets callers share the same mock req/res with other
|
|
45
|
+
* data-fetching steps (e.g. `getServerSideProps`) when they run in the same
|
|
46
|
+
* request context.
|
|
47
|
+
*/
|
|
48
|
+
async function loadPagesAppInitialRenderProps(options, getSharedReqRes) {
|
|
49
|
+
let pageProps = {};
|
|
50
|
+
let renderProps = { pageProps };
|
|
51
|
+
if (!hasPagesGetInitialProps(options.AppComponent)) return {
|
|
52
|
+
kind: "props",
|
|
53
|
+
pageProps,
|
|
54
|
+
renderProps
|
|
55
|
+
};
|
|
56
|
+
const { req, res, responsePromise } = getSharedReqRes();
|
|
57
|
+
const initialProps = await loadPagesGetInitialProps(options.AppComponent, {
|
|
58
|
+
AppTree: options.createAppTree ?? options.createPageElement,
|
|
59
|
+
Component: options.pageModule.default,
|
|
60
|
+
router: {
|
|
61
|
+
pathname: options.routePattern,
|
|
62
|
+
query: options.query,
|
|
63
|
+
asPath: options.asPath ?? options.routeUrl
|
|
64
|
+
},
|
|
65
|
+
ctx: {
|
|
66
|
+
req,
|
|
67
|
+
res,
|
|
68
|
+
err: options.err,
|
|
69
|
+
pathname: options.routePattern,
|
|
70
|
+
query: options.query,
|
|
71
|
+
asPath: options.asPath ?? options.routeUrl,
|
|
72
|
+
locale: options.i18n.locale,
|
|
73
|
+
locales: options.i18n.locales,
|
|
74
|
+
defaultLocale: options.i18n.defaultLocale
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
if (isResponseSent(res)) return {
|
|
78
|
+
kind: "response",
|
|
79
|
+
response: responsePromise
|
|
80
|
+
};
|
|
81
|
+
if (initialProps) {
|
|
82
|
+
renderProps = normalizePagesRenderProps(initialProps);
|
|
83
|
+
pageProps = isUnknownRecord(renderProps.pageProps) ? renderProps.pageProps : {};
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
kind: "props",
|
|
87
|
+
pageProps,
|
|
88
|
+
renderProps
|
|
89
|
+
};
|
|
90
|
+
}
|
|
30
91
|
/**
|
|
31
92
|
* Build the response for a `getServerSideProps` / `getStaticProps`
|
|
32
93
|
* `{ redirect }` result.
|
|
@@ -48,14 +109,18 @@ function resolvePagesRedirectStatus(redirect) {
|
|
|
48
109
|
* redirects (search `__N_REDIRECT`), consumed in
|
|
49
110
|
* `packages/next/src/shared/lib/router/router.ts` (`pageProps.__N_REDIRECT`).
|
|
50
111
|
*/
|
|
51
|
-
function buildPagesRedirectResponse(redirect, options) {
|
|
112
|
+
function buildPagesRedirectResponse(redirect, options, props = { pageProps: {} }) {
|
|
52
113
|
const destination = options.sanitizeDestination(redirect.destination);
|
|
53
114
|
if (options.isDataReq) {
|
|
54
115
|
const init = { headers: {} };
|
|
55
116
|
if (options.deploymentId) init.headers[NEXTJS_DEPLOYMENT_ID_HEADER] = options.deploymentId;
|
|
56
|
-
return
|
|
57
|
-
|
|
58
|
-
|
|
117
|
+
return buildNextDataPropsJsonResponse({
|
|
118
|
+
...props,
|
|
119
|
+
pageProps: {
|
|
120
|
+
...isUnknownRecord(props.pageProps) ? props.pageProps : {},
|
|
121
|
+
__N_REDIRECT: destination,
|
|
122
|
+
__N_REDIRECT_STATUS: resolvePagesRedirectStatus(redirect)
|
|
123
|
+
}
|
|
59
124
|
}, options.safeJsonStringify, init);
|
|
60
125
|
}
|
|
61
126
|
return new Response(null, {
|
|
@@ -133,7 +198,9 @@ function applyBotETagAndCheck(cachedResponse, html, options) {
|
|
|
133
198
|
function rewritePagesCachedHtml(cachedHtml, freshBody, nextDataScript) {
|
|
134
199
|
const bodyStart = cachedHtml.indexOf("<div id=\"__next\">");
|
|
135
200
|
const contentStart = bodyStart >= 0 ? bodyStart + 17 : -1;
|
|
136
|
-
const
|
|
201
|
+
const canonicalNextDataStart = cachedHtml.search(/<script\b(?=[^>]*\bid=["']__NEXT_DATA__["'])(?=[^>]*\btype=["']application\/json["'])[^>]*>/);
|
|
202
|
+
const legacyNextDataStart = cachedHtml.indexOf("<script>window.__NEXT_DATA__");
|
|
203
|
+
const nextDataStart = canonicalNextDataStart >= 0 ? canonicalNextDataStart : legacyNextDataStart;
|
|
137
204
|
if (contentStart >= 0 && nextDataStart >= 0) {
|
|
138
205
|
const region = cachedHtml.slice(contentStart, nextDataStart);
|
|
139
206
|
const lastCloseDiv = region.lastIndexOf("</div>");
|
|
@@ -145,11 +212,13 @@ function rewritePagesCachedHtml(cachedHtml, freshBody, nextDataScript) {
|
|
|
145
212
|
return "<!DOCTYPE html>\n<html>\n<head>\n</head>\n<body>\n <div id=\"__next\">" + freshBody + "</div>\n " + nextDataScript + "\n</body>\n</html>";
|
|
146
213
|
}
|
|
147
214
|
async function renderPagesIsrHtml(options) {
|
|
148
|
-
const
|
|
215
|
+
const renderProps = options.props ?? { pageProps: options.pageProps };
|
|
216
|
+
const freshBody = await options.renderIsrPassToStringAsync(options.createPageElement(renderProps));
|
|
149
217
|
const nextDataScript = buildPagesNextDataScript({
|
|
150
218
|
buildId: options.buildId,
|
|
151
219
|
i18n: options.i18n,
|
|
152
220
|
pageProps: options.pageProps,
|
|
221
|
+
props: renderProps,
|
|
153
222
|
params: options.params,
|
|
154
223
|
routePattern: options.routePattern,
|
|
155
224
|
safeJsonStringify: options.safeJsonStringify,
|
|
@@ -161,6 +230,7 @@ async function renderPagesIsrHtml(options) {
|
|
|
161
230
|
async function resolvePagesPageData(options) {
|
|
162
231
|
const userFacingParams = options.route.isDynamic ? options.params : null;
|
|
163
232
|
let isFallback = false;
|
|
233
|
+
let shouldPersistFallbackData = false;
|
|
164
234
|
if (typeof options.pageModule.getStaticPaths === "function" && options.route.isDynamic) {
|
|
165
235
|
const pathsResult = await options.pageModule.getStaticPaths({
|
|
166
236
|
locales: options.i18n.locales ?? [],
|
|
@@ -169,25 +239,62 @@ async function resolvePagesPageData(options) {
|
|
|
169
239
|
const fallback = pathsResult?.fallback ?? false;
|
|
170
240
|
const isValidPath = (pathsResult?.paths ?? []).some((pathEntry) => matchesPagesStaticPath(pathEntry, options.params, options.routeUrl));
|
|
171
241
|
if (fallback === false && !isValidPath) return buildPagesNotFoundResult(options);
|
|
172
|
-
|
|
242
|
+
const isBotRequest = !!options.userAgent && isBotUserAgent(options.userAgent, options.htmlLimitedBots);
|
|
243
|
+
if (fallback === true && !isValidPath && !options.isDataReq && !isBotRequest) isFallback = true;
|
|
244
|
+
shouldPersistFallbackData = fallback === true && !isValidPath && options.isDataReq === true;
|
|
173
245
|
}
|
|
174
246
|
let pageProps = {};
|
|
175
247
|
let gsspRes = null;
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
248
|
+
let sharedReqRes = null;
|
|
249
|
+
function getSharedReqRes() {
|
|
250
|
+
sharedReqRes ??= options.createGsspReqRes();
|
|
251
|
+
return sharedReqRes;
|
|
252
|
+
}
|
|
253
|
+
let renderProps = { pageProps };
|
|
254
|
+
async function loadForegroundAppInitialRenderProps() {
|
|
255
|
+
const result = await loadPagesAppInitialRenderProps(options, getSharedReqRes);
|
|
256
|
+
if (result.kind === "response") return {
|
|
257
|
+
kind: "response",
|
|
258
|
+
response: await result.response
|
|
259
|
+
};
|
|
260
|
+
renderProps = result.renderProps;
|
|
261
|
+
pageProps = result.pageProps;
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
if (isFallback) {
|
|
265
|
+
const pathname = options.routeUrl.split("?")[0];
|
|
266
|
+
if ((await options.isrGet(options.isrCacheKey("pages", pathname)))?.value.value?.kind !== "PAGES") {
|
|
267
|
+
const appShortCircuit = await loadForegroundAppInitialRenderProps();
|
|
268
|
+
if (appShortCircuit) return appShortCircuit;
|
|
269
|
+
pageProps = {};
|
|
270
|
+
renderProps = {
|
|
271
|
+
...renderProps,
|
|
272
|
+
pageProps
|
|
273
|
+
};
|
|
274
|
+
return {
|
|
275
|
+
kind: "render",
|
|
276
|
+
gsspRes: null,
|
|
277
|
+
isrRevalidateSeconds: null,
|
|
278
|
+
pageProps,
|
|
279
|
+
props: renderProps,
|
|
280
|
+
isFallback: true
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
}
|
|
183
284
|
if (typeof options.pageModule.getServerSideProps === "function") {
|
|
184
|
-
const
|
|
285
|
+
const shortCircuit = await loadForegroundAppInitialRenderProps();
|
|
286
|
+
if (shortCircuit) return shortCircuit;
|
|
287
|
+
renderProps = {
|
|
288
|
+
...renderProps,
|
|
289
|
+
__N_SSP: true
|
|
290
|
+
};
|
|
291
|
+
const { req, res, responsePromise } = getSharedReqRes();
|
|
185
292
|
const result = await options.pageModule.getServerSideProps({
|
|
186
293
|
params: userFacingParams,
|
|
187
294
|
req,
|
|
188
295
|
res,
|
|
189
296
|
query: options.query,
|
|
190
|
-
resolvedUrl: options.routeUrl,
|
|
297
|
+
resolvedUrl: options.resolvedUrl ?? options.routeUrl,
|
|
191
298
|
locale: options.i18n.locale,
|
|
192
299
|
locales: options.i18n.locales,
|
|
193
300
|
defaultLocale: options.i18n.defaultLocale
|
|
@@ -196,10 +303,19 @@ async function resolvePagesPageData(options) {
|
|
|
196
303
|
kind: "response",
|
|
197
304
|
response: await responsePromise
|
|
198
305
|
};
|
|
199
|
-
if (result?.props)
|
|
306
|
+
if (result?.props) {
|
|
307
|
+
pageProps = {
|
|
308
|
+
...pageProps,
|
|
309
|
+
...await Promise.resolve(result.props)
|
|
310
|
+
};
|
|
311
|
+
renderProps = {
|
|
312
|
+
...renderProps,
|
|
313
|
+
pageProps
|
|
314
|
+
};
|
|
315
|
+
}
|
|
200
316
|
if (result?.redirect) return {
|
|
201
317
|
kind: "response",
|
|
202
|
-
response: buildPagesRedirectResponse(result.redirect, options)
|
|
318
|
+
response: buildPagesRedirectResponse(result.redirect, options, renderProps)
|
|
203
319
|
};
|
|
204
320
|
if (result?.notFound) return buildPagesNotFoundResult(options);
|
|
205
321
|
if (result?.props !== void 0) isSerializableProps(options.routePattern, "getServerSideProps", pageProps);
|
|
@@ -211,7 +327,7 @@ async function resolvePagesPageData(options) {
|
|
|
211
327
|
const cacheKey = options.isrCacheKey("pages", pathname);
|
|
212
328
|
const cached = await options.isrGet(cacheKey);
|
|
213
329
|
const cachedValue = cached?.value.value;
|
|
214
|
-
if (!options.isOnDemandRevalidate && cachedValue?.kind === "PAGES" && cached && !cached.isStale && !options.scriptNonce && !options.isDataReq) {
|
|
330
|
+
if (!options.isOnDemandRevalidate && cached?.isStale === false && cachedValue?.kind === "PAGES" && !cachedValue.generatedFromDataRequest && cached && !cached.isStale && !options.scriptNonce && !options.isDataReq) {
|
|
215
331
|
const hitResponse = buildPagesCacheResponse(cachedValue.html, "HIT", options.fontLinkHeader, void 0, options.expireSeconds, cached.value.cacheControl, cachedValue.status);
|
|
216
332
|
const hitBotResult = applyBotETagAndCheck(hitResponse, cachedValue.html, options);
|
|
217
333
|
if (hitBotResult) return hitBotResult;
|
|
@@ -220,9 +336,14 @@ async function resolvePagesPageData(options) {
|
|
|
220
336
|
response: hitResponse
|
|
221
337
|
};
|
|
222
338
|
}
|
|
223
|
-
if (!options.isOnDemandRevalidate && cachedValue?.kind === "PAGES" && cached && cached.isStale && !options.scriptNonce && !options.isDataReq) {
|
|
339
|
+
if (!options.isOnDemandRevalidate && cachedValue?.kind === "PAGES" && !cachedValue.generatedFromDataRequest && cached && cached.isStale && !options.scriptNonce && !options.isDataReq) {
|
|
224
340
|
options.triggerBackgroundRegeneration(cacheKey, async function() {
|
|
225
341
|
return options.runInFreshUnifiedContext(async () => {
|
|
342
|
+
options.applyRequestContexts();
|
|
343
|
+
const freshAppResult = await loadPagesAppInitialRenderProps(options, () => options.createGsspReqRes());
|
|
344
|
+
if (freshAppResult.kind === "response") return;
|
|
345
|
+
let freshPageProps = freshAppResult.pageProps;
|
|
346
|
+
let freshRenderProps = freshAppResult.renderProps;
|
|
226
347
|
const freshResult = await options.pageModule.getStaticProps?.({
|
|
227
348
|
params: userFacingParams,
|
|
228
349
|
locale: options.i18n.locale,
|
|
@@ -230,14 +351,25 @@ async function resolvePagesPageData(options) {
|
|
|
230
351
|
defaultLocale: options.i18n.defaultLocale,
|
|
231
352
|
revalidateReason: "stale"
|
|
232
353
|
});
|
|
233
|
-
if (freshResult?.props
|
|
234
|
-
|
|
354
|
+
if (freshResult?.props) {
|
|
355
|
+
freshPageProps = {
|
|
356
|
+
...freshPageProps,
|
|
357
|
+
...freshResult.props
|
|
358
|
+
};
|
|
359
|
+
freshRenderProps = {
|
|
360
|
+
...freshRenderProps,
|
|
361
|
+
pageProps: freshPageProps
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
const freshRevalidateSeconds = typeof freshResult?.revalidate === "number" && freshResult.revalidate > 0 ? freshResult.revalidate : cached.value.cacheControl?.revalidate;
|
|
365
|
+
if (freshResult?.props && freshRevalidateSeconds && freshRevalidateSeconds > 0) {
|
|
235
366
|
const freshHtml = await renderPagesIsrHtml({
|
|
236
367
|
buildId: options.buildId,
|
|
237
368
|
cachedHtml: cachedValue.html,
|
|
238
369
|
createPageElement: options.createPageElement,
|
|
239
370
|
i18n: options.i18n,
|
|
240
|
-
pageProps:
|
|
371
|
+
pageProps: freshPageProps,
|
|
372
|
+
props: freshRenderProps,
|
|
241
373
|
params: options.params,
|
|
242
374
|
renderIsrPassToStringAsync: options.renderIsrPassToStringAsync,
|
|
243
375
|
routePattern: options.routePattern,
|
|
@@ -245,7 +377,7 @@ async function resolvePagesPageData(options) {
|
|
|
245
377
|
nextData: options.nextData,
|
|
246
378
|
vinext: options.vinext
|
|
247
379
|
});
|
|
248
|
-
await options.isrSet(cacheKey, buildPagesCacheValue(freshHtml,
|
|
380
|
+
await options.isrSet(cacheKey, buildPagesCacheValue(freshHtml, freshRenderProps, options.statusCode), freshRevalidateSeconds, void 0, options.expireSeconds);
|
|
249
381
|
}
|
|
250
382
|
});
|
|
251
383
|
}, {
|
|
@@ -261,24 +393,58 @@ async function resolvePagesPageData(options) {
|
|
|
261
393
|
response: staleResponse
|
|
262
394
|
};
|
|
263
395
|
}
|
|
264
|
-
const
|
|
396
|
+
const generatedPageData = !options.isOnDemandRevalidate && cached?.isStale === false && cachedValue?.kind === "PAGES" && cachedValue.generatedFromDataRequest && isUnknownRecord(cachedValue.pageData) ? cachedValue.pageData : null;
|
|
397
|
+
if (!generatedPageData) {
|
|
398
|
+
const shortCircuit = await loadForegroundAppInitialRenderProps();
|
|
399
|
+
if (shortCircuit) return shortCircuit;
|
|
400
|
+
}
|
|
401
|
+
const result = generatedPageData ? null : await options.pageModule.getStaticProps({
|
|
265
402
|
params: userFacingParams,
|
|
266
403
|
locale: options.i18n.locale,
|
|
267
404
|
locales: options.i18n.locales,
|
|
268
405
|
defaultLocale: options.i18n.defaultLocale,
|
|
269
406
|
revalidateReason: options.isOnDemandRevalidate ? "on-demand" : options.isBuildTimePrerendering ? "build" : "stale"
|
|
270
407
|
});
|
|
271
|
-
if (
|
|
408
|
+
if (generatedPageData) {
|
|
409
|
+
renderProps = generatedPageData;
|
|
410
|
+
pageProps = isUnknownRecord(renderProps.pageProps) ? renderProps.pageProps : {};
|
|
411
|
+
}
|
|
412
|
+
if (result?.props) {
|
|
413
|
+
pageProps = {
|
|
414
|
+
...pageProps,
|
|
415
|
+
...result.props
|
|
416
|
+
};
|
|
417
|
+
renderProps = {
|
|
418
|
+
...renderProps,
|
|
419
|
+
pageProps
|
|
420
|
+
};
|
|
421
|
+
}
|
|
272
422
|
if (result?.redirect) return {
|
|
273
423
|
kind: "response",
|
|
274
|
-
response: buildPagesRedirectResponse(result.redirect, options)
|
|
424
|
+
response: buildPagesRedirectResponse(result.redirect, options, renderProps)
|
|
275
425
|
};
|
|
276
426
|
if (result?.notFound) return buildPagesNotFoundResult(options);
|
|
277
427
|
if (result?.props !== void 0) isSerializableProps(options.routePattern, "getStaticProps", pageProps);
|
|
278
428
|
if (typeof result?.revalidate === "number" && result.revalidate > 0) isrRevalidateSeconds = result.revalidate;
|
|
429
|
+
else if (cachedValue?.kind === "PAGES" && cachedValue.generatedFromDataRequest) isrRevalidateSeconds = cached?.value.cacheControl?.revalidate ?? 31536e3;
|
|
430
|
+
if (shouldPersistFallbackData) {
|
|
431
|
+
const revalidateSeconds = isrRevalidateSeconds ?? 31536e3;
|
|
432
|
+
await options.isrSet(cacheKey, {
|
|
433
|
+
kind: "PAGES",
|
|
434
|
+
html: "",
|
|
435
|
+
pageData: renderProps,
|
|
436
|
+
generatedFromDataRequest: true,
|
|
437
|
+
headers: void 0,
|
|
438
|
+
status: void 0
|
|
439
|
+
}, revalidateSeconds, void 0, options.expireSeconds);
|
|
440
|
+
}
|
|
279
441
|
}
|
|
280
|
-
if (typeof options.pageModule.getServerSideProps !== "function" && typeof options.pageModule.getStaticProps !== "function" && hasPagesGetInitialProps(options.
|
|
281
|
-
const
|
|
442
|
+
if (typeof options.pageModule.getServerSideProps !== "function" && typeof options.pageModule.getStaticProps !== "function" && hasPagesGetInitialProps(options.AppComponent)) {
|
|
443
|
+
const shortCircuit = await loadForegroundAppInitialRenderProps();
|
|
444
|
+
if (shortCircuit) return shortCircuit;
|
|
445
|
+
}
|
|
446
|
+
if (typeof options.pageModule.getServerSideProps !== "function" && typeof options.pageModule.getStaticProps !== "function" && !hasPagesGetInitialProps(options.AppComponent) && hasPagesGetInitialProps(options.pageModule.default)) {
|
|
447
|
+
const { req, res, responsePromise } = getSharedReqRes();
|
|
282
448
|
const initialProps = await loadPagesGetInitialProps(options.pageModule.default, {
|
|
283
449
|
req,
|
|
284
450
|
res,
|
|
@@ -294,16 +460,23 @@ async function resolvePagesPageData(options) {
|
|
|
294
460
|
kind: "response",
|
|
295
461
|
response: await responsePromise
|
|
296
462
|
};
|
|
297
|
-
if (initialProps)
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
463
|
+
if (initialProps) {
|
|
464
|
+
pageProps = {
|
|
465
|
+
...pageProps,
|
|
466
|
+
...initialProps
|
|
467
|
+
};
|
|
468
|
+
renderProps = {
|
|
469
|
+
...renderProps,
|
|
470
|
+
pageProps
|
|
471
|
+
};
|
|
472
|
+
}
|
|
301
473
|
}
|
|
302
474
|
return {
|
|
303
475
|
kind: "render",
|
|
304
476
|
gsspRes,
|
|
305
477
|
isrRevalidateSeconds,
|
|
306
478
|
pageProps,
|
|
479
|
+
props: renderProps,
|
|
307
480
|
isFallback: false
|
|
308
481
|
};
|
|
309
482
|
}
|
|
@@ -31,6 +31,7 @@ type VinextConfigSubset = {
|
|
|
31
31
|
assetPrefix: string;
|
|
32
32
|
trailingSlash: boolean;
|
|
33
33
|
expireTime?: number;
|
|
34
|
+
htmlLimitedBots?: string;
|
|
34
35
|
clientTraceMetadata?: readonly string[];
|
|
35
36
|
disableOptimizedLoading: boolean;
|
|
36
37
|
};
|
|
@@ -73,8 +74,8 @@ type CreatePagesPageHandlerOptions = {
|
|
|
73
74
|
renderIsrPassToStringAsync: (element: ReactNode) => Promise<string>; /** `safeJsonStringify` from `vinext/html`. */
|
|
74
75
|
safeJsonStringify: (value: unknown) => string; /** `sanitizeDestination` from the config-matchers module. */
|
|
75
76
|
sanitizeDestination: (dest: string) => string; /** Build the React page element for a given set of page props. */
|
|
76
|
-
createPageElement: (PageComponent: ComponentType, AppComponent: ComponentType | null,
|
|
77
|
-
enhancePageElement: (PageComponent: ComponentType, AppComponent: ComponentType | null,
|
|
77
|
+
createPageElement: (PageComponent: ComponentType, AppComponent: ComponentType | null, props: Record<string, unknown>) => ReactNode; /** Build the element with optional App/Component enhancers (for _document). */
|
|
78
|
+
enhancePageElement: (PageComponent: ComponentType, AppComponent: ComponentType | null, props: Record<string, unknown>, opts: RenderPageEnhancers) => ReactNode; /** The `_app` page component (or null). */
|
|
78
79
|
AppComponent: ComponentType | null; /** The `_document` page component (or null). */
|
|
79
80
|
DocumentComponent: ComponentType | null;
|
|
80
81
|
};
|
|
@@ -82,6 +83,7 @@ type RenderPageOptions = {
|
|
|
82
83
|
isDataReq?: boolean;
|
|
83
84
|
statusCode?: number;
|
|
84
85
|
asPath?: string;
|
|
86
|
+
originalUrl?: string;
|
|
85
87
|
renderErrorPageOnMiss?: boolean;
|
|
86
88
|
__isInternalErrorRender?: boolean;
|
|
87
89
|
__forcedRoute?: PageRoute;
|
|
@@ -7,13 +7,14 @@ import { NEVER_CACHE_CONTROL } from "./cache-control.js";
|
|
|
7
7
|
import "./isr-decision.js";
|
|
8
8
|
import { PRERENDER_REVALIDATE_HEADER, isOnDemandRevalidateRequest, isrCacheKey, isrGet, isrSet, triggerBackgroundRegeneration } from "./isr-cache.js";
|
|
9
9
|
import { ensureFetchPatch } from "../shims/fetch-cache.js";
|
|
10
|
+
import { appendAssetDeploymentIdQuery } from "../utils/deployment-id.js";
|
|
10
11
|
import { mergeRouteParamsIntoQuery, parseQueryString } from "../utils/query.js";
|
|
11
12
|
import { getScriptNonceFromHeaderSources } from "./csp.js";
|
|
12
13
|
import { resolvePagesI18nRequest } from "./pages-i18n.js";
|
|
13
14
|
import { buildDefaultPagesNotFoundResponse } from "./pages-default-404.js";
|
|
14
15
|
import { buildPagesReadinessNextData } from "./pages-readiness.js";
|
|
15
16
|
import { resolvePagesPageMethodResponse } from "./pages-page-method.js";
|
|
16
|
-
import {
|
|
17
|
+
import { buildNextDataNotFoundResponse, buildNextDataPropsJsonResponse, normalizePagesDataRequest, parseNextDataPathname } from "./pages-data-route.js";
|
|
17
18
|
import { createPagesReqRes } from "./pages-node-compat.js";
|
|
18
19
|
import { collectAssetTags, resolveClientModuleUrl } from "./pages-asset-tags.js";
|
|
19
20
|
import { renderPagesPageResponse } from "./pages-page-response.js";
|
|
@@ -48,19 +49,38 @@ function createPagesPageHandler(opts) {
|
|
|
48
49
|
}
|
|
49
50
|
async function renderPage(request, url, manifest, middlewareHeaders, options) {
|
|
50
51
|
let isDataReq = !!(options && options.isDataReq);
|
|
52
|
+
const requestUrl = new URL(request.url);
|
|
53
|
+
const rawOriginalUrl = options && typeof options.originalUrl === "string" ? options.originalUrl : requestUrl.pathname + requestUrl.search;
|
|
54
|
+
const originalRequestUrl = new URL(rawOriginalUrl, requestUrl);
|
|
55
|
+
const originalRequestPathAndSearch = originalRequestUrl.pathname + originalRequestUrl.search;
|
|
56
|
+
let dataRequestPathname = null;
|
|
57
|
+
let dataRequestSearch = "";
|
|
58
|
+
const initialDataNorm = normalizePagesDataRequest(request, buildId);
|
|
51
59
|
if (!isDataReq) {
|
|
52
|
-
|
|
53
|
-
if (
|
|
54
|
-
if (dataNorm.isDataReq) {
|
|
60
|
+
if (initialDataNorm.notFoundResponse) return initialDataNorm.notFoundResponse;
|
|
61
|
+
if (initialDataNorm.isDataReq) {
|
|
55
62
|
isDataReq = true;
|
|
63
|
+
dataRequestPathname = initialDataNorm.normalizedPathname;
|
|
64
|
+
dataRequestSearch = initialDataNorm.search;
|
|
56
65
|
if (url && url.startsWith("/_next/data/")) {
|
|
57
66
|
const qs = url.includes("?") ? url.slice(url.indexOf("?")) : "";
|
|
58
|
-
url =
|
|
67
|
+
url = initialDataNorm.normalizedPathname + qs;
|
|
59
68
|
}
|
|
60
69
|
}
|
|
70
|
+
} else if (initialDataNorm.isDataReq) {
|
|
71
|
+
dataRequestPathname = initialDataNorm.normalizedPathname;
|
|
72
|
+
dataRequestSearch = initialDataNorm.search;
|
|
73
|
+
}
|
|
74
|
+
if (isDataReq && dataRequestPathname === null && buildId) {
|
|
75
|
+
const originalDataMatch = parseNextDataPathname(originalRequestUrl.pathname, buildId);
|
|
76
|
+
if (originalDataMatch) {
|
|
77
|
+
dataRequestPathname = originalDataMatch.pagePathname;
|
|
78
|
+
dataRequestSearch = originalRequestUrl.search;
|
|
79
|
+
}
|
|
61
80
|
}
|
|
62
81
|
const statusCode = options && typeof options.statusCode === "number" ? options.statusCode : void 0;
|
|
63
|
-
const
|
|
82
|
+
const defaultAsPath = isDataReq && dataRequestPathname ? dataRequestPathname + dataRequestSearch : originalRequestPathAndSearch;
|
|
83
|
+
const asPath = options && typeof options.asPath === "string" ? options.asPath : defaultAsPath;
|
|
64
84
|
const renderErrorPageOnMiss = !(options && options.renderErrorPageOnMiss === false);
|
|
65
85
|
const isInternalErrorRender = !!(options && options.__isInternalErrorRender);
|
|
66
86
|
const err = options && options.err;
|
|
@@ -143,8 +163,8 @@ function createPagesPageHandler(opts) {
|
|
|
143
163
|
});
|
|
144
164
|
if (methodResponse) return methodResponse;
|
|
145
165
|
}
|
|
146
|
-
const pageModuleUrl = resolveClientModuleUrl(manifest, route.filePath, vinextConfig.basePath, vinextConfig.assetPrefix);
|
|
147
|
-
const appModuleUrl = resolveClientModuleUrl(manifest, appAssetPath, vinextConfig.basePath, vinextConfig.assetPrefix);
|
|
166
|
+
const pageModuleUrl = resolveClientModuleUrl(manifest, route.filePath, vinextConfig.basePath, vinextConfig.assetPrefix, process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID);
|
|
167
|
+
const appModuleUrl = resolveClientModuleUrl(manifest, appAssetPath, vinextConfig.basePath, vinextConfig.assetPrefix, process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID);
|
|
148
168
|
const serializedPagesNextData = {
|
|
149
169
|
...pagesNextData,
|
|
150
170
|
__vinext: {
|
|
@@ -159,24 +179,30 @@ function createPagesPageHandler(opts) {
|
|
|
159
179
|
let allFontPreloads = [];
|
|
160
180
|
try {
|
|
161
181
|
allFontPreloads = getFontPreloads();
|
|
162
|
-
if (allFontPreloads.length > 0) fontLinkHeader = allFontPreloads.map((p) => "<" + p.href + ">; rel=preload; as=font; type=" + p.type + "; crossorigin").join(", ");
|
|
182
|
+
if (allFontPreloads.length > 0) fontLinkHeader = allFontPreloads.map((p) => "<" + appendAssetDeploymentIdQuery(p.href) + ">; rel=preload; as=font; type=" + p.type + "; crossorigin").join(", ");
|
|
163
183
|
} catch {}
|
|
184
|
+
const pagesResolvedUrl = (new URL(routeUrl, originalRequestUrl).pathname || "/") + originalRequestUrl.search;
|
|
164
185
|
const pageDataResult = await resolvePagesPageData({
|
|
165
186
|
isDataReq,
|
|
166
|
-
err,
|
|
187
|
+
err: err instanceof Error ? err : void 0,
|
|
167
188
|
applyRequestContexts: applySSRContext,
|
|
168
189
|
buildId,
|
|
169
190
|
deploymentId: process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID,
|
|
191
|
+
htmlLimitedBots: vinextConfig.htmlLimitedBots,
|
|
170
192
|
createGsspReqRes() {
|
|
171
193
|
return createPagesReqRes({
|
|
172
194
|
body: void 0,
|
|
173
195
|
query,
|
|
174
196
|
request,
|
|
175
|
-
url:
|
|
197
|
+
url: originalRequestPathAndSearch
|
|
176
198
|
});
|
|
177
199
|
},
|
|
178
|
-
|
|
179
|
-
const el = createPageElement(PageComponent, AppComponent,
|
|
200
|
+
createAppTree(appTreeProps) {
|
|
201
|
+
const el = createPageElement(PageComponent, AppComponent, appTreeProps);
|
|
202
|
+
return typeof wrapWithRouterContext === "function" ? wrapWithRouterContext(el) : el;
|
|
203
|
+
},
|
|
204
|
+
createPageElement(currentProps) {
|
|
205
|
+
const el = createPageElement(PageComponent, AppComponent, currentProps);
|
|
180
206
|
return typeof wrapWithRouterContext === "function" ? wrapWithRouterContext(el) : el;
|
|
181
207
|
},
|
|
182
208
|
fontLinkHeader,
|
|
@@ -188,15 +214,17 @@ function createPagesPageHandler(opts) {
|
|
|
188
214
|
isBuildTimePrerendering: typeof process !== "undefined" && process.env && process.env.VINEXT_PRERENDER === "1",
|
|
189
215
|
isOnDemandRevalidate: isOnDemandRevalidateRequest(request.headers.get(PRERENDER_REVALIDATE_HEADER)),
|
|
190
216
|
pageModule,
|
|
217
|
+
AppComponent,
|
|
191
218
|
params,
|
|
192
219
|
query,
|
|
193
220
|
asPath: renderAsPath ?? routeUrl,
|
|
221
|
+
resolvedUrl: pagesResolvedUrl,
|
|
194
222
|
renderIsrPassToStringAsync,
|
|
195
223
|
route: { isDynamic: route.isDynamic },
|
|
196
224
|
routePattern,
|
|
197
225
|
routeUrl,
|
|
198
226
|
runInFreshUnifiedContext(callback) {
|
|
199
|
-
return runWithRequestContext(createRequestContext({ executionContext:
|
|
227
|
+
return runWithRequestContext(createRequestContext({ executionContext: null }), async () => {
|
|
200
228
|
ensureFetchPatch();
|
|
201
229
|
return callback();
|
|
202
230
|
});
|
|
@@ -224,10 +252,17 @@ function createPagesPageHandler(opts) {
|
|
|
224
252
|
}
|
|
225
253
|
if (pageDataResult.kind === "response") return pageDataResult.response;
|
|
226
254
|
let pageProps = pageDataResult.pageProps;
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
255
|
+
let renderProps = pageDataResult.props;
|
|
256
|
+
if (routePattern === "/_error" && typeof renderStatusCode === "number") {
|
|
257
|
+
pageProps = {
|
|
258
|
+
...pageProps,
|
|
259
|
+
statusCode: renderStatusCode
|
|
260
|
+
};
|
|
261
|
+
renderProps = {
|
|
262
|
+
...renderProps,
|
|
263
|
+
pageProps
|
|
264
|
+
};
|
|
265
|
+
}
|
|
231
266
|
const gsspRes = pageDataResult.gsspRes;
|
|
232
267
|
const isrRevalidateSeconds = pageDataResult.isrRevalidateSeconds;
|
|
233
268
|
const isFallbackRender = pageDataResult.isFallback === true;
|
|
@@ -264,7 +299,7 @@ function createPagesPageHandler(opts) {
|
|
|
264
299
|
const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
|
|
265
300
|
if (deploymentId) init.headers[NEXTJS_DEPLOYMENT_ID_HEADER] = deploymentId;
|
|
266
301
|
}
|
|
267
|
-
return
|
|
302
|
+
return buildNextDataPropsJsonResponse(renderProps, safeJsonStringify, init);
|
|
268
303
|
}
|
|
269
304
|
const pageModuleIds = [];
|
|
270
305
|
if (route.filePath) pageModuleIds.push(route.filePath);
|
|
@@ -276,21 +311,23 @@ function createPagesPageHandler(opts) {
|
|
|
276
311
|
scriptNonce,
|
|
277
312
|
disableOptimizedLoading: vinextConfig.disableOptimizedLoading,
|
|
278
313
|
basePath: vinextConfig.basePath,
|
|
279
|
-
assetPrefix: vinextConfig.assetPrefix
|
|
314
|
+
assetPrefix: vinextConfig.assetPrefix,
|
|
315
|
+
deploymentId: process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID
|
|
280
316
|
}),
|
|
281
317
|
buildId,
|
|
282
318
|
clearSsrContext() {
|
|
283
319
|
if (typeof setSSRContext === "function") setSSRContext(null);
|
|
284
320
|
},
|
|
285
|
-
createPageElement(
|
|
286
|
-
const el = createPageElement(PageComponent, AppComponent,
|
|
321
|
+
createPageElement(currentProps) {
|
|
322
|
+
const el = createPageElement(PageComponent, AppComponent, currentProps);
|
|
287
323
|
return typeof wrapWithRouterContext === "function" ? wrapWithRouterContext(el) : el;
|
|
288
324
|
},
|
|
289
325
|
enhancePageElement(renderPageOpts) {
|
|
290
|
-
const el = enhancePageElement(PageComponent, AppComponent,
|
|
326
|
+
const el = enhancePageElement(PageComponent, AppComponent, renderProps, renderPageOpts);
|
|
291
327
|
return typeof wrapWithRouterContext === "function" ? wrapWithRouterContext(el) : el;
|
|
292
328
|
},
|
|
293
329
|
DocumentComponent,
|
|
330
|
+
err: err instanceof Error ? err : void 0,
|
|
294
331
|
flushPreloads: typeof flushPreloads === "function" ? flushPreloads : void 0,
|
|
295
332
|
fontLinkHeader,
|
|
296
333
|
fontPreloads: allFontPreloads,
|
|
@@ -306,7 +343,9 @@ function createPagesPageHandler(opts) {
|
|
|
306
343
|
i18n: buildI18nRenderContext(i18nConfig, locale, currentDefaultLocale, domainLocales),
|
|
307
344
|
isFallback: isFallbackRender,
|
|
308
345
|
pageProps,
|
|
346
|
+
props: renderProps,
|
|
309
347
|
params,
|
|
348
|
+
query,
|
|
310
349
|
renderDocumentToString(element) {
|
|
311
350
|
return renderToStringAsync(element);
|
|
312
351
|
},
|
|
@@ -66,6 +66,7 @@ type RenderPagesPageResponseOptions = {
|
|
|
66
66
|
*/
|
|
67
67
|
enhancePageElement?: ((opts: RenderPageEnhancers) => ReactNode) | undefined;
|
|
68
68
|
DocumentComponent: ComponentType | null;
|
|
69
|
+
err?: Error;
|
|
69
70
|
flushPreloads?: (() => Promise<void> | void) | undefined;
|
|
70
71
|
fontLinkHeader: string;
|
|
71
72
|
fontPreloads: PagesFontPreload[];
|
|
@@ -93,7 +94,9 @@ type RenderPagesPageResponseOptions = {
|
|
|
93
94
|
*/
|
|
94
95
|
isFallback?: boolean;
|
|
95
96
|
pageProps: Record<string, unknown>;
|
|
97
|
+
props?: Record<string, unknown>;
|
|
96
98
|
params: Record<string, unknown>;
|
|
99
|
+
query?: Record<string, unknown>;
|
|
97
100
|
renderDocumentToString: (element: ReactNode) => Promise<string>;
|
|
98
101
|
renderToReadableStream: (element: ReactNode) => Promise<ReadableStream<Uint8Array>>;
|
|
99
102
|
resetSSRHead?: (() => void) | undefined;
|
|
@@ -127,7 +130,7 @@ type RenderPagesPageResponseOptions = {
|
|
|
127
130
|
*/
|
|
128
131
|
requestCacheControl?: string;
|
|
129
132
|
};
|
|
130
|
-
declare function buildPagesNextDataScript(options: Pick<RenderPagesPageResponseOptions, "buildId" | "i18n" | "isFallback" | "pageProps" | "params" | "routePattern" | "safeJsonStringify" | "scriptNonce" | "nextData"> & {
|
|
133
|
+
declare function buildPagesNextDataScript(options: Pick<RenderPagesPageResponseOptions, "buildId" | "i18n" | "isFallback" | "pageProps" | "props" | "params" | "routePattern" | "safeJsonStringify" | "scriptNonce" | "nextData"> & {
|
|
131
134
|
vinext?: VinextNextData["__vinext"];
|
|
132
135
|
}): string;
|
|
133
136
|
declare function renderPagesPageResponse(options: RenderPagesPageResponseOptions): Promise<Response>;
|