vinext 0.1.8 → 0.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 +51 -30
- package/dist/build/css-url-assets.d.ts +3 -1
- package/dist/build/css-url-assets.js +18 -1
- package/dist/build/inject-pregenerated-paths.d.ts +7 -0
- package/dist/build/inject-pregenerated-paths.js +21 -0
- package/dist/build/layout-classification.js +1 -1
- package/dist/build/nitro-route-rules.js +1 -1
- package/dist/build/pages-client-assets-module.d.ts +11 -0
- package/dist/build/pages-client-assets-module.js +27 -0
- package/dist/build/prerender-server-entry.d.ts +1 -0
- package/dist/build/prerender-server-entry.js +49 -0
- package/dist/build/prerender-server-pool.d.ts +44 -0
- package/dist/build/prerender-server-pool.js +194 -0
- package/dist/build/prerender.d.ts +2 -1
- package/dist/build/prerender.js +98 -27
- package/dist/build/report.d.ts +13 -2
- package/dist/build/report.js +99 -2
- package/dist/build/run-prerender.d.ts +7 -0
- package/dist/build/run-prerender.js +12 -2
- package/dist/build/standalone.js +2 -0
- package/dist/cache/cache-adapters-virtual.js +3 -3
- package/dist/check.d.ts +4 -6
- package/dist/check.js +48 -11
- package/dist/cli-args.d.ts +1 -2
- package/dist/cli-args.js +1 -1
- package/dist/cli-dev-config.d.ts +12 -0
- package/dist/cli-dev-config.js +23 -0
- package/dist/cli.js +112 -96
- package/dist/{server → client}/dev-error-overlay-store.d.ts +1 -1
- package/dist/{server → client}/dev-error-overlay-store.js +1 -1
- package/dist/{server → client}/dev-error-overlay.d.ts +1 -1
- package/dist/{server → client}/dev-error-overlay.js +2 -2
- package/dist/client/navigation-runtime.d.ts +2 -0
- package/dist/client/navigation-runtime.js +3 -1
- package/dist/client/vinext-next-data.d.ts +4 -1
- package/dist/client/window-next.d.ts +2 -1
- package/dist/cloudflare/index.d.ts +2 -2
- package/dist/cloudflare/index.js +2 -2
- package/dist/config/config-matchers.js +45 -19
- package/dist/config/next-config.d.ts +41 -9
- package/dist/config/next-config.js +60 -3
- package/dist/config/prerender.d.ts +34 -0
- package/dist/config/prerender.js +55 -0
- package/dist/entries/app-browser-entry.js +5 -1
- package/dist/entries/app-rsc-entry.d.ts +5 -3
- package/dist/entries/app-rsc-entry.js +44 -10
- package/dist/entries/app-rsc-manifest.js +2 -0
- package/dist/entries/pages-client-entry.d.ts +3 -0
- package/dist/entries/pages-client-entry.js +28 -3
- package/dist/entries/pages-server-entry.js +23 -6
- package/dist/image/image-adapters-virtual.d.ts +59 -0
- package/dist/image/image-adapters-virtual.js +59 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +482 -120
- package/dist/init-cloudflare.d.ts +43 -0
- package/dist/init-cloudflare.js +839 -0
- package/dist/init-platform.d.ts +40 -0
- package/dist/init-platform.js +195 -0
- package/dist/init.d.ts +16 -38
- package/dist/init.js +209 -99
- package/dist/node_modules/.pnpm/am-i-vibing@0.5.0/node_modules/am-i-vibing/dist/detector-1yx2Hoe0.js +294 -0
- package/dist/node_modules/.pnpm/process-ancestry@0.1.0/node_modules/process-ancestry/dist/index.js +94 -0
- package/dist/{cloudflare → packages/cloudflare}/src/cache/cdn-adapter.runtime.js +1 -1
- package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.d.ts +2 -2
- package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.js +9 -2
- package/dist/packages/cloudflare/src/deploy-config.js +150 -0
- package/dist/packages/cloudflare/src/deploy-help.js +55 -0
- package/dist/packages/cloudflare/src/deploy.js +272 -0
- package/dist/{cloudflare → packages/cloudflare/src}/tpr.d.ts +4 -41
- package/dist/{cloudflare → packages/cloudflare/src}/tpr.js +44 -20
- package/dist/plugins/ast-scope.d.ts +16 -0
- package/dist/plugins/ast-scope.js +62 -0
- package/dist/plugins/ast-utils.d.ts +27 -1
- package/dist/plugins/ast-utils.js +32 -1
- package/dist/plugins/css-module-imports.d.ts +14 -0
- package/dist/plugins/css-module-imports.js +59 -0
- package/dist/plugins/extensionless-dynamic-import.js +2 -2
- package/dist/plugins/fonts.js +1 -1
- package/dist/plugins/ignore-dynamic-requests.d.ts +11 -0
- package/dist/plugins/ignore-dynamic-requests.js +530 -0
- package/dist/plugins/og-assets.js +2 -1
- package/dist/plugins/optimize-imports.js +1 -1
- package/dist/plugins/rsc-reference-validation-normalizer.d.ts +12 -0
- package/dist/plugins/rsc-reference-validation-normalizer.js +48 -0
- package/dist/plugins/sass.d.ts +17 -1
- package/dist/plugins/sass.js +74 -1
- package/dist/plugins/styled-jsx.d.ts +16 -0
- package/dist/plugins/styled-jsx.js +149 -0
- package/dist/plugins/typeof-window.d.ts +1 -1
- package/dist/plugins/typeof-window.js +28 -56
- package/dist/routing/app-route-graph.d.ts +23 -2
- package/dist/routing/app-route-graph.js +138 -38
- package/dist/routing/file-matcher.d.ts +11 -1
- package/dist/routing/file-matcher.js +18 -3
- package/dist/routing/pages-router.js +2 -2
- package/dist/server/api-handler.js +9 -14
- package/dist/server/app-browser-action-result.d.ts +4 -1
- package/dist/server/app-browser-action-result.js +8 -1
- package/dist/server/app-browser-entry.js +198 -57
- package/dist/server/app-browser-interception-context.d.ts +1 -0
- package/dist/server/app-browser-interception-context.js +4 -2
- package/dist/server/app-browser-navigation-controller.d.ts +2 -0
- package/dist/server/app-browser-navigation-controller.js +60 -31
- package/dist/server/app-browser-server-action-client.d.ts +1 -1
- package/dist/server/app-browser-server-action-client.js +8 -7
- package/dist/server/app-browser-state.d.ts +12 -1
- package/dist/server/app-browser-state.js +25 -8
- package/dist/server/app-browser-visible-commit.d.ts +6 -1
- package/dist/server/app-browser-visible-commit.js +42 -24
- package/dist/server/app-elements-wire.d.ts +9 -2
- package/dist/server/app-elements-wire.js +8 -1
- package/dist/server/app-elements.d.ts +2 -2
- package/dist/server/app-elements.js +4 -3
- package/dist/server/app-fallback-renderer.d.ts +2 -1
- package/dist/server/app-fallback-renderer.js +10 -6
- package/dist/server/app-hydration-cache-publication.d.ts +11 -0
- package/dist/server/app-hydration-cache-publication.js +43 -0
- package/dist/server/app-middleware.d.ts +4 -3
- package/dist/server/app-middleware.js +8 -3
- package/dist/server/app-optimistic-routing.js +11 -4
- package/dist/server/app-page-boundary.js +2 -1
- package/dist/server/app-page-cache-finalizer.d.ts +1 -0
- package/dist/server/app-page-cache-finalizer.js +5 -4
- package/dist/server/app-page-cache-render.d.ts +1 -0
- package/dist/server/app-page-cache-render.js +8 -4
- package/dist/server/app-page-cache.d.ts +1 -0
- package/dist/server/app-page-cache.js +27 -7
- package/dist/server/app-page-dispatch.d.ts +1 -0
- package/dist/server/app-page-dispatch.js +26 -8
- package/dist/server/app-page-element-builder.d.ts +2 -1
- package/dist/server/app-page-element-builder.js +59 -4
- package/dist/server/app-page-execution.js +2 -1
- package/dist/server/app-page-probe.js +5 -0
- package/dist/server/app-page-render-identity.d.ts +2 -0
- package/dist/server/app-page-render-identity.js +3 -2
- package/dist/server/app-page-render.d.ts +2 -0
- package/dist/server/app-page-render.js +85 -16
- package/dist/server/app-page-request.d.ts +14 -0
- package/dist/server/app-page-request.js +69 -4
- package/dist/server/app-page-response.d.ts +7 -0
- package/dist/server/app-page-response.js +16 -4
- package/dist/server/app-page-route-wiring.d.ts +8 -1
- package/dist/server/app-page-route-wiring.js +32 -18
- package/dist/server/app-page-segment-state.d.ts +2 -1
- package/dist/server/app-page-segment-state.js +3 -1
- package/dist/server/app-page-stream.d.ts +7 -1
- package/dist/server/app-page-stream.js +3 -1
- package/dist/server/app-route-handler-execution.js +5 -1
- package/dist/server/app-route-handler-response.js +1 -0
- package/dist/server/app-route-handler-runtime.js +1 -1
- package/dist/server/app-route-tree-prefetch.d.ts +43 -0
- package/dist/server/app-route-tree-prefetch.js +187 -0
- package/dist/server/app-router-entry.js +9 -2
- package/dist/server/app-rsc-cache-busting.d.ts +2 -1
- package/dist/server/app-rsc-cache-busting.js +9 -4
- package/dist/server/app-rsc-handler.d.ts +7 -0
- package/dist/server/app-rsc-handler.js +148 -39
- package/dist/server/app-rsc-render-mode.d.ts +3 -2
- package/dist/server/app-rsc-render-mode.js +4 -1
- package/dist/server/app-rsc-request-normalization.d.ts +6 -6
- package/dist/server/app-rsc-request-normalization.js +10 -8
- package/dist/server/app-segment-config.d.ts +11 -0
- package/dist/server/app-segment-config.js +62 -6
- package/dist/server/app-server-action-execution.d.ts +1 -0
- package/dist/server/app-server-action-execution.js +61 -30
- package/dist/server/app-ssr-entry.d.ts +3 -0
- package/dist/server/app-ssr-entry.js +13 -5
- package/dist/server/app-ssr-stream.d.ts +7 -3
- package/dist/server/app-ssr-stream.js +10 -6
- package/dist/server/app-visited-response-cache.d.ts +6 -0
- package/dist/server/app-visited-response-cache.js +3 -1
- package/dist/server/cache-control.d.ts +3 -1
- package/dist/server/cache-control.js +13 -1
- package/dist/server/client-trace-metadata.js +26 -0
- package/dist/server/default-global-not-found-module.d.ts +14 -0
- package/dist/server/default-global-not-found-module.js +14 -0
- package/dist/server/dev-route-files.js +4 -0
- package/dist/server/dev-server.d.ts +11 -1
- package/dist/server/dev-server.js +94 -35
- package/dist/server/dev-stack-sourcemap.d.ts +1 -1
- package/dist/server/dev-stack-sourcemap.js +1 -1
- package/dist/server/fetch-handler.d.ts +2 -0
- package/dist/server/fetch-handler.js +18 -0
- package/dist/server/headers.d.ts +7 -15
- package/dist/server/headers.js +11 -18
- package/dist/server/image-optimization.d.ts +51 -1
- package/dist/server/image-optimization.js +52 -2
- package/dist/server/implicit-tags.js +1 -1
- package/dist/server/isr-cache.d.ts +3 -2
- package/dist/server/isr-cache.js +9 -5
- package/dist/server/metadata-routes.d.ts +3 -1
- package/dist/server/metadata-routes.js +12 -2
- package/dist/server/middleware-runtime.js +6 -1
- package/dist/server/navigation-planner.d.ts +1 -0
- package/dist/server/navigation-planner.js +14 -3
- package/dist/server/pages-api-route.js +2 -2
- package/dist/server/pages-asset-tags.d.ts +4 -6
- package/dist/server/pages-asset-tags.js +12 -12
- package/dist/server/pages-client-assets.d.ts +12 -0
- package/dist/server/pages-client-assets.js +10 -0
- package/dist/server/pages-data-route.d.ts +4 -2
- package/dist/server/pages-data-route.js +18 -4
- package/dist/server/pages-dev-module-url.d.ts +2 -1
- package/dist/server/pages-dev-module-url.js +6 -3
- package/dist/server/pages-node-compat.d.ts +19 -1
- package/dist/server/pages-node-compat.js +81 -4
- package/dist/server/pages-page-data.d.ts +33 -1
- package/dist/server/pages-page-data.js +62 -33
- package/dist/server/pages-page-handler.d.ts +2 -1
- package/dist/server/pages-page-handler.js +38 -19
- package/dist/server/pages-page-response.d.ts +8 -0
- package/dist/server/pages-page-response.js +7 -3
- package/dist/server/pages-request-pipeline.d.ts +9 -5
- package/dist/server/pages-request-pipeline.js +55 -7
- package/dist/server/pages-router-entry.d.ts +30 -0
- package/dist/server/pages-router-entry.js +108 -0
- package/dist/server/prerender-manifest.d.ts +3 -1
- package/dist/server/prerender-route-params.js +1 -1
- package/dist/server/prod-server.d.ts +5 -3
- package/dist/server/prod-server.js +68 -39
- package/dist/server/request-pipeline.js +2 -1
- package/dist/server/seed-cache.js +4 -4
- package/dist/shims/app-router-scroll-state.d.ts +1 -0
- package/dist/shims/app-router-scroll-state.js +1 -0
- package/dist/shims/app-router-scroll.js +2 -1
- package/dist/shims/cache-handler.js +8 -1
- package/dist/shims/cache.js +22 -15
- package/dist/shims/cdn-cache.js +1 -1
- package/dist/shims/dynamic-preload-chunks.js +2 -1
- package/dist/shims/fetch-cache.d.ts +3 -1
- package/dist/shims/fetch-cache.js +77 -52
- package/dist/shims/form.d.ts +4 -2
- package/dist/shims/form.js +37 -43
- package/dist/shims/headers.d.ts +7 -1
- package/dist/shims/headers.js +17 -3
- package/dist/shims/image.js +75 -14
- package/dist/shims/internal/app-prefetch-fetch-queue.d.ts +10 -0
- package/dist/shims/internal/app-prefetch-fetch-queue.js +61 -0
- package/dist/shims/internal/app-route-detection.d.ts +2 -17
- package/dist/shims/internal/app-route-detection.js +4 -17
- package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +23 -0
- package/dist/shims/internal/hybrid-client-route-owner-direct.js +51 -0
- package/dist/shims/internal/hybrid-client-route-owner.d.ts +3 -15
- package/dist/shims/internal/hybrid-client-route-owner.js +40 -58
- package/dist/shims/internal/pages-data-fetch-dedup.d.ts +10 -5
- package/dist/shims/internal/pages-data-fetch-dedup.js +84 -14
- package/dist/shims/internal/pages-data-target.d.ts +18 -12
- package/dist/shims/internal/pages-data-target.js +97 -13
- package/dist/shims/internal/pages-router-components.d.ts +7 -0
- package/dist/shims/internal/pages-router-components.js +13 -0
- package/dist/shims/layout-segment-context.d.ts +4 -1
- package/dist/shims/layout-segment-context.js +18 -4
- package/dist/shims/link.d.ts +1 -1
- package/dist/shims/link.js +224 -58
- package/dist/shims/navigation.d.ts +19 -3
- package/dist/shims/navigation.js +245 -47
- package/dist/shims/request-context.js +18 -0
- package/dist/shims/root-params.d.ts +15 -1
- package/dist/shims/root-params.js +21 -1
- package/dist/shims/router.d.ts +5 -7
- package/dist/shims/router.js +387 -102
- package/dist/shims/server.js +3 -2
- package/dist/shims/slot.js +3 -6
- package/dist/shims/unified-request-context.js +1 -0
- package/dist/typegen.js +1 -1
- package/dist/utils/client-runtime-metadata.d.ts +2 -18
- package/dist/utils/client-runtime-metadata.js +31 -22
- package/dist/utils/dev-stack-sourcemap-endpoint.d.ts +4 -0
- package/dist/{server → utils}/dev-stack-sourcemap-endpoint.js +1 -1
- package/dist/utils/domain-locale.d.ts +6 -3
- package/dist/{server → utils}/middleware-request-headers.d.ts +1 -1
- package/dist/{server → utils}/middleware-request-headers.js +3 -3
- package/dist/utils/project.d.ts +48 -2
- package/dist/utils/project.js +225 -4
- package/dist/utils/protocol-headers.d.ts +23 -0
- package/dist/utils/protocol-headers.js +23 -0
- package/dist/utils/react-version.d.ts +4 -0
- package/dist/utils/react-version.js +44 -0
- package/dist/utils/vite-version.d.ts +2 -0
- package/dist/utils/vite-version.js +11 -1
- package/package.json +47 -2
- package/dist/deploy.d.ts +0 -197
- package/dist/deploy.js +0 -1040
- package/dist/server/dev-stack-sourcemap-endpoint.d.ts +0 -4
- /package/dist/{cloudflare → packages/cloudflare}/src/utils/cache-control-metadata.js +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { createRequestContext, runWithRequestContext } from "../shims/unified-request-context.js";
|
|
2
2
|
import { addBasePathToPathname, hasBasePath, stripBasePath } from "../utils/base-path.js";
|
|
3
3
|
import { getRequestExecutionContext } from "../shims/request-context.js";
|
|
4
|
-
import {
|
|
4
|
+
import { VINEXT_MW_CTX_HEADER, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SPECULATIVE_HEADER } from "../utils/protocol-headers.js";
|
|
5
|
+
import { ACTION_REVALIDATED_HEADER } from "./headers.js";
|
|
5
6
|
import { isExternalUrl, matchRedirect, matchRewrite, preserveRedirectDestinationQuery, proxyExternalRequest, requestContextFromRequest, sanitizeDestination } from "../config/config-matchers.js";
|
|
6
7
|
import { notFoundResponse } from "./http-error-responses.js";
|
|
7
8
|
import { applyConfigHeadersToResponse, cloneRequestWithHeaders, cloneRequestWithUrl, filterInternalHeaders, normalizeTrailingSlash, resolvePublicFileRoute } from "./request-pipeline.js";
|
|
@@ -10,18 +11,20 @@ import { ensureFetchPatch, setCurrentFetchSoftTags } from "../shims/fetch-cache.
|
|
|
10
11
|
import { mergeRewriteQuery } from "../utils/query.js";
|
|
11
12
|
import { getScriptNonceFromHeaderSources } from "./csp.js";
|
|
12
13
|
import { normalizeDefaultLocalePathname } from "./pages-i18n.js";
|
|
14
|
+
import { buildNextDataNotFoundResponse, normalizePagesDataRequest } from "./pages-data-route.js";
|
|
13
15
|
import { DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES, isImageOptimizationPath, resolveDevImageRedirect } from "./image-optimization.js";
|
|
14
16
|
import { VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM, createRscRedirectLocation, hasRscCacheBustingSearchParam, resolveInvalidRscCacheBustingRequest, stripRscCacheBustingSearchParam, stripRscSuffix } from "./app-rsc-cache-busting.js";
|
|
15
17
|
import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
|
|
16
18
|
import "./app-page-response.js";
|
|
17
|
-
import {
|
|
19
|
+
import { parseNextHttpErrorDigest } from "./next-error-digest.js";
|
|
18
20
|
import { matchPrerenderRouteParamsPayload, readTrustedPrerenderRouteParams, serializePrerenderRouteParamsHeader } from "./prerender-route-params.js";
|
|
19
21
|
import { getRenderedConcreteUrlPathsForRoute } from "./pregenerated-concrete-paths.js";
|
|
20
22
|
import { pickRootParams, setRootParams } from "../shims/root-params.js";
|
|
21
|
-
import { flattenErrorCauses } from "../utils/error-cause.js";
|
|
22
23
|
import { createServerActionNotFoundResponse, getServerActionNotFoundMessage } from "./server-action-not-found.js";
|
|
23
24
|
import { buildPageCacheTags } from "./implicit-tags.js";
|
|
24
25
|
import { buildPostMwRequestContext } from "./app-post-middleware-context.js";
|
|
26
|
+
import { createRouteTreePrefetchResponse, isRouteTreePrefetchRequest } from "./app-route-tree-prefetch.js";
|
|
27
|
+
import { flattenErrorCauses } from "../utils/error-cause.js";
|
|
25
28
|
import { finalizeAppRscResponse } from "./app-rsc-response-finalizer.js";
|
|
26
29
|
import { normalizeRscRequest } from "./app-rsc-request-normalization.js";
|
|
27
30
|
import { runWithPrerenderWorkUnit } from "./prerender-work-unit-setup.js";
|
|
@@ -53,8 +56,8 @@ function createMissingServerActionResponse(options, actionId) {
|
|
|
53
56
|
options.clearRequestContext();
|
|
54
57
|
return createServerActionNotFoundResponse();
|
|
55
58
|
}
|
|
56
|
-
function redirectDestinationWithBasePath(destination, basePath) {
|
|
57
|
-
if (!basePath || isExternalUrl(destination) || hasBasePath(destination, basePath)) return destination;
|
|
59
|
+
function redirectDestinationWithBasePath(destination, basePath, hadBasePath) {
|
|
60
|
+
if (!basePath || !hadBasePath || isExternalUrl(destination) || hasBasePath(destination, basePath)) return destination;
|
|
58
61
|
return basePath + destination;
|
|
59
62
|
}
|
|
60
63
|
async function applyRewrite(options, cleanPathname) {
|
|
@@ -111,15 +114,22 @@ function requestWithoutRscSuffix(request) {
|
|
|
111
114
|
url.pathname = pathname;
|
|
112
115
|
return cloneRequestWithUrl(request.body ? request.clone() : request, url.toString());
|
|
113
116
|
}
|
|
114
|
-
async function handleAppRscRequest(options, request, preMiddlewareRequestContext, isDataRequest, pagesDataRequest) {
|
|
117
|
+
async function handleAppRscRequest(options, request, preMiddlewareRequestContext, isDataRequest, isMiddlewareDataRequest, pagesDataRequest) {
|
|
115
118
|
const handlerStart = process.env.NODE_ENV !== "production" ? performance.now() : 0;
|
|
116
119
|
if (process.env.NODE_ENV !== "production") {
|
|
117
120
|
const originBlock = options.validateDevRequestOrigin?.(request);
|
|
118
121
|
if (originBlock) return originBlock;
|
|
119
122
|
}
|
|
120
|
-
const
|
|
123
|
+
const canHandleOutsideBasePath = Boolean(options.runMiddleware) || [
|
|
124
|
+
...options.configRedirects,
|
|
125
|
+
...options.configRewrites.beforeFiles,
|
|
126
|
+
...options.configRewrites.afterFiles,
|
|
127
|
+
...options.configRewrites.fallback,
|
|
128
|
+
...options.configHeaders
|
|
129
|
+
].some((rule) => rule.basePath === false);
|
|
130
|
+
const normalized = normalizeRscRequest(request, options.basePath, canHandleOutsideBasePath);
|
|
121
131
|
if (normalized instanceof Response) return normalized;
|
|
122
|
-
const { url, isRscRequest, interceptionContextHeader, mountedSlotsHeader, renderMode, clientReuseManifest } = normalized;
|
|
132
|
+
const { url, isRscRequest, interceptionContextHeader, mountedSlotsHeader, renderMode, clientReuseManifest, hadBasePath } = normalized;
|
|
123
133
|
let { pathname, cleanPathname } = normalized;
|
|
124
134
|
let resolvedUrl = cleanPathname + url.search;
|
|
125
135
|
const originalResolvedUrl = resolvedUrl;
|
|
@@ -127,7 +137,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
127
137
|
const canonicalPathname = cleanPathname;
|
|
128
138
|
const basePathState = {
|
|
129
139
|
basePath: options.basePath,
|
|
130
|
-
hadBasePath
|
|
140
|
+
hadBasePath
|
|
131
141
|
};
|
|
132
142
|
if (pathname === "/__vinext/prerender/static-params" || pathname === "/__vinext/prerender/pages-static-paths") {
|
|
133
143
|
const { handleAppPrerenderEndpoint } = await import("./app-prerender-endpoints.js");
|
|
@@ -142,26 +152,22 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
142
152
|
});
|
|
143
153
|
if (prerenderEndpointResponse) return prerenderEndpointResponse;
|
|
144
154
|
}
|
|
145
|
-
const trailingSlashRedirect = normalizeTrailingSlash(pathname, options.basePath, options.trailingSlash, url.search);
|
|
155
|
+
const trailingSlashRedirect = normalizeTrailingSlash(pathname, hadBasePath ? options.basePath : "", options.trailingSlash, url.search);
|
|
146
156
|
if (trailingSlashRedirect) return trailingSlashRedirect;
|
|
147
157
|
const matchPathname = (p) => normalizeDefaultLocalePathname(p, options.i18nConfig, { hostname: url.hostname });
|
|
148
158
|
const redirect = matchRedirect(matchPathname(stripRscSuffix(pathname)), options.configRedirects, preMiddlewareRequestContext, basePathState);
|
|
149
159
|
if (redirect) {
|
|
150
|
-
const destination = sanitizeDestination(redirectDestinationWithBasePath(redirect.destination, options.basePath));
|
|
160
|
+
const destination = sanitizeDestination(redirectDestinationWithBasePath(redirect.destination, options.basePath, hadBasePath));
|
|
151
161
|
const location = isRscRequest && request.headers.get("RSC") === "1" ? await createRscRedirectLocation(destination, request) : preserveRedirectDestinationQuery(destination, url.search);
|
|
152
|
-
if (isDataRequest) return new Response(null, {
|
|
153
|
-
status: 200,
|
|
154
|
-
headers: { "x-nextjs-redirect": location }
|
|
155
|
-
});
|
|
156
162
|
return new Response(null, {
|
|
157
163
|
status: redirect.permanent ? 308 : 307,
|
|
158
164
|
headers: { Location: location }
|
|
159
165
|
});
|
|
160
166
|
}
|
|
161
|
-
const rscCacheBustingRedirect = await resolveInvalidRscCacheBustingRequest({
|
|
167
|
+
const rscCacheBustingRedirect = hadBasePath ? await resolveInvalidRscCacheBustingRequest({
|
|
162
168
|
isRscRequest,
|
|
163
169
|
request
|
|
164
|
-
});
|
|
170
|
+
}) : null;
|
|
165
171
|
if (rscCacheBustingRedirect) return rscCacheBustingRedirect;
|
|
166
172
|
const normalizedUserlandRequest = requestWithoutRscSuffix(request);
|
|
167
173
|
const userlandRequest = requestWithoutRscCacheBustingSearchParam(normalizedUserlandRequest);
|
|
@@ -171,11 +177,13 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
171
177
|
status: null
|
|
172
178
|
};
|
|
173
179
|
let didMiddlewareRewrite = false;
|
|
180
|
+
let didMiddlewareRewritePathname = false;
|
|
174
181
|
if (options.runMiddleware) {
|
|
175
182
|
const middlewareResult = await options.runMiddleware({
|
|
176
183
|
cleanPathname,
|
|
177
184
|
context: middlewareContext,
|
|
178
|
-
|
|
185
|
+
hadBasePath,
|
|
186
|
+
isDataRequest: isMiddlewareDataRequest,
|
|
179
187
|
request: userlandRequest
|
|
180
188
|
});
|
|
181
189
|
if (middlewareResult.kind === "response") return applyConfigHeadersToMiddlewareRedirect(middlewareResult.response, {
|
|
@@ -185,12 +193,21 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
185
193
|
requestContext: preMiddlewareRequestContext
|
|
186
194
|
});
|
|
187
195
|
cleanPathname = middlewareResult.cleanPathname;
|
|
188
|
-
didMiddlewareRewrite =
|
|
196
|
+
didMiddlewareRewrite = middlewareResult.rewritten;
|
|
197
|
+
didMiddlewareRewritePathname = cleanPathname !== normalized.cleanPathname;
|
|
189
198
|
if (middlewareResult.search !== null) url.search = middlewareResult.search;
|
|
190
199
|
resolvedUrl = cleanPathname + url.search;
|
|
191
200
|
}
|
|
192
201
|
const scriptNonce = getScriptNonceFromHeaderSources(request.headers, middlewareContext.headers);
|
|
193
202
|
const postMiddlewareRequestContext = buildPostMwRequestContext(userlandRequest);
|
|
203
|
+
let filesystemRouteEligible = hadBasePath || didMiddlewareRewrite;
|
|
204
|
+
const validateClaimedOutsideBasePathRsc = async () => {
|
|
205
|
+
if (hadBasePath || !filesystemRouteEligible) return null;
|
|
206
|
+
return resolveInvalidRscCacheBustingRequest({
|
|
207
|
+
isRscRequest,
|
|
208
|
+
request
|
|
209
|
+
});
|
|
210
|
+
};
|
|
194
211
|
for (const rewrite of options.configRewrites.beforeFiles) {
|
|
195
212
|
const beforeFilesRewrite = await applyRewrite({
|
|
196
213
|
basePathState,
|
|
@@ -203,14 +220,60 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
203
220
|
if (beforeFilesRewrite) {
|
|
204
221
|
resolvedUrl = mergeRewriteQuery(resolvedUrl, beforeFilesRewrite);
|
|
205
222
|
cleanPathname = pathnameForResolvedUrl(resolvedUrl);
|
|
223
|
+
filesystemRouteEligible = true;
|
|
206
224
|
}
|
|
207
225
|
}
|
|
208
|
-
|
|
226
|
+
const claimedRscCacheBustingRedirect = await validateClaimedOutsideBasePathRsc();
|
|
227
|
+
if (claimedRscCacheBustingRedirect) return claimedRscCacheBustingRedirect;
|
|
228
|
+
const actionId = request.headers.get("x-rsc-action") ?? request.headers.get("next-action");
|
|
229
|
+
const isPostRequest = request.method.toUpperCase() === "POST";
|
|
230
|
+
const contentType = request.headers.get("content-type") || "";
|
|
231
|
+
const isProgressiveActionRequest = isPostRequest && !actionId && contentType.startsWith("multipart/form-data");
|
|
232
|
+
let resolvedLateRewritesForAction = false;
|
|
233
|
+
if (!filesystemRouteEligible && (actionId || isProgressiveActionRequest)) {
|
|
234
|
+
let actionMatch = null;
|
|
235
|
+
for (const rewrite of options.configRewrites.afterFiles) {
|
|
236
|
+
const rewritten = await applyRewrite({
|
|
237
|
+
basePathState,
|
|
238
|
+
clearRequestContext: options.clearRequestContext,
|
|
239
|
+
request: normalizedUserlandRequest,
|
|
240
|
+
requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
|
|
241
|
+
rewrites: [rewrite]
|
|
242
|
+
}, matchPathname(cleanPathname));
|
|
243
|
+
if (rewritten instanceof Response) return rewritten;
|
|
244
|
+
if (!rewritten) continue;
|
|
245
|
+
resolvedUrl = mergeRewriteQuery(resolvedUrl, rewritten);
|
|
246
|
+
cleanPathname = pathnameForResolvedUrl(resolvedUrl);
|
|
247
|
+
filesystemRouteEligible = true;
|
|
248
|
+
actionMatch = options.matchRoute(cleanPathname);
|
|
249
|
+
if (actionMatch) break;
|
|
250
|
+
}
|
|
251
|
+
if (!actionMatch) for (const rewrite of options.configRewrites.fallback) {
|
|
252
|
+
const rewritten = await applyRewrite({
|
|
253
|
+
basePathState,
|
|
254
|
+
clearRequestContext: options.clearRequestContext,
|
|
255
|
+
request: normalizedUserlandRequest,
|
|
256
|
+
requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
|
|
257
|
+
rewrites: [rewrite]
|
|
258
|
+
}, matchPathname(cleanPathname));
|
|
259
|
+
if (rewritten instanceof Response) return rewritten;
|
|
260
|
+
if (!rewritten) continue;
|
|
261
|
+
resolvedUrl = mergeRewriteQuery(resolvedUrl, rewritten);
|
|
262
|
+
cleanPathname = pathnameForResolvedUrl(resolvedUrl);
|
|
263
|
+
filesystemRouteEligible = true;
|
|
264
|
+
actionMatch = options.matchRoute(cleanPathname);
|
|
265
|
+
if (actionMatch) break;
|
|
266
|
+
}
|
|
267
|
+
resolvedLateRewritesForAction = filesystemRouteEligible;
|
|
268
|
+
}
|
|
269
|
+
const lateActionRscCacheBustingRedirect = await validateClaimedOutsideBasePathRsc();
|
|
270
|
+
if (lateActionRscCacheBustingRedirect) return lateActionRscCacheBustingRedirect;
|
|
271
|
+
if (filesystemRouteEligible && isImageOptimizationPath(cleanPathname)) {
|
|
209
272
|
const imageRedirect = resolveDevImageRedirect(url, [...options.imageConfig?.deviceSizes ?? DEFAULT_DEVICE_SIZES, ...options.imageConfig?.imageSizes ?? DEFAULT_IMAGE_SIZES], options.imageConfig?.qualities, { isDev: options.isDev });
|
|
210
273
|
if (!imageRedirect) return new Response("Invalid image optimization parameters", { status: 400 });
|
|
211
274
|
return Response.redirect(new URL(imageRedirect, url.origin).href, 302);
|
|
212
275
|
}
|
|
213
|
-
if (options.handleMetadataRouteRequest) {
|
|
276
|
+
if (filesystemRouteEligible && options.handleMetadataRouteRequest) {
|
|
214
277
|
const metadataRouteResponse = await options.handleMetadataRouteRequest(cleanPathname);
|
|
215
278
|
if (metadataRouteResponse) {
|
|
216
279
|
applyConfigHeadersToResponse(metadataRouteResponse.headers, {
|
|
@@ -223,13 +286,13 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
223
286
|
return applyMiddlewareContextToResponse(metadataRouteResponse, middlewareContext);
|
|
224
287
|
}
|
|
225
288
|
}
|
|
226
|
-
const publicFileResponse = resolvePublicFileRoute({
|
|
289
|
+
const publicFileResponse = filesystemRouteEligible ? resolvePublicFileRoute({
|
|
227
290
|
cleanPathname,
|
|
228
291
|
middlewareContext,
|
|
229
292
|
pathname,
|
|
230
293
|
publicFiles: options.publicFiles,
|
|
231
294
|
request
|
|
232
|
-
});
|
|
295
|
+
}) : null;
|
|
233
296
|
if (publicFileResponse) {
|
|
234
297
|
options.clearRequestContext();
|
|
235
298
|
return publicFileResponse;
|
|
@@ -243,13 +306,22 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
243
306
|
searchParams: getResolvedSearchParams(),
|
|
244
307
|
params: {}
|
|
245
308
|
});
|
|
246
|
-
const preActionMatch = options.matchRoute(cleanPathname);
|
|
309
|
+
const preActionMatch = filesystemRouteEligible ? options.matchRoute(cleanPathname) : null;
|
|
247
310
|
if (preActionMatch) setRootParams(pickRootParams(preActionMatch.params, preActionMatch.route.rootParamNames));
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
311
|
+
if (pagesDataRequest && didMiddlewareRewritePathname && preActionMatch) {
|
|
312
|
+
const headers = new Headers();
|
|
313
|
+
mergeMiddlewareResponseHeaders(headers, middlewareContext.headers);
|
|
314
|
+
headers.set("content-type", "application/json");
|
|
315
|
+
headers.set("x-nextjs-rewrite", resolvedUrl);
|
|
316
|
+
options.clearRequestContext();
|
|
317
|
+
return new Response("{}", { headers });
|
|
318
|
+
}
|
|
319
|
+
if (!filesystemRouteEligible && isPostRequest && actionId) {
|
|
320
|
+
options.clearRequestContext();
|
|
321
|
+
return notFoundResponse();
|
|
322
|
+
}
|
|
251
323
|
let progressiveActionResult = null;
|
|
252
|
-
if (isPostRequest && contentType.startsWith("multipart/form-data") && !actionId) {
|
|
324
|
+
if (filesystemRouteEligible && isPostRequest && contentType.startsWith("multipart/form-data") && !actionId) {
|
|
253
325
|
if (options.handleProgressiveActionRequest) progressiveActionResult = await options.handleProgressiveActionRequest({
|
|
254
326
|
actionId,
|
|
255
327
|
cleanPathname,
|
|
@@ -266,7 +338,11 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
266
338
|
const failedProgressiveActionResult = progressiveActionFormState && "actionError" in progressiveActionFormState ? progressiveActionFormState : null;
|
|
267
339
|
const actionFailed = failedProgressiveActionResult !== null;
|
|
268
340
|
const actionError = failedProgressiveActionResult?.actionError;
|
|
269
|
-
const
|
|
341
|
+
const actionErrorDigest = actionError && typeof actionError === "object" && "digest" in actionError ? String(actionError.digest) : null;
|
|
342
|
+
const actionHttpFallbackStatus = actionErrorDigest ? parseNextHttpErrorDigest(actionErrorDigest)?.status ?? null : null;
|
|
343
|
+
const normalizedProgressiveActionError = actionHttpFallbackStatus === null || actionHttpFallbackStatus === 404 ? actionError : { digest: "NEXT_NOT_FOUND" };
|
|
344
|
+
if (actionFailed && middlewareContext.status === null && actionHttpFallbackStatus === null) middlewareContext.status = 500;
|
|
345
|
+
const serverActionResponse = filesystemRouteEligible && isPostRequest && actionId && options.handleServerActionRequest ? await options.handleServerActionRequest({
|
|
270
346
|
actionId,
|
|
271
347
|
cleanPathname,
|
|
272
348
|
contentType,
|
|
@@ -278,12 +354,13 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
278
354
|
searchParams: getResolvedSearchParams()
|
|
279
355
|
}) : null;
|
|
280
356
|
if (serverActionResponse) return serverActionResponse;
|
|
281
|
-
if (isPostRequest && actionId && !options.handleServerActionRequest) return createMissingServerActionResponse(options, actionId);
|
|
357
|
+
if (filesystemRouteEligible && isPostRequest && actionId && !options.handleServerActionRequest) return createMissingServerActionResponse(options, actionId);
|
|
282
358
|
let match = preActionMatch;
|
|
283
359
|
const renderPagesForMatchKind = async (matchKind) => {
|
|
360
|
+
if (!filesystemRouteEligible) return null;
|
|
284
361
|
const response = match === null || match.route.isDynamic ? await options.renderPagesFallback?.({
|
|
285
362
|
appRouteMatch: match ?? null,
|
|
286
|
-
allowRscDocumentFallback:
|
|
363
|
+
allowRscDocumentFallback: didMiddlewareRewritePathname,
|
|
287
364
|
isDataRequest,
|
|
288
365
|
isRscRequest,
|
|
289
366
|
matchKind,
|
|
@@ -307,7 +384,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
307
384
|
options.clearRequestContext();
|
|
308
385
|
return staticPagesFallbackResponse;
|
|
309
386
|
}
|
|
310
|
-
if (!match || match.route.isDynamic) for (const rewrite of options.configRewrites.afterFiles) {
|
|
387
|
+
if (!resolvedLateRewritesForAction && (!match || match.route.isDynamic)) for (const rewrite of options.configRewrites.afterFiles) {
|
|
311
388
|
const afterFilesRewrite = await applyRewrite({
|
|
312
389
|
basePathState,
|
|
313
390
|
clearRequestContext: options.clearRequestContext,
|
|
@@ -319,6 +396,9 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
319
396
|
if (!afterFilesRewrite) continue;
|
|
320
397
|
resolvedUrl = mergeRewriteQuery(resolvedUrl, afterFilesRewrite);
|
|
321
398
|
cleanPathname = pathnameForResolvedUrl(resolvedUrl);
|
|
399
|
+
filesystemRouteEligible = true;
|
|
400
|
+
const claimedRscCacheBustingRedirect = await validateClaimedOutsideBasePathRsc();
|
|
401
|
+
if (claimedRscCacheBustingRedirect) return claimedRscCacheBustingRedirect;
|
|
322
402
|
match = options.matchRoute(cleanPathname);
|
|
323
403
|
const rewrittenStaticPagesResponse = await renderPagesForMatchKind("static");
|
|
324
404
|
if (rewrittenStaticPagesResponse) {
|
|
@@ -337,7 +417,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
337
417
|
options.clearRequestContext();
|
|
338
418
|
return dynamicPagesFallbackResponse;
|
|
339
419
|
}
|
|
340
|
-
if (!match) for (const rewrite of options.configRewrites.fallback) {
|
|
420
|
+
if (!resolvedLateRewritesForAction && !match) for (const rewrite of options.configRewrites.fallback) {
|
|
341
421
|
const fallbackRewrite = await applyRewrite({
|
|
342
422
|
basePathState,
|
|
343
423
|
clearRequestContext: options.clearRequestContext,
|
|
@@ -349,6 +429,9 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
349
429
|
if (!fallbackRewrite) continue;
|
|
350
430
|
resolvedUrl = mergeRewriteQuery(resolvedUrl, fallbackRewrite);
|
|
351
431
|
cleanPathname = pathnameForResolvedUrl(resolvedUrl);
|
|
432
|
+
filesystemRouteEligible = true;
|
|
433
|
+
const claimedRscCacheBustingRedirect = await validateClaimedOutsideBasePathRsc();
|
|
434
|
+
if (claimedRscCacheBustingRedirect) return claimedRscCacheBustingRedirect;
|
|
352
435
|
match = options.matchRoute(cleanPathname);
|
|
353
436
|
const rewrittenStaticPagesResponse = await renderPagesForMatchKind("static");
|
|
354
437
|
if (rewrittenStaticPagesResponse) {
|
|
@@ -362,8 +445,24 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
362
445
|
}
|
|
363
446
|
if (match) break;
|
|
364
447
|
}
|
|
448
|
+
if (!filesystemRouteEligible) {
|
|
449
|
+
options.clearRequestContext();
|
|
450
|
+
const headers = new Headers();
|
|
451
|
+
mergeMiddlewareResponseHeaders(headers, middlewareContext.headers);
|
|
452
|
+
return notFoundResponse({ headers });
|
|
453
|
+
}
|
|
365
454
|
if (pagesDataRequest) {
|
|
366
455
|
options.clearRequestContext();
|
|
456
|
+
if (options.runMiddleware && (middlewareContext.status === null || middlewareContext.status === 200 || middlewareContext.status === 404)) {
|
|
457
|
+
const response = buildNextDataNotFoundResponse();
|
|
458
|
+
const headers = new Headers(response.headers);
|
|
459
|
+
headers.set("x-nextjs-matched-path", matchPathname(canonicalPathname));
|
|
460
|
+
if (resolvedUrl !== originalResolvedUrl) headers.set("x-nextjs-rewrite", resolvedUrl);
|
|
461
|
+
return new Response("{}", {
|
|
462
|
+
status: 200,
|
|
463
|
+
headers
|
|
464
|
+
});
|
|
465
|
+
}
|
|
367
466
|
return buildNextDataNotFoundResponse();
|
|
368
467
|
}
|
|
369
468
|
if (!match) {
|
|
@@ -386,11 +485,19 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
386
485
|
}
|
|
387
486
|
const { route, params } = match;
|
|
388
487
|
if (options.ensureRouteLoaded) await options.ensureRouteLoaded(route);
|
|
488
|
+
const resolvedSearchParams = getResolvedSearchParams();
|
|
489
|
+
if (isRouteTreePrefetchRequest(request) && !route.routeHandler) {
|
|
490
|
+
const response = await createRouteTreePrefetchResponse(route, {
|
|
491
|
+
buildId: options.buildId,
|
|
492
|
+
prefetchInlining: options.prefetchInlining
|
|
493
|
+
});
|
|
494
|
+
options.clearRequestContext();
|
|
495
|
+
return applyMiddlewareContextToResponse(response, middlewareContext);
|
|
496
|
+
}
|
|
389
497
|
const prerenderRouteParamsMatch = matchPrerenderRouteParamsPayload(readTrustedPrerenderRouteParams(request), route.pattern, params);
|
|
390
498
|
const prerenderRouteParams = prerenderRouteParamsMatch?.params ?? null;
|
|
391
499
|
const isPrerenderFallbackShell = prerenderRouteParamsMatch?.kind === "fallback-shell";
|
|
392
500
|
const renderParams = prerenderRouteParams ?? params;
|
|
393
|
-
const resolvedSearchParams = getResolvedSearchParams();
|
|
394
501
|
let runtimeFallbackShells = [];
|
|
395
502
|
if (options.createPprFallbackShells && request.method === "GET" && !isRscRequest && !isPrerenderFallbackShell && route.params) runtimeFallbackShells = options.createPprFallbackShells({
|
|
396
503
|
params: route.params,
|
|
@@ -425,7 +532,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
425
532
|
cleanPathname,
|
|
426
533
|
displayPathname: canonicalPathname,
|
|
427
534
|
formState,
|
|
428
|
-
actionError,
|
|
535
|
+
actionError: normalizedProgressiveActionError,
|
|
429
536
|
actionFailed,
|
|
430
537
|
handlerStart,
|
|
431
538
|
interceptionContext: interceptionContextHeader,
|
|
@@ -444,6 +551,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
444
551
|
staticParamsValidationParams: prerenderRouteParams === null || isPrerenderFallbackShell ? void 0 : params,
|
|
445
552
|
rootParams,
|
|
446
553
|
request,
|
|
554
|
+
renderedPathAndSearch: resolvedUrl,
|
|
447
555
|
route,
|
|
448
556
|
scriptNonce,
|
|
449
557
|
searchParams: resolvedSearchParams,
|
|
@@ -489,19 +597,20 @@ function createAppRscHandler(options) {
|
|
|
489
597
|
options.registerCacheAdapters();
|
|
490
598
|
await options.ensureInstrumentation?.();
|
|
491
599
|
const mwCtx = rawRequest.headers.get(VINEXT_MW_CTX_HEADER);
|
|
492
|
-
const hasDataRequestHeader = rawRequest.headers.get("x-nextjs-data") === "1";
|
|
493
600
|
const pagesDataUrl = new URL(rawRequest.url);
|
|
494
601
|
const pagesDataInScope = !options.basePath || hasBasePath(pagesDataUrl.pathname, options.basePath);
|
|
495
602
|
if (pagesDataInScope) pagesDataUrl.pathname = stripBasePath(pagesDataUrl.pathname, options.basePath);
|
|
496
603
|
const pagesDataCandidate = pagesDataInScope ? cloneRequestWithUrl(rawRequest, pagesDataUrl.toString()) : null;
|
|
497
|
-
const pagesDataNormalization = options.renderPagesFallback && pagesDataCandidate ? normalizePagesDataRequest(pagesDataCandidate, options.buildId) : null;
|
|
604
|
+
const pagesDataNormalization = options.renderPagesFallback && pagesDataCandidate ? normalizePagesDataRequest(pagesDataCandidate, options.buildId, "", typeof options.runMiddleware === "function" && options.trailingSlash) : null;
|
|
498
605
|
if (pagesDataNormalization?.notFoundResponse) return pagesDataNormalization.notFoundResponse;
|
|
499
|
-
const
|
|
606
|
+
const isPagesDataRequest = pagesDataNormalization?.isDataReq === true;
|
|
500
607
|
const prerenderRouteParamsPayload = readTrustedPrerenderRouteParams(rawRequest);
|
|
608
|
+
const isTrustedSpeculativePrerender = process.env.VINEXT_PRERENDER === "1" && rawRequest.headers.get("x-vinext-prerender-secret") !== null && rawRequest.headers.get("x-vinext-prerender-speculative") === "1";
|
|
501
609
|
const filteredHeaders = filterInternalHeaders(rawRequest.headers);
|
|
502
610
|
if (mwCtx !== null) filteredHeaders.set(VINEXT_MW_CTX_HEADER, mwCtx);
|
|
503
611
|
const prerenderRouteParamsHeader = serializePrerenderRouteParamsHeader(prerenderRouteParamsPayload);
|
|
504
612
|
if (prerenderRouteParamsHeader !== null) filteredHeaders.set(VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, prerenderRouteParamsHeader);
|
|
613
|
+
if (isTrustedSpeculativePrerender) filteredHeaders.set(VINEXT_PRERENDER_SPECULATIVE_HEADER, "1");
|
|
505
614
|
let appRequest = rawRequest;
|
|
506
615
|
if (pagesDataNormalization?.isDataReq) {
|
|
507
616
|
const appRequestUrl = new URL(pagesDataNormalization.request.url);
|
|
@@ -520,7 +629,7 @@ function createAppRscHandler(options) {
|
|
|
520
629
|
const preMiddlewareRequestContext = requestContextFromRequest(request);
|
|
521
630
|
let response;
|
|
522
631
|
try {
|
|
523
|
-
response = await handleAppRscRequest(options, request, preMiddlewareRequestContext,
|
|
632
|
+
response = await handleAppRscRequest(options, request, preMiddlewareRequestContext, isPagesDataRequest, isPagesDataRequest, pagesDataRequest);
|
|
524
633
|
} catch (error) {
|
|
525
634
|
if (process.env.NODE_ENV !== "production") flattenErrorCauses(error);
|
|
526
635
|
throw error;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
//#region src/server/app-rsc-render-mode.d.ts
|
|
2
|
-
type AppRscRenderMode = "navigation" | "prefetch-loading-shell" | "refresh-preserve-ui" | "action-rerender-preserve-ui";
|
|
2
|
+
type AppRscRenderMode = "navigation" | "prefetch-dynamic-shell" | "prefetch-loading-shell" | "refresh-preserve-ui" | "action-rerender-preserve-ui";
|
|
3
3
|
declare const APP_RSC_RENDER_MODE_NAVIGATION = "navigation";
|
|
4
|
+
declare const APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL = "prefetch-dynamic-shell";
|
|
4
5
|
declare const APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL = "prefetch-loading-shell";
|
|
5
6
|
declare const APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI = "refresh-preserve-ui";
|
|
6
7
|
declare const APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI = "action-rerender-preserve-ui";
|
|
@@ -8,4 +9,4 @@ declare function shouldSuppressLoadingBoundaries(mode: AppRscRenderMode): boolea
|
|
|
8
9
|
declare function getRscRenderModeCacheVariant(mode: AppRscRenderMode): string | null;
|
|
9
10
|
declare function parseAppRscRenderMode(value: string | null): AppRscRenderMode;
|
|
10
11
|
//#endregion
|
|
11
|
-
export { APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI, APP_RSC_RENDER_MODE_NAVIGATION, APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL, APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI, AppRscRenderMode, getRscRenderModeCacheVariant, parseAppRscRenderMode, shouldSuppressLoadingBoundaries };
|
|
12
|
+
export { APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI, APP_RSC_RENDER_MODE_NAVIGATION, APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL, APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL, APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI, AppRscRenderMode, getRscRenderModeCacheVariant, parseAppRscRenderMode, shouldSuppressLoadingBoundaries };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
//#region src/server/app-rsc-render-mode.ts
|
|
2
2
|
const APP_RSC_RENDER_MODE_NAVIGATION = "navigation";
|
|
3
|
+
const APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL = "prefetch-dynamic-shell";
|
|
3
4
|
const APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL = "prefetch-loading-shell";
|
|
4
5
|
const APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI = "refresh-preserve-ui";
|
|
5
6
|
const APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI = "action-rerender-preserve-ui";
|
|
@@ -10,11 +11,13 @@ function shouldUsePreserveUiCacheVariant(mode) {
|
|
|
10
11
|
return shouldSuppressLoadingBoundaries(mode);
|
|
11
12
|
}
|
|
12
13
|
function getRscRenderModeCacheVariant(mode) {
|
|
14
|
+
if (mode === "prefetch-dynamic-shell") return "prefetch-dynamic-shell";
|
|
13
15
|
if (mode === "prefetch-loading-shell") return "prefetch-loading-shell";
|
|
14
16
|
return shouldUsePreserveUiCacheVariant(mode) ? "preserve-ui" : null;
|
|
15
17
|
}
|
|
16
18
|
function parseAppRscRenderMode(value) {
|
|
17
19
|
switch (value) {
|
|
20
|
+
case APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL: return APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL;
|
|
18
21
|
case APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL: return APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL;
|
|
19
22
|
case APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI: return APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI;
|
|
20
23
|
case APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI: return APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI;
|
|
@@ -22,4 +25,4 @@ function parseAppRscRenderMode(value) {
|
|
|
22
25
|
}
|
|
23
26
|
}
|
|
24
27
|
//#endregion
|
|
25
|
-
export { APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI, APP_RSC_RENDER_MODE_NAVIGATION, APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL, APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI, getRscRenderModeCacheVariant, parseAppRscRenderMode, shouldSuppressLoadingBoundaries };
|
|
28
|
+
export { APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI, APP_RSC_RENDER_MODE_NAVIGATION, APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL, APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL, APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI, getRscRenderModeCacheVariant, parseAppRscRenderMode, shouldSuppressLoadingBoundaries };
|
|
@@ -11,7 +11,8 @@ type NormalizedRscRequest = {
|
|
|
11
11
|
interceptionContextHeader: string | null; /** Normalized x-vinext-mounted-slots header (deduplicated, sorted). null when absent or blank. */
|
|
12
12
|
mountedSlotsHeader: string | null; /** Semantic RSC payload mode. HTML requests always normalize to "navigation". */
|
|
13
13
|
renderMode: AppRscRenderMode; /** Parsed ClientReuseManifest hint. Verification and skip authorization happen later. */
|
|
14
|
-
clientReuseManifest: ClientReuseManifestParseResult;
|
|
14
|
+
clientReuseManifest: ClientReuseManifestParseResult; /** Whether the incoming pathname included the configured basePath. */
|
|
15
|
+
hadBasePath: boolean;
|
|
15
16
|
};
|
|
16
17
|
/**
|
|
17
18
|
* Normalize an App Router RSC request.
|
|
@@ -30,10 +31,9 @@ type NormalizedRscRequest = {
|
|
|
30
31
|
* 4. Collapse double-slashes, resolve `.` and `..` segments (normalizePath)
|
|
31
32
|
* 5. basePath check + strip — 404 when pathname lacks the basePath prefix.
|
|
32
33
|
* `/__vinext/` bypasses this for internal prerender endpoints.
|
|
33
|
-
* 6. RSC detection: `.rsc` suffix
|
|
34
|
-
* `_rsc` cache-busting query
|
|
35
|
-
*
|
|
36
|
-
* store Flight responses under HTML URLs.
|
|
34
|
+
* 6. RSC detection: `.rsc` suffix or Next-style `RSC: 1`. The internal
|
|
35
|
+
* `_rsc` cache-busting query is validated separately so full-route Flight
|
|
36
|
+
* responses do not share the canonical HTML URL in caches that ignore Vary.
|
|
37
37
|
* 7. cleanPathname — pathname with `.rsc` suffix stripped
|
|
38
38
|
* 8. Sanitize X-Vinext-Interception-Context — strip null bytes (header injection)
|
|
39
39
|
* 9. Normalize x-vinext-mounted-slots — dedup and sort for canonical cache keys
|
|
@@ -43,6 +43,6 @@ type NormalizedRscRequest = {
|
|
|
43
43
|
* @returns A 400 or 404 Response for invalid or out-of-scope inputs,
|
|
44
44
|
* or a NormalizedRscRequest for valid requests.
|
|
45
45
|
*/
|
|
46
|
-
declare function normalizeRscRequest(request: Request, basePath: string): Response | NormalizedRscRequest;
|
|
46
|
+
declare function normalizeRscRequest(request: Request, basePath: string, allowOutsideBasePath?: boolean): Response | NormalizedRscRequest;
|
|
47
47
|
//#endregion
|
|
48
48
|
export { NormalizedRscRequest, normalizeMountedSlotsHeader, normalizeRscRequest };
|
|
@@ -27,10 +27,9 @@ import { normalizeInterceptionContextHeader } from "./app-interception-context-h
|
|
|
27
27
|
* 4. Collapse double-slashes, resolve `.` and `..` segments (normalizePath)
|
|
28
28
|
* 5. basePath check + strip — 404 when pathname lacks the basePath prefix.
|
|
29
29
|
* `/__vinext/` bypasses this for internal prerender endpoints.
|
|
30
|
-
* 6. RSC detection: `.rsc` suffix
|
|
31
|
-
* `_rsc` cache-busting query
|
|
32
|
-
*
|
|
33
|
-
* store Flight responses under HTML URLs.
|
|
30
|
+
* 6. RSC detection: `.rsc` suffix or Next-style `RSC: 1`. The internal
|
|
31
|
+
* `_rsc` cache-busting query is validated separately so full-route Flight
|
|
32
|
+
* responses do not share the canonical HTML URL in caches that ignore Vary.
|
|
34
33
|
* 7. cleanPathname — pathname with `.rsc` suffix stripped
|
|
35
34
|
* 8. Sanitize X-Vinext-Interception-Context — strip null bytes (header injection)
|
|
36
35
|
* 9. Normalize x-vinext-mounted-slots — dedup and sort for canonical cache keys
|
|
@@ -40,7 +39,7 @@ import { normalizeInterceptionContextHeader } from "./app-interception-context-h
|
|
|
40
39
|
* @returns A 400 or 404 Response for invalid or out-of-scope inputs,
|
|
41
40
|
* or a NormalizedRscRequest for valid requests.
|
|
42
41
|
*/
|
|
43
|
-
function normalizeRscRequest(request, basePath) {
|
|
42
|
+
function normalizeRscRequest(request, basePath, allowOutsideBasePath = false) {
|
|
44
43
|
const url = new URL(request.url);
|
|
45
44
|
const protoGuard = guardProtocolRelativeUrl(url.pathname);
|
|
46
45
|
if (protoGuard) return protoGuard;
|
|
@@ -51,17 +50,20 @@ function normalizeRscRequest(request, basePath) {
|
|
|
51
50
|
return badRequestResponse();
|
|
52
51
|
}
|
|
53
52
|
let pathname = normalizePath(decoded);
|
|
53
|
+
let hadBasePath = true;
|
|
54
54
|
if (basePath) {
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
hadBasePath = hasBasePath(pathname, basePath);
|
|
56
|
+
if (!hadBasePath && !pathname.startsWith("/__vinext/") && !allowOutsideBasePath) return notFoundResponse();
|
|
57
|
+
if (hadBasePath) pathname = stripBasePath(pathname, basePath);
|
|
57
58
|
}
|
|
58
|
-
const isRscRequest = pathname.endsWith(".rsc") || request.headers.get("RSC") === "1"
|
|
59
|
+
const isRscRequest = pathname.endsWith(".rsc") || request.headers.get("RSC") === "1";
|
|
59
60
|
const cleanPathname = stripRscSuffix(pathname);
|
|
60
61
|
const interceptionContextHeader = normalizeInterceptionContextHeader(request.headers.get(VINEXT_INTERCEPTION_CONTEXT_HEADER));
|
|
61
62
|
const mountedSlotsHeader = normalizeMountedSlotsHeader(request.headers.get(VINEXT_MOUNTED_SLOTS_HEADER));
|
|
62
63
|
const renderMode = isRscRequest ? parseAppRscRenderMode(request.headers.get(VINEXT_RSC_RENDER_MODE_HEADER)) : APP_RSC_RENDER_MODE_NAVIGATION;
|
|
63
64
|
return {
|
|
64
65
|
clientReuseManifest: isRscRequest ? parseClientReuseManifestHeader(request.headers.get(VINEXT_CLIENT_REUSE_MANIFEST_HEADER)) : { kind: "absent" },
|
|
66
|
+
hadBasePath,
|
|
65
67
|
url,
|
|
66
68
|
pathname,
|
|
67
69
|
cleanPathname,
|
|
@@ -6,6 +6,7 @@ type AppRouteSegmentConfigModule = {
|
|
|
6
6
|
dynamic?: unknown;
|
|
7
7
|
dynamicParams?: unknown;
|
|
8
8
|
fetchCache?: unknown;
|
|
9
|
+
generateStaticParams?: unknown;
|
|
9
10
|
revalidate?: unknown;
|
|
10
11
|
runtime?: unknown;
|
|
11
12
|
unstable_dynamicStaleTime?: unknown;
|
|
@@ -18,11 +19,21 @@ type EffectiveAppPageSegmentConfig = {
|
|
|
18
19
|
revalidateSeconds: number | null;
|
|
19
20
|
runtime?: "edge" | "experimental-edge" | "nodejs";
|
|
20
21
|
};
|
|
22
|
+
type ParallelAppPageSegmentConfigBranch = {
|
|
23
|
+
configLayouts?: readonly (AppRouteSegmentConfigModule | null | undefined)[] | null;
|
|
24
|
+
configLayoutTreePositions?: readonly number[] | null;
|
|
25
|
+
layout?: AppRouteSegmentConfigModule | null;
|
|
26
|
+
page?: AppRouteSegmentConfigModule | null;
|
|
27
|
+
routeSegments?: readonly string[] | null;
|
|
28
|
+
};
|
|
21
29
|
type ResolveAppPageSegmentConfigOptions = {
|
|
22
30
|
layouts?: readonly (AppRouteSegmentConfigModule | null | undefined)[];
|
|
31
|
+
layoutTreePositions?: readonly number[];
|
|
23
32
|
page?: AppRouteSegmentConfigModule | null;
|
|
33
|
+
parallelBranches?: readonly (ParallelAppPageSegmentConfigBranch | null | undefined)[];
|
|
24
34
|
parallelPages?: readonly (AppRouteSegmentConfigModule | null | undefined)[];
|
|
25
35
|
parallelSegments?: readonly (AppRouteSegmentConfigModule | null | undefined)[];
|
|
36
|
+
routeSegments?: readonly string[];
|
|
26
37
|
};
|
|
27
38
|
/**
|
|
28
39
|
* Resolve the route segment config that applies to an App page route.
|