vinext 1.4.1 → 1.4.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 +5 -2
- package/dist/build/action-owner-manifest.js +1 -0
- package/dist/build/prerender-paths.d.ts +11 -1
- package/dist/build/prerender-paths.js +36 -10
- package/dist/check.js +1 -1
- package/dist/cli.js +1 -1
- package/dist/client/dev-error-overlay.d.ts +2 -1
- package/dist/client/dev-error-overlay.js +8 -3
- package/dist/config/config-matchers.js +8 -4
- package/dist/config/destination-params.js +5 -2
- package/dist/config/next-config.d.ts +25 -1
- package/dist/config/next-config.js +31 -1
- package/dist/entries/app-rsc-entry.js +65 -30
- package/dist/entries/app-rsc-manifest.js +4 -0
- package/dist/entries/pages-server-entry.js +19 -4
- package/dist/index.js +37 -37
- package/dist/init-cloudflare.js +18 -2
- package/dist/init-platform.js +2 -2
- package/dist/init.js +42 -5
- package/dist/plugins/css-target.d.ts +18 -0
- package/dist/plugins/css-target.js +93 -0
- package/dist/routing/app-route-graph.d.ts +10 -0
- package/dist/routing/app-route-graph.js +15 -1
- package/dist/server/api-handler.d.ts +2 -0
- package/dist/server/api-handler.js +10 -8
- package/dist/server/app-action-forwarding.js +3 -1
- package/dist/server/app-browser-entry.js +37 -41
- package/dist/server/app-browser-error.d.ts +1 -1
- package/dist/server/app-browser-error.js +13 -4
- package/dist/server/app-browser-supplemental-refresh.d.ts +13 -0
- package/dist/server/app-browser-supplemental-refresh.js +36 -4
- package/dist/server/app-elements.d.ts +3 -0
- package/dist/server/app-elements.js +14 -1
- package/dist/server/app-fallback-renderer.js +2 -2
- package/dist/server/app-middleware.d.ts +2 -0
- package/dist/server/app-middleware.js +1 -0
- package/dist/server/app-optimistic-routing.d.ts +12 -1
- package/dist/server/app-optimistic-routing.js +38 -16
- package/dist/server/app-page-boundary-render.js +4 -2
- package/dist/server/app-page-cache-render.js +1 -1
- package/dist/server/app-page-dispatch.d.ts +11 -1
- package/dist/server/app-page-dispatch.js +78 -31
- package/dist/server/app-page-element-builder.d.ts +11 -20
- package/dist/server/app-page-element-builder.js +39 -50
- package/dist/server/app-page-intercept-segment-config.d.ts +56 -0
- package/dist/server/app-page-intercept-segment-config.js +90 -0
- package/dist/server/app-page-navigation-params.d.ts +23 -0
- package/dist/server/app-page-navigation-params.js +49 -0
- package/dist/server/app-page-render.d.ts +5 -2
- package/dist/server/app-page-render.js +17 -3
- package/dist/server/app-page-request.d.ts +24 -2
- package/dist/server/app-page-request.js +10 -10
- package/dist/server/app-page-route-wiring.d.ts +17 -5
- package/dist/server/app-page-route-wiring.js +19 -13
- package/dist/server/app-page-segment-plan.js +9 -1
- package/dist/server/app-page-segment-state.d.ts +9 -0
- package/dist/server/app-page-segment-state.js +54 -1
- package/dist/server/app-pages-bridge.d.ts +6 -0
- package/dist/server/app-pages-bridge.js +8 -3
- package/dist/server/app-request-stage-independent-entry.js +2 -3
- package/dist/server/app-response-stage-entry.js +1 -0
- package/dist/server/app-route-module-loader.d.ts +2 -0
- package/dist/server/app-route-module-loader.js +1 -0
- package/dist/server/app-router-entry.js +2 -3
- package/dist/server/app-rsc-cache-busting.d.ts +8 -0
- package/dist/server/app-rsc-cache-busting.js +13 -1
- package/dist/server/app-rsc-combined-handler.js +2 -1
- package/dist/server/app-rsc-handler.d.ts +14 -1
- package/dist/server/app-rsc-handler.js +111 -62
- package/dist/server/app-rsc-response-finalizer.d.ts +18 -3
- package/dist/server/app-rsc-response-finalizer.js +61 -7
- package/dist/server/app-rsc-route-matching.d.ts +14 -0
- package/dist/server/app-rsc-route-matching.js +42 -18
- package/dist/server/app-server-action-execution.js +16 -10
- package/dist/server/app-ssr-entry.js +8 -0
- package/dist/server/cache-control.d.ts +2 -0
- package/dist/server/cache-control.js +3 -1
- package/dist/server/config-headers.d.ts +7 -0
- package/dist/server/config-headers.js +20 -1
- package/dist/server/image-animation.d.ts +9 -0
- package/dist/server/image-animation.js +118 -0
- package/dist/server/image-local-patterns.d.ts +21 -0
- package/dist/server/image-local-patterns.js +59 -0
- package/dist/server/image-optimization.d.ts +48 -27
- package/dist/server/image-optimization.js +316 -22
- package/dist/server/image-source-reader.d.ts +34 -0
- package/dist/server/image-source-reader.js +126 -0
- package/dist/server/metadata-route-response.d.ts +6 -1
- package/dist/server/metadata-route-response.js +46 -10
- package/dist/server/middleware-matcher.d.ts +1 -0
- package/dist/server/middleware-matcher.js +1 -1
- package/dist/server/middleware-runtime.d.ts +5 -0
- package/dist/server/middleware-runtime.js +48 -15
- package/dist/server/middleware.d.ts +1 -1
- package/dist/server/middleware.js +2 -1
- package/dist/server/nitro-public-files-plugin.js +20 -8
- package/dist/server/nitro-request-target-plugin.d.ts +17 -0
- package/dist/server/nitro-request-target-plugin.js +22 -0
- package/dist/server/open-redirect.d.ts +2 -1
- package/dist/server/open-redirect.js +2 -1
- package/dist/server/pages-client-assets.d.ts +1 -0
- package/dist/server/pages-data-route.d.ts +5 -1
- package/dist/server/pages-data-route.js +14 -6
- package/dist/server/pages-i18n.d.ts +7 -0
- package/dist/server/pages-i18n.js +14 -1
- package/dist/server/pages-node-compat.js +7 -3
- package/dist/server/pages-page-handler.js +4 -4
- package/dist/server/pages-request-pipeline.d.ts +9 -0
- package/dist/server/pages-request-pipeline.js +35 -15
- package/dist/server/pages-request-stage-entry.js +8 -2
- package/dist/server/pages-router-entry.js +3 -0
- package/dist/server/prod-server.d.ts +1 -1
- package/dist/server/prod-server.js +64 -62
- package/dist/server/request-pipeline.d.ts +5 -0
- package/dist/server/request-pipeline.js +11 -1
- package/dist/server/response-stage-cacheability.d.ts +7 -0
- package/dist/server/response-stage-cacheability.js +6 -5
- package/dist/server/srvx-middleware-origin.d.ts +13 -0
- package/dist/server/srvx-middleware-origin.js +19 -0
- package/dist/server/srvx-request-target.d.ts +12 -0
- package/dist/server/srvx-request-target.js +20 -0
- package/dist/server/static-file-cache.js +10 -22
- package/dist/server/worker-image-optimization.d.ts +10 -3
- package/dist/server/worker-image-optimization.js +43 -9
- package/dist/server/worker-revalidation-context.js +1 -0
- package/dist/server/worker-utils.d.ts +8 -0
- package/dist/server/worker-utils.js +19 -2
- package/dist/shims/error-boundary.d.ts +6 -2
- package/dist/shims/error-boundary.js +4 -2
- package/dist/shims/image-props.d.ts +6 -0
- package/dist/shims/image-props.js +39 -3
- package/dist/shims/image.js +3 -3
- package/dist/shims/request-context.d.ts +3 -1
- package/dist/shims/slot.d.ts +3 -0
- package/dist/shims/slot.js +67 -9
- package/dist/shims/url-utils.js +6 -1
- package/dist/utils/base-path.d.ts +7 -0
- package/dist/utils/base-path.js +11 -1
- package/dist/utils/client-entry-manifest.d.ts +5 -0
- package/dist/utils/client-entry-manifest.js +1 -0
- package/dist/utils/client-runtime-metadata.d.ts +5 -0
- package/dist/utils/client-runtime-metadata.js +33 -7
- package/package.json +1 -1
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { stripBasePath } from "../utils/base-path.js";
|
|
1
2
|
import { cloneRequestWithHeaders, cloneRequestWithUrl } from "./request-pipeline.js";
|
|
2
3
|
import { getRequestExecutionContext } from "../shims/request-context.js";
|
|
4
|
+
import { isLocaleRedirect, markLocaleRedirect } from "./pages-i18n.js";
|
|
3
5
|
import { beginRouteCacheability, markRouteCacheabilityDynamic } from "../shims/cacheability-classification.js";
|
|
4
6
|
import { mergeHeaders } from "./worker-utils.js";
|
|
5
7
|
import { pagesRouteHasPriorityOverAppRoute } from "./hybrid-route-priority.js";
|
|
@@ -18,7 +20,7 @@ function applyPagesMiddlewareContext(response, middlewareContext) {
|
|
|
18
20
|
* Fallback handler to route App Router requests to the Pages Router when no App Router route matches.
|
|
19
21
|
*/
|
|
20
22
|
async function renderPagesFallback(options, dependencies) {
|
|
21
|
-
const { allowRscDocumentFallback = false, appRouteMatch = null, isDataRequest = false, isRscRequest, initialResponseHeaders, matchKind, middlewareContext, pathname = options.url.pathname, pagesDataRequest = null, request, sharedAcrossHosts = false, url } = options;
|
|
23
|
+
const { allowRscDocumentFallback = false, appRouteMatch = null, isDataRequest = false, isRscRequest, initialResponseHeaders, matchKind, middlewareContext, pathname = options.url.pathname, pagesDataRequest = null, request, requestBasePath = "", sharedAcrossHosts = false, url } = options;
|
|
22
24
|
const { loadPagesEntry, buildRequestHeaders, applyRouteHandlerMiddlewareContext, getDraftModeCookieHeader } = dependencies;
|
|
23
25
|
if (isRscRequest && !allowRscDocumentFallback) return null;
|
|
24
26
|
const pagesEntry = await loadPagesEntry();
|
|
@@ -67,8 +69,10 @@ async function renderPagesFallback(options, dependencies) {
|
|
|
67
69
|
if (runtimeDataKind === "server" || runtimeDataKind === "initial") markRouteCacheabilityDynamic("getInitialProps render shares a cache entry across hosts");
|
|
68
70
|
}
|
|
69
71
|
const pagesRequest = claimPagesRequest();
|
|
72
|
+
const renderRequestUrl = new URL(pagesDataRequest?.url ?? pagesRequest.url);
|
|
73
|
+
if (!pagesDataRequest) renderRequestUrl.pathname = stripBasePath(renderRequestUrl.pathname, requestBasePath);
|
|
70
74
|
const renderArgs = [
|
|
71
|
-
|
|
75
|
+
renderRequestUrl.href === pagesRequest.url ? pagesRequest : cloneRequestWithUrl(pagesRequest, renderRequestUrl.href),
|
|
72
76
|
pagesUrl,
|
|
73
77
|
{},
|
|
74
78
|
getRequestExecutionContext() ?? void 0,
|
|
@@ -76,7 +80,8 @@ async function renderPagesFallback(options, dependencies) {
|
|
|
76
80
|
];
|
|
77
81
|
const pagesRes = isDataRequest ? await (initialResponseHeaders ? pagesEntry.renderPage(...renderArgs, { isDataReq: true }, initialResponseHeaders) : pagesEntry.renderPage(...renderArgs, { isDataReq: true })) : await (initialResponseHeaders ? pagesEntry.renderPage(...renderArgs, void 0, initialResponseHeaders) : pagesEntry.renderPage(...renderArgs));
|
|
78
82
|
if (pagesRes.status === 404 && pageMatch === null) return null;
|
|
79
|
-
|
|
83
|
+
const response = applyDraftModeCookie(applyPagesMiddlewareContext(pagesRes, middlewareContext), getDraftModeCookieHeader());
|
|
84
|
+
return isLocaleRedirect(pagesRes) ? markLocaleRedirect(response) : response;
|
|
80
85
|
}
|
|
81
86
|
/**
|
|
82
87
|
* Append a middleware-emitted `__prerender_bypass` Set-Cookie header to a Pages
|
|
@@ -9,7 +9,7 @@ import "./server-globals.js";
|
|
|
9
9
|
import { getExplicitCdnCacheAdapter } from "../shims/cdn-cache-state.js";
|
|
10
10
|
import { applyCdnResponseIdentityHeaders, validateCdnRequest } from "./cache-control.js";
|
|
11
11
|
import { registerLazyDataCacheHandler } from "../shims/cache-handler.js";
|
|
12
|
-
import {
|
|
12
|
+
import { readImageOptimizationSignal } from "./image-optimization.js";
|
|
13
13
|
import { consumeFrameworkRequestRoute, traceFrameworkRequest } from "./request-tracing.js";
|
|
14
14
|
import { createStaticAssetRequest, resolveStaticAssetSignal } from "./worker-utils.js";
|
|
15
15
|
import { readTrustedPrerenderStateFromHeaders } from "./prerender-route-params.js";
|
|
@@ -75,7 +75,6 @@ async function handleRequest(request, env, platformCtx, dispatchResponseStage, a
|
|
|
75
75
|
if (cdnValidationResponse) return cdnValidationResponse;
|
|
76
76
|
}
|
|
77
77
|
const url = new URL(request.url);
|
|
78
|
-
const servesImages = Boolean(assets) && getImageOptimizer() !== null;
|
|
79
78
|
const protocolRelativeGuard = guardProtocolRelativeUrl(url.pathname, url.search);
|
|
80
79
|
if (protocolRelativeGuard) return protocolRelativeGuard;
|
|
81
80
|
try {
|
|
@@ -104,7 +103,7 @@ async function handleRequest(request, env, platformCtx, dispatchResponseStage, a
|
|
|
104
103
|
};
|
|
105
104
|
const handle = () => requestRscHandler(request, ctx, trackedDispatchResponseStage, probeMode, ctx.isPrerenderPathDiscovery === true, trustedPrerenderState);
|
|
106
105
|
let response = await runWithExecutionContext(ctx, handle);
|
|
107
|
-
const imageSignal =
|
|
106
|
+
const imageSignal = assets ? readImageOptimizationSignal(response) : null;
|
|
108
107
|
if (imageSignal && assets) {
|
|
109
108
|
const { fetchSignalledPublicFile, serveWorkerImageOptimization } = await import("./worker-image-optimization.js");
|
|
110
109
|
response = await serveWorkerImageOptimization(request, imageSignal, __imageAllowedWidths, __imageConfig, {
|
|
@@ -58,6 +58,7 @@ async function handleResponseStage(request, env, platformCtx, props, dispatchReq
|
|
|
58
58
|
probeMode: props.cacheability.probeMode,
|
|
59
59
|
rawManifest: __cacheabilityManifest,
|
|
60
60
|
recomposesRequestScopedHeaders: props.kind === "app-page" && props.isRscRequest,
|
|
61
|
+
keepsParamsHeader: props.kind === "app-page" && props.interceptionContext !== null,
|
|
61
62
|
registerCacheAdapters: () => registerConfiguredCacheAdapters(env),
|
|
62
63
|
request,
|
|
63
64
|
representation: props.cacheability.representation,
|
|
@@ -67,6 +67,7 @@ type LazyLoadableSlot = {
|
|
|
67
67
|
loading?: unknown;
|
|
68
68
|
loadings?: readonly unknown[];
|
|
69
69
|
error?: unknown;
|
|
70
|
+
errors?: readonly unknown[];
|
|
70
71
|
notFound?: unknown;
|
|
71
72
|
notFounds?: readonly unknown[];
|
|
72
73
|
__loadPage?: LazyModuleThunk | null;
|
|
@@ -76,6 +77,7 @@ type LazyLoadableSlot = {
|
|
|
76
77
|
__loadLoading?: LazyModuleThunk | null;
|
|
77
78
|
__loadLoadings?: LazyModuleLoaderArray | null;
|
|
78
79
|
__loadError?: LazyModuleThunk | null;
|
|
80
|
+
__loadErrors?: LazyModuleLoaderArray | null;
|
|
79
81
|
__loadNotFound?: LazyModuleThunk | null;
|
|
80
82
|
__loadNotFounds?: LazyModuleLoaderArray | null;
|
|
81
83
|
/** Hydrated only after an intercept matches, not with the slot's base modules. */
|
|
@@ -145,6 +145,7 @@ function ensureAppRouteModulesLoaded(route) {
|
|
|
145
145
|
pushFieldLoad(loads, slot, "loading", slot.__loadLoading);
|
|
146
146
|
pushArrayLoads(loads, slot.loadings, slot.__loadLoadings);
|
|
147
147
|
pushFieldLoad(loads, slot, "error", slot.__loadError);
|
|
148
|
+
pushArrayLoads(loads, slot.errors, slot.__loadErrors);
|
|
148
149
|
pushFieldLoad(loads, slot, "notFound", slot.__loadNotFound);
|
|
149
150
|
pushArrayLoads(loads, slot.notFounds, slot.__loadNotFounds);
|
|
150
151
|
}
|
|
@@ -8,7 +8,7 @@ import { runWithExecutionContext } from "../shims/request-context.js";
|
|
|
8
8
|
import "./server-globals.js";
|
|
9
9
|
import { getCdnCacheAdapter } from "../shims/cdn-cache.js";
|
|
10
10
|
import { applyCdnResponseIdentityHeaders, validateCdnRequest } from "./cache-control.js";
|
|
11
|
-
import {
|
|
11
|
+
import { readImageOptimizationSignal } from "./image-optimization.js";
|
|
12
12
|
import { traceFrameworkRequest } from "./request-tracing.js";
|
|
13
13
|
import { createStaticAssetRequest, resolveStaticAssetSignal } from "./worker-utils.js";
|
|
14
14
|
import { readTrustedPrerenderRouteParams, serializePrerenderRouteParamsHeader } from "./prerender-route-params.js";
|
|
@@ -83,7 +83,6 @@ async function handleRequest(request, env, platformCtx) {
|
|
|
83
83
|
const cdnValidationResponse = await validateCdnRequest(request);
|
|
84
84
|
if (cdnValidationResponse) return cdnValidationResponse;
|
|
85
85
|
const url = new URL(request.url);
|
|
86
|
-
const servesImages = Boolean(assets) && getImageOptimizer() !== null;
|
|
87
86
|
const protocolRelativeGuard = guardProtocolRelativeUrl(url.pathname, url.search);
|
|
88
87
|
if (protocolRelativeGuard) return protocolRelativeGuard;
|
|
89
88
|
try {
|
|
@@ -109,7 +108,7 @@ async function handleRequest(request, env, platformCtx) {
|
|
|
109
108
|
const result = await (ctx ? runWithExecutionContext(ctx, handleFn) : handleFn());
|
|
110
109
|
if (result instanceof Response) {
|
|
111
110
|
let response = result;
|
|
112
|
-
const imageSignal =
|
|
111
|
+
const imageSignal = assets ? readImageOptimizationSignal(response) : null;
|
|
113
112
|
if (imageSignal && assets) {
|
|
114
113
|
const { fetchSignalledPublicFile, serveWorkerImageOptimization } = await import("./worker-image-optimization.js");
|
|
115
114
|
response = await serveWorkerImageOptimization(request, imageSignal, __imageAllowedWidths, __imageConfig, {
|
|
@@ -78,6 +78,14 @@ export declare function createRscRequestHeaders(options?: CreateRscRequestHeader
|
|
|
78
78
|
* their bytes can legitimately differ from the destination's full route.
|
|
79
79
|
*/
|
|
80
80
|
export declare function canonicalizePrewarmableRscRequestHeaders(headers: Headers): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Convert a search-param shell prefetch to the canonical navigation of its
|
|
83
|
+
* page. The shell renders the page with an empty query (app-page-dispatch.ts),
|
|
84
|
+
* which is what the query-free navigation renders, as Next.js's static
|
|
85
|
+
* prefetch of a page segment never varies on search params. The caller drops
|
|
86
|
+
* the query from the URL.
|
|
87
|
+
*/
|
|
88
|
+
export declare function canonicalizeDynamicShellRscRequestHeaders(headers: Headers): boolean;
|
|
81
89
|
/**
|
|
82
90
|
* Convert an ordinary loading-boundary prefetch to the shared loading-shell
|
|
83
91
|
* variant. The payload is selected by the three retained mode headers; visible
|
|
@@ -199,6 +199,18 @@ function canonicalizePrewarmableRscRequestHeaders(headers) {
|
|
|
199
199
|
return true;
|
|
200
200
|
}
|
|
201
201
|
/**
|
|
202
|
+
* Convert a search-param shell prefetch to the canonical navigation of its
|
|
203
|
+
* page. The shell renders the page with an empty query (app-page-dispatch.ts),
|
|
204
|
+
* which is what the query-free navigation renders, as Next.js's static
|
|
205
|
+
* prefetch of a page segment never varies on search params. The caller drops
|
|
206
|
+
* the query from the URL.
|
|
207
|
+
*/
|
|
208
|
+
function canonicalizeDynamicShellRscRequestHeaders(headers) {
|
|
209
|
+
if (headers.get("X-Vinext-Rsc-Render-Mode") !== "prefetch-dynamic-shell" || headers.has("X-Vinext-Interception-Context") || headers.has("X-Vinext-Interception-Id") || headers.has("X-Vinext-Mounted-Slots")) return false;
|
|
210
|
+
headers.delete(VINEXT_RSC_RENDER_MODE_HEADER);
|
|
211
|
+
return canonicalizePrewarmableRscRequestHeaders(headers);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
202
214
|
* Convert an ordinary loading-boundary prefetch to the shared loading-shell
|
|
203
215
|
* variant. The payload is selected by the three retained mode headers; visible
|
|
204
216
|
* router state is transport context and must not fragment the shared response.
|
|
@@ -285,4 +297,4 @@ async function resolveInvalidRscCacheBustingRequest(options) {
|
|
|
285
297
|
});
|
|
286
298
|
}
|
|
287
299
|
//#endregion
|
|
288
|
-
export { VINEXT_RSC_BUILD_ID_HEADER, VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM, VINEXT_RSC_COMPATIBILITY_ID_HEADER, VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_RENDER_MODE_HEADER, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityIdHeader, applyRscDeploymentIdHeader, canonicalizeLoadingShellRscRequestHeaders, canonicalizePrewarmableRscRequestHeaders, computeRscCacheBustingSearchParam, createCanonicalLoadingShellRscRequestHeaders, createCanonicalRscRequestHeaders, createCanonicalRscRequestUrl, createRscRedirectLocation, createRscRequestHeaders, createRscRequestUrl, createServerActionRequestUrl, formatRscRequestPath, getVinextRscCompatibilityId, hasRscCacheBustingSearchParam, isRscCompatibilityIdCompatible, keepOnlyValidatedRscCacheBustingSearchParam, parseRscRequestPath, resolveHardNavigationTargetFromRscResponse, resolveInvalidRscCacheBustingRequest, resolveRscCompatibilityNavigationDecision, setRscCacheBustingSearchParam, stripRscCacheBustingSearchParam, toPathAbsolutePathname };
|
|
300
|
+
export { VINEXT_RSC_BUILD_ID_HEADER, VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM, VINEXT_RSC_COMPATIBILITY_ID_HEADER, VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_RENDER_MODE_HEADER, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityIdHeader, applyRscDeploymentIdHeader, canonicalizeDynamicShellRscRequestHeaders, canonicalizeLoadingShellRscRequestHeaders, canonicalizePrewarmableRscRequestHeaders, computeRscCacheBustingSearchParam, createCanonicalLoadingShellRscRequestHeaders, createCanonicalRscRequestHeaders, createCanonicalRscRequestUrl, createRscRedirectLocation, createRscRequestHeaders, createRscRequestUrl, createServerActionRequestUrl, formatRscRequestPath, getVinextRscCompatibilityId, hasRscCacheBustingSearchParam, isRscCompatibilityIdCompatible, keepOnlyValidatedRscCacheBustingSearchParam, parseRscRequestPath, resolveHardNavigationTargetFromRscResponse, resolveInvalidRscCacheBustingRequest, resolveRscCompatibilityNavigationDecision, setRscCacheBustingSearchParam, stripRscCacheBustingSearchParam, toPathAbsolutePathname };
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { getRequestExecutionContext, runWithExecutionContext } from "../shims/request-context.js";
|
|
2
2
|
import { createWorkerRevalidationContext } from "./worker-revalidation-context.js";
|
|
3
3
|
import { createAppRscRequestHandler } from "./app-rsc-handler.js";
|
|
4
|
+
import { resolveSrvxMiddlewareOrigin } from "./srvx-middleware-origin.js";
|
|
4
5
|
//#region src/server/app-rsc-combined-handler.ts
|
|
5
6
|
/** Combined request/response handler used by default single-stage App entries. */
|
|
6
7
|
function createAppRscHandler(options) {
|
|
7
8
|
const appRscRequestHandler = createAppRscRequestHandler(options);
|
|
8
9
|
const appRscHandler = (request, ctx, ...rest) => {
|
|
9
10
|
if (ctx != null || getRequestExecutionContext()) return appRscRequestHandler(request, ctx, ...rest);
|
|
10
|
-
const executionContext = createWorkerRevalidationContext(
|
|
11
|
+
const executionContext = createWorkerRevalidationContext({ middlewareOrigin: resolveSrvxMiddlewareOrigin(request) }, (internalRequest, internalCtx) => runWithExecutionContext(internalCtx, () => appRscRequestHandler(internalRequest, internalCtx)), "node");
|
|
11
12
|
return runWithExecutionContext(executionContext, () => appRscRequestHandler(request, ctx, ...rest));
|
|
12
13
|
};
|
|
13
14
|
return Object.assign(appRscHandler, { handleResponseStage(request, ctx, props, stageOptions) {
|
|
@@ -6,6 +6,7 @@ import { ExecutionContextLike } from "../shims/request-context.js";
|
|
|
6
6
|
import { AppMiddlewareContext, ApplyAppMiddlewareResult } from "./app-middleware.js";
|
|
7
7
|
import { RootParams } from "../shims/root-params.js";
|
|
8
8
|
import { AppPagePprFallbackCacheShell } from "./app-ppr-fallback-shell.js";
|
|
9
|
+
import { AppPageNavigationParamSlot } from "./app-page-navigation-params.js";
|
|
9
10
|
import { PagesRouteDataKind } from "./pages-route-data-kind.js";
|
|
10
11
|
import { AppPrerenderRootParamNamesMap, AppPrerenderStaticParamsMap } from "./app-prerender-endpoints.js";
|
|
11
12
|
import { TrustedPrerenderState } from "./prerender-route-params.js";
|
|
@@ -25,6 +26,8 @@ type RunAppMiddlewareOptions = {
|
|
|
25
26
|
isDataRequest: boolean;
|
|
26
27
|
middlewareRequest?: Request;
|
|
27
28
|
request: Request;
|
|
29
|
+
/** `shouldRestoreLocaleRootTrailingSlash` for the raw request pathname. */
|
|
30
|
+
restoreLocaleRootTrailingSlash?: boolean;
|
|
28
31
|
validateExternalRewriteRequest: () => Promise<Response | null>;
|
|
29
32
|
};
|
|
30
33
|
export type AppRscHandlerRoute = {
|
|
@@ -41,9 +44,17 @@ export type AppRscHandlerRoute = {
|
|
|
41
44
|
rootParamNames?: readonly string[];
|
|
42
45
|
routeHandler?: unknown;
|
|
43
46
|
routeSegments: readonly string[];
|
|
44
|
-
slots?: AppRouteTreePrefetchRoute["slots"];
|
|
47
|
+
slots?: Readonly<Record<string, NonNullable<AppRouteTreePrefetchRoute["slots"]>[string] & AppPageNavigationParamSlot>> | null;
|
|
45
48
|
};
|
|
46
49
|
type AppRscRouteMatch<TRoute> = {
|
|
50
|
+
/**
|
|
51
|
+
* For an interception match, the source route and params the interception
|
|
52
|
+
* context names, when they differ from the rendered `route` and `params`:
|
|
53
|
+
* a sibling intercept opened from a deeper source renders the intercepting
|
|
54
|
+
* route itself, while the deeper source is what gets authorized.
|
|
55
|
+
*/
|
|
56
|
+
authorizationParams?: AppPageParams;
|
|
57
|
+
authorizationRoute?: TRoute;
|
|
47
58
|
interceptionSourceIsConcrete?: boolean;
|
|
48
59
|
params: AppPageParams;
|
|
49
60
|
route: TRoute;
|
|
@@ -177,6 +188,8 @@ type RenderPagesFallbackOptions = {
|
|
|
177
188
|
pathname?: string;
|
|
178
189
|
pagesDataRequest?: Request | null;
|
|
179
190
|
request: Request;
|
|
191
|
+
/** The basePath `request.url` still carries, removed before the page renders. */
|
|
192
|
+
requestBasePath?: string;
|
|
180
193
|
/** The shared cache entry answers every host; a request-time render is not stored. */
|
|
181
194
|
sharedAcrossHosts?: boolean;
|
|
182
195
|
url: URL;
|