vinext 1.4.1 → 1.4.3

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