vinext 1.3.1 → 1.4.1

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 (271) hide show
  1. package/README.md +25 -22
  2. package/THIRD_PARTY_LICENSES.md +47 -0
  3. package/dist/_virtual/_rolldown/runtime.js +3 -2
  4. package/dist/build/prerender.js +4 -3
  5. package/dist/build/report.d.ts +0 -14
  6. package/dist/build/report.js +1 -51
  7. package/dist/check.js +4 -7
  8. package/dist/cli.js +3 -0
  9. package/dist/client/dev-error-overlay-store.d.ts +1 -0
  10. package/dist/client/dev-error-overlay.d.ts +2 -0
  11. package/dist/client/dev-error-overlay.js +20 -4
  12. package/dist/client/navigation-runtime.d.ts +13 -1
  13. package/dist/client/navigation-runtime.js +1 -1
  14. package/dist/config/config-matchers.js +2 -0
  15. package/dist/config/destination-params.d.ts +2 -1
  16. package/dist/config/destination-params.js +52 -2
  17. package/dist/config/next-config.d.ts +25 -0
  18. package/dist/config/next-config.js +82 -4
  19. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/dbcs-codec.js +327 -0
  20. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/dbcs-data.js +123 -0
  21. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/index.js +29 -0
  22. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/internal.js +134 -0
  23. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/sbcs-codec.js +50 -0
  24. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/sbcs-data-generated.js +455 -0
  25. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/sbcs-data.js +147 -0
  26. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/big5-added.json.js +169 -0
  27. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/cp936.json.js +2584 -0
  28. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/cp949.json.js +2220 -0
  29. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/cp950.json.js +227 -0
  30. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/eucjp.json.js +425 -0
  31. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/gb18030-ranges.json.js +427 -0
  32. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/gbk-added.json.js +229 -0
  33. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/shiftjis.json.js +292 -0
  34. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/utf16.js +106 -0
  35. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/utf7.js +182 -0
  36. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/lib/bom-handling.js +42 -0
  37. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/lib/extend-node.js +147 -0
  38. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/lib/index.js +94 -0
  39. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/lib/streams.js +95 -0
  40. package/dist/deps/.pnpm/safer-buffer@2.1.2/deps/safer-buffer/safer.js +45 -0
  41. package/dist/entries/app-rsc-entry.js +17 -49
  42. package/dist/entries/app-rsc-manifest.js +3 -4
  43. package/dist/entries/app-ssr-entry.js +1 -0
  44. package/dist/entries/pages-server-entry.js +36 -9
  45. package/dist/index.js +112 -90
  46. package/dist/init-cloudflare.d.ts +1 -3
  47. package/dist/init-cloudflare.js +10 -48
  48. package/dist/init-platform.d.ts +2 -0
  49. package/dist/init-platform.js +4 -0
  50. package/dist/plugins/extensionless-dynamic-import.js +6 -2
  51. package/dist/plugins/next-intl-catalog.d.ts +12 -0
  52. package/dist/plugins/next-intl-catalog.js +85 -0
  53. package/dist/plugins/pages-node-externals.d.ts +1 -0
  54. package/dist/plugins/pages-node-externals.js +1 -1
  55. package/dist/plugins/strip-server-exports.js +2 -1
  56. package/dist/plugins/use-cache-callable.d.ts +1 -1
  57. package/dist/plugins/use-cache-callable.js +136 -94
  58. package/dist/routing/app-route-graph.d.ts +6 -0
  59. package/dist/routing/app-route-graph.js +9 -1
  60. package/dist/server/api-handler.js +21 -5
  61. package/dist/server/app-bfcache-identity.js +1 -1
  62. package/dist/server/app-browser-entry.js +86 -66
  63. package/dist/server/app-browser-history-controller.d.ts +5 -4
  64. package/dist/server/app-browser-history-controller.js +93 -15
  65. package/dist/server/app-browser-navigation-controller.d.ts +2 -2
  66. package/dist/server/app-browser-navigation-controller.js +1 -2
  67. package/dist/server/app-browser-rsc-redirect.js +7 -7
  68. package/dist/server/app-browser-server-action-client.d.ts +2 -0
  69. package/dist/server/app-browser-server-action-client.js +5 -4
  70. package/dist/server/app-browser-state.d.ts +2 -4
  71. package/dist/server/app-browser-state.js +9 -4
  72. package/dist/server/app-browser-supplemental-refresh.js +16 -1
  73. package/dist/server/app-browser-visible-commit.d.ts +1 -1
  74. package/dist/server/app-browser-visible-commit.js +4 -14
  75. package/dist/server/app-elements-wire.d.ts +6 -38
  76. package/dist/server/app-elements-wire.js +4 -41
  77. package/dist/server/app-elements.d.ts +2 -2
  78. package/dist/server/app-elements.js +2 -2
  79. package/dist/server/app-history-state.d.ts +2 -2
  80. package/dist/server/app-history-state.js +5 -2
  81. package/dist/server/app-mounted-layouts.d.ts +21 -0
  82. package/dist/server/app-mounted-layouts.js +67 -0
  83. package/dist/server/app-optimistic-routing.d.ts +19 -1
  84. package/dist/server/app-optimistic-routing.js +43 -4
  85. package/dist/server/app-page-boundary-render.js +10 -14
  86. package/dist/server/app-page-boundary.js +2 -2
  87. package/dist/server/app-page-cache-finalizer.d.ts +12 -1
  88. package/dist/server/app-page-cache-finalizer.js +70 -29
  89. package/dist/server/app-page-cache.d.ts +13 -1
  90. package/dist/server/app-page-cache.js +31 -9
  91. package/dist/server/app-page-dispatch.d.ts +5 -11
  92. package/dist/server/app-page-dispatch.js +84 -155
  93. package/dist/server/app-page-element-builder.d.ts +2 -2
  94. package/dist/server/app-page-element-builder.js +13 -12
  95. package/dist/server/app-page-execution.d.ts +17 -52
  96. package/dist/server/app-page-execution.js +102 -95
  97. package/dist/server/app-page-head.d.ts +13 -0
  98. package/dist/server/app-page-head.js +44 -16
  99. package/dist/server/app-page-http-access-fallback-metadata.d.ts +1 -0
  100. package/dist/server/app-page-http-access-fallback-metadata.js +2 -2
  101. package/dist/server/app-page-layout-gate.d.ts +35 -0
  102. package/dist/server/app-page-layout-gate.js +50 -0
  103. package/dist/server/app-page-params.d.ts +0 -1
  104. package/dist/server/app-page-params.js +1 -14
  105. package/dist/server/app-page-probe.d.ts +3 -21
  106. package/dist/server/app-page-probe.js +4 -37
  107. package/dist/server/app-page-render.d.ts +2 -13
  108. package/dist/server/app-page-render.js +103 -234
  109. package/dist/server/app-page-request.d.ts +1 -3
  110. package/dist/server/app-page-request.js +1 -1
  111. package/dist/server/app-page-response.js +3 -3
  112. package/dist/server/app-page-route-wiring.d.ts +13 -6
  113. package/dist/server/app-page-route-wiring.js +86 -63
  114. package/dist/server/app-page-rsc-render-status.d.ts +27 -1
  115. package/dist/server/app-page-rsc-render-status.js +121 -13
  116. package/dist/server/app-page-stream.d.ts +12 -8
  117. package/dist/server/app-page-stream.js +4 -3
  118. package/dist/server/app-pages-bridge.d.ts +4 -0
  119. package/dist/server/app-pages-bridge.js +7 -3
  120. package/dist/server/app-render-dependency.d.ts +11 -4
  121. package/dist/server/app-render-dependency.js +86 -38
  122. package/dist/server/app-request-stage-dispatch.js +1 -1
  123. package/dist/server/app-request-stage-independent-entry.js +1 -1
  124. package/dist/server/app-route-handler-cache.js +2 -2
  125. package/dist/server/app-route-handler-dispatch.js +14 -9
  126. package/dist/server/app-route-handler-execution.js +11 -5
  127. package/dist/server/app-route-handler-policy.d.ts +1 -1
  128. package/dist/server/app-route-handler-policy.js +3 -3
  129. package/dist/server/app-route-handler-response.js +1 -1
  130. package/dist/server/app-route-handler-runtime.d.ts +1 -1
  131. package/dist/server/app-route-handler-runtime.js +28 -11
  132. package/dist/server/app-router-entry.js +1 -1
  133. package/dist/server/app-rsc-cache-busting.d.ts +12 -12
  134. package/dist/server/app-rsc-cache-busting.js +31 -72
  135. package/dist/server/app-rsc-error-handler.d.ts +2 -1
  136. package/dist/server/app-rsc-error-handler.js +10 -2
  137. package/dist/server/app-rsc-errors.d.ts +8 -0
  138. package/dist/server/app-rsc-errors.js +11 -1
  139. package/dist/server/app-rsc-handler.d.ts +5 -5
  140. package/dist/server/app-rsc-handler.js +80 -83
  141. package/dist/server/app-rsc-request-normalization.d.ts +10 -16
  142. package/dist/server/app-rsc-request-normalization.js +12 -18
  143. package/dist/server/app-rsc-response-finalizer.js +2 -2
  144. package/dist/server/app-rsc-response-stage.js +9 -15
  145. package/dist/server/app-server-action-execution.d.ts +3 -1
  146. package/dist/server/app-server-action-execution.js +15 -8
  147. package/dist/server/app-ssr-entry.d.ts +8 -0
  148. package/dist/server/app-ssr-entry.js +22 -16
  149. package/dist/server/app-ssr-stream.js +1 -1
  150. package/dist/server/app-visited-response-cache.d.ts +36 -1
  151. package/dist/server/app-visited-response-cache.js +46 -5
  152. package/dist/server/app-worker-stages.d.ts +37 -6
  153. package/dist/server/app-worker-stages.js +81 -9
  154. package/dist/server/artifact-compatibility.d.ts +0 -1
  155. package/dist/server/artifact-compatibility.js +1 -10
  156. package/dist/server/bfcache-identity.d.ts +7 -0
  157. package/dist/server/bfcache-identity.js +10 -1
  158. package/dist/server/cache-proof.d.ts +1 -115
  159. package/dist/server/cache-proof.js +1 -544
  160. package/dist/server/cacheability-manifest.js +1 -2
  161. package/dist/server/cacheability-request.js +13 -8
  162. package/dist/server/dev-origin-check.d.ts +2 -1
  163. package/dist/server/dev-origin-check.js +2 -1
  164. package/dist/server/dev-server.js +6 -4
  165. package/dist/server/headers.d.ts +6 -3
  166. package/dist/server/headers.js +9 -5
  167. package/dist/server/image-optimization.d.ts +5 -0
  168. package/dist/server/image-optimization.js +6 -1
  169. package/dist/server/isr-cache.d.ts +8 -2
  170. package/dist/server/isr-cache.js +30 -2
  171. package/dist/server/metadata-route-response.js +32 -15
  172. package/dist/server/middleware-matcher.js +19 -6
  173. package/dist/server/middleware-runtime.js +6 -2
  174. package/dist/server/multi-stage.d.ts +57 -12
  175. package/dist/server/multi-stage.js +13 -1
  176. package/dist/server/navigation-planner.js +1 -1
  177. package/dist/server/pages-api-route.js +28 -19
  178. package/dist/server/pages-media-type.d.ts +21 -1
  179. package/dist/server/pages-media-type.js +69 -5
  180. package/dist/server/pages-node-compat.d.ts +1 -1
  181. package/dist/server/pages-node-compat.js +54 -27
  182. package/dist/server/pages-page-data.js +2 -1
  183. package/dist/server/pages-page-handler.js +28 -26
  184. package/dist/server/pages-page-response.d.ts +9 -0
  185. package/dist/server/pages-page-response.js +18 -4
  186. package/dist/server/pages-request-pipeline.d.ts +8 -0
  187. package/dist/server/pages-request-pipeline.js +2 -2
  188. package/dist/server/pages-request-stage-entry.js +36 -14
  189. package/dist/server/pages-response-stage-entry.js +9 -3
  190. package/dist/server/pages-router-entry.js +3 -2
  191. package/dist/server/prod-server.d.ts +2 -2
  192. package/dist/server/prod-server.js +47 -9
  193. package/dist/server/request-error-log.d.ts +9 -0
  194. package/dist/server/request-error-log.js +13 -0
  195. package/dist/server/request-pipeline.d.ts +15 -4
  196. package/dist/server/request-pipeline.js +43 -15
  197. package/dist/server/rsc-completion-metadata.js +3 -0
  198. package/dist/server/shared-cache-identity.d.ts +23 -0
  199. package/dist/server/shared-cache-identity.js +36 -0
  200. package/dist/server/static-file-cache.d.ts +9 -0
  201. package/dist/server/static-file-cache.js +13 -2
  202. package/dist/server/worker-stages.d.ts +16 -3
  203. package/dist/server/worker-stages.js +23 -4
  204. package/dist/shims/cache-handler.js +2 -2
  205. package/dist/shims/cache-request-state.d.ts +23 -26
  206. package/dist/shims/cache-request-state.js +22 -57
  207. package/dist/shims/cache-runtime.d.ts +3 -1
  208. package/dist/shims/cache-runtime.js +94 -48
  209. package/dist/shims/cache.d.ts +16 -10
  210. package/dist/shims/cache.js +47 -36
  211. package/dist/shims/cacheability-classification.d.ts +2 -0
  212. package/dist/shims/cdn-cache.d.ts +22 -5
  213. package/dist/shims/client-hook-error.d.ts +2 -0
  214. package/dist/shims/client-hook-error.js +16 -1
  215. package/dist/shims/client-page-root.js +2 -2
  216. package/dist/shims/dynamic.js +9 -6
  217. package/dist/shims/error-boundary.js +2 -2
  218. package/dist/shims/fetch-cache-state.d.ts +5 -1
  219. package/dist/shims/fetch-cache-state.js +1 -3
  220. package/dist/shims/fetch-cache.d.ts +2 -1
  221. package/dist/shims/fetch-cache.js +39 -25
  222. package/dist/shims/form.js +2 -2
  223. package/dist/shims/headers.d.ts +10 -24
  224. package/dist/shims/headers.js +22 -70
  225. package/dist/shims/internal/cache-context-accessor.d.ts +1 -1
  226. package/dist/shims/internal/navigation-untracked.js +1 -1
  227. package/dist/shims/link.js +8 -11
  228. package/dist/shims/metadata.d.ts +23 -21
  229. package/dist/shims/metadata.js +62 -24
  230. package/dist/shims/navigation-server.js +1 -1
  231. package/dist/shims/navigation.d.ts +74 -7
  232. package/dist/shims/navigation.js +184 -31
  233. package/dist/shims/navigation.react-server.js +2 -2
  234. package/dist/shims/request-state-types.d.ts +3 -2
  235. package/dist/shims/slot.d.ts +16 -0
  236. package/dist/shims/slot.js +44 -9
  237. package/dist/shims/unified-request-context.d.ts +7 -1
  238. package/dist/shims/unified-request-context.js +3 -3
  239. package/dist/utils/cache-control-metadata.d.ts +5 -0
  240. package/dist/utils/cache-control-metadata.js +9 -1
  241. package/dist/utils/cache-life-profiles.d.ts +33 -0
  242. package/dist/utils/cache-life-profiles.js +111 -0
  243. package/dist/utils/middleware-request-headers.d.ts +14 -3
  244. package/dist/utils/middleware-request-headers.js +54 -7
  245. package/dist/utils/project.d.ts +2 -2
  246. package/dist/utils/project.js +3 -16
  247. package/dist/utils/regex.d.ts +5 -0
  248. package/dist/utils/regex.js +11 -1
  249. package/dist/utils/text-stream.d.ts +10 -5
  250. package/dist/utils/text-stream.js +6 -6
  251. package/package.json +2 -1
  252. package/dist/build/layout-classification-types.d.ts +0 -60
  253. package/dist/build/layout-classification-types.js +0 -1
  254. package/dist/build/layout-classification.d.ts +0 -62
  255. package/dist/build/layout-classification.js +0 -98
  256. package/dist/build/route-classification-injector.d.ts +0 -33
  257. package/dist/build/route-classification-injector.js +0 -59
  258. package/dist/build/route-classification-manifest.d.ts +0 -54
  259. package/dist/build/route-classification-manifest.js +0 -143
  260. package/dist/server/app-browser-client-reuse-manifest.d.ts +0 -11
  261. package/dist/server/app-browser-client-reuse-manifest.js +0 -101
  262. package/dist/server/app-layout-param-observation.d.ts +0 -42
  263. package/dist/server/app-layout-param-observation.js +0 -168
  264. package/dist/server/client-reuse-manifest.d.ts +0 -103
  265. package/dist/server/client-reuse-manifest.js +0 -209
  266. package/dist/server/skip-cache-proof.d.ts +0 -60
  267. package/dist/server/skip-cache-proof.js +0 -168
  268. package/dist/server/static-layout-client-reuse-proof.d.ts +0 -14
  269. package/dist/server/static-layout-client-reuse-proof.js +0 -33
  270. package/dist/utils/sorted-array.d.ts +0 -8
  271. package/dist/utils/sorted-array.js +0 -20
@@ -8,7 +8,7 @@ import { addBasePathToPathname, hasBasePath, stripBasePath } from "../utils/base
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, 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";
@@ -17,7 +17,6 @@ import { runOutsideWorkStoreScope } from "../shims/internal/work-store-scope.js"
17
17
  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
- import { getCdnCacheAdapter } from "../shims/cdn-cache.js";
21
20
  import { markRouteCacheabilityDynamic, preserveRouteCacheabilityResponsePolicy } from "../shims/cacheability-classification.js";
22
21
  import { NEVER_CACHE_CONTROL, applyCdnResponseHeaders, captureCdnResponsePolicyOverrides, isCdnResponsePolicyHeader, reconcileCdnResponseHeadersAfterOuterPolicy } from "./cache-control.js";
23
22
  import { isOnDemandRevalidateRequest } from "./revalidation-request.js";
@@ -28,29 +27,30 @@ import { traceFindPageComponents } from "./pages-execution-tracing.js";
28
27
  import { DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES, isImageOptimizationPath, markImageOptimizationSignal, resolveDevImageRedirect } from "./image-optimization.js";
29
28
  import { parseCacheabilityManifest } from "./cacheability-manifest.js";
30
29
  import { getRenderedConcreteUrlPathsForRoute } from "./pregenerated-concrete-paths.js";
31
- import { VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM, canonicalizeLoadingShellRscRequestHeaders, canonicalizePrewarmableRscRequestHeaders, createCanonicalRscRequestUrl, createRscRedirectLocation, createRscRequestUrl, hasRscCacheBustingSearchParam, resolveInvalidRscCacheBustingRequest, stripRscCacheBustingSearchParam, stripRscSuffix } from "./app-rsc-cache-busting.js";
32
- import { mergeMiddlewareResponseHeaders, mergeMiddlewareResponseHeadersOntoResponse, withExternalRewriteResponseHeaders } from "./middleware-response-headers.js";
33
- import { consumeResponseStageLinkProvenance, copyLinkHeaderProvenance } from "./app-response-header-provenance.js";
34
- import "./app-page-response.js";
35
- import { parseNextHttpErrorDigest } from "./next-error-digest.js";
36
- import { traceAppPageRender } from "./app-page-tracing.js";
37
30
  import { openForwardedMiddlewareContext } from "./forwarded-middleware-context.js";
31
+ import { consumeResponseStageLinkProvenance, copyLinkHeaderProvenance } from "./app-response-header-provenance.js";
38
32
  import { setFrameworkRequestRoute, traceFrameworkRequest } from "./request-tracing.js";
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 } from "./app-rsc-cache-busting.js";
39
35
  import { matchPrerenderRouteParamsPayload, readTrustedPrerenderRouteParams, serializePrerenderRouteParamsHeader } from "./prerender-route-params.js";
40
36
  import { createServerActionNotFoundResponse, getServerActionNotFoundMessage } from "./server-action-not-found.js";
41
37
  import { isPossibleAppRouteActionRequest } from "./app-action-request.js";
38
+ import "./app-page-response.js";
39
+ import { parseNextHttpErrorDigest } from "./next-error-digest.js";
42
40
  import { isAppRouteHandlerRoute } from "./app-rsc-route-matching.js";
41
+ import { traceAppPageRender } from "./app-page-tracing.js";
43
42
  import { normalizeInterceptionContextHeader } from "./app-interception-context-header.js";
44
43
  import { buildPageCacheTags } from "./implicit-tags.js";
45
44
  import { buildPostMwRequestContext } from "./app-post-middleware-context.js";
46
45
  import { pickRootParams, setRootParams } from "../shims/root-params.js";
47
46
  import { createRouteTreePrefetchResponse, isRouteTreePrefetchRequest } from "./app-route-tree-prefetch.js";
48
- import { createSharedAppPageCacheIdentity, isStaticCandidateAppPageDispatch, prepareSharedAppPageDispatch, withoutAppPageDispatchQuery } from "./app-worker-stages.js";
47
+ import { createSharedAppCacheIdentity, createSharedAppPageCacheIdentity, createSharedAppRouteCacheIdentity, createSharedHybridPagesCacheIdentity, isStaticCandidateAppPageDispatch, prepareSharedAppPageDispatch, withoutAppPageDispatchQuery } from "./app-worker-stages.js";
49
48
  import { flattenErrorCauses } from "../utils/error-cause.js";
50
49
  import { applyAppRscConfigHeaders, finalizeAppRscResponse, markAppRscResponseConfigHeadersApplied } from "./app-rsc-response-finalizer.js";
51
50
  import { normalizeRscRequest } from "./app-rsc-request-normalization.js";
52
51
  import { hasPagesPreviewCookie } from "./pages-response-stage.js";
53
52
  import { runWithPrerenderWorkUnit } from "./prerender-work-unit-setup.js";
53
+ import { adapterSharedCacheIdentity, adapterUsesSharedCacheIdentity, pagesCacheIdentityOrigin, pagesPageSharesAcrossHosts } from "./shared-cache-identity.js";
54
54
  import { consumePagesResponseStagePolicyOwner, withoutResponseStageVary } from "./response-stage-policy.js";
55
55
  //#region src/server/app-rsc-handler.ts
56
56
  const HAS_CONFIG_HEADERS = process.env.__VINEXT_HAS_CONFIG_HEADERS !== "false";
@@ -132,10 +132,6 @@ function readCacheabilityRequestProjection(options) {
132
132
  };
133
133
  return parsedCacheabilityRequestProjection.manifest;
134
134
  }
135
- function adapterUsesQueryFreeCacheIdentity() {
136
- const adapter = getCdnCacheAdapter();
137
- return adapter.requiresCompletedResponseAdmission === true && adapter.responseStageCacheIdentity === "query-free";
138
- }
139
135
  function hasUrlParserDotSegment(pathname) {
140
136
  return pathname.split("/").some((segment) => {
141
137
  const decodedDots = segment.replaceAll(/%2e/gi, ".");
@@ -261,13 +257,6 @@ function requestWithoutRscCacheBustingSearchParam(request) {
261
257
  stripRscCacheBustingSearchParam(url);
262
258
  return cloneRequestWithUrl(request, url.toString());
263
259
  }
264
- function requestWithoutRscSuffix(request) {
265
- const url = new URL(request.url);
266
- const pathname = stripRscSuffix(url.pathname);
267
- if (pathname === url.pathname) return request;
268
- url.pathname = pathname;
269
- return cloneRequestWithUrl(request, url.toString());
270
- }
271
260
  /** Send a response with the never-cache policy, rebuilding immutable headers. */
272
261
  function withNeverCacheControl(response) {
273
262
  const applyNoStore = (headers) => {
@@ -312,7 +301,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
312
301
  if (request.headers.has("X-Vinext-Interception-Context") || request.headers.has("X-Vinext-Interception-Id")) setInterceptionResponseUncacheable(true);
313
302
  return normalized;
314
303
  }
315
- const { url, isRscRequest, interceptionContextHeader, interceptionIdHeader, mountedSlotsHeader, renderMode, clientReuseManifest, hadBasePath } = normalized;
304
+ const { url, isRscRequest, interceptionContextHeader, interceptionIdHeader, mountedSlotsHeader, renderMode, hadBasePath } = normalized;
316
305
  setFrameworkRequestRoute(void 0, isRscRequest);
317
306
  const hasRawInterceptionContext = isRscRequest && request.headers.has("X-Vinext-Interception-Context");
318
307
  if (hasRawInterceptionContext) setInterceptionResponseUncacheable(true);
@@ -324,8 +313,8 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
324
313
  setInterceptionResponseUncacheable(true);
325
314
  return badRequestResponse();
326
315
  }
327
- const { requestCleanPathname } = normalized;
328
- let { pathname, cleanPathname } = normalized;
316
+ const { pathname, requestPathname } = normalized;
317
+ let cleanPathname = pathname;
329
318
  let resolvedUrl = cleanPathname + url.search;
330
319
  const originalResolvedUrl = serializeResolvedUrl(resolvedUrl, url);
331
320
  const getResolvedSearchParams = () => new URL(resolvedUrl, url).searchParams;
@@ -335,7 +324,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
335
324
  hadBasePath
336
325
  };
337
326
  let cleanPathnameIsRequestPathname = true;
338
- const matchCleanPathname = () => cleanPathnameIsRequestPathname && options.matchRequestRoute ? options.matchRequestRoute(requestCleanPathname) : options.matchRoute(cleanPathname);
327
+ const matchCleanPathname = () => cleanPathnameIsRequestPathname && options.matchRequestRoute ? options.matchRequestRoute(requestPathname) : options.matchRoute(cleanPathname);
339
328
  if (interceptionIdHeader !== null && (!isRscRequest || interceptionContextHeader === null || request.method !== "GET" && request.method !== "HEAD" || !options.hasInterceptionId(interceptionIdHeader))) {
340
329
  setInterceptionResponseUncacheable(true);
341
330
  return badRequestResponse();
@@ -352,7 +341,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
352
341
  if (sourceMatch.interceptionSourceIsConcrete !== void 0) return sourceMatch.interceptionSourceIsConcrete;
353
342
  return sourceContext !== null && (options.matchRequestRoute ?? options.matchRoute)(sourceContext)?.route === sourceMatch.route;
354
343
  };
355
- if (provesConcreteInterceptionSource(hadBasePath && hasRawInterceptionContext && interceptionContextHeader !== null ? options.matchInterceptRoute?.(requestCleanPathname, interceptionContextHeader, interceptionIdHeader) ?? null : null)) setInterceptionResponseUncacheable(false);
344
+ if (provesConcreteInterceptionSource(hadBasePath && hasRawInterceptionContext && interceptionContextHeader !== null ? options.matchInterceptRoute?.(requestPathname, interceptionContextHeader, interceptionIdHeader) ?? null : null)) setInterceptionResponseUncacheable(false);
356
345
  if (pathname === "/__vinext/prerender/static-params" || pathname === "/__vinext/prerender/pages-static-paths" || pathname === "/__vinext/prerender/metadata-routes") {
357
346
  const { handleAppPrerenderEndpoint } = await import("./app-prerender-endpoints.js");
358
347
  const prerenderEndpointResponse = await handleAppPrerenderEndpoint(request, {
@@ -368,16 +357,16 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
368
357
  if (prerenderEndpointResponse) return prerenderEndpointResponse;
369
358
  }
370
359
  if (!isDataRequest && !options.skipTrailingSlashRedirect) {
371
- const trailingSlashRedirect = options.trailingSlash && options.isMetadataRoutePath && await options.isMetadataRoutePath(cleanPathname) ? null : normalizeTrailingSlash(requestCleanPathname, hadBasePath ? options.basePath : "", options.trailingSlash, url.search);
360
+ const trailingSlashRedirect = options.trailingSlash && options.isMetadataRoutePath && await options.isMetadataRoutePath(cleanPathname) ? null : normalizeTrailingSlash(requestPathname, hadBasePath ? options.basePath : "", options.trailingSlash, url.search);
372
361
  if (trailingSlashRedirect) return trailingSlashRedirect;
373
362
  }
374
363
  const matchPathname = (p) => normalizeDefaultLocalePathname(p, options.i18nConfig, { hostname: url.hostname });
375
- const restoreLocaleRootTrailingSlash = !pagesDataRequest && shouldRestoreLocaleRootTrailingSlash(stripRscSuffix(url.pathname), options);
376
- const headerMatchPathname = normalizeDefaultLocalePathname(requestCleanPathname, options.i18nConfig, {
364
+ const restoreLocaleRootTrailingSlash = !pagesDataRequest && shouldRestoreLocaleRootTrailingSlash(url.pathname, options);
365
+ const headerMatchPathname = normalizeDefaultLocalePathname(requestPathname, options.i18nConfig, {
377
366
  hostname: url.hostname,
378
367
  restoreRootTrailingSlash: restoreLocaleRootTrailingSlash
379
368
  });
380
- const redirectPathname = matchPathname(requestCleanPathname);
369
+ const redirectPathname = matchPathname(requestPathname);
381
370
  const configMatchers = HAS_CONFIG_REDIRECTS && options.configRedirects.length ? await import("../config/config-matchers.js") : null;
382
371
  const redirect = configMatchers ? configMatchers.matchRedirect(redirectPathname, options.configRedirects, preMiddlewareRequestContext, basePathState, dispatchResponseStage ? void 0 : markConditionalRedirectCacheability) : null;
383
372
  if (configMatchers && redirect) {
@@ -403,9 +392,8 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
403
392
  };
404
393
  const runMiddleware = isOnDemandRevalidateRequest(request.headers.get("x-prerender-revalidate")) ? void 0 : options.runMiddleware;
405
394
  const isolatedMiddlewareSource = runMiddleware && request.body && !request.bodyUsed ? request.clone() : null;
406
- const normalizedUserlandRequest = requestWithoutRscSuffix(request);
407
- const userlandRequest = requestWithoutRscCacheBustingSearchParam(normalizedUserlandRequest);
408
- const isolatedMiddlewareRequest = isolatedMiddlewareSource ? requestWithoutRscCacheBustingSearchParam(requestWithoutRscSuffix(isolatedMiddlewareSource)) : void 0;
395
+ const userlandRequest = requestWithoutRscCacheBustingSearchParam(request);
396
+ const isolatedMiddlewareRequest = isolatedMiddlewareSource ? requestWithoutRscCacheBustingSearchParam(isolatedMiddlewareSource) : void 0;
409
397
  let didMiddlewareRewrite = false;
410
398
  let didMiddlewareRewritePathname = false;
411
399
  let resolvedPathnameHasBasePath = hadBasePath;
@@ -417,7 +405,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
417
405
  const middlewareResult = await runMiddleware({
418
406
  cleanPathname,
419
407
  context: middlewareContext,
420
- externalRewriteRequest: normalizedUserlandRequest,
408
+ externalRewriteRequest: request,
421
409
  hadBasePath,
422
410
  isDataRequest: isMiddlewareDataRequest,
423
411
  middlewareRequest: isolatedMiddlewareRequest,
@@ -452,8 +440,8 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
452
440
  cleanPathname = middlewareResult.cleanPathname;
453
441
  didMiddlewareRewrite = middlewareResult.rewritten;
454
442
  if (didMiddlewareRewrite) resolvedPathnameHasBasePath = middlewareResult.rewriteHadBasePath ?? true;
455
- if (didMiddlewareRewrite || cleanPathname !== normalized.cleanPathname) cleanPathnameIsRequestPathname = false;
456
- didMiddlewareRewritePathname = cleanPathname !== normalized.cleanPathname;
443
+ if (didMiddlewareRewrite || cleanPathname !== pathname) cleanPathnameIsRequestPathname = false;
444
+ didMiddlewareRewritePathname = cleanPathname !== pathname;
457
445
  if (middlewareResult.search !== null) url.search = middlewareResult.search;
458
446
  resolvedUrl = cleanPathname + url.search;
459
447
  }
@@ -509,7 +497,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
509
497
  const rscPath = canonicalRsc.navigation ? createCanonicalRscRequestUrl(dispatchRequest.url) : await createRscRequestUrl(dispatchRequest.url, canonicalRsc.headers);
510
498
  dispatchRequest = cloneRequestWithUrl(dispatchRequest, new URL(rscPath, dispatchRequest.url).toString());
511
499
  }
512
- const cacheIdentity = cache === "shared" && responseStagePolicy === null && stageProps.kind === "app-page" && stageProps.matchKind !== "interception" && stageProps.interceptionContext === null && stageProps.interceptionId === null && stageProps.mountedSlotsHeader === null && adapterUsesQueryFreeCacheIdentity() ? createSharedAppPageCacheIdentity(dispatchRequest, stageProps) : void 0;
500
+ 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);
513
501
  let response = await dispatchResponseStage(dispatchRequest, stageProps, cacheIdentity ? {
514
502
  cache,
515
503
  cacheIdentity
@@ -540,7 +528,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
540
528
  };
541
529
  const renderMetadataRouteIfMatched = async () => {
542
530
  if (!filesystemRouteEligible || (options.isMetadataRoute ? !options.isMetadataRoute(cleanPathname) : !options.handleMetadataRouteRequest)) return null;
543
- const metadataRoutePathname = cleanPathnameIsRequestPathname ? requestCleanPathname : cleanPathname;
531
+ const metadataRoutePathname = cleanPathnameIsRequestPathname ? requestPathname : cleanPathname;
544
532
  const metadataResponseStage = transportedResponseStage ?? options.renderResponseStageLocally;
545
533
  if (metadataResponseStage) {
546
534
  const response = await metadataResponseStage(responseStageRequest(), {
@@ -553,7 +541,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
553
541
  isRscRequest,
554
542
  middlewareCookieOverlay,
555
543
  mountedSlotsHeader,
556
- protocolVersion: 11,
544
+ protocolVersion: 13,
557
545
  requestOrigin: url.origin,
558
546
  renderMode,
559
547
  resolvedUrl,
@@ -620,9 +608,9 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
620
608
  basePathState: currentBasePathState(),
621
609
  clearRequestContext: options.clearRequestContext,
622
610
  middlewareContext,
623
- request: normalizedUserlandRequest,
611
+ request,
624
612
  requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
625
- paramsPathname: matchPathname(cleanPathnameIsRequestPathname ? requestCleanPathname : cleanPathname),
613
+ paramsPathname: matchPathname(cleanPathnameIsRequestPathname ? requestPathname : cleanPathname),
626
614
  rewrites: [rewrite],
627
615
  validateExternalRewriteRequest: () => validateClaimedOutsideBasePathRsc(true)
628
616
  }, matchPathname(cleanPathname), dispatchResponseStage === void 0);
@@ -667,7 +655,6 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
667
655
  const publicFileResponse = resolvePublicFileRoute({
668
656
  cleanPathname: cleanPathnameIsRequestPathname ? cleanPathname : normalizePathnameForRouteMatch(cleanPathname),
669
657
  middlewareContext,
670
- pathname,
671
658
  publicFiles: options.publicFiles,
672
659
  request
673
660
  });
@@ -684,7 +671,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
684
671
  params: {}
685
672
  });
686
673
  const directPreActionMatch = filesystemRouteEligible ? matchCleanPathname() : null;
687
- const preActionRoutePathname = cleanPathnameIsRequestPathname ? requestCleanPathname : cleanPathname;
674
+ const preActionRoutePathname = cleanPathnameIsRequestPathname ? requestPathname : cleanPathname;
688
675
  let interceptionSourceContext = interceptionSourcePathname !== null ? interceptionContextHeader : null;
689
676
  let interceptionSourceMatch = filesystemRouteEligible && interceptionSourcePathname !== null && interceptionContextHeader !== null ? options.matchInterceptRoute?.(preActionRoutePathname, interceptionContextHeader, interceptionIdHeader) ?? null : null;
690
677
  let hasVerifiedInterceptionSource = provesConcreteInterceptionSource(interceptionSourceMatch);
@@ -753,7 +740,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
753
740
  sourceMiddlewareResult = await runWithHeadersContext(sourceHeadersContext, () => runMiddleware({
754
741
  cleanPathname: decodedSourceRequestPathname,
755
742
  context: sourceMiddlewareContext,
756
- externalRewriteRequest: normalizedUserlandRequest,
743
+ externalRewriteRequest: request,
757
744
  hadBasePath: resolvedPathnameHasBasePath,
758
745
  isDataRequest: isMiddlewareDataRequest,
759
746
  request: sourceMiddlewareRequest,
@@ -796,21 +783,22 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
796
783
  sourceRulesPathname = sourceMiddlewareResult.cleanPathname;
797
784
  }
798
785
  }
799
- if (HAS_CONFIG_REWRITES && options.configRewrites.beforeFiles.length) {
786
+ if (HAS_CONFIG_REWRITES && (options.configRewrites.beforeFiles.length || options.configRewrites.afterFiles.length)) {
800
787
  const { matchRewrite } = await import("../config/config-matchers.js");
801
788
  const sourceRewriteContext = requestContextForResolvedUrl(buildPostMwRequestContext(userlandRequest), resolvedUrl, url);
802
- let didRewriteSource = false;
803
- for (const rewrite of options.configRewrites.beforeFiles) {
804
- const destination = matchRewrite(matchPathname(sourceRulesPathname), [rewrite], sourceRewriteContext, currentBasePathState(), matchPathname(sourceRulesPathname), dispatchResponseStage === void 0 ? markConditionalRewriteCacheability : void 0);
805
- if (!destination) continue;
806
- if (isExternalUrl(destination) || destination.includes("?")) {
807
- options.clearRequestContext();
808
- return notFoundResponse();
789
+ const rewriteSource = (rewrites, stopAtRoute) => {
790
+ let didRewriteSource = false;
791
+ for (const rewrite of rewrites) {
792
+ const destination = matchRewrite(matchPathname(sourceRulesPathname), [rewrite], sourceRewriteContext, currentBasePathState(), matchPathname(sourceRulesPathname), dispatchResponseStage === void 0 ? markConditionalRewriteCacheability : void 0);
793
+ if (!destination) continue;
794
+ if (isExternalUrl(destination) || destination.includes("?")) return false;
795
+ sourceRulesPathname = pathnameForResolvedUrl(destination);
796
+ didRewriteSource = true;
797
+ if (stopAtRoute && options.matchRoute(sourceRulesPathname)) break;
809
798
  }
810
- sourceRulesPathname = pathnameForResolvedUrl(destination);
811
- didRewriteSource = true;
812
- }
813
- if (didRewriteSource && !adoptRewrittenInterceptionSource(sourceRulesPathname)) {
799
+ return !didRewriteSource || adoptRewrittenInterceptionSource(sourceRulesPathname);
800
+ };
801
+ if (!rewriteSource(options.configRewrites.beforeFiles, false) || interceptionSourceMatch.route.isDynamic && !rewriteSource(options.configRewrites.afterFiles, true)) {
814
802
  options.clearRequestContext();
815
803
  return notFoundResponse();
816
804
  }
@@ -835,7 +823,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
835
823
  const isInterceptionMatch = interceptionPreActionMatch !== null;
836
824
  const rendersRawRequestMatch = options.matchRawRequestRoute !== void 0 && (isPossibleAppRouteActionRequest(request) || isDraftModeRequest(request, options.draftModeSecret) || isDraftModeEnabled());
837
825
  const usesRawRequestMatch = () => rendersRawRequestMatch && cleanPathnameIsRequestPathname && !isInterceptionMatch;
838
- const renderedRouteMatch = (routeMatch) => routeMatch !== null && usesRawRequestMatch() ? options.matchRawRequestRoute(requestCleanPathname) ?? routeMatch : routeMatch;
826
+ const renderedRouteMatch = (routeMatch) => routeMatch !== null && usesRawRequestMatch() ? options.matchRawRequestRoute(requestPathname) ?? routeMatch : routeMatch;
839
827
  const renderedPreActionMatch = renderedRouteMatch(preActionMatch);
840
828
  if (renderedPreActionMatch) setRootParams(pickRootParams(renderedPreActionMatch.params, renderedPreActionMatch.route.rootParamNames));
841
829
  if (pagesDataRequest && didMiddlewareRewritePathname && preActionMatch && !preActionMatch.route.isDynamic) {
@@ -858,9 +846,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
858
846
  if (routeMatch && isAppRouteHandlerRoute(routeMatch.route)) return null;
859
847
  if (!options.handleServerActionRequest) return createMissingServerActionResponse(options, actionId);
860
848
  const sourceConfigHeaders = new Headers();
861
- const sourceConfigUrl = new URL(request.url);
862
- sourceConfigUrl.pathname = hadBasePath ? addBasePathToPathname(requestCleanPathname, options.basePath) : requestCleanPathname;
863
- await applyAppRscConfigHeaders(sourceConfigHeaders, cloneRequestWithUrl(request, sourceConfigUrl.toString()), {
849
+ await applyAppRscConfigHeaders(sourceConfigHeaders, request, {
864
850
  basePath: options.basePath,
865
851
  configHeaders: options.configHeaders,
866
852
  i18nConfig: options.i18nConfig,
@@ -919,12 +905,17 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
919
905
  let match = preActionMatch;
920
906
  const renderPagesForMatchKind = async (matchKind) => {
921
907
  if (!filesystemRouteEligible) return null;
922
- const pagesRouteUrl = cleanPathnameIsRequestPathname ? requestCleanPathname + resolvedUrl.slice(pathnameForResolvedUrl(resolvedUrl).length) : resolvedUrl;
908
+ const pagesRouteUrl = cleanPathnameIsRequestPathname ? requestPathname + resolvedUrl.slice(pathnameForResolvedUrl(resolvedUrl).length) : resolvedUrl;
923
909
  let sharedOuterPolicyNeedsReconciliation = false;
924
- const dispatchPagesResponseStage = dispatchResponseStage ? async (stageRequest, resourceKind, dataKind, hasRequestAwareDocument) => {
910
+ const dispatchPagesResponseStage = dispatchResponseStage ? async (stageRequest, resourceKind, dataKind, hasRequestAwareDocument, runsInitialProps) => {
925
911
  const pagesOnDemandRevalidate = resourceKind === "page" && isOnDemandRevalidateRequest(stageRequest.headers.get("x-prerender-revalidate"));
926
912
  const cache = responseStageProbeMode || pagesOnDemandRevalidate || hasPagesPreviewCookie(stageRequest.headers.get("cookie")) || resourceKind === "page" && dataKind === "static" && hasRequestAwareDocument ? "bypass" : canUseSharedWorkerResponseStage ? "shared" : "bypass";
927
- let response = await dispatchResponseStage(responseStageRequest(stageRequest), {
913
+ const renderRequest = responseStageRequest(stageRequest);
914
+ const sharedAcrossHosts = (cache === "shared" || responseStageProbeMode !== null) && resourceKind === "page" && pagesPageSharesAcrossHosts({
915
+ dataKind,
916
+ runsInitialProps
917
+ }) && adapterUsesSharedCacheIdentity();
918
+ const hybridProps = {
928
919
  kind: "hybrid-pages",
929
920
  buildId: options.buildId,
930
921
  cacheability: {
@@ -945,13 +936,18 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
945
936
  matchKind,
946
937
  middlewareCookieOverlay,
947
938
  preHandlerHeaders: cache === "shared" && resourceKind === "page" && dataKind === "static" ? null : [...await loadPreHandlerResponseHeaders()],
948
- protocolVersion: 11,
939
+ protocolVersion: 13,
949
940
  requestOrigin: url.origin,
950
941
  resourceKind,
951
942
  requestUrl: request.url,
952
943
  resolvedUrl: pagesRouteUrl,
953
- scriptNonce: scriptNonce ?? null
954
- }, { cache });
944
+ scriptNonce: scriptNonce ?? null,
945
+ sharedAcrossHosts
946
+ };
947
+ let response = await dispatchResponseStage(renderRequest, hybridProps, cache === "shared" && sharedAcrossHosts ? {
948
+ cache,
949
+ cacheIdentity: createSharedHybridPagesCacheIdentity(renderRequest, hybridProps, pagesCacheIdentityOrigin(request.url, options.i18nConfig))
950
+ } : { cache });
955
951
  const policyOwner = resourceKind === "page" ? consumePagesResponseStagePolicyOwner(response) : {
956
952
  owner: null,
957
953
  response
@@ -1003,9 +999,9 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
1003
999
  basePathState: currentBasePathState(),
1004
1000
  clearRequestContext: options.clearRequestContext,
1005
1001
  middlewareContext,
1006
- request: normalizedUserlandRequest,
1002
+ request,
1007
1003
  requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
1008
- paramsPathname: matchPathname(cleanPathnameIsRequestPathname ? requestCleanPathname : cleanPathname),
1004
+ paramsPathname: matchPathname(cleanPathnameIsRequestPathname ? requestPathname : cleanPathname),
1009
1005
  rewrites: [rewrite],
1010
1006
  validateExternalRewriteRequest: () => validateClaimedOutsideBasePathRsc(true)
1011
1007
  }, matchPathname(cleanPathname), dispatchResponseStage === void 0);
@@ -1051,9 +1047,9 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
1051
1047
  basePathState: currentBasePathState(),
1052
1048
  clearRequestContext: options.clearRequestContext,
1053
1049
  middlewareContext,
1054
- request: normalizedUserlandRequest,
1050
+ request,
1055
1051
  requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
1056
- paramsPathname: matchPathname(cleanPathnameIsRequestPathname ? requestCleanPathname : cleanPathname),
1052
+ paramsPathname: matchPathname(cleanPathnameIsRequestPathname ? requestPathname : cleanPathname),
1057
1053
  rewrites: [rewrite],
1058
1054
  validateExternalRewriteRequest: () => validateClaimedOutsideBasePathRsc(true)
1059
1055
  }, matchPathname(cleanPathname), dispatchResponseStage === void 0);
@@ -1090,7 +1086,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
1090
1086
  if (match) break;
1091
1087
  }
1092
1088
  if (interceptionCacheProofInvalidated && interceptionSourceContext !== null) {
1093
- const finalInterceptionTargetPathname = cleanPathnameIsRequestPathname ? requestCleanPathname : cleanPathname;
1089
+ const finalInterceptionTargetPathname = cleanPathnameIsRequestPathname ? requestPathname : cleanPathname;
1094
1090
  const finalInterceptionSourceMatch = filesystemRouteEligible && match !== null ? options.matchInterceptRoute?.(finalInterceptionTargetPathname, interceptionSourceContext, interceptionIdHeader) ?? null : null;
1095
1091
  const hasVerifiedFinalInterceptionSource = hasVerifiedInterceptionSource && interceptionSourceMatch !== null && provesConcreteInterceptionSource(finalInterceptionSourceMatch) && finalInterceptionSourceMatch?.route === interceptionSourceMatch.route && haveSamePageParams(finalInterceptionSourceMatch.params, interceptionSourceMatch.params);
1096
1092
  if (interceptionIdHeader !== null && !hasVerifiedFinalInterceptionSource) {
@@ -1134,7 +1130,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
1134
1130
  const finalRouteMatch = renderedRouteMatch(match);
1135
1131
  setRootParams(finalRouteMatch ? pickRootParams(finalRouteMatch.params, finalRouteMatch.route.rootParamNames) : null);
1136
1132
  if (isServerActionRequest) {
1137
- const serverActionResponse = await handleServerAction(finalRouteMatch, cleanPathnameIsRequestPathname ? requestCleanPathname : cleanPathname);
1133
+ const serverActionResponse = await handleServerAction(finalRouteMatch, cleanPathnameIsRequestPathname ? requestPathname : cleanPathname);
1138
1134
  if (serverActionResponse) return serverActionResponse;
1139
1135
  } else {
1140
1136
  const progressiveActionResult = await handleProgressiveAction(finalRouteMatch, match);
@@ -1159,7 +1155,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
1159
1155
  isRscRequest,
1160
1156
  middlewareCookieOverlay,
1161
1157
  mountedSlotsHeader,
1162
- protocolVersion: 11,
1158
+ protocolVersion: 13,
1163
1159
  requestOrigin: url.origin,
1164
1160
  renderMode,
1165
1161
  resolvedUrl,
@@ -1180,7 +1176,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
1180
1176
  }
1181
1177
  match = renderedRouteMatch(match);
1182
1178
  const { route, params } = match;
1183
- const requestPathnameDiffersFromCachePath = requestCleanPathname !== cleanPathname;
1179
+ const requestPathnameDiffersFromCachePath = requestPathname !== cleanPathname;
1184
1180
  const rawRequestPathnameIsObservable = isInterceptionMatch || route.routeHandler != null || typeof route.__loadRouteHandler === "function";
1185
1181
  if ((!isInterceptionMatch || requestPathnameDiffersFromCachePath) && options.matchRequestRoute) {
1186
1182
  const cachePathMatch = options.matchRoute(cleanPathname);
@@ -1207,7 +1203,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
1207
1203
  const isPrerenderFallbackShell = prerenderRouteParamsMatch?.kind === "fallback-shell";
1208
1204
  const renderParams = prerenderRouteParams ?? params;
1209
1205
  const responseStageMatchKind = isInterceptionMatch ? "interception" : cleanPathnameIsRequestPathname && options.matchRequestRoute ? usesRawRequestMatch() ? "raw-request" : "request" : "resolved";
1210
- const responseStageRoutePathname = isInterceptionMatch ? preActionRoutePathname : cleanPathnameIsRequestPathname ? requestCleanPathname || "/" : cleanPathname || "/";
1206
+ const responseStageRoutePathname = isInterceptionMatch ? preActionRoutePathname : cleanPathnameIsRequestPathname ? requestPathname || "/" : cleanPathname || "/";
1211
1207
  const matchedResponseStage = transportedResponseStage ?? options.renderResponseStageLocally;
1212
1208
  let runtimeFallbackShells = [];
1213
1209
  if (options.createPprFallbackShells && request.method === "GET" && !isRscRequest && !isPrerenderFallbackShell && route.params) runtimeFallbackShells = options.createPprFallbackShells({
@@ -1223,7 +1219,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
1223
1219
  const rootParams = pickRootParams(renderParams, route.rootParamNames);
1224
1220
  setRootParams(rootParams);
1225
1221
  if (route.routeHandler) {
1226
- const routeHandlerRequest = isEdgeRouteHandler(route.routeHandler) ? userlandRequest : normalizedUserlandRequest;
1222
+ const routeHandlerRequest = isEdgeRouteHandler(route.routeHandler) ? userlandRequest : request;
1227
1223
  const routeHandlerUrl = new URL(routeHandlerRequest.url);
1228
1224
  const internalRscValues = isEdgeRouteHandler(route.routeHandler) ? [] : routeHandlerUrl.searchParams.getAll(VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM);
1229
1225
  routeHandlerUrl.search = resolvedSearchParams.toString();
@@ -1246,7 +1242,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
1246
1242
  middlewareCookieOverlay,
1247
1243
  mountedSlotsHeader,
1248
1244
  params,
1249
- protocolVersion: 11,
1245
+ protocolVersion: 13,
1250
1246
  requestOrigin: url.origin,
1251
1247
  renderMode,
1252
1248
  resolvedUrl,
@@ -1288,7 +1284,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
1288
1284
  middlewareCookieOverlay,
1289
1285
  mountedSlotsHeader,
1290
1286
  params,
1291
- protocolVersion: 11,
1287
+ protocolVersion: 13,
1292
1288
  requestOrigin: url.origin,
1293
1289
  renderMode,
1294
1290
  resolvedUrl,
@@ -1298,7 +1294,6 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
1298
1294
  }).then(composeResponseStageResponse) : await options.dispatchMatchedPage({
1299
1295
  bypassInterceptionContextCache,
1300
1296
  cachePathname,
1301
- clientReuseManifest,
1302
1297
  cleanPathname,
1303
1298
  displayPathname: canonicalPathname,
1304
1299
  formState: progressiveActionFormState?.formState ?? null,
@@ -1307,7 +1302,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
1307
1302
  handlerStart,
1308
1303
  interceptionContext: interceptionSourceContext,
1309
1304
  interceptionId: interceptionIdHeader,
1310
- interceptionPathname: cleanPathnameIsRequestPathname ? requestCleanPathname : cleanPathname,
1305
+ interceptionPathname: cleanPathnameIsRequestPathname ? requestPathname : cleanPathname,
1311
1306
  isProgressiveActionRender: progressiveActionFormState !== null,
1312
1307
  isRscRequest,
1313
1308
  middlewareContext,
@@ -1370,8 +1365,9 @@ function applyProgressiveActionSideEffects(response, sideEffects) {
1370
1365
  }
1371
1366
  /** Build the request-only handler without retaining the response renderer graph. */
1372
1367
  function createAppRscRequestHandler(options) {
1373
- const handleAppRscRequestLifecycle = async (rawRequest, ctx, allowInternalRscDocumentFallback = false, dispatchResponseStage, responseStageProbeMode = null, transportedPrerenderState) => {
1374
- const rawRequestSignal = rawRequest.signal;
1368
+ const handleAppRscRequestLifecycle = async (hostRequest, ctx, allowInternalRscDocumentFallback = false, dispatchResponseStage, responseStageProbeMode = null, transportedPrerenderState) => {
1369
+ const rawRequestSignal = hostRequest.signal;
1370
+ const rawRequest = stripRequestUrlFragment(hostRequest);
1375
1371
  const mwCtx = openForwardedMiddlewareContext(rawRequest.headers.get(VINEXT_MW_CTX_HEADER), options.devForwardedMiddlewareContextKey);
1376
1372
  const pagesDataUrl = new URL(rawRequest.url);
1377
1373
  const pagesDataInScope = !options.basePath || hasBasePath(pagesDataUrl.pathname, options.basePath);
@@ -1406,6 +1402,7 @@ function createAppRscRequestHandler(options) {
1406
1402
  const requestContext = createRequestContext({
1407
1403
  headersContext,
1408
1404
  executionContext,
1405
+ isOnDemandRevalidate: isOnDemandRevalidateRequest(request.headers.get(PRERENDER_REVALIDATE_HEADER)),
1409
1406
  requestSignal: executionContext?.requestSignal ?? rawRequestSignal,
1410
1407
  unstableCacheRevalidation: "background"
1411
1408
  });
@@ -1434,7 +1431,7 @@ function createAppRscRequestHandler(options) {
1434
1431
  basePath: options.basePath,
1435
1432
  configHeaders: options.configHeaders,
1436
1433
  i18nConfig: options.i18nConfig,
1437
- restoreLocaleRootTrailingSlash: shouldRestoreLocaleRootTrailingSlash(stripRscSuffix(new URL(rawRequest.url).pathname), options),
1434
+ restoreLocaleRootTrailingSlash: shouldRestoreLocaleRootTrailingSlash(new URL(rawRequest.url).pathname, options),
1438
1435
  middlewareHeaders: middlewareContext.headers,
1439
1436
  recordCacheability: dispatchResponseStage === void 0,
1440
1437
  requestContext: preMiddlewareRequestContext
@@ -1462,7 +1459,7 @@ function createAppRscRequestHandler(options) {
1462
1459
  detached: detachedTrace,
1463
1460
  getStatus: (response) => response?.status,
1464
1461
  headers: rawRequest.headers,
1465
- isRsc: traceUrl.pathname.endsWith(".rsc") || rawRequest.headers.get("RSC") === "1",
1462
+ isRsc: rawRequest.headers.get("RSC") === "1",
1466
1463
  method: rawRequest.method,
1467
1464
  target: traceUrl.pathname + traceUrl.search
1468
1465
  });
@@ -1,4 +1,3 @@
1
- import { ClientReuseManifestParseResult } from "./client-reuse-manifest.js";
2
1
  import { AppRscRenderMode } from "./app-rsc-render-mode.js";
3
2
  import { normalizeMountedSlotsHeader } from "./app-mounted-slots-header.js";
4
3
  //#region src/server/app-rsc-request-normalization.d.ts
@@ -7,11 +6,9 @@ export type NormalizedRscRequest = {
7
6
  url: URL;
8
7
  /** Normalized pathname with basePath stripped. Used for all internal routing. */
9
8
  pathname: string;
10
- /** Pathname with `.rsc` suffix removed. Used for route matching and navigation context. */
11
- cleanPathname: string;
12
- /** Original encoded request pathname with basePath and `.rsc` removed. */
13
- requestCleanPathname: string;
14
- /** True when the request targets a canonical `.rsc` payload URL. */
9
+ /** Original encoded request pathname with basePath stripped. */
10
+ requestPathname: string;
11
+ /** True when the request selects the RSC payload with `RSC: 1`. */
15
12
  isRscRequest: boolean;
16
13
  /** Sanitized X-Vinext-Interception-Context header (null bytes stripped). null when absent. */
17
14
  interceptionContextHeader: string | null;
@@ -21,8 +18,6 @@ export type NormalizedRscRequest = {
21
18
  mountedSlotsHeader: string | null;
22
19
  /** Semantic RSC payload mode. HTML requests always normalize to "navigation". */
23
20
  renderMode: AppRscRenderMode;
24
- /** Parsed ClientReuseManifest hint. Verification and skip authorization happen later. */
25
- clientReuseManifest: ClientReuseManifestParseResult;
26
21
  /** Whether the incoming pathname included the configured basePath. */
27
22
  hadBasePath: boolean;
28
23
  };
@@ -45,14 +40,13 @@ export type NormalizedRscRequest = {
45
40
  * 4. Collapse double-slashes, resolve `.` and `..` segments (normalizePath)
46
41
  * 5. basePath check + strip — 404 when pathname lacks the basePath prefix.
47
42
  * `/__vinext/` bypasses this for internal prerender endpoints.
48
- * 6. RSC detection: `.rsc` suffix or Next-style `RSC: 1`. The internal
49
- * `_rsc` cache-busting query is validated separately so full-route Flight
50
- * responses do not share the canonical HTML URL in caches that ignore Vary.
51
- * 7. cleanPathname — pathname with `.rsc` suffix stripped
52
- * 8. Sanitize X-Vinext-Interception-Context — strip null bytes (header injection)
53
- * 9. Normalize x-vinext-mounted-slots — dedup and sort for canonical cache keys
54
- * 10. Read semantic render mode for refresh/action payload rendering
55
- * 11. Parse ClientReuseManifest hints on canonical RSC payload requests
43
+ * 6. RSC detection: `RSC: 1`, as in Next.js. A `.rsc` suffix is an ordinary
44
+ * part of the pathname. The internal `_rsc` cache-busting query is
45
+ * validated separately so full-route Flight responses do not share the
46
+ * canonical HTML URL in caches that ignore Vary.
47
+ * 7. Sanitize X-Vinext-Interception-Context — strip null bytes (header injection)
48
+ * 8. Normalize x-vinext-mounted-slots — dedup and sort for canonical cache keys
49
+ * 9. Read semantic render mode for refresh/action payload rendering
56
50
  *
57
51
  * @returns A 400 or 404 Response for invalid or out-of-scope inputs,
58
52
  * or a NormalizedRscRequest for valid requests.
@@ -1,6 +1,6 @@
1
1
  import { hasBasePath, stripBasePath } from "../utils/base-path.js";
2
2
  import { NEXT_ROUTER_STATE_TREE_HEADER, NEXT_URL_HEADER, VINEXT_INTERCEPTION_CONTEXT_HEADER, VINEXT_INTERCEPTION_ID_HEADER, VINEXT_MOUNTED_SLOTS_HEADER, VINEXT_RSC_RENDER_MODE_HEADER } from "./app-rsc-vary.js";
3
- import { VINEXT_CLIENT_REUSE_MANIFEST_HEADER } from "./headers.js";
3
+ import "./headers.js";
4
4
  import { badRequestResponse, notFoundResponse } from "./http-error-responses.js";
5
5
  import { guardProtocolRelativeUrl } from "./request-pipeline.js";
6
6
  import { assetPrefixPathname, isNextStaticPath } from "../utils/asset-prefix.js";
@@ -8,8 +8,7 @@ import { normalizePathnameForRouteMatchStrict } from "../routing/utils.js";
8
8
  import { normalizePath } from "./normalize-path.js";
9
9
  import { normalizeMountedSlotsHeader } from "./app-mounted-slots-header.js";
10
10
  import { APP_RSC_RENDER_MODE_NAVIGATION, APP_RSC_RENDER_MODE_PREFETCH_EMPTY, APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL, parseAppRscRenderMode } from "./app-rsc-render-mode.js";
11
- import { VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM, stripRscSuffix } from "./app-rsc-cache-busting.js";
12
- import { parseClientReuseManifestHeader } from "./client-reuse-manifest.js";
11
+ import { VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM } from "./app-rsc-cache-busting.js";
13
12
  import { normalizeInterceptionContextHeader } from "./app-interception-context-header.js";
14
13
  //#region src/server/app-rsc-request-normalization.ts
15
14
  function extractFlightRouterStatePath(value, depth = 0) {
@@ -79,14 +78,13 @@ function tryNormalizeComparablePathAndSearch(value, basePath, baseUrl) {
79
78
  * 4. Collapse double-slashes, resolve `.` and `..` segments (normalizePath)
80
79
  * 5. basePath check + strip — 404 when pathname lacks the basePath prefix.
81
80
  * `/__vinext/` bypasses this for internal prerender endpoints.
82
- * 6. RSC detection: `.rsc` suffix or Next-style `RSC: 1`. The internal
83
- * `_rsc` cache-busting query is validated separately so full-route Flight
84
- * responses do not share the canonical HTML URL in caches that ignore Vary.
85
- * 7. cleanPathname — pathname with `.rsc` suffix stripped
86
- * 8. Sanitize X-Vinext-Interception-Context — strip null bytes (header injection)
87
- * 9. Normalize x-vinext-mounted-slots — dedup and sort for canonical cache keys
88
- * 10. Read semantic render mode for refresh/action payload rendering
89
- * 11. Parse ClientReuseManifest hints on canonical RSC payload requests
81
+ * 6. RSC detection: `RSC: 1`, as in Next.js. A `.rsc` suffix is an ordinary
82
+ * part of the pathname. The internal `_rsc` cache-busting query is
83
+ * validated separately so full-route Flight responses do not share the
84
+ * canonical HTML URL in caches that ignore Vary.
85
+ * 7. Sanitize X-Vinext-Interception-Context — strip null bytes (header injection)
86
+ * 8. Normalize x-vinext-mounted-slots — dedup and sort for canonical cache keys
87
+ * 9. Read semantic render mode for refresh/action payload rendering
90
88
  *
91
89
  * @returns A 400 or 404 Response for invalid or out-of-scope inputs,
92
90
  * or a NormalizedRscRequest for valid requests.
@@ -112,9 +110,7 @@ function normalizeRscRequest(request, basePath, allowOutsideBasePath = false, as
112
110
  requestPathname = stripBasePath(requestPathname, basePath);
113
111
  }
114
112
  }
115
- const isRscRequest = pathname.endsWith(".rsc") || request.headers.get("RSC") === "1";
116
- const cleanPathname = stripRscSuffix(pathname);
117
- const requestCleanPathname = stripRscSuffix(requestPathname);
113
+ const isRscRequest = request.headers.get("RSC") === "1";
118
114
  const interceptionContextHeader = normalizeInterceptionContextHeader(request.headers.get(VINEXT_INTERCEPTION_CONTEXT_HEADER));
119
115
  const rawInterceptionId = request.headers.get(VINEXT_INTERCEPTION_ID_HEADER);
120
116
  if (rawInterceptionId !== null && (rawInterceptionId.length > 4096 || !rawInterceptionId.startsWith("interception:"))) return badRequestResponse();
@@ -126,7 +122,7 @@ function normalizeRscRequest(request, basePath, allowOutsideBasePath = false, as
126
122
  const routerState = parsePrefetchRouterState(request.headers.get(NEXT_ROUTER_STATE_TREE_HEADER));
127
123
  if (nextUrl && routerState) {
128
124
  const targetUrl = new URL(url);
129
- targetUrl.pathname = cleanPathname;
125
+ targetUrl.pathname = pathname;
130
126
  targetUrl.searchParams.delete(VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM);
131
127
  const routerPathAndSearch = tryNormalizeComparablePathAndSearch(routerState.pathAndSearch, basePath, url);
132
128
  const nextPathAndSearch = tryNormalizeComparablePathAndSearch(nextUrl, basePath, url);
@@ -135,12 +131,10 @@ function normalizeRscRequest(request, basePath, allowOutsideBasePath = false, as
135
131
  }
136
132
  }
137
133
  return {
138
- clientReuseManifest: isRscRequest ? parseClientReuseManifestHeader(request.headers.get(VINEXT_CLIENT_REUSE_MANIFEST_HEADER)) : { kind: "absent" },
139
134
  hadBasePath,
140
135
  url,
141
136
  pathname,
142
- cleanPathname,
143
- requestCleanPathname,
137
+ requestPathname,
144
138
  isRscRequest,
145
139
  interceptionContextHeader,
146
140
  interceptionIdHeader,
@@ -6,9 +6,9 @@ import { normalizeDefaultLocalePathname } from "./pages-i18n.js";
6
6
  import { isNonCacheableCacheControl } from "../shims/cdn-cache.js";
7
7
  import { captureRouteCacheabilityResponsePolicy } from "../shims/cacheability-classification.js";
8
8
  import { NO_STORE_CACHE_CONTROL, applyCdnResponseHeaders, captureCdnResponsePolicyHeaders, hasExplicitNonCacheableResponsePolicy, isCdnResponsePolicyHeader } from "./cache-control.js";
9
- import "./app-rsc-cache-busting.js";
10
- import { mergeVaryHeader } from "./middleware-response-headers.js";
11
9
  import { hasPostConfigLinkHeaders } from "./app-response-header-provenance.js";
10
+ import { mergeVaryHeader } from "./middleware-response-headers.js";
11
+ import "./app-rsc-cache-busting.js";
12
12
  //#region src/server/app-rsc-response-finalizer.ts
13
13
  const HAS_CONFIG_HEADERS = process.env.__VINEXT_HAS_CONFIG_HEADERS !== "false";
14
14
  const configHeadersAlreadyApplied = /* @__PURE__ */ new WeakSet();