vinext 1.4.0 → 1.4.2
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 +21 -21
- package/dist/build/action-owner-manifest.js +1 -0
- package/dist/build/prerender.js +3 -2
- package/dist/check.js +4 -7
- package/dist/client/dev-error-overlay-store.d.ts +1 -0
- package/dist/client/dev-error-overlay.d.ts +2 -0
- package/dist/client/dev-error-overlay.js +19 -3
- package/dist/config/config-matchers.js +4 -2
- package/dist/config/destination-params.d.ts +2 -1
- package/dist/config/destination-params.js +55 -2
- package/dist/config/next-config.d.ts +22 -1
- package/dist/config/next-config.js +49 -4
- package/dist/entries/app-rsc-entry.js +41 -19
- package/dist/entries/app-rsc-manifest.js +4 -0
- package/dist/entries/pages-server-entry.js +5 -1
- package/dist/index.js +44 -32
- package/dist/init-cloudflare.js +18 -2
- package/dist/plugins/css-target.d.ts +18 -0
- package/dist/plugins/css-target.js +93 -0
- package/dist/plugins/strip-server-exports.js +2 -1
- 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 +5 -6
- package/dist/server/app-action-forwarding.js +3 -1
- package/dist/server/app-browser-entry.js +28 -7
- package/dist/server/app-browser-rsc-redirect.js +3 -3
- package/dist/server/app-browser-server-action-client.js +2 -2
- package/dist/server/app-browser-visible-commit.js +2 -2
- 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-optimistic-routing.d.ts +12 -1
- package/dist/server/app-optimistic-routing.js +40 -19
- package/dist/server/app-page-boundary-render.js +7 -12
- package/dist/server/app-page-cache-render.js +1 -1
- package/dist/server/app-page-dispatch.d.ts +10 -2
- package/dist/server/app-page-dispatch.js +73 -31
- package/dist/server/app-page-element-builder.d.ts +9 -20
- package/dist/server/app-page-element-builder.js +40 -52
- package/dist/server/app-page-execution.js +9 -6
- 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 -3
- package/dist/server/app-page-render.js +31 -17
- package/dist/server/app-page-request.d.ts +24 -2
- package/dist/server/app-page-request.js +10 -10
- package/dist/server/app-page-response.js +1 -1
- package/dist/server/app-page-route-wiring.d.ts +10 -0
- package/dist/server/app-page-route-wiring.js +34 -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-page-stream.d.ts +10 -8
- package/dist/server/app-page-stream.js +2 -1
- package/dist/server/app-request-stage-independent-entry.js +1 -1
- package/dist/server/app-response-stage-entry.js +1 -0
- package/dist/server/app-route-handler-execution.js +3 -2
- package/dist/server/app-route-handler-runtime.d.ts +1 -1
- package/dist/server/app-route-handler-runtime.js +11 -7
- 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 +1 -1
- package/dist/server/app-rsc-cache-busting.d.ts +10 -10
- package/dist/server/app-rsc-cache-busting.js +27 -68
- package/dist/server/app-rsc-error-handler.js +1 -1
- package/dist/server/app-rsc-errors.js +4 -1
- package/dist/server/app-rsc-handler.d.ts +10 -1
- package/dist/server/app-rsc-handler.js +126 -103
- package/dist/server/app-rsc-request-normalization.d.ts +10 -12
- package/dist/server/app-rsc-request-normalization.js +11 -14
- package/dist/server/app-rsc-response-finalizer.d.ts +3 -0
- package/dist/server/app-rsc-response-finalizer.js +11 -1
- package/dist/server/app-rsc-response-stage.js +4 -12
- 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 +24 -14
- package/dist/server/app-ssr-entry.d.ts +6 -0
- package/dist/server/app-ssr-entry.js +13 -8
- package/dist/server/app-worker-stages.d.ts +12 -3
- package/dist/server/app-worker-stages.js +37 -4
- package/dist/server/bfcache-identity.d.ts +7 -0
- package/dist/server/bfcache-identity.js +10 -1
- package/dist/server/cache-control.d.ts +2 -0
- package/dist/server/cache-control.js +3 -1
- package/dist/server/cacheability-manifest.js +1 -2
- package/dist/server/dev-origin-check.d.ts +2 -1
- package/dist/server/dev-origin-check.js +2 -1
- package/dist/server/dev-server.js +2 -1
- 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 +28 -22
- package/dist/server/image-optimization.js +17 -2
- package/dist/server/isr-cache.js +4 -1
- package/dist/server/metadata-route-response.js +25 -7
- package/dist/server/middleware-matcher.js +19 -6
- package/dist/server/middleware-runtime.js +6 -2
- package/dist/server/multi-stage.d.ts +7 -3
- package/dist/server/nitro-public-files-plugin.js +20 -8
- package/dist/server/pages-data-route.d.ts +5 -1
- package/dist/server/pages-data-route.js +14 -6
- package/dist/server/pages-node-compat.d.ts +1 -1
- package/dist/server/pages-node-compat.js +2 -0
- package/dist/server/pages-page-data.js +2 -1
- package/dist/server/pages-page-handler.js +17 -6
- package/dist/server/pages-page-response.d.ts +9 -0
- package/dist/server/pages-page-response.js +18 -4
- package/dist/server/pages-request-pipeline.js +6 -5
- package/dist/server/pages-request-stage-entry.js +25 -4
- package/dist/server/pages-router-entry.js +3 -2
- package/dist/server/prod-server.d.ts +2 -2
- package/dist/server/prod-server.js +59 -17
- package/dist/server/request-error-log.d.ts +9 -0
- package/dist/server/request-error-log.js +13 -0
- package/dist/server/request-pipeline.d.ts +14 -4
- package/dist/server/request-pipeline.js +33 -15
- package/dist/server/response-stage-cacheability.d.ts +7 -0
- package/dist/server/response-stage-cacheability.js +6 -5
- package/dist/server/rsc-completion-metadata.js +3 -0
- package/dist/server/static-file-cache.d.ts +9 -0
- package/dist/server/static-file-cache.js +13 -2
- package/dist/server/worker-image-optimization.d.ts +2 -2
- package/dist/server/worker-image-optimization.js +18 -3
- package/dist/server/worker-utils.d.ts +8 -0
- package/dist/server/worker-utils.js +19 -2
- package/dist/shims/cache-request-state.d.ts +6 -6
- package/dist/shims/cache-request-state.js +6 -36
- package/dist/shims/cache-runtime.d.ts +3 -1
- package/dist/shims/cache-runtime.js +77 -47
- package/dist/shims/cache.d.ts +10 -5
- package/dist/shims/cache.js +35 -22
- package/dist/shims/client-hook-error.d.ts +2 -0
- package/dist/shims/client-hook-error.js +16 -1
- package/dist/shims/fetch-cache.js +6 -2
- package/dist/shims/headers.d.ts +2 -1
- package/dist/shims/headers.js +5 -3
- 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/internal/cache-context-accessor.d.ts +1 -1
- package/dist/shims/link.js +5 -10
- package/dist/shims/navigation.js +2 -3
- package/dist/shims/request-state-types.d.ts +2 -1
- package/dist/shims/slot.d.ts +9 -2
- package/dist/shims/slot.js +76 -11
- package/dist/shims/unified-request-context.d.ts +6 -0
- package/dist/shims/unified-request-context.js +1 -0
- package/dist/utils/base-path.d.ts +7 -0
- package/dist/utils/base-path.js +11 -1
- package/dist/utils/cache-life-profiles.d.ts +33 -0
- package/dist/utils/cache-life-profiles.js +111 -0
- package/dist/utils/middleware-request-headers.d.ts +14 -3
- package/dist/utils/middleware-request-headers.js +54 -7
- package/package.json +1 -1
|
@@ -4,11 +4,11 @@ import { PRERENDER_REVALIDATE_HEADER, VINEXT_MW_CTX_HEADER, VINEXT_PRERENDER_ROU
|
|
|
4
4
|
import { buildRequestHeadersFromMiddlewareResponse, hasMiddlewareRequestHeaderOverrides } from "../utils/middleware-request-headers.js";
|
|
5
5
|
import { requestContextFromRequest } from "../config/request-context.js";
|
|
6
6
|
import { isExternalUrl } from "../utils/external-url.js";
|
|
7
|
-
import {
|
|
7
|
+
import { hasBasePath, restoreBasePath, stripBasePath } from "../utils/base-path.js";
|
|
8
8
|
import "./app-rsc-vary.js";
|
|
9
9
|
import { ACTION_REVALIDATED_HEADER, FLIGHT_HEADERS, VINEXT_PARAMS_HEADER, VINEXT_PRERENDER_REWRITTEN_HEADER, VINEXT_RENDERED_PATH_AND_SEARCH_HEADER, VINEXT_SPECIAL_ERROR_STATUS_HEADER } from "./headers.js";
|
|
10
10
|
import { badRequestResponse, notFoundResponse, notFoundStaticAssetResponse } from "./http-error-responses.js";
|
|
11
|
-
import { cloneRequestWithHeaders, cloneRequestWithUrl, filterInternalHeaders, normalizeTrailingSlash, normalizeTrailingSlashPathname, resolvePublicFileRoute } from "./request-pipeline.js";
|
|
11
|
+
import { cloneRequestWithHeaders, cloneRequestWithUrl, filterInternalHeaders, hasUrlParserDotSegment, normalizeTrailingSlash, normalizeTrailingSlashPathname, resolvePublicFileRoute, stripRequestUrlFragment } from "./request-pipeline.js";
|
|
12
12
|
import { assetPrefixPathname, isNextStaticPath } from "../utils/asset-prefix.js";
|
|
13
13
|
import { normalizePathnameForRouteMatch, normalizePathnameForRouteMatchStrict } from "../routing/utils.js";
|
|
14
14
|
import { patternToNextFormat } from "../routing/route-validation.js";
|
|
@@ -18,7 +18,7 @@ import { isInterceptionMatchedUrlPath, normalizePath } from "./normalize-path.js
|
|
|
18
18
|
import { normalizeDefaultLocalePathname, shouldRestoreLocaleRootTrailingSlash } from "./pages-i18n.js";
|
|
19
19
|
import { buildNextDataNotFoundResponse, normalizePagesDataRequest } from "./pages-data-route.js";
|
|
20
20
|
import { markRouteCacheabilityDynamic, preserveRouteCacheabilityResponsePolicy } from "../shims/cacheability-classification.js";
|
|
21
|
-
import { NEVER_CACHE_CONTROL, applyCdnResponseHeaders, captureCdnResponsePolicyOverrides, isCdnResponsePolicyHeader, reconcileCdnResponseHeadersAfterOuterPolicy } from "./cache-control.js";
|
|
21
|
+
import { NEVER_CACHE_CONTROL, SERVER_ACTION_CACHE_CONTROL, applyCdnResponseHeaders, captureCdnResponsePolicyOverrides, isCdnResponsePolicyHeader, reconcileCdnResponseHeadersAfterOuterPolicy } from "./cache-control.js";
|
|
22
22
|
import { isOnDemandRevalidateRequest } from "./revalidation-request.js";
|
|
23
23
|
import { getDraftModeCookieHeader, getEffectiveRequestCookieHeader, getHeadersContext, hasEffectiveRequestCookieChanges, headersContextFromRequest, isDraftModeEnabled, isDraftModeRequest, runWithHeadersContext } from "../shims/headers.js";
|
|
24
24
|
import { mergeRewriteQuery } from "../utils/query.js";
|
|
@@ -31,22 +31,23 @@ import { openForwardedMiddlewareContext } from "./forwarded-middleware-context.j
|
|
|
31
31
|
import { consumeResponseStageLinkProvenance, copyLinkHeaderProvenance } from "./app-response-header-provenance.js";
|
|
32
32
|
import { setFrameworkRequestRoute, traceFrameworkRequest } from "./request-tracing.js";
|
|
33
33
|
import { mergeMiddlewareResponseHeaders, mergeMiddlewareResponseHeadersOntoResponse, withExternalRewriteResponseHeaders } from "./middleware-response-headers.js";
|
|
34
|
-
import { VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM, canonicalizeLoadingShellRscRequestHeaders, canonicalizePrewarmableRscRequestHeaders, createCanonicalRscRequestUrl, createRscRedirectLocation, createRscRequestUrl, hasRscCacheBustingSearchParam, resolveInvalidRscCacheBustingRequest, stripRscCacheBustingSearchParam
|
|
34
|
+
import { VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM, canonicalizeLoadingShellRscRequestHeaders, canonicalizePrewarmableRscRequestHeaders, createCanonicalRscRequestUrl, createRscRedirectLocation, createRscRequestUrl, hasRscCacheBustingSearchParam, resolveInvalidRscCacheBustingRequest, stripRscCacheBustingSearchParam } from "./app-rsc-cache-busting.js";
|
|
35
35
|
import { matchPrerenderRouteParamsPayload, readTrustedPrerenderRouteParams, serializePrerenderRouteParamsHeader } from "./prerender-route-params.js";
|
|
36
|
+
import { applyAppRscConfigHeaders, finalizeAppRscResponse, isStreamedActionRedirectResponse, markAppRscResponseConfigHeadersApplied, markStreamedActionRedirectResponse } from "./app-rsc-response-finalizer.js";
|
|
36
37
|
import { createServerActionNotFoundResponse, getServerActionNotFoundMessage } from "./server-action-not-found.js";
|
|
37
38
|
import { isPossibleAppRouteActionRequest } from "./app-action-request.js";
|
|
38
39
|
import "./app-page-response.js";
|
|
39
40
|
import { parseNextHttpErrorDigest } from "./next-error-digest.js";
|
|
40
41
|
import { isAppRouteHandlerRoute } from "./app-rsc-route-matching.js";
|
|
42
|
+
import { resolveAppPageNavigationParams } from "./app-page-navigation-params.js";
|
|
41
43
|
import { traceAppPageRender } from "./app-page-tracing.js";
|
|
42
44
|
import { normalizeInterceptionContextHeader } from "./app-interception-context-header.js";
|
|
43
45
|
import { buildPageCacheTags } from "./implicit-tags.js";
|
|
44
46
|
import { buildPostMwRequestContext } from "./app-post-middleware-context.js";
|
|
45
47
|
import { pickRootParams, setRootParams } from "../shims/root-params.js";
|
|
46
48
|
import { createRouteTreePrefetchResponse, isRouteTreePrefetchRequest } from "./app-route-tree-prefetch.js";
|
|
47
|
-
import { createSharedAppCacheIdentity, createSharedAppPageCacheIdentity, createSharedHybridPagesCacheIdentity, isStaticCandidateAppPageDispatch, prepareSharedAppPageDispatch, withoutAppPageDispatchQuery } from "./app-worker-stages.js";
|
|
49
|
+
import { createSharedAppCacheIdentity, createSharedAppPageCacheIdentity, createSharedAppRouteCacheIdentity, createSharedHybridPagesCacheIdentity, isStaticCandidateAppPageDispatch, prepareSharedAppPageDispatch, withoutAppPageDispatchQuery } from "./app-worker-stages.js";
|
|
48
50
|
import { flattenErrorCauses } from "../utils/error-cause.js";
|
|
49
|
-
import { applyAppRscConfigHeaders, finalizeAppRscResponse, markAppRscResponseConfigHeadersApplied } from "./app-rsc-response-finalizer.js";
|
|
50
51
|
import { normalizeRscRequest } from "./app-rsc-request-normalization.js";
|
|
51
52
|
import { hasPagesPreviewCookie } from "./pages-response-stage.js";
|
|
52
53
|
import { runWithPrerenderWorkUnit } from "./prerender-work-unit-setup.js";
|
|
@@ -132,11 +133,8 @@ function readCacheabilityRequestProjection(options) {
|
|
|
132
133
|
};
|
|
133
134
|
return parsedCacheabilityRequestProjection.manifest;
|
|
134
135
|
}
|
|
135
|
-
function
|
|
136
|
-
return
|
|
137
|
-
const decodedDots = segment.replaceAll(/%2e/gi, ".");
|
|
138
|
-
return decodedDots === "." || decodedDots === "..";
|
|
139
|
-
});
|
|
136
|
+
function isSameInterceptionSource(a, b) {
|
|
137
|
+
return b != null && (a.authorizationRoute ?? a.route) === b.route && haveSamePageParams(a.authorizationParams ?? a.params, b.params);
|
|
140
138
|
}
|
|
141
139
|
function applyMiddlewareContextToResponse(response, middlewareContext, appendToPostConfigLink = false) {
|
|
142
140
|
if (!middlewareContext.headers && middlewareContext.status == null) return response;
|
|
@@ -152,6 +150,27 @@ function applyMiddlewareContextToResponse(response, middlewareContext, appendToP
|
|
|
152
150
|
}));
|
|
153
151
|
}
|
|
154
152
|
/**
|
|
153
|
+
* These headers describe the current routed request, not the shared RSC
|
|
154
|
+
* bytes, so they are composed above a transported response stage: a cache HIT
|
|
155
|
+
* cannot replay another query/path and never loses dynamic params. An
|
|
156
|
+
* intercepted response's params include its target's, which this match lacks,
|
|
157
|
+
* so the response stage keeps them under an interception context, in its
|
|
158
|
+
* cache identity.
|
|
159
|
+
*/
|
|
160
|
+
function withRoutedRscHeaders(response, navigationParams, resolvedUrl, keepsRenderedParams) {
|
|
161
|
+
const headers = new Headers(response.headers);
|
|
162
|
+
if (!keepsRenderedParams || !headers.has("X-Vinext-Params")) {
|
|
163
|
+
if (Object.keys(navigationParams).length > 0) headers.set(VINEXT_PARAMS_HEADER, encodeURIComponent(JSON.stringify(navigationParams)));
|
|
164
|
+
else headers.delete(VINEXT_PARAMS_HEADER);
|
|
165
|
+
}
|
|
166
|
+
headers.set(VINEXT_RENDERED_PATH_AND_SEARCH_HEADER, encodeURIComponent(resolvedUrl));
|
|
167
|
+
return preserveFullyBufferedBodyMetadata(response, new Response(response.body, {
|
|
168
|
+
headers,
|
|
169
|
+
status: response.status,
|
|
170
|
+
statusText: response.statusText
|
|
171
|
+
}));
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
155
174
|
* Next.js answers a Link's segment prefetch of a page whose notFound(),
|
|
156
175
|
* forbidden() or unauthorized() it stored with a 200, so its router renders
|
|
157
176
|
* the page's fallback without loading the document. A shared response stage
|
|
@@ -257,17 +276,10 @@ function requestWithoutRscCacheBustingSearchParam(request) {
|
|
|
257
276
|
stripRscCacheBustingSearchParam(url);
|
|
258
277
|
return cloneRequestWithUrl(request, url.toString());
|
|
259
278
|
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
const pathname = stripRscSuffix(url.pathname);
|
|
263
|
-
if (pathname === url.pathname) return request;
|
|
264
|
-
url.pathname = pathname;
|
|
265
|
-
return cloneRequestWithUrl(request, url.toString());
|
|
266
|
-
}
|
|
267
|
-
/** Send a response with the never-cache policy, rebuilding immutable headers. */
|
|
268
|
-
function withNeverCacheControl(response) {
|
|
279
|
+
/** Send a response with a never-cache policy, rebuilding immutable headers. */
|
|
280
|
+
function withNeverCacheControl(response, cacheControl = NEVER_CACHE_CONTROL) {
|
|
269
281
|
const applyNoStore = (headers) => {
|
|
270
|
-
applyCdnResponseHeaders(headers, { cacheControl
|
|
282
|
+
applyCdnResponseHeaders(headers, { cacheControl });
|
|
271
283
|
};
|
|
272
284
|
let markedResponse = response;
|
|
273
285
|
try {
|
|
@@ -290,6 +302,19 @@ function withUnmatchedRouteCacheControl(response) {
|
|
|
290
302
|
unmatchedRouteResponses.add(markedResponse);
|
|
291
303
|
return markedResponse;
|
|
292
304
|
}
|
|
305
|
+
const serverActionResponses = /* @__PURE__ */ new WeakSet();
|
|
306
|
+
function markServerActionResponse(response) {
|
|
307
|
+
serverActionResponses.add(response);
|
|
308
|
+
return response;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* A fetch action's redirect that streams its target's render keeps the
|
|
312
|
+
* target's policy, as in Next.js. Every other action response is never cached.
|
|
313
|
+
*/
|
|
314
|
+
function withServerActionCacheControl(response) {
|
|
315
|
+
if (isStreamedActionRedirectResponse(response)) return response;
|
|
316
|
+
return withNeverCacheControl(response, SERVER_ACTION_CACHE_CONTROL);
|
|
317
|
+
}
|
|
293
318
|
async function handleAppRscRequest(options, request, preMiddlewareRequestContext, middlewareContext, isDataRequest, isMiddlewareDataRequest, pagesDataRequest, dispatchInternalRequest, allowInternalRscDocumentFallback, dispatchResponseStage, responseStageProbeMode = null, setInterceptionResponseUncacheable = () => {}) {
|
|
294
319
|
const handlerStart = process.env.NODE_ENV !== "production" ? performance.now() : 0;
|
|
295
320
|
if (process.env.NODE_ENV !== "production") {
|
|
@@ -320,8 +345,8 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
320
345
|
setInterceptionResponseUncacheable(true);
|
|
321
346
|
return badRequestResponse();
|
|
322
347
|
}
|
|
323
|
-
const {
|
|
324
|
-
let
|
|
348
|
+
const { pathname, requestPathname } = normalized;
|
|
349
|
+
let cleanPathname = pathname;
|
|
325
350
|
let resolvedUrl = cleanPathname + url.search;
|
|
326
351
|
const originalResolvedUrl = serializeResolvedUrl(resolvedUrl, url);
|
|
327
352
|
const getResolvedSearchParams = () => new URL(resolvedUrl, url).searchParams;
|
|
@@ -331,7 +356,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
331
356
|
hadBasePath
|
|
332
357
|
};
|
|
333
358
|
let cleanPathnameIsRequestPathname = true;
|
|
334
|
-
const matchCleanPathname = () => cleanPathnameIsRequestPathname && options.matchRequestRoute ? options.matchRequestRoute(
|
|
359
|
+
const matchCleanPathname = () => cleanPathnameIsRequestPathname && options.matchRequestRoute ? options.matchRequestRoute(requestPathname) : options.matchRoute(cleanPathname);
|
|
335
360
|
if (interceptionIdHeader !== null && (!isRscRequest || interceptionContextHeader === null || request.method !== "GET" && request.method !== "HEAD" || !options.hasInterceptionId(interceptionIdHeader))) {
|
|
336
361
|
setInterceptionResponseUncacheable(true);
|
|
337
362
|
return badRequestResponse();
|
|
@@ -346,9 +371,9 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
346
371
|
const provesConcreteInterceptionSource = (sourceMatch, sourceContext = interceptionContextHeader) => {
|
|
347
372
|
if (sourceMatch === null) return false;
|
|
348
373
|
if (sourceMatch.interceptionSourceIsConcrete !== void 0) return sourceMatch.interceptionSourceIsConcrete;
|
|
349
|
-
return sourceContext !== null && (options.matchRequestRoute ?? options.matchRoute)(sourceContext)?.route === sourceMatch.route;
|
|
374
|
+
return sourceContext !== null && (options.matchRequestRoute ?? options.matchRoute)(sourceContext)?.route === (sourceMatch.authorizationRoute ?? sourceMatch.route);
|
|
350
375
|
};
|
|
351
|
-
if (provesConcreteInterceptionSource(hadBasePath && hasRawInterceptionContext && interceptionContextHeader !== null ? options.matchInterceptRoute?.(
|
|
376
|
+
if (provesConcreteInterceptionSource(hadBasePath && hasRawInterceptionContext && interceptionContextHeader !== null ? options.matchInterceptRoute?.(requestPathname, interceptionContextHeader, interceptionIdHeader) ?? null : null)) setInterceptionResponseUncacheable(false);
|
|
352
377
|
if (pathname === "/__vinext/prerender/static-params" || pathname === "/__vinext/prerender/pages-static-paths" || pathname === "/__vinext/prerender/metadata-routes") {
|
|
353
378
|
const { handleAppPrerenderEndpoint } = await import("./app-prerender-endpoints.js");
|
|
354
379
|
const prerenderEndpointResponse = await handleAppPrerenderEndpoint(request, {
|
|
@@ -364,16 +389,16 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
364
389
|
if (prerenderEndpointResponse) return prerenderEndpointResponse;
|
|
365
390
|
}
|
|
366
391
|
if (!isDataRequest && !options.skipTrailingSlashRedirect) {
|
|
367
|
-
const trailingSlashRedirect = options.trailingSlash && options.isMetadataRoutePath && await options.isMetadataRoutePath(cleanPathname) ? null : normalizeTrailingSlash(
|
|
392
|
+
const trailingSlashRedirect = options.trailingSlash && options.isMetadataRoutePath && await options.isMetadataRoutePath(cleanPathname) ? null : normalizeTrailingSlash(requestPathname, hadBasePath ? options.basePath : "", options.trailingSlash, url.search);
|
|
368
393
|
if (trailingSlashRedirect) return trailingSlashRedirect;
|
|
369
394
|
}
|
|
370
395
|
const matchPathname = (p) => normalizeDefaultLocalePathname(p, options.i18nConfig, { hostname: url.hostname });
|
|
371
|
-
const restoreLocaleRootTrailingSlash = !pagesDataRequest && shouldRestoreLocaleRootTrailingSlash(
|
|
372
|
-
const headerMatchPathname = normalizeDefaultLocalePathname(
|
|
396
|
+
const restoreLocaleRootTrailingSlash = !pagesDataRequest && shouldRestoreLocaleRootTrailingSlash(url.pathname, options);
|
|
397
|
+
const headerMatchPathname = normalizeDefaultLocalePathname(requestPathname, options.i18nConfig, {
|
|
373
398
|
hostname: url.hostname,
|
|
374
399
|
restoreRootTrailingSlash: restoreLocaleRootTrailingSlash
|
|
375
400
|
});
|
|
376
|
-
const redirectPathname = matchPathname(
|
|
401
|
+
const redirectPathname = matchPathname(requestPathname);
|
|
377
402
|
const configMatchers = HAS_CONFIG_REDIRECTS && options.configRedirects.length ? await import("../config/config-matchers.js") : null;
|
|
378
403
|
const redirect = configMatchers ? configMatchers.matchRedirect(redirectPathname, options.configRedirects, preMiddlewareRequestContext, basePathState, dispatchResponseStage ? void 0 : markConditionalRedirectCacheability) : null;
|
|
379
404
|
if (configMatchers && redirect) {
|
|
@@ -399,9 +424,8 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
399
424
|
};
|
|
400
425
|
const runMiddleware = isOnDemandRevalidateRequest(request.headers.get("x-prerender-revalidate")) ? void 0 : options.runMiddleware;
|
|
401
426
|
const isolatedMiddlewareSource = runMiddleware && request.body && !request.bodyUsed ? request.clone() : null;
|
|
402
|
-
const
|
|
403
|
-
const
|
|
404
|
-
const isolatedMiddlewareRequest = isolatedMiddlewareSource ? requestWithoutRscCacheBustingSearchParam(requestWithoutRscSuffix(isolatedMiddlewareSource)) : void 0;
|
|
427
|
+
const userlandRequest = requestWithoutRscCacheBustingSearchParam(request);
|
|
428
|
+
const isolatedMiddlewareRequest = isolatedMiddlewareSource ? requestWithoutRscCacheBustingSearchParam(isolatedMiddlewareSource) : void 0;
|
|
405
429
|
let didMiddlewareRewrite = false;
|
|
406
430
|
let didMiddlewareRewritePathname = false;
|
|
407
431
|
let resolvedPathnameHasBasePath = hadBasePath;
|
|
@@ -413,7 +437,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
413
437
|
const middlewareResult = await runMiddleware({
|
|
414
438
|
cleanPathname,
|
|
415
439
|
context: middlewareContext,
|
|
416
|
-
externalRewriteRequest:
|
|
440
|
+
externalRewriteRequest: request,
|
|
417
441
|
hadBasePath,
|
|
418
442
|
isDataRequest: isMiddlewareDataRequest,
|
|
419
443
|
middlewareRequest: isolatedMiddlewareRequest,
|
|
@@ -448,8 +472,8 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
448
472
|
cleanPathname = middlewareResult.cleanPathname;
|
|
449
473
|
didMiddlewareRewrite = middlewareResult.rewritten;
|
|
450
474
|
if (didMiddlewareRewrite) resolvedPathnameHasBasePath = middlewareResult.rewriteHadBasePath ?? true;
|
|
451
|
-
if (didMiddlewareRewrite || cleanPathname !==
|
|
452
|
-
didMiddlewareRewritePathname = cleanPathname !==
|
|
475
|
+
if (didMiddlewareRewrite || cleanPathname !== pathname) cleanPathnameIsRequestPathname = false;
|
|
476
|
+
didMiddlewareRewritePathname = cleanPathname !== pathname;
|
|
453
477
|
if (middlewareResult.search !== null) url.search = middlewareResult.search;
|
|
454
478
|
resolvedUrl = cleanPathname + url.search;
|
|
455
479
|
}
|
|
@@ -505,7 +529,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
505
529
|
const rscPath = canonicalRsc.navigation ? createCanonicalRscRequestUrl(dispatchRequest.url) : await createRscRequestUrl(dispatchRequest.url, canonicalRsc.headers);
|
|
506
530
|
dispatchRequest = cloneRequestWithUrl(dispatchRequest, new URL(rscPath, dispatchRequest.url).toString());
|
|
507
531
|
}
|
|
508
|
-
const cacheIdentity = cache !== "shared" || stageProps.kind === "app-full-request" || stageProps.kind === "hybrid-pages" || !adapterUsesSharedCacheIdentity() ? void 0 :
|
|
532
|
+
const cacheIdentity = cache !== "shared" || stageProps.kind === "app-full-request" || stageProps.kind === "hybrid-pages" || !adapterUsesSharedCacheIdentity() ? void 0 : adapterSharedCacheIdentity() !== "query-free" || responseStagePolicy !== null ? createSharedAppCacheIdentity(dispatchRequest, stageProps) : stageProps.kind === "app-page" && stageProps.matchKind !== "interception" && stageProps.interceptionContext === null && stageProps.interceptionId === null && stageProps.mountedSlotsHeader === null ? createSharedAppPageCacheIdentity(dispatchRequest, stageProps) : stageProps.kind === "app-metadata" || stageProps.kind === "app-route-handler" && stageProps.matchKind !== "interception" ? createSharedAppRouteCacheIdentity(dispatchRequest, stageProps) : createSharedAppCacheIdentity(dispatchRequest, stageProps);
|
|
509
533
|
let response = await dispatchResponseStage(dispatchRequest, stageProps, cacheIdentity ? {
|
|
510
534
|
cache,
|
|
511
535
|
cacheIdentity
|
|
@@ -518,16 +542,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
518
542
|
statusText: response.statusText
|
|
519
543
|
});
|
|
520
544
|
}
|
|
521
|
-
|
|
522
|
-
const headers = new Headers(response.headers);
|
|
523
|
-
if (Object.keys(props.params).length > 0) headers.set(VINEXT_PARAMS_HEADER, encodeURIComponent(JSON.stringify(props.params)));
|
|
524
|
-
else headers.delete(VINEXT_PARAMS_HEADER);
|
|
525
|
-
headers.set(VINEXT_RENDERED_PATH_AND_SEARCH_HEADER, encodeURIComponent(props.resolvedUrl));
|
|
526
|
-
return preserveFullyBufferedBodyMetadata(response, new Response(response.body, {
|
|
527
|
-
headers,
|
|
528
|
-
status: response.status,
|
|
529
|
-
statusText: response.statusText
|
|
530
|
-
}));
|
|
545
|
+
return response;
|
|
531
546
|
} : void 0;
|
|
532
547
|
const responseStageRequest = (stageRequest = request) => {
|
|
533
548
|
const activeHeaders = getHeadersContext()?.headers;
|
|
@@ -536,7 +551,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
536
551
|
};
|
|
537
552
|
const renderMetadataRouteIfMatched = async () => {
|
|
538
553
|
if (!filesystemRouteEligible || (options.isMetadataRoute ? !options.isMetadataRoute(cleanPathname) : !options.handleMetadataRouteRequest)) return null;
|
|
539
|
-
const metadataRoutePathname = cleanPathnameIsRequestPathname ?
|
|
554
|
+
const metadataRoutePathname = cleanPathnameIsRequestPathname ? requestPathname : cleanPathname;
|
|
540
555
|
const metadataResponseStage = transportedResponseStage ?? options.renderResponseStageLocally;
|
|
541
556
|
if (metadataResponseStage) {
|
|
542
557
|
const response = await metadataResponseStage(responseStageRequest(), {
|
|
@@ -616,9 +631,9 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
616
631
|
basePathState: currentBasePathState(),
|
|
617
632
|
clearRequestContext: options.clearRequestContext,
|
|
618
633
|
middlewareContext,
|
|
619
|
-
request
|
|
634
|
+
request,
|
|
620
635
|
requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
|
|
621
|
-
paramsPathname: matchPathname(cleanPathnameIsRequestPathname ?
|
|
636
|
+
paramsPathname: matchPathname(cleanPathnameIsRequestPathname ? requestPathname : cleanPathname),
|
|
622
637
|
rewrites: [rewrite],
|
|
623
638
|
validateExternalRewriteRequest: () => validateClaimedOutsideBasePathRsc(true)
|
|
624
639
|
}, matchPathname(cleanPathname), dispatchResponseStage === void 0);
|
|
@@ -637,10 +652,13 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
637
652
|
const isPostRequest = request.method.toUpperCase() === "POST";
|
|
638
653
|
const contentType = request.headers.get("content-type") || "";
|
|
639
654
|
const isProgressiveActionRequest = isPostRequest && !actionId && contentType.startsWith("multipart/form-data");
|
|
640
|
-
const serveImageEndpointIfMatched = () => {
|
|
641
|
-
if (!filesystemRouteEligible || !resolvedPathnameHasBasePath || !isImageOptimizationPath(cleanPathname)) return null;
|
|
655
|
+
const serveImageEndpointIfMatched = async () => {
|
|
656
|
+
if (!filesystemRouteEligible || !resolvedPathnameHasBasePath || !isImageOptimizationPath(cleanPathnameIsRequestPathname ? requestPathname : cleanPathname)) return null;
|
|
642
657
|
const imageUrl = new URL(resolvedUrl, url);
|
|
643
|
-
const imageRedirect = resolveDevImageRedirect(imageUrl, [...options.imageConfig?.deviceSizes ?? DEFAULT_DEVICE_SIZES, ...options.imageConfig?.imageSizes ?? DEFAULT_IMAGE_SIZES], options.imageConfig?.qualities, {
|
|
658
|
+
const imageRedirect = resolveDevImageRedirect(imageUrl, [...options.imageConfig?.deviceSizes ?? DEFAULT_DEVICE_SIZES, ...options.imageConfig?.imageSizes ?? DEFAULT_IMAGE_SIZES], options.imageConfig?.qualities, {
|
|
659
|
+
isDev: options.isDev,
|
|
660
|
+
localPatterns: options.imageConfig?.localPatterns
|
|
661
|
+
});
|
|
644
662
|
const middlewareHeaders = new Headers();
|
|
645
663
|
mergeMiddlewareResponseHeaders(middlewareHeaders, middlewareContext.headers);
|
|
646
664
|
if (!imageRedirect) return new Response("Invalid image optimization parameters", {
|
|
@@ -649,12 +667,12 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
649
667
|
});
|
|
650
668
|
const overrideHeaders = middlewareContext.requestHeaders ?? middlewareContext.headers;
|
|
651
669
|
return markImageOptimizationSignal(Response.redirect(new URL(imageRedirect, url.origin).href, 302), {
|
|
652
|
-
middlewareHeaders,
|
|
670
|
+
middlewareHeaders: new Headers(await loadPreHandlerResponseHeaders()),
|
|
653
671
|
requestHeaders: overrideHeaders ? buildRequestHeadersFromMiddlewareResponse(request.headers, overrideHeaders) : null,
|
|
654
672
|
search: imageUrl.search
|
|
655
673
|
});
|
|
656
674
|
};
|
|
657
|
-
const imageEndpointResponse = serveImageEndpointIfMatched();
|
|
675
|
+
const imageEndpointResponse = await serveImageEndpointIfMatched();
|
|
658
676
|
if (imageEndpointResponse) return imageEndpointResponse;
|
|
659
677
|
const metadataRouteResponse = await renderMetadataRouteIfMatched();
|
|
660
678
|
if (metadataRouteResponse) return composeResponseStageResponse(metadataRouteResponse);
|
|
@@ -663,7 +681,6 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
663
681
|
const publicFileResponse = resolvePublicFileRoute({
|
|
664
682
|
cleanPathname: cleanPathnameIsRequestPathname ? cleanPathname : normalizePathnameForRouteMatch(cleanPathname),
|
|
665
683
|
middlewareContext,
|
|
666
|
-
pathname,
|
|
667
684
|
publicFiles: options.publicFiles,
|
|
668
685
|
request
|
|
669
686
|
});
|
|
@@ -680,7 +697,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
680
697
|
params: {}
|
|
681
698
|
});
|
|
682
699
|
const directPreActionMatch = filesystemRouteEligible ? matchCleanPathname() : null;
|
|
683
|
-
const preActionRoutePathname = cleanPathnameIsRequestPathname ?
|
|
700
|
+
const preActionRoutePathname = cleanPathnameIsRequestPathname ? requestPathname : cleanPathname;
|
|
684
701
|
let interceptionSourceContext = interceptionSourcePathname !== null ? interceptionContextHeader : null;
|
|
685
702
|
let interceptionSourceMatch = filesystemRouteEligible && interceptionSourcePathname !== null && interceptionContextHeader !== null ? options.matchInterceptRoute?.(preActionRoutePathname, interceptionContextHeader, interceptionIdHeader) ?? null : null;
|
|
686
703
|
let hasVerifiedInterceptionSource = provesConcreteInterceptionSource(interceptionSourceMatch);
|
|
@@ -698,7 +715,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
698
715
|
bypassInterceptionContextCache = true;
|
|
699
716
|
setInterceptionResponseUncacheable(true);
|
|
700
717
|
};
|
|
701
|
-
if (interceptionSourceMatch !== null && interceptionContextHeader !== null && interceptionSourcePathname !== null && !(interceptionSourceMatch
|
|
718
|
+
if (interceptionSourceMatch !== null && interceptionContextHeader !== null && interceptionSourcePathname !== null && !isSameInterceptionSource(interceptionSourceMatch, directPreActionMatch)) {
|
|
702
719
|
const sourceRequestPathname = options.skipTrailingSlashRedirect ? interceptionContextHeader : normalizeTrailingSlashPathname(interceptionContextHeader, options.trailingSlash) ?? interceptionContextHeader;
|
|
703
720
|
const decodedSourceRequestPathname = options.skipTrailingSlashRedirect ? interceptionSourcePathname : normalizeTrailingSlashPathname(interceptionSourcePathname, options.trailingSlash) ?? interceptionSourcePathname;
|
|
704
721
|
const adoptRewrittenInterceptionSource = (rewrittenPathname) => {
|
|
@@ -708,7 +725,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
708
725
|
interceptionSourceContext = rewrittenPathname;
|
|
709
726
|
}
|
|
710
727
|
const rewrittenSourceMatch = options.matchRoute(rewrittenPathname);
|
|
711
|
-
return interceptionSourceMatch !== null &&
|
|
728
|
+
return interceptionSourceMatch !== null && isSameInterceptionSource(interceptionSourceMatch, rewrittenSourceMatch);
|
|
712
729
|
};
|
|
713
730
|
if (configMatchers?.matchRedirect(matchPathname(sourceRequestPathname), options.configRedirects, preMiddlewareRequestContext, currentBasePathState(), dispatchResponseStage ? void 0 : markConditionalRedirectCacheability)) {
|
|
714
731
|
options.clearRequestContext();
|
|
@@ -718,7 +735,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
718
735
|
if (runMiddleware) {
|
|
719
736
|
const sourceUrl = new URL(userlandRequest.url);
|
|
720
737
|
sourceUrl.search = new URL(resolvedUrl, url).search;
|
|
721
|
-
const sourceUrlPathname = resolvedPathnameHasBasePath
|
|
738
|
+
const sourceUrlPathname = resolvedPathnameHasBasePath ? restoreBasePath(sourceRequestPathname, options.basePath) : sourceRequestPathname;
|
|
722
739
|
sourceUrl.pathname = sourceUrlPathname;
|
|
723
740
|
if (sourceUrl.pathname !== sourceUrlPathname) {
|
|
724
741
|
options.clearRequestContext();
|
|
@@ -749,7 +766,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
749
766
|
sourceMiddlewareResult = await runWithHeadersContext(sourceHeadersContext, () => runMiddleware({
|
|
750
767
|
cleanPathname: decodedSourceRequestPathname,
|
|
751
768
|
context: sourceMiddlewareContext,
|
|
752
|
-
externalRewriteRequest:
|
|
769
|
+
externalRewriteRequest: request,
|
|
753
770
|
hadBasePath: resolvedPathnameHasBasePath,
|
|
754
771
|
isDataRequest: isMiddlewareDataRequest,
|
|
755
772
|
request: sourceMiddlewareRequest,
|
|
@@ -792,21 +809,22 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
792
809
|
sourceRulesPathname = sourceMiddlewareResult.cleanPathname;
|
|
793
810
|
}
|
|
794
811
|
}
|
|
795
|
-
if (HAS_CONFIG_REWRITES && options.configRewrites.beforeFiles.length) {
|
|
812
|
+
if (HAS_CONFIG_REWRITES && (options.configRewrites.beforeFiles.length || options.configRewrites.afterFiles.length)) {
|
|
796
813
|
const { matchRewrite } = await import("../config/config-matchers.js");
|
|
797
814
|
const sourceRewriteContext = requestContextForResolvedUrl(buildPostMwRequestContext(userlandRequest), resolvedUrl, url);
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
815
|
+
const rewriteSource = (rewrites, stopAtRoute) => {
|
|
816
|
+
let didRewriteSource = false;
|
|
817
|
+
for (const rewrite of rewrites) {
|
|
818
|
+
const destination = matchRewrite(matchPathname(sourceRulesPathname), [rewrite], sourceRewriteContext, currentBasePathState(), matchPathname(sourceRulesPathname), dispatchResponseStage === void 0 ? markConditionalRewriteCacheability : void 0);
|
|
819
|
+
if (!destination) continue;
|
|
820
|
+
if (isExternalUrl(destination) || destination.includes("?")) return false;
|
|
821
|
+
sourceRulesPathname = pathnameForResolvedUrl(destination);
|
|
822
|
+
didRewriteSource = true;
|
|
823
|
+
if (stopAtRoute && options.matchRoute(sourceRulesPathname)) break;
|
|
805
824
|
}
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
if (didRewriteSource && !adoptRewrittenInterceptionSource(sourceRulesPathname)) {
|
|
825
|
+
return !didRewriteSource || adoptRewrittenInterceptionSource(sourceRulesPathname);
|
|
826
|
+
};
|
|
827
|
+
if (!rewriteSource(options.configRewrites.beforeFiles, false) || (interceptionSourceMatch.authorizationRoute ?? interceptionSourceMatch.route).isDynamic && !rewriteSource(options.configRewrites.afterFiles, true)) {
|
|
810
828
|
options.clearRequestContext();
|
|
811
829
|
return notFoundResponse();
|
|
812
830
|
}
|
|
@@ -831,7 +849,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
831
849
|
const isInterceptionMatch = interceptionPreActionMatch !== null;
|
|
832
850
|
const rendersRawRequestMatch = options.matchRawRequestRoute !== void 0 && (isPossibleAppRouteActionRequest(request) || isDraftModeRequest(request, options.draftModeSecret) || isDraftModeEnabled());
|
|
833
851
|
const usesRawRequestMatch = () => rendersRawRequestMatch && cleanPathnameIsRequestPathname && !isInterceptionMatch;
|
|
834
|
-
const renderedRouteMatch = (routeMatch) => routeMatch !== null && usesRawRequestMatch() ? options.matchRawRequestRoute(
|
|
852
|
+
const renderedRouteMatch = (routeMatch) => routeMatch !== null && usesRawRequestMatch() ? options.matchRawRequestRoute(requestPathname) ?? routeMatch : routeMatch;
|
|
835
853
|
const renderedPreActionMatch = renderedRouteMatch(preActionMatch);
|
|
836
854
|
if (renderedPreActionMatch) setRootParams(pickRootParams(renderedPreActionMatch.params, renderedPreActionMatch.route.rootParamNames));
|
|
837
855
|
if (pagesDataRequest && didMiddlewareRewritePathname && preActionMatch && !preActionMatch.route.isDynamic) {
|
|
@@ -852,11 +870,9 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
852
870
|
const handleServerAction = async (routeMatch, routePathname) => {
|
|
853
871
|
if (!filesystemRouteEligible || !isPostRequest || !actionId) return null;
|
|
854
872
|
if (routeMatch && isAppRouteHandlerRoute(routeMatch.route)) return null;
|
|
855
|
-
if (!options.handleServerActionRequest) return createMissingServerActionResponse(options, actionId);
|
|
873
|
+
if (!options.handleServerActionRequest) return markServerActionResponse(createMissingServerActionResponse(options, actionId));
|
|
856
874
|
const sourceConfigHeaders = new Headers();
|
|
857
|
-
|
|
858
|
-
sourceConfigUrl.pathname = hadBasePath ? addBasePathToPathname(requestCleanPathname, options.basePath) : requestCleanPathname;
|
|
859
|
-
await applyAppRscConfigHeaders(sourceConfigHeaders, cloneRequestWithUrl(request, sourceConfigUrl.toString()), {
|
|
875
|
+
await applyAppRscConfigHeaders(sourceConfigHeaders, request, {
|
|
860
876
|
basePath: options.basePath,
|
|
861
877
|
configHeaders: options.configHeaders,
|
|
862
878
|
i18nConfig: options.i18nConfig,
|
|
@@ -865,7 +881,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
865
881
|
recordCacheability: dispatchResponseStage === void 0,
|
|
866
882
|
requestContext: preMiddlewareRequestContext
|
|
867
883
|
});
|
|
868
|
-
|
|
884
|
+
const serverActionResponse = await options.handleServerActionRequest({
|
|
869
885
|
actionId,
|
|
870
886
|
cleanPathname,
|
|
871
887
|
contentType,
|
|
@@ -881,13 +897,14 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
881
897
|
sourceConfigHeaders,
|
|
882
898
|
searchParams: getResolvedSearchParams()
|
|
883
899
|
});
|
|
900
|
+
return serverActionResponse && markServerActionResponse(serverActionResponse);
|
|
884
901
|
};
|
|
885
902
|
let progressiveActionHandled = false;
|
|
886
903
|
let progressiveActionFormState = null;
|
|
887
904
|
const handleProgressiveAction = async (routeMatch, unrenderedRouteMatch) => {
|
|
888
905
|
if (!filesystemRouteEligible || !isProgressiveActionRequest) return null;
|
|
889
906
|
if (routeMatch && isAppRouteHandlerRoute(routeMatch.route)) return null;
|
|
890
|
-
if (!options.handleProgressiveActionRequest) return unrenderedRouteMatch?.route.__loadPage && !unrenderedRouteMatch.route.__loadRouteHandler ? createMissingServerActionResponse(options, null) : null;
|
|
907
|
+
if (!options.handleProgressiveActionRequest) return unrenderedRouteMatch?.route.__loadPage && !unrenderedRouteMatch.route.__loadRouteHandler ? markServerActionResponse(createMissingServerActionResponse(options, null)) : null;
|
|
891
908
|
const progressiveActionResult = await options.handleProgressiveActionRequest({
|
|
892
909
|
actionId,
|
|
893
910
|
cleanPathname,
|
|
@@ -896,7 +913,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
896
913
|
request,
|
|
897
914
|
routeMatch
|
|
898
915
|
});
|
|
899
|
-
if (progressiveActionResult instanceof Response) return progressiveActionResult;
|
|
916
|
+
if (progressiveActionResult instanceof Response) return markServerActionResponse(progressiveActionResult);
|
|
900
917
|
if (progressiveActionResult?.kind !== "form-state") return null;
|
|
901
918
|
if ("actionError" in progressiveActionResult && middlewareContext.status === null && progressiveActionHttpFallbackStatus(progressiveActionResult.actionError) === null) middlewareContext.status = 500;
|
|
902
919
|
return progressiveActionResult;
|
|
@@ -915,7 +932,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
915
932
|
let match = preActionMatch;
|
|
916
933
|
const renderPagesForMatchKind = async (matchKind) => {
|
|
917
934
|
if (!filesystemRouteEligible) return null;
|
|
918
|
-
const pagesRouteUrl = cleanPathnameIsRequestPathname ?
|
|
935
|
+
const pagesRouteUrl = cleanPathnameIsRequestPathname ? requestPathname + resolvedUrl.slice(pathnameForResolvedUrl(resolvedUrl).length) : resolvedUrl;
|
|
919
936
|
let sharedOuterPolicyNeedsReconciliation = false;
|
|
920
937
|
const dispatchPagesResponseStage = dispatchResponseStage ? async (stageRequest, resourceKind, dataKind, hasRequestAwareDocument, runsInitialProps) => {
|
|
921
938
|
const pagesOnDemandRevalidate = resourceKind === "page" && isOnDemandRevalidateRequest(stageRequest.headers.get("x-prerender-revalidate"));
|
|
@@ -1009,9 +1026,9 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
1009
1026
|
basePathState: currentBasePathState(),
|
|
1010
1027
|
clearRequestContext: options.clearRequestContext,
|
|
1011
1028
|
middlewareContext,
|
|
1012
|
-
request
|
|
1029
|
+
request,
|
|
1013
1030
|
requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
|
|
1014
|
-
paramsPathname: matchPathname(cleanPathnameIsRequestPathname ?
|
|
1031
|
+
paramsPathname: matchPathname(cleanPathnameIsRequestPathname ? requestPathname : cleanPathname),
|
|
1015
1032
|
rewrites: [rewrite],
|
|
1016
1033
|
validateExternalRewriteRequest: () => validateClaimedOutsideBasePathRsc(true)
|
|
1017
1034
|
}, matchPathname(cleanPathname), dispatchResponseStage === void 0);
|
|
@@ -1028,7 +1045,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
1028
1045
|
filesystemRouteEligible = resolvedPathnameHasBasePath;
|
|
1029
1046
|
const claimedRscCacheBustingRedirect = await validateClaimedOutsideBasePathRsc();
|
|
1030
1047
|
if (claimedRscCacheBustingRedirect) return claimedRscCacheBustingRedirect;
|
|
1031
|
-
const rewrittenImageEndpointResponse = serveImageEndpointIfMatched();
|
|
1048
|
+
const rewrittenImageEndpointResponse = await serveImageEndpointIfMatched();
|
|
1032
1049
|
if (rewrittenImageEndpointResponse) return rewrittenImageEndpointResponse;
|
|
1033
1050
|
const rewrittenMetadataResponse = await renderMetadataRouteIfMatched();
|
|
1034
1051
|
if (rewrittenMetadataResponse) return composeResponseStageResponse(rewrittenMetadataResponse);
|
|
@@ -1057,9 +1074,9 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
1057
1074
|
basePathState: currentBasePathState(),
|
|
1058
1075
|
clearRequestContext: options.clearRequestContext,
|
|
1059
1076
|
middlewareContext,
|
|
1060
|
-
request
|
|
1077
|
+
request,
|
|
1061
1078
|
requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
|
|
1062
|
-
paramsPathname: matchPathname(cleanPathnameIsRequestPathname ?
|
|
1079
|
+
paramsPathname: matchPathname(cleanPathnameIsRequestPathname ? requestPathname : cleanPathname),
|
|
1063
1080
|
rewrites: [rewrite],
|
|
1064
1081
|
validateExternalRewriteRequest: () => validateClaimedOutsideBasePathRsc(true)
|
|
1065
1082
|
}, matchPathname(cleanPathname), dispatchResponseStage === void 0);
|
|
@@ -1076,7 +1093,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
1076
1093
|
filesystemRouteEligible = resolvedPathnameHasBasePath;
|
|
1077
1094
|
const claimedRscCacheBustingRedirect = await validateClaimedOutsideBasePathRsc();
|
|
1078
1095
|
if (claimedRscCacheBustingRedirect) return claimedRscCacheBustingRedirect;
|
|
1079
|
-
const rewrittenImageEndpointResponse = serveImageEndpointIfMatched();
|
|
1096
|
+
const rewrittenImageEndpointResponse = await serveImageEndpointIfMatched();
|
|
1080
1097
|
if (rewrittenImageEndpointResponse) return rewrittenImageEndpointResponse;
|
|
1081
1098
|
const rewrittenMetadataResponse = await renderMetadataRouteIfMatched();
|
|
1082
1099
|
if (rewrittenMetadataResponse) return composeResponseStageResponse(rewrittenMetadataResponse);
|
|
@@ -1096,9 +1113,12 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
1096
1113
|
if (match) break;
|
|
1097
1114
|
}
|
|
1098
1115
|
if (interceptionCacheProofInvalidated && interceptionSourceContext !== null) {
|
|
1099
|
-
const finalInterceptionTargetPathname = cleanPathnameIsRequestPathname ?
|
|
1116
|
+
const finalInterceptionTargetPathname = cleanPathnameIsRequestPathname ? requestPathname : cleanPathname;
|
|
1100
1117
|
const finalInterceptionSourceMatch = filesystemRouteEligible && match !== null ? options.matchInterceptRoute?.(finalInterceptionTargetPathname, interceptionSourceContext, interceptionIdHeader) ?? null : null;
|
|
1101
|
-
const hasVerifiedFinalInterceptionSource = hasVerifiedInterceptionSource && interceptionSourceMatch !== null && provesConcreteInterceptionSource(finalInterceptionSourceMatch) && finalInterceptionSourceMatch
|
|
1118
|
+
const hasVerifiedFinalInterceptionSource = hasVerifiedInterceptionSource && interceptionSourceMatch !== null && provesConcreteInterceptionSource(finalInterceptionSourceMatch) && finalInterceptionSourceMatch !== null && finalInterceptionSourceMatch.route === interceptionSourceMatch.route && haveSamePageParams(finalInterceptionSourceMatch.params, interceptionSourceMatch.params) && isSameInterceptionSource(finalInterceptionSourceMatch, {
|
|
1119
|
+
params: interceptionSourceMatch.authorizationParams ?? interceptionSourceMatch.params,
|
|
1120
|
+
route: interceptionSourceMatch.authorizationRoute ?? interceptionSourceMatch.route
|
|
1121
|
+
});
|
|
1102
1122
|
if (interceptionIdHeader !== null && !hasVerifiedFinalInterceptionSource) {
|
|
1103
1123
|
options.clearRequestContext();
|
|
1104
1124
|
setInterceptionResponseUncacheable(true);
|
|
@@ -1140,7 +1160,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
1140
1160
|
const finalRouteMatch = renderedRouteMatch(match);
|
|
1141
1161
|
setRootParams(finalRouteMatch ? pickRootParams(finalRouteMatch.params, finalRouteMatch.route.rootParamNames) : null);
|
|
1142
1162
|
if (isServerActionRequest) {
|
|
1143
|
-
const serverActionResponse = await handleServerAction(finalRouteMatch, cleanPathnameIsRequestPathname ?
|
|
1163
|
+
const serverActionResponse = await handleServerAction(finalRouteMatch, cleanPathnameIsRequestPathname ? requestPathname : cleanPathname);
|
|
1144
1164
|
if (serverActionResponse) return serverActionResponse;
|
|
1145
1165
|
} else {
|
|
1146
1166
|
const progressiveActionResult = await handleProgressiveAction(finalRouteMatch, match);
|
|
@@ -1186,7 +1206,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
1186
1206
|
}
|
|
1187
1207
|
match = renderedRouteMatch(match);
|
|
1188
1208
|
const { route, params } = match;
|
|
1189
|
-
const requestPathnameDiffersFromCachePath =
|
|
1209
|
+
const requestPathnameDiffersFromCachePath = requestPathname !== cleanPathname;
|
|
1190
1210
|
const rawRequestPathnameIsObservable = isInterceptionMatch || route.routeHandler != null || typeof route.__loadRouteHandler === "function";
|
|
1191
1211
|
if ((!isInterceptionMatch || requestPathnameDiffersFromCachePath) && options.matchRequestRoute) {
|
|
1192
1212
|
const cachePathMatch = options.matchRoute(cleanPathname);
|
|
@@ -1213,7 +1233,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
1213
1233
|
const isPrerenderFallbackShell = prerenderRouteParamsMatch?.kind === "fallback-shell";
|
|
1214
1234
|
const renderParams = prerenderRouteParams ?? params;
|
|
1215
1235
|
const responseStageMatchKind = isInterceptionMatch ? "interception" : cleanPathnameIsRequestPathname && options.matchRequestRoute ? usesRawRequestMatch() ? "raw-request" : "request" : "resolved";
|
|
1216
|
-
const responseStageRoutePathname = isInterceptionMatch ? preActionRoutePathname : cleanPathnameIsRequestPathname ?
|
|
1236
|
+
const responseStageRoutePathname = isInterceptionMatch ? preActionRoutePathname : cleanPathnameIsRequestPathname ? requestPathname || "/" : cleanPathname || "/";
|
|
1217
1237
|
const matchedResponseStage = transportedResponseStage ?? options.renderResponseStageLocally;
|
|
1218
1238
|
let runtimeFallbackShells = [];
|
|
1219
1239
|
if (options.createPprFallbackShells && request.method === "GET" && !isRscRequest && !isPrerenderFallbackShell && route.params) runtimeFallbackShells = options.createPprFallbackShells({
|
|
@@ -1229,7 +1249,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
1229
1249
|
const rootParams = pickRootParams(renderParams, route.rootParamNames);
|
|
1230
1250
|
setRootParams(rootParams);
|
|
1231
1251
|
if (route.routeHandler) {
|
|
1232
|
-
const routeHandlerRequest = isEdgeRouteHandler(route.routeHandler) ? userlandRequest :
|
|
1252
|
+
const routeHandlerRequest = isEdgeRouteHandler(route.routeHandler) ? userlandRequest : request;
|
|
1233
1253
|
const routeHandlerUrl = new URL(routeHandlerRequest.url);
|
|
1234
1254
|
const internalRscValues = isEdgeRouteHandler(route.routeHandler) ? [] : routeHandlerUrl.searchParams.getAll(VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM);
|
|
1235
1255
|
routeHandlerUrl.search = resolvedSearchParams.toString();
|
|
@@ -1301,7 +1321,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
1301
1321
|
routePattern: route.pattern,
|
|
1302
1322
|
routePathname: responseStageRoutePathname,
|
|
1303
1323
|
scriptNonce: scriptNonce ?? null
|
|
1304
|
-
}).then(composeResponseStageResponse) : await options.dispatchMatchedPage({
|
|
1324
|
+
}).then((response) => transportedResponseStage && isRscRequest ? withRoutedRscHeaders(response, resolveAppPageNavigationParams(route, params, cleanPathname), resolvedUrl, interceptionSourceContext !== null) : response).then(composeResponseStageResponse) : await options.dispatchMatchedPage({
|
|
1305
1325
|
bypassInterceptionContextCache,
|
|
1306
1326
|
cachePathname,
|
|
1307
1327
|
cleanPathname,
|
|
@@ -1312,7 +1332,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
1312
1332
|
handlerStart,
|
|
1313
1333
|
interceptionContext: interceptionSourceContext,
|
|
1314
1334
|
interceptionId: interceptionIdHeader,
|
|
1315
|
-
interceptionPathname: cleanPathnameIsRequestPathname ?
|
|
1335
|
+
interceptionPathname: cleanPathnameIsRequestPathname ? requestPathname : cleanPathname,
|
|
1316
1336
|
isProgressiveActionRender: progressiveActionFormState !== null,
|
|
1317
1337
|
isRscRequest,
|
|
1318
1338
|
middlewareContext,
|
|
@@ -1334,7 +1354,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
|
|
|
1334
1354
|
searchParams: resolvedSearchParams,
|
|
1335
1355
|
renderMode
|
|
1336
1356
|
}), isRscRequest && request.headers.get("Next-Router-Prefetch") === "1" && request.headers.has("Next-Router-Segment-Prefetch"));
|
|
1337
|
-
if (progressiveActionFormState) return applyProgressiveActionSideEffects(pageResponse, progressiveActionFormState);
|
|
1357
|
+
if (progressiveActionFormState) return markServerActionResponse(applyProgressiveActionSideEffects(pageResponse, progressiveActionFormState));
|
|
1338
1358
|
return pageResponse;
|
|
1339
1359
|
}
|
|
1340
1360
|
function progressiveActionHttpFallbackStatus(actionError) {
|
|
@@ -1375,8 +1395,9 @@ function applyProgressiveActionSideEffects(response, sideEffects) {
|
|
|
1375
1395
|
}
|
|
1376
1396
|
/** Build the request-only handler without retaining the response renderer graph. */
|
|
1377
1397
|
function createAppRscRequestHandler(options) {
|
|
1378
|
-
const handleAppRscRequestLifecycle = async (
|
|
1379
|
-
const rawRequestSignal =
|
|
1398
|
+
const handleAppRscRequestLifecycle = async (hostRequest, ctx, allowInternalRscDocumentFallback = false, dispatchResponseStage, responseStageProbeMode = null, transportedPrerenderState) => {
|
|
1399
|
+
const rawRequestSignal = hostRequest.signal;
|
|
1400
|
+
const rawRequest = stripRequestUrlFragment(hostRequest);
|
|
1380
1401
|
const mwCtx = openForwardedMiddlewareContext(rawRequest.headers.get(VINEXT_MW_CTX_HEADER), options.devForwardedMiddlewareContextKey);
|
|
1381
1402
|
const pagesDataUrl = new URL(rawRequest.url);
|
|
1382
1403
|
const pagesDataInScope = !options.basePath || hasBasePath(pagesDataUrl.pathname, options.basePath);
|
|
@@ -1402,7 +1423,7 @@ function createAppRscRequestHandler(options) {
|
|
|
1402
1423
|
let appRequest = rawRequest;
|
|
1403
1424
|
if (pagesDataNormalization?.isDataReq) {
|
|
1404
1425
|
const appRequestUrl = new URL(pagesDataNormalization.request.url);
|
|
1405
|
-
appRequestUrl.pathname =
|
|
1426
|
+
appRequestUrl.pathname = restoreBasePath(appRequestUrl.pathname, options.basePath);
|
|
1406
1427
|
appRequest = cloneRequestWithUrl(pagesDataCandidate, appRequestUrl.toString());
|
|
1407
1428
|
}
|
|
1408
1429
|
const request = cloneRequestWithHeaders(appRequest, filteredHeaders);
|
|
@@ -1440,11 +1461,12 @@ function createAppRscRequestHandler(options) {
|
|
|
1440
1461
|
basePath: options.basePath,
|
|
1441
1462
|
configHeaders: options.configHeaders,
|
|
1442
1463
|
i18nConfig: options.i18nConfig,
|
|
1443
|
-
restoreLocaleRootTrailingSlash: shouldRestoreLocaleRootTrailingSlash(
|
|
1464
|
+
restoreLocaleRootTrailingSlash: shouldRestoreLocaleRootTrailingSlash(new URL(rawRequest.url).pathname, options),
|
|
1444
1465
|
middlewareHeaders: middlewareContext.headers,
|
|
1445
1466
|
recordCacheability: dispatchResponseStage === void 0,
|
|
1446
1467
|
requestContext: preMiddlewareRequestContext
|
|
1447
1468
|
});
|
|
1469
|
+
if (serverActionResponses.has(response)) return withServerActionCacheControl(response);
|
|
1448
1470
|
return interceptionResponseUncacheable || unmatchedRouteResponses.has(response) ? withNeverCacheControl(response) : response;
|
|
1449
1471
|
}, {
|
|
1450
1472
|
cacheComponents: options.createPprFallbackShells !== void 0,
|
|
@@ -1457,7 +1479,8 @@ function createAppRscRequestHandler(options) {
|
|
|
1457
1479
|
await closeAfterResponse(requestContext);
|
|
1458
1480
|
throw error;
|
|
1459
1481
|
}
|
|
1460
|
-
|
|
1482
|
+
const closedResponse = closeAfterResponseWithBody(response, requestContext);
|
|
1483
|
+
return isStreamedActionRedirectResponse(response) ? markStreamedActionRedirectResponse(closedResponse) : closedResponse;
|
|
1461
1484
|
};
|
|
1462
1485
|
const appRscHandler = async function appRscHandler(rawRequest, ctx, allowInternalRscDocumentFallback = false, dispatchResponseStage, responseStageProbeMode = null, transportedPrerenderState, detachedTrace = false) {
|
|
1463
1486
|
options.registerCacheAdapters();
|
|
@@ -1468,7 +1491,7 @@ function createAppRscRequestHandler(options) {
|
|
|
1468
1491
|
detached: detachedTrace,
|
|
1469
1492
|
getStatus: (response) => response?.status,
|
|
1470
1493
|
headers: rawRequest.headers,
|
|
1471
|
-
isRsc:
|
|
1494
|
+
isRsc: rawRequest.headers.get("RSC") === "1",
|
|
1472
1495
|
method: rawRequest.method,
|
|
1473
1496
|
target: traceUrl.pathname + traceUrl.search
|
|
1474
1497
|
});
|