vinext 0.0.52 → 0.0.54
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 +1 -1
- package/dist/build/clean-output.d.ts +14 -0
- package/dist/build/clean-output.js +36 -0
- package/dist/build/clean-output.js.map +1 -0
- package/dist/build/inline-css.d.ts +7 -0
- package/dist/build/inline-css.js +50 -0
- package/dist/build/inline-css.js.map +1 -0
- package/dist/build/prerender.d.ts +6 -2
- package/dist/build/prerender.js +51 -12
- package/dist/build/prerender.js.map +1 -1
- package/dist/build/run-prerender.js +10 -1
- package/dist/build/run-prerender.js.map +1 -1
- package/dist/build/static-export.d.ts +5 -0
- package/dist/build/static-export.js +8 -3
- package/dist/build/static-export.js.map +1 -1
- package/dist/check.js +4 -0
- package/dist/check.js.map +1 -1
- package/dist/cli.js +19 -4
- package/dist/cli.js.map +1 -1
- package/dist/client/instrumentation-client-inject.d.ts +34 -0
- package/dist/client/instrumentation-client-inject.js +57 -0
- package/dist/client/instrumentation-client-inject.js.map +1 -0
- package/dist/client/navigation-runtime.d.ts +16 -2
- package/dist/client/navigation-runtime.js +16 -1
- package/dist/client/navigation-runtime.js.map +1 -1
- package/dist/client/vinext-next-data.d.ts +2 -1
- package/dist/client/vinext-next-data.js.map +1 -1
- package/dist/client/window-next.d.ts +17 -2
- package/dist/client/window-next.js.map +1 -1
- package/dist/cloudflare/tpr.js +1 -1
- package/dist/cloudflare/tpr.js.map +1 -1
- package/dist/config/config-matchers.js +2 -1
- package/dist/config/config-matchers.js.map +1 -1
- package/dist/config/next-config.d.ts +95 -4
- package/dist/config/next-config.js +173 -14
- package/dist/config/next-config.js.map +1 -1
- package/dist/deploy.js +42 -7
- package/dist/deploy.js.map +1 -1
- package/dist/entries/app-browser-entry.d.ts +11 -1
- package/dist/entries/app-browser-entry.js +16 -6
- package/dist/entries/app-browser-entry.js.map +1 -1
- package/dist/entries/app-rsc-entry.d.ts +12 -3
- package/dist/entries/app-rsc-entry.js +41 -8
- package/dist/entries/app-rsc-entry.js.map +1 -1
- package/dist/entries/app-rsc-manifest.d.ts +21 -1
- package/dist/entries/app-rsc-manifest.js +6 -4
- package/dist/entries/app-rsc-manifest.js.map +1 -1
- package/dist/entries/pages-client-entry.d.ts +4 -1
- package/dist/entries/pages-client-entry.js +40 -3
- package/dist/entries/pages-client-entry.js.map +1 -1
- package/dist/entries/pages-server-entry.js +292 -34
- package/dist/entries/pages-server-entry.js.map +1 -1
- package/dist/entries/runtime-entry-module.d.ts +1 -10
- package/dist/entries/runtime-entry-module.js +2 -12
- package/dist/entries/runtime-entry-module.js.map +1 -1
- package/dist/index.js +91 -10
- package/dist/index.js.map +1 -1
- package/dist/plugins/fonts.js +25 -2
- package/dist/plugins/fonts.js.map +1 -1
- package/dist/plugins/remove-console.d.ts +16 -0
- package/dist/plugins/remove-console.js +176 -0
- package/dist/plugins/remove-console.js.map +1 -0
- package/dist/routing/app-route-graph.d.ts +24 -1
- package/dist/routing/app-route-graph.js +52 -4
- package/dist/routing/app-route-graph.js.map +1 -1
- package/dist/routing/app-router.d.ts +2 -2
- package/dist/routing/app-router.js +2 -2
- package/dist/routing/app-router.js.map +1 -1
- package/dist/routing/file-matcher.d.ts +21 -1
- package/dist/routing/file-matcher.js +39 -1
- package/dist/routing/file-matcher.js.map +1 -1
- package/dist/routing/pages-router.d.ts +1 -1
- package/dist/routing/pages-router.js +10 -3
- package/dist/routing/pages-router.js.map +1 -1
- package/dist/routing/route-trie.js +13 -18
- package/dist/routing/route-trie.js.map +1 -1
- package/dist/routing/utils.d.ts +11 -1
- package/dist/routing/utils.js +15 -1
- package/dist/routing/utils.js.map +1 -1
- package/dist/server/api-handler.js +19 -10
- package/dist/server/api-handler.js.map +1 -1
- package/dist/server/app-browser-action-result.d.ts +16 -1
- package/dist/server/app-browser-action-result.js +15 -1
- package/dist/server/app-browser-action-result.js.map +1 -1
- package/dist/server/app-browser-entry.js +47 -28
- package/dist/server/app-browser-entry.js.map +1 -1
- package/dist/server/app-browser-navigation-controller.d.ts +2 -0
- package/dist/server/app-browser-navigation-controller.js +4 -0
- package/dist/server/app-browser-navigation-controller.js.map +1 -1
- package/dist/server/app-elements-wire.d.ts +13 -4
- package/dist/server/app-elements-wire.js +10 -1
- package/dist/server/app-elements-wire.js.map +1 -1
- package/dist/server/app-elements.d.ts +2 -2
- package/dist/server/app-elements.js +2 -2
- package/dist/server/app-elements.js.map +1 -1
- package/dist/server/app-fallback-renderer.d.ts +27 -8
- package/dist/server/app-fallback-renderer.js +19 -8
- package/dist/server/app-fallback-renderer.js.map +1 -1
- package/dist/server/app-history-state.js +6 -2
- package/dist/server/app-history-state.js.map +1 -1
- package/dist/server/app-inline-css-client.d.ts +7 -0
- package/dist/server/app-inline-css-client.js +37 -0
- package/dist/server/app-inline-css-client.js.map +1 -0
- package/dist/server/app-interception-context-header.d.ts +33 -0
- package/dist/server/app-interception-context-header.js +44 -0
- package/dist/server/app-interception-context-header.js.map +1 -0
- package/dist/server/app-mounted-slots-header.d.ts +19 -0
- package/dist/server/app-mounted-slots-header.js +40 -1
- package/dist/server/app-mounted-slots-header.js.map +1 -1
- package/dist/server/app-optimistic-routing.js +26 -18
- package/dist/server/app-optimistic-routing.js.map +1 -1
- package/dist/server/app-page-boundary-render.d.ts +1 -0
- package/dist/server/app-page-boundary-render.js +2 -0
- package/dist/server/app-page-boundary-render.js.map +1 -1
- package/dist/server/app-page-boundary.d.ts +22 -1
- package/dist/server/app-page-boundary.js +30 -3
- package/dist/server/app-page-boundary.js.map +1 -1
- package/dist/server/app-page-cache.d.ts +9 -3
- package/dist/server/app-page-cache.js +14 -8
- package/dist/server/app-page-cache.js.map +1 -1
- package/dist/server/app-page-dispatch.d.ts +13 -1
- package/dist/server/app-page-dispatch.js +136 -82
- package/dist/server/app-page-dispatch.js.map +1 -1
- package/dist/server/app-page-element-builder.d.ts +2 -1
- package/dist/server/app-page-element-builder.js +17 -30
- package/dist/server/app-page-element-builder.js.map +1 -1
- package/dist/server/app-page-execution.d.ts +1 -0
- package/dist/server/app-page-execution.js +2 -0
- package/dist/server/app-page-execution.js.map +1 -1
- package/dist/server/app-page-head.d.ts +1 -0
- package/dist/server/app-page-head.js +8 -0
- package/dist/server/app-page-head.js.map +1 -1
- package/dist/server/app-page-render-identity.d.ts +22 -0
- package/dist/server/app-page-render-identity.js +42 -0
- package/dist/server/app-page-render-identity.js.map +1 -0
- package/dist/server/app-page-render-observation.js +1 -1
- package/dist/server/app-page-render.d.ts +9 -1
- package/dist/server/app-page-render.js +8 -2
- package/dist/server/app-page-render.js.map +1 -1
- package/dist/server/app-page-request.d.ts +6 -3
- package/dist/server/app-page-request.js +5 -2
- package/dist/server/app-page-request.js.map +1 -1
- package/dist/server/app-page-response.d.ts +11 -1
- package/dist/server/app-page-response.js +16 -4
- package/dist/server/app-page-response.js.map +1 -1
- package/dist/server/app-page-route-wiring.d.ts +16 -0
- package/dist/server/app-page-route-wiring.js +25 -10
- package/dist/server/app-page-route-wiring.js.map +1 -1
- package/dist/server/app-page-stream.d.ts +12 -0
- package/dist/server/app-page-stream.js +3 -0
- package/dist/server/app-page-stream.js.map +1 -1
- package/dist/server/app-route-handler-dispatch.d.ts +1 -0
- package/dist/server/app-route-handler-dispatch.js +3 -0
- package/dist/server/app-route-handler-dispatch.js.map +1 -1
- package/dist/server/app-route-handler-execution.d.ts +1 -0
- package/dist/server/app-route-handler-execution.js +1 -0
- package/dist/server/app-route-handler-execution.js.map +1 -1
- package/dist/server/app-route-handler-response.js +38 -6
- package/dist/server/app-route-handler-response.js.map +1 -1
- package/dist/server/app-rsc-handler.d.ts +16 -3
- package/dist/server/app-rsc-handler.js +60 -11
- package/dist/server/app-rsc-handler.js.map +1 -1
- package/dist/server/app-rsc-request-normalization.d.ts +2 -1
- package/dist/server/app-rsc-request-normalization.js +6 -4
- package/dist/server/app-rsc-request-normalization.js.map +1 -1
- package/dist/server/app-segment-config.d.ts +4 -1
- package/dist/server/app-segment-config.js +6 -1
- package/dist/server/app-segment-config.js.map +1 -1
- package/dist/server/app-server-action-execution.d.ts +22 -3
- package/dist/server/app-server-action-execution.js +46 -7
- package/dist/server/app-server-action-execution.js.map +1 -1
- package/dist/server/app-ssr-entry.d.ts +6 -0
- package/dist/server/app-ssr-entry.js +57 -6
- package/dist/server/app-ssr-entry.js.map +1 -1
- package/dist/server/app-ssr-error-meta.js +3 -3
- package/dist/server/app-ssr-error-meta.js.map +1 -1
- package/dist/server/app-ssr-stream.d.ts +25 -1
- package/dist/server/app-ssr-stream.js +237 -19
- package/dist/server/app-ssr-stream.js.map +1 -1
- package/dist/server/app-static-generation.d.ts +1 -0
- package/dist/server/app-static-generation.js +2 -1
- package/dist/server/app-static-generation.js.map +1 -1
- package/dist/server/client-trace-metadata.d.ts +31 -0
- package/dist/server/client-trace-metadata.js +83 -0
- package/dist/server/client-trace-metadata.js.map +1 -0
- package/dist/server/cookie-utils.d.ts +13 -0
- package/dist/server/cookie-utils.js +20 -0
- package/dist/server/cookie-utils.js.map +1 -0
- package/dist/server/default-not-found-module.d.ts +20 -0
- package/dist/server/default-not-found-module.js +20 -0
- package/dist/server/default-not-found-module.js.map +1 -0
- package/dist/server/dev-server.d.ts +8 -1
- package/dist/server/dev-server.js +56 -11
- package/dist/server/dev-server.js.map +1 -1
- package/dist/server/headers.d.ts +5 -1
- package/dist/server/headers.js +5 -1
- package/dist/server/headers.js.map +1 -1
- package/dist/server/html.d.ts +2 -1
- package/dist/server/html.js +6 -1
- package/dist/server/html.js.map +1 -1
- package/dist/server/image-optimization.d.ts +13 -4
- package/dist/server/image-optimization.js +15 -4
- package/dist/server/image-optimization.js.map +1 -1
- package/dist/server/isr-cache.d.ts +7 -5
- package/dist/server/isr-cache.js +17 -6
- package/dist/server/isr-cache.js.map +1 -1
- package/dist/server/middleware-runtime.js +1 -2
- package/dist/server/middleware-runtime.js.map +1 -1
- package/dist/server/middleware.js +1 -1
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/pages-api-route.d.ts +18 -0
- package/dist/server/pages-api-route.js +3 -1
- package/dist/server/pages-api-route.js.map +1 -1
- package/dist/server/pages-body-parser-config.d.ts +60 -0
- package/dist/server/pages-body-parser-config.js +79 -0
- package/dist/server/pages-body-parser-config.js.map +1 -0
- package/dist/server/pages-data-route.js +1 -0
- package/dist/server/pages-data-route.js.map +1 -1
- package/dist/server/pages-default-404.d.ts +31 -0
- package/dist/server/pages-default-404.js +40 -0
- package/dist/server/pages-default-404.js.map +1 -0
- package/dist/server/pages-document-initial-props.d.ts +7 -0
- package/dist/server/pages-document-initial-props.js +14 -0
- package/dist/server/pages-document-initial-props.js.map +1 -0
- package/dist/server/pages-node-compat.d.ts +10 -0
- package/dist/server/pages-node-compat.js +12 -1
- package/dist/server/pages-node-compat.js.map +1 -1
- package/dist/server/pages-page-data.d.ts +40 -0
- package/dist/server/pages-page-data.js +19 -14
- package/dist/server/pages-page-data.js.map +1 -1
- package/dist/server/pages-page-method.d.ts +48 -0
- package/dist/server/pages-page-method.js +19 -0
- package/dist/server/pages-page-method.js.map +1 -0
- package/dist/server/pages-page-response.d.ts +8 -0
- package/dist/server/pages-page-response.js +21 -11
- package/dist/server/pages-page-response.js.map +1 -1
- package/dist/server/pages-serializable-props.d.ts +25 -0
- package/dist/server/pages-serializable-props.js +69 -0
- package/dist/server/pages-serializable-props.js.map +1 -0
- package/dist/server/prerender-route-params.d.ts +14 -0
- package/dist/server/prerender-route-params.js +94 -0
- package/dist/server/prerender-route-params.js.map +1 -0
- package/dist/server/prod-server.d.ts +3 -23
- package/dist/server/prod-server.js +43 -57
- package/dist/server/prod-server.js.map +1 -1
- package/dist/server/proxy-trust.d.ts +41 -0
- package/dist/server/proxy-trust.js +70 -0
- package/dist/server/proxy-trust.js.map +1 -0
- package/dist/server/request-pipeline.d.ts +3 -3
- package/dist/server/request-pipeline.js +5 -4
- package/dist/server/request-pipeline.js.map +1 -1
- package/dist/server/seed-cache.js +12 -6
- package/dist/server/seed-cache.js.map +1 -1
- package/dist/server/server-action-not-found.js +3 -2
- package/dist/server/server-action-not-found.js.map +1 -1
- package/dist/server/static-file-cache.js +2 -1
- package/dist/server/static-file-cache.js.map +1 -1
- package/dist/server/streaming-metadata.d.ts +5 -0
- package/dist/server/streaming-metadata.js +10 -0
- package/dist/server/streaming-metadata.js.map +1 -0
- package/dist/shims/app-router-scroll-state.d.ts +14 -0
- package/dist/shims/app-router-scroll-state.js +51 -0
- package/dist/shims/app-router-scroll-state.js.map +1 -0
- package/dist/shims/app-router-scroll.d.ts +28 -0
- package/dist/shims/app-router-scroll.js +115 -0
- package/dist/shims/app-router-scroll.js.map +1 -0
- package/dist/shims/before-interactive-context.d.ts +30 -0
- package/dist/shims/before-interactive-context.js +10 -0
- package/dist/shims/before-interactive-context.js.map +1 -0
- package/dist/shims/cache-runtime.d.ts +1 -1
- package/dist/shims/cache-runtime.js +14 -1
- package/dist/shims/cache-runtime.js.map +1 -1
- package/dist/shims/cache.d.ts +6 -0
- package/dist/shims/cache.js +7 -0
- package/dist/shims/cache.js.map +1 -1
- package/dist/shims/default-not-found.d.ts +12 -0
- package/dist/shims/default-not-found.js +61 -0
- package/dist/shims/default-not-found.js.map +1 -0
- package/dist/shims/error.js +3 -0
- package/dist/shims/error.js.map +1 -1
- package/dist/shims/font-local.d.ts +5 -0
- package/dist/shims/font-local.js +6 -2
- package/dist/shims/font-local.js.map +1 -1
- package/dist/shims/head.js +4 -4
- package/dist/shims/head.js.map +1 -1
- package/dist/shims/headers.d.ts +13 -2
- package/dist/shims/headers.js +73 -22
- package/dist/shims/headers.js.map +1 -1
- package/dist/shims/image.d.ts +1 -1
- package/dist/shims/image.js +4 -4
- package/dist/shims/image.js.map +1 -1
- package/dist/shims/internal/app-route-detection.d.ts +37 -0
- package/dist/shims/internal/app-route-detection.js +69 -0
- package/dist/shims/internal/app-route-detection.js.map +1 -0
- package/dist/shims/internal/pages-data-target.d.ts +58 -0
- package/dist/shims/internal/pages-data-target.js +91 -0
- package/dist/shims/internal/pages-data-target.js.map +1 -0
- package/dist/shims/internal/pages-data-url.d.ts +42 -0
- package/dist/shims/internal/pages-data-url.js +73 -0
- package/dist/shims/internal/pages-data-url.js.map +1 -0
- package/dist/shims/link.d.ts +18 -2
- package/dist/shims/link.js +129 -15
- package/dist/shims/link.js.map +1 -1
- package/dist/shims/metadata.d.ts +9 -7
- package/dist/shims/metadata.js +70 -7
- package/dist/shims/metadata.js.map +1 -1
- package/dist/shims/navigation.d.ts +1 -2
- package/dist/shims/navigation.js +94 -20
- package/dist/shims/navigation.js.map +1 -1
- package/dist/shims/router.d.ts +5 -0
- package/dist/shims/router.js +389 -80
- package/dist/shims/router.js.map +1 -1
- package/dist/shims/script.d.ts +11 -1
- package/dist/shims/script.js +158 -15
- package/dist/shims/script.js.map +1 -1
- package/dist/shims/server.js +1 -0
- package/dist/shims/server.js.map +1 -1
- package/dist/shims/url-utils.d.ts +2 -1
- package/dist/shims/url-utils.js +15 -4
- package/dist/shims/url-utils.js.map +1 -1
- package/dist/utils/html-limited-bots.d.ts +5 -0
- package/dist/utils/html-limited-bots.js +15 -0
- package/dist/utils/html-limited-bots.js.map +1 -0
- package/dist/utils/path.d.ts +13 -0
- package/dist/utils/path.js +16 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/query.d.ts +6 -0
- package/dist/utils/query.js +10 -1
- package/dist/utils/query.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER } from "./headers.js";
|
|
2
|
+
import { isUnknownRecord } from "../utils/record.js";
|
|
3
|
+
//#region src/server/prerender-route-params.ts
|
|
4
|
+
function isPrerenderRouteParams(value) {
|
|
5
|
+
if (!isUnknownRecord(value)) return false;
|
|
6
|
+
for (const [, param] of Object.entries(value)) {
|
|
7
|
+
if (typeof param === "string") continue;
|
|
8
|
+
if (Array.isArray(param) && param.every((item) => typeof item === "string")) continue;
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
function isPrerenderRouteParamsPayload(value) {
|
|
14
|
+
if (!isUnknownRecord(value)) return false;
|
|
15
|
+
if (Object.keys(value).length !== 2) return false;
|
|
16
|
+
return typeof value.routePattern === "string" && value.routePattern.startsWith("/") && isPrerenderRouteParams(value.params);
|
|
17
|
+
}
|
|
18
|
+
function serializePrerenderRouteParamsHeader(payload) {
|
|
19
|
+
if (payload === null || Object.keys(payload.params).length === 0) return null;
|
|
20
|
+
return encodeURIComponent(JSON.stringify(payload));
|
|
21
|
+
}
|
|
22
|
+
function parsePrerenderRouteParamsHeader(value) {
|
|
23
|
+
if (value === null || value === "") return null;
|
|
24
|
+
try {
|
|
25
|
+
const parsed = JSON.parse(decodeURIComponent(value));
|
|
26
|
+
return isPrerenderRouteParamsPayload(parsed) ? parsed : null;
|
|
27
|
+
} catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function readTrustedPrerenderRouteParamsFromHeaders(headers, expectedSecret) {
|
|
32
|
+
if (process.env.VINEXT_PRERENDER !== "1") return null;
|
|
33
|
+
const secret = headers.get(VINEXT_PRERENDER_SECRET_HEADER);
|
|
34
|
+
if (secret === null) return null;
|
|
35
|
+
if (expectedSecret !== void 0 && secret !== expectedSecret) return null;
|
|
36
|
+
const header = headers.get(VINEXT_PRERENDER_ROUTE_PARAMS_HEADER);
|
|
37
|
+
if (header === null) return null;
|
|
38
|
+
const params = parsePrerenderRouteParamsHeader(header);
|
|
39
|
+
if (params === null) throw new Error("[vinext] Invalid internal prerender route params header.");
|
|
40
|
+
return params;
|
|
41
|
+
}
|
|
42
|
+
function readTrustedPrerenderRouteParams(request) {
|
|
43
|
+
return readTrustedPrerenderRouteParamsFromHeaders(request.headers);
|
|
44
|
+
}
|
|
45
|
+
function decodePrerenderRouteParam(value) {
|
|
46
|
+
try {
|
|
47
|
+
return decodeURIComponent(value);
|
|
48
|
+
} catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function decodedPrerenderRouteParamEquals(prerenderValue, matchedValue) {
|
|
53
|
+
if (Array.isArray(prerenderValue) || Array.isArray(matchedValue)) {
|
|
54
|
+
if (!Array.isArray(prerenderValue) || !Array.isArray(matchedValue)) return false;
|
|
55
|
+
if (prerenderValue.length !== matchedValue.length) return false;
|
|
56
|
+
return prerenderValue.every((item, index) => {
|
|
57
|
+
const decoded = decodePrerenderRouteParam(item);
|
|
58
|
+
return decoded !== null && decoded === matchedValue[index];
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
const decoded = decodePrerenderRouteParam(prerenderValue);
|
|
62
|
+
return decoded !== null && decoded === matchedValue;
|
|
63
|
+
}
|
|
64
|
+
function prerenderRouteParamsPayloadMatchesRoute(payload, routePattern, params) {
|
|
65
|
+
if (payload === null) return false;
|
|
66
|
+
if (payload.routePattern !== routePattern) return false;
|
|
67
|
+
if (Object.keys(payload.params).length !== Object.keys(params).length) return false;
|
|
68
|
+
for (const [key, prerenderValue] of Object.entries(payload.params)) {
|
|
69
|
+
const matchedValue = params[key];
|
|
70
|
+
if (matchedValue === void 0) return false;
|
|
71
|
+
if (!decodedPrerenderRouteParamEquals(prerenderValue, matchedValue)) return false;
|
|
72
|
+
}
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
function encodePrerenderRouteParams(pattern, params) {
|
|
76
|
+
const encoded = {};
|
|
77
|
+
for (const part of pattern.split("/").filter(Boolean)) {
|
|
78
|
+
let paramName = null;
|
|
79
|
+
if (part.startsWith(":") && (part.endsWith("+") || part.endsWith("*"))) paramName = part.slice(1, -1);
|
|
80
|
+
else if (part.startsWith(":")) paramName = part.slice(1);
|
|
81
|
+
if (paramName === null) continue;
|
|
82
|
+
const value = params[paramName];
|
|
83
|
+
if (Array.isArray(value)) encoded[paramName] = value.map((item) => encodeURIComponent(item));
|
|
84
|
+
else if (typeof value === "string") encoded[paramName] = encodeURIComponent(value);
|
|
85
|
+
}
|
|
86
|
+
return Object.keys(encoded).length > 0 ? {
|
|
87
|
+
routePattern: pattern,
|
|
88
|
+
params: encoded
|
|
89
|
+
} : null;
|
|
90
|
+
}
|
|
91
|
+
//#endregion
|
|
92
|
+
export { encodePrerenderRouteParams, prerenderRouteParamsPayloadMatchesRoute, readTrustedPrerenderRouteParams, readTrustedPrerenderRouteParamsFromHeaders, serializePrerenderRouteParamsHeader };
|
|
93
|
+
|
|
94
|
+
//# sourceMappingURL=prerender-route-params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prerender-route-params.js","names":[],"sources":["../../src/server/prerender-route-params.ts"],"sourcesContent":["import { VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER } from \"./headers.js\";\nimport { isUnknownRecord } from \"../utils/record.js\";\n\nexport type PrerenderRouteParams = Record<string, string | string[]>;\n\nexport type PrerenderRouteParamsPayload = {\n params: PrerenderRouteParams;\n routePattern: string;\n};\n\nfunction isPrerenderRouteParams(value: unknown): value is PrerenderRouteParams {\n if (!isUnknownRecord(value)) return false;\n\n for (const [, param] of Object.entries(value)) {\n if (typeof param === \"string\") continue;\n if (Array.isArray(param) && param.every((item) => typeof item === \"string\")) continue;\n return false;\n }\n\n return true;\n}\n\nfunction isPrerenderRouteParamsPayload(value: unknown): value is PrerenderRouteParamsPayload {\n if (!isUnknownRecord(value)) return false;\n if (Object.keys(value).length !== 2) return false;\n return (\n typeof value.routePattern === \"string\" &&\n value.routePattern.startsWith(\"/\") &&\n isPrerenderRouteParams(value.params)\n );\n}\n\n// A payload with no dynamic params serializes to `null`, which is\n// indistinguishable from an absent header on the read side. This is intentional:\n// the only producer, `encodePrerenderRouteParams`, already returns `null` for\n// param-less patterns, so an empty-params payload never carries information worth\n// propagating. Routes with no dynamic segments need no encoded-render override.\nexport function serializePrerenderRouteParamsHeader(\n payload: PrerenderRouteParamsPayload | null,\n): string | null {\n if (payload === null || Object.keys(payload.params).length === 0) return null;\n return encodeURIComponent(JSON.stringify(payload));\n}\n\nfunction parsePrerenderRouteParamsHeader(value: string | null): PrerenderRouteParamsPayload | null {\n if (value === null || value === \"\") return null;\n\n try {\n const parsed: unknown = JSON.parse(decodeURIComponent(value));\n return isPrerenderRouteParamsPayload(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nexport function readTrustedPrerenderRouteParamsFromHeaders(\n headers: Headers,\n expectedSecret?: string,\n): PrerenderRouteParamsPayload | null {\n if (process.env.VINEXT_PRERENDER !== \"1\") return null;\n const secret = headers.get(VINEXT_PRERENDER_SECRET_HEADER);\n if (secret === null) return null;\n if (expectedSecret !== undefined && secret !== expectedSecret) return null;\n const header = headers.get(VINEXT_PRERENDER_ROUTE_PARAMS_HEADER);\n if (header === null) return null;\n const params = parsePrerenderRouteParamsHeader(header);\n if (params === null) {\n throw new Error(\"[vinext] Invalid internal prerender route params header.\");\n }\n return params;\n}\n\n// Convenience wrapper for reads that happen AFTER the prerender secret has\n// already been verified at the trust boundary. The only entry point that\n// receives raw external input, `prod-server`'s `nodeToWebRequest`, calls\n// `readTrustedPrerenderRouteParamsFromHeaders` WITH `expectedSecret` and\n// re-serializes the validated payload onto a clean header. Every downstream\n// reader (the App Router handler) therefore operates on an already-trusted\n// request and deliberately omits `expectedSecret`. The `VINEXT_PRERENDER=1`\n// gate still ensures this never activates outside the build-time prerender\n// phase. Do not call this on unverified external input.\nexport function readTrustedPrerenderRouteParams(\n request: Request,\n): PrerenderRouteParamsPayload | null {\n return readTrustedPrerenderRouteParamsFromHeaders(request.headers);\n}\n\nfunction decodePrerenderRouteParam(value: string): string | null {\n try {\n return decodeURIComponent(value);\n } catch {\n return null;\n }\n}\n\nfunction decodedPrerenderRouteParamEquals(\n prerenderValue: string | string[],\n matchedValue: string | string[],\n): boolean {\n if (Array.isArray(prerenderValue) || Array.isArray(matchedValue)) {\n if (!Array.isArray(prerenderValue) || !Array.isArray(matchedValue)) return false;\n if (prerenderValue.length !== matchedValue.length) return false;\n\n return prerenderValue.every((item, index) => {\n const decoded = decodePrerenderRouteParam(item);\n return decoded !== null && decoded === matchedValue[index];\n });\n }\n\n const decoded = decodePrerenderRouteParam(prerenderValue);\n return decoded !== null && decoded === matchedValue;\n}\n\nexport function prerenderRouteParamsPayloadMatchesRoute(\n payload: PrerenderRouteParamsPayload | null,\n routePattern: string,\n params: PrerenderRouteParams,\n): payload is PrerenderRouteParamsPayload {\n if (payload === null) return false;\n if (payload.routePattern !== routePattern) return false;\n\n const prerenderParamKeys = Object.keys(payload.params);\n if (prerenderParamKeys.length !== Object.keys(params).length) return false;\n\n for (const [key, prerenderValue] of Object.entries(payload.params)) {\n const matchedValue = params[key];\n if (matchedValue === undefined) return false;\n if (!decodedPrerenderRouteParamEquals(prerenderValue, matchedValue)) return false;\n }\n\n return true;\n}\n\nexport function encodePrerenderRouteParams(\n pattern: string,\n params: PrerenderRouteParams,\n): PrerenderRouteParamsPayload | null {\n const encoded: PrerenderRouteParams = {};\n\n for (const part of pattern.split(\"/\").filter(Boolean)) {\n let paramName: string | null = null;\n if (part.startsWith(\":\") && (part.endsWith(\"+\") || part.endsWith(\"*\"))) {\n paramName = part.slice(1, -1);\n } else if (part.startsWith(\":\")) {\n paramName = part.slice(1);\n }\n\n if (paramName === null) continue;\n const value = params[paramName];\n if (Array.isArray(value)) {\n encoded[paramName] = value.map((item) => encodeURIComponent(item));\n } else if (typeof value === \"string\") {\n encoded[paramName] = encodeURIComponent(value);\n }\n }\n\n return Object.keys(encoded).length > 0 ? { routePattern: pattern, params: encoded } : null;\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { StaticFileCache } from "./static-file-cache.js";
|
|
2
|
+
import { resolveRequestHost, trustProxy, trustedHosts } from "./proxy-trust.js";
|
|
2
3
|
import * as _$node_http0 from "node:http";
|
|
3
4
|
import { IncomingMessage, ServerResponse } from "node:http";
|
|
4
5
|
|
|
@@ -50,27 +51,6 @@ declare function sendCompressed(req: IncomingMessage, res: ServerResponse, body:
|
|
|
50
51
|
* unlike the old sync existsSync/statSync approach).
|
|
51
52
|
*/
|
|
52
53
|
declare function tryServeStatic(req: IncomingMessage, res: ServerResponse, clientDir: string, pathname: string, compress: boolean, cache?: StaticFileCache, extraHeaders?: Record<string, string | string[]>, statusCode?: number): Promise<boolean>;
|
|
53
|
-
/**
|
|
54
|
-
* Resolve the host for a request, ignoring X-Forwarded-Host to prevent
|
|
55
|
-
* host header poisoning attacks (open redirects, cache poisoning).
|
|
56
|
-
*
|
|
57
|
-
* X-Forwarded-Host is only trusted when the VINEXT_TRUSTED_HOSTS env var
|
|
58
|
-
* lists the forwarded host value. Without this, an attacker can send
|
|
59
|
-
* X-Forwarded-Host: evil.com and poison any redirect that resolves
|
|
60
|
-
* against request.url.
|
|
61
|
-
*
|
|
62
|
-
* On Cloudflare Workers, X-Forwarded-Host is always set by Cloudflare
|
|
63
|
-
* itself, so this is only a concern for the Node.js prod-server.
|
|
64
|
-
*/
|
|
65
|
-
declare function resolveHost(req: IncomingMessage, fallback: string): string;
|
|
66
|
-
/** Hosts that are allowed as X-Forwarded-Host values (stored lowercase). */
|
|
67
|
-
declare const trustedHosts: Set<string>;
|
|
68
|
-
/**
|
|
69
|
-
* Whether to trust X-Forwarded-Proto from upstream proxies.
|
|
70
|
-
* Enabled when VINEXT_TRUST_PROXY=1 or when VINEXT_TRUSTED_HOSTS is set
|
|
71
|
-
* (having trusted hosts implies a trusted proxy).
|
|
72
|
-
*/
|
|
73
|
-
declare const trustProxy: boolean;
|
|
74
54
|
/**
|
|
75
55
|
* Convert a Node.js IncomingMessage to a Web Request object.
|
|
76
56
|
*
|
|
@@ -80,7 +60,7 @@ declare const trustProxy: boolean;
|
|
|
80
60
|
* Router prod server normalizes before static-asset lookup, and can pass
|
|
81
61
|
* the result here so the downstream RSC handler doesn't re-normalize).
|
|
82
62
|
*/
|
|
83
|
-
declare function nodeToWebRequest(req: IncomingMessage, urlOverride?: string): Request;
|
|
63
|
+
declare function nodeToWebRequest(req: IncomingMessage, urlOverride?: string, prerenderSecret?: string): Request;
|
|
84
64
|
/**
|
|
85
65
|
* Stream a Web Response back to a Node.js ServerResponse.
|
|
86
66
|
* Supports streaming compression for SSR responses.
|
|
@@ -122,5 +102,5 @@ declare function resolveAppRouterPrerenderSeeder(entryModule: unknown): AppRoute
|
|
|
122
102
|
*/
|
|
123
103
|
declare function resolveAppRouterAssetPath(pathname: string, assetPathPrefix: string, assetPrefix: string): string | null;
|
|
124
104
|
//#endregion
|
|
125
|
-
export { COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, ProdServerOptions, mergeResponseHeaders, mergeWebResponse, negotiateEncoding, nodeToWebRequest, resolveAppRouterAssetPath, resolveAppRouterPrerenderSeeder, resolveHost, sendCompressed, sendWebResponse, startProdServer, trustProxy, trustedHosts, tryServeStatic };
|
|
105
|
+
export { COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, ProdServerOptions, mergeResponseHeaders, mergeWebResponse, negotiateEncoding, nodeToWebRequest, resolveAppRouterAssetPath, resolveAppRouterPrerenderSeeder, resolveRequestHost as resolveHost, sendCompressed, sendWebResponse, startProdServer, trustProxy, trustedHosts, tryServeStatic };
|
|
126
106
|
//# sourceMappingURL=prod-server.d.ts.map
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import { normalizePathnameForRouteMatchStrict } from "../routing/utils.js";
|
|
2
2
|
import { hasBasePath, stripBasePath } from "../utils/base-path.js";
|
|
3
|
-
import { VINEXT_PRERENDER_SECRET_HEADER, VINEXT_STATIC_FILE_HEADER } from "./headers.js";
|
|
3
|
+
import { VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER, VINEXT_STATIC_FILE_HEADER } from "./headers.js";
|
|
4
4
|
import { normalizePath } from "./normalize-path.js";
|
|
5
5
|
import { applyMiddlewareRequestHeaders, isExternalUrl, matchRedirect, matchRewrite, proxyExternalRequest, requestContextFromRequest, sanitizeDestination } from "../config/config-matchers.js";
|
|
6
6
|
import { notFoundResponse } from "./http-error-responses.js";
|
|
7
7
|
import { applyConfigHeadersToHeaderRecord, filterInternalHeaders, isOpenRedirectShaped, normalizeTrailingSlash } from "./request-pipeline.js";
|
|
8
8
|
import { mergeRewriteQuery } from "../utils/query.js";
|
|
9
9
|
import { normalizeDefaultLocalePathname, stripI18nLocaleForApiRoute } from "./pages-i18n.js";
|
|
10
|
+
import { resolveRequestHost, resolveRequestProtocol, trustProxy, trustedHosts } from "./proxy-trust.js";
|
|
11
|
+
import { DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES, isImageOptimizationPath, isSafeImageContentType, parseImageParams } from "./image-optimization.js";
|
|
10
12
|
import { installSocketErrorBackstop } from "./socket-error-backstop.js";
|
|
11
13
|
import { ASSET_PREFIX_URL_DIR, assetPrefixPathname, isAbsoluteAssetPrefix } from "../utils/asset-prefix.js";
|
|
12
14
|
import { CONTENT_TYPES, StaticFileCache, etagFromFilenameHash } from "./static-file-cache.js";
|
|
13
15
|
import { buildNextDataNotFoundResponse, isNextDataPathname, parseNextDataPathname } from "./pages-data-route.js";
|
|
16
|
+
import { collectInlineCssManifest } from "../build/inline-css.js";
|
|
14
17
|
import { manifestFileWithBase } from "../utils/manifest-paths.js";
|
|
15
|
-
import {
|
|
18
|
+
import { readTrustedPrerenderRouteParamsFromHeaders, serializePrerenderRouteParamsHeader } from "./prerender-route-params.js";
|
|
16
19
|
import { computeLazyChunks } from "../utils/lazy-chunks.js";
|
|
17
20
|
import { readPrerenderSecret } from "../build/server-manifest.js";
|
|
18
21
|
import { seedMemoryCacheFromPrerender } from "./seed-cache.js";
|
|
@@ -132,8 +135,20 @@ function mergeResponseHeaders(middlewareHeaders, response) {
|
|
|
132
135
|
}
|
|
133
136
|
function toWebHeaders(headersRecord) {
|
|
134
137
|
const headers = new Headers();
|
|
135
|
-
for (const [key, value] of Object.entries(headersRecord))
|
|
136
|
-
|
|
138
|
+
for (const [key, value] of Object.entries(headersRecord)) appendWebHeader(headers, key, value);
|
|
139
|
+
return headers;
|
|
140
|
+
}
|
|
141
|
+
function appendWebHeader(headers, key, value) {
|
|
142
|
+
if (value === void 0) return;
|
|
143
|
+
if (Array.isArray(value)) {
|
|
144
|
+
for (const item of value) headers.append(key, item);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
headers.set(key, value);
|
|
148
|
+
}
|
|
149
|
+
function nodeHeadersToWebHeaders(headersRecord) {
|
|
150
|
+
const headers = new Headers();
|
|
151
|
+
for (const [key, value] of Object.entries(headersRecord)) appendWebHeader(headers, key, value);
|
|
137
152
|
return headers;
|
|
138
153
|
}
|
|
139
154
|
const NO_BODY_RESPONSE_STATUSES = new Set([
|
|
@@ -428,35 +443,6 @@ async function statIfFile(filePath) {
|
|
|
428
443
|
}
|
|
429
444
|
}
|
|
430
445
|
/**
|
|
431
|
-
* Resolve the host for a request, ignoring X-Forwarded-Host to prevent
|
|
432
|
-
* host header poisoning attacks (open redirects, cache poisoning).
|
|
433
|
-
*
|
|
434
|
-
* X-Forwarded-Host is only trusted when the VINEXT_TRUSTED_HOSTS env var
|
|
435
|
-
* lists the forwarded host value. Without this, an attacker can send
|
|
436
|
-
* X-Forwarded-Host: evil.com and poison any redirect that resolves
|
|
437
|
-
* against request.url.
|
|
438
|
-
*
|
|
439
|
-
* On Cloudflare Workers, X-Forwarded-Host is always set by Cloudflare
|
|
440
|
-
* itself, so this is only a concern for the Node.js prod-server.
|
|
441
|
-
*/
|
|
442
|
-
function resolveHost(req, fallback) {
|
|
443
|
-
const rawForwarded = req.headers["x-forwarded-host"];
|
|
444
|
-
const hostHeader = req.headers.host;
|
|
445
|
-
if (rawForwarded) {
|
|
446
|
-
const forwardedHost = rawForwarded.split(",")[0].trim().toLowerCase();
|
|
447
|
-
if (forwardedHost && trustedHosts.has(forwardedHost)) return forwardedHost;
|
|
448
|
-
}
|
|
449
|
-
return hostHeader || fallback;
|
|
450
|
-
}
|
|
451
|
-
/** Hosts that are allowed as X-Forwarded-Host values (stored lowercase). */
|
|
452
|
-
const trustedHosts = new Set((process.env.VINEXT_TRUSTED_HOSTS ?? "").split(",").map((h) => h.trim().toLowerCase()).filter(Boolean));
|
|
453
|
-
/**
|
|
454
|
-
* Whether to trust X-Forwarded-Proto from upstream proxies.
|
|
455
|
-
* Enabled when VINEXT_TRUST_PROXY=1 or when VINEXT_TRUSTED_HOSTS is set
|
|
456
|
-
* (having trusted hosts implies a trusted proxy).
|
|
457
|
-
*/
|
|
458
|
-
const trustProxy = process.env.VINEXT_TRUST_PROXY === "1" || trustedHosts.size > 0;
|
|
459
|
-
/**
|
|
460
446
|
* Convert a Node.js IncomingMessage to a Web Request object.
|
|
461
447
|
*
|
|
462
448
|
* When `urlOverride` is provided, it is used as the path + query string
|
|
@@ -465,17 +451,14 @@ const trustProxy = process.env.VINEXT_TRUST_PROXY === "1" || trustedHosts.size >
|
|
|
465
451
|
* Router prod server normalizes before static-asset lookup, and can pass
|
|
466
452
|
* the result here so the downstream RSC handler doesn't re-normalize).
|
|
467
453
|
*/
|
|
468
|
-
function nodeToWebRequest(req, urlOverride) {
|
|
469
|
-
const
|
|
470
|
-
const origin = `${rawProto === "https" || rawProto === "http" ? rawProto : "http"}://${resolveHost(req, "localhost")}`;
|
|
454
|
+
function nodeToWebRequest(req, urlOverride, prerenderSecret) {
|
|
455
|
+
const origin = `${resolveRequestProtocol(req)}://${resolveRequestHost(req, "localhost")}`;
|
|
471
456
|
const url = new URL(urlOverride ?? req.url ?? "/", origin);
|
|
472
|
-
const rawHeaders =
|
|
473
|
-
|
|
474
|
-
if (value === void 0) continue;
|
|
475
|
-
if (Array.isArray(value)) for (const v of value) rawHeaders.append(key, v);
|
|
476
|
-
else rawHeaders.set(key, value);
|
|
477
|
-
}
|
|
457
|
+
const rawHeaders = nodeHeadersToWebHeaders(req.headers);
|
|
458
|
+
const prerenderRouteParamsPayload = readTrustedPrerenderRouteParamsFromHeaders(rawHeaders, prerenderSecret);
|
|
478
459
|
const headers = filterInternalHeaders(rawHeaders);
|
|
460
|
+
const prerenderRouteParamsHeader = serializePrerenderRouteParamsHeader(prerenderRouteParamsPayload);
|
|
461
|
+
if (prerenderRouteParamsHeader !== null) headers.set(VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, prerenderRouteParamsHeader);
|
|
479
462
|
const method = req.method ?? "GET";
|
|
480
463
|
const hasBody = method !== "GET" && method !== "HEAD";
|
|
481
464
|
const init = {
|
|
@@ -669,6 +652,8 @@ async function startAppRouterServer(options) {
|
|
|
669
652
|
const rscModule = await import(`${pathToFileURL(rscEntryPath).href}?t=${rscMtime}`);
|
|
670
653
|
const rscHandler = resolveAppRouterHandler(rscModule.default);
|
|
671
654
|
const appRouterAssetPrefix = typeof rscModule.__assetPrefix === "string" ? rscModule.__assetPrefix : "";
|
|
655
|
+
const appRouterInlineCss = rscModule.__inlineCss === true;
|
|
656
|
+
globalThis.__VINEXT_INLINE_CSS__ = appRouterInlineCss ? collectInlineCssManifest(clientDir, appRouterAssetPrefix) : void 0;
|
|
672
657
|
const appAssetPathPrefix = assetPrefixPathname(appRouterAssetPrefix);
|
|
673
658
|
const seededRoutes = await resolveAppRouterPrerenderSeeder(rscModule)(path.dirname(rscEntryPath));
|
|
674
659
|
if (seededRoutes > 0) console.log(`[vinext] Seeded ${seededRoutes} pre-rendered route${seededRoutes !== 1 ? "s" : ""} into memory cache`);
|
|
@@ -707,7 +692,7 @@ async function startAppRouterServer(options) {
|
|
|
707
692
|
return;
|
|
708
693
|
}
|
|
709
694
|
}
|
|
710
|
-
if (pathname
|
|
695
|
+
if (isImageOptimizationPath(pathname)) {
|
|
711
696
|
const params = parseImageParams(new URL(rawUrl, "http://localhost"), [...DEFAULT_DEVICE_SIZES, ...DEFAULT_IMAGE_SIZES]);
|
|
712
697
|
if (!params) {
|
|
713
698
|
res.writeHead(400);
|
|
@@ -731,7 +716,7 @@ async function startAppRouterServer(options) {
|
|
|
731
716
|
}
|
|
732
717
|
try {
|
|
733
718
|
const qs = rawUrl.includes("?") ? rawUrl.slice(rawUrl.indexOf("?")) : "";
|
|
734
|
-
const response = await rscHandler(nodeToWebRequest(req, pathname + qs));
|
|
719
|
+
const response = await rscHandler(nodeToWebRequest(req, pathname + qs, prerenderSecret));
|
|
735
720
|
const staticFileSignal = response.headers.get(VINEXT_STATIC_FILE_HEADER);
|
|
736
721
|
if (staticFileSignal) {
|
|
737
722
|
let staticFilePath = "/";
|
|
@@ -892,7 +877,7 @@ async function startPagesRouterServer(options) {
|
|
|
892
877
|
res.end("Not Found");
|
|
893
878
|
return;
|
|
894
879
|
}
|
|
895
|
-
if (pathname
|
|
880
|
+
if (isImageOptimizationPath(pathname) || isImageOptimizationPath(staticLookupPath)) {
|
|
896
881
|
const params = parseImageParams(new URL(rawUrl, "http://localhost"), allowedImageWidths);
|
|
897
882
|
if (!params) {
|
|
898
883
|
res.writeHead(400);
|
|
@@ -949,13 +934,9 @@ async function startPagesRouterServer(options) {
|
|
|
949
934
|
url = dataMatch.pagePathname + qs;
|
|
950
935
|
pathname = dataMatch.pagePathname;
|
|
951
936
|
}
|
|
952
|
-
const
|
|
953
|
-
const
|
|
954
|
-
const
|
|
955
|
-
const rawReqHeaders = Object.entries(req.headers).reduce((h, [k, v]) => {
|
|
956
|
-
if (v) h.set(k, Array.isArray(v) ? v.join(", ") : v);
|
|
957
|
-
return h;
|
|
958
|
-
}, new Headers());
|
|
937
|
+
const protocol = resolveRequestProtocol(req);
|
|
938
|
+
const hostHeader = resolveRequestHost(req, `${host}:${port}`);
|
|
939
|
+
const rawReqHeaders = nodeHeadersToWebHeaders(req.headers);
|
|
959
940
|
const isDataRequest = rawReqHeaders.get("x-nextjs-data") === "1";
|
|
960
941
|
const reqHeaders = filterInternalHeaders(rawReqHeaders);
|
|
961
942
|
const method = req.method ?? "GET";
|
|
@@ -1087,18 +1068,23 @@ async function startPagesRouterServer(options) {
|
|
|
1087
1068
|
let response;
|
|
1088
1069
|
if (typeof renderPage === "function") {
|
|
1089
1070
|
const middlewareResponseHeaders = toWebHeaders(middlewareHeaders);
|
|
1090
|
-
const
|
|
1091
|
-
|
|
1092
|
-
|
|
1071
|
+
const renderPageMatch = matchPageRoute ? matchPageRoute(resolvedPathname, webRequest) : null;
|
|
1072
|
+
const shouldDeferErrorPageOnMiss = !isDataReq && !!matchPageRoute && !renderPageMatch;
|
|
1073
|
+
const dataRenderOptions = isDataReq ? { isDataReq: true } : void 0;
|
|
1074
|
+
response = await renderPage(webRequest, resolvedUrl, ssrManifest, void 0, middlewareResponseHeaders, shouldDeferErrorPageOnMiss ? { renderErrorPageOnMiss: false } : dataRenderOptions);
|
|
1075
|
+
let matchedFallbackRewrite = false;
|
|
1076
|
+
if (response && response.status === 404 && shouldDeferErrorPageOnMiss && configRewrites.fallback?.length) {
|
|
1093
1077
|
const fallbackRewrite = matchRewrite(matchResolvedPathname(resolvedPathname), configRewrites.fallback, postMwReqCtx, basePathState);
|
|
1094
1078
|
if (fallbackRewrite) {
|
|
1095
1079
|
if (isExternalUrl(fallbackRewrite)) {
|
|
1096
1080
|
await sendWebResponse(await proxyExternalRequest(webRequest, fallbackRewrite), req, res, compress);
|
|
1097
1081
|
return;
|
|
1098
1082
|
}
|
|
1099
|
-
|
|
1083
|
+
matchedFallbackRewrite = true;
|
|
1084
|
+
response = await renderPage(webRequest, mergeRewriteQuery(resolvedUrl, fallbackRewrite), ssrManifest, void 0, middlewareResponseHeaders, dataRenderOptions);
|
|
1100
1085
|
}
|
|
1101
1086
|
}
|
|
1087
|
+
if (response && response.status === 404 && shouldDeferErrorPageOnMiss && !matchedFallbackRewrite) response = await renderPage(webRequest, resolvedUrl, ssrManifest, void 0, middlewareResponseHeaders);
|
|
1102
1088
|
}
|
|
1103
1089
|
if (!response) {
|
|
1104
1090
|
res.writeHead(404);
|
|
@@ -1141,6 +1127,6 @@ async function startPagesRouterServer(options) {
|
|
|
1141
1127
|
};
|
|
1142
1128
|
}
|
|
1143
1129
|
//#endregion
|
|
1144
|
-
export { COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, mergeResponseHeaders, mergeWebResponse, negotiateEncoding, nodeToWebRequest, resolveAppRouterAssetPath, resolveAppRouterPrerenderSeeder, resolveHost, sendCompressed, sendWebResponse, startProdServer, trustProxy, trustedHosts, tryServeStatic };
|
|
1130
|
+
export { COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, mergeResponseHeaders, mergeWebResponse, negotiateEncoding, nodeToWebRequest, resolveAppRouterAssetPath, resolveAppRouterPrerenderSeeder, resolveRequestHost as resolveHost, sendCompressed, sendWebResponse, startProdServer, trustProxy, trustedHosts, tryServeStatic };
|
|
1145
1131
|
|
|
1146
1132
|
//# sourceMappingURL=prod-server.js.map
|