vinext 0.1.1 → 0.1.3
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 +2 -5
- package/dist/build/client-build-config.d.ts +7 -1
- package/dist/build/client-build-config.js +9 -1
- package/dist/build/prerender.d.ts +9 -1
- package/dist/build/prerender.js +41 -12
- package/dist/build/run-prerender.d.ts +10 -2
- package/dist/build/run-prerender.js +15 -1
- package/dist/check.js +4 -3
- package/dist/client/app-nav-failure-handler.d.ts +8 -0
- package/dist/client/app-nav-failure-handler.js +44 -0
- package/dist/client/navigation-runtime.d.ts +3 -2
- package/dist/client/vinext-next-data.d.ts +18 -1
- package/dist/client/window-next.d.ts +8 -5
- package/dist/client/window-next.js +12 -1
- package/dist/cloudflare/src/cache/cdn-adapter.runtime.js +6 -1
- package/dist/config/config-matchers.d.ts +11 -4
- package/dist/config/config-matchers.js +88 -16
- package/dist/config/next-config.d.ts +59 -4
- package/dist/config/next-config.js +149 -48
- package/dist/deploy.d.ts +30 -11
- package/dist/deploy.js +189 -101
- package/dist/entries/app-browser-entry.d.ts +9 -3
- package/dist/entries/app-browser-entry.js +21 -3
- package/dist/entries/app-rsc-entry.d.ts +2 -0
- package/dist/entries/app-rsc-entry.js +71 -6
- package/dist/entries/app-rsc-manifest.js +2 -0
- package/dist/entries/app-ssr-entry.js +1 -1
- package/dist/entries/pages-client-entry.js +54 -9
- package/dist/entries/pages-server-entry.js +48 -11
- package/dist/index.d.ts +0 -2
- package/dist/index.js +285 -139
- package/dist/plugins/dynamic-preload-metadata.d.ts +13 -0
- package/dist/plugins/dynamic-preload-metadata.js +415 -0
- package/dist/plugins/extensionless-dynamic-import.d.ts +6 -0
- package/dist/plugins/extensionless-dynamic-import.js +152 -0
- package/dist/plugins/og-assets.js +2 -2
- package/dist/plugins/optimize-imports.d.ts +10 -5
- package/dist/plugins/optimize-imports.js +27 -21
- package/dist/plugins/postcss.js +7 -7
- package/dist/plugins/sass.d.ts +53 -24
- package/dist/plugins/sass.js +249 -1
- package/dist/plugins/typeof-window.d.ts +14 -0
- package/dist/plugins/typeof-window.js +150 -0
- package/dist/plugins/wasm-module-import.d.ts +15 -0
- package/dist/plugins/wasm-module-import.js +50 -0
- package/dist/routing/app-route-graph.d.ts +25 -2
- package/dist/routing/app-route-graph.js +91 -22
- package/dist/routing/file-matcher.d.ts +10 -1
- package/dist/routing/file-matcher.js +23 -2
- package/dist/routing/pages-router.js +3 -3
- package/dist/routing/utils.d.ts +35 -6
- package/dist/routing/utils.js +59 -7
- package/dist/server/api-handler.d.ts +6 -1
- package/dist/server/api-handler.js +21 -15
- package/dist/server/app-browser-action-result.d.ts +19 -6
- package/dist/server/app-browser-action-result.js +19 -10
- package/dist/server/app-browser-entry.js +269 -297
- package/dist/server/app-browser-error.d.ts +10 -3
- package/dist/server/app-browser-error.js +47 -6
- package/dist/server/app-browser-history-controller.d.ts +104 -0
- package/dist/server/app-browser-history-controller.js +210 -0
- package/dist/server/app-browser-hydration.d.ts +2 -0
- package/dist/server/app-browser-hydration.js +1 -0
- package/dist/server/app-browser-navigation-controller.d.ts +7 -4
- package/dist/server/app-browser-navigation-controller.js +33 -9
- package/dist/server/app-browser-rsc-redirect.d.ts +11 -2
- package/dist/server/app-browser-rsc-redirect.js +30 -8
- package/dist/server/app-browser-server-action-navigation.d.ts +6 -0
- package/dist/server/app-browser-server-action-navigation.js +9 -0
- package/dist/server/app-browser-state.js +4 -7
- package/dist/server/app-browser-stream.js +86 -43
- package/dist/server/app-browser-visible-commit.js +1 -1
- package/dist/server/app-elements-wire.d.ts +6 -1
- package/dist/server/app-elements-wire.js +14 -4
- package/dist/server/app-elements.d.ts +2 -2
- package/dist/server/app-elements.js +2 -2
- package/dist/server/app-fallback-renderer.d.ts +3 -1
- package/dist/server/app-fallback-renderer.js +6 -2
- package/dist/server/app-middleware.js +1 -0
- package/dist/server/app-optimistic-routing.js +24 -3
- package/dist/server/app-page-boundary-render.d.ts +3 -1
- package/dist/server/app-page-boundary-render.js +31 -16
- package/dist/server/app-page-cache-render.d.ts +53 -0
- package/dist/server/app-page-cache-render.js +91 -0
- package/dist/server/app-page-cache.d.ts +16 -2
- package/dist/server/app-page-cache.js +71 -8
- package/dist/server/app-page-dispatch.d.ts +34 -0
- package/dist/server/app-page-dispatch.js +167 -97
- package/dist/server/app-page-element-builder.d.ts +23 -2
- package/dist/server/app-page-element-builder.js +42 -10
- package/dist/server/app-page-execution.d.ts +7 -2
- package/dist/server/app-page-execution.js +53 -18
- package/dist/server/app-page-probe.d.ts +1 -0
- package/dist/server/app-page-probe.js +4 -0
- package/dist/server/app-page-render-observation.d.ts +3 -1
- package/dist/server/app-page-render-observation.js +17 -1
- package/dist/server/app-page-render.d.ts +13 -2
- package/dist/server/app-page-render.js +48 -17
- package/dist/server/app-page-request.d.ts +3 -0
- package/dist/server/app-page-request.js +5 -3
- package/dist/server/app-page-response.js +1 -1
- package/dist/server/app-page-route-wiring.d.ts +5 -1
- package/dist/server/app-page-route-wiring.js +21 -11
- package/dist/server/app-page-stream.d.ts +16 -9
- package/dist/server/app-page-stream.js +12 -9
- package/dist/server/app-pages-bridge.d.ts +18 -0
- package/dist/server/app-pages-bridge.js +22 -5
- package/dist/server/app-ppr-fallback-shell-render.d.ts +17 -0
- package/dist/server/app-ppr-fallback-shell-render.js +26 -0
- package/dist/server/app-ppr-fallback-shell.d.ts +13 -1
- package/dist/server/app-ppr-fallback-shell.js +8 -1
- package/dist/server/app-route-handler-dispatch.js +9 -2
- package/dist/server/app-route-handler-policy.d.ts +1 -0
- package/dist/server/app-route-handler-response.js +11 -10
- package/dist/server/app-route-handler-runtime.js +12 -1
- package/dist/server/app-router-entry.js +5 -0
- package/dist/server/app-rsc-cache-busting.js +2 -0
- package/dist/server/app-rsc-handler.d.ts +25 -0
- package/dist/server/app-rsc-handler.js +153 -53
- package/dist/server/app-rsc-response-finalizer.js +1 -1
- package/dist/server/app-rsc-route-matching.d.ts +3 -0
- package/dist/server/app-rsc-route-matching.js +2 -0
- package/dist/server/app-segment-config.d.ts +9 -1
- package/dist/server/app-segment-config.js +12 -3
- package/dist/server/app-server-action-execution.d.ts +12 -0
- package/dist/server/app-server-action-execution.js +47 -15
- package/dist/server/app-ssr-entry.d.ts +2 -0
- package/dist/server/app-ssr-entry.js +81 -8
- package/dist/server/app-ssr-stream.js +9 -1
- package/dist/server/cache-control.js +4 -0
- package/dist/server/dev-lockfile.js +2 -1
- package/dist/server/dev-server.d.ts +2 -2
- package/dist/server/dev-server.js +287 -63
- package/dist/server/headers.d.ts +8 -1
- package/dist/server/headers.js +8 -1
- package/dist/server/hybrid-route-priority.d.ts +22 -0
- package/dist/server/hybrid-route-priority.js +33 -0
- package/dist/server/image-optimization.d.ts +18 -9
- package/dist/server/image-optimization.js +37 -23
- package/dist/server/implicit-tags.d.ts +2 -1
- package/dist/server/implicit-tags.js +4 -1
- package/dist/server/instrumentation-runtime.d.ts +6 -0
- package/dist/server/instrumentation-runtime.js +8 -0
- package/dist/server/isr-decision.d.ts +79 -0
- package/dist/server/isr-decision.js +70 -0
- package/dist/server/metadata-route-response.js +5 -3
- package/dist/server/middleware-runtime.d.ts +13 -0
- package/dist/server/middleware-runtime.js +11 -7
- package/dist/server/middleware.js +1 -0
- package/dist/server/navigation-planner.d.ts +186 -22
- package/dist/server/navigation-planner.js +302 -0
- package/dist/server/navigation-trace.d.ts +18 -1
- package/dist/server/navigation-trace.js +18 -1
- package/dist/server/normalize-path.d.ts +0 -8
- package/dist/server/normalize-path.js +3 -1
- package/dist/server/otel-tracer-extension.d.ts +45 -0
- package/dist/server/otel-tracer-extension.js +89 -0
- package/dist/server/pages-api-route.d.ts +20 -3
- package/dist/server/pages-api-route.js +19 -3
- package/dist/server/pages-asset-tags.d.ts +16 -4
- package/dist/server/pages-asset-tags.js +22 -12
- package/dist/server/pages-data-route.d.ts +8 -1
- package/dist/server/pages-data-route.js +16 -3
- package/dist/server/pages-get-initial-props.d.ts +54 -4
- package/dist/server/pages-get-initial-props.js +43 -1
- package/dist/server/pages-node-compat.d.ts +3 -11
- package/dist/server/pages-node-compat.js +175 -122
- package/dist/server/pages-page-data.d.ts +39 -2
- package/dist/server/pages-page-data.js +261 -46
- package/dist/server/pages-page-handler.d.ts +5 -2
- package/dist/server/pages-page-handler.js +78 -25
- package/dist/server/pages-page-response.d.ts +47 -2
- package/dist/server/pages-page-response.js +73 -9
- package/dist/server/pages-readiness.d.ts +1 -1
- package/dist/server/pages-request-pipeline.d.ts +16 -1
- package/dist/server/pages-request-pipeline.js +96 -38
- package/dist/server/pregenerated-concrete-paths.d.ts +1 -17
- package/dist/server/pregenerated-concrete-paths.js +2 -19
- package/dist/server/prerender-manifest.d.ts +33 -0
- package/dist/server/prerender-manifest.js +54 -0
- package/dist/server/prerender-route-params.d.ts +1 -2
- package/dist/server/prod-server.d.ts +39 -1
- package/dist/server/prod-server.js +107 -37
- package/dist/server/request-pipeline.d.ts +3 -15
- package/dist/server/request-pipeline.js +58 -47
- package/dist/server/rsc-stream-hints.d.ts +5 -1
- package/dist/server/rsc-stream-hints.js +6 -1
- package/dist/server/seed-cache.js +10 -18
- package/dist/shims/app-router-scroll-state.d.ts +3 -1
- package/dist/shims/app-router-scroll-state.js +14 -2
- package/dist/shims/app-router-scroll.d.ts +3 -0
- package/dist/shims/app-router-scroll.js +28 -18
- package/dist/shims/cache-runtime.js +12 -4
- package/dist/shims/cache.d.ts +1 -0
- package/dist/shims/cache.js +1 -1
- package/dist/shims/cdn-cache.d.ts +5 -5
- package/dist/shims/dynamic-preload-chunks.d.ts +8 -0
- package/dist/shims/dynamic-preload-chunks.js +79 -0
- package/dist/shims/dynamic.d.ts +4 -0
- package/dist/shims/dynamic.js +4 -2
- package/dist/shims/error-boundary.d.ts +6 -4
- package/dist/shims/error-boundary.js +7 -0
- package/dist/shims/error.js +38 -11
- package/dist/shims/error.react-server.d.ts +9 -0
- package/dist/shims/error.react-server.js +6 -0
- package/dist/shims/fetch-cache.d.ts +11 -1
- package/dist/shims/fetch-cache.js +55 -20
- package/dist/shims/hash-scroll.js +6 -1
- package/dist/shims/head.js +6 -1
- package/dist/shims/headers.d.ts +16 -2
- package/dist/shims/headers.js +66 -5
- package/dist/shims/image-config.js +7 -1
- package/dist/shims/internal/als-registry.js +28 -1
- package/dist/shims/internal/app-route-detection.d.ts +6 -3
- package/dist/shims/internal/app-route-detection.js +18 -23
- package/dist/shims/internal/app-router-context.d.ts +5 -0
- package/dist/shims/internal/hybrid-client-route-owner.d.ts +31 -0
- package/dist/shims/internal/hybrid-client-route-owner.js +143 -0
- package/dist/shims/internal/navigation-untracked.d.ts +35 -0
- package/dist/shims/internal/navigation-untracked.js +55 -0
- package/dist/shims/internal/pages-data-target.d.ts +7 -2
- package/dist/shims/internal/pages-data-target.js +17 -8
- package/dist/shims/internal/pages-router-accessor.d.ts +19 -0
- package/dist/shims/internal/pages-router-accessor.js +13 -0
- package/dist/shims/internal/router-context.d.ts +2 -1
- package/dist/shims/internal/router-context.js +3 -1
- package/dist/shims/link.js +12 -5
- package/dist/shims/metadata.d.ts +6 -2
- package/dist/shims/metadata.js +32 -14
- package/dist/shims/navigation.d.ts +14 -17
- package/dist/shims/navigation.js +93 -46
- package/dist/shims/ppr-fallback-shell.d.ts +5 -1
- package/dist/shims/ppr-fallback-shell.js +28 -7
- package/dist/shims/router.d.ts +13 -2
- package/dist/shims/router.js +434 -116
- package/dist/shims/script-nonce-context.d.ts +1 -1
- package/dist/shims/script-nonce-context.js +11 -3
- package/dist/shims/server.d.ts +33 -2
- package/dist/shims/server.js +75 -18
- package/dist/shims/slot.js +1 -1
- package/dist/shims/unified-request-context.js +2 -0
- package/dist/typegen.js +1 -0
- package/dist/utils/built-asset-url.d.ts +4 -0
- package/dist/utils/built-asset-url.js +11 -0
- package/dist/utils/client-build-manifest.js +15 -5
- package/dist/utils/client-runtime-metadata.d.ts +45 -0
- package/dist/utils/client-runtime-metadata.js +63 -0
- package/dist/utils/commonjs-loader.d.ts +16 -0
- package/dist/utils/commonjs-loader.js +100 -0
- package/dist/utils/deployment-id.d.ts +8 -0
- package/dist/utils/deployment-id.js +22 -0
- package/dist/utils/hash.d.ts +17 -1
- package/dist/utils/hash.js +36 -1
- package/dist/utils/html-limited-bots.d.ts +18 -1
- package/dist/utils/html-limited-bots.js +23 -1
- package/dist/utils/lazy-chunks.d.ts +27 -1
- package/dist/utils/lazy-chunks.js +65 -1
- package/dist/utils/manifest-paths.d.ts +20 -2
- package/dist/utils/manifest-paths.js +38 -3
- package/dist/utils/parse-cookie.d.ts +13 -0
- package/dist/utils/parse-cookie.js +52 -0
- package/dist/utils/path.d.ts +8 -1
- package/dist/utils/path.js +13 -1
- package/package.json +2 -2
- package/dist/shims/internal/parse-cookie-header.d.ts +0 -14
- package/dist/shims/internal/parse-cookie-header.js +0 -30
|
@@ -4,27 +4,31 @@ import { getRequestExecutionContext } from "../shims/request-context.js";
|
|
|
4
4
|
import { ACTION_REVALIDATED_HEADER, VINEXT_MW_CTX_HEADER, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER } from "./headers.js";
|
|
5
5
|
import { isExternalUrl, matchRedirect, matchRewrite, preserveRedirectDestinationQuery, proxyExternalRequest, requestContextFromRequest, sanitizeDestination } from "../config/config-matchers.js";
|
|
6
6
|
import { notFoundResponse } from "./http-error-responses.js";
|
|
7
|
-
import { applyConfigHeadersToResponse, cloneRequestWithHeaders, cloneRequestWithUrl, filterInternalHeaders, normalizeTrailingSlash, resolvePublicFileRoute
|
|
7
|
+
import { applyConfigHeadersToResponse, cloneRequestWithHeaders, cloneRequestWithUrl, filterInternalHeaders, normalizeTrailingSlash, resolvePublicFileRoute } from "./request-pipeline.js";
|
|
8
8
|
import { headersContextFromRequest } from "../shims/headers.js";
|
|
9
9
|
import { ensureFetchPatch, setCurrentFetchSoftTags } from "../shims/fetch-cache.js";
|
|
10
|
-
import {
|
|
10
|
+
import { mergeRewriteQuery } from "../utils/query.js";
|
|
11
|
+
import { VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM, createRscRedirectLocation, hasRscCacheBustingSearchParam, resolveInvalidRscCacheBustingRequest, stripRscCacheBustingSearchParam, stripRscSuffix } from "./app-rsc-cache-busting.js";
|
|
11
12
|
import { getScriptNonceFromHeaderSources } from "./csp.js";
|
|
12
13
|
import { normalizeDefaultLocalePathname } from "./pages-i18n.js";
|
|
13
|
-
import { isImageOptimizationPath } from "./image-optimization.js";
|
|
14
|
+
import { DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES, isImageOptimizationPath, resolveDevImageRedirect } from "./image-optimization.js";
|
|
14
15
|
import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
|
|
15
16
|
import "./app-page-response.js";
|
|
16
|
-
import {
|
|
17
|
+
import { createAppPprFallbackShells } from "./app-ppr-fallback-shell.js";
|
|
18
|
+
import { matchPrerenderRouteParamsPayload, readTrustedPrerenderRouteParams, serializePrerenderRouteParamsHeader } from "./prerender-route-params.js";
|
|
19
|
+
import { getRenderedConcreteUrlPathsForRoute } from "./pregenerated-concrete-paths.js";
|
|
17
20
|
import { pickRootParams, setRootParams } from "../shims/root-params.js";
|
|
21
|
+
import { flattenErrorCauses } from "../utils/error-cause.js";
|
|
18
22
|
import { applyAppMiddleware } from "./app-middleware.js";
|
|
19
23
|
import { buildPageCacheTags } from "./implicit-tags.js";
|
|
20
24
|
import { buildPostMwRequestContext } from "./app-post-middleware-context.js";
|
|
21
25
|
import { handleAppPrerenderEndpoint } from "./app-prerender-endpoints.js";
|
|
22
|
-
import { flattenErrorCauses } from "../utils/error-cause.js";
|
|
23
26
|
import { finalizeAppRscResponse } from "./app-rsc-response-finalizer.js";
|
|
24
27
|
import { normalizeRscRequest } from "./app-rsc-request-normalization.js";
|
|
25
28
|
import { handleMetadataRouteRequest } from "./metadata-route-response.js";
|
|
26
29
|
import { runWithPrerenderWorkUnit } from "./prerender-work-unit-setup.js";
|
|
27
30
|
//#region src/server/app-rsc-handler.ts
|
|
31
|
+
const STATIC_METADATA_CONFIG_HEADER_OVERRIDES = new Set(["cache-control"]);
|
|
28
32
|
function applyMiddlewareContextToResponse(response, middlewareContext) {
|
|
29
33
|
if (!middlewareContext.headers && middlewareContext.status == null) return response;
|
|
30
34
|
const headers = new Headers(response.headers);
|
|
@@ -38,6 +42,10 @@ function applyMiddlewareContextToResponse(response, middlewareContext) {
|
|
|
38
42
|
function hasProperty(value, key) {
|
|
39
43
|
return key in value;
|
|
40
44
|
}
|
|
45
|
+
function isEdgeRouteHandler(handler) {
|
|
46
|
+
if (!handler || typeof handler !== "object" || !hasProperty(handler, "runtime")) return false;
|
|
47
|
+
return handler.runtime === "edge" || handler.runtime === "experimental-edge";
|
|
48
|
+
}
|
|
41
49
|
function isExecutionContextLike(value) {
|
|
42
50
|
if (!value || typeof value !== "object") return false;
|
|
43
51
|
return hasProperty(value, "waitUntil") && typeof value.waitUntil === "function";
|
|
@@ -56,6 +64,17 @@ async function applyRewrite(options, cleanPathname) {
|
|
|
56
64
|
}
|
|
57
65
|
return rewritten;
|
|
58
66
|
}
|
|
67
|
+
function requestContextForResolvedUrl(requestContext, resolvedUrl, baseUrl) {
|
|
68
|
+
return {
|
|
69
|
+
cookies: requestContext.cookies,
|
|
70
|
+
headers: requestContext.headers,
|
|
71
|
+
host: requestContext.host,
|
|
72
|
+
query: new URL(resolvedUrl, baseUrl).searchParams
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function pathnameForResolvedUrl(resolvedUrl) {
|
|
76
|
+
return resolvedUrl.split("#", 1)[0].split("?", 1)[0];
|
|
77
|
+
}
|
|
59
78
|
function applyConfigHeadersToMiddlewareRedirect(response, options) {
|
|
60
79
|
if (response.status < 300 || response.status >= 400) return response;
|
|
61
80
|
if (!options.configHeaders.length) return response;
|
|
@@ -82,6 +101,13 @@ function requestWithoutRscCacheBustingSearchParam(request) {
|
|
|
82
101
|
stripRscCacheBustingSearchParam(url);
|
|
83
102
|
return cloneRequestWithUrl(request.body ? request.clone() : request, url.toString());
|
|
84
103
|
}
|
|
104
|
+
function requestWithoutRscSuffix(request) {
|
|
105
|
+
const url = new URL(request.url);
|
|
106
|
+
const pathname = stripRscSuffix(url.pathname);
|
|
107
|
+
if (pathname === url.pathname) return request;
|
|
108
|
+
url.pathname = pathname;
|
|
109
|
+
return cloneRequestWithUrl(request.body ? request.clone() : request, url.toString());
|
|
110
|
+
}
|
|
85
111
|
async function handleAppRscRequest(options, request, preMiddlewareRequestContext, isDataRequest) {
|
|
86
112
|
const handlerStart = process.env.NODE_ENV !== "production" ? performance.now() : 0;
|
|
87
113
|
if (process.env.NODE_ENV !== "production") {
|
|
@@ -92,6 +118,8 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
92
118
|
if (normalized instanceof Response) return normalized;
|
|
93
119
|
const { url, isRscRequest, interceptionContextHeader, mountedSlotsHeader, renderMode, clientReuseManifest } = normalized;
|
|
94
120
|
let { pathname, cleanPathname } = normalized;
|
|
121
|
+
let resolvedUrl = cleanPathname + url.search;
|
|
122
|
+
const getResolvedSearchParams = () => new URL(resolvedUrl, url).searchParams;
|
|
95
123
|
const canonicalPathname = cleanPathname;
|
|
96
124
|
const basePathState = {
|
|
97
125
|
basePath: options.basePath,
|
|
@@ -124,12 +152,14 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
124
152
|
request
|
|
125
153
|
});
|
|
126
154
|
if (rscCacheBustingRedirect) return rscCacheBustingRedirect;
|
|
127
|
-
const
|
|
155
|
+
const normalizedUserlandRequest = requestWithoutRscSuffix(request);
|
|
156
|
+
const userlandRequest = requestWithoutRscCacheBustingSearchParam(normalizedUserlandRequest);
|
|
128
157
|
const middlewareContext = {
|
|
129
158
|
headers: null,
|
|
130
159
|
requestHeaders: null,
|
|
131
160
|
status: null
|
|
132
161
|
};
|
|
162
|
+
let didMiddlewareRewrite = false;
|
|
133
163
|
if (options.middlewareModule) {
|
|
134
164
|
const middlewareResult = await applyAppMiddleware({
|
|
135
165
|
basePath: options.basePath,
|
|
@@ -149,30 +179,46 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
149
179
|
requestContext: preMiddlewareRequestContext
|
|
150
180
|
});
|
|
151
181
|
cleanPathname = middlewareResult.cleanPathname;
|
|
182
|
+
didMiddlewareRewrite = cleanPathname !== normalized.cleanPathname;
|
|
152
183
|
if (middlewareResult.search !== null) url.search = middlewareResult.search;
|
|
184
|
+
resolvedUrl = cleanPathname + url.search;
|
|
153
185
|
}
|
|
154
186
|
const scriptNonce = getScriptNonceFromHeaderSources(request.headers, middlewareContext.headers);
|
|
155
187
|
const postMiddlewareRequestContext = buildPostMwRequestContext(userlandRequest);
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
188
|
+
for (const rewrite of options.configRewrites.beforeFiles) {
|
|
189
|
+
const beforeFilesRewrite = await applyRewrite({
|
|
190
|
+
basePathState,
|
|
191
|
+
clearRequestContext: options.clearRequestContext,
|
|
192
|
+
request: normalizedUserlandRequest,
|
|
193
|
+
requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
|
|
194
|
+
rewrites: [rewrite]
|
|
195
|
+
}, matchPathname(cleanPathname));
|
|
196
|
+
if (beforeFilesRewrite instanceof Response) return beforeFilesRewrite;
|
|
197
|
+
if (beforeFilesRewrite) {
|
|
198
|
+
resolvedUrl = mergeRewriteQuery(resolvedUrl, beforeFilesRewrite);
|
|
199
|
+
cleanPathname = pathnameForResolvedUrl(resolvedUrl);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
165
202
|
if (isImageOptimizationPath(cleanPathname)) {
|
|
166
|
-
const
|
|
167
|
-
if (
|
|
168
|
-
return Response.redirect(new URL(
|
|
203
|
+
const imageRedirect = resolveDevImageRedirect(url, [...options.imageConfig?.deviceSizes ?? DEFAULT_DEVICE_SIZES, ...options.imageConfig?.imageSizes ?? DEFAULT_IMAGE_SIZES], options.imageConfig?.qualities, { isDev: options.isDev });
|
|
204
|
+
if (!imageRedirect) return new Response("Invalid image optimization parameters", { status: 400 });
|
|
205
|
+
return Response.redirect(new URL(imageRedirect, url.origin).href, 302);
|
|
169
206
|
}
|
|
170
207
|
const metadataRouteResponse = await handleMetadataRouteRequest({
|
|
171
208
|
metadataRoutes: options.metadataRoutes,
|
|
172
209
|
cleanPathname,
|
|
173
210
|
makeThenableParams: options.makeThenableParams
|
|
174
211
|
});
|
|
175
|
-
if (metadataRouteResponse)
|
|
212
|
+
if (metadataRouteResponse) {
|
|
213
|
+
applyConfigHeadersToResponse(metadataRouteResponse.headers, {
|
|
214
|
+
basePathState,
|
|
215
|
+
configHeaders: options.configHeaders,
|
|
216
|
+
overwriteExisting: STATIC_METADATA_CONFIG_HEADER_OVERRIDES,
|
|
217
|
+
pathname: matchPathname(cleanPathname),
|
|
218
|
+
requestContext: preMiddlewareRequestContext
|
|
219
|
+
});
|
|
220
|
+
return applyMiddlewareContextToResponse(metadataRouteResponse, middlewareContext);
|
|
221
|
+
}
|
|
176
222
|
const publicFileResponse = resolvePublicFileRoute({
|
|
177
223
|
cleanPathname,
|
|
178
224
|
middlewareContext,
|
|
@@ -184,10 +230,13 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
184
230
|
options.clearRequestContext();
|
|
185
231
|
return publicFileResponse;
|
|
186
232
|
}
|
|
187
|
-
|
|
233
|
+
stripRscCacheBustingSearchParam(url);
|
|
234
|
+
const resolved = new URL(resolvedUrl, url);
|
|
235
|
+
stripRscCacheBustingSearchParam(resolved);
|
|
236
|
+
resolvedUrl = resolved.pathname + resolved.search + resolved.hash;
|
|
188
237
|
options.setNavigationContext({
|
|
189
238
|
pathname: canonicalPathname,
|
|
190
|
-
searchParams:
|
|
239
|
+
searchParams: getResolvedSearchParams(),
|
|
191
240
|
params: {}
|
|
192
241
|
});
|
|
193
242
|
const preActionMatch = options.matchRoute(cleanPathname);
|
|
@@ -216,53 +265,85 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
216
265
|
middlewareContext,
|
|
217
266
|
mountedSlotsHeader,
|
|
218
267
|
request,
|
|
219
|
-
searchParams:
|
|
268
|
+
searchParams: getResolvedSearchParams()
|
|
220
269
|
});
|
|
221
270
|
if (serverActionResponse) return serverActionResponse;
|
|
222
271
|
let match = preActionMatch;
|
|
223
|
-
|
|
272
|
+
const renderPagesForMatchKind = async (matchKind) => match === null || match.route.isDynamic ? await options.renderPagesFallback?.({
|
|
273
|
+
appRouteMatch: match ?? null,
|
|
274
|
+
allowRscDocumentFallback: didMiddlewareRewrite,
|
|
275
|
+
isRscRequest,
|
|
276
|
+
matchKind,
|
|
277
|
+
middlewareContext,
|
|
278
|
+
pathname: resolvedUrl,
|
|
279
|
+
request,
|
|
280
|
+
url
|
|
281
|
+
}) ?? null : null;
|
|
282
|
+
const staticPagesFallbackResponse = await renderPagesForMatchKind("static");
|
|
283
|
+
if (staticPagesFallbackResponse) {
|
|
284
|
+
options.clearRequestContext();
|
|
285
|
+
return staticPagesFallbackResponse;
|
|
286
|
+
}
|
|
287
|
+
if (!match || match.route.isDynamic) for (const rewrite of options.configRewrites.afterFiles) {
|
|
224
288
|
const afterFilesRewrite = await applyRewrite({
|
|
225
289
|
basePathState,
|
|
226
290
|
clearRequestContext: options.clearRequestContext,
|
|
227
|
-
request:
|
|
228
|
-
requestContext: postMiddlewareRequestContext,
|
|
229
|
-
rewrites:
|
|
291
|
+
request: normalizedUserlandRequest,
|
|
292
|
+
requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
|
|
293
|
+
rewrites: [rewrite]
|
|
230
294
|
}, matchPathname(cleanPathname));
|
|
231
295
|
if (afterFilesRewrite instanceof Response) return afterFilesRewrite;
|
|
232
|
-
if (afterFilesRewrite)
|
|
233
|
-
|
|
234
|
-
|
|
296
|
+
if (!afterFilesRewrite) continue;
|
|
297
|
+
resolvedUrl = mergeRewriteQuery(resolvedUrl, afterFilesRewrite);
|
|
298
|
+
cleanPathname = pathnameForResolvedUrl(resolvedUrl);
|
|
299
|
+
match = options.matchRoute(cleanPathname);
|
|
300
|
+
const rewrittenStaticPagesResponse = await renderPagesForMatchKind("static");
|
|
301
|
+
if (rewrittenStaticPagesResponse) {
|
|
302
|
+
options.clearRequestContext();
|
|
303
|
+
return rewrittenStaticPagesResponse;
|
|
235
304
|
}
|
|
305
|
+
const rewrittenDynamicPagesResponse = await renderPagesForMatchKind("dynamic");
|
|
306
|
+
if (rewrittenDynamicPagesResponse) {
|
|
307
|
+
options.clearRequestContext();
|
|
308
|
+
return rewrittenDynamicPagesResponse;
|
|
309
|
+
}
|
|
310
|
+
if (match) break;
|
|
236
311
|
}
|
|
237
|
-
|
|
312
|
+
const dynamicPagesFallbackResponse = await renderPagesForMatchKind("dynamic");
|
|
313
|
+
if (dynamicPagesFallbackResponse) {
|
|
314
|
+
options.clearRequestContext();
|
|
315
|
+
return dynamicPagesFallbackResponse;
|
|
316
|
+
}
|
|
317
|
+
if (!match) for (const rewrite of options.configRewrites.fallback) {
|
|
238
318
|
const fallbackRewrite = await applyRewrite({
|
|
239
319
|
basePathState,
|
|
240
320
|
clearRequestContext: options.clearRequestContext,
|
|
241
|
-
request:
|
|
242
|
-
requestContext: postMiddlewareRequestContext,
|
|
243
|
-
rewrites:
|
|
321
|
+
request: normalizedUserlandRequest,
|
|
322
|
+
requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
|
|
323
|
+
rewrites: [rewrite]
|
|
244
324
|
}, matchPathname(cleanPathname));
|
|
245
325
|
if (fallbackRewrite instanceof Response) return fallbackRewrite;
|
|
246
|
-
if (fallbackRewrite)
|
|
247
|
-
|
|
248
|
-
|
|
326
|
+
if (!fallbackRewrite) continue;
|
|
327
|
+
resolvedUrl = mergeRewriteQuery(resolvedUrl, fallbackRewrite);
|
|
328
|
+
cleanPathname = pathnameForResolvedUrl(resolvedUrl);
|
|
329
|
+
match = options.matchRoute(cleanPathname);
|
|
330
|
+
const rewrittenStaticPagesResponse = await renderPagesForMatchKind("static");
|
|
331
|
+
if (rewrittenStaticPagesResponse) {
|
|
332
|
+
options.clearRequestContext();
|
|
333
|
+
return rewrittenStaticPagesResponse;
|
|
334
|
+
}
|
|
335
|
+
const rewrittenDynamicPagesResponse = await renderPagesForMatchKind("dynamic");
|
|
336
|
+
if (rewrittenDynamicPagesResponse) {
|
|
337
|
+
options.clearRequestContext();
|
|
338
|
+
return rewrittenDynamicPagesResponse;
|
|
249
339
|
}
|
|
340
|
+
if (match) break;
|
|
250
341
|
}
|
|
251
342
|
if (!match) {
|
|
252
343
|
if (process.env.NODE_ENV !== "production" && canonicalPathname === "/favicon.ico") {
|
|
253
344
|
options.clearRequestContext();
|
|
254
345
|
return new Response("", { status: 404 });
|
|
255
346
|
}
|
|
256
|
-
const pagesFallbackResponse = await options.renderPagesFallback?.({
|
|
257
|
-
isRscRequest,
|
|
258
|
-
middlewareContext,
|
|
259
|
-
request,
|
|
260
|
-
url
|
|
261
|
-
});
|
|
262
|
-
if (pagesFallbackResponse) {
|
|
263
|
-
options.clearRequestContext();
|
|
264
|
-
return pagesFallbackResponse;
|
|
265
|
-
}
|
|
266
347
|
const renderedNotFoundResponse = await options.renderNotFound({
|
|
267
348
|
isRscRequest,
|
|
268
349
|
middlewareContext,
|
|
@@ -278,25 +359,37 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
278
359
|
}
|
|
279
360
|
const { route, params } = match;
|
|
280
361
|
if (options.ensureRouteLoaded) await options.ensureRouteLoaded(route);
|
|
281
|
-
const
|
|
282
|
-
const prerenderRouteParams =
|
|
362
|
+
const prerenderRouteParamsMatch = matchPrerenderRouteParamsPayload(readTrustedPrerenderRouteParams(request), route.pattern, params);
|
|
363
|
+
const prerenderRouteParams = prerenderRouteParamsMatch?.params ?? null;
|
|
364
|
+
const isPrerenderFallbackShell = prerenderRouteParamsMatch?.kind === "fallback-shell";
|
|
283
365
|
const renderParams = prerenderRouteParams ?? params;
|
|
366
|
+
const resolvedSearchParams = getResolvedSearchParams();
|
|
367
|
+
const runtimeFallbackShells = options.cacheComponents === true && request.method === "GET" && !isRscRequest && !isPrerenderFallbackShell && route.params ? createAppPprFallbackShells({
|
|
368
|
+
params: route.params,
|
|
369
|
+
pattern: route.pattern,
|
|
370
|
+
rootParamNames: route.rootParamNames
|
|
371
|
+
}, params) : [];
|
|
284
372
|
options.setNavigationContext({
|
|
285
373
|
pathname: canonicalPathname,
|
|
286
|
-
searchParams:
|
|
374
|
+
searchParams: resolvedSearchParams,
|
|
287
375
|
params: renderParams
|
|
288
376
|
});
|
|
289
377
|
const rootParams = pickRootParams(renderParams, route.rootParamNames);
|
|
290
378
|
setRootParams(rootParams);
|
|
291
379
|
if (route.routeHandler) {
|
|
292
380
|
setCurrentFetchSoftTags(buildPageCacheTags(cleanPathname, [], [...route.routeSegments], "route"));
|
|
381
|
+
const routeHandlerRequest = isEdgeRouteHandler(route.routeHandler) ? userlandRequest : normalizedUserlandRequest;
|
|
382
|
+
const routeHandlerUrl = new URL(routeHandlerRequest.url);
|
|
383
|
+
const internalRscValues = isEdgeRouteHandler(route.routeHandler) ? [] : routeHandlerUrl.searchParams.getAll(VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM);
|
|
384
|
+
routeHandlerUrl.search = resolvedSearchParams.toString();
|
|
385
|
+
for (const internalRscValue of internalRscValues) routeHandlerUrl.searchParams.append(VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM, internalRscValue);
|
|
293
386
|
return options.dispatchMatchedRouteHandler({
|
|
294
387
|
cleanPathname,
|
|
295
388
|
middlewareContext,
|
|
296
389
|
params: route.isDynamic ? renderParams : null,
|
|
297
|
-
request,
|
|
390
|
+
request: new Request(routeHandlerUrl, routeHandlerRequest),
|
|
298
391
|
route,
|
|
299
|
-
searchParams:
|
|
392
|
+
searchParams: resolvedSearchParams
|
|
300
393
|
});
|
|
301
394
|
}
|
|
302
395
|
const pageResponse = await options.dispatchMatchedPage({
|
|
@@ -313,12 +406,19 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
313
406
|
middlewareContext,
|
|
314
407
|
mountedSlotsHeader,
|
|
315
408
|
params: renderParams,
|
|
316
|
-
|
|
409
|
+
pprFallbackCacheShells: runtimeFallbackShells,
|
|
410
|
+
pprFallbackShell: isPrerenderFallbackShell ? {
|
|
411
|
+
fallbackParamNames: prerenderRouteParamsMatch.fallbackParamNames,
|
|
412
|
+
routePattern: route.pattern
|
|
413
|
+
} : void 0,
|
|
414
|
+
renderedConcreteUrlPaths: getRenderedConcreteUrlPathsForRoute(route.pattern),
|
|
415
|
+
skipStaticParamsValidation: isPrerenderFallbackShell,
|
|
416
|
+
staticParamsValidationParams: prerenderRouteParams === null || isPrerenderFallbackShell ? void 0 : params,
|
|
317
417
|
rootParams,
|
|
318
418
|
request,
|
|
319
419
|
route,
|
|
320
420
|
scriptNonce,
|
|
321
|
-
searchParams:
|
|
421
|
+
searchParams: resolvedSearchParams,
|
|
322
422
|
renderMode
|
|
323
423
|
});
|
|
324
424
|
if (isProgressiveActionRender) return applyProgressiveActionSideEffects(pageResponse, progressiveActionResult);
|
|
@@ -3,9 +3,9 @@ import { hasBasePath, stripBasePath } from "../utils/base-path.js";
|
|
|
3
3
|
import "./headers.js";
|
|
4
4
|
import { normalizePath } from "./normalize-path.js";
|
|
5
5
|
import { applyConfigHeadersToResponse } from "./request-pipeline.js";
|
|
6
|
+
import { applyCdnResponseHeaders } from "./cache-control.js";
|
|
6
7
|
import { VINEXT_RSC_VARY_HEADER } from "./app-rsc-cache-busting.js";
|
|
7
8
|
import { normalizeDefaultLocalePathname } from "./pages-i18n.js";
|
|
8
|
-
import { applyCdnResponseHeaders } from "./cache-control.js";
|
|
9
9
|
import { mergeVaryHeader } from "./middleware-response-headers.js";
|
|
10
10
|
//#region src/server/app-rsc-response-finalizer.ts
|
|
11
11
|
/**
|
|
@@ -29,6 +29,7 @@ type AppRscInterceptForMatching = {
|
|
|
29
29
|
* @see https://github.com/vercel/next.js/blob/canary/packages/next/src/lib/generate-interception-routes-rewrites.ts
|
|
30
30
|
*/
|
|
31
31
|
sourceMatchPattern?: string;
|
|
32
|
+
sourcePageSegments?: readonly string[];
|
|
32
33
|
interceptLayouts: readonly unknown[];
|
|
33
34
|
page: unknown;
|
|
34
35
|
__pageLoader?: (() => Promise<unknown>) | null;
|
|
@@ -41,6 +42,7 @@ type AppRscSlotForMatching = {
|
|
|
41
42
|
type AppRscSiblingInterceptForMatching = {
|
|
42
43
|
targetPattern: string;
|
|
43
44
|
sourceMatchPattern: string | null;
|
|
45
|
+
sourcePageSegments?: readonly string[];
|
|
44
46
|
slotId: string | null;
|
|
45
47
|
interceptLayouts: readonly unknown[];
|
|
46
48
|
page: unknown;
|
|
@@ -63,6 +65,7 @@ type AppRscInterceptLookupEntry = {
|
|
|
63
65
|
targetPatternParts: string[];
|
|
64
66
|
sourceMatchPattern: string | null;
|
|
65
67
|
sourceMatchPatternParts: string[] | null;
|
|
68
|
+
sourcePageSegments: readonly string[] | null;
|
|
66
69
|
interceptLayouts: readonly unknown[];
|
|
67
70
|
page: unknown;
|
|
68
71
|
__pageLoader?: (() => Promise<unknown>) | null;
|
|
@@ -78,6 +78,7 @@ function createInterceptLookup(routes) {
|
|
|
78
78
|
targetPatternParts: intercept.targetPattern.split("/").filter(Boolean),
|
|
79
79
|
sourceMatchPattern,
|
|
80
80
|
sourceMatchPatternParts,
|
|
81
|
+
sourcePageSegments: intercept.sourcePageSegments ?? null,
|
|
81
82
|
interceptLayouts: intercept.interceptLayouts,
|
|
82
83
|
page: intercept.page,
|
|
83
84
|
__pageLoader: intercept.__pageLoader,
|
|
@@ -96,6 +97,7 @@ function createInterceptLookup(routes) {
|
|
|
96
97
|
targetPatternParts: intercept.targetPattern.split("/").filter(Boolean),
|
|
97
98
|
sourceMatchPattern,
|
|
98
99
|
sourceMatchPatternParts,
|
|
100
|
+
sourcePageSegments: intercept.sourcePageSegments ?? null,
|
|
99
101
|
interceptLayouts: intercept.interceptLayouts,
|
|
100
102
|
page: intercept.page,
|
|
101
103
|
__pageLoader: intercept.__pageLoader,
|
|
@@ -33,6 +33,14 @@ type ResolveAppPageSegmentConfigOptions = {
|
|
|
33
33
|
*/
|
|
34
34
|
declare function resolveAppPageSegmentConfig(options: ResolveAppPageSegmentConfigOptions): EffectiveAppPageSegmentConfig;
|
|
35
35
|
declare function resolveAppPageFetchCacheMode(options: ResolveAppPageSegmentConfigOptions): FetchCacheMode | null;
|
|
36
|
+
/**
|
|
37
|
+
* Resolve the `fetchCache` segment config exported by a route handler module.
|
|
38
|
+
*
|
|
39
|
+
* Route handlers have no layout chain, so the module's own export applies
|
|
40
|
+
* directly. Mirrors upstream's app-route module, which copies
|
|
41
|
+
* `userland.fetchCache` into the work store before invoking the handler.
|
|
42
|
+
*/
|
|
43
|
+
declare function resolveAppRouteHandlerFetchCacheMode(handler: Pick<AppRouteSegmentConfigModule, "fetchCache">): FetchCacheMode | null;
|
|
36
44
|
declare function isEdgeRuntime(runtime: string | undefined): boolean;
|
|
37
45
|
//#endregion
|
|
38
|
-
export { isEdgeRuntime, resolveAppPageFetchCacheMode, resolveAppPageSegmentConfig };
|
|
46
|
+
export { isEdgeRuntime, resolveAppPageFetchCacheMode, resolveAppPageSegmentConfig, resolveAppRouteHandlerFetchCacheMode };
|
|
@@ -88,8 +88,7 @@ function resolveAppPageSegmentConfig(options) {
|
|
|
88
88
|
}
|
|
89
89
|
if (config.dynamicConfig === "force-dynamic") config.revalidateSeconds = 0;
|
|
90
90
|
if (config.fetchCache === void 0) {
|
|
91
|
-
if (config.dynamicConfig === "
|
|
92
|
-
else if (config.dynamicConfig === "error") config.fetchCache = "only-cache";
|
|
91
|
+
if (config.dynamicConfig === "error") config.fetchCache = "only-cache";
|
|
93
92
|
}
|
|
94
93
|
if (config.dynamicParamsConfig === void 0 && (config.dynamicConfig === "error" || config.dynamicConfig === "force-static")) config.dynamicParamsConfig = false;
|
|
95
94
|
return config;
|
|
@@ -97,8 +96,18 @@ function resolveAppPageSegmentConfig(options) {
|
|
|
97
96
|
function resolveAppPageFetchCacheMode(options) {
|
|
98
97
|
return resolveAppPageSegmentConfig(options).fetchCache ?? null;
|
|
99
98
|
}
|
|
99
|
+
/**
|
|
100
|
+
* Resolve the `fetchCache` segment config exported by a route handler module.
|
|
101
|
+
*
|
|
102
|
+
* Route handlers have no layout chain, so the module's own export applies
|
|
103
|
+
* directly. Mirrors upstream's app-route module, which copies
|
|
104
|
+
* `userland.fetchCache` into the work store before invoking the handler.
|
|
105
|
+
*/
|
|
106
|
+
function resolveAppRouteHandlerFetchCacheMode(handler) {
|
|
107
|
+
return isRouteSegmentFetchCache(handler.fetchCache) ? handler.fetchCache : null;
|
|
108
|
+
}
|
|
100
109
|
function isEdgeRuntime(runtime) {
|
|
101
110
|
return isEdgeApiRuntime(runtime);
|
|
102
111
|
}
|
|
103
112
|
//#endregion
|
|
104
|
-
export { isEdgeRuntime, resolveAppPageFetchCacheMode, resolveAppPageSegmentConfig };
|
|
113
|
+
export { isEdgeRuntime, resolveAppPageFetchCacheMode, resolveAppPageSegmentConfig, resolveAppRouteHandlerFetchCacheMode };
|
|
@@ -31,6 +31,17 @@ type AppServerActionRoute = {
|
|
|
31
31
|
pattern: string;
|
|
32
32
|
routeHandler?: unknown;
|
|
33
33
|
routeSegments?: readonly string[];
|
|
34
|
+
params?: readonly string[] | null;
|
|
35
|
+
slots?: Readonly<Record<string, {
|
|
36
|
+
default?: {
|
|
37
|
+
default?: unknown;
|
|
38
|
+
} | null;
|
|
39
|
+
page?: {
|
|
40
|
+
default?: unknown;
|
|
41
|
+
} | null;
|
|
42
|
+
slotPatternParts?: readonly string[] | null;
|
|
43
|
+
slotParamNames?: readonly string[] | null;
|
|
44
|
+
}>> | null;
|
|
34
45
|
};
|
|
35
46
|
/**
|
|
36
47
|
* Side-effect headers captured during a progressive (no-JS) server action's
|
|
@@ -162,6 +173,7 @@ type HandleServerActionRscRequestOptions<TElement, TRoute extends AppServerActio
|
|
|
162
173
|
renderToReadableStream: (model: AppServerActionRscModel<TElement>, options: RenderServerActionRscStreamOptions<TTemporaryReferences>) => BodyInit | null | Promise<BodyInit | null>;
|
|
163
174
|
reportRequestError: AppServerActionErrorReporter;
|
|
164
175
|
resolveRouteFetchCacheMode?: (route: TRoute) => FetchCacheMode | null;
|
|
176
|
+
resolveRouteDynamicConfig?: (route: TRoute) => string | null | undefined;
|
|
165
177
|
resolveRouteRuntime?: (route: TRoute) => AppServerActionRouteRuntime;
|
|
166
178
|
request: Request;
|
|
167
179
|
sanitizeErrorForClient: (error: unknown) => unknown;
|
|
@@ -7,7 +7,7 @@ import { validateCsrfOrigin, validateServerActionPayload } from "./request-pipel
|
|
|
7
7
|
import { headersContextFromRequest, setHeadersContext } from "../shims/headers.js";
|
|
8
8
|
import { getAndClearActionRevalidationKind } from "../shims/cache.js";
|
|
9
9
|
import { APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI } from "./app-rsc-render-mode.js";
|
|
10
|
-
import { setCurrentFetchCacheMode, setCurrentFetchSoftTags } from "../shims/fetch-cache.js";
|
|
10
|
+
import { setCurrentFetchCacheMode, setCurrentFetchSoftTags, setCurrentForceDynamicFetchDefault } from "../shims/fetch-cache.js";
|
|
11
11
|
import { VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityIdHeader } from "./app-rsc-cache-busting.js";
|
|
12
12
|
import { readStreamAsTextWithLimit } from "../utils/text-stream.js";
|
|
13
13
|
import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
|
|
@@ -15,8 +15,9 @@ import { applyEdgeRuntimeHeader } from "./app-page-response.js";
|
|
|
15
15
|
import { getNextErrorDigest, parseNextHttpErrorDigest, parseNextRedirectDigest } from "./next-error-digest.js";
|
|
16
16
|
import { createServerActionNotFoundResponse, getServerActionNotFoundMessage, isServerActionNotFoundError } from "./server-action-not-found.js";
|
|
17
17
|
import { deferUntilStreamConsumed } from "./app-page-stream.js";
|
|
18
|
+
import { buildAppPageTags } from "./implicit-tags.js";
|
|
19
|
+
import { resolveAppPageNavigationParams } from "./app-page-element-builder.js";
|
|
18
20
|
import { resolveAppPageActionRerenderTarget } from "./app-page-request.js";
|
|
19
|
-
import { buildPageCacheTags } from "./implicit-tags.js";
|
|
20
21
|
import { getSetCookieName } from "./cookie-utils.js";
|
|
21
22
|
//#region src/server/app-server-action-execution.ts
|
|
22
23
|
/**
|
|
@@ -45,6 +46,10 @@ function resolveActionRevalidationKind(hasModifiedCookies) {
|
|
|
45
46
|
if (hasModifiedCookies) return ACTION_DID_REVALIDATE_STATIC_AND_DYNAMIC;
|
|
46
47
|
return revalidationKind;
|
|
47
48
|
}
|
|
49
|
+
function clearRejectedActionSideEffects(getAndClearPendingCookies) {
|
|
50
|
+
getAndClearPendingCookies();
|
|
51
|
+
getAndClearActionRevalidationKind();
|
|
52
|
+
}
|
|
48
53
|
function cloneActionRedirectHeaders(requestHeaders) {
|
|
49
54
|
const headers = new Headers(requestHeaders);
|
|
50
55
|
for (const header of ACTION_REDIRECT_RENDER_STRIPPED_HEADERS) headers.delete(header);
|
|
@@ -232,7 +237,7 @@ function applyActionRedirectBasePath(url, basePath) {
|
|
|
232
237
|
return `${addBasePathToPathname(pathname, basePath)}${suffix}`;
|
|
233
238
|
}
|
|
234
239
|
function buildServerActionPageTags(route, pathname) {
|
|
235
|
-
return
|
|
240
|
+
return buildAppPageTags(pathname, [], route.routeSegments ?? []);
|
|
236
241
|
}
|
|
237
242
|
function resolveInternalActionRedirectTarget(redirectUrl, requestUrl, basePath) {
|
|
238
243
|
if (isExternalUrl(redirectUrl)) {
|
|
@@ -330,6 +335,7 @@ async function handleProgressiveServerActionRequest(options) {
|
|
|
330
335
|
}
|
|
331
336
|
const payloadResponse = await validateServerActionPayload(body);
|
|
332
337
|
if (payloadResponse) {
|
|
338
|
+
clearRejectedActionSideEffects(options.getAndClearPendingCookies);
|
|
333
339
|
options.clearRequestContext();
|
|
334
340
|
return payloadResponse;
|
|
335
341
|
}
|
|
@@ -481,6 +487,24 @@ async function handleServerActionRscRequest(options) {
|
|
|
481
487
|
if (csrfResponse) return csrfResponse;
|
|
482
488
|
if (parseInt(options.request.headers.get("content-length") || "0", 10) > options.maxActionBodySize) return renderFetchActionBodyExceededResponse(options);
|
|
483
489
|
try {
|
|
490
|
+
let action;
|
|
491
|
+
if (options.contentType.startsWith("multipart/form-data")) {
|
|
492
|
+
let loadedAction;
|
|
493
|
+
try {
|
|
494
|
+
loadedAction = await options.loadServerAction(options.actionId);
|
|
495
|
+
} catch (error) {
|
|
496
|
+
if (isServerActionNotFoundError(error, options.actionId)) return createActionNotFoundResponse(options.actionId, {
|
|
497
|
+
clearRequestContext: options.clearRequestContext,
|
|
498
|
+
getAndClearPendingCookies: options.getAndClearPendingCookies
|
|
499
|
+
});
|
|
500
|
+
throw error;
|
|
501
|
+
}
|
|
502
|
+
if (!isAppServerActionFunction(loadedAction)) return createActionNotFoundResponse(options.actionId, {
|
|
503
|
+
clearRequestContext: options.clearRequestContext,
|
|
504
|
+
getAndClearPendingCookies: options.getAndClearPendingCookies
|
|
505
|
+
});
|
|
506
|
+
action = loadedAction;
|
|
507
|
+
}
|
|
484
508
|
let body;
|
|
485
509
|
try {
|
|
486
510
|
body = options.contentType.startsWith("multipart/form-data") ? await options.readFormDataWithLimit(options.request, options.maxActionBodySize) : await options.readBodyWithLimit(options.request, options.maxActionBodySize);
|
|
@@ -490,23 +514,27 @@ async function handleServerActionRscRequest(options) {
|
|
|
490
514
|
}
|
|
491
515
|
const payloadResponse = await validateServerActionPayload(body);
|
|
492
516
|
if (payloadResponse) {
|
|
517
|
+
clearRejectedActionSideEffects(options.getAndClearPendingCookies);
|
|
493
518
|
options.clearRequestContext();
|
|
494
519
|
return payloadResponse;
|
|
495
520
|
}
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
521
|
+
if (action === void 0) {
|
|
522
|
+
let loadedAction;
|
|
523
|
+
try {
|
|
524
|
+
loadedAction = await options.loadServerAction(options.actionId);
|
|
525
|
+
} catch (error) {
|
|
526
|
+
if (isServerActionNotFoundError(error, options.actionId)) return createActionNotFoundResponse(options.actionId, {
|
|
527
|
+
clearRequestContext: options.clearRequestContext,
|
|
528
|
+
getAndClearPendingCookies: options.getAndClearPendingCookies
|
|
529
|
+
});
|
|
530
|
+
throw error;
|
|
531
|
+
}
|
|
532
|
+
if (!isAppServerActionFunction(loadedAction)) return createActionNotFoundResponse(options.actionId, {
|
|
501
533
|
clearRequestContext: options.clearRequestContext,
|
|
502
534
|
getAndClearPendingCookies: options.getAndClearPendingCookies
|
|
503
535
|
});
|
|
504
|
-
|
|
536
|
+
action = loadedAction;
|
|
505
537
|
}
|
|
506
|
-
if (!isAppServerActionFunction(action)) return createActionNotFoundResponse(options.actionId, {
|
|
507
|
-
clearRequestContext: options.clearRequestContext,
|
|
508
|
-
getAndClearPendingCookies: options.getAndClearPendingCookies
|
|
509
|
-
});
|
|
510
538
|
const temporaryReferences = options.createTemporaryReferenceSet();
|
|
511
539
|
const args = await options.decodeReply(body, { temporaryReferences });
|
|
512
540
|
let returnValue;
|
|
@@ -591,12 +619,14 @@ async function handleServerActionRscRequest(options) {
|
|
|
591
619
|
url: redirectTarget
|
|
592
620
|
});
|
|
593
621
|
setHeadersContext(headersContextFromRequest(redirectRenderRequest));
|
|
622
|
+
const redirectNavigationParams = resolveAppPageNavigationParams(targetMatch.route, targetMatch.params, targetPathname, null);
|
|
594
623
|
options.setNavigationContext({
|
|
595
624
|
pathname: targetPathname,
|
|
596
625
|
searchParams: redirectTarget.searchParams,
|
|
597
|
-
params:
|
|
626
|
+
params: redirectNavigationParams
|
|
598
627
|
});
|
|
599
628
|
setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(targetMatch.route) ?? null);
|
|
629
|
+
setCurrentForceDynamicFetchDefault(options.resolveRouteDynamicConfig?.(targetMatch.route) === "force-dynamic");
|
|
600
630
|
setCurrentFetchSoftTags(buildServerActionPageTags(targetMatch.route, targetPathname));
|
|
601
631
|
const element = options.buildPageElement({
|
|
602
632
|
cleanPathname: targetPathname,
|
|
@@ -667,13 +697,15 @@ async function handleServerActionRscRequest(options) {
|
|
|
667
697
|
isRscRequest: options.isRscRequest,
|
|
668
698
|
toInterceptOpts: options.toInterceptOpts
|
|
669
699
|
});
|
|
700
|
+
const resolvedActionNavigationParams = resolveAppPageNavigationParams(actionRerenderTarget.route, actionRerenderTarget.navigationParams, options.cleanPathname, actionRerenderTarget.interceptOpts);
|
|
670
701
|
options.setNavigationContext({
|
|
671
702
|
pathname: options.cleanPathname,
|
|
672
703
|
searchParams: options.searchParams,
|
|
673
|
-
params:
|
|
704
|
+
params: resolvedActionNavigationParams
|
|
674
705
|
});
|
|
675
706
|
await options.ensureRouteLoaded?.(actionRerenderTarget.route);
|
|
676
707
|
setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(actionRerenderTarget.route) ?? null);
|
|
708
|
+
setCurrentForceDynamicFetchDefault(options.resolveRouteDynamicConfig?.(actionRerenderTarget.route) === "force-dynamic");
|
|
677
709
|
setCurrentFetchSoftTags(buildServerActionPageTags(actionRerenderTarget.route, options.cleanPathname));
|
|
678
710
|
element = options.buildPageElement({
|
|
679
711
|
cleanPathname: options.cleanPathname,
|
|
@@ -22,6 +22,7 @@ declare function handleSsr(rscStream: ReadableStream<Uint8Array>, navContext: Na
|
|
|
22
22
|
capturedRscDataRef?: {
|
|
23
23
|
value: Promise<ArrayBuffer> | null;
|
|
24
24
|
};
|
|
25
|
+
pprFallbackShellSignal?: AbortSignal;
|
|
25
26
|
formState?: ReactFormState | null;
|
|
26
27
|
basePath?: string;
|
|
27
28
|
/**
|
|
@@ -42,6 +43,7 @@ declare function handleSsr(rscStream: ReadableStream<Uint8Array>, navContext: Na
|
|
|
42
43
|
* to resolve before returning the HTML stream. Used for static prerender
|
|
43
44
|
* and ISR cache writes to avoid caching fallback content. */
|
|
44
45
|
waitForAllReady?: boolean;
|
|
46
|
+
fallbackToErrorDocumentOnShellError?: boolean;
|
|
45
47
|
}): Promise<AppSsrRenderResult>;
|
|
46
48
|
declare const _default: {
|
|
47
49
|
fetch(request: Request): Promise<Response>;
|