vinext 1.1.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -10
- package/dist/build/client-build-config.d.ts +10 -0
- package/dist/build/client-build-config.js +18 -2
- package/dist/build/output-root-externals.d.ts +21 -0
- package/dist/build/output-root-externals.js +40 -0
- package/dist/build/pages-client-assets-module.d.ts +8 -0
- package/dist/build/pages-client-assets-module.js +21 -1
- package/dist/build/prerender-paths.js +6 -4
- package/dist/build/prerender.js +1 -1
- package/dist/build/run-prerender.js +1 -1
- package/dist/build/ssr-manifest.d.ts +2 -0
- package/dist/build/ssr-manifest.js +6 -2
- package/dist/check.js +12 -12
- package/dist/cli-dev-config.js +3 -3
- package/dist/cli.js +3 -2
- package/dist/client/client-redirect-matcher.d.ts +14 -0
- package/dist/client/client-redirect-matcher.js +37 -0
- package/dist/client/client-redirects.d.ts +27 -0
- package/dist/client/client-redirects.js +28 -0
- package/dist/client/client-rewrites.d.ts +2 -1
- package/dist/client/client-rewrites.js +1 -1
- package/dist/config/config-matchers.d.ts +26 -11
- package/dist/config/config-matchers.js +90 -88
- package/dist/config/destination-params.d.ts +47 -0
- package/dist/config/destination-params.js +116 -0
- package/dist/config/next-config.d.ts +7 -0
- package/dist/config/next-config.js +3 -0
- package/dist/entries/app-rsc-entry.d.ts +4 -0
- package/dist/entries/app-rsc-entry.js +20 -6
- package/dist/entries/pages-client-entry.js +3 -1
- package/dist/entries/pages-server-entry.js +13 -37
- package/dist/index.d.ts +3 -1
- package/dist/index.js +246 -136
- package/dist/init-cloudflare.d.ts +9 -0
- package/dist/init-cloudflare.js +107 -31
- package/dist/init-platform.d.ts +4 -0
- package/dist/init-platform.js +27 -2
- package/dist/init.d.ts +2 -1
- package/dist/init.js +153 -9
- package/dist/plugins/ast-scope.d.ts +7 -0
- package/dist/plugins/ast-scope.js +59 -3
- package/dist/plugins/ast-utils.d.ts +53 -2
- package/dist/plugins/ast-utils.js +90 -2
- package/dist/plugins/cloudflare-dev-module-urls.d.ts +41 -0
- package/dist/plugins/cloudflare-dev-module-urls.js +271 -0
- package/dist/plugins/commonjs-esm-facade.js +2 -2
- package/dist/plugins/css-module-imports.js +13 -20
- package/dist/plugins/dynamic-preload-metadata.d.ts +1 -1
- package/dist/plugins/dynamic-preload-metadata.js +11 -11
- package/dist/plugins/extensionless-dynamic-import.js +2 -3
- package/dist/plugins/fonts.d.ts +1 -1
- package/dist/plugins/fonts.js +3 -3
- package/dist/plugins/ignore-dynamic-requests.d.ts +1 -1
- package/dist/plugins/ignore-dynamic-requests.js +5 -7
- package/dist/plugins/import-meta-url.js +3 -4
- package/dist/plugins/instrumentation-client.js +3 -2
- package/dist/plugins/middleware-export-validation.js +2 -3
- package/dist/plugins/middleware-server-only.d.ts +5 -4
- package/dist/plugins/middleware-server-only.js +8 -5
- package/dist/plugins/og-harfbuzz.js +2 -3
- package/dist/plugins/optimize-imports.js +3 -4
- package/dist/plugins/pages-node-externals.js +3 -4
- package/dist/plugins/remove-console.js +2 -18
- package/dist/plugins/require-condition-resolution.js +3 -3
- package/dist/plugins/require-context.js +2 -3
- package/dist/plugins/rsc-scan-glob-imports.d.ts +19 -0
- package/dist/plugins/rsc-scan-glob-imports.js +50 -0
- package/dist/plugins/strip-server-exports.js +265 -102
- package/dist/plugins/styled-jsx.js +2 -3
- package/dist/plugins/transform-result.d.ts +9 -5
- package/dist/plugins/transitive-externals.js +1 -1
- package/dist/plugins/typeof-window.d.ts +2 -2
- package/dist/plugins/use-cache-callable.d.ts +21 -2
- package/dist/plugins/use-cache-callable.js +84 -35
- package/dist/plugins/worker-image-imports.js +30 -33
- package/dist/plugins/worker-server-only-imports.d.ts +20 -0
- package/dist/plugins/worker-server-only-imports.js +31 -0
- package/dist/plugins/worker-use-server.d.ts +25 -0
- package/dist/plugins/worker-use-server.js +153 -0
- package/dist/server/api-handler.d.ts +1 -0
- package/dist/server/api-handler.js +3 -2
- package/dist/server/app-action-forwarding.js +2 -2
- package/dist/server/app-browser-action-result.d.ts +1 -1
- package/dist/server/app-browser-action-result.js +9 -2
- package/dist/server/app-browser-entry.js +3 -3
- package/dist/server/app-browser-interception-context.js +1 -1
- package/dist/server/app-browser-navigation-controller.js +1 -1
- package/dist/server/app-browser-prefetch-response.js +2 -2
- package/dist/server/app-browser-server-action-client.js +1 -1
- package/dist/server/app-browser-state.js +1 -1
- package/dist/server/app-browser-supplemental-refresh.js +1 -1
- package/dist/server/app-middleware.d.ts +11 -0
- package/dist/server/app-middleware.js +17 -2
- package/dist/server/app-optimistic-routing.js +1 -1
- package/dist/server/app-page-cache.d.ts +1 -1
- package/dist/server/app-page-cache.js +1 -1
- package/dist/server/app-page-dispatch.d.ts +3 -1
- package/dist/server/app-page-dispatch.js +5 -4
- package/dist/server/app-page-ppr-runtime.js +1 -1
- package/dist/server/app-page-render-observation.js +1 -1
- package/dist/server/app-page-render.js +1 -1
- package/dist/server/app-page-request.js +53 -15
- package/dist/server/app-page-route-wiring.js +2 -2
- package/dist/server/app-pages-bridge.d.ts +1 -1
- package/dist/server/app-pages-bridge.js +3 -4
- package/dist/server/app-prerender-endpoints.js +9 -6
- package/dist/server/app-render-abort-error.d.ts +19 -0
- package/dist/server/app-render-abort-error.js +31 -1
- package/dist/server/app-request-stage-dispatch.js +6 -2
- package/dist/server/app-request-stage-independent-entry.js +29 -9
- package/dist/server/app-response-stage-entry.js +11 -3
- package/dist/server/app-route-handler-cache.d.ts +1 -0
- package/dist/server/app-route-handler-cache.js +1 -0
- package/dist/server/app-route-handler-dispatch.d.ts +1 -0
- package/dist/server/app-route-handler-dispatch.js +5 -2
- 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-runtime.d.ts +4 -1
- package/dist/server/app-route-handler-runtime.js +46 -25
- package/dist/server/app-router-entry.js +29 -10
- package/dist/server/app-rsc-cache-busting.d.ts +16 -0
- package/dist/server/app-rsc-cache-busting.js +30 -13
- package/dist/server/app-rsc-errors.js +20 -16
- package/dist/server/app-rsc-handler.d.ts +7 -0
- package/dist/server/app-rsc-handler.js +89 -39
- package/dist/server/app-rsc-request-normalization.js +3 -3
- package/dist/server/app-rsc-response-stage.js +5 -3
- package/dist/server/app-segment-config.d.ts +2 -1
- package/dist/server/app-server-action-execution.d.ts +2 -1
- package/dist/server/app-server-action-execution.js +62 -23
- package/dist/server/app-ssr-entry.js +7 -5
- package/dist/server/app-visited-response-cache.js +2 -2
- package/dist/server/app-worker-stages.d.ts +5 -0
- package/dist/server/app-worker-stages.js +1 -1
- package/dist/server/cacheability-request.js +2 -2
- package/dist/server/client-build-files.d.ts +16 -0
- package/dist/server/client-build-files.js +36 -0
- package/dist/server/client-reuse-manifest.js +1 -1
- package/dist/server/config-headers.js +1 -1
- package/dist/server/defer-until-stream-consumed.d.ts +2 -1
- package/dist/server/defer-until-stream-consumed.js +3 -1
- package/dist/server/dev-server.js +39 -28
- package/dist/server/dev-stack-sourcemap.js +18 -23
- package/dist/server/document-initial-head.d.ts +0 -11
- package/dist/server/document-initial-head.js +1 -1
- package/dist/server/forwarded-middleware-context.d.ts +5 -0
- package/dist/server/forwarded-middleware-context.js +22 -0
- package/dist/server/headers.d.ts +4 -1
- package/dist/server/headers.js +4 -1
- package/dist/server/http-conditional.d.ts +11 -0
- package/dist/server/http-conditional.js +10 -1
- package/dist/server/http-error-responses.d.ts +1 -1
- package/dist/server/image-optimization.d.ts +38 -0
- package/dist/server/image-optimization.js +94 -4
- package/dist/server/isr-cache.d.ts +10 -0
- package/dist/server/isr-cache.js +41 -6
- package/dist/server/metadata-route-response.js +11 -10
- package/dist/server/middleware-matcher.d.ts +2 -0
- package/dist/server/middleware-matcher.js +23 -2
- package/dist/server/middleware-path-to-regexp.js +1 -1
- package/dist/server/middleware-runtime.d.ts +13 -0
- package/dist/server/middleware-runtime.js +38 -25
- package/dist/server/middleware.d.ts +1 -1
- package/dist/server/middleware.js +3 -1
- package/dist/server/multi-stage.d.ts +11 -0
- package/dist/server/navigation-planner.js +1 -1
- package/dist/server/normalize-path.d.ts +0 -13
- package/dist/server/normalize-path.js +1 -34
- package/dist/server/open-redirect.d.ts +11 -4
- package/dist/server/open-redirect.js +11 -4
- package/dist/server/pages-api-route.d.ts +3 -2
- package/dist/server/pages-api-route.js +6 -5
- package/dist/server/pages-cache-tag.d.ts +12 -0
- package/dist/server/pages-cache-tag.js +19 -0
- package/dist/server/pages-client-assets.d.ts +2 -0
- package/dist/server/pages-data-route.d.ts +10 -0
- package/dist/server/pages-data-route.js +21 -3
- package/dist/server/pages-document-asset-props.d.ts +5 -1
- package/dist/server/pages-document-asset-props.js +13 -5
- package/dist/server/pages-document-splice.d.ts +19 -0
- package/dist/server/pages-document-splice.js +55 -0
- package/dist/server/pages-i18n.d.ts +12 -1
- package/dist/server/pages-i18n.js +18 -4
- package/dist/server/pages-node-compat.d.ts +16 -5
- package/dist/server/pages-node-compat.js +20 -12
- package/dist/server/pages-page-data.d.ts +32 -24
- package/dist/server/pages-page-data.js +51 -121
- package/dist/server/pages-page-handler.d.ts +0 -6
- package/dist/server/pages-page-handler.js +189 -127
- package/dist/server/pages-page-response.d.ts +12 -6
- package/dist/server/pages-page-response.js +42 -35
- package/dist/server/pages-request-pipeline.d.ts +10 -2
- package/dist/server/pages-request-pipeline.js +41 -22
- package/dist/server/pages-request-stage-entry.d.ts +6 -0
- package/dist/server/pages-request-stage-entry.js +75 -16
- package/dist/server/pages-response-stage-entry.js +4 -0
- package/dist/server/pages-revalidate.js +3 -3
- package/dist/server/pages-router-entry.js +5 -4
- package/dist/server/prerender-manifest.d.ts +3 -3
- package/dist/server/prerender-manifest.js +4 -3
- package/dist/server/prerender-work-unit-setup.js +4 -0
- package/dist/server/prod-server.d.ts +12 -0
- package/dist/server/prod-server.js +204 -74
- package/dist/server/proper-error.d.ts +4 -0
- package/dist/server/proper-error.js +31 -0
- package/dist/server/request-pipeline.d.ts +4 -1
- package/dist/server/request-pipeline.js +3 -2
- package/dist/server/revalidation-request.d.ts +1 -0
- package/dist/server/revalidation-request.js +1 -1
- package/dist/server/rsc-stream-hints.d.ts +1 -1
- package/dist/server/rsc-stream-hints.js +52 -5
- package/dist/server/seed-cache.d.ts +1 -0
- package/dist/server/seed-cache.js +5 -4
- package/dist/server/server-reference-loader.d.ts +4 -0
- package/dist/server/server-reference-loader.js +29 -0
- package/dist/server/socket-error-backstop.d.ts +9 -1
- package/dist/server/socket-error-backstop.js +46 -17
- package/dist/server/static-file-signal.d.ts +15 -4
- package/dist/server/static-file-signal.js +46 -12
- package/dist/server/worker-image-optimization.d.ts +34 -0
- package/dist/server/worker-image-optimization.js +99 -0
- package/dist/server/worker-stages.d.ts +1 -1
- package/dist/server/worker-stages.js +2 -2
- package/dist/server/worker-utils.d.ts +8 -3
- package/dist/server/worker-utils.js +12 -7
- package/dist/shims/app-router-scroll.js +4 -1
- package/dist/shims/app-router-tree-context.d.ts +5 -0
- package/dist/shims/app-router-tree-context.js +27 -0
- package/dist/shims/cache-callable-runtime.d.ts +4 -2
- package/dist/shims/cache-callable-runtime.js +21 -12
- package/dist/shims/cache-handler.js +1 -9
- package/dist/shims/cache-runtime.d.ts +6 -1
- package/dist/shims/cache-runtime.js +2 -1
- package/dist/shims/cache.d.ts +2 -2
- package/dist/shims/cache.js +40 -13
- package/dist/shims/cdn-cache.d.ts +8 -0
- package/dist/shims/cdn-cache.js +17 -1
- package/dist/shims/disable-smooth-scroll.d.ts +3 -0
- package/dist/shims/disable-smooth-scroll.js +36 -0
- package/dist/shims/document-placeholders.d.ts +19 -0
- package/dist/shims/document-placeholders.js +45 -0
- package/dist/shims/document.js +21 -5
- package/dist/shims/dynamic-preload-chunks.d.ts +1 -0
- package/dist/shims/dynamic-preload-chunks.js +13 -9
- package/dist/shims/dynamic.d.ts +1 -1
- package/dist/shims/dynamic.js +60 -8
- package/dist/shims/fetch-cache-state.d.ts +66 -0
- package/dist/shims/fetch-cache-state.js +92 -0
- package/dist/shims/fetch-cache.d.ts +3 -67
- package/dist/shims/fetch-cache.js +160 -125
- package/dist/shims/head.d.ts +10 -6
- package/dist/shims/head.js +16 -14
- package/dist/shims/headers.js +2 -2
- package/dist/shims/image.js +2 -1
- package/dist/shims/internal/hybrid-client-route-owner-direct.js +1 -1
- package/dist/shims/internal/hybrid-client-route-owner.js +1 -0
- package/dist/shims/internal/work-store-scope.d.ts +5 -0
- package/dist/shims/internal/work-store-scope.js +24 -0
- package/dist/shims/link-prefetch.js +5 -4
- package/dist/shims/link.js +2 -2
- package/dist/shims/navigation.js +34 -9
- package/dist/shims/request-context.d.ts +2 -0
- package/dist/shims/request-state-types.d.ts +2 -1
- package/dist/shims/router.js +21 -32
- package/dist/shims/server.d.ts +27 -4
- package/dist/shims/server.js +65 -9
- package/dist/shims/unified-request-context.d.ts +1 -1
- package/dist/shims/url-utils.d.ts +9 -0
- package/dist/shims/url-utils.js +15 -4
- package/dist/utils/client-runtime-metadata.js +1 -1
- package/dist/utils/domain-locale.js +1 -1
- package/dist/utils/hash.d.ts +7 -0
- package/dist/utils/hash.js +11 -1
- package/dist/utils/package-name.d.ts +6 -0
- package/dist/utils/package-name.js +12 -1
- package/dist/utils/plugin-rsc-version.d.ts +6 -0
- package/dist/utils/plugin-rsc-version.js +41 -0
- package/dist/utils/prerender-output-paths.js +15 -4
- package/dist/utils/public-file-path.d.ts +10 -2
- package/dist/utils/public-file-path.js +13 -9
- package/dist/utils/public-routes.js +2 -2
- package/dist/utils/react-version.d.ts +10 -0
- package/dist/utils/react-version.js +39 -16
- package/package.json +11 -7
- package/dist/build/nitro-route-rules.d.ts +0 -47
- package/dist/build/nitro-route-rules.js +0 -79
- package/dist/plugins/cache-flight-codec.d.ts +0 -19
- package/dist/plugins/cache-flight-codec.js +0 -68
|
@@ -1,23 +1,26 @@
|
|
|
1
1
|
import { isBotUserAgent } from "../utils/html-limited-bots.js";
|
|
2
|
-
import { getRequestExecutionContext } from "../shims/request-context.js";
|
|
3
2
|
import { NEXTJS_CACHE_HEADER, VINEXT_REVALIDATED_CACHE_TAG_HEADER } from "./headers.js";
|
|
3
|
+
import { getRequestExecutionContext } from "../shims/request-context.js";
|
|
4
4
|
import { reportRequestError } from "./instrumentation.js";
|
|
5
|
+
import { getCdnCacheAdapter } from "../shims/cdn-cache.js";
|
|
5
6
|
import { markRouteCacheabilityExplicitResponsePolicy } from "../shims/cacheability-classification.js";
|
|
6
7
|
import { BROWSER_REVALIDATE_CACHE_CONTROL, NEVER_CACHE_CONTROL, NO_STORE_CACHE_CONTROL, applyCdnResponseHeaders, hasCdnResponsePolicy, shouldUseNextDeployCacheControl } from "./cache-control.js";
|
|
7
8
|
import { buildMissIsrCacheControl } from "./isr-decision.js";
|
|
8
|
-
import { fnv1a52 } from "../utils/hash.js";
|
|
9
9
|
import { isrCacheControl } from "./isr-cache.js";
|
|
10
|
-
import {
|
|
10
|
+
import { fnv1a52 } from "../utils/hash.js";
|
|
11
11
|
import { appendAssetDeploymentIdQuery } from "../utils/deployment-id.js";
|
|
12
12
|
import { withScriptNonce } from "../shims/script-nonce-context.js";
|
|
13
13
|
import { createNonceAttribute, escapeHtmlAttr } from "./html.js";
|
|
14
|
+
import { createDocumentPlaceholderToken, withDocumentPlaceholders } from "../shims/document-placeholders.js";
|
|
14
15
|
import { applyDocumentAssetProps, extractDocumentAssetProps } from "./pages-document-asset-props.js";
|
|
16
|
+
import { spliceDocumentHeadClose, spliceDocumentHeadOpen, spliceDocumentScripts, splitDocumentAtMain } from "./pages-document-splice.js";
|
|
15
17
|
import { getClientTraceMetadataHTML } from "./client-trace-metadata.js";
|
|
16
18
|
import { setCacheStateHeaders } from "./cache-headers.js";
|
|
19
|
+
import { pagesPathCacheTag } from "./pages-cache-tag.js";
|
|
17
20
|
import { readStreamAsText } from "../utils/text-stream.js";
|
|
18
21
|
import { loadUserDocumentInitialProps, runDocumentRenderPage } from "./pages-document-initial-props.js";
|
|
19
22
|
import { callDocumentGetInitialProps } from "./document-initial-head.js";
|
|
20
|
-
import {
|
|
23
|
+
import { isPageNotModified } from "./http-conditional.js";
|
|
21
24
|
import React from "react";
|
|
22
25
|
//#region src/server/pages-page-response.ts
|
|
23
26
|
/**
|
|
@@ -31,14 +34,13 @@ function generatePagesETag(payload) {
|
|
|
31
34
|
return "\"" + fnv1a52(payload).toString(36) + payload.length.toString(36) + "\"";
|
|
32
35
|
}
|
|
33
36
|
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* `pages-page-data.ts` so the two cannot drift.
|
|
37
|
+
* Whether a render answers a matching If-None-Match with a 304. Next.js stores
|
|
38
|
+
* the page before it evaluates the ETag, so when the CDN adapter stores the
|
|
39
|
+
* completed response, the render returns the page and the adapter sends the 304.
|
|
40
|
+
* A page whose status carries no body has nothing to store.
|
|
39
41
|
*/
|
|
40
|
-
function
|
|
41
|
-
return
|
|
42
|
+
function rendersPagesNotModified(status) {
|
|
43
|
+
return status === 204 || status === 205 || status === 304 || getCdnCacheAdapter().deferNotModifiedResponse?.() !== true;
|
|
42
44
|
}
|
|
43
45
|
function buildPagesFontHeadHtml(fontLinks, fontPreloads, fontStyles, scriptNonce) {
|
|
44
46
|
let html = "";
|
|
@@ -71,33 +73,34 @@ function buildPagesNextDataScript(options) {
|
|
|
71
73
|
};
|
|
72
74
|
return `<script id="__NEXT_DATA__" type="application/json"${createNonceAttribute(options.scriptNonce)}>${options.safeJsonStringify(nextDataPayload)}<\/script>`;
|
|
73
75
|
}
|
|
74
|
-
async function buildPagesShellHtml(
|
|
76
|
+
async function buildPagesShellHtml(fontHeadHTML, nextDataScript, options) {
|
|
75
77
|
if (options.DocumentComponent) {
|
|
76
78
|
const docProps = options.resolvedDocProps ?? await loadUserDocumentInitialProps(options.DocumentComponent);
|
|
77
79
|
const docElement = docProps ? React.createElement(options.DocumentComponent, docProps) : React.createElement(options.DocumentComponent);
|
|
78
|
-
const
|
|
80
|
+
const token = createDocumentPlaceholderToken();
|
|
81
|
+
const renderedDocument = extractDocumentAssetProps(await options.renderDocumentToString(withDocumentPlaceholders(docElement, token)), token);
|
|
79
82
|
let html = renderedDocument.html;
|
|
80
83
|
const generatedAssetTags = applyDocumentAssetProps(options.assetTags, renderedDocument.props, {
|
|
81
84
|
configuredCrossOrigin: options.crossOrigin,
|
|
82
85
|
scriptOwner: options.disableOptimizedLoading ? "next-script" : "head"
|
|
83
86
|
});
|
|
84
87
|
const generatedNextDataScript = applyDocumentAssetProps(nextDataScript, renderedDocument.props, { configuredCrossOrigin: options.crossOrigin });
|
|
85
|
-
html = html
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
if (!html.includes("__NEXT_DATA__")) html = html.replace("</body>", ` ${generatedNextDataScript}\n</body>`);
|
|
90
|
-
return html;
|
|
88
|
+
html = spliceDocumentHeadOpen(html, token, options.ssrHeadHTML);
|
|
89
|
+
html = spliceDocumentHeadClose(html, token, generatedAssetTags || fontHeadHTML || options.tailHeadHTML ? ` ${fontHeadHTML}\n ${generatedAssetTags}\n ${options.tailHeadHTML}\n` : "");
|
|
90
|
+
html = spliceDocumentScripts(html, token, generatedNextDataScript);
|
|
91
|
+
return splitDocumentAtMain(html, token);
|
|
91
92
|
}
|
|
92
93
|
const generatedAssetTags = applyDocumentAssetProps(options.assetTags, {}, { configuredCrossOrigin: options.crossOrigin });
|
|
93
94
|
const generatedNextDataScript = applyDocumentAssetProps(nextDataScript, {}, { configuredCrossOrigin: options.crossOrigin });
|
|
94
|
-
return
|
|
95
|
+
return {
|
|
96
|
+
prefix: `<!DOCTYPE html>
|
|
95
97
|
<html>
|
|
96
98
|
<head>
|
|
97
99
|
${options.ssrHeadHTML}${fontHeadHTML}\n ${generatedAssetTags}\n ${options.tailHeadHTML}\n</head>
|
|
98
100
|
<body>
|
|
99
|
-
<div id="__next"
|
|
100
|
-
</html
|
|
101
|
+
<div id="__next">`,
|
|
102
|
+
suffix: `</div>\n ${generatedNextDataScript}\n</body>\n</html>`
|
|
103
|
+
};
|
|
101
104
|
}
|
|
102
105
|
async function buildPagesCompositeStream(bodyStream, shellPrefix, shellSuffix) {
|
|
103
106
|
const encoder = new TextEncoder();
|
|
@@ -182,7 +185,6 @@ async function renderPagesPageResponse(options) {
|
|
|
182
185
|
nextData: options.nextData,
|
|
183
186
|
vinext: options.vinext
|
|
184
187
|
});
|
|
185
|
-
const bodyMarker = "<!--VINEXT_STREAM_BODY-->";
|
|
186
188
|
const documentResult = await (options.traceDocument ?? ((callback) => callback()))(async () => {
|
|
187
189
|
const documentRenderPage = await runDocumentRenderPage({
|
|
188
190
|
DocumentComponent: options.DocumentComponent,
|
|
@@ -200,7 +202,7 @@ async function renderPagesPageResponse(options) {
|
|
|
200
202
|
asPath: options.routeUrl
|
|
201
203
|
}
|
|
202
204
|
});
|
|
203
|
-
if (options.documentReqRes?.res.headersSent && options.documentReqRes.responsePromise) return {
|
|
205
|
+
if (!options.isStaticPropsRoute && options.documentReqRes?.res.headersSent && options.documentReqRes.responsePromise) return {
|
|
204
206
|
documentRenderPage,
|
|
205
207
|
responseSent: true
|
|
206
208
|
};
|
|
@@ -233,7 +235,7 @@ async function renderPagesPageResponse(options) {
|
|
|
233
235
|
if (tailHeadHTML) tailHeadHTML += "\n ";
|
|
234
236
|
tailHeadHTML += documentRenderPage.stylesHTML;
|
|
235
237
|
}
|
|
236
|
-
const
|
|
238
|
+
const { prefix: shellPrefix, suffix: shellSuffix } = await buildPagesShellHtml(fontHeadHTML, nextDataScript, {
|
|
237
239
|
assetTags: options.assetTags,
|
|
238
240
|
disableOptimizedLoading: options.disableOptimizedLoading,
|
|
239
241
|
DocumentComponent: options.DocumentComponent,
|
|
@@ -244,9 +246,6 @@ async function renderPagesPageResponse(options) {
|
|
|
244
246
|
crossOrigin: options.crossOrigin
|
|
245
247
|
});
|
|
246
248
|
options.clearSsrContext();
|
|
247
|
-
const markerIndex = shellHtml.indexOf(bodyMarker);
|
|
248
|
-
const shellPrefix = shellHtml.slice(0, markerIndex);
|
|
249
|
-
const shellSuffix = shellHtml.slice(markerIndex + 25);
|
|
250
249
|
const responseHeaders = new Headers({ "Content-Type": "text/html; charset=utf-8" });
|
|
251
250
|
const finalStatus = applyGsspHeaders(responseHeaders, options.gsspRes ?? options.documentReqRes?.res ?? null, options.statusCode);
|
|
252
251
|
let responseBodyStream = bodyStream;
|
|
@@ -264,26 +263,30 @@ async function renderPagesPageResponse(options) {
|
|
|
264
263
|
setCache: options.isrSet,
|
|
265
264
|
shellPrefix,
|
|
266
265
|
shellSuffix,
|
|
267
|
-
status: finalStatus,
|
|
266
|
+
status: options.isStaticPropsRoute ? options.statusCode ?? 200 : finalStatus,
|
|
268
267
|
stream: cacheBodyStream
|
|
269
268
|
};
|
|
270
|
-
if (options.isOnDemandRevalidate) await writePagesIsrCache(cacheWriteOptions);
|
|
269
|
+
if (options.isOnDemandRevalidate || options.isStaleRegeneration) await writePagesIsrCache(cacheWriteOptions);
|
|
271
270
|
else schedulePagesIsrCacheWrite(cacheWriteOptions);
|
|
272
271
|
}
|
|
272
|
+
if (!options.isOnDemandRevalidate && options.documentReqRes?.res.headersSent && options.documentReqRes.responsePromise) {
|
|
273
|
+
responseBodyStream.cancel().catch(() => {});
|
|
274
|
+
return options.documentReqRes.responsePromise;
|
|
275
|
+
}
|
|
273
276
|
const compositeStream = await buildPagesCompositeStream(responseBodyStream, shellPrefix, shellSuffix);
|
|
274
277
|
const userSetCacheControl = responseHeaders.has("Cache-Control");
|
|
275
278
|
if (hasCdnResponsePolicy(responseHeaders)) markRouteCacheabilityExplicitResponsePolicy();
|
|
276
279
|
if (options.scriptNonce) responseHeaders.set("Cache-Control", NO_STORE_CACHE_CONTROL);
|
|
277
280
|
else if (options.isrRevalidateSeconds !== null) {
|
|
278
281
|
const isrPathname = options.isrCachePathname ?? options.routeUrl.split("?")[0];
|
|
279
|
-
const
|
|
282
|
+
const pathTag = pagesPathCacheTag(isrPathname);
|
|
280
283
|
applyCdnResponseHeaders(responseHeaders, {
|
|
281
284
|
cacheControl: buildMissIsrCacheControl(options.isrRevalidateSeconds, options.expireSeconds),
|
|
282
|
-
tags: [
|
|
285
|
+
tags: [pathTag]
|
|
283
286
|
});
|
|
284
287
|
if (options.isOnDemandRevalidate) {
|
|
285
288
|
responseHeaders.set(NEXTJS_CACHE_HEADER, "REVALIDATED");
|
|
286
|
-
responseHeaders.set(VINEXT_REVALIDATED_CACHE_TAG_HEADER,
|
|
289
|
+
responseHeaders.set(VINEXT_REVALIDATED_CACHE_TAG_HEADER, encodeURIComponent(pathTag));
|
|
287
290
|
} else setCacheStateHeaders(responseHeaders, "MISS");
|
|
288
291
|
} else if (options.isStaticPropsRoute && shouldUseNextDeployCacheControl()) responseHeaders.set("Cache-Control", BROWSER_REVALIDATE_CACHE_CONTROL);
|
|
289
292
|
else if (options.gsspRes && !userSetCacheControl) responseHeaders.set("Cache-Control", NEVER_CACHE_CONTROL);
|
|
@@ -292,7 +295,11 @@ async function renderPagesPageResponse(options) {
|
|
|
292
295
|
const fullHtml = await readStreamAsText(compositeStream);
|
|
293
296
|
const etag = generatePagesETag(fullHtml);
|
|
294
297
|
responseHeaders.set("ETag", etag);
|
|
295
|
-
if (
|
|
298
|
+
if (isPageNotModified({
|
|
299
|
+
cacheControl: options.requestCacheControl,
|
|
300
|
+
ifModifiedSince: options.ifModifiedSince,
|
|
301
|
+
ifNoneMatch: options.ifNoneMatch
|
|
302
|
+
}, etag) && rendersPagesNotModified(finalStatus)) return new Response(null, {
|
|
296
303
|
status: 304,
|
|
297
304
|
headers: responseHeaders
|
|
298
305
|
});
|
|
@@ -307,4 +314,4 @@ async function renderPagesPageResponse(options) {
|
|
|
307
314
|
}), { __vinextStreamedHtmlResponse: true });
|
|
308
315
|
}
|
|
309
316
|
//#endregion
|
|
310
|
-
export { buildPagesNextDataScript, generatePagesETag, isPagesStreamingBot, renderPagesPageResponse,
|
|
317
|
+
export { buildPagesNextDataScript, generatePagesETag, isPagesStreamingBot, renderPagesPageResponse, rendersPagesNotModified };
|
|
@@ -15,7 +15,7 @@ type PageRouteMatch = {
|
|
|
15
15
|
dataKind?: PagesRouteDataKind;
|
|
16
16
|
};
|
|
17
17
|
};
|
|
18
|
-
export declare function fetchWorkerFilesystemRoute(request: Request, requestPathname: string, phase: FilesystemRoutePhase, fetchAsset: (request: Request) => Promise<Response>, publicFiles: ReadonlySet<string>, basePath?: string, assetPathPrefix?: string): Promise<Response | false>;
|
|
18
|
+
export declare function fetchWorkerFilesystemRoute(request: Request, requestPathname: string, phase: FilesystemRoutePhase, fetchAsset: (request: Request) => Promise<Response>, publicFiles: ReadonlySet<string>, basePath?: string, assetPathPrefix?: string, hadBasePath?: boolean): Promise<Response | false>;
|
|
19
19
|
export type MiddlewareResult = {
|
|
20
20
|
continue: boolean;
|
|
21
21
|
/** The pathname matches middleware, irrespective of request `has`/`missing` conditions. */
|
|
@@ -23,6 +23,8 @@ export type MiddlewareResult = {
|
|
|
23
23
|
redirectUrl?: string;
|
|
24
24
|
redirectStatus?: number;
|
|
25
25
|
rewriteUrl?: string;
|
|
26
|
+
/** False when a same-origin rewrite target was outside the basePath. */
|
|
27
|
+
rewriteHadBasePath?: boolean;
|
|
26
28
|
rewriteStatus?: number;
|
|
27
29
|
status?: number;
|
|
28
30
|
responseHeaders?: Iterable<[string, string]>;
|
|
@@ -33,6 +35,8 @@ export type PagesPipelineDeps = {
|
|
|
33
35
|
assetPrefix?: string;
|
|
34
36
|
basePath: string;
|
|
35
37
|
trailingSlash: boolean;
|
|
38
|
+
/** next.config `skipTrailingSlashRedirect`: serve both slash forms without a 308. */
|
|
39
|
+
skipTrailingSlashRedirect?: boolean;
|
|
36
40
|
i18nConfig: NextI18nConfig | null;
|
|
37
41
|
configRedirects: NextRedirect[];
|
|
38
42
|
configRewrites: {
|
|
@@ -67,6 +71,7 @@ export type PagesPipelineDeps = {
|
|
|
67
71
|
matchApiRoute?: ((url: string, request: Request) => PageRouteMatch | null | Promise<PageRouteMatch | null>) | null;
|
|
68
72
|
runMiddleware?: ((request: Request, ctx: unknown, opts: {
|
|
69
73
|
isDataRequest: boolean;
|
|
74
|
+
isStaleDataRequest?: boolean;
|
|
70
75
|
}) => Promise<MiddlewareResult>) | null;
|
|
71
76
|
/** Original URL presented to middleware when URL normalization is disabled. */
|
|
72
77
|
middlewareRequest?: Request;
|
|
@@ -86,10 +91,13 @@ export type PagesPipelineDeps = {
|
|
|
86
91
|
* Optional filesystem/static-asset probe supplied by each runtime adapter.
|
|
87
92
|
* Called post-middleware (so middleware can intercept/redirect public files) with the
|
|
88
93
|
* resolved basePath-stripped pathname and URL plus the staged middleware response headers.
|
|
94
|
+
* `request` carries the request headers middleware overrode.
|
|
89
95
|
* Node may write directly to `res` and return true; dev/Workers return a Response.
|
|
90
96
|
* Resolves false to continue through rewrites, API routes, and page rendering.
|
|
91
97
|
*/
|
|
92
|
-
serveFilesystemRoute?: ((requestPathname: string, stagedHeaders: HeaderRecord, phase: FilesystemRoutePhase, resolvedUrl: string
|
|
98
|
+
serveFilesystemRoute?: ((requestPathname: string, stagedHeaders: HeaderRecord, phase: FilesystemRoutePhase, resolvedUrl: string, request: Request,
|
|
99
|
+
/** Whether the resolved pathname is under the basePath, as Next.js checks before serving filesystem items. */
|
|
100
|
+
resolvedPathnameHasBasePath: boolean) => Promise<boolean | Response>) | null;
|
|
93
101
|
};
|
|
94
102
|
/**
|
|
95
103
|
* Wrap an adapter's `runMiddleware` callback so middleware receives the original
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import { PRERENDER_REVALIDATE_HEADER } from "../utils/protocol-headers.js";
|
|
2
2
|
import { requestContextFromRequest } from "../config/request-context.js";
|
|
3
3
|
import { isExternalUrl } from "../utils/external-url.js";
|
|
4
|
-
import { applyMiddlewareRequestHeaders, matchRedirect, matchRewrite, preserveRedirectDestinationQuery, proxyExternalRequest, sanitizeDestination } from "../config/config-matchers.js";
|
|
5
|
-
import { assetPrefixPathname, isNextStaticPath } from "../utils/asset-prefix.js";
|
|
6
4
|
import { addBasePathToPathname, hasBasePath } from "../utils/base-path.js";
|
|
7
|
-
import { patternToNextFormat } from "../routing/route-validation.js";
|
|
8
5
|
import { VINEXT_PRERENDER_REWRITTEN_HEADER } from "./headers.js";
|
|
9
6
|
import { methodNotAllowedResponse, notFoundStaticAssetResponse, sanitizeMethodNotAllowedHeaders } from "./http-error-responses.js";
|
|
10
7
|
import { cloneRequestWithUrl, normalizeTrailingSlash } from "./request-pipeline.js";
|
|
11
|
-
import {
|
|
8
|
+
import { applyMiddlewareRequestHeaders, matchRedirect, matchRewrite, preserveRedirectDestinationQuery, proxyExternalRequest, sanitizeDestination } from "../config/config-matchers.js";
|
|
9
|
+
import { assetPrefixPathname, isNextStaticPath } from "../utils/asset-prefix.js";
|
|
10
|
+
import { normalizePathnameForRouteMatchStrict } from "../routing/utils.js";
|
|
11
|
+
import { patternToNextFormat } from "../routing/route-validation.js";
|
|
12
|
+
import { detectPathnameLocale, normalizeDefaultLocalePathname, stripI18nLocaleForApiRoute } from "./pages-i18n.js";
|
|
13
|
+
import { buildMiddlewarePrefetchSkipResponse } from "./pages-data-route.js";
|
|
12
14
|
import { markRouteCacheabilityDynamic } from "../shims/cacheability-classification.js";
|
|
13
15
|
import { isOnDemandRevalidateRequest } from "./revalidation-request.js";
|
|
14
16
|
import { mergeRewriteQuery } from "../utils/query.js";
|
|
15
|
-
import { buildMiddlewarePrefetchSkipResponse } from "./pages-data-route.js";
|
|
16
17
|
import { setFrameworkRequestRoute } from "./request-tracing.js";
|
|
17
18
|
import { applyConfigHeadersToHeaderRecord } from "./config-headers.js";
|
|
18
19
|
import { finalizeMissingStaticAssetResponse, mergeHeaders } from "./worker-utils.js";
|
|
@@ -32,19 +33,23 @@ function headersFromRecord(record) {
|
|
|
32
33
|
else headers.set(name, value);
|
|
33
34
|
return headers;
|
|
34
35
|
}
|
|
35
|
-
async function fetchWorkerFilesystemRoute(request, requestPathname, phase, fetchAsset, publicFiles, basePath = "", assetPathPrefix = "") {
|
|
36
|
+
async function fetchWorkerFilesystemRoute(request, requestPathname, phase, fetchAsset, publicFiles, basePath = "", assetPathPrefix = "", hadBasePath = true) {
|
|
36
37
|
const isRetrievalMethod = request.method === "GET" || request.method === "HEAD";
|
|
37
|
-
if (phase === "direct" && isRetrievalMethod || requestPathname === "/api" || requestPathname.startsWith("/api/")) return false;
|
|
38
38
|
const assetUrl = new URL(request.url);
|
|
39
39
|
assetUrl.pathname = requestPathname;
|
|
40
40
|
assetUrl.search = "";
|
|
41
41
|
const decodedAssetUrl = new URL(assetUrl);
|
|
42
|
+
let publicFileKey;
|
|
42
43
|
try {
|
|
43
44
|
decodedAssetUrl.pathname = decodeURIComponent(assetUrl.pathname);
|
|
45
|
+
publicFileKey = normalizePathnameForRouteMatchStrict(assetUrl.pathname);
|
|
44
46
|
} catch {
|
|
45
47
|
return false;
|
|
46
48
|
}
|
|
47
|
-
|
|
49
|
+
const isPublicFile = (phase !== "direct" || hadBasePath) && publicFiles.has(publicFileKey);
|
|
50
|
+
if (!isPublicFile && (requestPathname === "/api" || requestPathname.startsWith("/api/"))) return false;
|
|
51
|
+
if (phase === "direct" && isRetrievalMethod && !isPublicFile) return false;
|
|
52
|
+
if (!isPublicFile && !isNextStaticPath(decodedAssetUrl.pathname, basePath, assetPathPrefix)) return false;
|
|
48
53
|
const response = await fetchAsset(isRetrievalMethod ? new Request(assetUrl, request) : new Request(assetUrl, {
|
|
49
54
|
method: "HEAD",
|
|
50
55
|
headers: request.headers
|
|
@@ -74,7 +79,7 @@ function wrapMiddlewareWithBasePath(runMiddleware, basePath, hadBasePath) {
|
|
|
74
79
|
return (request, ctx, opts) => {
|
|
75
80
|
const mwUrl = new URL(request.url);
|
|
76
81
|
mwUrl.pathname = addBasePathToPathname(mwUrl.pathname, basePath);
|
|
77
|
-
return runMiddleware(
|
|
82
|
+
return runMiddleware(cloneRequestWithUrl(request, mwUrl.toString()), ctx, opts);
|
|
78
83
|
};
|
|
79
84
|
}
|
|
80
85
|
/**
|
|
@@ -89,7 +94,7 @@ function wrapMiddlewareWithBasePath(runMiddleware, basePath, hadBasePath) {
|
|
|
89
94
|
* runPagesRequest receives a "clean" request with basePath-stripped URL.
|
|
90
95
|
*/
|
|
91
96
|
async function runPagesRequest(request, deps) {
|
|
92
|
-
const { basePath, trailingSlash, i18nConfig, configRedirects, configRewrites, configHeaders, hadBasePath, isDataReq, isDataRequest } = deps;
|
|
97
|
+
const { basePath, trailingSlash, skipTrailingSlashRedirect, i18nConfig, configRedirects, configRewrites, configHeaders, hadBasePath, isDataReq, isDataRequest } = deps;
|
|
93
98
|
const conditionalRedirectCacheability = deps.recordCacheability === false ? void 0 : markConditionalRedirectCacheability;
|
|
94
99
|
const conditionalRewriteCacheability = deps.recordCacheability === false ? void 0 : markConditionalRewriteCacheability;
|
|
95
100
|
const proxyExternal = (currentReq, externalUrl) => deps.proxyExternal ? deps.proxyExternal(currentReq, externalUrl) : proxyExternalRequest(currentReq, externalUrl);
|
|
@@ -104,7 +109,7 @@ async function runPagesRequest(request, deps) {
|
|
|
104
109
|
hadBasePath
|
|
105
110
|
};
|
|
106
111
|
{
|
|
107
|
-
const trailingSlashRedirect = isDataReq ? null : normalizeTrailingSlash(pathname, basePath, trailingSlash, search);
|
|
112
|
+
const trailingSlashRedirect = isDataReq || skipTrailingSlashRedirect ? null : normalizeTrailingSlash(pathname, hadBasePath ? basePath : "", trailingSlash, search);
|
|
108
113
|
if (trailingSlashRedirect) return {
|
|
109
114
|
type: "response",
|
|
110
115
|
response: trailingSlashRedirect
|
|
@@ -117,7 +122,7 @@ async function runPagesRequest(request, deps) {
|
|
|
117
122
|
const redirect = matchRedirect(requestConfigMatchPathname, configRedirects, reqCtx, basePathState, conditionalRedirectCacheability);
|
|
118
123
|
if (redirect) {
|
|
119
124
|
const dest = sanitizeDestination(basePath && hadBasePath && !isExternalUrl(redirect.destination) && !hasBasePath(redirect.destination, basePath) ? basePath + redirect.destination : redirect.destination);
|
|
120
|
-
const location = preserveRedirectDestinationQuery(dest, deps.rawSearch ?? search);
|
|
125
|
+
const location = preserveRedirectDestinationQuery(dest, deps.rawSearch ?? search, redirect.destinationQuery);
|
|
121
126
|
return {
|
|
122
127
|
type: "response",
|
|
123
128
|
response: new Response(null, {
|
|
@@ -130,6 +135,11 @@ async function runPagesRequest(request, deps) {
|
|
|
130
135
|
const originalResolvedUrl = pathname + search;
|
|
131
136
|
let resolvedUrl = originalResolvedUrl;
|
|
132
137
|
let resolvedPathnameIsRequestPathname = true;
|
|
138
|
+
let resolvedPathnameHasBasePath = hadBasePath;
|
|
139
|
+
const currentBasePathState = () => ({
|
|
140
|
+
basePath,
|
|
141
|
+
hadBasePath: resolvedPathnameHasBasePath
|
|
142
|
+
});
|
|
133
143
|
const middlewareHeaders = {};
|
|
134
144
|
const mergeConfigHeadersIntoEarlyResponse = (response) => {
|
|
135
145
|
if (configHeaders.length === 0) return response;
|
|
@@ -146,10 +156,10 @@ async function runPagesRequest(request, deps) {
|
|
|
146
156
|
let middlewareStatus;
|
|
147
157
|
const serveFilesystemRoute = async (requestPathname, phase) => {
|
|
148
158
|
if (!deps.serveFilesystemRoute) return null;
|
|
149
|
-
const served = await deps.serveFilesystemRoute(requestPathname, middlewareHeaders, phase, resolvedUrl);
|
|
159
|
+
const served = await deps.serveFilesystemRoute(requestPathname, middlewareHeaders, phase, resolvedUrl, request, resolvedPathnameHasBasePath);
|
|
150
160
|
if (served instanceof Response) {
|
|
151
161
|
const isStaticMethodNotAllowed = served.status === 405 && served.headers.get("allow") === "GET, HEAD";
|
|
152
|
-
const response = mergeHeaders(served, middlewareHeaders, isStaticMethodNotAllowed ? void 0 : middlewareStatus);
|
|
162
|
+
const response = mergeHeaders(served, middlewareHeaders, isStaticMethodNotAllowed || !served.ok || served.status === 206 ? void 0 : middlewareStatus);
|
|
153
163
|
if (isStaticMethodNotAllowed) sanitizeMethodNotAllowedHeaders(response.headers, "GET, HEAD");
|
|
154
164
|
return {
|
|
155
165
|
type: "response",
|
|
@@ -159,7 +169,10 @@ async function runPagesRequest(request, deps) {
|
|
|
159
169
|
return served ? { type: "handled" } : null;
|
|
160
170
|
};
|
|
161
171
|
if (!isOnDemandRevalidate && typeof deps.runMiddleware === "function") {
|
|
162
|
-
const result = await deps.runMiddleware(deps.middlewareRequest ?? request, deps.ctx ?? null, {
|
|
172
|
+
const result = await deps.runMiddleware(deps.middlewareRequest ?? request, deps.ctx ?? null, {
|
|
173
|
+
isDataRequest,
|
|
174
|
+
isStaleDataRequest: isDataRequest && !!deps.dataNotFoundResponse
|
|
175
|
+
});
|
|
163
176
|
if (deps.recordCacheability !== false && result.pathnameEligible) markRouteCacheabilityDynamic("middleware can match this pathname");
|
|
164
177
|
if (result.waitUntilPromises && result.waitUntilPromises.length > 0) {
|
|
165
178
|
const ctx = deps.ctx;
|
|
@@ -200,6 +213,7 @@ async function runPagesRequest(request, deps) {
|
|
|
200
213
|
if (result.rewriteUrl) {
|
|
201
214
|
resolvedUrl = result.rewriteUrl;
|
|
202
215
|
resolvedPathnameIsRequestPathname = false;
|
|
216
|
+
resolvedPathnameHasBasePath = result.rewriteHadBasePath ?? true;
|
|
203
217
|
}
|
|
204
218
|
middlewareStatus = result.status ?? result.rewriteStatus;
|
|
205
219
|
}
|
|
@@ -220,8 +234,8 @@ async function runPagesRequest(request, deps) {
|
|
|
220
234
|
const matchedPathnameForRoute = (routePattern) => {
|
|
221
235
|
const matchedPathname = routePattern ? patternToNextFormat(routePattern) : resolvedPathname;
|
|
222
236
|
if (!i18nConfig) return matchedPathname;
|
|
223
|
-
const resolvedLocale = resolvedPathname
|
|
224
|
-
if (resolvedLocale
|
|
237
|
+
const resolvedLocale = detectPathnameLocale(resolvedPathname, i18nConfig.locales);
|
|
238
|
+
if (resolvedLocale) return matchedPathname === "/" ? `/${resolvedLocale}` : `/${resolvedLocale}${matchedPathname}`;
|
|
225
239
|
return matchResolvedPathname(matchedPathname);
|
|
226
240
|
};
|
|
227
241
|
const buildMiddlewarePrefetchSkipResult = (match) => {
|
|
@@ -249,7 +263,7 @@ async function runPagesRequest(request, deps) {
|
|
|
249
263
|
}
|
|
250
264
|
let configRewriteFired = false;
|
|
251
265
|
for (const rewrite of configRewrites.beforeFiles ?? []) {
|
|
252
|
-
const rewritten = matchRewrite(configSourcePathname(), [rewrite], rewriteRequestContext(),
|
|
266
|
+
const rewritten = matchRewrite(configSourcePathname(), [rewrite], rewriteRequestContext(), currentBasePathState(), configSourcePathname(), conditionalRewriteCacheability);
|
|
253
267
|
if (rewritten) {
|
|
254
268
|
if (isExternalUrl(rewritten)) return {
|
|
255
269
|
type: "response",
|
|
@@ -258,6 +272,7 @@ async function runPagesRequest(request, deps) {
|
|
|
258
272
|
resolvedUrl = mergeRewriteQuery(resolvedUrl, rewritten);
|
|
259
273
|
resolvedPathname = pathnameForResolvedUrl(resolvedUrl);
|
|
260
274
|
resolvedPathnameIsRequestPathname = false;
|
|
275
|
+
resolvedPathnameHasBasePath = !basePath || rewrite.basePath !== false;
|
|
261
276
|
configRewriteFired = true;
|
|
262
277
|
}
|
|
263
278
|
}
|
|
@@ -310,7 +325,7 @@ async function runPagesRequest(request, deps) {
|
|
|
310
325
|
let pageMatch = !isOutsideBasePathUnclaimed() && deps.matchPageRoute ? deps.matchPageRoute(resolvedPathname, request) : null;
|
|
311
326
|
let resolvedPathnameChanged = false;
|
|
312
327
|
if (!pageMatch || pageMatch.route.isDynamic) for (const rewrite of configRewrites.afterFiles ?? []) {
|
|
313
|
-
const rewritten = matchRewrite(configSourcePathname(), [rewrite], rewriteRequestContext(),
|
|
328
|
+
const rewritten = matchRewrite(configSourcePathname(), [rewrite], rewriteRequestContext(), currentBasePathState(), configSourcePathname(), conditionalRewriteCacheability);
|
|
314
329
|
if (rewritten) {
|
|
315
330
|
if (isExternalUrl(rewritten)) return {
|
|
316
331
|
type: "response",
|
|
@@ -319,6 +334,7 @@ async function runPagesRequest(request, deps) {
|
|
|
319
334
|
resolvedUrl = mergeRewriteQuery(resolvedUrl, rewritten);
|
|
320
335
|
resolvedPathname = pathnameForResolvedUrl(resolvedUrl);
|
|
321
336
|
resolvedPathnameIsRequestPathname = false;
|
|
337
|
+
resolvedPathnameHasBasePath = !basePath || rewrite.basePath !== false;
|
|
322
338
|
configRewriteFired = true;
|
|
323
339
|
resolvedPathnameChanged = true;
|
|
324
340
|
const afterFilesFilesystemResult = await serveFilesystemRoute(resolvedPathname, "afterFiles");
|
|
@@ -337,7 +353,7 @@ async function runPagesRequest(request, deps) {
|
|
|
337
353
|
if (typeof deps.renderPage === "function") {
|
|
338
354
|
let renderPageMatch = pageMatch;
|
|
339
355
|
if ((isOutsideBasePathUnclaimed() || isDataReq || isDataRequest) && !renderPageMatch && configRewrites.fallback?.length) for (const rewrite of configRewrites.fallback) {
|
|
340
|
-
const fallbackRewrite = matchRewrite(configSourcePathname(), [rewrite], rewriteRequestContext(),
|
|
356
|
+
const fallbackRewrite = matchRewrite(configSourcePathname(), [rewrite], rewriteRequestContext(), currentBasePathState(), configSourcePathname(), conditionalRewriteCacheability);
|
|
341
357
|
if (!fallbackRewrite) continue;
|
|
342
358
|
if (isExternalUrl(fallbackRewrite)) return {
|
|
343
359
|
type: "response",
|
|
@@ -346,6 +362,7 @@ async function runPagesRequest(request, deps) {
|
|
|
346
362
|
resolvedUrl = mergeRewriteQuery(resolvedUrl, fallbackRewrite);
|
|
347
363
|
resolvedPathname = pathnameForResolvedUrl(resolvedUrl);
|
|
348
364
|
resolvedPathnameIsRequestPathname = false;
|
|
365
|
+
resolvedPathnameHasBasePath = !basePath || rewrite.basePath !== false;
|
|
349
366
|
configRewriteFired = true;
|
|
350
367
|
const fallbackFilesystemResult = await serveFilesystemRoute(resolvedPathname, "fallback");
|
|
351
368
|
if (fallbackFilesystemResult) return fallbackFilesystemResult;
|
|
@@ -365,7 +382,7 @@ async function runPagesRequest(request, deps) {
|
|
|
365
382
|
let response = await deps.renderPage(request, resolvedUrl, initialRenderOptions, stagedHeaders);
|
|
366
383
|
let matchedFallbackRewrite = false;
|
|
367
384
|
if (response.status === 404 && shouldDeferErrorPageOnMiss && configRewrites.fallback?.length) for (const rewrite of configRewrites.fallback) {
|
|
368
|
-
const fallbackRewrite = matchRewrite(configSourcePathname(), [rewrite], rewriteRequestContext(),
|
|
385
|
+
const fallbackRewrite = matchRewrite(configSourcePathname(), [rewrite], rewriteRequestContext(), currentBasePathState(), configSourcePathname(), conditionalRewriteCacheability);
|
|
369
386
|
if (!fallbackRewrite) continue;
|
|
370
387
|
if (isExternalUrl(fallbackRewrite)) return {
|
|
371
388
|
type: "response",
|
|
@@ -374,6 +391,7 @@ async function runPagesRequest(request, deps) {
|
|
|
374
391
|
resolvedUrl = mergeRewriteQuery(resolvedUrl, fallbackRewrite);
|
|
375
392
|
resolvedPathname = pathnameForResolvedUrl(resolvedUrl);
|
|
376
393
|
resolvedPathnameIsRequestPathname = false;
|
|
394
|
+
resolvedPathnameHasBasePath = !basePath || rewrite.basePath !== false;
|
|
377
395
|
configRewriteFired = true;
|
|
378
396
|
const fallbackFilesystemResult = await serveFilesystemRoute(resolvedPathname, "fallback");
|
|
379
397
|
if (fallbackFilesystemResult) return fallbackFilesystemResult;
|
|
@@ -417,7 +435,7 @@ async function runPagesRequest(request, deps) {
|
|
|
417
435
|
}
|
|
418
436
|
let devPageMatch = isOutsideBasePathUnclaimed() ? null : resolvedPathnameChanged ? deps.matchPageRoute ? deps.matchPageRoute(resolvedPathname, request) : null : pageMatch;
|
|
419
437
|
if (!devPageMatch && configRewrites.fallback?.length) for (const rewrite of configRewrites.fallback) {
|
|
420
|
-
const fallbackRewrite = matchRewrite(configSourcePathname(), [rewrite], rewriteRequestContext(),
|
|
438
|
+
const fallbackRewrite = matchRewrite(configSourcePathname(), [rewrite], rewriteRequestContext(), currentBasePathState(), configSourcePathname(), conditionalRewriteCacheability);
|
|
421
439
|
if (!fallbackRewrite) continue;
|
|
422
440
|
if (isExternalUrl(fallbackRewrite)) return {
|
|
423
441
|
type: "response",
|
|
@@ -426,6 +444,7 @@ async function runPagesRequest(request, deps) {
|
|
|
426
444
|
resolvedUrl = mergeRewriteQuery(resolvedUrl, fallbackRewrite);
|
|
427
445
|
resolvedPathname = pathnameForResolvedUrl(resolvedUrl);
|
|
428
446
|
resolvedPathnameIsRequestPathname = false;
|
|
447
|
+
resolvedPathnameHasBasePath = !basePath || rewrite.basePath !== false;
|
|
429
448
|
configRewriteFired = true;
|
|
430
449
|
const fallbackFilesystemResult = await serveFilesystemRoute(resolvedPathname, "fallback");
|
|
431
450
|
if (fallbackFilesystemResult) return fallbackFilesystemResult;
|
|
@@ -16,6 +16,12 @@ export type PagesWorkerExecutionContext = {
|
|
|
16
16
|
export type PagesLocalResponseStage = (request: Request, env: PagesWorkerEnv | undefined, ctx: ExecutionContextLike, props: WorkerResponseStageProps) => Promise<Response>;
|
|
17
17
|
export declare const pagesRequestStageBuildId: string | null;
|
|
18
18
|
export declare const pagesRequestStagePrerenderSecret: string | null;
|
|
19
|
+
/**
|
|
20
|
+
* Whether the request stage serves this request as a client build file
|
|
21
|
+
* outside `_next/static`. Such responses resolve no route, so the Worker
|
|
22
|
+
* keeps their ASSETS cache policy out of route cacheability admission.
|
|
23
|
+
*/
|
|
24
|
+
export declare function isPagesClientBuildFileRequest(request: Request, env: PagesWorkerEnv | undefined, ctx: PagesWorkerExecutionContext | undefined): boolean;
|
|
19
25
|
/** Run the request-time stage with a host-owned response dispatcher. */
|
|
20
26
|
export declare function handleRequestStage(request: Request, env: PagesWorkerEnv | undefined, ctx: PagesWorkerExecutionContext | undefined, dispatchResponseStage: DispatchWorkerResponseStage): Promise<Response>;
|
|
21
27
|
/** Preserve the direct single-entry Worker path without retaining it in request-only builds. */
|