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.
Files changed (156) hide show
  1. package/README.md +21 -21
  2. package/dist/build/action-owner-manifest.js +1 -0
  3. package/dist/build/prerender.js +3 -2
  4. package/dist/check.js +4 -7
  5. package/dist/client/dev-error-overlay-store.d.ts +1 -0
  6. package/dist/client/dev-error-overlay.d.ts +2 -0
  7. package/dist/client/dev-error-overlay.js +19 -3
  8. package/dist/config/config-matchers.js +4 -2
  9. package/dist/config/destination-params.d.ts +2 -1
  10. package/dist/config/destination-params.js +55 -2
  11. package/dist/config/next-config.d.ts +22 -1
  12. package/dist/config/next-config.js +49 -4
  13. package/dist/entries/app-rsc-entry.js +41 -19
  14. package/dist/entries/app-rsc-manifest.js +4 -0
  15. package/dist/entries/pages-server-entry.js +5 -1
  16. package/dist/index.js +44 -32
  17. package/dist/init-cloudflare.js +18 -2
  18. package/dist/plugins/css-target.d.ts +18 -0
  19. package/dist/plugins/css-target.js +93 -0
  20. package/dist/plugins/strip-server-exports.js +2 -1
  21. package/dist/routing/app-route-graph.d.ts +10 -0
  22. package/dist/routing/app-route-graph.js +15 -1
  23. package/dist/server/api-handler.d.ts +2 -0
  24. package/dist/server/api-handler.js +5 -6
  25. package/dist/server/app-action-forwarding.js +3 -1
  26. package/dist/server/app-browser-entry.js +28 -7
  27. package/dist/server/app-browser-rsc-redirect.js +3 -3
  28. package/dist/server/app-browser-server-action-client.js +2 -2
  29. package/dist/server/app-browser-visible-commit.js +2 -2
  30. package/dist/server/app-elements.d.ts +3 -0
  31. package/dist/server/app-elements.js +14 -1
  32. package/dist/server/app-fallback-renderer.js +2 -2
  33. package/dist/server/app-optimistic-routing.d.ts +12 -1
  34. package/dist/server/app-optimistic-routing.js +40 -19
  35. package/dist/server/app-page-boundary-render.js +7 -12
  36. package/dist/server/app-page-cache-render.js +1 -1
  37. package/dist/server/app-page-dispatch.d.ts +10 -2
  38. package/dist/server/app-page-dispatch.js +73 -31
  39. package/dist/server/app-page-element-builder.d.ts +9 -20
  40. package/dist/server/app-page-element-builder.js +40 -52
  41. package/dist/server/app-page-execution.js +9 -6
  42. package/dist/server/app-page-intercept-segment-config.d.ts +56 -0
  43. package/dist/server/app-page-intercept-segment-config.js +90 -0
  44. package/dist/server/app-page-navigation-params.d.ts +23 -0
  45. package/dist/server/app-page-navigation-params.js +49 -0
  46. package/dist/server/app-page-render.d.ts +5 -3
  47. package/dist/server/app-page-render.js +31 -17
  48. package/dist/server/app-page-request.d.ts +24 -2
  49. package/dist/server/app-page-request.js +10 -10
  50. package/dist/server/app-page-response.js +1 -1
  51. package/dist/server/app-page-route-wiring.d.ts +10 -0
  52. package/dist/server/app-page-route-wiring.js +34 -13
  53. package/dist/server/app-page-segment-plan.js +9 -1
  54. package/dist/server/app-page-segment-state.d.ts +9 -0
  55. package/dist/server/app-page-segment-state.js +54 -1
  56. package/dist/server/app-page-stream.d.ts +10 -8
  57. package/dist/server/app-page-stream.js +2 -1
  58. package/dist/server/app-request-stage-independent-entry.js +1 -1
  59. package/dist/server/app-response-stage-entry.js +1 -0
  60. package/dist/server/app-route-handler-execution.js +3 -2
  61. package/dist/server/app-route-handler-runtime.d.ts +1 -1
  62. package/dist/server/app-route-handler-runtime.js +11 -7
  63. package/dist/server/app-route-module-loader.d.ts +2 -0
  64. package/dist/server/app-route-module-loader.js +1 -0
  65. package/dist/server/app-router-entry.js +1 -1
  66. package/dist/server/app-rsc-cache-busting.d.ts +10 -10
  67. package/dist/server/app-rsc-cache-busting.js +27 -68
  68. package/dist/server/app-rsc-error-handler.js +1 -1
  69. package/dist/server/app-rsc-errors.js +4 -1
  70. package/dist/server/app-rsc-handler.d.ts +10 -1
  71. package/dist/server/app-rsc-handler.js +126 -103
  72. package/dist/server/app-rsc-request-normalization.d.ts +10 -12
  73. package/dist/server/app-rsc-request-normalization.js +11 -14
  74. package/dist/server/app-rsc-response-finalizer.d.ts +3 -0
  75. package/dist/server/app-rsc-response-finalizer.js +11 -1
  76. package/dist/server/app-rsc-response-stage.js +4 -12
  77. package/dist/server/app-rsc-route-matching.d.ts +14 -0
  78. package/dist/server/app-rsc-route-matching.js +42 -18
  79. package/dist/server/app-server-action-execution.js +24 -14
  80. package/dist/server/app-ssr-entry.d.ts +6 -0
  81. package/dist/server/app-ssr-entry.js +13 -8
  82. package/dist/server/app-worker-stages.d.ts +12 -3
  83. package/dist/server/app-worker-stages.js +37 -4
  84. package/dist/server/bfcache-identity.d.ts +7 -0
  85. package/dist/server/bfcache-identity.js +10 -1
  86. package/dist/server/cache-control.d.ts +2 -0
  87. package/dist/server/cache-control.js +3 -1
  88. package/dist/server/cacheability-manifest.js +1 -2
  89. package/dist/server/dev-origin-check.d.ts +2 -1
  90. package/dist/server/dev-origin-check.js +2 -1
  91. package/dist/server/dev-server.js +2 -1
  92. package/dist/server/image-local-patterns.d.ts +21 -0
  93. package/dist/server/image-local-patterns.js +59 -0
  94. package/dist/server/image-optimization.d.ts +28 -22
  95. package/dist/server/image-optimization.js +17 -2
  96. package/dist/server/isr-cache.js +4 -1
  97. package/dist/server/metadata-route-response.js +25 -7
  98. package/dist/server/middleware-matcher.js +19 -6
  99. package/dist/server/middleware-runtime.js +6 -2
  100. package/dist/server/multi-stage.d.ts +7 -3
  101. package/dist/server/nitro-public-files-plugin.js +20 -8
  102. package/dist/server/pages-data-route.d.ts +5 -1
  103. package/dist/server/pages-data-route.js +14 -6
  104. package/dist/server/pages-node-compat.d.ts +1 -1
  105. package/dist/server/pages-node-compat.js +2 -0
  106. package/dist/server/pages-page-data.js +2 -1
  107. package/dist/server/pages-page-handler.js +17 -6
  108. package/dist/server/pages-page-response.d.ts +9 -0
  109. package/dist/server/pages-page-response.js +18 -4
  110. package/dist/server/pages-request-pipeline.js +6 -5
  111. package/dist/server/pages-request-stage-entry.js +25 -4
  112. package/dist/server/pages-router-entry.js +3 -2
  113. package/dist/server/prod-server.d.ts +2 -2
  114. package/dist/server/prod-server.js +59 -17
  115. package/dist/server/request-error-log.d.ts +9 -0
  116. package/dist/server/request-error-log.js +13 -0
  117. package/dist/server/request-pipeline.d.ts +14 -4
  118. package/dist/server/request-pipeline.js +33 -15
  119. package/dist/server/response-stage-cacheability.d.ts +7 -0
  120. package/dist/server/response-stage-cacheability.js +6 -5
  121. package/dist/server/rsc-completion-metadata.js +3 -0
  122. package/dist/server/static-file-cache.d.ts +9 -0
  123. package/dist/server/static-file-cache.js +13 -2
  124. package/dist/server/worker-image-optimization.d.ts +2 -2
  125. package/dist/server/worker-image-optimization.js +18 -3
  126. package/dist/server/worker-utils.d.ts +8 -0
  127. package/dist/server/worker-utils.js +19 -2
  128. package/dist/shims/cache-request-state.d.ts +6 -6
  129. package/dist/shims/cache-request-state.js +6 -36
  130. package/dist/shims/cache-runtime.d.ts +3 -1
  131. package/dist/shims/cache-runtime.js +77 -47
  132. package/dist/shims/cache.d.ts +10 -5
  133. package/dist/shims/cache.js +35 -22
  134. package/dist/shims/client-hook-error.d.ts +2 -0
  135. package/dist/shims/client-hook-error.js +16 -1
  136. package/dist/shims/fetch-cache.js +6 -2
  137. package/dist/shims/headers.d.ts +2 -1
  138. package/dist/shims/headers.js +5 -3
  139. package/dist/shims/image-props.d.ts +6 -0
  140. package/dist/shims/image-props.js +39 -3
  141. package/dist/shims/image.js +3 -3
  142. package/dist/shims/internal/cache-context-accessor.d.ts +1 -1
  143. package/dist/shims/link.js +5 -10
  144. package/dist/shims/navigation.js +2 -3
  145. package/dist/shims/request-state-types.d.ts +2 -1
  146. package/dist/shims/slot.d.ts +9 -2
  147. package/dist/shims/slot.js +76 -11
  148. package/dist/shims/unified-request-context.d.ts +6 -0
  149. package/dist/shims/unified-request-context.js +1 -0
  150. package/dist/utils/base-path.d.ts +7 -0
  151. package/dist/utils/base-path.js +11 -1
  152. package/dist/utils/cache-life-profiles.d.ts +33 -0
  153. package/dist/utils/cache-life-profiles.js +111 -0
  154. package/dist/utils/middleware-request-headers.d.ts +14 -3
  155. package/dist/utils/middleware-request-headers.js +54 -7
  156. 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 { addBasePathToPathname, hasBasePath, stripBasePath } from "../utils/base-path.js";
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, stripRscSuffix } from "./app-rsc-cache-busting.js";
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 hasUrlParserDotSegment(pathname) {
136
- return pathname.split("/").some((segment) => {
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
- function requestWithoutRscSuffix(request) {
261
- const url = new URL(request.url);
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: NEVER_CACHE_CONTROL });
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 { requestCleanPathname } = normalized;
324
- let { pathname, cleanPathname } = normalized;
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(requestCleanPathname) : options.matchRoute(cleanPathname);
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?.(requestCleanPathname, interceptionContextHeader, interceptionIdHeader) ?? null : null)) setInterceptionResponseUncacheable(false);
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(requestCleanPathname, hadBasePath ? options.basePath : "", options.trailingSlash, url.search);
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(stripRscSuffix(url.pathname), options);
372
- const headerMatchPathname = normalizeDefaultLocalePathname(requestCleanPathname, options.i18nConfig, {
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(requestCleanPathname);
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 normalizedUserlandRequest = requestWithoutRscSuffix(request);
403
- const userlandRequest = requestWithoutRscCacheBustingSearchParam(normalizedUserlandRequest);
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: normalizedUserlandRequest,
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 !== normalized.cleanPathname) cleanPathnameIsRequestPathname = false;
452
- didMiddlewareRewritePathname = cleanPathname !== normalized.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 : stageProps.kind === "app-page" && adapterSharedCacheIdentity() === "query-free" && responseStagePolicy === null && stageProps.matchKind !== "interception" && stageProps.interceptionContext === null && stageProps.interceptionId === null && stageProps.mountedSlotsHeader === null ? createSharedAppPageCacheIdentity(dispatchRequest, stageProps) : createSharedAppCacheIdentity(dispatchRequest, stageProps);
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
- if (props.kind !== "app-page" || !props.isRscRequest) return response;
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 ? requestCleanPathname : cleanPathname;
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: normalizedUserlandRequest,
634
+ request,
620
635
  requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
621
- paramsPathname: matchPathname(cleanPathnameIsRequestPathname ? requestCleanPathname : cleanPathname),
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, { isDev: options.isDev });
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 ? requestCleanPathname : cleanPathname;
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.route === directPreActionMatch?.route && haveSamePageParams(interceptionSourceMatch.params, directPreActionMatch.params))) {
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 && rewrittenSourceMatch?.route === interceptionSourceMatch.route && haveSamePageParams(rewrittenSourceMatch.params, interceptionSourceMatch.params);
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 && options.basePath ? sourceRequestPathname === "/" ? options.basePath : options.basePath + sourceRequestPathname : sourceRequestPathname;
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: normalizedUserlandRequest,
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
- let didRewriteSource = false;
799
- for (const rewrite of options.configRewrites.beforeFiles) {
800
- const destination = matchRewrite(matchPathname(sourceRulesPathname), [rewrite], sourceRewriteContext, currentBasePathState(), matchPathname(sourceRulesPathname), dispatchResponseStage === void 0 ? markConditionalRewriteCacheability : void 0);
801
- if (!destination) continue;
802
- if (isExternalUrl(destination) || destination.includes("?")) {
803
- options.clearRequestContext();
804
- return notFoundResponse();
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
- sourceRulesPathname = pathnameForResolvedUrl(destination);
807
- didRewriteSource = true;
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(requestCleanPathname) ?? routeMatch : routeMatch;
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
- const sourceConfigUrl = new URL(request.url);
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
- return options.handleServerActionRequest({
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 ? requestCleanPathname + resolvedUrl.slice(pathnameForResolvedUrl(resolvedUrl).length) : resolvedUrl;
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: normalizedUserlandRequest,
1029
+ request,
1013
1030
  requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
1014
- paramsPathname: matchPathname(cleanPathnameIsRequestPathname ? requestCleanPathname : cleanPathname),
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: normalizedUserlandRequest,
1077
+ request,
1061
1078
  requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
1062
- paramsPathname: matchPathname(cleanPathnameIsRequestPathname ? requestCleanPathname : cleanPathname),
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 ? requestCleanPathname : cleanPathname;
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?.route === interceptionSourceMatch.route && haveSamePageParams(finalInterceptionSourceMatch.params, interceptionSourceMatch.params);
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 ? requestCleanPathname : cleanPathname);
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 = requestCleanPathname !== cleanPathname;
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 ? requestCleanPathname || "/" : cleanPathname || "/";
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 : normalizedUserlandRequest;
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 ? requestCleanPathname : cleanPathname,
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 (rawRequest, ctx, allowInternalRscDocumentFallback = false, dispatchResponseStage, responseStageProbeMode = null, transportedPrerenderState) => {
1379
- const rawRequestSignal = rawRequest.signal;
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 = addBasePathToPathname(appRequestUrl.pathname, options.basePath);
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(stripRscSuffix(new URL(rawRequest.url).pathname), options),
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
- return closeAfterResponseWithBody(response, requestContext);
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: traceUrl.pathname.endsWith(".rsc") || rawRequest.headers.get("RSC") === "1",
1494
+ isRsc: rawRequest.headers.get("RSC") === "1",
1472
1495
  method: rawRequest.method,
1473
1496
  target: traceUrl.pathname + traceUrl.search
1474
1497
  });