vinext 0.0.49 → 0.0.51

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 (506) hide show
  1. package/dist/build/client-build-config.js.map +1 -1
  2. package/dist/build/google-fonts/build-url.js.map +1 -1
  3. package/dist/build/google-fonts/fallback-metrics-data.js +14031 -0
  4. package/dist/build/google-fonts/fallback-metrics-data.js.map +1 -0
  5. package/dist/build/google-fonts/fallback-metrics.d.ts +13 -0
  6. package/dist/build/google-fonts/fallback-metrics.js +46 -0
  7. package/dist/build/google-fonts/fallback-metrics.js.map +1 -0
  8. package/dist/build/google-fonts/get-axes.js.map +1 -1
  9. package/dist/build/google-fonts/sort-variants.js.map +1 -1
  10. package/dist/build/google-fonts/validate.js.map +1 -1
  11. package/dist/build/layout-classification.js.map +1 -1
  12. package/dist/build/nitro-route-rules.js.map +1 -1
  13. package/dist/build/precompress.d.ts +13 -2
  14. package/dist/build/precompress.js +12 -3
  15. package/dist/build/precompress.js.map +1 -1
  16. package/dist/build/prerender.d.ts +17 -1
  17. package/dist/build/prerender.js +114 -23
  18. package/dist/build/prerender.js.map +1 -1
  19. package/dist/build/report.d.ts +5 -4
  20. package/dist/build/report.js +196 -348
  21. package/dist/build/report.js.map +1 -1
  22. package/dist/build/route-classification-injector.js.map +1 -1
  23. package/dist/build/route-classification-manifest.js.map +1 -1
  24. package/dist/build/run-prerender.js.map +1 -1
  25. package/dist/build/server-manifest.js.map +1 -1
  26. package/dist/build/ssr-manifest.js.map +1 -1
  27. package/dist/build/standalone.js.map +1 -1
  28. package/dist/build/static-export.js.map +1 -1
  29. package/dist/check.js +2 -1
  30. package/dist/check.js.map +1 -1
  31. package/dist/cli-args.js.map +1 -1
  32. package/dist/cli.js +68 -7
  33. package/dist/cli.js.map +1 -1
  34. package/dist/client/instrumentation-client-state.js.map +1 -1
  35. package/dist/client/validate-module-path.js.map +1 -1
  36. package/dist/client/vinext-next-data.d.ts +5 -1
  37. package/dist/client/window-next.d.ts +151 -0
  38. package/dist/client/window-next.js +48 -0
  39. package/dist/client/window-next.js.map +1 -0
  40. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  41. package/dist/cloudflare/tpr.js +2 -1
  42. package/dist/cloudflare/tpr.js.map +1 -1
  43. package/dist/config/config-matchers.d.ts +3 -1
  44. package/dist/config/config-matchers.js +5 -4
  45. package/dist/config/config-matchers.js.map +1 -1
  46. package/dist/config/dotenv.d.ts +11 -1
  47. package/dist/config/dotenv.js.map +1 -1
  48. package/dist/config/next-config.d.ts +93 -6
  49. package/dist/config/next-config.js +233 -6
  50. package/dist/config/next-config.js.map +1 -1
  51. package/dist/config/tsconfig-paths.d.ts +13 -0
  52. package/dist/config/tsconfig-paths.js +117 -0
  53. package/dist/config/tsconfig-paths.js.map +1 -0
  54. package/dist/deploy.js +16 -7
  55. package/dist/deploy.js.map +1 -1
  56. package/dist/entries/app-browser-entry.d.ts +3 -1
  57. package/dist/entries/app-browser-entry.js +36 -2
  58. package/dist/entries/app-browser-entry.js.map +1 -1
  59. package/dist/entries/app-rsc-entry.d.ts +19 -1
  60. package/dist/entries/app-rsc-entry.js +49 -12
  61. package/dist/entries/app-rsc-entry.js.map +1 -1
  62. package/dist/entries/app-rsc-manifest.d.ts +9 -0
  63. package/dist/entries/app-rsc-manifest.js +8 -1
  64. package/dist/entries/app-rsc-manifest.js.map +1 -1
  65. package/dist/entries/app-ssr-entry.js.map +1 -1
  66. package/dist/entries/pages-client-entry.js +3 -5
  67. package/dist/entries/pages-client-entry.js.map +1 -1
  68. package/dist/entries/pages-entry-helpers.js.map +1 -1
  69. package/dist/entries/pages-server-entry.js +34 -1
  70. package/dist/entries/pages-server-entry.js.map +1 -1
  71. package/dist/entries/runtime-entry-module.js.map +1 -1
  72. package/dist/index.js +204 -53
  73. package/dist/index.js.map +1 -1
  74. package/dist/init.js.map +1 -1
  75. package/dist/plugins/async-hooks-stub.js.map +1 -1
  76. package/dist/plugins/client-reference-dedup.d.ts +15 -2
  77. package/dist/plugins/client-reference-dedup.js +138 -16
  78. package/dist/plugins/client-reference-dedup.js.map +1 -1
  79. package/dist/plugins/fonts.d.ts +2 -2
  80. package/dist/plugins/fonts.js +15 -6
  81. package/dist/plugins/fonts.js.map +1 -1
  82. package/dist/plugins/instrumentation-client.js.map +1 -1
  83. package/dist/plugins/og-assets.js.map +1 -1
  84. package/dist/plugins/optimize-imports.js.map +1 -1
  85. package/dist/plugins/postcss.js.map +1 -1
  86. package/dist/plugins/rsc-client-reference-loaders.d.ts +7 -0
  87. package/dist/plugins/rsc-client-reference-loaders.js +48 -0
  88. package/dist/plugins/rsc-client-reference-loaders.js.map +1 -0
  89. package/dist/plugins/rsc-client-shim-excludes.js.map +1 -1
  90. package/dist/plugins/sass.d.ts +34 -0
  91. package/dist/plugins/sass.js +22 -0
  92. package/dist/plugins/sass.js.map +1 -0
  93. package/dist/plugins/server-externals-manifest.js.map +1 -1
  94. package/dist/plugins/strip-server-exports.js.map +1 -1
  95. package/dist/routing/app-route-graph.d.ts +78 -6
  96. package/dist/routing/app-route-graph.js +241 -25
  97. package/dist/routing/app-route-graph.js.map +1 -1
  98. package/dist/routing/app-router.js.map +1 -1
  99. package/dist/routing/file-matcher.js.map +1 -1
  100. package/dist/routing/pages-router.js.map +1 -1
  101. package/dist/routing/route-matching.js.map +1 -1
  102. package/dist/routing/route-pattern.d.ts +56 -1
  103. package/dist/routing/route-pattern.js +60 -1
  104. package/dist/routing/route-pattern.js.map +1 -1
  105. package/dist/routing/route-trie.js.map +1 -1
  106. package/dist/routing/route-validation.js.map +1 -1
  107. package/dist/routing/utils.js.map +1 -1
  108. package/dist/server/api-handler.js.map +1 -1
  109. package/dist/server/app-browser-action-result.d.ts +44 -0
  110. package/dist/server/app-browser-action-result.js +79 -0
  111. package/dist/server/app-browser-action-result.js.map +1 -0
  112. package/dist/server/app-browser-entry.js +330 -133
  113. package/dist/server/app-browser-entry.js.map +1 -1
  114. package/dist/server/app-browser-error.js.map +1 -1
  115. package/dist/server/app-browser-hydration.d.ts +31 -0
  116. package/dist/server/app-browser-hydration.js +30 -0
  117. package/dist/server/app-browser-hydration.js.map +1 -0
  118. package/dist/server/app-browser-navigation-controller.d.ts +20 -4
  119. package/dist/server/app-browser-navigation-controller.js +90 -23
  120. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  121. package/dist/server/app-browser-popstate.d.ts +16 -0
  122. package/dist/server/app-browser-popstate.js +17 -0
  123. package/dist/server/app-browser-popstate.js.map +1 -0
  124. package/dist/server/app-browser-rsc-redirect.d.ts +28 -0
  125. package/dist/server/app-browser-rsc-redirect.js +37 -0
  126. package/dist/server/app-browser-rsc-redirect.js.map +1 -0
  127. package/dist/server/app-browser-state.d.ts +27 -23
  128. package/dist/server/app-browser-state.js +158 -54
  129. package/dist/server/app-browser-state.js.map +1 -1
  130. package/dist/server/app-browser-stream.d.ts +9 -4
  131. package/dist/server/app-browser-stream.js +29 -8
  132. package/dist/server/app-browser-stream.js.map +1 -1
  133. package/dist/server/app-browser-visible-commit.d.ts +11 -1
  134. package/dist/server/app-browser-visible-commit.js +69 -21
  135. package/dist/server/app-browser-visible-commit.js.map +1 -1
  136. package/dist/server/app-client-reference-preloader.js.map +1 -1
  137. package/dist/server/app-elements-wire.d.ts +43 -6
  138. package/dist/server/app-elements-wire.js +121 -5
  139. package/dist/server/app-elements-wire.js.map +1 -1
  140. package/dist/server/app-elements.d.ts +2 -2
  141. package/dist/server/app-elements.js +2 -2
  142. package/dist/server/app-elements.js.map +1 -1
  143. package/dist/server/app-fallback-renderer.d.ts +10 -1
  144. package/dist/server/app-fallback-renderer.js +37 -1
  145. package/dist/server/app-fallback-renderer.js.map +1 -1
  146. package/dist/server/app-history-state.d.ts +26 -0
  147. package/dist/server/app-history-state.js +53 -0
  148. package/dist/server/app-history-state.js.map +1 -0
  149. package/dist/server/app-hook-warning-suppression.js.map +1 -1
  150. package/dist/server/app-middleware.d.ts +1 -1
  151. package/dist/server/app-middleware.js +4 -9
  152. package/dist/server/app-middleware.js.map +1 -1
  153. package/dist/server/app-mounted-slots-header.js.map +1 -1
  154. package/dist/server/app-page-boundary-render.d.ts +11 -1
  155. package/dist/server/app-page-boundary-render.js +27 -19
  156. package/dist/server/app-page-boundary-render.js.map +1 -1
  157. package/dist/server/app-page-boundary.d.ts +1 -0
  158. package/dist/server/app-page-boundary.js +10 -7
  159. package/dist/server/app-page-boundary.js.map +1 -1
  160. package/dist/server/app-page-cache.d.ts +23 -3
  161. package/dist/server/app-page-cache.js +63 -27
  162. package/dist/server/app-page-cache.js.map +1 -1
  163. package/dist/server/app-page-dispatch.d.ts +11 -1
  164. package/dist/server/app-page-dispatch.js +85 -14
  165. package/dist/server/app-page-dispatch.js.map +1 -1
  166. package/dist/server/app-page-element-builder.d.ts +10 -1
  167. package/dist/server/app-page-element-builder.js +38 -6
  168. package/dist/server/app-page-element-builder.js.map +1 -1
  169. package/dist/server/app-page-execution.js +2 -3
  170. package/dist/server/app-page-execution.js.map +1 -1
  171. package/dist/server/app-page-head.d.ts +7 -0
  172. package/dist/server/app-page-head.js +6 -1
  173. package/dist/server/app-page-head.js.map +1 -1
  174. package/dist/server/app-page-method.js.map +1 -1
  175. package/dist/server/app-page-params.js.map +1 -1
  176. package/dist/server/app-page-probe.d.ts +23 -1
  177. package/dist/server/app-page-probe.js +29 -1
  178. package/dist/server/app-page-probe.js.map +1 -1
  179. package/dist/server/app-page-render-observation.d.ts +35 -0
  180. package/dist/server/app-page-render-observation.js +68 -0
  181. package/dist/server/app-page-render-observation.js.map +1 -0
  182. package/dist/server/app-page-render.d.ts +12 -2
  183. package/dist/server/app-page-render.js +90 -7
  184. package/dist/server/app-page-render.js.map +1 -1
  185. package/dist/server/app-page-request.d.ts +1 -0
  186. package/dist/server/app-page-request.js +2 -1
  187. package/dist/server/app-page-request.js.map +1 -1
  188. package/dist/server/app-page-response.d.ts +2 -0
  189. package/dist/server/app-page-response.js +18 -7
  190. package/dist/server/app-page-response.js.map +1 -1
  191. package/dist/server/app-page-route-wiring.d.ts +9 -3
  192. package/dist/server/app-page-route-wiring.js +91 -62
  193. package/dist/server/app-page-route-wiring.js.map +1 -1
  194. package/dist/server/app-page-segment-state.d.ts +10 -0
  195. package/dist/server/app-page-segment-state.js +87 -0
  196. package/dist/server/app-page-segment-state.js.map +1 -0
  197. package/dist/server/app-page-stream.d.ts +9 -2
  198. package/dist/server/app-page-stream.js +4 -1
  199. package/dist/server/app-page-stream.js.map +1 -1
  200. package/dist/server/app-post-middleware-context.js.map +1 -1
  201. package/dist/server/app-prerender-endpoints.js.map +1 -1
  202. package/dist/server/app-prerender-static-params.js.map +1 -1
  203. package/dist/server/app-render-dependency.js.map +1 -1
  204. package/dist/server/app-request-context.js.map +1 -1
  205. package/dist/server/app-route-handler-cache.js.map +1 -1
  206. package/dist/server/app-route-handler-dispatch.js +3 -1
  207. package/dist/server/app-route-handler-dispatch.js.map +1 -1
  208. package/dist/server/app-route-handler-execution.js.map +1 -1
  209. package/dist/server/app-route-handler-policy.js +1 -0
  210. package/dist/server/app-route-handler-policy.js.map +1 -1
  211. package/dist/server/app-route-handler-response.js +4 -3
  212. package/dist/server/app-route-handler-response.js.map +1 -1
  213. package/dist/server/app-route-handler-runtime.js.map +1 -1
  214. package/dist/server/app-router-entry.js +7 -15
  215. package/dist/server/app-router-entry.js.map +1 -1
  216. package/dist/server/app-rsc-cache-busting.d.ts +23 -2
  217. package/dist/server/app-rsc-cache-busting.js +75 -19
  218. package/dist/server/app-rsc-cache-busting.js.map +1 -1
  219. package/dist/server/app-rsc-embedded-chunks.d.ts +9 -0
  220. package/dist/server/app-rsc-embedded-chunks.js +34 -0
  221. package/dist/server/app-rsc-embedded-chunks.js.map +1 -0
  222. package/dist/server/app-rsc-error-handler.js.map +1 -1
  223. package/dist/server/app-rsc-errors.d.ts +4 -1
  224. package/dist/server/app-rsc-errors.js +1 -1
  225. package/dist/server/app-rsc-errors.js.map +1 -1
  226. package/dist/server/app-rsc-handler.d.ts +18 -1
  227. package/dist/server/app-rsc-handler.js +55 -16
  228. package/dist/server/app-rsc-handler.js.map +1 -1
  229. package/dist/server/app-rsc-render-mode.d.ts +11 -0
  230. package/dist/server/app-rsc-render-mode.js +21 -0
  231. package/dist/server/app-rsc-render-mode.js.map +1 -0
  232. package/dist/server/app-rsc-request-normalization.d.ts +4 -1
  233. package/dist/server/app-rsc-request-normalization.js +7 -2
  234. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  235. package/dist/server/app-rsc-response-finalizer.d.ts +2 -1
  236. package/dist/server/app-rsc-response-finalizer.js +6 -1
  237. package/dist/server/app-rsc-response-finalizer.js.map +1 -1
  238. package/dist/server/app-rsc-route-matching.d.ts +23 -0
  239. package/dist/server/app-rsc-route-matching.js +45 -23
  240. package/dist/server/app-rsc-route-matching.js.map +1 -1
  241. package/dist/server/app-segment-config.js.map +1 -1
  242. package/dist/server/app-server-action-execution.d.ts +51 -5
  243. package/dist/server/app-server-action-execution.js +161 -51
  244. package/dist/server/app-server-action-execution.js.map +1 -1
  245. package/dist/server/app-ssr-entry.d.ts +7 -0
  246. package/dist/server/app-ssr-entry.js +44 -14
  247. package/dist/server/app-ssr-entry.js.map +1 -1
  248. package/dist/server/app-ssr-error-meta.d.ts +14 -0
  249. package/dist/server/app-ssr-error-meta.js +50 -0
  250. package/dist/server/app-ssr-error-meta.js.map +1 -0
  251. package/dist/server/app-ssr-stream.d.ts +1 -1
  252. package/dist/server/app-ssr-stream.js +9 -12
  253. package/dist/server/app-ssr-stream.js.map +1 -1
  254. package/dist/server/app-static-generation.js.map +1 -1
  255. package/dist/server/artifact-compatibility.d.ts +12 -2
  256. package/dist/server/artifact-compatibility.js +12 -8
  257. package/dist/server/artifact-compatibility.js.map +1 -1
  258. package/dist/server/cache-control.js +1 -0
  259. package/dist/server/cache-control.js.map +1 -1
  260. package/dist/server/cache-proof.d.ts +124 -5
  261. package/dist/server/cache-proof.js +416 -18
  262. package/dist/server/cache-proof.js.map +1 -1
  263. package/dist/server/csp.js.map +1 -1
  264. package/dist/server/dev-error-overlay-store.js.map +1 -1
  265. package/dist/server/dev-error-overlay.js +5 -0
  266. package/dist/server/dev-error-overlay.js.map +1 -1
  267. package/dist/server/dev-lockfile.d.ts +110 -0
  268. package/dist/server/dev-lockfile.js +180 -0
  269. package/dist/server/dev-lockfile.js.map +1 -0
  270. package/dist/server/dev-module-runner.js.map +1 -1
  271. package/dist/server/dev-origin-check.js.map +1 -1
  272. package/dist/server/dev-route-files.js.map +1 -1
  273. package/dist/server/dev-server.js +23 -10
  274. package/dist/server/dev-server.js.map +1 -1
  275. package/dist/server/file-based-metadata.d.ts +13 -0
  276. package/dist/server/file-based-metadata.js +49 -2
  277. package/dist/server/file-based-metadata.js.map +1 -1
  278. package/dist/server/headers.d.ts +81 -0
  279. package/dist/server/headers.js +104 -0
  280. package/dist/server/headers.js.map +1 -0
  281. package/dist/server/html.js +1 -1
  282. package/dist/server/html.js.map +1 -1
  283. package/dist/server/http-error-responses.d.ts +10 -0
  284. package/dist/server/http-error-responses.js +11 -1
  285. package/dist/server/http-error-responses.js.map +1 -1
  286. package/dist/server/image-optimization.d.ts +11 -1
  287. package/dist/server/image-optimization.js.map +1 -1
  288. package/dist/server/implicit-tags.js +2 -1
  289. package/dist/server/implicit-tags.js.map +1 -1
  290. package/dist/server/instrumentation-runtime.js.map +1 -1
  291. package/dist/server/instrumentation.js.map +1 -1
  292. package/dist/server/isr-cache.d.ts +12 -2
  293. package/dist/server/isr-cache.js +16 -5
  294. package/dist/server/isr-cache.js.map +1 -1
  295. package/dist/server/metadata-route-build-data.js.map +1 -1
  296. package/dist/server/metadata-route-response.js +22 -5
  297. package/dist/server/metadata-route-response.js.map +1 -1
  298. package/dist/server/metadata-routes.js +27 -8
  299. package/dist/server/metadata-routes.js.map +1 -1
  300. package/dist/server/middleware-matcher.js.map +1 -1
  301. package/dist/server/middleware-request-headers.d.ts +4 -1
  302. package/dist/server/middleware-request-headers.js +15 -8
  303. package/dist/server/middleware-request-headers.js.map +1 -1
  304. package/dist/server/middleware-response-headers.d.ts +2 -1
  305. package/dist/server/middleware-response-headers.js +1 -1
  306. package/dist/server/middleware-response-headers.js.map +1 -1
  307. package/dist/server/middleware-runtime.d.ts +1 -0
  308. package/dist/server/middleware-runtime.js +7 -3
  309. package/dist/server/middleware-runtime.js.map +1 -1
  310. package/dist/server/middleware.d.ts +12 -0
  311. package/dist/server/middleware.js +12 -0
  312. package/dist/server/middleware.js.map +1 -1
  313. package/dist/server/navigation-planner.d.ts +133 -0
  314. package/dist/server/navigation-planner.js +432 -0
  315. package/dist/server/navigation-planner.js.map +1 -0
  316. package/dist/server/navigation-trace.d.ts +19 -2
  317. package/dist/server/navigation-trace.js +20 -1
  318. package/dist/server/navigation-trace.js.map +1 -1
  319. package/dist/server/next-error-digest.d.ts +3 -2
  320. package/dist/server/next-error-digest.js +4 -2
  321. package/dist/server/next-error-digest.js.map +1 -1
  322. package/dist/server/normalize-path.d.ts +2 -1
  323. package/dist/server/normalize-path.js +4 -1
  324. package/dist/server/normalize-path.js.map +1 -1
  325. package/dist/server/pages-api-route.js +1 -0
  326. package/dist/server/pages-api-route.js.map +1 -1
  327. package/dist/server/pages-i18n.js.map +1 -1
  328. package/dist/server/pages-media-type.js.map +1 -1
  329. package/dist/server/pages-node-compat.js.map +1 -1
  330. package/dist/server/pages-page-data.d.ts +3 -2
  331. package/dist/server/pages-page-data.js +27 -5
  332. package/dist/server/pages-page-data.js.map +1 -1
  333. package/dist/server/pages-page-response.js +2 -1
  334. package/dist/server/pages-page-response.js.map +1 -1
  335. package/dist/server/prerender-work-unit-setup.js +1 -1
  336. package/dist/server/prerender-work-unit-setup.js.map +1 -1
  337. package/dist/server/prod-server.d.ts +28 -1
  338. package/dist/server/prod-server.js +97 -22
  339. package/dist/server/prod-server.js.map +1 -1
  340. package/dist/server/request-log.js.map +1 -1
  341. package/dist/server/request-pipeline.d.ts +1 -13
  342. package/dist/server/request-pipeline.js +3 -25
  343. package/dist/server/request-pipeline.js.map +1 -1
  344. package/dist/server/rsc-stream-hints.js.map +1 -1
  345. package/dist/server/seed-cache.js.map +1 -1
  346. package/dist/server/server-action-not-found.d.ts +16 -3
  347. package/dist/server/server-action-not-found.js +22 -4
  348. package/dist/server/server-action-not-found.js.map +1 -1
  349. package/dist/server/server-globals.d.ts +5 -0
  350. package/dist/server/server-globals.js +37 -0
  351. package/dist/server/server-globals.js.map +1 -0
  352. package/dist/server/socket-error-backstop.js.map +1 -1
  353. package/dist/server/static-file-cache.js +1 -1
  354. package/dist/server/static-file-cache.js.map +1 -1
  355. package/dist/server/worker-utils.d.ts +0 -7
  356. package/dist/server/worker-utils.js +3 -2
  357. package/dist/server/worker-utils.js.map +1 -1
  358. package/dist/shims/amp.js.map +1 -1
  359. package/dist/shims/app.d.ts +37 -4
  360. package/dist/shims/app.js +50 -1
  361. package/dist/shims/app.js.map +1 -0
  362. package/dist/shims/cache-for-request.js.map +1 -1
  363. package/dist/shims/cache-runtime.d.ts +19 -2
  364. package/dist/shims/cache-runtime.js +87 -19
  365. package/dist/shims/cache-runtime.js.map +1 -1
  366. package/dist/shims/cache.d.ts +20 -21
  367. package/dist/shims/cache.js +101 -15
  368. package/dist/shims/cache.js.map +1 -1
  369. package/dist/shims/client-hook-error.js.map +1 -1
  370. package/dist/shims/compat-router.js.map +1 -1
  371. package/dist/shims/config.js.map +1 -1
  372. package/dist/shims/constants.js.map +1 -1
  373. package/dist/shims/document.js.map +1 -1
  374. package/dist/shims/dynamic.d.ts +18 -10
  375. package/dist/shims/dynamic.js +107 -51
  376. package/dist/shims/dynamic.js.map +1 -1
  377. package/dist/shims/error-boundary.d.ts +35 -6
  378. package/dist/shims/error-boundary.js +116 -33
  379. package/dist/shims/error-boundary.js.map +1 -1
  380. package/dist/shims/error.d.ts +18 -1
  381. package/dist/shims/error.js +56 -1
  382. package/dist/shims/error.js.map +1 -1
  383. package/dist/shims/fetch-cache.d.ts +25 -1
  384. package/dist/shims/fetch-cache.js +159 -13
  385. package/dist/shims/fetch-cache.js.map +1 -1
  386. package/dist/shims/font-google-base.d.ts +22 -8
  387. package/dist/shims/font-google-base.js +41 -71
  388. package/dist/shims/font-google-base.js.map +1 -1
  389. package/dist/shims/font-local.d.ts +3 -20
  390. package/dist/shims/font-local.js +23 -75
  391. package/dist/shims/font-local.js.map +1 -1
  392. package/dist/shims/font-utils.d.ts +51 -0
  393. package/dist/shims/font-utils.js +97 -0
  394. package/dist/shims/font-utils.js.map +1 -0
  395. package/dist/shims/form.js +3 -1
  396. package/dist/shims/form.js.map +1 -1
  397. package/dist/shims/hash-scroll.d.ts +7 -0
  398. package/dist/shims/hash-scroll.js +30 -0
  399. package/dist/shims/hash-scroll.js.map +1 -0
  400. package/dist/shims/head-state.js.map +1 -1
  401. package/dist/shims/head.d.ts +3 -1
  402. package/dist/shims/head.js +28 -16
  403. package/dist/shims/head.js.map +1 -1
  404. package/dist/shims/headers.d.ts +11 -12
  405. package/dist/shims/headers.js +45 -8
  406. package/dist/shims/headers.js.map +1 -1
  407. package/dist/shims/i18n-context.js.map +1 -1
  408. package/dist/shims/i18n-state.js.map +1 -1
  409. package/dist/shims/image-config.d.ts +14 -1
  410. package/dist/shims/image-config.js +24 -1
  411. package/dist/shims/image-config.js.map +1 -1
  412. package/dist/shims/image.d.ts +1 -0
  413. package/dist/shims/image.js +159 -80
  414. package/dist/shims/image.js.map +1 -1
  415. package/dist/shims/internal/als-registry.js.map +1 -1
  416. package/dist/shims/internal/app-router-context.d.ts +7 -6
  417. package/dist/shims/internal/app-router-context.js +17 -6
  418. package/dist/shims/internal/app-router-context.js.map +1 -1
  419. package/dist/shims/internal/cookie-serialize.js.map +1 -1
  420. package/dist/shims/internal/make-hanging-promise.d.ts +1 -1
  421. package/dist/shims/internal/make-hanging-promise.js +1 -1
  422. package/dist/shims/internal/make-hanging-promise.js.map +1 -1
  423. package/dist/shims/internal/parse-cookie-header.js.map +1 -1
  424. package/dist/shims/internal/utils.js.map +1 -1
  425. package/dist/shims/internal/work-unit-async-storage.js +2 -2
  426. package/dist/shims/internal/work-unit-async-storage.js.map +1 -1
  427. package/dist/shims/layout-segment-context.js.map +1 -1
  428. package/dist/shims/legacy-image.js.map +1 -1
  429. package/dist/shims/link-prefetch.d.ts +42 -0
  430. package/dist/shims/link-prefetch.js +45 -0
  431. package/dist/shims/link-prefetch.js.map +1 -0
  432. package/dist/shims/link.d.ts +37 -4
  433. package/dist/shims/link.js +156 -46
  434. package/dist/shims/link.js.map +1 -1
  435. package/dist/shims/metadata.d.ts +16 -30
  436. package/dist/shims/metadata.js +87 -28
  437. package/dist/shims/metadata.js.map +1 -1
  438. package/dist/shims/navigation-state.js.map +1 -1
  439. package/dist/shims/navigation.d.ts +172 -10
  440. package/dist/shims/navigation.js +335 -70
  441. package/dist/shims/navigation.js.map +1 -1
  442. package/dist/shims/navigation.react-server.d.ts +3 -2
  443. package/dist/shims/navigation.react-server.js +5 -2
  444. package/dist/shims/navigation.react-server.js.map +1 -1
  445. package/dist/shims/offline.js.map +1 -1
  446. package/dist/shims/pages-router-runtime.d.ts +7 -0
  447. package/dist/shims/pages-router-runtime.js +16 -0
  448. package/dist/shims/pages-router-runtime.js.map +1 -0
  449. package/dist/shims/readonly-url-search-params.js.map +1 -1
  450. package/dist/shims/request-context.js.map +1 -1
  451. package/dist/shims/root-params.js.map +1 -1
  452. package/dist/shims/router-state.js.map +1 -1
  453. package/dist/shims/router.d.ts +69 -7
  454. package/dist/shims/router.js +232 -249
  455. package/dist/shims/router.js.map +1 -1
  456. package/dist/shims/script-nonce-context.js.map +1 -1
  457. package/dist/shims/script.js +110 -32
  458. package/dist/shims/script.js.map +1 -1
  459. package/dist/shims/server.js +12 -15
  460. package/dist/shims/server.js.map +1 -1
  461. package/dist/shims/slot.d.ts +7 -1
  462. package/dist/shims/slot.js +60 -7
  463. package/dist/shims/slot.js.map +1 -1
  464. package/dist/shims/thenable-params.js.map +1 -1
  465. package/dist/shims/unified-request-context.js +5 -0
  466. package/dist/shims/unified-request-context.js.map +1 -1
  467. package/dist/shims/unrecognized-action-error.d.ts +35 -0
  468. package/dist/shims/unrecognized-action-error.js +41 -0
  469. package/dist/shims/unrecognized-action-error.js.map +1 -0
  470. package/dist/shims/url-safety.js.map +1 -1
  471. package/dist/shims/url-utils.d.ts +22 -1
  472. package/dist/shims/url-utils.js +76 -3
  473. package/dist/shims/url-utils.js.map +1 -1
  474. package/dist/shims/use-merged-ref.js.map +1 -1
  475. package/dist/shims/web-vitals.d.ts +4 -21
  476. package/dist/shims/web-vitals.js +19 -6
  477. package/dist/shims/web-vitals.js.map +1 -1
  478. package/dist/utils/asset-prefix.d.ts +69 -0
  479. package/dist/utils/asset-prefix.js +91 -0
  480. package/dist/utils/asset-prefix.js.map +1 -0
  481. package/dist/utils/base-path.d.ts +7 -1
  482. package/dist/utils/base-path.js +10 -1
  483. package/dist/utils/base-path.js.map +1 -1
  484. package/dist/utils/cache-control-metadata.js.map +1 -1
  485. package/dist/utils/domain-locale.js.map +1 -1
  486. package/dist/utils/encode-cache-tag.d.ts +31 -0
  487. package/dist/utils/encode-cache-tag.js +38 -0
  488. package/dist/utils/encode-cache-tag.js.map +1 -0
  489. package/dist/utils/error-cause.js.map +1 -1
  490. package/dist/utils/hash.js.map +1 -1
  491. package/dist/utils/lazy-chunks.js.map +1 -1
  492. package/dist/utils/manifest-paths.js.map +1 -1
  493. package/dist/utils/mdx-scan.js.map +1 -1
  494. package/dist/utils/navigation-signal.d.ts +5 -0
  495. package/dist/utils/navigation-signal.js +14 -0
  496. package/dist/utils/navigation-signal.js.map +1 -0
  497. package/dist/utils/project.js.map +1 -1
  498. package/dist/utils/public-routes.js.map +1 -1
  499. package/dist/utils/query.js.map +1 -1
  500. package/dist/utils/safe-json-file.js.map +1 -1
  501. package/dist/utils/sorted-array.d.ts +9 -0
  502. package/dist/utils/sorted-array.js +22 -0
  503. package/dist/utils/sorted-array.js.map +1 -0
  504. package/dist/utils/text-stream.js.map +1 -1
  505. package/dist/utils/vinext-root.js.map +1 -1
  506. package/package.json +8 -6
@@ -1 +1 @@
1
- {"version":3,"file":"app-page-cache.js","names":[],"sources":["../../src/server/app-page-cache.ts"],"sourcesContent":["import type { CachedAppPageValue, CacheControlMetadata } from \"vinext/shims/cache\";\nimport { VINEXT_RSC_VARY_HEADER } from \"./app-rsc-cache-busting.js\";\nimport { buildCachedRevalidateCacheControl } from \"./cache-control.js\";\nimport { buildAppPageCacheValue, type ISRCacheEntry } from \"./isr-cache.js\";\nimport { readStreamAsText } from \"../utils/text-stream.js\";\n\ntype AppPageDebugLogger = (event: string, detail: string) => void;\ntype AppPageCacheGetter = (key: string) => Promise<ISRCacheEntry | null>;\ntype AppPageCacheSetter = (\n key: string,\n data: CachedAppPageValue,\n revalidateSeconds: number,\n tags: string[],\n expireSeconds?: number,\n) => Promise<void>;\ntype AppPageBackgroundRegenerator = (key: string, renderFn: () => Promise<void>) => void;\ntype AppPageRequestCacheLife = {\n revalidate?: number;\n expire?: number;\n};\n\ntype AppPageCacheRenderResult = {\n cacheControl?: CacheControlMetadata;\n html: string;\n rscData: ArrayBuffer;\n tags: string[];\n};\n\ntype BuildAppPageCachedResponseOptions = {\n cacheControl?: CacheControlMetadata;\n cacheState: \"HIT\" | \"STALE\";\n expireSeconds?: number;\n isRscRequest: boolean;\n mountedSlotsHeader?: string | null;\n revalidateSeconds: number;\n};\n\ntype ReadAppPageCacheResponseOptions = {\n cleanPathname: string;\n clearRequestContext: () => void;\n isRscRequest: boolean;\n isrDebug?: AppPageDebugLogger;\n isrGet: AppPageCacheGetter;\n isrHtmlKey: (pathname: string) => string;\n isrRscKey: (pathname: string, mountedSlotsHeader?: string | null) => string;\n isrSet: AppPageCacheSetter;\n mountedSlotsHeader?: string | null;\n expireSeconds?: number;\n revalidateSeconds: number;\n renderFreshPageForCache: () => Promise<AppPageCacheRenderResult>;\n scheduleBackgroundRegeneration: AppPageBackgroundRegenerator;\n};\n\ntype FinalizeAppPageHtmlCacheResponseOptions = {\n capturedDynamicUsageBeforeContextCleanup?: () => boolean;\n capturedRscDataPromise: Promise<ArrayBuffer> | null;\n cleanPathname: string;\n consumeDynamicUsage: () => boolean;\n getPageTags: () => string[];\n getRequestCacheLife?: () => AppPageRequestCacheLife | null;\n isrDebug?: AppPageDebugLogger;\n isrHtmlKey: (pathname: string) => string;\n isrRscKey: (pathname: string, mountedSlotsHeader?: string | null) => string;\n isrSet: AppPageCacheSetter;\n preserveClientResponseHeaders?: boolean;\n expireSeconds?: number;\n revalidateSeconds: number | null;\n waitUntil?: (promise: Promise<void>) => void;\n};\n\ntype ScheduleAppPageRscCacheWriteOptions = {\n capturedRscDataPromise: Promise<ArrayBuffer> | null;\n cleanPathname: string;\n consumeDynamicUsage: () => boolean;\n dynamicUsedDuringBuild: boolean;\n getPageTags: () => string[];\n getRequestCacheLife?: () => AppPageRequestCacheLife | null;\n isrDebug?: AppPageDebugLogger;\n isrRscKey: (pathname: string, mountedSlotsHeader?: string | null) => string;\n isrSet: AppPageCacheSetter;\n mountedSlotsHeader?: string | null;\n preserveClientResponseHeaders?: boolean;\n expireSeconds?: number;\n revalidateSeconds: number | null;\n waitUntil?: (promise: Promise<void>) => void;\n};\n\nconst NO_STORE_CACHE_CONTROL = \"no-store, must-revalidate\";\n\nexport function buildAppPageCacheTags(pathname: string, extraTags: readonly string[]): string[] {\n const tags = [pathname, `_N_T_${pathname}`, \"_N_T_/layout\"];\n const segments = pathname.split(\"/\");\n let built = \"\";\n for (let index = 1; index < segments.length; index++) {\n const segment = segments[index];\n if (segment) {\n built += `/${segment}`;\n tags.push(`_N_T_${built}/layout`);\n }\n }\n\n tags.push(`_N_T_${built}/page`);\n for (const tag of extraTags) {\n if (!tags.includes(tag)) {\n tags.push(tag);\n }\n }\n return tags;\n}\n\nfunction buildAppPageCacheControl(\n cacheState: BuildAppPageCachedResponseOptions[\"cacheState\"],\n revalidateSeconds: number,\n expireSeconds?: number,\n): string {\n return buildCachedRevalidateCacheControl(cacheState, revalidateSeconds, expireSeconds);\n}\n\nfunction getCachedAppPageValue(entry: ISRCacheEntry | null): CachedAppPageValue | null {\n return entry?.value.value && entry.value.value.kind === \"APP_PAGE\" ? entry.value.value : null;\n}\n\nfunction resolveAppPageCacheWritePolicy(options: {\n expireSeconds?: number;\n requestCacheLife?: AppPageRequestCacheLife | null;\n revalidateSeconds: number | null;\n}): { expireSeconds?: number; revalidateSeconds: number } | null {\n let revalidateSeconds = options.revalidateSeconds;\n let expireSeconds = options.expireSeconds;\n const requestCacheLife = options.requestCacheLife;\n\n if (requestCacheLife?.revalidate !== undefined) {\n revalidateSeconds =\n revalidateSeconds === null\n ? requestCacheLife.revalidate\n : Math.min(revalidateSeconds, requestCacheLife.revalidate);\n }\n if (requestCacheLife?.expire !== undefined) {\n expireSeconds = requestCacheLife.expire;\n }\n\n if (revalidateSeconds === null || revalidateSeconds <= 0 || !Number.isFinite(revalidateSeconds)) {\n return null;\n }\n\n return { expireSeconds, revalidateSeconds };\n}\n\nexport function buildAppPageCachedResponse(\n cachedValue: CachedAppPageValue,\n options: BuildAppPageCachedResponseOptions,\n): Response | null {\n // Preserve the legacy fallback semantics from the generated entry: invalid\n // falsy statuses still fall back to 200 rather than being forwarded through.\n const status = cachedValue.status || 200;\n const revalidateSeconds = options.cacheControl?.revalidate ?? options.revalidateSeconds;\n const expireSeconds =\n options.cacheControl === undefined\n ? undefined\n : (options.cacheControl.expire ?? options.expireSeconds);\n const headers = {\n \"Cache-Control\": buildAppPageCacheControl(options.cacheState, revalidateSeconds, expireSeconds),\n Vary: VINEXT_RSC_VARY_HEADER,\n \"X-Vinext-Cache\": options.cacheState,\n };\n\n if (options.isRscRequest) {\n if (!cachedValue.rscData) {\n return null;\n }\n\n const rscHeaders: Record<string, string> = {\n \"Content-Type\": \"text/x-component; charset=utf-8\",\n ...headers,\n };\n if (options.mountedSlotsHeader) {\n rscHeaders[\"X-Vinext-Mounted-Slots\"] = options.mountedSlotsHeader;\n }\n\n return new Response(cachedValue.rscData, {\n status,\n headers: rscHeaders,\n });\n }\n\n if (typeof cachedValue.html !== \"string\" || cachedValue.html.length === 0) {\n return null;\n }\n\n return new Response(cachedValue.html, {\n status,\n headers: {\n \"Content-Type\": \"text/html; charset=utf-8\",\n ...headers,\n },\n });\n}\n\nexport async function readAppPageCacheResponse(\n options: ReadAppPageCacheResponseOptions,\n): Promise<Response | null> {\n const isrKey = options.isRscRequest\n ? options.isrRscKey(options.cleanPathname, options.mountedSlotsHeader)\n : options.isrHtmlKey(options.cleanPathname);\n\n try {\n const cached = await options.isrGet(isrKey);\n const cachedValue = getCachedAppPageValue(cached);\n\n if (cachedValue && !cached?.isStale) {\n const hitResponse = buildAppPageCachedResponse(cachedValue, {\n cacheState: \"HIT\",\n cacheControl: cached?.value.cacheControl,\n expireSeconds: options.expireSeconds,\n isRscRequest: options.isRscRequest,\n mountedSlotsHeader: options.mountedSlotsHeader,\n revalidateSeconds: options.revalidateSeconds,\n });\n\n if (hitResponse) {\n options.isrDebug?.(\n options.isRscRequest ? \"HIT (RSC)\" : \"HIT (HTML)\",\n options.cleanPathname,\n );\n options.clearRequestContext();\n return hitResponse;\n }\n\n options.isrDebug?.(\"MISS (empty cached entry)\", options.cleanPathname);\n }\n\n if (cached?.isStale && cachedValue) {\n const regenerationKey = options.isRscRequest\n ? options.isrRscKey(options.cleanPathname, options.mountedSlotsHeader)\n : options.isrHtmlKey(options.cleanPathname);\n\n // Preserve the legacy behavior from the inline generator: stale entries\n // still trigger background regeneration even if this request cannot use\n // the stale payload and will fall through to a fresh render.\n options.scheduleBackgroundRegeneration(regenerationKey, async () => {\n const revalidatedPage = await options.renderFreshPageForCache();\n const revalidateSeconds =\n revalidatedPage.cacheControl?.revalidate ?? options.revalidateSeconds;\n const expireSeconds = revalidatedPage.cacheControl?.expire ?? options.expireSeconds;\n const writes = [\n options.isrSet(\n options.isrRscKey(options.cleanPathname, options.mountedSlotsHeader),\n buildAppPageCacheValue(\"\", revalidatedPage.rscData, 200),\n revalidateSeconds,\n revalidatedPage.tags,\n expireSeconds,\n ),\n ];\n\n if (!options.isRscRequest) {\n // HTML cache is slot-state-independent (canonical), so only refresh it\n // during HTML-triggered regens. RSC-triggered regens only update the\n // requesting client's RSC slot variant; a stale HTML cache entry will\n // be regenerated independently by the next full-page HTML request.\n writes.push(\n options.isrSet(\n options.isrHtmlKey(options.cleanPathname),\n buildAppPageCacheValue(revalidatedPage.html, undefined, 200),\n revalidateSeconds,\n revalidatedPage.tags,\n expireSeconds,\n ),\n );\n }\n\n await Promise.all(writes);\n options.isrDebug?.(\"regen complete\", options.cleanPathname);\n });\n\n const staleResponse = buildAppPageCachedResponse(cachedValue, {\n cacheState: \"STALE\",\n cacheControl: cached.value.cacheControl,\n expireSeconds: options.expireSeconds,\n isRscRequest: options.isRscRequest,\n mountedSlotsHeader: options.mountedSlotsHeader,\n revalidateSeconds: options.revalidateSeconds,\n });\n\n if (staleResponse) {\n options.isrDebug?.(\n options.isRscRequest ? \"STALE (RSC)\" : \"STALE (HTML)\",\n options.cleanPathname,\n );\n options.clearRequestContext();\n return staleResponse;\n }\n\n options.isrDebug?.(\"STALE MISS (empty stale entry)\", options.cleanPathname);\n }\n\n if (!cached) {\n options.isrDebug?.(\"MISS (no cache entry)\", options.cleanPathname);\n }\n } catch (isrReadError) {\n console.error(\"[vinext] ISR cache read error:\", isrReadError);\n }\n\n return null;\n}\n\nexport function finalizeAppPageHtmlCacheResponse(\n response: Response,\n options: FinalizeAppPageHtmlCacheResponseOptions,\n): Response {\n if (!response.body) {\n return response;\n }\n\n const [streamForClient, streamForCache] = response.body.tee();\n const htmlKey = options.isrHtmlKey(options.cleanPathname);\n const rscKey = options.isrRscKey(options.cleanPathname, null);\n const clientHeaders = new Headers(response.headers);\n if (options.preserveClientResponseHeaders !== true) {\n // HTML Server Components can access request APIs while the stream is being\n // consumed. Until that late dynamic check finishes, downstream shared caches\n // must not cache a response whose ISR policy was known before streaming.\n clientHeaders.set(\"Cache-Control\", NO_STORE_CACHE_CONTROL);\n clientHeaders.set(\"X-Vinext-Cache\", \"MISS\");\n }\n\n const cachePromise = (async () => {\n try {\n const cachedHtml = await readStreamAsText(streamForCache);\n\n if (\n options.capturedDynamicUsageBeforeContextCleanup?.() === true ||\n options.consumeDynamicUsage()\n ) {\n options.isrDebug?.(\"HTML cache write skipped (dynamic usage during render)\", htmlKey);\n return;\n }\n\n const cachePolicy = resolveAppPageCacheWritePolicy({\n expireSeconds: options.expireSeconds,\n requestCacheLife: options.getRequestCacheLife?.(),\n revalidateSeconds: options.revalidateSeconds,\n });\n if (!cachePolicy) {\n options.isrDebug?.(\"HTML cache write skipped (no cache policy)\", htmlKey);\n return;\n }\n\n const pageTags = options.getPageTags();\n const writes = [\n options.isrSet(\n htmlKey,\n buildAppPageCacheValue(cachedHtml, undefined, 200),\n cachePolicy.revalidateSeconds,\n pageTags,\n cachePolicy.expireSeconds,\n ),\n ];\n\n if (options.capturedRscDataPromise) {\n writes.push(\n options.capturedRscDataPromise.then((rscData) =>\n options.isrSet(\n rscKey,\n buildAppPageCacheValue(\"\", rscData, 200),\n cachePolicy.revalidateSeconds,\n pageTags,\n cachePolicy.expireSeconds,\n ),\n ),\n );\n }\n\n await Promise.all(writes);\n options.isrDebug?.(\"HTML cache written\", htmlKey);\n } catch (cacheError) {\n console.error(\"[vinext] ISR cache write error:\", cacheError);\n }\n })();\n\n options.waitUntil?.(cachePromise);\n\n return new Response(streamForClient, {\n status: response.status,\n statusText: response.statusText,\n headers: clientHeaders,\n });\n}\n\nexport function finalizeAppPageRscCacheResponse(\n response: Response,\n options: ScheduleAppPageRscCacheWriteOptions,\n): Response {\n const didSchedule = scheduleAppPageRscCacheWrite(options);\n if (!didSchedule) {\n return response;\n }\n\n if (options.preserveClientResponseHeaders === true) {\n return response;\n }\n\n const clientHeaders = new Headers(response.headers);\n // RSC payloads are also streamed lazily. Until the captured stream proves no\n // late request API was used, the client-facing MISS response must not enter a\n // shared cache when the ISR policy was known before streaming.\n clientHeaders.set(\"Cache-Control\", NO_STORE_CACHE_CONTROL);\n clientHeaders.set(\"X-Vinext-Cache\", \"MISS\");\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers: clientHeaders,\n });\n}\n\nexport function scheduleAppPageRscCacheWrite(\n options: ScheduleAppPageRscCacheWriteOptions,\n): boolean {\n const capturedRscDataPromise = options.capturedRscDataPromise;\n if (!capturedRscDataPromise || options.dynamicUsedDuringBuild) {\n return false;\n }\n\n const rscKey = options.isrRscKey(options.cleanPathname, options.mountedSlotsHeader);\n const cachePromise = (async () => {\n try {\n const rscData = await capturedRscDataPromise;\n\n // Two-phase dynamic detection:\n // 1. dynamicUsedDuringBuild catches searchParams-driven opt-in before the\n // RSC response is sent.\n // 2. consumeDynamicUsage() here catches APIs that fire while the RSC\n // stream is consumed (headers(), cookies(), noStore()).\n if (options.consumeDynamicUsage()) {\n options.isrDebug?.(\"RSC cache write skipped (dynamic usage during render)\", rscKey);\n return;\n }\n\n const cachePolicy = resolveAppPageCacheWritePolicy({\n expireSeconds: options.expireSeconds,\n requestCacheLife: options.getRequestCacheLife?.(),\n revalidateSeconds: options.revalidateSeconds,\n });\n if (!cachePolicy) {\n options.isrDebug?.(\"RSC cache write skipped (no cache policy)\", rscKey);\n return;\n }\n\n await options.isrSet(\n rscKey,\n buildAppPageCacheValue(\"\", rscData, 200),\n cachePolicy.revalidateSeconds,\n options.getPageTags(),\n cachePolicy.expireSeconds,\n );\n options.isrDebug?.(\"RSC cache written\", rscKey);\n } catch (cacheError) {\n console.error(\"[vinext] ISR RSC cache write error:\", cacheError);\n }\n })();\n\n options.waitUntil?.(cachePromise);\n return true;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"app-page-cache.js","names":[],"sources":["../../src/server/app-page-cache.ts"],"sourcesContent":["import type { CachedAppPageValue, CacheControlMetadata } from \"vinext/shims/cache\";\nimport {\n VINEXT_RSC_CONTENT_TYPE,\n VINEXT_RSC_VARY_HEADER,\n applyRscCompatibilityIdHeader,\n} from \"./app-rsc-cache-busting.js\";\nimport { buildCachedRevalidateCacheControl } from \"./cache-control.js\";\nimport { VINEXT_CACHE_HEADER, VINEXT_MOUNTED_SLOTS_HEADER } from \"./headers.js\";\nimport { buildAppPageCacheValue, type ISRCacheEntry } from \"./isr-cache.js\";\nimport { mergeMiddlewareResponseHeaders } from \"./middleware-response-headers.js\";\nimport { readStreamAsText } from \"../utils/text-stream.js\";\nimport { encodeCacheTag } from \"../utils/encode-cache-tag.js\";\nimport type { AppRscRenderMode } from \"./app-rsc-render-mode.js\";\nimport {\n createEmptyAppPageRenderObservationState,\n type AppPageRenderObservationState,\n} from \"./app-page-render-observation.js\";\nimport type { RenderObservation } from \"./cache-proof.js\";\n\ntype AppPageDebugLogger = (event: string, detail: string) => void;\ntype AppPageCacheGetter = (key: string) => Promise<ISRCacheEntry | null>;\ntype AppPageCacheSetter = (\n key: string,\n data: CachedAppPageValue,\n revalidateSeconds: number,\n tags: string[],\n expireSeconds?: number,\n) => Promise<void>;\ntype AppPageBackgroundRegenerator = (key: string, renderFn: () => Promise<void>) => void;\ntype AppPageRequestCacheLife = {\n revalidate?: number;\n expire?: number;\n};\n\ntype BuildAppPageCacheRenderObservation = (input: {\n cacheTags: readonly string[];\n state: AppPageRenderObservationState;\n}) => RenderObservation;\n\ntype AppPageCacheRenderResult = {\n cacheControl?: CacheControlMetadata;\n html: string;\n htmlRenderObservation?: RenderObservation;\n rscData: ArrayBuffer;\n rscRenderObservation?: RenderObservation;\n tags: string[];\n};\n\ntype BuildAppPageCachedResponseOptions = {\n cacheControl?: CacheControlMetadata;\n cacheState: \"HIT\" | \"STALE\";\n expireSeconds?: number;\n isRscRequest: boolean;\n middlewareHeaders?: Headers | null;\n middlewareStatus?: number | null;\n mountedSlotsHeader?: string | null;\n revalidateSeconds: number;\n};\n\ntype ReadAppPageCacheResponseOptions = {\n cleanPathname: string;\n clearRequestContext: () => void;\n isRscRequest: boolean;\n isrDebug?: AppPageDebugLogger;\n isrGet: AppPageCacheGetter;\n isrHtmlKey: (pathname: string) => string;\n isrRscKey: (\n pathname: string,\n mountedSlotsHeader?: string | null,\n renderMode?: AppRscRenderMode,\n ) => string;\n isrSet: AppPageCacheSetter;\n middlewareHeaders?: Headers | null;\n middlewareStatus?: number | null;\n mountedSlotsHeader?: string | null;\n renderMode?: AppRscRenderMode;\n expireSeconds?: number;\n revalidateSeconds: number;\n renderFreshPageForCache: () => Promise<AppPageCacheRenderResult>;\n scheduleBackgroundRegeneration: AppPageBackgroundRegenerator;\n};\n\ntype FinalizeAppPageHtmlCacheResponseOptions = {\n capturedDynamicUsageBeforeContextCleanup?: () => boolean;\n capturedRscDataPromise: Promise<ArrayBuffer> | null;\n cleanPathname: string;\n consumeDynamicUsage: () => boolean;\n consumeRenderObservationState?: () => AppPageRenderObservationState;\n createHtmlRenderObservation?: BuildAppPageCacheRenderObservation;\n createRscRenderObservation?: BuildAppPageCacheRenderObservation;\n getPageTags: () => string[];\n getRequestCacheLife?: () => AppPageRequestCacheLife | null;\n isrDebug?: AppPageDebugLogger;\n isrHtmlKey: (pathname: string) => string;\n isrRscKey: (\n pathname: string,\n mountedSlotsHeader?: string | null,\n renderMode?: AppRscRenderMode,\n ) => string;\n isrSet: AppPageCacheSetter;\n preserveClientResponseHeaders?: boolean;\n expireSeconds?: number;\n revalidateSeconds: number | null;\n waitUntil?: (promise: Promise<void>) => void;\n};\n\ntype ScheduleAppPageRscCacheWriteOptions = {\n capturedRscDataPromise: Promise<ArrayBuffer> | null;\n cleanPathname: string;\n consumeDynamicUsage: () => boolean;\n consumeRenderObservationState?: () => AppPageRenderObservationState;\n createRscRenderObservation?: BuildAppPageCacheRenderObservation;\n dynamicUsedDuringBuild: boolean;\n getPageTags: () => string[];\n getRequestCacheLife?: () => AppPageRequestCacheLife | null;\n isrDebug?: AppPageDebugLogger;\n isrRscKey: (\n pathname: string,\n mountedSlotsHeader?: string | null,\n renderMode?: AppRscRenderMode,\n ) => string;\n isrSet: AppPageCacheSetter;\n mountedSlotsHeader?: string | null;\n renderMode?: AppRscRenderMode;\n preserveClientResponseHeaders?: boolean;\n expireSeconds?: number;\n revalidateSeconds: number | null;\n waitUntil?: (promise: Promise<void>) => void;\n};\n\nconst NO_STORE_CACHE_CONTROL = \"no-store, must-revalidate\";\n\nexport function buildAppPageCacheTags(pathname: string, extraTags: readonly string[]): string[] {\n const tags = [pathname, `_N_T_${pathname}`, \"_N_T_/layout\"];\n const segments = pathname.split(\"/\");\n let built = \"\";\n for (let index = 1; index < segments.length; index++) {\n const segment = segments[index];\n if (segment) {\n built += `/${segment}`;\n tags.push(`_N_T_${built}/layout`);\n }\n }\n\n tags.push(`_N_T_${built}/page`);\n for (const tag of extraTags) {\n if (!tags.includes(tag)) {\n tags.push(tag);\n }\n }\n // Canonicalise to ASCII-safe form so path-derived tags from non-ASCII\n // pathnames match what `revalidatePath`/`revalidateTag` produce after\n // their own encoding pass.\n return tags.map(encodeCacheTag);\n}\n\nfunction buildAppPageCacheControl(\n cacheState: BuildAppPageCachedResponseOptions[\"cacheState\"],\n revalidateSeconds: number,\n expireSeconds?: number,\n): string {\n return buildCachedRevalidateCacheControl(cacheState, revalidateSeconds, expireSeconds);\n}\n\nfunction buildAppPageCachedHeaders(options: {\n cacheControl: string;\n cacheState: BuildAppPageCachedResponseOptions[\"cacheState\"];\n contentType: string;\n middlewareHeaders?: Headers | null;\n mountedSlotsHeader?: string | null;\n}): Headers {\n const headers = new Headers({\n \"Cache-Control\": options.cacheControl,\n \"Content-Type\": options.contentType,\n Vary: VINEXT_RSC_VARY_HEADER,\n [VINEXT_CACHE_HEADER]: options.cacheState,\n });\n\n if (options.mountedSlotsHeader) {\n headers.set(VINEXT_MOUNTED_SLOTS_HEADER, options.mountedSlotsHeader);\n }\n\n mergeMiddlewareResponseHeaders(headers, options.middlewareHeaders ?? null);\n return headers;\n}\n\nfunction getCachedAppPageValue(entry: ISRCacheEntry | null): CachedAppPageValue | null {\n return entry?.value.value && entry.value.value.kind === \"APP_PAGE\" ? entry.value.value : null;\n}\n\nfunction resolveAppPageCacheWritePolicy(options: {\n expireSeconds?: number;\n requestCacheLife?: AppPageRequestCacheLife | null;\n revalidateSeconds: number | null;\n}): { expireSeconds?: number; revalidateSeconds: number } | null {\n let revalidateSeconds = options.revalidateSeconds;\n let expireSeconds = options.expireSeconds;\n const requestCacheLife = options.requestCacheLife;\n\n if (requestCacheLife?.revalidate !== undefined) {\n revalidateSeconds =\n revalidateSeconds === null\n ? requestCacheLife.revalidate\n : Math.min(revalidateSeconds, requestCacheLife.revalidate);\n }\n if (requestCacheLife?.expire !== undefined) {\n expireSeconds = requestCacheLife.expire;\n }\n\n if (revalidateSeconds === null || revalidateSeconds <= 0 || !Number.isFinite(revalidateSeconds)) {\n return null;\n }\n\n return { expireSeconds, revalidateSeconds };\n}\n\nexport function buildAppPageCachedResponse(\n cachedValue: CachedAppPageValue,\n options: BuildAppPageCachedResponseOptions,\n): Response | null {\n // Preserve the legacy fallback semantics from the generated entry: invalid\n // falsy statuses still fall back to 200 rather than being forwarded through.\n const status = options.middlewareStatus ?? (cachedValue.status || 200);\n const revalidateSeconds = options.cacheControl?.revalidate ?? options.revalidateSeconds;\n const expireSeconds =\n options.cacheControl === undefined\n ? undefined\n : (options.cacheControl.expire ?? options.expireSeconds);\n const cacheControl = buildAppPageCacheControl(\n options.cacheState,\n revalidateSeconds,\n expireSeconds,\n );\n if (options.isRscRequest) {\n if (!cachedValue.rscData) {\n return null;\n }\n\n const rscHeaders = buildAppPageCachedHeaders({\n cacheControl,\n cacheState: options.cacheState,\n contentType: VINEXT_RSC_CONTENT_TYPE,\n middlewareHeaders: options.middlewareHeaders,\n mountedSlotsHeader: options.mountedSlotsHeader,\n });\n applyRscCompatibilityIdHeader(rscHeaders);\n\n return new Response(cachedValue.rscData, {\n status,\n headers: rscHeaders,\n });\n }\n\n if (typeof cachedValue.html !== \"string\" || cachedValue.html.length === 0) {\n return null;\n }\n\n const htmlHeaders = buildAppPageCachedHeaders({\n cacheControl,\n cacheState: options.cacheState,\n contentType: \"text/html; charset=utf-8\",\n middlewareHeaders: options.middlewareHeaders,\n });\n\n return new Response(cachedValue.html, {\n status,\n headers: htmlHeaders,\n });\n}\n\nexport async function readAppPageCacheResponse(\n options: ReadAppPageCacheResponseOptions,\n): Promise<Response | null> {\n const isrKey = options.isRscRequest\n ? options.isrRscKey(options.cleanPathname, options.mountedSlotsHeader, options.renderMode)\n : options.isrHtmlKey(options.cleanPathname);\n\n try {\n const cached = await options.isrGet(isrKey);\n const cachedValue = getCachedAppPageValue(cached);\n\n if (cachedValue && !cached?.isStale) {\n const hitResponse = buildAppPageCachedResponse(cachedValue, {\n cacheState: \"HIT\",\n cacheControl: cached?.value.cacheControl,\n expireSeconds: options.expireSeconds,\n isRscRequest: options.isRscRequest,\n middlewareHeaders: options.middlewareHeaders,\n middlewareStatus: options.middlewareStatus,\n mountedSlotsHeader: options.mountedSlotsHeader,\n revalidateSeconds: options.revalidateSeconds,\n });\n\n if (hitResponse) {\n options.isrDebug?.(\n options.isRscRequest ? \"HIT (RSC)\" : \"HIT (HTML)\",\n options.cleanPathname,\n );\n options.clearRequestContext();\n return hitResponse;\n }\n\n options.isrDebug?.(\"MISS (empty cached entry)\", options.cleanPathname);\n }\n\n if (cached?.isStale && cachedValue) {\n const regenerationKey = options.isRscRequest\n ? options.isrRscKey(options.cleanPathname, options.mountedSlotsHeader, options.renderMode)\n : options.isrHtmlKey(options.cleanPathname);\n\n // Preserve the legacy behavior from the inline generator: stale entries\n // still trigger background regeneration even if this request cannot use\n // the stale payload and will fall through to a fresh render.\n options.scheduleBackgroundRegeneration(regenerationKey, async () => {\n const revalidatedPage = await options.renderFreshPageForCache();\n const revalidateSeconds =\n revalidatedPage.cacheControl?.revalidate ?? options.revalidateSeconds;\n const expireSeconds = revalidatedPage.cacheControl?.expire ?? options.expireSeconds;\n const writes = [\n options.isrSet(\n options.isrRscKey(\n options.cleanPathname,\n options.mountedSlotsHeader,\n options.renderMode,\n ),\n buildAppPageCacheValue(\n \"\",\n revalidatedPage.rscData,\n 200,\n revalidatedPage.rscRenderObservation,\n ),\n revalidateSeconds,\n revalidatedPage.tags,\n expireSeconds,\n ),\n ];\n\n if (!options.isRscRequest) {\n // HTML cache is slot-state-independent (canonical), so only refresh it\n // during HTML-triggered regens. RSC-triggered regens only update the\n // requesting client's RSC slot variant; a stale HTML cache entry will\n // be regenerated independently by the next full-page HTML request.\n writes.push(\n options.isrSet(\n options.isrHtmlKey(options.cleanPathname),\n buildAppPageCacheValue(\n revalidatedPage.html,\n undefined,\n 200,\n revalidatedPage.htmlRenderObservation,\n ),\n revalidateSeconds,\n revalidatedPage.tags,\n expireSeconds,\n ),\n );\n }\n\n await Promise.all(writes);\n options.isrDebug?.(\"regen complete\", options.cleanPathname);\n });\n\n const staleResponse = buildAppPageCachedResponse(cachedValue, {\n cacheState: \"STALE\",\n cacheControl: cached.value.cacheControl,\n expireSeconds: options.expireSeconds,\n isRscRequest: options.isRscRequest,\n middlewareHeaders: options.middlewareHeaders,\n middlewareStatus: options.middlewareStatus,\n mountedSlotsHeader: options.mountedSlotsHeader,\n revalidateSeconds: options.revalidateSeconds,\n });\n\n if (staleResponse) {\n options.isrDebug?.(\n options.isRscRequest ? \"STALE (RSC)\" : \"STALE (HTML)\",\n options.cleanPathname,\n );\n options.clearRequestContext();\n return staleResponse;\n }\n\n options.isrDebug?.(\"STALE MISS (empty stale entry)\", options.cleanPathname);\n }\n\n if (!cached) {\n options.isrDebug?.(\"MISS (no cache entry)\", options.cleanPathname);\n }\n } catch (isrReadError) {\n console.error(\"[vinext] ISR cache read error:\", isrReadError);\n }\n\n return null;\n}\n\nexport function finalizeAppPageHtmlCacheResponse(\n response: Response,\n options: FinalizeAppPageHtmlCacheResponseOptions,\n): Response {\n if (!response.body) {\n return response;\n }\n\n const [streamForClient, streamForCache] = response.body.tee();\n const htmlKey = options.isrHtmlKey(options.cleanPathname);\n const rscKey = options.isrRscKey(options.cleanPathname, null);\n const clientHeaders = new Headers(response.headers);\n if (options.preserveClientResponseHeaders !== true) {\n // HTML Server Components can access request APIs while the stream is being\n // consumed. Until that late dynamic check finishes, downstream shared caches\n // must not cache a response whose ISR policy was known before streaming.\n clientHeaders.set(\"Cache-Control\", NO_STORE_CACHE_CONTROL);\n clientHeaders.set(VINEXT_CACHE_HEADER, \"MISS\");\n }\n\n const cachePromise = (async () => {\n try {\n const cachedHtml = await readStreamAsText(streamForCache);\n\n if (\n options.capturedDynamicUsageBeforeContextCleanup?.() === true ||\n options.consumeDynamicUsage()\n ) {\n options.isrDebug?.(\"HTML cache write skipped (dynamic usage during render)\", htmlKey);\n return;\n }\n\n const cachePolicy = resolveAppPageCacheWritePolicy({\n expireSeconds: options.expireSeconds,\n requestCacheLife: options.getRequestCacheLife?.(),\n revalidateSeconds: options.revalidateSeconds,\n });\n if (!cachePolicy) {\n options.isrDebug?.(\"HTML cache write skipped (no cache policy)\", htmlKey);\n return;\n }\n\n const pageTags = options.getPageTags();\n // This continuation is scheduled while the request ALS scope is active.\n // It intentionally consumes observation state only after the HTML stream\n // drains, so late Server Component request API usage is included.\n // Consume once: HTML and captured RSC artifacts come from the same render\n // pass, so both cache artifacts share the same observation snapshot.\n const observationState =\n options.consumeRenderObservationState?.() ?? createEmptyAppPageRenderObservationState();\n const htmlRenderObservation = options.createHtmlRenderObservation?.({\n cacheTags: pageTags,\n state: observationState,\n });\n const rscRenderObservation = options.createRscRenderObservation?.({\n cacheTags: pageTags,\n state: observationState,\n });\n const writes = [\n options.isrSet(\n htmlKey,\n buildAppPageCacheValue(cachedHtml, undefined, 200, htmlRenderObservation),\n cachePolicy.revalidateSeconds,\n pageTags,\n cachePolicy.expireSeconds,\n ),\n ];\n\n if (options.capturedRscDataPromise) {\n writes.push(\n options.capturedRscDataPromise.then((rscData) =>\n options.isrSet(\n rscKey,\n buildAppPageCacheValue(\"\", rscData, 200, rscRenderObservation),\n cachePolicy.revalidateSeconds,\n pageTags,\n cachePolicy.expireSeconds,\n ),\n ),\n );\n }\n\n await Promise.all(writes);\n options.isrDebug?.(\"HTML cache written\", htmlKey);\n } catch (cacheError) {\n console.error(\"[vinext] ISR cache write error:\", cacheError);\n }\n })();\n\n options.waitUntil?.(cachePromise);\n\n return new Response(streamForClient, {\n status: response.status,\n statusText: response.statusText,\n headers: clientHeaders,\n });\n}\n\nexport function finalizeAppPageRscCacheResponse(\n response: Response,\n options: ScheduleAppPageRscCacheWriteOptions,\n): Response {\n const didSchedule = scheduleAppPageRscCacheWrite(options);\n if (!didSchedule) {\n return response;\n }\n\n if (options.preserveClientResponseHeaders === true) {\n return response;\n }\n\n const clientHeaders = new Headers(response.headers);\n // RSC payloads are also streamed lazily. Until the captured stream proves no\n // late request API was used, the client-facing MISS response must not enter a\n // shared cache when the ISR policy was known before streaming.\n clientHeaders.set(\"Cache-Control\", NO_STORE_CACHE_CONTROL);\n clientHeaders.set(VINEXT_CACHE_HEADER, \"MISS\");\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers: clientHeaders,\n });\n}\n\nexport function scheduleAppPageRscCacheWrite(\n options: ScheduleAppPageRscCacheWriteOptions,\n): boolean {\n const capturedRscDataPromise = options.capturedRscDataPromise;\n if (!capturedRscDataPromise || options.dynamicUsedDuringBuild) {\n return false;\n }\n\n const rscKey = options.isrRscKey(\n options.cleanPathname,\n options.mountedSlotsHeader,\n options.renderMode,\n );\n const cachePromise = (async () => {\n try {\n const rscData = await capturedRscDataPromise;\n\n // Two-phase dynamic detection:\n // 1. dynamicUsedDuringBuild catches searchParams-driven opt-in before the\n // RSC response is sent.\n // 2. consumeDynamicUsage() here catches APIs that fire while the RSC\n // stream is consumed (headers(), cookies(), noStore()).\n if (options.consumeDynamicUsage()) {\n options.isrDebug?.(\"RSC cache write skipped (dynamic usage during render)\", rscKey);\n return;\n }\n\n const cachePolicy = resolveAppPageCacheWritePolicy({\n expireSeconds: options.expireSeconds,\n requestCacheLife: options.getRequestCacheLife?.(),\n revalidateSeconds: options.revalidateSeconds,\n });\n if (!cachePolicy) {\n options.isrDebug?.(\"RSC cache write skipped (no cache policy)\", rscKey);\n return;\n }\n\n const pageTags = options.getPageTags();\n // This continuation is scheduled while the request ALS scope is active.\n // It intentionally consumes observation state only after the captured RSC\n // stream resolves, so late Server Component request API usage is included.\n const observationState =\n options.consumeRenderObservationState?.() ?? createEmptyAppPageRenderObservationState();\n const rscRenderObservation = options.createRscRenderObservation?.({\n cacheTags: pageTags,\n state: observationState,\n });\n await options.isrSet(\n rscKey,\n buildAppPageCacheValue(\"\", rscData, 200, rscRenderObservation),\n cachePolicy.revalidateSeconds,\n pageTags,\n cachePolicy.expireSeconds,\n );\n options.isrDebug?.(\"RSC cache written\", rscKey);\n } catch (cacheError) {\n console.error(\"[vinext] ISR RSC cache write error:\", cacheError);\n }\n })();\n\n options.waitUntil?.(cachePromise);\n return true;\n}\n"],"mappings":"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"}
@@ -4,10 +4,12 @@ import { AppOutgoingElements } from "./app-elements-wire.js";
4
4
  import { AppPageFontPreload, LayoutClassificationOptions } from "./app-page-execution.js";
5
5
  import { AppPageMiddlewareContext } from "./app-page-response.js";
6
6
  import { AppPageSsrHandler } from "./app-page-stream.js";
7
+ import { AppRscRenderMode } from "./app-rsc-render-mode.js";
7
8
  import { ISRCacheEntry } from "./isr-cache.js";
8
9
  import { FetchCacheMode } from "../shims/fetch-cache.js";
9
10
  import { ValidateAppPageDynamicParamsOptions } from "./app-page-request.js";
10
11
  import { ReactNode } from "react";
12
+ import { ReactFormState } from "react-dom/client";
11
13
 
12
14
  //#region src/server/app-page-dispatch.d.ts
13
15
  type AppPageParams = Record<string, string | string[]>;
@@ -27,6 +29,7 @@ type AppPageDispatchIntercept<TPage = unknown> = {
27
29
  interceptLayouts?: readonly AppPageModule[] | null;
28
30
  matchedParams: AppPageParams;
29
31
  page: TPage;
32
+ slotId?: string | null;
30
33
  slotKey: string;
31
34
  sourceRouteIndex: number;
32
35
  };
@@ -35,7 +38,9 @@ type AppPageDispatchInterceptOptions<TPage = unknown> = {
35
38
  interceptLayouts?: readonly AppPageModule[] | null;
36
39
  interceptPage: TPage;
37
40
  interceptParams: AppPageParams;
41
+ interceptSlotId?: string | null;
38
42
  interceptSlotKey: string;
43
+ interceptSourceMatchedUrl?: string | null;
39
44
  };
40
45
  type AppPageModule = {
41
46
  default?: unknown;
@@ -67,6 +72,9 @@ type DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {
67
72
  dynamicParamsConfig?: boolean;
68
73
  fetchCache?: FetchCacheMode | null;
69
74
  findIntercept: (pathname: string) => AppPageDispatchIntercept | null;
75
+ formState?: ReactFormState | null;
76
+ actionError?: unknown;
77
+ actionFailed?: boolean;
70
78
  generateStaticParams?: ValidateAppPageDynamicParamsOptions["generateStaticParams"];
71
79
  getFontLinks: () => string[];
72
80
  getFontPreloads: () => AppPageFontPreload[];
@@ -78,12 +86,13 @@ type DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {
78
86
  hasPageModule: boolean;
79
87
  handlerStart: number;
80
88
  interceptionContext: string | null;
89
+ isProgressiveActionRender?: boolean;
81
90
  isProduction: boolean;
82
91
  isRscRequest: boolean;
83
92
  isrDebug?: AppPageDebugLogger;
84
93
  isrGet: AppPageCacheGetter;
85
94
  isrHtmlKey: (pathname: string) => string;
86
- isrRscKey: (pathname: string, mountedSlotsHeader?: string | null) => string;
95
+ isrRscKey: (pathname: string, mountedSlotsHeader?: string | null, renderMode?: AppRscRenderMode) => string;
87
96
  isrSet: AppPageCacheSetter;
88
97
  loadSsrHandler: () => Promise<AppPageSsrHandler>;
89
98
  middlewareContext: AppPageMiddlewareContext;
@@ -117,6 +126,7 @@ type DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {
117
126
  pathname: string;
118
127
  searchParams: URLSearchParams;
119
128
  }) => void;
129
+ renderMode?: AppRscRenderMode;
120
130
  };
121
131
  declare function dispatchAppPage<TRoute extends AppPageDispatchRoute>(options: DispatchAppPageOptions<TRoute>): Promise<Response>;
122
132
  //#endregion
@@ -1,15 +1,17 @@
1
1
  import { createRequestContext, runWithRequestContext } from "../shims/unified-request-context.js";
2
2
  import { getRequestExecutionContext } from "../shims/request-context.js";
3
- import { consumeDynamicUsage, consumeInvalidDynamicUsageError, getAndClearPendingCookies, getDraftModeCookieHeader, markDynamicUsage, setHeadersContext } from "../shims/headers.js";
3
+ import { consumeDynamicUsage, consumeInvalidDynamicUsageError, consumeRenderRequestApiUsage, getAndClearPendingCookies, getDraftModeCookieHeader, isDraftModeRequest, markDynamicUsage, peekRenderRequestApiUsage, setHeadersContext } from "../shims/headers.js";
4
4
  import { _consumeRequestScopedCacheLife, _peekRequestScopedCacheLife } from "../shims/cache.js";
5
- import { ensureFetchPatch, getCollectedFetchTags, setCurrentFetchCacheMode, setCurrentFetchSoftTags } from "../shims/fetch-cache.js";
5
+ import { shouldSuppressLoadingBoundaries } from "./app-rsc-render-mode.js";
6
+ import { consumeDynamicFetchObservations, ensureFetchPatch, getCollectedFetchTags, peekDynamicFetchObservations, runWithFetchDedupe, setCurrentFetchCacheMode, setCurrentFetchSoftTags } from "../shims/fetch-cache.js";
6
7
  import { AppElementsWire } from "./app-elements-wire.js";
7
8
  import "./app-elements.js";
8
- import { VINEXT_RSC_VARY_HEADER } from "./app-rsc-cache-busting.js";
9
+ import { VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityIdHeader } from "./app-rsc-cache-busting.js";
9
10
  import { createAppPageTreePath } from "./app-page-route-wiring.js";
10
11
  import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
11
12
  import { resolveAppPageParentHttpAccessBoundaryModule } from "./app-page-boundary.js";
12
13
  import { readStreamAsText } from "../utils/text-stream.js";
14
+ import { createAppPageHtmlOutputScope, createAppPageRenderObservation, createAppPageRscOutputScope } from "./app-page-render-observation.js";
13
15
  import { readAppPageCacheResponse } from "./app-page-cache.js";
14
16
  import { buildAppPageSpecialErrorResponse, resolveAppPageSpecialError, teeAppPageRscStreamForCapture } from "./app-page-execution.js";
15
17
  import { resolveAppPageMethodResponse } from "./app-page-method.js";
@@ -20,7 +22,7 @@ import { createStaticGenerationHeadersContext } from "./app-static-generation.js
20
22
  import { buildPageCacheTags } from "./implicit-tags.js";
21
23
  //#region src/server/app-page-dispatch.ts
22
24
  function shouldReadAppPageCache(options) {
23
- return options.isProduction && !options.isForceDynamic && (options.isRscRequest || !options.scriptNonce) && (options.revalidateSeconds === null || options.revalidateSeconds > 0 && options.revalidateSeconds !== Infinity);
25
+ return options.isProduction && !options.isProgressiveActionRender && !options.isDraftMode && !options.isForceDynamic && (options.isRscRequest || !options.scriptNonce) && (options.revalidateSeconds === null || options.revalidateSeconds > 0);
24
26
  }
25
27
  function buildAppPageTags(cleanPathname, extraTags, routeSegments) {
26
28
  return buildPageCacheTags(cleanPathname, extraTags, [...routeSegments], "page");
@@ -43,7 +45,7 @@ async function runAppPageRevalidationContext(options, renderFn) {
43
45
  searchParams: new URLSearchParams(),
44
46
  params: options.params
45
47
  });
46
- return renderFn();
48
+ return await runWithFetchDedupe(renderFn);
47
49
  });
48
50
  }
49
51
  function getCapturedRscDataPromise(capturedRscDataPromise) {
@@ -56,16 +58,22 @@ function toInterceptOptions(interceptionContext, intercept) {
56
58
  interceptLayouts: intercept.interceptLayouts,
57
59
  interceptPage: intercept.page,
58
60
  interceptParams: intercept.matchedParams,
59
- interceptSlotKey: intercept.slotKey
61
+ interceptSlotId: intercept.slotId ?? null,
62
+ interceptSlotKey: intercept.slotKey,
63
+ interceptSourceMatchedUrl: interceptionContext
60
64
  };
61
65
  }
62
66
  async function dispatchAppPage(options) {
67
+ return await runWithFetchDedupe(() => dispatchAppPageInner(options));
68
+ }
69
+ async function dispatchAppPageInner(options) {
63
70
  const route = options.route;
64
71
  const dynamicConfig = options.dynamicConfig;
65
72
  const currentRevalidateSeconds = options.revalidateSeconds;
66
73
  const isForceStatic = dynamicConfig === "force-static";
67
74
  const isDynamicError = dynamicConfig === "error";
68
75
  const isForceDynamic = dynamicConfig === "force-dynamic";
76
+ const isDraftMode = isDraftModeRequest(options.request);
69
77
  setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], route.routeSegments));
70
78
  setCurrentFetchCacheMode(options.fetchCache ?? null);
71
79
  if (options.hasPageModule && !options.hasPageDefaultExport) {
@@ -84,7 +92,7 @@ async function dispatchAppPage(options) {
84
92
  options.clearRequestContext();
85
93
  return methodResponse;
86
94
  }
87
- if (isForceStatic || isDynamicError) {
95
+ if ((isForceStatic || isDynamicError) && !isDraftMode) {
88
96
  setHeadersContext(createStaticGenerationHeadersContext({
89
97
  dynamicConfig,
90
98
  routeKind: "page",
@@ -97,7 +105,9 @@ async function dispatchAppPage(options) {
97
105
  });
98
106
  }
99
107
  if (shouldReadAppPageCache({
108
+ isDraftMode,
100
109
  isForceDynamic,
110
+ isProgressiveActionRender: options.isProgressiveActionRender === true,
101
111
  isProduction: options.isProduction,
102
112
  isRscRequest: options.isRscRequest,
103
113
  revalidateSeconds: currentRevalidateSeconds,
@@ -112,7 +122,10 @@ async function dispatchAppPage(options) {
112
122
  isrHtmlKey: options.isrHtmlKey,
113
123
  isrRscKey: options.isrRscKey,
114
124
  isrSet: options.isrSet,
125
+ middlewareHeaders: options.middlewareContext.headers,
126
+ middlewareStatus: options.middlewareContext.status,
115
127
  mountedSlotsHeader: options.mountedSlotsHeader,
128
+ renderMode: options.renderMode,
116
129
  expireSeconds: options.expireSeconds,
117
130
  revalidateSeconds: currentRevalidateSeconds ?? 0,
118
131
  renderFreshPageForCache: async () => runAppPageRevalidationContext({
@@ -133,17 +146,56 @@ async function dispatchAppPage(options) {
133
146
  links: options.getFontLinks(),
134
147
  styles: options.getFontStyles(),
135
148
  preloads: options.getFontPreloads()
136
- }, revalidatedRscCapture.sideStream ? {
137
- sideStream: revalidatedRscCapture.sideStream,
138
- capturedRscDataRef: revalidatedCapturedRscRef
139
- } : void 0));
149
+ }, {
150
+ basePath: options.basePath,
151
+ ...revalidatedRscCapture.sideStream ? {
152
+ sideStream: revalidatedRscCapture.sideStream,
153
+ capturedRscDataRef: revalidatedCapturedRscRef
154
+ } : {}
155
+ }));
140
156
  const rscData = await getCapturedRscDataPromise(revalidatedCapturedRscRef.value);
141
157
  const cacheLife = _consumeRequestScopedCacheLife();
142
158
  options.clearRequestContext();
159
+ const tags = buildAppPageTags(options.cleanPathname, getCollectedFetchTags(), route.routeSegments);
160
+ const observationState = {
161
+ dynamicFetches: consumeDynamicFetchObservations(),
162
+ requestApis: consumeRenderRequestApiUsage()
163
+ };
143
164
  return {
144
165
  html,
166
+ htmlRenderObservation: createAppPageRenderObservation({
167
+ boundaryOutcome: { kind: "success" },
168
+ cacheability: "public",
169
+ cacheTags: tags,
170
+ cleanPathname: options.cleanPathname,
171
+ completeness: "complete",
172
+ output: createAppPageHtmlOutputScope({
173
+ element: revalidatedElement,
174
+ renderEpoch: null,
175
+ rootBoundaryId: null,
176
+ routePattern: route.pattern
177
+ }),
178
+ params: options.params,
179
+ state: observationState
180
+ }),
145
181
  rscData,
146
- tags: buildAppPageTags(options.cleanPathname, getCollectedFetchTags(), route.routeSegments),
182
+ rscRenderObservation: createAppPageRenderObservation({
183
+ boundaryOutcome: { kind: "success" },
184
+ cacheability: "public",
185
+ cacheTags: tags,
186
+ cleanPathname: options.cleanPathname,
187
+ completeness: "complete",
188
+ output: createAppPageRscOutputScope({
189
+ element: revalidatedElement,
190
+ mountedSlotsHeader: options.mountedSlotsHeader,
191
+ renderEpoch: null,
192
+ rootBoundaryId: null,
193
+ routePattern: route.pattern
194
+ }),
195
+ params: options.params,
196
+ state: observationState
197
+ }),
198
+ tags,
147
199
  cacheControl: typeof cacheLife?.revalidate === "number" ? {
148
200
  revalidate: cacheLife.revalidate,
149
201
  expire: cacheLife.expire
@@ -189,10 +241,11 @@ async function dispatchAppPage(options) {
189
241
  const interceptOnError = options.createRscOnErrorHandler(options.cleanPathname, sourceRoute.pattern);
190
242
  const interceptStream = options.renderToReadableStream(interceptElement, { onError: interceptOnError });
191
243
  const interceptHeaders = new Headers({
192
- "Content-Type": "text/x-component; charset=utf-8",
244
+ "Content-Type": VINEXT_RSC_CONTENT_TYPE,
193
245
  Vary: VINEXT_RSC_VARY_HEADER
194
246
  });
195
247
  mergeMiddlewareResponseHeaders(interceptHeaders, options.middlewareContext.headers);
248
+ applyRscCompatibilityIdHeader(interceptHeaders);
196
249
  return new Response(interceptStream, {
197
250
  status: options.middlewareContext.status ?? 200,
198
251
  headers: interceptHeaders
@@ -207,6 +260,7 @@ async function dispatchAppPage(options) {
207
260
  if (interceptResult.response) return interceptResult.response;
208
261
  const pageBuildResult = await buildAppPageElement({
209
262
  buildPageElement() {
263
+ if (options.actionFailed) throw options.actionError;
210
264
  return options.buildPageElement(route, options.params, interceptResult.interceptOpts, options.searchParams);
211
265
  },
212
266
  renderErrorBoundaryPage(buildError) {
@@ -219,10 +273,17 @@ async function dispatchAppPage(options) {
219
273
  });
220
274
  if (pageBuildResult.response) return pageBuildResult.response;
221
275
  return renderAppPageLifecycle({
276
+ basePath: options.basePath,
222
277
  cleanPathname: options.cleanPathname,
223
278
  clearRequestContext: options.clearRequestContext,
224
279
  consumeDynamicUsage,
225
280
  consumeInvalidDynamicUsageError,
281
+ consumeRenderObservationState() {
282
+ return {
283
+ dynamicFetches: consumeDynamicFetchObservations(),
284
+ requestApis: consumeRenderRequestApiUsage()
285
+ };
286
+ },
226
287
  createRscOnErrorHandler(pathname, routePath) {
227
288
  return options.createRscOnErrorHandler(pathname, routePath);
228
289
  },
@@ -242,8 +303,11 @@ async function dispatchAppPage(options) {
242
303
  return _peekRequestScopedCacheLife();
243
304
  },
244
305
  handlerStart: options.handlerStart,
245
- hasLoadingBoundary: Boolean(route.loading?.default),
306
+ hasLoadingBoundary: shouldSuppressLoadingBoundaries(options.renderMode ?? "navigation") ? false : Boolean(route.loading?.default),
307
+ formState: options.formState ?? null,
308
+ isProgressiveActionRender: options.isProgressiveActionRender === true,
246
309
  isDynamicError,
310
+ isDraftMode,
247
311
  isForceDynamic,
248
312
  isForceStatic,
249
313
  isPrerender: process.env.VINEXT_PRERENDER === "1",
@@ -258,6 +322,12 @@ async function dispatchAppPage(options) {
258
322
  loadSsrHandler: options.loadSsrHandler,
259
323
  middlewareContext: options.middlewareContext,
260
324
  params: options.params,
325
+ peekRenderObservationState() {
326
+ return {
327
+ dynamicFetches: peekDynamicFetchObservations(),
328
+ requestApis: peekRenderRequestApiUsage()
329
+ };
330
+ },
261
331
  probeLayoutAt(layoutIndex) {
262
332
  return options.probeLayoutAt(layoutIndex);
263
333
  },
@@ -287,6 +357,7 @@ async function dispatchAppPage(options) {
287
357
  },
288
358
  revalidateSeconds: currentRevalidateSeconds,
289
359
  mountedSlotsHeader: options.mountedSlotsHeader,
360
+ renderMode: options.renderMode ?? "navigation",
290
361
  renderErrorBoundaryResponse(renderError) {
291
362
  return options.renderErrorBoundaryPage(renderError);
292
363
  },
@@ -1 +1 @@
1
- {"version":3,"file":"app-page-dispatch.js","names":[],"sources":["../../src/server/app-page-dispatch.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { ClassificationReason } from \"../build/layout-classification-types.js\";\nimport {\n _consumeRequestScopedCacheLife,\n _peekRequestScopedCacheLife,\n type CachedAppPageValue,\n} from \"vinext/shims/cache\";\nimport {\n consumeDynamicUsage,\n consumeInvalidDynamicUsageError,\n getAndClearPendingCookies,\n getDraftModeCookieHeader,\n markDynamicUsage,\n setHeadersContext,\n} from \"vinext/shims/headers\";\nimport { getRequestExecutionContext } from \"vinext/shims/request-context\";\nimport { createRequestContext, runWithRequestContext } from \"vinext/shims/unified-request-context\";\nimport {\n ensureFetchPatch,\n type FetchCacheMode,\n getCollectedFetchTags,\n setCurrentFetchCacheMode,\n setCurrentFetchSoftTags,\n} from \"vinext/shims/fetch-cache\";\nimport { AppElementsWire, type AppOutgoingElements } from \"./app-elements.js\";\nimport { readAppPageCacheResponse } from \"./app-page-cache.js\";\nimport { resolveAppPageParentHttpAccessBoundaryModule } from \"./app-page-boundary.js\";\nimport { readStreamAsText } from \"../utils/text-stream.js\";\nimport {\n buildAppPageSpecialErrorResponse,\n resolveAppPageSpecialError,\n teeAppPageRscStreamForCapture,\n type AppPageFontPreload,\n type AppPageSpecialError,\n type LayoutClassificationOptions,\n} from \"./app-page-execution.js\";\nimport { resolveAppPageMethodResponse } from \"./app-page-method.js\";\nimport {\n buildAppPageElement,\n resolveAppPageIntercept,\n validateAppPageDynamicParams,\n type ValidateAppPageDynamicParamsOptions,\n} from \"./app-page-request.js\";\nimport { renderAppPageLifecycle } from \"./app-page-render.js\";\nimport {\n mergeMiddlewareResponseHeaders,\n type AppPageMiddlewareContext,\n} from \"./app-page-response.js\";\nimport { VINEXT_RSC_VARY_HEADER } from \"./app-rsc-cache-busting.js\";\nimport { createAppPageTreePath } from \"./app-page-route-wiring.js\";\nimport type { AppPageSsrHandler } from \"./app-page-stream.js\";\nimport { createStaticGenerationHeadersContext } from \"./app-static-generation.js\";\nimport { buildPageCacheTags } from \"./implicit-tags.js\";\nimport type { ISRCacheEntry } from \"./isr-cache.js\";\n\ntype AppPageParams = Record<string, string | string[]>;\ntype AppPageElement = ReactNode | Readonly<Record<string, ReactNode>>;\ntype AppPageRenderableElement = ReactNode | AppOutgoingElements;\ntype AppPageBoundaryOnError = (\n error: unknown,\n requestInfo: unknown,\n errorContext: unknown,\n) => unknown;\ntype AppPageDebugLogger = (event: string, detail: string) => void;\ntype AppPageCacheSetter = (\n key: string,\n data: CachedAppPageValue,\n revalidateSeconds: number,\n tags: string[],\n expireSeconds?: number,\n) => Promise<void>;\ntype AppPageCacheGetter = (key: string) => Promise<ISRCacheEntry | null>;\ntype AppPageBackgroundRegenerationErrorContext = {\n routerKind: \"App Router\";\n routePath: string;\n routeType: \"render\";\n};\ntype AppPageBackgroundRegenerator = (\n key: string,\n renderFn: () => Promise<void>,\n errorContext?: AppPageBackgroundRegenerationErrorContext,\n) => void;\n\ntype AppPageDispatchIntercept<TPage = unknown> = {\n interceptLayouts?: readonly AppPageModule[] | null;\n matchedParams: AppPageParams;\n page: TPage;\n slotKey: string;\n sourceRouteIndex: number;\n};\n\ntype AppPageDispatchInterceptOptions<TPage = unknown> = {\n interceptionContext: string | null;\n interceptLayouts?: readonly AppPageModule[] | null;\n interceptPage: TPage;\n interceptParams: AppPageParams;\n interceptSlotKey: string;\n};\n\ntype AppPageModule = {\n default?: unknown;\n};\n\ntype AppPageDispatchRoute = {\n __buildTimeClassifications?: LayoutClassificationOptions[\"buildTimeClassifications\"];\n __buildTimeReasons?: LayoutClassificationOptions[\"buildTimeReasons\"];\n error?: AppPageModule | null;\n errors?: readonly (AppPageModule | null | undefined)[];\n forbiddens?: readonly (AppPageModule | null | undefined)[];\n isDynamic: boolean;\n layouts: readonly AppPageModule[];\n layoutTreePositions?: readonly number[];\n loading?: AppPageModule | null;\n notFounds?: readonly (AppPageModule | null | undefined)[];\n params: readonly string[];\n pattern: string;\n routeSegments: readonly string[];\n unauthorizeds?: readonly (AppPageModule | null | undefined)[];\n};\n\ntype DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {\n /** Configured basePath (e.g. \"/blog\"). Used to prefix redirect Locations. */\n basePath?: string;\n buildPageElement: (\n route: TRoute,\n params: AppPageParams,\n opts: AppPageDispatchInterceptOptions | undefined,\n searchParams: URLSearchParams,\n ) => Promise<AppPageElement>;\n cleanPathname: string;\n clearRequestContext: () => void;\n createRscOnErrorHandler: (pathname: string, routePath: string) => AppPageBoundaryOnError;\n debugClassification?: (layoutId: string, reason: ClassificationReason) => void;\n dynamicConfig?: string;\n dynamicParamsConfig?: boolean;\n fetchCache?: FetchCacheMode | null;\n findIntercept: (pathname: string) => AppPageDispatchIntercept | null;\n generateStaticParams?: ValidateAppPageDynamicParamsOptions[\"generateStaticParams\"];\n getFontLinks: () => string[];\n getFontPreloads: () => AppPageFontPreload[];\n getFontStyles: () => string[];\n getNavigationContext: () => unknown;\n getSourceRoute: (sourceRouteIndex: number) => TRoute | undefined;\n hasGenerateStaticParams: boolean;\n hasPageDefaultExport: boolean;\n hasPageModule: boolean;\n handlerStart: number;\n interceptionContext: string | null;\n isProduction: boolean;\n isRscRequest: boolean;\n isrDebug?: AppPageDebugLogger;\n isrGet: AppPageCacheGetter;\n isrHtmlKey: (pathname: string) => string;\n isrRscKey: (pathname: string, mountedSlotsHeader?: string | null) => string;\n isrSet: AppPageCacheSetter;\n loadSsrHandler: () => Promise<AppPageSsrHandler>;\n middlewareContext: AppPageMiddlewareContext;\n mountedSlotsHeader?: string | null;\n params: AppPageParams;\n probeLayoutAt: (layoutIndex: number) => unknown;\n probePage: () => unknown;\n expireSeconds?: number;\n renderErrorBoundaryPage: (error: unknown) => Promise<Response | null>;\n renderHttpAccessFallbackPage: (\n statusCode: number,\n opts: {\n boundaryComponent?: unknown;\n layouts?: readonly AppPageModule[];\n matchedParams: AppPageParams;\n },\n middlewareContext: AppPageMiddlewareContext | null,\n ) => Promise<Response | null>;\n renderToReadableStream: (\n element: AppPageRenderableElement,\n options: { onError: AppPageBoundaryOnError },\n ) => ReadableStream<Uint8Array>;\n request: Request;\n revalidateSeconds: number | null;\n resolveRouteFetchCacheMode?: (route: TRoute) => FetchCacheMode | null;\n rootForbiddenModule?: AppPageModule | null;\n rootNotFoundModule?: AppPageModule | null;\n rootUnauthorizedModule?: AppPageModule | null;\n route: TRoute;\n runWithSuppressedHookWarning<T>(probe: () => Promise<T>): Promise<T>;\n scheduleBackgroundRegeneration: AppPageBackgroundRegenerator;\n scriptNonce?: string;\n searchParams: URLSearchParams;\n setNavigationContext: (context: {\n params: AppPageParams;\n pathname: string;\n searchParams: URLSearchParams;\n }) => void;\n};\n\nfunction shouldReadAppPageCache(options: {\n isForceDynamic: boolean;\n isProduction: boolean;\n isRscRequest: boolean;\n revalidateSeconds: number | null;\n scriptNonce?: string;\n}): boolean {\n return (\n options.isProduction &&\n !options.isForceDynamic &&\n (options.isRscRequest || !options.scriptNonce) &&\n (options.revalidateSeconds === null ||\n (options.revalidateSeconds > 0 && options.revalidateSeconds !== Infinity))\n );\n}\n\nfunction buildAppPageTags(\n cleanPathname: string,\n extraTags: string[],\n routeSegments: readonly string[],\n): string[] {\n return buildPageCacheTags(cleanPathname, extraTags, [...routeSegments], \"page\");\n}\n\nasync function runAppPageRevalidationContext(\n options: {\n cleanPathname: string;\n currentFetchCacheMode?: FetchCacheMode | null;\n dynamicConfig?: string;\n params: AppPageParams;\n routePattern: string;\n routeSegments: readonly string[];\n setNavigationContext: DispatchAppPageOptions<AppPageDispatchRoute>[\"setNavigationContext\"];\n },\n renderFn: () => Promise<{\n html: string;\n rscData: ArrayBuffer;\n tags: string[];\n }>,\n): Promise<{\n html: string;\n rscData: ArrayBuffer;\n tags: string[];\n}> {\n const headersContext = createStaticGenerationHeadersContext({\n dynamicConfig: options.dynamicConfig,\n routeKind: \"page\",\n routePattern: options.routePattern,\n });\n const requestContext = createRequestContext({\n headersContext,\n currentFetchCacheMode: options.currentFetchCacheMode ?? null,\n executionContext: getRequestExecutionContext(),\n unstableCacheRevalidation: \"foreground\",\n });\n\n return runWithRequestContext(requestContext, async () => {\n ensureFetchPatch();\n setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], options.routeSegments));\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: new URLSearchParams(),\n params: options.params,\n });\n return renderFn();\n });\n}\n\nfunction getCapturedRscDataPromise(\n capturedRscDataPromise: Promise<ArrayBuffer> | null,\n): Promise<ArrayBuffer> {\n if (!capturedRscDataPromise) {\n throw new Error(\n \"[vinext] Expected captured RSC data while regenerating an app page cache entry\",\n );\n }\n\n return capturedRscDataPromise;\n}\n\nfunction toInterceptOptions(\n interceptionContext: string | null,\n intercept: AppPageDispatchIntercept,\n): AppPageDispatchInterceptOptions {\n return {\n interceptionContext,\n interceptLayouts: intercept.interceptLayouts,\n interceptPage: intercept.page,\n interceptParams: intercept.matchedParams,\n interceptSlotKey: intercept.slotKey,\n };\n}\n\nexport async function dispatchAppPage<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n): Promise<Response> {\n const route = options.route;\n const dynamicConfig = options.dynamicConfig;\n const currentRevalidateSeconds = options.revalidateSeconds;\n const isForceStatic = dynamicConfig === \"force-static\";\n const isDynamicError = dynamicConfig === \"error\";\n const isForceDynamic = dynamicConfig === \"force-dynamic\";\n\n setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], route.routeSegments));\n setCurrentFetchCacheMode(options.fetchCache ?? null);\n\n if (options.hasPageModule && !options.hasPageDefaultExport) {\n options.clearRequestContext();\n return new Response(\"Page has no default export\", { status: 500 });\n }\n\n const methodResponse = resolveAppPageMethodResponse({\n dynamicConfig,\n hasGenerateStaticParams: options.hasGenerateStaticParams,\n isDynamicRoute: route.isDynamic,\n middlewareHeaders: options.middlewareContext.headers,\n request: options.request,\n revalidateSeconds: currentRevalidateSeconds,\n });\n if (methodResponse) {\n options.clearRequestContext();\n return methodResponse;\n }\n\n if (isForceStatic || isDynamicError) {\n setHeadersContext(\n createStaticGenerationHeadersContext({\n dynamicConfig,\n routeKind: \"page\",\n routePattern: route.pattern,\n }),\n );\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: new URLSearchParams(),\n params: options.params,\n });\n }\n\n if (\n shouldReadAppPageCache({\n isForceDynamic,\n isProduction: options.isProduction,\n isRscRequest: options.isRscRequest,\n revalidateSeconds: currentRevalidateSeconds,\n scriptNonce: options.scriptNonce,\n })\n ) {\n const cachedPageResponse = await readAppPageCacheResponse({\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n isRscRequest: options.isRscRequest,\n isrDebug: options.isrDebug,\n isrGet: options.isrGet,\n isrHtmlKey: options.isrHtmlKey,\n isrRscKey: options.isrRscKey,\n isrSet: options.isrSet,\n mountedSlotsHeader: options.mountedSlotsHeader,\n expireSeconds: options.expireSeconds,\n // cacheLife-only routes discover their actual revalidate during the\n // fresh render; this seed only gets them into the cache read path.\n revalidateSeconds: currentRevalidateSeconds ?? 0,\n renderFreshPageForCache: async () =>\n runAppPageRevalidationContext(\n {\n cleanPathname: options.cleanPathname,\n currentFetchCacheMode: options.fetchCache ?? null,\n dynamicConfig,\n params: options.params,\n routePattern: route.pattern,\n routeSegments: route.routeSegments,\n setNavigationContext: options.setNavigationContext,\n },\n async () => {\n const revalidatedElement = await options.buildPageElement(\n route,\n options.params,\n undefined,\n new URLSearchParams(),\n );\n const revalidatedOnError = options.createRscOnErrorHandler(\n options.cleanPathname,\n route.pattern,\n );\n const revalidatedRscStream = options.renderToReadableStream(revalidatedElement, {\n onError: revalidatedOnError,\n });\n const revalidatedRscCapture = teeAppPageRscStreamForCapture(revalidatedRscStream, true);\n const revalidatedSsrEntry = await options.loadSsrHandler();\n const revalidatedCapturedRscRef: { value: Promise<ArrayBuffer> | null } = {\n value: null,\n };\n const revalidatedHtmlStream = await revalidatedSsrEntry.handleSsr(\n revalidatedRscCapture.ssrStream,\n options.getNavigationContext(),\n {\n links: options.getFontLinks(),\n styles: options.getFontStyles(),\n preloads: options.getFontPreloads(),\n },\n revalidatedRscCapture.sideStream\n ? {\n sideStream: revalidatedRscCapture.sideStream,\n capturedRscDataRef: revalidatedCapturedRscRef,\n }\n : undefined,\n );\n const html = await readStreamAsText(revalidatedHtmlStream);\n const rscData = await getCapturedRscDataPromise(revalidatedCapturedRscRef.value);\n const cacheLife = _consumeRequestScopedCacheLife();\n options.clearRequestContext();\n const tags = buildAppPageTags(\n options.cleanPathname,\n getCollectedFetchTags(),\n route.routeSegments,\n );\n return {\n html,\n rscData,\n tags,\n cacheControl:\n typeof cacheLife?.revalidate === \"number\"\n ? { revalidate: cacheLife.revalidate, expire: cacheLife.expire }\n : undefined,\n };\n },\n ),\n scheduleBackgroundRegeneration(key, renderFn) {\n options.scheduleBackgroundRegeneration(key, renderFn, {\n routerKind: \"App Router\",\n routePath: route.pattern,\n routeType: \"render\",\n });\n },\n });\n if (cachedPageResponse) {\n return cachedPageResponse;\n }\n }\n\n const dynamicParamsResponse = await validateAppPageDynamicParams({\n clearRequestContext: options.clearRequestContext,\n enforceStaticParamsOnly: options.dynamicParamsConfig === false,\n generateStaticParams: options.generateStaticParams,\n isDynamicRoute: route.isDynamic,\n params: options.params,\n });\n if (dynamicParamsResponse) {\n return dynamicParamsResponse;\n }\n\n const interceptResult = await resolveAppPageIntercept<\n TRoute,\n unknown,\n AppPageDispatchInterceptOptions,\n AppPageElement\n >({\n buildPageElement(interceptRoute, interceptParams, interceptOpts, interceptSearchParams) {\n setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(interceptRoute) ?? null);\n return options.buildPageElement(\n interceptRoute,\n interceptParams,\n interceptOpts,\n interceptSearchParams,\n );\n },\n cleanPathname: options.cleanPathname,\n currentRoute: route,\n findIntercept(pathname) {\n return options.findIntercept(pathname);\n },\n getRouteParamNames(sourceRoute) {\n return sourceRoute.params;\n },\n getSourceRoute(sourceRouteIndex) {\n return options.getSourceRoute(sourceRouteIndex);\n },\n isRscRequest: options.isRscRequest,\n renderInterceptResponse(sourceRoute, interceptElement) {\n const interceptOnError = options.createRscOnErrorHandler(\n options.cleanPathname,\n sourceRoute.pattern,\n );\n const interceptStream = options.renderToReadableStream(interceptElement, {\n onError: interceptOnError,\n });\n const interceptHeaders = new Headers({\n \"Content-Type\": \"text/x-component; charset=utf-8\",\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n mergeMiddlewareResponseHeaders(interceptHeaders, options.middlewareContext.headers);\n return new Response(interceptStream, {\n status: options.middlewareContext.status ?? 200,\n headers: interceptHeaders,\n });\n },\n searchParams: options.searchParams,\n setNavigationContext: options.setNavigationContext,\n toInterceptOpts(intercept) {\n return toInterceptOptions(options.interceptionContext, intercept);\n },\n });\n if (interceptResult.response) {\n return interceptResult.response;\n }\n\n const pageBuildResult = await buildAppPageElement({\n buildPageElement() {\n return options.buildPageElement(\n route,\n options.params,\n interceptResult.interceptOpts,\n options.searchParams,\n );\n },\n renderErrorBoundaryPage(buildError) {\n return options.renderErrorBoundaryPage(buildError);\n },\n renderSpecialError(specialError) {\n return renderPageSpecialError(options, specialError);\n },\n resolveSpecialError: resolveAppPageSpecialError,\n });\n if (pageBuildResult.response) {\n return pageBuildResult.response;\n }\n\n return renderAppPageLifecycle({\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n consumeDynamicUsage,\n consumeInvalidDynamicUsageError,\n createRscOnErrorHandler(pathname, routePath) {\n return options.createRscOnErrorHandler(pathname, routePath);\n },\n element: pageBuildResult.element,\n getDraftModeCookieHeader,\n getFontLinks: options.getFontLinks,\n getFontPreloads: options.getFontPreloads,\n getFontStyles: options.getFontStyles,\n getNavigationContext: options.getNavigationContext,\n getPageTags() {\n return buildAppPageTags(options.cleanPathname, getCollectedFetchTags(), route.routeSegments);\n },\n getRequestCacheLife() {\n return _consumeRequestScopedCacheLife();\n },\n peekRequestCacheLife() {\n return _peekRequestScopedCacheLife();\n },\n handlerStart: options.handlerStart,\n hasLoadingBoundary: Boolean(route.loading?.default),\n isDynamicError,\n isForceDynamic,\n isForceStatic,\n isPrerender: process.env.VINEXT_PRERENDER === \"1\",\n isProduction: options.isProduction,\n isRscRequest: options.isRscRequest,\n isrDebug: options.isrDebug,\n isrHtmlKey: options.isrHtmlKey,\n isrRscKey: options.isrRscKey,\n isrSet: options.isrSet,\n expireSeconds: options.expireSeconds,\n layoutCount: route.layouts.length,\n loadSsrHandler: options.loadSsrHandler,\n middlewareContext: options.middlewareContext,\n params: options.params,\n probeLayoutAt(layoutIndex) {\n return options.probeLayoutAt(layoutIndex);\n },\n probePage() {\n return options.probePage();\n },\n classification: {\n getLayoutId(index) {\n const treePosition = route.layoutTreePositions?.[index] ?? 0;\n return AppElementsWire.encodeLayoutId(\n createAppPageTreePath([...route.routeSegments], treePosition),\n );\n },\n buildTimeClassifications: route.__buildTimeClassifications,\n buildTimeReasons: route.__buildTimeReasons,\n debugClassification: options.debugClassification,\n async runWithIsolatedDynamicScope(fn) {\n const priorDynamic = consumeDynamicUsage();\n try {\n const result = await fn();\n const dynamicDetected = consumeDynamicUsage();\n return { result, dynamicDetected };\n } finally {\n consumeDynamicUsage();\n if (priorDynamic) markDynamicUsage();\n }\n },\n },\n revalidateSeconds: currentRevalidateSeconds,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderErrorBoundaryResponse(renderError) {\n return options.renderErrorBoundaryPage(renderError);\n },\n renderLayoutSpecialError(specialError, layoutIndex) {\n return renderLayoutSpecialError(options, specialError, layoutIndex);\n },\n renderPageSpecialError(specialError) {\n return renderPageSpecialError(options, specialError);\n },\n renderToReadableStream: options.renderToReadableStream,\n routeHasLocalBoundary: Boolean(\n route.error?.default || route.errors?.some((errorModule) => errorModule?.default),\n ),\n routePattern: route.pattern,\n runWithSuppressedHookWarning(probe) {\n return options.runWithSuppressedHookWarning(probe);\n },\n scriptNonce: options.scriptNonce,\n waitUntil(cachePromise) {\n getRequestExecutionContext()?.waitUntil(cachePromise);\n },\n });\n}\n\nasync function renderLayoutSpecialError<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n specialError: AppPageSpecialError,\n layoutIndex: number,\n): Promise<Response> {\n return buildAppPageSpecialErrorResponse({\n basePath: options.basePath,\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies,\n isRscRequest: options.isRscRequest,\n middlewareContext: options.middlewareContext,\n renderFallbackPage(statusCode) {\n const parentBoundary = resolveAppPageParentHttpAccessBoundaryModule({\n layoutIndex,\n rootForbiddenModule: options.rootForbiddenModule,\n rootNotFoundModule: options.rootNotFoundModule,\n rootUnauthorizedModule: options.rootUnauthorizedModule,\n routeForbiddenModules: options.route.forbiddens,\n routeNotFoundModules: options.route.notFounds,\n routeUnauthorizedModules: options.route.unauthorizeds,\n statusCode,\n })?.default;\n return options.renderHttpAccessFallbackPage(\n statusCode,\n {\n boundaryComponent: parentBoundary,\n layouts: options.route.layouts.slice(0, layoutIndex),\n matchedParams: options.params,\n },\n null,\n );\n },\n request: options.request,\n specialError,\n });\n}\n\nasync function renderPageSpecialError<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n specialError: AppPageSpecialError,\n): Promise<Response> {\n return buildAppPageSpecialErrorResponse({\n basePath: options.basePath,\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies,\n isRscRequest: options.isRscRequest,\n middlewareContext: options.middlewareContext,\n renderFallbackPage(statusCode) {\n return options.renderHttpAccessFallbackPage(\n statusCode,\n { matchedParams: options.params },\n null,\n );\n },\n request: options.request,\n specialError,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"app-page-dispatch.js","names":[],"sources":["../../src/server/app-page-dispatch.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { ReactFormState } from \"react-dom/client\";\nimport type { ClassificationReason } from \"../build/layout-classification-types.js\";\nimport {\n _consumeRequestScopedCacheLife,\n _peekRequestScopedCacheLife,\n type CachedAppPageValue,\n} from \"vinext/shims/cache\";\nimport {\n consumeDynamicUsage,\n consumeInvalidDynamicUsageError,\n consumeRenderRequestApiUsage,\n getAndClearPendingCookies,\n getDraftModeCookieHeader,\n isDraftModeRequest,\n markDynamicUsage,\n peekRenderRequestApiUsage,\n setHeadersContext,\n} from \"vinext/shims/headers\";\nimport { getRequestExecutionContext } from \"vinext/shims/request-context\";\nimport { createRequestContext, runWithRequestContext } from \"vinext/shims/unified-request-context\";\nimport {\n ensureFetchPatch,\n consumeDynamicFetchObservations,\n type FetchCacheMode,\n getCollectedFetchTags,\n peekDynamicFetchObservations,\n runWithFetchDedupe,\n setCurrentFetchCacheMode,\n setCurrentFetchSoftTags,\n} from \"vinext/shims/fetch-cache\";\nimport { AppElementsWire, type AppOutgoingElements } from \"./app-elements.js\";\nimport { readAppPageCacheResponse } from \"./app-page-cache.js\";\nimport { resolveAppPageParentHttpAccessBoundaryModule } from \"./app-page-boundary.js\";\nimport { readStreamAsText } from \"../utils/text-stream.js\";\nimport {\n buildAppPageSpecialErrorResponse,\n resolveAppPageSpecialError,\n teeAppPageRscStreamForCapture,\n type AppPageFontPreload,\n type AppPageSpecialError,\n type LayoutClassificationOptions,\n} from \"./app-page-execution.js\";\nimport { resolveAppPageMethodResponse } from \"./app-page-method.js\";\nimport {\n buildAppPageElement,\n resolveAppPageIntercept,\n validateAppPageDynamicParams,\n type ValidateAppPageDynamicParamsOptions,\n} from \"./app-page-request.js\";\nimport { renderAppPageLifecycle } from \"./app-page-render.js\";\nimport {\n createAppPageHtmlOutputScope,\n createAppPageRenderObservation,\n createAppPageRscOutputScope,\n} from \"./app-page-render-observation.js\";\nimport {\n mergeMiddlewareResponseHeaders,\n type AppPageMiddlewareContext,\n} from \"./app-page-response.js\";\nimport {\n VINEXT_RSC_CONTENT_TYPE,\n VINEXT_RSC_VARY_HEADER,\n applyRscCompatibilityIdHeader,\n} from \"./app-rsc-cache-busting.js\";\nimport {\n APP_RSC_RENDER_MODE_NAVIGATION,\n shouldSuppressLoadingBoundaries,\n type AppRscRenderMode,\n} from \"./app-rsc-render-mode.js\";\nimport { createAppPageTreePath } from \"./app-page-route-wiring.js\";\nimport type { AppPageSsrHandler } from \"./app-page-stream.js\";\nimport { createStaticGenerationHeadersContext } from \"./app-static-generation.js\";\nimport { buildPageCacheTags } from \"./implicit-tags.js\";\nimport type { ISRCacheEntry } from \"./isr-cache.js\";\n\ntype AppPageParams = Record<string, string | string[]>;\ntype AppPageElement = ReactNode | Readonly<Record<string, ReactNode>>;\ntype AppPageRenderableElement = ReactNode | AppOutgoingElements;\ntype AppPageBoundaryOnError = (\n error: unknown,\n requestInfo: unknown,\n errorContext: unknown,\n) => unknown;\ntype AppPageDebugLogger = (event: string, detail: string) => void;\ntype AppPageCacheSetter = (\n key: string,\n data: CachedAppPageValue,\n revalidateSeconds: number,\n tags: string[],\n expireSeconds?: number,\n) => Promise<void>;\ntype AppPageCacheGetter = (key: string) => Promise<ISRCacheEntry | null>;\ntype AppPageBackgroundRegenerationErrorContext = {\n routerKind: \"App Router\";\n routePath: string;\n routeType: \"render\";\n};\ntype AppPageBackgroundRegenerator = (\n key: string,\n renderFn: () => Promise<void>,\n errorContext?: AppPageBackgroundRegenerationErrorContext,\n) => void;\n\ntype AppPageDispatchIntercept<TPage = unknown> = {\n interceptLayouts?: readonly AppPageModule[] | null;\n matchedParams: AppPageParams;\n page: TPage;\n slotId?: string | null;\n slotKey: string;\n sourceRouteIndex: number;\n};\n\ntype AppPageDispatchInterceptOptions<TPage = unknown> = {\n interceptionContext: string | null;\n interceptLayouts?: readonly AppPageModule[] | null;\n interceptPage: TPage;\n interceptParams: AppPageParams;\n interceptSlotId?: string | null;\n interceptSlotKey: string;\n interceptSourceMatchedUrl?: string | null;\n};\n\ntype AppPageModule = {\n default?: unknown;\n};\n\ntype AppPageDispatchRoute = {\n __buildTimeClassifications?: LayoutClassificationOptions[\"buildTimeClassifications\"];\n __buildTimeReasons?: LayoutClassificationOptions[\"buildTimeReasons\"];\n error?: AppPageModule | null;\n errors?: readonly (AppPageModule | null | undefined)[];\n forbiddens?: readonly (AppPageModule | null | undefined)[];\n isDynamic: boolean;\n layouts: readonly AppPageModule[];\n layoutTreePositions?: readonly number[];\n loading?: AppPageModule | null;\n notFounds?: readonly (AppPageModule | null | undefined)[];\n params: readonly string[];\n pattern: string;\n routeSegments: readonly string[];\n unauthorizeds?: readonly (AppPageModule | null | undefined)[];\n};\n\ntype DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {\n /** Configured basePath (e.g. \"/blog\"). Used to prefix redirect Locations. */\n basePath?: string;\n buildPageElement: (\n route: TRoute,\n params: AppPageParams,\n opts: AppPageDispatchInterceptOptions | undefined,\n searchParams: URLSearchParams,\n ) => Promise<AppPageElement>;\n cleanPathname: string;\n clearRequestContext: () => void;\n createRscOnErrorHandler: (pathname: string, routePath: string) => AppPageBoundaryOnError;\n debugClassification?: (layoutId: string, reason: ClassificationReason) => void;\n dynamicConfig?: string;\n dynamicParamsConfig?: boolean;\n fetchCache?: FetchCacheMode | null;\n findIntercept: (pathname: string) => AppPageDispatchIntercept | null;\n formState?: ReactFormState | null;\n actionError?: unknown;\n actionFailed?: boolean;\n generateStaticParams?: ValidateAppPageDynamicParamsOptions[\"generateStaticParams\"];\n getFontLinks: () => string[];\n getFontPreloads: () => AppPageFontPreload[];\n getFontStyles: () => string[];\n getNavigationContext: () => unknown;\n getSourceRoute: (sourceRouteIndex: number) => TRoute | undefined;\n hasGenerateStaticParams: boolean;\n hasPageDefaultExport: boolean;\n hasPageModule: boolean;\n handlerStart: number;\n interceptionContext: string | null;\n isProgressiveActionRender?: boolean;\n isProduction: boolean;\n isRscRequest: boolean;\n isrDebug?: AppPageDebugLogger;\n isrGet: AppPageCacheGetter;\n isrHtmlKey: (pathname: string) => string;\n isrRscKey: (\n pathname: string,\n mountedSlotsHeader?: string | null,\n renderMode?: AppRscRenderMode,\n ) => string;\n isrSet: AppPageCacheSetter;\n loadSsrHandler: () => Promise<AppPageSsrHandler>;\n middlewareContext: AppPageMiddlewareContext;\n mountedSlotsHeader?: string | null;\n params: AppPageParams;\n probeLayoutAt: (layoutIndex: number) => unknown;\n probePage: () => unknown;\n expireSeconds?: number;\n renderErrorBoundaryPage: (error: unknown) => Promise<Response | null>;\n renderHttpAccessFallbackPage: (\n statusCode: number,\n opts: {\n boundaryComponent?: unknown;\n layouts?: readonly AppPageModule[];\n matchedParams: AppPageParams;\n },\n middlewareContext: AppPageMiddlewareContext | null,\n ) => Promise<Response | null>;\n renderToReadableStream: (\n element: AppPageRenderableElement,\n options: { onError: AppPageBoundaryOnError },\n ) => ReadableStream<Uint8Array>;\n request: Request;\n revalidateSeconds: number | null;\n resolveRouteFetchCacheMode?: (route: TRoute) => FetchCacheMode | null;\n rootForbiddenModule?: AppPageModule | null;\n rootNotFoundModule?: AppPageModule | null;\n rootUnauthorizedModule?: AppPageModule | null;\n route: TRoute;\n runWithSuppressedHookWarning<T>(probe: () => Promise<T>): Promise<T>;\n scheduleBackgroundRegeneration: AppPageBackgroundRegenerator;\n scriptNonce?: string;\n searchParams: URLSearchParams;\n setNavigationContext: (context: {\n params: AppPageParams;\n pathname: string;\n searchParams: URLSearchParams;\n }) => void;\n renderMode?: AppRscRenderMode;\n};\n\nfunction shouldReadAppPageCache(options: {\n isProgressiveActionRender: boolean;\n isDraftMode: boolean;\n isForceDynamic: boolean;\n isProduction: boolean;\n isRscRequest: boolean;\n revalidateSeconds: number | null;\n scriptNonce?: string;\n}): boolean {\n return (\n options.isProduction &&\n !options.isProgressiveActionRender &&\n !options.isDraftMode &&\n !options.isForceDynamic &&\n (options.isRscRequest || !options.scriptNonce) &&\n (options.revalidateSeconds === null || options.revalidateSeconds > 0)\n );\n}\n\nfunction buildAppPageTags(\n cleanPathname: string,\n extraTags: string[],\n routeSegments: readonly string[],\n): string[] {\n return buildPageCacheTags(cleanPathname, extraTags, [...routeSegments], \"page\");\n}\n\nasync function runAppPageRevalidationContext<\n TResult extends {\n html: string;\n rscData: ArrayBuffer;\n tags: string[];\n },\n>(\n options: {\n cleanPathname: string;\n currentFetchCacheMode?: FetchCacheMode | null;\n dynamicConfig?: string;\n params: AppPageParams;\n routePattern: string;\n routeSegments: readonly string[];\n setNavigationContext: DispatchAppPageOptions<AppPageDispatchRoute>[\"setNavigationContext\"];\n },\n renderFn: () => Promise<TResult>,\n): Promise<TResult> {\n const headersContext = createStaticGenerationHeadersContext({\n dynamicConfig: options.dynamicConfig,\n routeKind: \"page\",\n routePattern: options.routePattern,\n });\n const requestContext = createRequestContext({\n headersContext,\n currentFetchCacheMode: options.currentFetchCacheMode ?? null,\n executionContext: getRequestExecutionContext(),\n unstableCacheRevalidation: \"foreground\",\n });\n\n return runWithRequestContext(requestContext, async () => {\n ensureFetchPatch();\n setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], options.routeSegments));\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: new URLSearchParams(),\n params: options.params,\n });\n return await runWithFetchDedupe(renderFn);\n });\n}\n\nfunction getCapturedRscDataPromise(\n capturedRscDataPromise: Promise<ArrayBuffer> | null,\n): Promise<ArrayBuffer> {\n if (!capturedRscDataPromise) {\n throw new Error(\n \"[vinext] Expected captured RSC data while regenerating an app page cache entry\",\n );\n }\n\n return capturedRscDataPromise;\n}\n\nfunction toInterceptOptions(\n interceptionContext: string | null,\n intercept: AppPageDispatchIntercept,\n): AppPageDispatchInterceptOptions {\n return {\n interceptionContext,\n interceptLayouts: intercept.interceptLayouts,\n interceptPage: intercept.page,\n interceptParams: intercept.matchedParams,\n interceptSlotId: intercept.slotId ?? null,\n interceptSlotKey: intercept.slotKey,\n interceptSourceMatchedUrl: interceptionContext,\n };\n}\n\nexport async function dispatchAppPage<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n): Promise<Response> {\n return await runWithFetchDedupe(() => dispatchAppPageInner(options));\n}\n\nasync function dispatchAppPageInner<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n): Promise<Response> {\n const route = options.route;\n const dynamicConfig = options.dynamicConfig;\n const currentRevalidateSeconds = options.revalidateSeconds;\n const isForceStatic = dynamicConfig === \"force-static\";\n const isDynamicError = dynamicConfig === \"error\";\n const isForceDynamic = dynamicConfig === \"force-dynamic\";\n const isDraftMode = isDraftModeRequest(options.request);\n\n setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], route.routeSegments));\n setCurrentFetchCacheMode(options.fetchCache ?? null);\n\n if (options.hasPageModule && !options.hasPageDefaultExport) {\n options.clearRequestContext();\n return new Response(\"Page has no default export\", { status: 500 });\n }\n\n const methodResponse = resolveAppPageMethodResponse({\n dynamicConfig,\n hasGenerateStaticParams: options.hasGenerateStaticParams,\n isDynamicRoute: route.isDynamic,\n middlewareHeaders: options.middlewareContext.headers,\n request: options.request,\n revalidateSeconds: currentRevalidateSeconds,\n });\n if (methodResponse) {\n options.clearRequestContext();\n return methodResponse;\n }\n\n if ((isForceStatic || isDynamicError) && !isDraftMode) {\n setHeadersContext(\n createStaticGenerationHeadersContext({\n dynamicConfig,\n routeKind: \"page\",\n routePattern: route.pattern,\n }),\n );\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: new URLSearchParams(),\n params: options.params,\n });\n }\n\n if (\n shouldReadAppPageCache({\n isDraftMode,\n isForceDynamic,\n isProgressiveActionRender: options.isProgressiveActionRender === true,\n isProduction: options.isProduction,\n isRscRequest: options.isRscRequest,\n revalidateSeconds: currentRevalidateSeconds,\n scriptNonce: options.scriptNonce,\n })\n ) {\n const cachedPageResponse = await readAppPageCacheResponse({\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n isRscRequest: options.isRscRequest,\n isrDebug: options.isrDebug,\n isrGet: options.isrGet,\n isrHtmlKey: options.isrHtmlKey,\n isrRscKey: options.isrRscKey,\n isrSet: options.isrSet,\n middlewareHeaders: options.middlewareContext.headers,\n middlewareStatus: options.middlewareContext.status,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderMode: options.renderMode,\n expireSeconds: options.expireSeconds,\n // cacheLife-only routes discover their actual revalidate during the\n // fresh render; this seed only gets them into the cache read path.\n revalidateSeconds: currentRevalidateSeconds ?? 0,\n renderFreshPageForCache: async () =>\n runAppPageRevalidationContext(\n {\n cleanPathname: options.cleanPathname,\n currentFetchCacheMode: options.fetchCache ?? null,\n dynamicConfig,\n params: options.params,\n routePattern: route.pattern,\n routeSegments: route.routeSegments,\n setNavigationContext: options.setNavigationContext,\n },\n async () => {\n const revalidatedElement = await options.buildPageElement(\n route,\n options.params,\n undefined,\n new URLSearchParams(),\n );\n const revalidatedOnError = options.createRscOnErrorHandler(\n options.cleanPathname,\n route.pattern,\n );\n // No inner runWithFetchDedupe here: this renderFn is already\n // wrapped in runWithFetchDedupe by runAppPageRevalidationContext.\n const revalidatedRscStream = options.renderToReadableStream(revalidatedElement, {\n onError: revalidatedOnError,\n });\n const revalidatedRscCapture = teeAppPageRscStreamForCapture(revalidatedRscStream, true);\n const revalidatedSsrEntry = await options.loadSsrHandler();\n const revalidatedCapturedRscRef: { value: Promise<ArrayBuffer> | null } = {\n value: null,\n };\n const revalidatedHtmlStream = await revalidatedSsrEntry.handleSsr(\n revalidatedRscCapture.ssrStream,\n options.getNavigationContext(),\n {\n links: options.getFontLinks(),\n styles: options.getFontStyles(),\n preloads: options.getFontPreloads(),\n },\n {\n basePath: options.basePath,\n ...(revalidatedRscCapture.sideStream\n ? {\n sideStream: revalidatedRscCapture.sideStream,\n capturedRscDataRef: revalidatedCapturedRscRef,\n }\n : {}),\n },\n );\n const html = await readStreamAsText(revalidatedHtmlStream);\n const rscData = await getCapturedRscDataPromise(revalidatedCapturedRscRef.value);\n const cacheLife = _consumeRequestScopedCacheLife();\n options.clearRequestContext();\n const tags = buildAppPageTags(\n options.cleanPathname,\n getCollectedFetchTags(),\n route.routeSegments,\n );\n // Consume once: HTML and RSC artifacts are produced by the same\n // regeneration render and should carry the same observation set.\n const observationState = {\n dynamicFetches: consumeDynamicFetchObservations(),\n requestApis: consumeRenderRequestApiUsage(),\n };\n return {\n html,\n htmlRenderObservation: createAppPageRenderObservation({\n boundaryOutcome: { kind: \"success\" },\n cacheability: \"public\",\n cacheTags: tags,\n cleanPathname: options.cleanPathname,\n completeness: \"complete\",\n output: createAppPageHtmlOutputScope({\n element: revalidatedElement,\n renderEpoch: null,\n rootBoundaryId: null,\n routePattern: route.pattern,\n }),\n params: options.params,\n state: observationState,\n }),\n rscData,\n rscRenderObservation: createAppPageRenderObservation({\n boundaryOutcome: { kind: \"success\" },\n cacheability: \"public\",\n cacheTags: tags,\n cleanPathname: options.cleanPathname,\n completeness: \"complete\",\n output: createAppPageRscOutputScope({\n element: revalidatedElement,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderEpoch: null,\n rootBoundaryId: null,\n routePattern: route.pattern,\n }),\n params: options.params,\n state: observationState,\n }),\n tags,\n cacheControl:\n typeof cacheLife?.revalidate === \"number\"\n ? { revalidate: cacheLife.revalidate, expire: cacheLife.expire }\n : undefined,\n };\n },\n ),\n scheduleBackgroundRegeneration(key, renderFn) {\n options.scheduleBackgroundRegeneration(key, renderFn, {\n routerKind: \"App Router\",\n routePath: route.pattern,\n routeType: \"render\",\n });\n },\n });\n if (cachedPageResponse) {\n return cachedPageResponse;\n }\n }\n\n const dynamicParamsResponse = await validateAppPageDynamicParams({\n clearRequestContext: options.clearRequestContext,\n enforceStaticParamsOnly: options.dynamicParamsConfig === false,\n generateStaticParams: options.generateStaticParams,\n isDynamicRoute: route.isDynamic,\n params: options.params,\n });\n if (dynamicParamsResponse) {\n return dynamicParamsResponse;\n }\n\n const interceptResult = await resolveAppPageIntercept<\n TRoute,\n unknown,\n AppPageDispatchInterceptOptions,\n AppPageElement\n >({\n buildPageElement(interceptRoute, interceptParams, interceptOpts, interceptSearchParams) {\n setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(interceptRoute) ?? null);\n return options.buildPageElement(\n interceptRoute,\n interceptParams,\n interceptOpts,\n interceptSearchParams,\n );\n },\n cleanPathname: options.cleanPathname,\n currentRoute: route,\n findIntercept(pathname) {\n return options.findIntercept(pathname);\n },\n getRouteParamNames(sourceRoute) {\n return sourceRoute.params;\n },\n getSourceRoute(sourceRouteIndex) {\n return options.getSourceRoute(sourceRouteIndex);\n },\n isRscRequest: options.isRscRequest,\n renderInterceptResponse(sourceRoute, interceptElement) {\n const interceptOnError = options.createRscOnErrorHandler(\n options.cleanPathname,\n sourceRoute.pattern,\n );\n // No inner runWithFetchDedupe here: dispatchAppPage already activated\n // dedupe at line 294, and this callback runs inside dispatchAppPageInner.\n const interceptStream = options.renderToReadableStream(interceptElement, {\n onError: interceptOnError,\n });\n const interceptHeaders = new Headers({\n \"Content-Type\": VINEXT_RSC_CONTENT_TYPE,\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n mergeMiddlewareResponseHeaders(interceptHeaders, options.middlewareContext.headers);\n applyRscCompatibilityIdHeader(interceptHeaders);\n return new Response(interceptStream, {\n status: options.middlewareContext.status ?? 200,\n headers: interceptHeaders,\n });\n },\n searchParams: options.searchParams,\n setNavigationContext: options.setNavigationContext,\n toInterceptOpts(intercept) {\n return toInterceptOptions(options.interceptionContext, intercept);\n },\n });\n if (interceptResult.response) {\n return interceptResult.response;\n }\n\n const pageBuildResult = await buildAppPageElement({\n buildPageElement() {\n if (options.actionFailed) {\n throw options.actionError;\n }\n return options.buildPageElement(\n route,\n options.params,\n interceptResult.interceptOpts,\n options.searchParams,\n );\n },\n renderErrorBoundaryPage(buildError) {\n return options.renderErrorBoundaryPage(buildError);\n },\n renderSpecialError(specialError) {\n return renderPageSpecialError(options, specialError);\n },\n resolveSpecialError: resolveAppPageSpecialError,\n });\n if (pageBuildResult.response) {\n return pageBuildResult.response;\n }\n\n return renderAppPageLifecycle({\n basePath: options.basePath,\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n consumeDynamicUsage,\n consumeInvalidDynamicUsageError,\n consumeRenderObservationState() {\n return {\n dynamicFetches: consumeDynamicFetchObservations(),\n requestApis: consumeRenderRequestApiUsage(),\n };\n },\n createRscOnErrorHandler(pathname, routePath) {\n return options.createRscOnErrorHandler(pathname, routePath);\n },\n element: pageBuildResult.element,\n getDraftModeCookieHeader,\n getFontLinks: options.getFontLinks,\n getFontPreloads: options.getFontPreloads,\n getFontStyles: options.getFontStyles,\n getNavigationContext: options.getNavigationContext,\n getPageTags() {\n return buildAppPageTags(options.cleanPathname, getCollectedFetchTags(), route.routeSegments);\n },\n getRequestCacheLife() {\n return _consumeRequestScopedCacheLife();\n },\n peekRequestCacheLife() {\n return _peekRequestScopedCacheLife();\n },\n handlerStart: options.handlerStart,\n hasLoadingBoundary: shouldSuppressLoadingBoundaries(\n options.renderMode ?? APP_RSC_RENDER_MODE_NAVIGATION,\n )\n ? false\n : Boolean(route.loading?.default),\n formState: options.formState ?? null,\n isProgressiveActionRender: options.isProgressiveActionRender === true,\n isDynamicError,\n isDraftMode,\n isForceDynamic,\n isForceStatic,\n isPrerender: process.env.VINEXT_PRERENDER === \"1\",\n isProduction: options.isProduction,\n isRscRequest: options.isRscRequest,\n isrDebug: options.isrDebug,\n isrHtmlKey: options.isrHtmlKey,\n isrRscKey: options.isrRscKey,\n isrSet: options.isrSet,\n expireSeconds: options.expireSeconds,\n layoutCount: route.layouts.length,\n loadSsrHandler: options.loadSsrHandler,\n middlewareContext: options.middlewareContext,\n params: options.params,\n peekRenderObservationState() {\n return {\n dynamicFetches: peekDynamicFetchObservations(),\n requestApis: peekRenderRequestApiUsage(),\n };\n },\n probeLayoutAt(layoutIndex) {\n return options.probeLayoutAt(layoutIndex);\n },\n probePage() {\n return options.probePage();\n },\n classification: {\n getLayoutId(index) {\n const treePosition = route.layoutTreePositions?.[index] ?? 0;\n return AppElementsWire.encodeLayoutId(\n createAppPageTreePath([...route.routeSegments], treePosition),\n );\n },\n buildTimeClassifications: route.__buildTimeClassifications,\n buildTimeReasons: route.__buildTimeReasons,\n debugClassification: options.debugClassification,\n async runWithIsolatedDynamicScope(fn) {\n const priorDynamic = consumeDynamicUsage();\n try {\n const result = await fn();\n const dynamicDetected = consumeDynamicUsage();\n return { result, dynamicDetected };\n } finally {\n consumeDynamicUsage();\n if (priorDynamic) markDynamicUsage();\n }\n },\n },\n revalidateSeconds: currentRevalidateSeconds,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderMode: options.renderMode ?? APP_RSC_RENDER_MODE_NAVIGATION,\n renderErrorBoundaryResponse(renderError) {\n return options.renderErrorBoundaryPage(renderError);\n },\n renderLayoutSpecialError(specialError, layoutIndex) {\n return renderLayoutSpecialError(options, specialError, layoutIndex);\n },\n renderPageSpecialError(specialError) {\n return renderPageSpecialError(options, specialError);\n },\n renderToReadableStream: options.renderToReadableStream,\n routeHasLocalBoundary: Boolean(\n route.error?.default || route.errors?.some((errorModule) => errorModule?.default),\n ),\n routePattern: route.pattern,\n runWithSuppressedHookWarning(probe) {\n return options.runWithSuppressedHookWarning(probe);\n },\n scriptNonce: options.scriptNonce,\n waitUntil(cachePromise) {\n getRequestExecutionContext()?.waitUntil(cachePromise);\n },\n });\n}\n\nasync function renderLayoutSpecialError<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n specialError: AppPageSpecialError,\n layoutIndex: number,\n): Promise<Response> {\n return buildAppPageSpecialErrorResponse({\n basePath: options.basePath,\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies,\n isRscRequest: options.isRscRequest,\n middlewareContext: options.middlewareContext,\n renderFallbackPage(statusCode) {\n const parentBoundary = resolveAppPageParentHttpAccessBoundaryModule({\n layoutIndex,\n rootForbiddenModule: options.rootForbiddenModule,\n rootNotFoundModule: options.rootNotFoundModule,\n rootUnauthorizedModule: options.rootUnauthorizedModule,\n routeForbiddenModules: options.route.forbiddens,\n routeNotFoundModules: options.route.notFounds,\n routeUnauthorizedModules: options.route.unauthorizeds,\n statusCode,\n })?.default;\n return options.renderHttpAccessFallbackPage(\n statusCode,\n {\n boundaryComponent: parentBoundary,\n layouts: options.route.layouts.slice(0, layoutIndex),\n matchedParams: options.params,\n },\n null,\n );\n },\n request: options.request,\n specialError,\n });\n}\n\nasync function renderPageSpecialError<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n specialError: AppPageSpecialError,\n): Promise<Response> {\n return buildAppPageSpecialErrorResponse({\n basePath: options.basePath,\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies,\n isRscRequest: options.isRscRequest,\n middlewareContext: options.middlewareContext,\n renderFallbackPage(statusCode) {\n return options.renderHttpAccessFallbackPage(\n statusCode,\n { matchedParams: options.params },\n null,\n );\n },\n request: options.request,\n specialError,\n });\n}\n"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { MetadataFileRoute } from "./metadata-routes.js";
2
2
  import { AppElements } from "./app-elements-wire.js";
3
3
  import { AppPageParams } from "./app-page-boundary.js";
4
+ import { AppRscRenderMode } from "./app-rsc-render-mode.js";
4
5
  import { AppPageErrorModule, AppPageModule, AppPageRouteWiringRoute } from "./app-page-route-wiring.js";
5
6
 
6
7
  //#region src/server/app-page-element-builder.d.ts
@@ -19,14 +20,17 @@ type AppPageInterceptOptions<TModule extends AppPageModule = AppPageModule> = {
19
20
  interceptLayouts?: readonly (TModule | null | undefined)[] | null;
20
21
  interceptPage?: TModule | null;
21
22
  interceptParams?: AppPageParams | null;
23
+ interceptSlotId?: string | null;
22
24
  interceptSlotKey?: string | null;
25
+ interceptSourceMatchedUrl?: string | null;
23
26
  };
24
27
  type AppPagePageRequest<TModule extends AppPageModule = AppPageModule> = {
25
28
  /** Interception context from current-route navigation (null for direct visits). */opts?: AppPageInterceptOptions<TModule> | null; /** URL search params from the incoming request (null when unavailable). */
26
29
  searchParams?: URLSearchParams | null; /** Whether the incoming request is an RSC (client-side navigation) request. */
27
30
  isRscRequest: boolean; /** The incoming HTTP request (available but unused by this module). */
28
31
  request: Request; /** Normalized x-vinext-mounted-slots header value. */
29
- mountedSlotsHeader: string | null;
32
+ mountedSlotsHeader: string | null; /** Semantic RSC payload mode for this page render. */
33
+ renderMode?: AppRscRenderMode;
30
34
  };
31
35
  type BuildPageElementsOptions<TModule extends AppPageModule = AppPageModule, TErrorModule extends AppPageErrorModule = AppPageErrorModule> = {
32
36
  route: AppPageBuildRoute<TModule, TErrorModule>;
@@ -38,6 +42,11 @@ type BuildPageElementsOptions<TModule extends AppPageModule = AppPageModule, TEr
38
42
  rootForbiddenModule?: TModule | null; /** Root-level unauthorized.tsx module. Present when the app defines this file. */
39
43
  rootUnauthorizedModule?: TModule | null; /** File-based metadata routes (favicon, manifest, sitemap, etc.). */
40
44
  metadataRoutes: readonly MetadataFileRoute[];
45
+ /**
46
+ * Configured next.config `basePath`. Threaded through `resolveAppPageHead`
47
+ * so file-based metadata route URLs emitted in <head> are prefixed.
48
+ */
49
+ basePath?: string;
41
50
  };
42
51
  /**
43
52
  * Build the App Router element tree for a matched route.