vinext 0.0.55 → 0.1.0

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 (985) hide show
  1. package/README.md +51 -15
  2. package/dist/build/clean-output.d.ts +1 -2
  3. package/dist/build/clean-output.js +0 -2
  4. package/dist/build/client-build-config.d.ts +16 -3
  5. package/dist/build/client-build-config.js +29 -4
  6. package/dist/build/css-url-assets.d.ts +29 -0
  7. package/dist/build/css-url-assets.js +211 -0
  8. package/dist/build/google-fonts/build-url.d.ts +1 -2
  9. package/dist/build/google-fonts/build-url.js +0 -2
  10. package/dist/build/google-fonts/fallback-metrics-data.js +0 -2
  11. package/dist/build/google-fonts/fallback-metrics.d.ts +1 -2
  12. package/dist/build/google-fonts/fallback-metrics.js +0 -2
  13. package/dist/build/google-fonts/font-data.js +0 -2
  14. package/dist/build/google-fonts/font-metadata.d.ts +1 -2
  15. package/dist/build/google-fonts/font-metadata.js +0 -2
  16. package/dist/build/google-fonts/get-axes.d.ts +1 -2
  17. package/dist/build/google-fonts/get-axes.js +0 -2
  18. package/dist/build/google-fonts/sort-variants.d.ts +1 -2
  19. package/dist/build/google-fonts/sort-variants.js +0 -2
  20. package/dist/build/google-fonts/validate.d.ts +1 -2
  21. package/dist/build/google-fonts/validate.js +0 -2
  22. package/dist/build/inline-css.d.ts +1 -2
  23. package/dist/build/inline-css.js +0 -2
  24. package/dist/build/layout-classification-types.d.ts +1 -2
  25. package/dist/build/layout-classification.d.ts +2 -3
  26. package/dist/build/layout-classification.js +1 -3
  27. package/dist/build/next-client-runtime-manifests.d.ts +14 -0
  28. package/dist/build/next-client-runtime-manifests.js +39 -0
  29. package/dist/build/nitro-route-rules.d.ts +1 -2
  30. package/dist/build/nitro-route-rules.js +0 -2
  31. package/dist/build/precompress.d.ts +1 -2
  32. package/dist/build/precompress.js +0 -2
  33. package/dist/build/prerender.d.ts +2 -3
  34. package/dist/build/prerender.js +14 -2
  35. package/dist/build/report.d.ts +1 -2
  36. package/dist/build/report.js +0 -2
  37. package/dist/build/route-classification-injector.d.ts +1 -2
  38. package/dist/build/route-classification-injector.js +4 -6
  39. package/dist/build/route-classification-manifest.d.ts +5 -6
  40. package/dist/build/route-classification-manifest.js +5 -7
  41. package/dist/build/run-prerender.d.ts +1 -2
  42. package/dist/build/run-prerender.js +15 -7
  43. package/dist/build/server-manifest.d.ts +1 -2
  44. package/dist/build/server-manifest.js +0 -2
  45. package/dist/build/ssr-manifest.d.ts +1 -2
  46. package/dist/build/ssr-manifest.js +2 -4
  47. package/dist/build/standalone.d.ts +1 -2
  48. package/dist/build/standalone.js +0 -2
  49. package/dist/build/static-export.d.ts +2 -3
  50. package/dist/build/static-export.js +0 -2
  51. package/dist/cache/cache-adapters-virtual.d.ts +50 -0
  52. package/dist/cache/cache-adapters-virtual.js +45 -0
  53. package/dist/check.d.ts +33 -2
  54. package/dist/check.js +306 -24
  55. package/dist/cli-args.d.ts +1 -2
  56. package/dist/cli-args.js +0 -2
  57. package/dist/cli.js +7 -13
  58. package/dist/client/instrumentation-client-inject.d.ts +1 -2
  59. package/dist/client/instrumentation-client-inject.js +0 -2
  60. package/dist/client/instrumentation-client-state.d.ts +1 -2
  61. package/dist/client/instrumentation-client-state.js +0 -2
  62. package/dist/client/instrumentation-client.d.ts +1 -2
  63. package/dist/client/instrumentation-client.js +0 -2
  64. package/dist/client/navigation-runtime.d.ts +1 -2
  65. package/dist/client/navigation-runtime.js +0 -2
  66. package/dist/client/pages-router-link-navigation.d.ts +1 -2
  67. package/dist/client/pages-router-link-navigation.js +0 -2
  68. package/dist/client/validate-module-path.d.ts +1 -2
  69. package/dist/client/validate-module-path.js +0 -2
  70. package/dist/client/vinext-next-data.d.ts +1 -2
  71. package/dist/client/vinext-next-data.js +0 -2
  72. package/dist/client/window-next.d.ts +1 -2
  73. package/dist/client/window-next.js +0 -2
  74. package/dist/cloudflare/index.d.ts +1 -1
  75. package/dist/cloudflare/index.js +1 -1
  76. package/dist/cloudflare/src/cache/cdn-adapter.runtime.js +97 -0
  77. package/dist/cloudflare/{kv-cache-handler.d.ts → src/cache/kv-data-adapter.runtime.d.ts} +25 -6
  78. package/dist/cloudflare/{kv-cache-handler.js → src/cache/kv-data-adapter.runtime.js} +36 -28
  79. package/dist/cloudflare/src/utils/cache-control-metadata.js +20 -0
  80. package/dist/cloudflare/tpr.d.ts +2 -3
  81. package/dist/cloudflare/tpr.js +8 -8
  82. package/dist/config/config-matchers.d.ts +1 -2
  83. package/dist/config/config-matchers.js +0 -2
  84. package/dist/config/dotenv.d.ts +1 -2
  85. package/dist/config/dotenv.js +0 -2
  86. package/dist/config/next-config.d.ts +16 -2
  87. package/dist/config/next-config.js +23 -4
  88. package/dist/config/tsconfig-paths.d.ts +1 -2
  89. package/dist/config/tsconfig-paths.js +3 -7
  90. package/dist/deploy.d.ts +48 -3
  91. package/dist/deploy.js +141 -112
  92. package/dist/entries/app-browser-entry.d.ts +1 -2
  93. package/dist/entries/app-browser-entry.js +0 -2
  94. package/dist/entries/app-rsc-entry.d.ts +4 -4
  95. package/dist/entries/app-rsc-entry.js +50 -61
  96. package/dist/entries/app-rsc-manifest.d.ts +1 -2
  97. package/dist/entries/app-rsc-manifest.js +20 -7
  98. package/dist/entries/app-ssr-entry.d.ts +1 -2
  99. package/dist/entries/app-ssr-entry.js +0 -2
  100. package/dist/entries/pages-client-entry.d.ts +3 -3
  101. package/dist/entries/pages-client-entry.js +16 -5
  102. package/dist/entries/pages-entry-helpers.d.ts +2 -11
  103. package/dist/entries/pages-entry-helpers.js +1 -20
  104. package/dist/entries/pages-server-entry.d.ts +2 -3
  105. package/dist/entries/pages-server-entry.js +89 -702
  106. package/dist/entries/runtime-entry-module.d.ts +1 -2
  107. package/dist/entries/runtime-entry-module.js +0 -2
  108. package/dist/index.d.ts +22 -2
  109. package/dist/index.js +216 -101
  110. package/dist/init.d.ts +1 -2
  111. package/dist/init.js +1 -3
  112. package/dist/plugins/ast-utils.d.ts +20 -0
  113. package/dist/plugins/ast-utils.js +78 -0
  114. package/dist/plugins/async-hooks-stub.d.ts +1 -2
  115. package/dist/plugins/async-hooks-stub.js +0 -2
  116. package/dist/plugins/client-reference-dedup.d.ts +1 -2
  117. package/dist/plugins/client-reference-dedup.js +4 -8
  118. package/dist/plugins/css-data-url.d.ts +1 -2
  119. package/dist/plugins/css-data-url.js +0 -2
  120. package/dist/plugins/fonts.d.ts +13 -3
  121. package/dist/plugins/fonts.js +19 -13
  122. package/dist/plugins/import-meta-url.d.ts +2 -2
  123. package/dist/plugins/import-meta-url.js +187 -33
  124. package/dist/plugins/instrumentation-client.d.ts +1 -2
  125. package/dist/plugins/instrumentation-client.js +0 -2
  126. package/dist/plugins/middleware-server-only.d.ts +1 -2
  127. package/dist/plugins/middleware-server-only.js +0 -2
  128. package/dist/plugins/og-assets.d.ts +32 -8
  129. package/dist/plugins/og-assets.js +126 -34
  130. package/dist/plugins/optimize-imports.d.ts +1 -2
  131. package/dist/plugins/optimize-imports.js +9 -17
  132. package/dist/plugins/postcss.d.ts +1 -2
  133. package/dist/plugins/postcss.js +0 -2
  134. package/dist/plugins/remove-console.d.ts +1 -2
  135. package/dist/plugins/remove-console.js +0 -2
  136. package/dist/plugins/rsc-client-reference-loaders.d.ts +1 -2
  137. package/dist/plugins/rsc-client-reference-loaders.js +0 -2
  138. package/dist/plugins/rsc-client-shim-excludes.d.ts +1 -2
  139. package/dist/plugins/rsc-client-shim-excludes.js +0 -2
  140. package/dist/plugins/sass.d.ts +1 -2
  141. package/dist/plugins/sass.js +0 -2
  142. package/dist/plugins/server-externals-manifest.d.ts +1 -2
  143. package/dist/plugins/server-externals-manifest.js +0 -2
  144. package/dist/plugins/strip-server-exports.d.ts +1 -2
  145. package/dist/plugins/strip-server-exports.js +0 -2
  146. package/dist/routing/app-route-graph.d.ts +2 -9
  147. package/dist/routing/app-route-graph.js +9 -30
  148. package/dist/routing/app-router.d.ts +1 -2
  149. package/dist/routing/app-router.js +0 -2
  150. package/dist/routing/file-matcher.d.ts +6 -2
  151. package/dist/routing/file-matcher.js +15 -7
  152. package/dist/routing/pages-router.d.ts +1 -2
  153. package/dist/routing/pages-router.js +0 -2
  154. package/dist/routing/route-matching.d.ts +1 -2
  155. package/dist/routing/route-matching.js +0 -2
  156. package/dist/routing/route-pattern.d.ts +1 -2
  157. package/dist/routing/route-pattern.js +0 -2
  158. package/dist/routing/route-trie.d.ts +1 -2
  159. package/dist/routing/route-trie.js +0 -2
  160. package/dist/routing/route-validation.d.ts +1 -2
  161. package/dist/routing/route-validation.js +0 -2
  162. package/dist/routing/utils.d.ts +44 -2
  163. package/dist/routing/utils.js +62 -3
  164. package/dist/server/api-handler.d.ts +1 -2
  165. package/dist/server/api-handler.js +0 -2
  166. package/dist/server/app-bfcache-id.d.ts +5 -0
  167. package/dist/server/app-bfcache-id.js +5 -0
  168. package/dist/server/app-browser-action-result.d.ts +1 -2
  169. package/dist/server/app-browser-action-result.js +0 -2
  170. package/dist/server/app-browser-client-reuse-manifest.d.ts +12 -0
  171. package/dist/server/app-browser-client-reuse-manifest.js +101 -0
  172. package/dist/server/app-browser-entry.js +186 -75
  173. package/dist/server/app-browser-error.d.ts +1 -2
  174. package/dist/server/app-browser-error.js +0 -2
  175. package/dist/server/app-browser-hydration.d.ts +1 -2
  176. package/dist/server/app-browser-hydration.js +0 -2
  177. package/dist/server/app-browser-interception-context.d.ts +1 -2
  178. package/dist/server/app-browser-interception-context.js +0 -2
  179. package/dist/server/app-browser-mpa-navigation.d.ts +2 -2
  180. package/dist/server/app-browser-mpa-navigation.js +9 -3
  181. package/dist/server/app-browser-navigation-controller.d.ts +5 -4
  182. package/dist/server/app-browser-navigation-controller.js +3 -3
  183. package/dist/server/app-browser-popstate.d.ts +1 -2
  184. package/dist/server/app-browser-popstate.js +0 -2
  185. package/dist/server/app-browser-rsc-redirect.d.ts +1 -2
  186. package/dist/server/app-browser-rsc-redirect.js +0 -2
  187. package/dist/server/app-browser-state.d.ts +28 -4
  188. package/dist/server/app-browser-state.js +193 -10
  189. package/dist/server/app-browser-stream.d.ts +1 -2
  190. package/dist/server/app-browser-stream.js +0 -2
  191. package/dist/server/app-browser-visible-commit.d.ts +2 -3
  192. package/dist/server/app-browser-visible-commit.js +24 -17
  193. package/dist/server/app-client-reference-preloader.d.ts +1 -2
  194. package/dist/server/app-client-reference-preloader.js +0 -2
  195. package/dist/server/app-elements-wire.d.ts +14 -8
  196. package/dist/server/app-elements-wire.js +45 -24
  197. package/dist/server/app-elements.d.ts +2 -3
  198. package/dist/server/app-elements.js +2 -4
  199. package/dist/server/app-fallback-renderer.d.ts +5 -5
  200. package/dist/server/app-fallback-renderer.js +4 -3
  201. package/dist/server/app-history-state.d.ts +18 -2
  202. package/dist/server/app-history-state.js +68 -10
  203. package/dist/server/app-hook-warning-suppression.d.ts +1 -2
  204. package/dist/server/app-hook-warning-suppression.js +0 -2
  205. package/dist/server/app-inline-css-client.d.ts +1 -2
  206. package/dist/server/app-inline-css-client.js +0 -2
  207. package/dist/server/app-interception-context-header.d.ts +1 -2
  208. package/dist/server/app-interception-context-header.js +0 -2
  209. package/dist/server/app-layout-param-observation.d.ts +15 -2
  210. package/dist/server/app-layout-param-observation.js +46 -8
  211. package/dist/server/app-middleware.d.ts +1 -2
  212. package/dist/server/app-middleware.js +0 -2
  213. package/dist/server/app-mounted-slots-header.d.ts +1 -2
  214. package/dist/server/app-mounted-slots-header.js +0 -2
  215. package/dist/server/app-optimistic-routing.d.ts +1 -2
  216. package/dist/server/app-optimistic-routing.js +0 -2
  217. package/dist/server/app-page-boundary-render.d.ts +4 -3
  218. package/dist/server/app-page-boundary-render.js +18 -9
  219. package/dist/server/app-page-boundary.d.ts +11 -2
  220. package/dist/server/app-page-boundary.js +13 -4
  221. package/dist/server/app-page-cache.d.ts +3 -3
  222. package/dist/server/app-page-cache.js +36 -11
  223. package/dist/server/app-page-dispatch.d.ts +19 -5
  224. package/dist/server/app-page-dispatch.js +119 -24
  225. package/dist/server/app-page-element-builder.d.ts +3 -2
  226. package/dist/server/app-page-element-builder.js +9 -11
  227. package/dist/server/app-page-execution.d.ts +8 -3
  228. package/dist/server/app-page-execution.js +55 -24
  229. package/dist/server/app-page-head.d.ts +1 -2
  230. package/dist/server/app-page-head.js +6 -6
  231. package/dist/server/app-page-method.d.ts +1 -2
  232. package/dist/server/app-page-method.js +0 -2
  233. package/dist/server/app-page-params.d.ts +1 -2
  234. package/dist/server/app-page-params.js +0 -2
  235. package/dist/server/app-page-probe.d.ts +79 -2
  236. package/dist/server/app-page-probe.js +89 -9
  237. package/dist/server/app-page-render-identity.d.ts +1 -2
  238. package/dist/server/app-page-render-identity.js +0 -2
  239. package/dist/server/app-page-render-observation.d.ts +1 -2
  240. package/dist/server/app-page-render-observation.js +0 -2
  241. package/dist/server/app-page-render.d.ts +9 -3
  242. package/dist/server/app-page-render.js +167 -10
  243. package/dist/server/app-page-request.d.ts +4 -3
  244. package/dist/server/app-page-request.js +1 -3
  245. package/dist/server/app-page-response.d.ts +2 -2
  246. package/dist/server/app-page-response.js +5 -3
  247. package/dist/server/app-page-route-wiring.d.ts +14 -3
  248. package/dist/server/app-page-route-wiring.js +63 -11
  249. package/dist/server/app-page-search-params-observation.d.ts +10 -0
  250. package/dist/server/app-page-search-params-observation.js +20 -0
  251. package/dist/server/app-page-segment-state.d.ts +1 -2
  252. package/dist/server/app-page-segment-state.js +1 -8
  253. package/dist/server/app-page-stream.d.ts +19 -9
  254. package/dist/server/app-page-stream.js +28 -10
  255. package/dist/server/app-pages-bridge.d.ts +25 -0
  256. package/dist/server/app-pages-bridge.js +34 -0
  257. package/dist/server/app-post-middleware-context.d.ts +1 -2
  258. package/dist/server/app-post-middleware-context.js +0 -2
  259. package/dist/server/app-ppr-fallback-shell.d.ts +21 -0
  260. package/dist/server/app-ppr-fallback-shell.js +82 -0
  261. package/dist/server/app-prerender-endpoints.d.ts +1 -2
  262. package/dist/server/app-prerender-endpoints.js +0 -2
  263. package/dist/server/app-prerender-static-params.d.ts +15 -2
  264. package/dist/server/app-prerender-static-params.js +44 -13
  265. package/dist/server/app-render-dependency.d.ts +3 -2
  266. package/dist/server/app-render-dependency.js +9 -3
  267. package/dist/server/app-request-context.d.ts +1 -2
  268. package/dist/server/app-request-context.js +0 -2
  269. package/dist/server/app-route-handler-cache.d.ts +1 -2
  270. package/dist/server/app-route-handler-cache.js +0 -2
  271. package/dist/server/app-route-handler-dispatch.d.ts +1 -2
  272. package/dist/server/app-route-handler-dispatch.js +0 -2
  273. package/dist/server/app-route-handler-execution.d.ts +1 -2
  274. package/dist/server/app-route-handler-execution.js +2 -4
  275. package/dist/server/app-route-handler-policy.d.ts +1 -2
  276. package/dist/server/app-route-handler-policy.js +0 -2
  277. package/dist/server/app-route-handler-response.d.ts +2 -3
  278. package/dist/server/app-route-handler-response.js +7 -6
  279. package/dist/server/app-route-handler-runtime.d.ts +1 -2
  280. package/dist/server/app-route-handler-runtime.js +0 -2
  281. package/dist/server/app-route-module-loader.d.ts +43 -0
  282. package/dist/server/app-route-module-loader.js +32 -0
  283. package/dist/server/app-router-entry.d.ts +1 -2
  284. package/dist/server/app-router-entry.js +2 -2
  285. package/dist/server/app-rsc-cache-busting.d.ts +10 -2
  286. package/dist/server/app-rsc-cache-busting.js +13 -4
  287. package/dist/server/app-rsc-embedded-chunks.d.ts +1 -2
  288. package/dist/server/app-rsc-embedded-chunks.js +0 -2
  289. package/dist/server/app-rsc-error-handler.d.ts +1 -2
  290. package/dist/server/app-rsc-error-handler.js +0 -2
  291. package/dist/server/app-rsc-errors.d.ts +1 -2
  292. package/dist/server/app-rsc-errors.js +0 -2
  293. package/dist/server/app-rsc-handler.d.ts +16 -2
  294. package/dist/server/app-rsc-handler.js +21 -13
  295. package/dist/server/app-rsc-render-mode.d.ts +1 -2
  296. package/dist/server/app-rsc-render-mode.js +0 -2
  297. package/dist/server/app-rsc-request-normalization.d.ts +4 -5
  298. package/dist/server/app-rsc-request-normalization.js +2 -4
  299. package/dist/server/app-rsc-response-finalizer.d.ts +1 -2
  300. package/dist/server/app-rsc-response-finalizer.js +2 -2
  301. package/dist/server/app-rsc-route-matching.d.ts +1 -2
  302. package/dist/server/app-rsc-route-matching.js +0 -2
  303. package/dist/server/app-segment-config.d.ts +4 -2
  304. package/dist/server/app-segment-config.js +8 -2
  305. package/dist/server/app-server-action-execution.d.ts +7 -2
  306. package/dist/server/app-server-action-execution.js +7 -8
  307. package/dist/server/app-ssr-entry.d.ts +5 -4
  308. package/dist/server/app-ssr-entry.js +31 -15
  309. package/dist/server/app-ssr-error-meta.d.ts +1 -2
  310. package/dist/server/app-ssr-error-meta.js +0 -2
  311. package/dist/server/app-ssr-stream.d.ts +1 -2
  312. package/dist/server/app-ssr-stream.js +31 -3
  313. package/dist/server/app-static-generation.d.ts +1 -2
  314. package/dist/server/app-static-generation.js +0 -2
  315. package/dist/server/app-visited-response-cache.d.ts +23 -0
  316. package/dist/server/app-visited-response-cache.js +19 -0
  317. package/dist/server/artifact-compatibility.d.ts +1 -2
  318. package/dist/server/artifact-compatibility.js +2 -6
  319. package/dist/server/cache-control.d.ts +15 -2
  320. package/dist/server/cache-control.js +21 -3
  321. package/dist/server/cache-headers.d.ts +1 -2
  322. package/dist/server/cache-headers.js +0 -2
  323. package/dist/server/cache-proof.d.ts +1 -2
  324. package/dist/server/cache-proof.js +0 -2
  325. package/dist/server/client-reuse-manifest.d.ts +3 -3
  326. package/dist/server/client-reuse-manifest.js +6 -10
  327. package/dist/server/client-trace-metadata.d.ts +1 -2
  328. package/dist/server/client-trace-metadata.js +0 -2
  329. package/dist/server/cookie-utils.d.ts +1 -2
  330. package/dist/server/cookie-utils.js +0 -2
  331. package/dist/server/csp.d.ts +1 -2
  332. package/dist/server/csp.js +0 -2
  333. package/dist/server/default-global-error-module.d.ts +1 -2
  334. package/dist/server/default-global-error-module.js +0 -2
  335. package/dist/server/default-not-found-module.d.ts +1 -2
  336. package/dist/server/default-not-found-module.js +0 -2
  337. package/dist/server/dev-error-overlay-store.d.ts +20 -4
  338. package/dist/server/dev-error-overlay-store.js +23 -4
  339. package/dist/server/dev-error-overlay.d.ts +39 -3
  340. package/dist/server/dev-error-overlay.js +952 -164
  341. package/dist/server/dev-initial-server-error.d.ts +9 -0
  342. package/dist/server/dev-initial-server-error.js +26 -0
  343. package/dist/server/dev-lockfile.d.ts +1 -2
  344. package/dist/server/dev-lockfile.js +0 -2
  345. package/dist/server/dev-module-runner.d.ts +1 -2
  346. package/dist/server/dev-module-runner.js +0 -2
  347. package/dist/server/dev-origin-check.d.ts +1 -2
  348. package/dist/server/dev-origin-check.js +0 -2
  349. package/dist/server/dev-route-files.d.ts +1 -2
  350. package/dist/server/dev-route-files.js +0 -2
  351. package/dist/server/dev-server.d.ts +2 -3
  352. package/dist/server/dev-server.js +75 -18
  353. package/dist/server/dev-stack-sourcemap-endpoint.d.ts +4 -0
  354. package/dist/server/dev-stack-sourcemap-endpoint.js +4 -0
  355. package/dist/server/dev-stack-sourcemap.d.ts +43 -0
  356. package/dist/server/dev-stack-sourcemap.js +443 -0
  357. package/dist/server/document-initial-head.d.ts +1 -2
  358. package/dist/server/document-initial-head.js +0 -2
  359. package/dist/server/edge-api-runtime.d.ts +1 -2
  360. package/dist/server/edge-api-runtime.js +0 -2
  361. package/dist/server/file-based-metadata.d.ts +1 -2
  362. package/dist/server/file-based-metadata.js +0 -2
  363. package/dist/server/headers.d.ts +3 -2
  364. package/dist/server/headers.js +3 -3
  365. package/dist/server/html.d.ts +1 -2
  366. package/dist/server/html.js +0 -2
  367. package/dist/server/http-error-responses.d.ts +1 -2
  368. package/dist/server/http-error-responses.js +0 -2
  369. package/dist/server/image-optimization.d.ts +1 -2
  370. package/dist/server/image-optimization.js +0 -2
  371. package/dist/server/implicit-tags.d.ts +1 -2
  372. package/dist/server/implicit-tags.js +0 -2
  373. package/dist/server/instrumentation-runtime.d.ts +1 -2
  374. package/dist/server/instrumentation-runtime.js +0 -2
  375. package/dist/server/instrumentation.d.ts +1 -2
  376. package/dist/server/instrumentation.js +0 -2
  377. package/dist/server/isr-cache.d.ts +10 -3
  378. package/dist/server/isr-cache.js +13 -28
  379. package/dist/server/metadata-route-build-data.d.ts +1 -2
  380. package/dist/server/metadata-route-build-data.js +0 -2
  381. package/dist/server/metadata-route-response.d.ts +1 -2
  382. package/dist/server/metadata-route-response.js +0 -2
  383. package/dist/server/metadata-routes.d.ts +1 -2
  384. package/dist/server/metadata-routes.js +0 -2
  385. package/dist/server/middleware-matcher.d.ts +1 -2
  386. package/dist/server/middleware-matcher.js +0 -2
  387. package/dist/server/middleware-request-headers.d.ts +1 -2
  388. package/dist/server/middleware-request-headers.js +0 -2
  389. package/dist/server/middleware-response-headers.d.ts +1 -2
  390. package/dist/server/middleware-response-headers.js +0 -2
  391. package/dist/server/middleware-runtime.d.ts +1 -2
  392. package/dist/server/middleware-runtime.js +14 -5
  393. package/dist/server/middleware.d.ts +2 -3
  394. package/dist/server/middleware.js +0 -2
  395. package/dist/server/navigation-planner.d.ts +16 -2
  396. package/dist/server/navigation-planner.js +1 -3
  397. package/dist/server/navigation-trace.d.ts +1 -2
  398. package/dist/server/navigation-trace.js +0 -2
  399. package/dist/server/next-error-digest.d.ts +1 -2
  400. package/dist/server/next-error-digest.js +0 -2
  401. package/dist/server/normalize-path.d.ts +1 -2
  402. package/dist/server/normalize-path.js +0 -2
  403. package/dist/server/pages-api-route.d.ts +1 -2
  404. package/dist/server/pages-api-route.js +1 -3
  405. package/dist/server/pages-asset-tags.d.ts +66 -0
  406. package/dist/server/pages-asset-tags.js +116 -0
  407. package/dist/server/pages-body-parser-config.d.ts +1 -2
  408. package/dist/server/pages-body-parser-config.js +0 -2
  409. package/dist/server/pages-data-route.d.ts +39 -2
  410. package/dist/server/pages-data-route.js +46 -3
  411. package/dist/server/pages-default-404.d.ts +1 -2
  412. package/dist/server/pages-default-404.js +0 -2
  413. package/dist/server/pages-document-initial-props.d.ts +1 -2
  414. package/dist/server/pages-document-initial-props.js +0 -2
  415. package/dist/server/pages-get-initial-props.d.ts +17 -0
  416. package/dist/server/pages-get-initial-props.js +50 -0
  417. package/dist/server/pages-i18n.d.ts +1 -2
  418. package/dist/server/pages-i18n.js +0 -2
  419. package/dist/server/pages-media-type.d.ts +1 -2
  420. package/dist/server/pages-media-type.js +1 -2
  421. package/dist/server/pages-node-compat.d.ts +9 -2
  422. package/dist/server/pages-node-compat.js +34 -3
  423. package/dist/server/pages-page-data.d.ts +7 -3
  424. package/dist/server/pages-page-data.js +75 -33
  425. package/dist/server/pages-page-handler.d.ts +90 -0
  426. package/dist/server/pages-page-handler.js +335 -0
  427. package/dist/server/pages-page-method.d.ts +1 -2
  428. package/dist/server/pages-page-method.js +0 -2
  429. package/dist/server/pages-page-response.d.ts +1 -2
  430. package/dist/server/pages-page-response.js +8 -4
  431. package/dist/server/pages-serializable-props.d.ts +1 -2
  432. package/dist/server/pages-serializable-props.js +0 -2
  433. package/dist/server/pregenerated-concrete-paths.d.ts +32 -0
  434. package/dist/server/pregenerated-concrete-paths.js +78 -0
  435. package/dist/server/prerender-route-params.d.ts +13 -3
  436. package/dist/server/prerender-route-params.js +30 -11
  437. package/dist/server/prerender-work-unit-setup.d.ts +1 -2
  438. package/dist/server/prerender-work-unit-setup.js +0 -2
  439. package/dist/server/prod-server.d.ts +2 -4
  440. package/dist/server/prod-server.js +0 -2
  441. package/dist/server/proxy-trust.d.ts +1 -2
  442. package/dist/server/proxy-trust.js +0 -2
  443. package/dist/server/request-log.d.ts +1 -2
  444. package/dist/server/request-log.js +0 -2
  445. package/dist/server/request-pipeline.d.ts +14 -2
  446. package/dist/server/request-pipeline.js +42 -3
  447. package/dist/server/rsc-stream-hints.d.ts +1 -2
  448. package/dist/server/rsc-stream-hints.js +0 -2
  449. package/dist/server/seed-cache.d.ts +6 -2
  450. package/dist/server/seed-cache.js +10 -8
  451. package/dist/server/server-action-not-found.d.ts +1 -2
  452. package/dist/server/server-action-not-found.js +0 -2
  453. package/dist/server/server-globals.d.ts +1 -2
  454. package/dist/server/server-globals.js +0 -2
  455. package/dist/server/skip-cache-proof.d.ts +1 -2
  456. package/dist/server/skip-cache-proof.js +0 -2
  457. package/dist/server/socket-error-backstop.d.ts +1 -2
  458. package/dist/server/socket-error-backstop.js +0 -2
  459. package/dist/server/static-file-cache.d.ts +1 -2
  460. package/dist/server/static-file-cache.js +0 -2
  461. package/dist/server/static-layout-client-reuse-proof.d.ts +1 -2
  462. package/dist/server/static-layout-client-reuse-proof.js +0 -2
  463. package/dist/server/streaming-metadata.d.ts +1 -2
  464. package/dist/server/streaming-metadata.js +0 -2
  465. package/dist/server/worker-utils.d.ts +1 -2
  466. package/dist/server/worker-utils.js +3 -6
  467. package/dist/shims/amp.d.ts +1 -2
  468. package/dist/shims/amp.js +0 -2
  469. package/dist/shims/app-router-scroll-state.d.ts +1 -2
  470. package/dist/shims/app-router-scroll-state.js +0 -2
  471. package/dist/shims/app-router-scroll.d.ts +3 -5
  472. package/dist/shims/app-router-scroll.js +0 -2
  473. package/dist/shims/app.d.ts +1 -2
  474. package/dist/shims/app.js +0 -2
  475. package/dist/shims/before-interactive-context.d.ts +1 -2
  476. package/dist/shims/before-interactive-context.js +0 -2
  477. package/dist/shims/cache-for-request.d.ts +1 -2
  478. package/dist/shims/cache-for-request.js +0 -2
  479. package/dist/shims/cache-runtime.d.ts +20 -5
  480. package/dist/shims/cache-runtime.js +35 -30
  481. package/dist/shims/cache.d.ts +48 -7
  482. package/dist/shims/cache.js +79 -20
  483. package/dist/shims/cdn-cache.d.ts +125 -0
  484. package/dist/shims/cdn-cache.js +100 -0
  485. package/dist/shims/client-hook-error.d.ts +1 -2
  486. package/dist/shims/client-hook-error.js +0 -2
  487. package/dist/shims/client-locale.d.ts +1 -2
  488. package/dist/shims/client-locale.js +1 -3
  489. package/dist/shims/compat-router.d.ts +1 -2
  490. package/dist/shims/compat-router.js +0 -2
  491. package/dist/shims/config.d.ts +1 -2
  492. package/dist/shims/config.js +0 -2
  493. package/dist/shims/constants.d.ts +1 -2
  494. package/dist/shims/constants.js +0 -2
  495. package/dist/shims/default-global-error.d.ts +3 -4
  496. package/dist/shims/default-global-error.js +0 -2
  497. package/dist/shims/default-not-found.d.ts +1 -2
  498. package/dist/shims/default-not-found.js +0 -2
  499. package/dist/shims/document.d.ts +5 -7
  500. package/dist/shims/document.js +0 -2
  501. package/dist/shims/dynamic.d.ts +1 -2
  502. package/dist/shims/dynamic.js +0 -2
  503. package/dist/shims/error-boundary.d.ts +16 -12
  504. package/dist/shims/error-boundary.js +35 -2
  505. package/dist/shims/error.d.ts +1 -2
  506. package/dist/shims/error.js +0 -2
  507. package/dist/shims/fetch-cache.d.ts +1 -2
  508. package/dist/shims/fetch-cache.js +2 -4
  509. package/dist/shims/font-google-base.d.ts +1 -2
  510. package/dist/shims/font-google-base.js +1 -13
  511. package/dist/shims/font-local.d.ts +1 -2
  512. package/dist/shims/font-local.js +1 -15
  513. package/dist/shims/font-utils.d.ts +7 -2
  514. package/dist/shims/font-utils.js +13 -3
  515. package/dist/shims/form.d.ts +12 -5
  516. package/dist/shims/form.js +98 -21
  517. package/dist/shims/hash-scroll.d.ts +1 -2
  518. package/dist/shims/hash-scroll.js +0 -2
  519. package/dist/shims/head-state.d.ts +1 -2
  520. package/dist/shims/head-state.js +0 -2
  521. package/dist/shims/head.d.ts +1 -2
  522. package/dist/shims/head.js +0 -2
  523. package/dist/shims/headers.d.ts +9 -2
  524. package/dist/shims/headers.js +13 -3
  525. package/dist/shims/i18n-context.d.ts +1 -2
  526. package/dist/shims/i18n-context.js +0 -2
  527. package/dist/shims/i18n-state.d.ts +1 -2
  528. package/dist/shims/i18n-state.js +0 -2
  529. package/dist/shims/image-config.d.ts +1 -2
  530. package/dist/shims/image-config.js +0 -2
  531. package/dist/shims/image.d.ts +1 -2
  532. package/dist/shims/image.js +1 -3
  533. package/dist/shims/internal/als-registry.d.ts +1 -2
  534. package/dist/shims/internal/als-registry.js +0 -2
  535. package/dist/shims/internal/api-utils.d.ts +1 -2
  536. package/dist/shims/internal/app-route-detection.d.ts +1 -2
  537. package/dist/shims/internal/app-route-detection.js +0 -2
  538. package/dist/shims/internal/app-router-context.d.ts +1 -2
  539. package/dist/shims/internal/app-router-context.js +0 -2
  540. package/dist/shims/internal/cookie-serialize.d.ts +1 -2
  541. package/dist/shims/internal/cookie-serialize.js +0 -2
  542. package/dist/shims/internal/make-hanging-promise.d.ts +1 -2
  543. package/dist/shims/internal/make-hanging-promise.js +0 -2
  544. package/dist/shims/internal/pages-data-fetch-dedup.d.ts +1 -2
  545. package/dist/shims/internal/pages-data-fetch-dedup.js +0 -2
  546. package/dist/shims/internal/pages-data-target.d.ts +1 -2
  547. package/dist/shims/internal/pages-data-target.js +0 -2
  548. package/dist/shims/internal/pages-data-url.d.ts +1 -2
  549. package/dist/shims/internal/pages-data-url.js +0 -2
  550. package/dist/shims/internal/parse-cookie-header.d.ts +1 -2
  551. package/dist/shims/internal/parse-cookie-header.js +0 -2
  552. package/dist/shims/internal/router-context.d.ts +2 -4
  553. package/dist/shims/internal/router-context.js +0 -2
  554. package/dist/shims/internal/utils.d.ts +1 -2
  555. package/dist/shims/internal/utils.js +0 -2
  556. package/dist/shims/internal/work-unit-async-storage.d.ts +1 -2
  557. package/dist/shims/internal/work-unit-async-storage.js +0 -2
  558. package/dist/shims/layout-segment-context.d.ts +2 -4
  559. package/dist/shims/layout-segment-context.js +0 -2
  560. package/dist/shims/legacy-image.d.ts +1 -2
  561. package/dist/shims/legacy-image.js +0 -2
  562. package/dist/shims/link-prefetch.d.ts +1 -2
  563. package/dist/shims/link-prefetch.js +0 -2
  564. package/dist/shims/link.d.ts +2 -2
  565. package/dist/shims/link.js +20 -14
  566. package/dist/shims/metadata.d.ts +4 -5
  567. package/dist/shims/metadata.js +1 -3
  568. package/dist/shims/navigation-state.d.ts +1 -2
  569. package/dist/shims/navigation-state.js +0 -2
  570. package/dist/shims/navigation.d.ts +23 -7
  571. package/dist/shims/navigation.js +188 -39
  572. package/dist/shims/navigation.react-server.d.ts +1 -2
  573. package/dist/shims/navigation.react-server.js +0 -2
  574. package/dist/shims/offline.d.ts +1 -2
  575. package/dist/shims/offline.js +0 -2
  576. package/dist/shims/og.d.ts +1 -2
  577. package/dist/shims/og.js +2 -4
  578. package/dist/shims/pages-router-runtime.d.ts +7 -2
  579. package/dist/shims/pages-router-runtime.js +11 -3
  580. package/dist/shims/ppr-fallback-shell.d.ts +29 -0
  581. package/dist/shims/ppr-fallback-shell.js +149 -0
  582. package/dist/shims/readonly-url-search-params.d.ts +1 -2
  583. package/dist/shims/readonly-url-search-params.js +0 -2
  584. package/dist/shims/request-context.d.ts +9 -5
  585. package/dist/shims/request-context.js +0 -2
  586. package/dist/shims/request-state-types.d.ts +1 -1
  587. package/dist/shims/root-params.d.ts +1 -2
  588. package/dist/shims/root-params.js +0 -2
  589. package/dist/shims/router-state.d.ts +1 -2
  590. package/dist/shims/router-state.js +0 -2
  591. package/dist/shims/router.d.ts +1 -2
  592. package/dist/shims/router.js +135 -20
  593. package/dist/shims/script-nonce-context.d.ts +1 -2
  594. package/dist/shims/script-nonce-context.js +0 -2
  595. package/dist/shims/script.d.ts +1 -2
  596. package/dist/shims/script.js +0 -2
  597. package/dist/shims/server.d.ts +1 -2
  598. package/dist/shims/server.js +0 -2
  599. package/dist/shims/slot.d.ts +11 -4
  600. package/dist/shims/slot.js +121 -9
  601. package/dist/shims/thenable-params.d.ts +2 -2
  602. package/dist/shims/thenable-params.js +107 -12
  603. package/dist/shims/unified-request-context.d.ts +1 -2
  604. package/dist/shims/unified-request-context.js +0 -2
  605. package/dist/shims/unrecognized-action-error.d.ts +1 -2
  606. package/dist/shims/unrecognized-action-error.js +0 -2
  607. package/dist/shims/url-safety.d.ts +1 -2
  608. package/dist/shims/url-safety.js +0 -2
  609. package/dist/shims/url-utils.d.ts +1 -2
  610. package/dist/shims/url-utils.js +0 -2
  611. package/dist/shims/use-merged-ref.d.ts +1 -2
  612. package/dist/shims/use-merged-ref.js +0 -2
  613. package/dist/shims/web-vitals.d.ts +1 -2
  614. package/dist/shims/web-vitals.js +0 -2
  615. package/dist/typegen.d.ts +1 -2
  616. package/dist/typegen.js +2 -9
  617. package/dist/utils/asset-prefix.d.ts +1 -2
  618. package/dist/utils/asset-prefix.js +0 -2
  619. package/dist/utils/base-path.d.ts +1 -2
  620. package/dist/utils/base-path.js +0 -2
  621. package/dist/utils/cache-control-metadata.d.ts +1 -4
  622. package/dist/utils/cache-control-metadata.js +1 -3
  623. package/dist/utils/client-build-manifest.d.ts +1 -2
  624. package/dist/utils/client-build-manifest.js +0 -2
  625. package/dist/utils/compare.d.ts +4 -0
  626. package/dist/utils/compare.js +8 -0
  627. package/dist/utils/dev-error-recovery-event.d.ts +4 -0
  628. package/dist/utils/dev-error-recovery-event.js +4 -0
  629. package/dist/utils/domain-locale.d.ts +1 -2
  630. package/dist/utils/domain-locale.js +2 -4
  631. package/dist/utils/encode-cache-tag.d.ts +1 -2
  632. package/dist/utils/encode-cache-tag.js +0 -2
  633. package/dist/utils/error-cause.d.ts +1 -2
  634. package/dist/utils/error-cause.js +0 -2
  635. package/dist/utils/hash.d.ts +1 -2
  636. package/dist/utils/hash.js +0 -2
  637. package/dist/utils/html-limited-bots.d.ts +1 -2
  638. package/dist/utils/html-limited-bots.js +0 -2
  639. package/dist/utils/lazy-chunks.d.ts +1 -2
  640. package/dist/utils/lazy-chunks.js +0 -2
  641. package/dist/utils/manifest-paths.d.ts +8 -3
  642. package/dist/utils/manifest-paths.js +15 -3
  643. package/dist/utils/mdx-scan.d.ts +1 -2
  644. package/dist/utils/mdx-scan.js +0 -2
  645. package/dist/utils/navigation-signal.d.ts +1 -2
  646. package/dist/utils/navigation-signal.js +0 -2
  647. package/dist/utils/number.d.ts +4 -0
  648. package/dist/utils/number.js +6 -0
  649. package/dist/utils/path.d.ts +4 -2
  650. package/dist/utils/path.js +5 -3
  651. package/dist/utils/prerender-output-paths.d.ts +1 -2
  652. package/dist/utils/prerender-output-paths.js +0 -2
  653. package/dist/utils/project.d.ts +1 -2
  654. package/dist/utils/project.js +0 -2
  655. package/dist/utils/promise.d.ts +4 -0
  656. package/dist/utils/promise.js +6 -0
  657. package/dist/utils/public-routes.d.ts +1 -2
  658. package/dist/utils/public-routes.js +0 -2
  659. package/dist/utils/query.d.ts +1 -2
  660. package/dist/utils/query.js +0 -2
  661. package/dist/utils/record.d.ts +1 -2
  662. package/dist/utils/record.js +0 -2
  663. package/dist/utils/regex.d.ts +4 -0
  664. package/dist/utils/regex.js +6 -0
  665. package/dist/utils/safe-json-file.d.ts +1 -2
  666. package/dist/utils/safe-json-file.js +0 -2
  667. package/dist/utils/sorted-array.d.ts +1 -2
  668. package/dist/utils/sorted-array.js +0 -2
  669. package/dist/utils/text-stream.d.ts +1 -2
  670. package/dist/utils/text-stream.js +0 -2
  671. package/dist/utils/vinext-root.d.ts +1 -2
  672. package/dist/utils/vinext-root.js +0 -2
  673. package/dist/utils/vite-version.d.ts +1 -2
  674. package/dist/utils/vite-version.js +0 -2
  675. package/package.json +19 -6
  676. package/dist/build/clean-output.js.map +0 -1
  677. package/dist/build/client-build-config.js.map +0 -1
  678. package/dist/build/google-fonts/build-url.js.map +0 -1
  679. package/dist/build/google-fonts/fallback-metrics-data.js.map +0 -1
  680. package/dist/build/google-fonts/fallback-metrics.js.map +0 -1
  681. package/dist/build/google-fonts/font-data.js.map +0 -1
  682. package/dist/build/google-fonts/font-metadata.js.map +0 -1
  683. package/dist/build/google-fonts/get-axes.js.map +0 -1
  684. package/dist/build/google-fonts/sort-variants.js.map +0 -1
  685. package/dist/build/google-fonts/validate.js.map +0 -1
  686. package/dist/build/inline-css.js.map +0 -1
  687. package/dist/build/layout-classification.js.map +0 -1
  688. package/dist/build/nitro-route-rules.js.map +0 -1
  689. package/dist/build/precompress.js.map +0 -1
  690. package/dist/build/prerender.js.map +0 -1
  691. package/dist/build/report.js.map +0 -1
  692. package/dist/build/route-classification-injector.js.map +0 -1
  693. package/dist/build/route-classification-manifest.js.map +0 -1
  694. package/dist/build/run-prerender.js.map +0 -1
  695. package/dist/build/server-manifest.js.map +0 -1
  696. package/dist/build/ssr-manifest.js.map +0 -1
  697. package/dist/build/standalone.js.map +0 -1
  698. package/dist/build/static-export.js.map +0 -1
  699. package/dist/check.js.map +0 -1
  700. package/dist/cli-args.js.map +0 -1
  701. package/dist/cli.js.map +0 -1
  702. package/dist/client/instrumentation-client-inject.js.map +0 -1
  703. package/dist/client/instrumentation-client-state.js.map +0 -1
  704. package/dist/client/instrumentation-client.js.map +0 -1
  705. package/dist/client/navigation-runtime.js.map +0 -1
  706. package/dist/client/pages-router-link-navigation.js.map +0 -1
  707. package/dist/client/validate-module-path.js.map +0 -1
  708. package/dist/client/vinext-next-data.js.map +0 -1
  709. package/dist/client/window-next.js.map +0 -1
  710. package/dist/cloudflare/kv-cache-handler.js.map +0 -1
  711. package/dist/cloudflare/tpr.js.map +0 -1
  712. package/dist/config/config-matchers.js.map +0 -1
  713. package/dist/config/dotenv.js.map +0 -1
  714. package/dist/config/next-config.js.map +0 -1
  715. package/dist/config/tsconfig-paths.js.map +0 -1
  716. package/dist/deploy.js.map +0 -1
  717. package/dist/entries/app-browser-entry.js.map +0 -1
  718. package/dist/entries/app-rsc-entry.js.map +0 -1
  719. package/dist/entries/app-rsc-manifest.js.map +0 -1
  720. package/dist/entries/app-ssr-entry.js.map +0 -1
  721. package/dist/entries/pages-client-entry.js.map +0 -1
  722. package/dist/entries/pages-entry-helpers.js.map +0 -1
  723. package/dist/entries/pages-server-entry.js.map +0 -1
  724. package/dist/entries/runtime-entry-module.js.map +0 -1
  725. package/dist/index.js.map +0 -1
  726. package/dist/init.js.map +0 -1
  727. package/dist/plugins/async-hooks-stub.js.map +0 -1
  728. package/dist/plugins/client-reference-dedup.js.map +0 -1
  729. package/dist/plugins/css-data-url.js.map +0 -1
  730. package/dist/plugins/fonts.js.map +0 -1
  731. package/dist/plugins/import-meta-url.js.map +0 -1
  732. package/dist/plugins/instrumentation-client.js.map +0 -1
  733. package/dist/plugins/middleware-server-only.js.map +0 -1
  734. package/dist/plugins/og-assets.js.map +0 -1
  735. package/dist/plugins/optimize-imports.js.map +0 -1
  736. package/dist/plugins/postcss.js.map +0 -1
  737. package/dist/plugins/remove-console.js.map +0 -1
  738. package/dist/plugins/rsc-client-reference-loaders.js.map +0 -1
  739. package/dist/plugins/rsc-client-shim-excludes.js.map +0 -1
  740. package/dist/plugins/sass.js.map +0 -1
  741. package/dist/plugins/server-externals-manifest.js.map +0 -1
  742. package/dist/plugins/strip-server-exports.js.map +0 -1
  743. package/dist/routing/app-route-graph.js.map +0 -1
  744. package/dist/routing/app-router.js.map +0 -1
  745. package/dist/routing/file-matcher.js.map +0 -1
  746. package/dist/routing/pages-router.js.map +0 -1
  747. package/dist/routing/route-matching.js.map +0 -1
  748. package/dist/routing/route-pattern.js.map +0 -1
  749. package/dist/routing/route-trie.js.map +0 -1
  750. package/dist/routing/route-validation.js.map +0 -1
  751. package/dist/routing/utils.js.map +0 -1
  752. package/dist/server/api-handler.js.map +0 -1
  753. package/dist/server/app-browser-action-result.js.map +0 -1
  754. package/dist/server/app-browser-entry.js.map +0 -1
  755. package/dist/server/app-browser-error.js.map +0 -1
  756. package/dist/server/app-browser-hydration.js.map +0 -1
  757. package/dist/server/app-browser-interception-context.js.map +0 -1
  758. package/dist/server/app-browser-mpa-navigation.js.map +0 -1
  759. package/dist/server/app-browser-navigation-controller.js.map +0 -1
  760. package/dist/server/app-browser-popstate.js.map +0 -1
  761. package/dist/server/app-browser-rsc-redirect.js.map +0 -1
  762. package/dist/server/app-browser-state.js.map +0 -1
  763. package/dist/server/app-browser-stream.js.map +0 -1
  764. package/dist/server/app-browser-visible-commit.js.map +0 -1
  765. package/dist/server/app-client-reference-preloader.js.map +0 -1
  766. package/dist/server/app-elements-wire.js.map +0 -1
  767. package/dist/server/app-elements.js.map +0 -1
  768. package/dist/server/app-fallback-renderer.js.map +0 -1
  769. package/dist/server/app-history-state.js.map +0 -1
  770. package/dist/server/app-hook-warning-suppression.js.map +0 -1
  771. package/dist/server/app-inline-css-client.js.map +0 -1
  772. package/dist/server/app-interception-context-header.js.map +0 -1
  773. package/dist/server/app-layout-param-observation.js.map +0 -1
  774. package/dist/server/app-middleware.js.map +0 -1
  775. package/dist/server/app-mounted-slots-header.js.map +0 -1
  776. package/dist/server/app-optimistic-routing.js.map +0 -1
  777. package/dist/server/app-page-boundary-render.js.map +0 -1
  778. package/dist/server/app-page-boundary.js.map +0 -1
  779. package/dist/server/app-page-cache.js.map +0 -1
  780. package/dist/server/app-page-dispatch.js.map +0 -1
  781. package/dist/server/app-page-element-builder.js.map +0 -1
  782. package/dist/server/app-page-execution.js.map +0 -1
  783. package/dist/server/app-page-head.js.map +0 -1
  784. package/dist/server/app-page-method.js.map +0 -1
  785. package/dist/server/app-page-params.js.map +0 -1
  786. package/dist/server/app-page-probe.js.map +0 -1
  787. package/dist/server/app-page-render-identity.js.map +0 -1
  788. package/dist/server/app-page-render-observation.js.map +0 -1
  789. package/dist/server/app-page-render.js.map +0 -1
  790. package/dist/server/app-page-request.js.map +0 -1
  791. package/dist/server/app-page-response.js.map +0 -1
  792. package/dist/server/app-page-route-wiring.js.map +0 -1
  793. package/dist/server/app-page-segment-state.js.map +0 -1
  794. package/dist/server/app-page-stream.js.map +0 -1
  795. package/dist/server/app-post-middleware-context.js.map +0 -1
  796. package/dist/server/app-prerender-endpoints.js.map +0 -1
  797. package/dist/server/app-prerender-static-params.js.map +0 -1
  798. package/dist/server/app-render-dependency.js.map +0 -1
  799. package/dist/server/app-request-context.js.map +0 -1
  800. package/dist/server/app-route-handler-cache.js.map +0 -1
  801. package/dist/server/app-route-handler-dispatch.js.map +0 -1
  802. package/dist/server/app-route-handler-execution.js.map +0 -1
  803. package/dist/server/app-route-handler-policy.js.map +0 -1
  804. package/dist/server/app-route-handler-response.js.map +0 -1
  805. package/dist/server/app-route-handler-runtime.js.map +0 -1
  806. package/dist/server/app-router-entry.js.map +0 -1
  807. package/dist/server/app-rsc-cache-busting.js.map +0 -1
  808. package/dist/server/app-rsc-embedded-chunks.js.map +0 -1
  809. package/dist/server/app-rsc-error-handler.js.map +0 -1
  810. package/dist/server/app-rsc-errors.js.map +0 -1
  811. package/dist/server/app-rsc-handler.js.map +0 -1
  812. package/dist/server/app-rsc-render-mode.js.map +0 -1
  813. package/dist/server/app-rsc-request-normalization.js.map +0 -1
  814. package/dist/server/app-rsc-response-finalizer.js.map +0 -1
  815. package/dist/server/app-rsc-route-matching.js.map +0 -1
  816. package/dist/server/app-segment-config.js.map +0 -1
  817. package/dist/server/app-server-action-execution.js.map +0 -1
  818. package/dist/server/app-ssr-entry.js.map +0 -1
  819. package/dist/server/app-ssr-error-meta.js.map +0 -1
  820. package/dist/server/app-ssr-stream.js.map +0 -1
  821. package/dist/server/app-static-generation.js.map +0 -1
  822. package/dist/server/artifact-compatibility.js.map +0 -1
  823. package/dist/server/cache-control.js.map +0 -1
  824. package/dist/server/cache-headers.js.map +0 -1
  825. package/dist/server/cache-proof.js.map +0 -1
  826. package/dist/server/client-reuse-manifest.js.map +0 -1
  827. package/dist/server/client-trace-metadata.js.map +0 -1
  828. package/dist/server/cookie-utils.js.map +0 -1
  829. package/dist/server/csp.js.map +0 -1
  830. package/dist/server/default-global-error-module.js.map +0 -1
  831. package/dist/server/default-not-found-module.js.map +0 -1
  832. package/dist/server/dev-error-overlay-store.js.map +0 -1
  833. package/dist/server/dev-error-overlay.js.map +0 -1
  834. package/dist/server/dev-lockfile.js.map +0 -1
  835. package/dist/server/dev-module-runner.js.map +0 -1
  836. package/dist/server/dev-origin-check.js.map +0 -1
  837. package/dist/server/dev-route-files.js.map +0 -1
  838. package/dist/server/dev-server.js.map +0 -1
  839. package/dist/server/document-initial-head.js.map +0 -1
  840. package/dist/server/edge-api-runtime.js.map +0 -1
  841. package/dist/server/file-based-metadata.js.map +0 -1
  842. package/dist/server/headers.js.map +0 -1
  843. package/dist/server/html.js.map +0 -1
  844. package/dist/server/http-error-responses.js.map +0 -1
  845. package/dist/server/image-optimization.js.map +0 -1
  846. package/dist/server/implicit-tags.js.map +0 -1
  847. package/dist/server/instrumentation-runtime.js.map +0 -1
  848. package/dist/server/instrumentation.js.map +0 -1
  849. package/dist/server/isr-cache.js.map +0 -1
  850. package/dist/server/metadata-route-build-data.js.map +0 -1
  851. package/dist/server/metadata-route-response.js.map +0 -1
  852. package/dist/server/metadata-routes.js.map +0 -1
  853. package/dist/server/middleware-matcher.js.map +0 -1
  854. package/dist/server/middleware-request-headers.js.map +0 -1
  855. package/dist/server/middleware-response-headers.js.map +0 -1
  856. package/dist/server/middleware-runtime.js.map +0 -1
  857. package/dist/server/middleware.js.map +0 -1
  858. package/dist/server/navigation-planner.js.map +0 -1
  859. package/dist/server/navigation-trace.js.map +0 -1
  860. package/dist/server/next-error-digest.js.map +0 -1
  861. package/dist/server/normalize-path.js.map +0 -1
  862. package/dist/server/pages-api-route.js.map +0 -1
  863. package/dist/server/pages-body-parser-config.js.map +0 -1
  864. package/dist/server/pages-data-route.js.map +0 -1
  865. package/dist/server/pages-default-404.js.map +0 -1
  866. package/dist/server/pages-document-initial-props.js.map +0 -1
  867. package/dist/server/pages-i18n.js.map +0 -1
  868. package/dist/server/pages-media-type.js.map +0 -1
  869. package/dist/server/pages-node-compat.js.map +0 -1
  870. package/dist/server/pages-page-data.js.map +0 -1
  871. package/dist/server/pages-page-method.js.map +0 -1
  872. package/dist/server/pages-page-response.js.map +0 -1
  873. package/dist/server/pages-serializable-props.js.map +0 -1
  874. package/dist/server/prerender-route-params.js.map +0 -1
  875. package/dist/server/prerender-work-unit-setup.js.map +0 -1
  876. package/dist/server/prod-server.js.map +0 -1
  877. package/dist/server/proxy-trust.js.map +0 -1
  878. package/dist/server/request-log.js.map +0 -1
  879. package/dist/server/request-pipeline.js.map +0 -1
  880. package/dist/server/rsc-stream-hints.js.map +0 -1
  881. package/dist/server/seed-cache.js.map +0 -1
  882. package/dist/server/server-action-not-found.js.map +0 -1
  883. package/dist/server/server-globals.js.map +0 -1
  884. package/dist/server/skip-cache-proof.js.map +0 -1
  885. package/dist/server/socket-error-backstop.js.map +0 -1
  886. package/dist/server/static-file-cache.js.map +0 -1
  887. package/dist/server/static-layout-client-reuse-proof.js.map +0 -1
  888. package/dist/server/streaming-metadata.js.map +0 -1
  889. package/dist/server/worker-utils.js.map +0 -1
  890. package/dist/shims/amp.js.map +0 -1
  891. package/dist/shims/app-router-scroll-state.js.map +0 -1
  892. package/dist/shims/app-router-scroll.js.map +0 -1
  893. package/dist/shims/app.js.map +0 -1
  894. package/dist/shims/before-interactive-context.js.map +0 -1
  895. package/dist/shims/cache-for-request.js.map +0 -1
  896. package/dist/shims/cache-runtime.js.map +0 -1
  897. package/dist/shims/cache.js.map +0 -1
  898. package/dist/shims/client-hook-error.js.map +0 -1
  899. package/dist/shims/client-locale.js.map +0 -1
  900. package/dist/shims/compat-router.js.map +0 -1
  901. package/dist/shims/config.js.map +0 -1
  902. package/dist/shims/constants.js.map +0 -1
  903. package/dist/shims/default-global-error.js.map +0 -1
  904. package/dist/shims/default-not-found.js.map +0 -1
  905. package/dist/shims/document.js.map +0 -1
  906. package/dist/shims/dynamic.js.map +0 -1
  907. package/dist/shims/error-boundary.js.map +0 -1
  908. package/dist/shims/error.js.map +0 -1
  909. package/dist/shims/fetch-cache.js.map +0 -1
  910. package/dist/shims/font-google-base.js.map +0 -1
  911. package/dist/shims/font-local.js.map +0 -1
  912. package/dist/shims/font-utils.js.map +0 -1
  913. package/dist/shims/form.js.map +0 -1
  914. package/dist/shims/hash-scroll.js.map +0 -1
  915. package/dist/shims/head-state.js.map +0 -1
  916. package/dist/shims/head.js.map +0 -1
  917. package/dist/shims/headers.js.map +0 -1
  918. package/dist/shims/i18n-context.js.map +0 -1
  919. package/dist/shims/i18n-state.js.map +0 -1
  920. package/dist/shims/image-config.js.map +0 -1
  921. package/dist/shims/image.js.map +0 -1
  922. package/dist/shims/internal/als-registry.js.map +0 -1
  923. package/dist/shims/internal/app-route-detection.js.map +0 -1
  924. package/dist/shims/internal/app-router-context.js.map +0 -1
  925. package/dist/shims/internal/cookie-serialize.js.map +0 -1
  926. package/dist/shims/internal/make-hanging-promise.js.map +0 -1
  927. package/dist/shims/internal/pages-data-fetch-dedup.js.map +0 -1
  928. package/dist/shims/internal/pages-data-target.js.map +0 -1
  929. package/dist/shims/internal/pages-data-url.js.map +0 -1
  930. package/dist/shims/internal/parse-cookie-header.js.map +0 -1
  931. package/dist/shims/internal/router-context.js.map +0 -1
  932. package/dist/shims/internal/utils.js.map +0 -1
  933. package/dist/shims/internal/work-unit-async-storage.js.map +0 -1
  934. package/dist/shims/layout-segment-context.js.map +0 -1
  935. package/dist/shims/legacy-image.js.map +0 -1
  936. package/dist/shims/link-prefetch.js.map +0 -1
  937. package/dist/shims/link.js.map +0 -1
  938. package/dist/shims/metadata.js.map +0 -1
  939. package/dist/shims/navigation-state.js.map +0 -1
  940. package/dist/shims/navigation.js.map +0 -1
  941. package/dist/shims/navigation.react-server.js.map +0 -1
  942. package/dist/shims/offline.js.map +0 -1
  943. package/dist/shims/og.js.map +0 -1
  944. package/dist/shims/pages-router-runtime.js.map +0 -1
  945. package/dist/shims/readonly-url-search-params.js.map +0 -1
  946. package/dist/shims/request-context.js.map +0 -1
  947. package/dist/shims/root-params.js.map +0 -1
  948. package/dist/shims/router-state.js.map +0 -1
  949. package/dist/shims/router.js.map +0 -1
  950. package/dist/shims/script-nonce-context.js.map +0 -1
  951. package/dist/shims/script.js.map +0 -1
  952. package/dist/shims/server.js.map +0 -1
  953. package/dist/shims/slot.js.map +0 -1
  954. package/dist/shims/thenable-params.js.map +0 -1
  955. package/dist/shims/unified-request-context.js.map +0 -1
  956. package/dist/shims/unrecognized-action-error.js.map +0 -1
  957. package/dist/shims/url-safety.js.map +0 -1
  958. package/dist/shims/url-utils.js.map +0 -1
  959. package/dist/shims/use-merged-ref.js.map +0 -1
  960. package/dist/shims/web-vitals.js.map +0 -1
  961. package/dist/typegen.js.map +0 -1
  962. package/dist/utils/asset-prefix.js.map +0 -1
  963. package/dist/utils/base-path.js.map +0 -1
  964. package/dist/utils/cache-control-metadata.js.map +0 -1
  965. package/dist/utils/client-build-manifest.js.map +0 -1
  966. package/dist/utils/domain-locale.js.map +0 -1
  967. package/dist/utils/encode-cache-tag.js.map +0 -1
  968. package/dist/utils/error-cause.js.map +0 -1
  969. package/dist/utils/hash.js.map +0 -1
  970. package/dist/utils/html-limited-bots.js.map +0 -1
  971. package/dist/utils/lazy-chunks.js.map +0 -1
  972. package/dist/utils/manifest-paths.js.map +0 -1
  973. package/dist/utils/mdx-scan.js.map +0 -1
  974. package/dist/utils/navigation-signal.js.map +0 -1
  975. package/dist/utils/path.js.map +0 -1
  976. package/dist/utils/prerender-output-paths.js.map +0 -1
  977. package/dist/utils/project.js.map +0 -1
  978. package/dist/utils/public-routes.js.map +0 -1
  979. package/dist/utils/query.js.map +0 -1
  980. package/dist/utils/record.js.map +0 -1
  981. package/dist/utils/safe-json-file.js.map +0 -1
  982. package/dist/utils/sorted-array.js.map +0 -1
  983. package/dist/utils/text-stream.js.map +0 -1
  984. package/dist/utils/vinext-root.js.map +0 -1
  985. package/dist/utils/vite-version.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-handler.js","names":["decodeQueryString"],"sources":["../../src/server/api-handler.ts"],"sourcesContent":["/**\n * API route handler for Pages Router (pages/api/*).\n *\n * Next.js API routes export a default handler function:\n * export default function handler(req, res) { ... }\n *\n * The req/res objects are Node.js IncomingMessage/ServerResponse with\n * Next.js extensions: req.query, req.body, res.json(), res.status(), etc.\n */\nimport \"./server-globals.js\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { decode as decodeQueryString } from \"node:querystring\";\nimport { Buffer } from \"node:buffer\";\nimport { type Route, matchRoute } from \"../routing/pages-router.js\";\nimport { reportRequestError, importModule, type ModuleImporter } from \"./instrumentation.js\";\nimport { mergeRouteParamsIntoQuery, parseQueryString } from \"../utils/query.js\";\nimport { PagesBodyParseError, getMediaType, isJsonMediaType } from \"./pages-media-type.js\";\nimport { isEdgeApiRuntime } from \"./edge-api-runtime.js\";\nimport {\n DEFAULT_PAGES_API_BODY_SIZE_LIMIT,\n resolveBodyParserConfig,\n} from \"./pages-body-parser-config.js\";\nimport { resolveRequestProtocol, resolveRequestHost } from \"./proxy-trust.js\";\nimport { NextRequest } from \"vinext/shims/server\";\n\n/**\n * Extend the Node.js request with Next.js-style helpers.\n */\ntype NextApiRequest = {\n query: Record<string, string | string[]>;\n body: unknown;\n cookies: Record<string, string>;\n} & IncomingMessage;\n\n/**\n * Extend the Node.js response with Next.js-style helpers.\n */\ntype NextApiResponse = {\n status(code: number): NextApiResponse;\n json(data: unknown): void;\n send(data: unknown): void;\n redirect(statusOrUrl: number | string, url?: string): void;\n} & ServerResponse;\n\ntype EdgeApiRouteModule = {\n /**\n * `export const config = { runtime: 'edge' }` — historical Pages Router form.\n */\n config?: {\n runtime?: string;\n };\n /**\n * `export const runtime = 'edge'` — bare export form. Next.js resolves the\n * effective runtime as `config.runtime ?? config.config?.runtime`, so a\n * top-level `runtime` export takes precedence over the nested config form.\n */\n runtime?: string;\n default: (request: Request) => Response | Promise<Response>;\n};\n\n/**\n * Default request body size (1 MB). Matches Next.js default bodyParser sizeLimit.\n * @see https://nextjs.org/docs/pages/building-your-application/routing/api-routes#custom-config\n * Prevents denial-of-service via unbounded request body buffering.\n */\nconst MAX_BODY_SIZE = DEFAULT_PAGES_API_BODY_SIZE_LIMIT;\n\n/**\n * Parse the request body based on content-type.\n * Enforces a size limit to prevent memory exhaustion attacks.\n *\n * The `sizeLimit` argument honours `export const config = { api: { bodyParser:\n * { sizeLimit: '4mb' } } }` on the route module. To opt out of parsing\n * entirely (`bodyParser: false`), callers must skip this function so the\n * underlying readable stream stays intact on `req` (critical for webhook\n * HMAC signature verification).\n */\nasync function parseBody(\n req: IncomingMessage,\n sizeLimit: number = MAX_BODY_SIZE,\n): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let totalSize = 0;\n let settled = false;\n req.on(\"data\", (chunk: Buffer) => {\n totalSize += chunk.length;\n if (totalSize > sizeLimit) {\n settled = true;\n req.destroy();\n reject(new PagesBodyParseError(\"Request body too large\", 413));\n return;\n }\n chunks.push(chunk);\n });\n req.on(\"error\", (err) => {\n if (!settled) {\n settled = true;\n reject(err);\n }\n });\n req.on(\"end\", () => {\n if (settled) return;\n settled = true;\n const raw = Buffer.concat(chunks).toString(\"utf-8\");\n const mediaType = getMediaType(req.headers[\"content-type\"]);\n if (!raw) {\n resolve(\n isJsonMediaType(mediaType)\n ? {}\n : mediaType === \"application/x-www-form-urlencoded\"\n ? decodeQueryString(raw)\n : undefined,\n );\n return;\n }\n if (isJsonMediaType(mediaType)) {\n try {\n resolve(JSON.parse(raw));\n } catch {\n reject(new PagesBodyParseError(\"Invalid JSON\", 400));\n }\n } else if (mediaType === \"application/x-www-form-urlencoded\") {\n resolve(decodeQueryString(raw));\n } else {\n resolve(raw);\n }\n });\n });\n}\n\n/**\n * Parse cookies from the Cookie header.\n */\nfunction parseCookies(req: IncomingMessage): Record<string, string> {\n const header = req.headers.cookie ?? \"\";\n const cookies: Record<string, string> = {};\n for (const part of header.split(\";\")) {\n const [key, ...rest] = part.split(\"=\");\n if (key) {\n cookies[key.trim()] = rest.join(\"=\").trim();\n }\n }\n return cookies;\n}\n\nfunction isEdgeApiRouteModule(module: Record<string, unknown>): module is EdgeApiRouteModule {\n if (typeof module.default !== \"function\") return false;\n // Bare `export const runtime = 'edge'` takes precedence over the nested config\n // form, matching Next.js (`config.runtime ?? config.config?.runtime` in\n // packages/next/src/build/analysis/get-page-static-info.ts).\n const bare = module.runtime;\n if (typeof bare === \"string\") return isEdgeApiRuntime(bare);\n const config = module.config;\n if (!config || typeof config !== \"object\") return false;\n const runtime = \"runtime\" in config ? (config as { runtime?: unknown }).runtime : undefined;\n return typeof runtime === \"string\" && isEdgeApiRuntime(runtime);\n}\n\nfunction readEdgeRequestBody(req: IncomingMessage): ReadableStream<Uint8Array> | undefined {\n if (req.method === \"GET\" || req.method === \"HEAD\") return undefined;\n return new ReadableStream<Uint8Array>({\n start(controller) {\n req.on(\"data\", (chunk: Buffer | string) => {\n controller.enqueue(typeof chunk === \"string\" ? Buffer.from(chunk) : new Uint8Array(chunk));\n });\n req.on(\"end\", () => controller.close());\n req.on(\"error\", (error) => controller.error(error));\n },\n });\n}\n\nfunction createEdgeApiRequest(req: IncomingMessage, url: string): Request {\n const headers = new Headers();\n for (const [name, value] of Object.entries(req.headers)) {\n if (Array.isArray(value)) {\n for (const item of value) headers.append(name, item);\n } else if (value !== undefined) {\n headers.set(name, value);\n }\n }\n\n // Honor `X-Forwarded-Proto` / `X-Forwarded-Host` only when running behind\n // a trusted proxy (gated on `VINEXT_TRUST_PROXY` / `VINEXT_TRUSTED_HOSTS`).\n // Without this gate a client could send `X-Forwarded-Proto: https` and\n // trick edge API handlers that check `request.url.startsWith(\"https\")`\n // (e.g. to gate Secure-cookie issuance) into believing the request was\n // TLS-terminated. See: Finding F-PROD-7 in SECURITY-AUDIT-2026-05.md.\n const proto = resolveRequestProtocol(req);\n const host = resolveRequestHost(req, \"localhost\");\n const requestUrl = new URL(url, `${proto}://${host}`);\n const body = readEdgeRequestBody(req);\n\n const init: RequestInit & { duplex?: \"half\" } = {\n headers,\n method: req.method,\n };\n\n if (body) {\n init.body = body;\n init.duplex = \"half\";\n }\n\n return new Request(requestUrl, init);\n}\n\nfunction waitForWritableDrain(res: ServerResponse): Promise<void> {\n return new Promise((resolve, reject) => {\n const cleanup = () => {\n res.off(\"drain\", onDrain);\n res.off(\"error\", onError);\n res.off(\"close\", onClose);\n };\n const onDrain = () => {\n cleanup();\n resolve();\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n const onClose = () => {\n cleanup();\n reject(new Error(\"Response closed before writable drain\"));\n };\n res.once(\"drain\", onDrain);\n res.once(\"error\", onError);\n res.once(\"close\", onClose);\n });\n}\n\nasync function writeEdgeApiResponseBody(\n res: ServerResponse,\n body: ReadableStream<Uint8Array> | null,\n): Promise<void> {\n if (!body) {\n res.end();\n return;\n }\n\n const reader = body.getReader();\n try {\n while (true) {\n const result = await reader.read();\n if (result.done) break;\n if (result.value.byteLength === 0) continue;\n if (!res.write(Buffer.from(result.value))) {\n await waitForWritableDrain(res);\n }\n }\n res.end();\n } catch (error) {\n res.destroy(error instanceof Error ? error : new Error(String(error)));\n throw error;\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Enhance a Node.js req/res pair with Next.js API route helpers.\n */\nfunction enhanceApiObjects(\n req: IncomingMessage,\n res: ServerResponse,\n query: Record<string, string | string[]>,\n body: unknown,\n): { apiReq: NextApiRequest; apiRes: NextApiResponse } {\n const apiReq: NextApiRequest = Object.assign(req, {\n body,\n cookies: parseCookies(req),\n query,\n });\n\n const apiRes: NextApiResponse = Object.assign(res, {\n status(this: NextApiResponse, code: number) {\n this.statusCode = code;\n return this;\n },\n\n json(this: NextApiResponse, data: unknown) {\n this.setHeader(\"Content-Type\", \"application/json\");\n this.end(JSON.stringify(data));\n },\n\n send(this: NextApiResponse, data: unknown) {\n if (Buffer.isBuffer(data)) {\n if (!this.getHeader(\"Content-Type\")) {\n this.setHeader(\"Content-Type\", \"application/octet-stream\");\n }\n this.setHeader(\"Content-Length\", String(data.length));\n this.end(data);\n return;\n }\n\n if (typeof data === \"object\" && data !== null) {\n this.setHeader(\"Content-Type\", \"application/json\");\n this.end(JSON.stringify(data));\n } else {\n if (!this.getHeader(\"Content-Type\")) {\n this.setHeader(\"Content-Type\", \"text/plain\");\n }\n this.end(String(data));\n }\n },\n\n redirect(this: NextApiResponse, statusOrUrl: number | string, url?: string) {\n if (typeof statusOrUrl === \"string\") {\n this.writeHead(307, { Location: statusOrUrl });\n } else {\n this.writeHead(statusOrUrl, { Location: url ?? \"\" });\n }\n this.end();\n },\n });\n\n return { apiReq, apiRes };\n}\n\n/**\n * Handle an API route request.\n * Returns true if the request was handled, false if no API route matched.\n */\nexport async function handleApiRoute(\n runner: ModuleImporter,\n req: IncomingMessage,\n res: ServerResponse,\n url: string,\n apiRoutes: Route[],\n): Promise<boolean> {\n const match = matchRoute(url, apiRoutes);\n if (!match) return false;\n\n const { route, params } = match;\n\n try {\n // Load the API route module through the ModuleRunner\n const apiModule = await importModule(runner, route.filePath);\n if (isEdgeApiRouteModule(apiModule)) {\n // Next.js wraps the incoming Request in a NextRequest before invoking\n // edge API handlers, so handlers can use `req.nextUrl.searchParams`,\n // `req.cookies`, etc. (Cf. NextRequestHint in next/src/server/web/adapter.ts.)\n const nextRequest = new NextRequest(createEdgeApiRequest(req, url));\n const response = await apiModule.default(nextRequest);\n if (!(response instanceof Response)) {\n throw new Error(\"Edge API route did not return a Response\");\n }\n\n res.statusCode = response.status;\n res.statusMessage = response.statusText;\n const setCookieHeaders = response.headers.getSetCookie();\n response.headers.forEach((value, name) => {\n if (name !== \"set-cookie\") res.setHeader(name, value);\n });\n if (setCookieHeaders.length) {\n res.setHeader(\"set-cookie\", setCookieHeaders);\n }\n await writeEdgeApiResponseBody(res, response.body);\n return true;\n }\n\n const handler = apiModule.default;\n if (typeof handler !== \"function\") {\n console.error(`[vinext] API route ${route.filePath} does not export a default function`);\n res.statusCode = 500;\n res.end(\"API route does not export a default function\");\n return true;\n }\n\n // Parse query from URL + route params. Path params win over same-key search\n // params so a query string cannot change the dynamic route value.\n const query = mergeRouteParamsIntoQuery(parseQueryString(url), params);\n\n // Honour `export const config = { api: { bodyParser: ... } }` on the\n // route module. When the handler opts out (`bodyParser: false`) we must\n // not consume the stream — leave `req` intact so user code (e.g. a\n // Stripe/GitHub webhook) can read the raw bytes for HMAC verification.\n const bodyParserConfig = resolveBodyParserConfig(\n (apiModule as { config?: { api?: { bodyParser?: unknown } } }).config as\n | { api?: { bodyParser?: boolean | { sizeLimit?: string | number } } }\n | undefined,\n );\n\n const body = bodyParserConfig.enabled\n ? await parseBody(req, bodyParserConfig.sizeLimit)\n : undefined;\n\n // Enhance req/res with Next.js helpers\n const { apiReq, apiRes } = enhanceApiObjects(req, res, query, body);\n\n // Call the handler\n await handler(apiReq, apiRes);\n return true;\n } catch (e) {\n if (e instanceof PagesBodyParseError) {\n res.statusCode = e.statusCode;\n res.statusMessage = e.message;\n res.end(e.message);\n return true;\n }\n\n // ssrFixStacktrace() is specific to ssrLoadModule and is not applicable\n // when using ModuleRunner — no stack trace fixup is needed here.\n console.error(e);\n void reportRequestError(\n e instanceof Error ? e : new Error(String(e)),\n {\n path: url,\n method: req.method ?? \"GET\",\n headers: Object.fromEntries(\n Object.entries(req.headers).map(([k, v]) => [\n k,\n Array.isArray(v) ? v.join(\", \") : String(v ?? \"\"),\n ]),\n ),\n },\n { routerKind: \"Pages Router\", routePath: match.route.pattern, routeType: \"route\" },\n );\n if (!res.headersSent) {\n res.statusCode = 500;\n res.end(\"Internal Server Error\");\n } else if (!res.writableEnded) {\n res.end();\n }\n return true;\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-browser-action-result.js","names":[],"sources":["../../src/server/app-browser-action-result.ts"],"sourcesContent":["import { ACTION_REVALIDATED_HEADER } from \"./headers.js\";\nimport {\n isRscCompatibilityIdCompatible,\n VINEXT_RSC_COMPATIBILITY_ID_HEADER,\n VINEXT_RSC_CONTENT_TYPE,\n} from \"./app-rsc-cache-busting.js\";\n\nexport type AppBrowserServerActionResult<TRoot> = {\n root?: TRoot;\n returnValue?: {\n ok: boolean;\n data: unknown;\n };\n};\n\nexport type ServerActionRevalidationKind = \"dynamicOnly\" | \"none\" | \"staticAndDynamic\";\n\nconst ACTION_DID_REVALIDATE_STATIC_AND_DYNAMIC = 1;\nconst ACTION_DID_REVALIDATE_DYNAMIC_ONLY = 2;\n\ntype ServerActionInitiationSnapshot<TRouterState> = {\n href: string;\n navigationId: number;\n path: string;\n routerState: TRouterState;\n};\n\n/**\n * Structural discriminator: matches on `\"returnValue\"` or `\"root\"` keys.\n * This is safe because {@link AppWireElements} keys are prefixed (`route:`,\n * `slot:`, `__route`, etc.) and will never collide with these property names.\n * If the wire format ever adds a `\"root\"` key, this guard must be updated.\n */\nexport function isServerActionResult<TRoot>(\n value: unknown,\n): value is AppBrowserServerActionResult<TRoot> {\n return !!value && typeof value === \"object\" && (\"returnValue\" in value || \"root\" in value);\n}\n\nexport function shouldClearClientNavigationCachesForServerActionResult<TRoot>(\n result: AppBrowserServerActionResult<TRoot> | TRoot,\n revalidation: ServerActionRevalidationKind = \"none\",\n): boolean {\n if (revalidation !== \"none\") {\n return true;\n }\n\n if (!isServerActionResult<TRoot>(result)) {\n return true;\n }\n\n return result.root !== undefined;\n}\n\nexport function parseServerActionRevalidationHeader(\n headers: Pick<Headers, \"get\">,\n): ServerActionRevalidationKind {\n const value = headers.get(ACTION_REVALIDATED_HEADER);\n if (!value) return \"none\";\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch {\n return \"none\";\n }\n\n switch (parsed) {\n case ACTION_DID_REVALIDATE_STATIC_AND_DYNAMIC:\n return \"staticAndDynamic\";\n case ACTION_DID_REVALIDATE_DYNAMIC_ONLY:\n return \"dynamicOnly\";\n default:\n return \"none\";\n }\n}\n\nfunction createServerActionHttpFallbackError(status: number): (Error & { digest: string }) | null {\n if (status < 400 || status > 599) return null;\n\n const digest =\n status === 404 ? \"NEXT_HTTP_ERROR_FALLBACK;404\" : `NEXT_HTTP_ERROR_FALLBACK;${status}`;\n const error = new Error(status === 404 ? \"NEXT_NOT_FOUND\" : `NEXT_HTTP_ERROR_FALLBACK;${status}`);\n return Object.assign(error, { digest });\n}\n\nexport function normalizeServerActionThrownValue(data: unknown, responseStatus: number): unknown {\n return createServerActionHttpFallbackError(responseStatus) ?? data;\n}\n\nexport async function readInvalidServerActionResponseError(\n response: Pick<Response, \"headers\" | \"status\" | \"text\">,\n hasRedirectLocation: boolean,\n): Promise<Error | null> {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const isRscResponse = contentType.startsWith(VINEXT_RSC_CONTENT_TYPE);\n if (isRscResponse || hasRedirectLocation) return null;\n\n // Parity with Next.js' server-action reducer: any non-RSC action response,\n // including a 2xx, is surfaced to the action caller. Plain text 4xx/5xx\n // bodies are preserved when available; other responses use a stable generic\n // message.\n const message =\n response.status >= 400 && contentType.toLowerCase().startsWith(\"text/plain\")\n ? await response.text()\n : \"An unexpected response was received from the server.\";\n\n return new Error(message || \"An unexpected response was received from the server.\");\n}\n\nexport function shouldCheckRscCompatibilityForServerActionResponse(\n response: Pick<Response, \"headers\">,\n): boolean {\n return (response.headers.get(\"content-type\") ?? \"\").startsWith(VINEXT_RSC_CONTENT_TYPE);\n}\n\nexport function resolveServerActionRedirectCompatibilityHardNavigationTarget(options: {\n actionRedirectHref: string | null;\n clientCompatibilityId: string | null | undefined;\n response: Pick<Response, \"headers\">;\n}): string | null {\n if (!options.actionRedirectHref) return null;\n if (!shouldCheckRscCompatibilityForServerActionResponse(options.response)) return null;\n if (\n isRscCompatibilityIdCompatible(\n options.response.headers.get(VINEXT_RSC_COMPATIBILITY_ID_HEADER),\n options.clientCompatibilityId,\n )\n ) {\n return null;\n }\n return options.actionRedirectHref;\n}\n\nexport function shouldScheduleRefreshForDiscardedServerAction(\n revalidation: ServerActionRevalidationKind,\n): boolean {\n return revalidation !== \"none\";\n}\n\nexport function createServerActionInitiationSnapshot<TRouterState>(options: {\n href: string;\n navigationId: number;\n origin?: string;\n routerState: TRouterState;\n}): ServerActionInitiationSnapshot<TRouterState> {\n const url =\n options.origin === undefined ? new URL(options.href) : new URL(options.href, options.origin);\n return {\n href: url.href,\n navigationId: options.navigationId,\n path: url.pathname + url.search,\n routerState: options.routerState,\n };\n}\n\ntype DiscardedServerActionRefreshScheduler = {\n markNavigationSettled(): void;\n markNavigationStart(): void;\n schedule(): void;\n};\n\ntype DiscardedServerActionRefreshSchedulerOptions = {\n queueTask?: (callback: () => void) => void;\n runRefresh: () => void;\n};\n\nexport function createDiscardedServerActionRefreshScheduler(\n options: DiscardedServerActionRefreshSchedulerOptions,\n): DiscardedServerActionRefreshScheduler {\n const queueTask = options.queueTask ?? queueMicrotask;\n let activeNavigationCount = 0;\n let flushQueued = false;\n let refreshPending = false;\n\n function flush(): void {\n flushQueued = false;\n if (!refreshPending || activeNavigationCount > 0) return;\n\n refreshPending = false;\n options.runRefresh();\n }\n\n function queueFlush(): void {\n if (flushQueued) return;\n flushQueued = true;\n queueTask(flush);\n }\n\n return {\n markNavigationSettled() {\n if (activeNavigationCount > 0) {\n activeNavigationCount -= 1;\n }\n queueFlush();\n },\n markNavigationStart() {\n activeNavigationCount += 1;\n },\n schedule() {\n refreshPending = true;\n queueFlush();\n },\n };\n}\n"],"mappings":";;;AAiBA,MAAM,2CAA2C;AACjD,MAAM,qCAAqC;;;;;;;AAe3C,SAAgB,qBACd,OAC8C;CAC9C,OAAO,CAAC,CAAC,SAAS,OAAO,UAAU,aAAa,iBAAiB,SAAS,UAAU;;AAGtF,SAAgB,uDACd,QACA,eAA6C,QACpC;CACT,IAAI,iBAAiB,QACnB,OAAO;CAGT,IAAI,CAAC,qBAA4B,OAAO,EACtC,OAAO;CAGT,OAAO,OAAO,SAAS,KAAA;;AAGzB,SAAgB,oCACd,SAC8B;CAC9B,MAAM,QAAQ,QAAQ,IAAI,0BAA0B;CACpD,IAAI,CAAC,OAAO,OAAO;CAEnB,IAAI;CACJ,IAAI;EACF,SAAS,KAAK,MAAM,MAAM;SACpB;EACN,OAAO;;CAGT,QAAQ,QAAR;EACE,KAAK,0CACH,OAAO;EACT,KAAK,oCACH,OAAO;EACT,SACE,OAAO;;;AAIb,SAAS,oCAAoC,QAAqD;CAChG,IAAI,SAAS,OAAO,SAAS,KAAK,OAAO;CAEzC,MAAM,SACJ,WAAW,MAAM,iCAAiC,4BAA4B;CAChF,MAAM,wBAAQ,IAAI,MAAM,WAAW,MAAM,mBAAmB,4BAA4B,SAAS;CACjG,OAAO,OAAO,OAAO,OAAO,EAAE,QAAQ,CAAC;;AAGzC,SAAgB,iCAAiC,MAAe,gBAAiC;CAC/F,OAAO,oCAAoC,eAAe,IAAI;;AAGhE,eAAsB,qCACpB,UACA,qBACuB;CACvB,MAAM,cAAc,SAAS,QAAQ,IAAI,eAAe,IAAI;CAE5D,IADsB,YAAY,WAAA,mBACjB,IAAI,qBAAqB,OAAO;CAMjD,MAAM,UACJ,SAAS,UAAU,OAAO,YAAY,aAAa,CAAC,WAAW,aAAa,GACxE,MAAM,SAAS,MAAM,GACrB;CAEN,OAAO,IAAI,MAAM,WAAW,uDAAuD;;AAGrF,SAAgB,mDACd,UACS;CACT,QAAQ,SAAS,QAAQ,IAAI,eAAe,IAAI,IAAI,WAAW,wBAAwB;;AAGzF,SAAgB,6DAA6D,SAI3D;CAChB,IAAI,CAAC,QAAQ,oBAAoB,OAAO;CACxC,IAAI,CAAC,mDAAmD,QAAQ,SAAS,EAAE,OAAO;CAClF,IACE,+BACE,QAAQ,SAAS,QAAQ,IAAA,gCAAuC,EAChE,QAAQ,sBACT,EAED,OAAO;CAET,OAAO,QAAQ;;AAGjB,SAAgB,8CACd,cACS;CACT,OAAO,iBAAiB;;AAG1B,SAAgB,qCAAmD,SAKlB;CAC/C,MAAM,MACJ,QAAQ,WAAW,KAAA,IAAY,IAAI,IAAI,QAAQ,KAAK,GAAG,IAAI,IAAI,QAAQ,MAAM,QAAQ,OAAO;CAC9F,OAAO;EACL,MAAM,IAAI;EACV,cAAc,QAAQ;EACtB,MAAM,IAAI,WAAW,IAAI;EACzB,aAAa,QAAQ;EACtB;;AAcH,SAAgB,4CACd,SACuC;CACvC,MAAM,YAAY,QAAQ,aAAa;CACvC,IAAI,wBAAwB;CAC5B,IAAI,cAAc;CAClB,IAAI,iBAAiB;CAErB,SAAS,QAAc;EACrB,cAAc;EACd,IAAI,CAAC,kBAAkB,wBAAwB,GAAG;EAElD,iBAAiB;EACjB,QAAQ,YAAY;;CAGtB,SAAS,aAAmB;EAC1B,IAAI,aAAa;EACjB,cAAc;EACd,UAAU,MAAM;;CAGlB,OAAO;EACL,wBAAwB;GACtB,IAAI,wBAAwB,GAC1B,yBAAyB;GAE3B,YAAY;;EAEd,sBAAsB;GACpB,yBAAyB;;EAE3B,WAAW;GACT,iBAAiB;GACjB,YAAY;;EAEf"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-browser-entry.js","names":["_exhaustive"],"sources":["../../src/server/app-browser-entry.ts"],"sourcesContent":["/// <reference types=\"vite/client\" />\n\nimport {\n createElement,\n startTransition,\n use,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n createFromFetch,\n createFromReadableStream,\n createTemporaryReferenceSet,\n encodeReply,\n setServerCallback,\n} from \"@vitejs/plugin-rsc/browser\";\nimport { hydrateRoot } from \"react-dom/client\";\nimport \"../client/instrumentation-client.js\";\nimport { notifyAppRouterTransitionStart } from \"../client/instrumentation-client-state.js\";\nimport {\n __basePath,\n appRouterInstance,\n commitClientNavigationState,\n consumePrefetchResponseForNavigation,\n createCachedRscResponseSnapshot,\n createClientNavigationRenderSnapshot,\n getClientNavigationRenderContext,\n getPrefetchCache,\n invalidatePrefetchCache,\n decodeRedirectError,\n isRedirectError,\n pushHistoryStateWithoutNotify,\n replaceClientParamsWithoutNotify,\n replaceHistoryStateWithoutNotify,\n restoreRscResponse,\n saveScrollPosition,\n setClientParams,\n setPendingPathname,\n setMountedSlotsHeader,\n setNavigationContext,\n useRouter,\n type CachedRscResponse,\n type ClientNavigationRenderSnapshot,\n type PrefetchCacheEntry,\n} from \"vinext/shims/navigation\";\nimport {\n getNavigationRuntime,\n registerNavigationRuntimeBootstrap,\n registerNavigationRuntimeFunctions,\n type NavigationRuntimeNavigate,\n type NavigationRuntimeRscBootstrap,\n} from \"../client/navigation-runtime.js\";\nimport { retryScrollTo, scrollToHashTargetOnNextFrame } from \"vinext/shims/hash-scroll\";\nimport { AppRouterScrollCommitProvider } from \"vinext/shims/app-router-scroll\";\nimport {\n beginAppRouterScrollIntent,\n consumeAppRouterScrollIntent,\n type AppRouterScrollIntent,\n} from \"vinext/shims/app-router-scroll-state\";\nimport { installWindowNext } from \"../client/window-next.js\";\nimport {\n chunksToReadableStream,\n createProgressiveRscStream,\n getVinextBrowserGlobal,\n} from \"./app-browser-stream.js\";\nimport {\n createAppBrowserNavigationController,\n clearHardNavigationLoopGuard,\n type HistoryUpdateMode,\n type NavigationPayloadOutcome,\n type PendingBrowserRouterState,\n} from \"./app-browser-navigation-controller.js\";\nimport { AppBrowserMpaNavigationScheduler } from \"./app-browser-mpa-navigation.js\";\nimport { resolveManifestNavigationInterceptionContext } from \"./app-browser-interception-context.js\";\nimport {\n createDiscardedServerActionRefreshScheduler,\n createServerActionInitiationSnapshot,\n isServerActionResult,\n normalizeServerActionThrownValue,\n parseServerActionRevalidationHeader,\n readInvalidServerActionResponseError,\n resolveServerActionRedirectCompatibilityHardNavigationTarget,\n shouldCheckRscCompatibilityForServerActionResponse,\n shouldClearClientNavigationCachesForServerActionResult,\n type ServerActionRevalidationKind,\n type AppBrowserServerActionResult,\n} from \"./app-browser-action-result.js\";\nimport {\n consumeInitialFormState,\n createVinextHydrateRootOptions,\n hydrateRootInTransition,\n} from \"./app-browser-hydration.js\";\nimport {\n AppElementsWire,\n getMountedSlotIdsHeader,\n resolveVisitedResponseInterceptionContext,\n type AppElements,\n type AppWireElements,\n} from \"./app-elements.js\";\nimport {\n FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN,\n VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN,\n createHistoryStateWithNavigationMetadata,\n createHistoryStateWithPreviousNextUrl,\n readHistoryStatePreviousNextUrl,\n readHistoryStateTraversalIndex,\n isCacheRestorableAppPayloadMetadata,\n resolveHistoryTraversalIntent,\n resolveInterceptionContextFromPreviousNextUrl,\n resolveServerActionRequestState,\n type AppNavigationPayloadOrigin,\n type AppRouterState,\n type HistoryTraversalIntent,\n type OperationLane,\n} from \"./app-browser-state.js\";\nimport { createPopstateRestoreHandler } from \"./app-browser-popstate.js\";\nimport { DevRecoveryBoundary, RedirectBoundary } from \"vinext/shims/error-boundary\";\nimport { AppRouterContext } from \"vinext/shims/internal/app-router-context\";\nimport { ElementsContext, Slot } from \"vinext/shims/slot\";\nimport type { RouteManifest } from \"../routing/app-route-graph.js\";\nimport { stripBasePath } from \"../utils/base-path.js\";\nimport { createOnUncaughtError } from \"./app-browser-error.js\";\nimport {\n devOnCaughtError,\n devOnUncaughtError,\n dismissOverlay,\n installDevErrorOverlay,\n} from \"./dev-error-overlay.js\";\nimport { DANGEROUS_URL_BLOCK_MESSAGE, isDangerousScheme } from \"vinext/shims/url-safety\";\nimport { throwOnServerActionNotFound } from \"./server-action-not-found.js\";\nimport {\n createRscRequestHeaders,\n createRscRequestUrl,\n createServerActionRequestUrl,\n getVinextRscCompatibilityId,\n resolveHardNavigationTargetFromRscResponse,\n resolveRscCompatibilityNavigationDecision,\n VINEXT_RSC_COMPATIBILITY_ID_HEADER,\n VINEXT_RSC_CONTENT_TYPE,\n} from \"./app-rsc-cache-busting.js\";\nimport { APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI } from \"./app-rsc-render-mode.js\";\nimport {\n MAX_RSC_REDIRECT_DEPTH,\n resolveRscRedirectLifecycleHop,\n} from \"./app-browser-rsc-redirect.js\";\nimport {\n createOptimisticRouteTemplate,\n getOptimisticPrefetchSourceKey,\n getOptimisticRouteTemplateKey,\n resolveOptimisticNavigationPayload,\n type OptimisticRouteTemplate,\n} from \"./app-optimistic-routing.js\";\nimport {\n ACTION_REDIRECT_HEADER,\n ACTION_REDIRECT_STATUS_HEADER,\n ACTION_REDIRECT_TYPE_HEADER,\n VINEXT_MOUNTED_SLOTS_HEADER,\n VINEXT_PARAMS_HEADER,\n VINEXT_RSC_REDIRECT_HEADER,\n} from \"./headers.js\";\nimport { removeStylesheetLinksCoveredByInlineCss } from \"./app-inline-css-client.js\";\n\ntype SearchParamInput = ConstructorParameters<typeof URLSearchParams>[0];\n\ntype ServerActionResult = AppBrowserServerActionResult<AppWireElements>;\n\ntype NavigationKind = \"navigate\" | \"traverse\" | \"refresh\";\ntype MpaNavigationState = {\n href: string;\n historyUpdateMode: HistoryUpdateMode;\n kind: \"mpa-navigation\";\n};\n\n// Maps NavigationKind to the AppRouterAction type used by the reducer.\n// \"refresh\" is intentionally treated as \"navigate\" (merge, preserve absent slots).\n// Both call sites must stay in sync — update here if NavigationKind gains new values.\nfunction toActionType(kind: NavigationKind): \"navigate\" | \"traverse\" {\n return kind === \"traverse\" ? \"traverse\" : \"navigate\";\n}\n\nfunction toOperationLane(kind: NavigationKind): OperationLane {\n switch (kind) {\n case \"navigate\":\n return \"navigation\";\n case \"refresh\":\n return \"refresh\";\n case \"traverse\":\n return \"traverse\";\n default: {\n const _exhaustive: never = kind;\n throw new Error(\"[vinext] Unknown navigation kind: \" + String(_exhaustive));\n }\n }\n}\n\ntype VisitedResponseCacheEntry = {\n params: Record<string, string | string[]>;\n expiresAt: number;\n response: CachedRscResponse;\n};\n\nconst MAX_VISITED_RESPONSE_CACHE_SIZE = 50;\nconst VISITED_RESPONSE_CACHE_TTL = 5 * 60_000;\nconst MAX_TRAVERSAL_CACHE_TTL = 30 * 60_000;\nconst CLIENT_RSC_COMPATIBILITY_ID = getVinextRscCompatibilityId();\nconst optimisticRouteTemplates = new Map<string, OptimisticRouteTemplate>();\nconst optimisticRouteTemplateSources = new Set<string>();\nconst optimisticRouteTemplateLearning = new Map<string, Promise<void>>();\nfunction getBrowserRouteManifest(): RouteManifest | null {\n return getNavigationRuntime()?.bootstrap.routeManifest ?? null;\n}\n\nconst browserNavigationController = createAppBrowserNavigationController({\n getRouteManifest: getBrowserRouteManifest,\n syncHistoryStatePreviousNextUrl: syncCurrentHistoryStatePreviousNextUrl,\n});\nconst discardedServerActionRefreshScheduler = createDiscardedServerActionRefreshScheduler({\n runRefresh() {\n clearClientNavigationCaches();\n void getNavigationRuntime()?.functions.navigate?.(\n window.location.href,\n 0,\n \"refresh\",\n undefined,\n undefined,\n true,\n );\n },\n});\nconst NavigationCommitSignal = browserNavigationController.NavigationCommitSignal;\nconst ACTION_HTTP_FALLBACK_ROBOTS_META_ATTR = \"data-vinext-action-http-fallback\";\n\nfunction syncServerActionHttpFallbackHead(status: number | null): void {\n document.head\n .querySelectorAll(`meta[${ACTION_HTTP_FALLBACK_ROBOTS_META_ATTR}=\"robots\"]`)\n .forEach((node) => node.remove());\n\n if (status !== 404) return;\n\n const robots = document.createElement(\"meta\");\n robots.name = \"robots\";\n robots.content = \"noindex\";\n robots.setAttribute(ACTION_HTTP_FALLBACK_ROBOTS_META_ATTR, \"robots\");\n document.head.appendChild(robots);\n}\n\n// Parses a URI-encoded JSON value carried in a response header (e.g.\n// `X-Vinext-Params`). Returns `null` on missing or malformed input so callers\n// can fall back to their own defaults. Silent by design — these headers are\n// best-effort hydration data and a parse failure should not break navigation.\nfunction parseEncodedJsonHeader<T>(value: string | null): T | null {\n if (!value) return null;\n try {\n return JSON.parse(decodeURIComponent(value)) as T;\n } catch {\n return null;\n }\n}\n\nfunction isRouterStatePromise(\n value: AppRouterState | Promise<AppRouterState> | MpaNavigationState,\n): value is Promise<AppRouterState> {\n return value instanceof Promise;\n}\n\nlet latestClientParams: Record<string, string | string[]> = {};\nconst visitedResponseCache = new Map<string, VisitedResponseCacheEntry>();\n// Sticky bit: stays true once BrowserRoot has committed at least once. Used by\n// the HMR handler to distinguish \"still hydrating\" (wait) from \"was up, then\n// torn down by a render error\" (full reload to recover).\nlet browserRouterStateHasEverCommitted = false;\n// Most recent navigation target that has been dispatched but not yet committed.\n// Read by the onUncaughtError handler so a render error tearing down the tree\n// can land the browser on the URL the user was actually navigating to, instead\n// of stranding them on the previous URL with a blank page. Cleared once the\n// commit effect runs (URL update succeeded) or the navigation is superseded.\nlet pendingNavigationRecoveryHref: string | null = null;\nconst mpaNavigationScheduler = new AppBrowserMpaNavigationScheduler();\nconst unresolvedMpaNavigation = new Promise<never>(() => {});\nlet currentHistoryTraversalIndex: number | null =\n readHistoryStateTraversalIndex(window.history.state) ?? 0;\nlet nextHistoryTraversalIndex: number = currentHistoryTraversalIndex;\n\nfunction allocateNavigationHistoryTraversalIndex(\n historyUpdateMode: HistoryUpdateMode | undefined,\n): number | null {\n switch (historyUpdateMode) {\n case \"push\":\n return nextHistoryTraversalIndex + 1;\n case \"replace\":\n return currentHistoryTraversalIndex;\n case undefined:\n return null;\n default: {\n const _exhaustive: never = historyUpdateMode;\n throw new Error(\"[vinext] Unknown history update mode: \" + String(_exhaustive));\n }\n }\n}\n\nfunction commitHistoryTraversalIndex(index: number | null): void {\n currentHistoryTraversalIndex = index;\n if (index !== null) {\n // Keep allocation anchored to the highest app-owned entry we know about.\n // Traversing to metadata-less entries makes the current index unknown, but\n // the next app-owned push should still continue from known app history.\n nextHistoryTraversalIndex = Math.max(nextHistoryTraversalIndex, index);\n }\n}\n\nfunction commitHashOnlyNavigation(\n href: string,\n historyUpdateMode: Exclude<HistoryUpdateMode, undefined>,\n scroll: boolean,\n): void {\n const navigationHistoryIndex = allocateNavigationHistoryTraversalIndex(historyUpdateMode);\n const previousNextUrl = hasBrowserRouterState()\n ? getBrowserRouterState().previousNextUrl\n : readHistoryStatePreviousNextUrl(window.history.state);\n const historyState = createHistoryStateWithNavigationMetadata(\n createHashOnlyNavigationBaseHistoryState(historyUpdateMode, scroll),\n {\n previousNextUrl,\n traversalIndex: navigationHistoryIndex,\n },\n );\n\n if (historyUpdateMode === \"replace\") {\n replaceHistoryStateWithoutNotify(historyState, \"\", href);\n } else {\n pushHistoryStateWithoutNotify(historyState, \"\", href);\n }\n commitHistoryTraversalIndex(navigationHistoryIndex);\n}\n\nfunction createHashOnlyNavigationBaseHistoryState(\n historyUpdateMode: Exclude<HistoryUpdateMode, undefined>,\n scroll: boolean,\n): unknown {\n if (historyUpdateMode !== \"replace\") {\n return null;\n }\n return scroll ? stripVinextScrollState(window.history.state) : window.history.state;\n}\n\nfunction stripVinextScrollState(state: unknown): unknown {\n if (!state || typeof state !== \"object\") {\n return state;\n }\n\n const nextState: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(state)) {\n if (key === \"__vinext_scrollX\" || key === \"__vinext_scrollY\") {\n continue;\n }\n nextState[key] = value;\n }\n\n return Object.keys(nextState).length > 0 ? nextState : null;\n}\n\nfunction commitTraversalIndexFromHistoryState(historyState: unknown): void {\n commitHistoryTraversalIndex(readHistoryStateTraversalIndex(historyState));\n}\n\nfunction getBrowserRouterState(): AppRouterState {\n return browserNavigationController.getBrowserRouterState();\n}\n\nfunction hasBrowserRouterState(): boolean {\n return browserNavigationController.hasBrowserRouterState();\n}\n\nfunction waitForBrowserRouterStateReady(): Promise<void> {\n return browserNavigationController.waitForBrowserRouterStateReady();\n}\n\nfunction beginPendingBrowserRouterState(): PendingBrowserRouterState {\n return browserNavigationController.beginPendingBrowserRouterState();\n}\n\nfunction applyClientParams(params: Record<string, string | string[]>): void {\n latestClientParams = params;\n setClientParams(params);\n}\n\nfunction stageClientParams(params: Record<string, string | string[]>): void {\n // NB: latestClientParams diverges from ClientNavigationState.clientParams\n // between staging and commit. Server action snapshots capture the committed\n // browser router state at invocation time, so they do not read this mutable\n // module-level value after their async request boundary.\n latestClientParams = params;\n replaceClientParamsWithoutNotify(params);\n}\n\nfunction clearVisitedResponseCache(): void {\n visitedResponseCache.clear();\n}\n\nfunction clearPrefetchState(): void {\n invalidatePrefetchCache();\n optimisticRouteTemplates.clear();\n optimisticRouteTemplateSources.clear();\n optimisticRouteTemplateLearning.clear();\n}\n\nfunction clearClientNavigationCaches(): void {\n clearVisitedResponseCache();\n clearPrefetchState();\n}\n\nfunction isSettledPrefetchCacheEntry(\n entry: PrefetchCacheEntry,\n): entry is PrefetchCacheEntry & { snapshot: CachedRscResponse } {\n return (\n entry.outcome === \"cache-seeded\" && entry.pending === undefined && entry.snapshot !== undefined\n );\n}\n\nfunction parsePrefetchCacheKey(cacheKey: string): {\n interceptionContext: string | null;\n rscUrl: string;\n} {\n const separatorIndex = cacheKey.indexOf(\"\\0\");\n if (separatorIndex === -1) {\n return { interceptionContext: null, rscUrl: cacheKey };\n }\n return {\n interceptionContext: cacheKey.slice(separatorIndex + 1),\n rscUrl: cacheKey.slice(0, separatorIndex),\n };\n}\n\nasync function learnOptimisticRouteTemplateFromPrefetch(options: {\n cacheKey: string;\n entry: PrefetchCacheEntry & { snapshot: CachedRscResponse };\n interceptionContext: string | null;\n mountedSlotsHeader: string | null;\n routeManifest: RouteManifest;\n}): Promise<boolean> {\n const source = parsePrefetchCacheKey(options.cacheKey);\n if (source.interceptionContext !== options.interceptionContext) return false;\n if ((options.entry.snapshot.mountedSlotsHeader ?? null) !== options.mountedSlotsHeader)\n return false;\n if (options.interceptionContext !== null) return false;\n\n const elements = await decodeAppElementsPromise(\n createFromFetch<AppWireElements>(Promise.resolve(restoreRscResponse(options.entry.snapshot))),\n );\n const template = createOptimisticRouteTemplate({\n allowLoadingShell: options.entry.optimisticRouteShell === true,\n basePath: __basePath,\n elements,\n href: options.entry.snapshot.url || source.rscUrl,\n interceptionContext: options.interceptionContext,\n mountedSlotsHeader: options.mountedSlotsHeader,\n routeManifest: options.routeManifest,\n });\n if (template === null) return false;\n\n optimisticRouteTemplates.set(\n getOptimisticRouteTemplateKey({\n interceptionContext: options.interceptionContext,\n mountedSlotsHeader: options.mountedSlotsHeader,\n routeId: template.routeId,\n }),\n template,\n );\n return true;\n}\n\nasync function learnOptimisticRouteTemplatesFromPrefetchCache(options: {\n interceptionContext: string | null;\n mountedSlotsHeader: string | null;\n routeManifest: RouteManifest | null;\n}): Promise<void> {\n if (options.routeManifest === null) return;\n\n const learning: Promise<void>[] = [...optimisticRouteTemplateLearning.values()];\n for (const [cacheKey, entry] of getPrefetchCache()) {\n const sourceKey = getOptimisticPrefetchSourceKey({\n cacheKey,\n interceptionContext: options.interceptionContext,\n mountedSlotsHeader: options.mountedSlotsHeader,\n });\n if (optimisticRouteTemplateSources.has(sourceKey)) continue;\n if (optimisticRouteTemplateLearning.has(sourceKey)) continue;\n if (!isSettledPrefetchCacheEntry(entry)) continue;\n\n const promise = learnOptimisticRouteTemplateFromPrefetch({\n cacheKey,\n entry,\n interceptionContext: options.interceptionContext,\n mountedSlotsHeader: options.mountedSlotsHeader,\n routeManifest: options.routeManifest,\n })\n .then((learned) => {\n if (learned) optimisticRouteTemplateSources.add(sourceKey);\n })\n .finally(() => {\n optimisticRouteTemplateLearning.delete(sourceKey);\n });\n optimisticRouteTemplateLearning.set(sourceKey, promise);\n learning.push(promise);\n }\n\n if (learning.length === 0) return;\n await Promise.allSettled(learning);\n}\n\nfunction syncCurrentHistoryStatePreviousNextUrl(previousNextUrl: string | null): void {\n if (readHistoryStatePreviousNextUrl(window.history.state) === previousNextUrl) {\n return;\n }\n\n const nextHistoryState = createHistoryStateWithPreviousNextUrl(\n window.history.state,\n previousNextUrl,\n );\n // First attempt: use replaceHistoryStateWithoutNotify which fires no popstate\n // or hashchange events. If the browser accepted the state update (checked via\n // readHistoryStatePreviousNextUrl), we're done. The double-read is needed\n // because some browsers (notably Safari) can silently coalesce or ignore\n // replaceState calls when called in rapid succession (e.g. back-to-back\n // navigation commits). The fallback fires only when the state didn't stick.\n replaceHistoryStateWithoutNotify(nextHistoryState, \"\", window.location.href);\n if (readHistoryStatePreviousNextUrl(window.history.state) === previousNextUrl) {\n return;\n }\n window.history.replaceState(nextHistoryState, \"\", window.location.href);\n}\n\nfunction createActionInitiationSnapshot() {\n const routerState = getBrowserRouterState();\n return createServerActionInitiationSnapshot({\n href: window.location.href,\n navigationId: browserNavigationController.getActiveNavigationId(),\n routerState,\n });\n}\n\ntype ActionInitiationSnapshot = ReturnType<typeof createActionInitiationSnapshot>;\n\nfunction createNavigationCommitEffect(options: {\n href: string;\n historyUpdateMode: HistoryUpdateMode | undefined;\n navId: number;\n params: Record<string, string | string[]>;\n previousNextUrl: string | null;\n targetHistoryIndex?: number | null;\n}): () => void {\n const { href, historyUpdateMode, navId, params, previousNextUrl, targetHistoryIndex } = options;\n\n return () => {\n // Only update URL if this is still the active navigation.\n // A newer navigation would have superseded this navigation id.\n if (!browserNavigationController.isCurrentNavigation(navId)) {\n // This transition was superseded before commit; balance the active\n // snapshot counter without clearing pendingPathname ownership.\n commitClientNavigationState(undefined, { releaseSnapshot: true });\n return;\n }\n\n const targetHref = new URL(href, window.location.origin).href;\n const preserveExistingState = historyUpdateMode === \"replace\";\n const navigationHistoryIndex =\n targetHistoryIndex !== undefined\n ? targetHistoryIndex\n : allocateNavigationHistoryTraversalIndex(historyUpdateMode);\n const historyState = createHistoryStateWithNavigationMetadata(\n preserveExistingState ? window.history.state : null,\n {\n previousNextUrl,\n traversalIndex: navigationHistoryIndex,\n },\n );\n\n let wroteHistoryState = false;\n if (historyUpdateMode === \"replace\" && window.location.href !== targetHref) {\n stageClientParams(params);\n replaceHistoryStateWithoutNotify(historyState, \"\", href);\n wroteHistoryState = true;\n commitHistoryTraversalIndex(navigationHistoryIndex);\n } else if (historyUpdateMode === \"push\" && window.location.href !== targetHref) {\n stageClientParams(params);\n pushHistoryStateWithoutNotify(historyState, \"\", href);\n wroteHistoryState = true;\n commitHistoryTraversalIndex(navigationHistoryIndex);\n }\n\n if (!wroteHistoryState) {\n syncCurrentHistoryStatePreviousNextUrl(previousNextUrl);\n stageClientParams(params);\n if (targetHistoryIndex !== undefined) {\n commitHistoryTraversalIndex(targetHistoryIndex);\n }\n }\n\n // URL has been updated; the recovery hard-nav target is no longer needed.\n pendingNavigationRecoveryHref = null;\n commitClientNavigationState(navId);\n };\n}\n\nasync function renderNavigationPayload(\n payload: Promise<AppElements>,\n navigationSnapshot: ClientNavigationRenderSnapshot,\n targetHref: string,\n navId: number,\n historyUpdateMode: HistoryUpdateMode | undefined,\n params: Record<string, string | string[]>,\n previousNextUrl: string | null,\n pendingRouterState: PendingBrowserRouterState | null,\n payloadOrigin: AppNavigationPayloadOrigin,\n actionType: \"navigate\" | \"replace\" | \"traverse\" = \"navigate\",\n operationLane: OperationLane = \"navigation\",\n traversalIntent: HistoryTraversalIntent | null = null,\n scrollIntent: AppRouterScrollIntent | null | undefined = null,\n): Promise<NavigationPayloadOutcome> {\n syncServerActionHttpFallbackHead(null);\n try {\n return await browserNavigationController.renderNavigationPayload({\n actionType,\n createNavigationCommitEffect: (options) => {\n pendingNavigationRecoveryHref = options.href;\n return createNavigationCommitEffect(options);\n },\n historyUpdateMode,\n navigationSnapshot,\n nextElements: payload,\n operationLane,\n payloadOrigin,\n params,\n pendingRouterState,\n previousNextUrl,\n scrollIntent,\n targetHistoryIndex: traversalIntent === null ? undefined : traversalIntent.targetHistoryIndex,\n targetHref,\n navId,\n });\n } catch (error) {\n pendingNavigationRecoveryHref = null;\n throw error;\n }\n}\n\nfunction resolveActionRedirectTarget(\n response: Response,\n): { href: string; type: string; status: number } | null {\n const actionRedirect = response.headers.get(ACTION_REDIRECT_HEADER);\n if (!actionRedirect) return null;\n\n if (isDangerousScheme(actionRedirect)) {\n console.error(DANGEROUS_URL_BLOCK_MESSAGE);\n return null;\n }\n\n try {\n let redirectUrl: URL;\n if (actionRedirect.startsWith(\"/\") || /^[a-z]+:/i.test(actionRedirect)) {\n redirectUrl = new URL(actionRedirect, window.location.href);\n } else {\n const baseParsed = new URL(window.location.href);\n let baseDir = baseParsed.pathname;\n if (!baseDir.endsWith(\"/\")) {\n baseDir = baseDir + \"/\";\n }\n redirectUrl = new URL(actionRedirect, `${baseParsed.origin}${baseDir}${baseParsed.search}`);\n }\n\n if (redirectUrl.origin !== window.location.origin) {\n browserNavigationController.performHardNavigation(actionRedirect);\n return null;\n }\n const statusHeader = response.headers.get(ACTION_REDIRECT_STATUS_HEADER);\n const status = statusHeader ? parseInt(statusHeader, 10) : 307;\n return {\n href: redirectUrl.href,\n type: response.headers.get(ACTION_REDIRECT_TYPE_HEADER) ?? \"push\",\n status,\n };\n } catch {\n browserNavigationController.performHardNavigation(actionRedirect);\n return null;\n }\n}\n\nclass ServerActionRedirectError extends Error {\n readonly digest: string;\n readonly handled = true;\n\n constructor(target: { href: string; type: string; status: number }) {\n super(\"NEXT_REDIRECT\");\n const redirectUrl = new URL(target.href, window.location.href);\n const redirectHref = redirectUrl.pathname + redirectUrl.search + redirectUrl.hash;\n const redirectType = target.type === \"push\" ? \"push\" : \"replace\";\n this.digest = `NEXT_REDIRECT;${redirectType};${encodeURIComponent(redirectHref)};${target.status};`;\n }\n}\n\nfunction createServerActionRedirectError(target: {\n href: string;\n type: string;\n status: number;\n}): Error {\n return new ServerActionRedirectError(target);\n}\n\nasync function commitSameUrlNavigatePayload(\n nextElements: Promise<AppElements>,\n actionInitiation: ActionInitiationSnapshot,\n returnValue?: ServerActionResult[\"returnValue\"],\n revalidation: ServerActionRevalidationKind = \"none\",\n): Promise<unknown> {\n const navigationSnapshot = createClientNavigationRenderSnapshot(\n actionInitiation.href,\n actionInitiation.routerState.navigationSnapshot.params,\n );\n return browserNavigationController.commitSameUrlNavigatePayload(\n nextElements,\n navigationSnapshot,\n returnValue,\n actionInitiation.routerState,\n {\n onDiscardedRevalidation() {\n discardedServerActionRefreshScheduler.schedule();\n },\n revalidation,\n startedNavigationId: actionInitiation.navigationId,\n targetHref: actionInitiation.href,\n },\n );\n}\n\nfunction evictVisitedResponseCacheIfNeeded(): void {\n while (visitedResponseCache.size >= MAX_VISITED_RESPONSE_CACHE_SIZE) {\n const oldest = visitedResponseCache.keys().next().value;\n if (oldest === undefined) {\n return;\n }\n visitedResponseCache.delete(oldest);\n }\n}\n\nfunction getVisitedResponse(\n rscUrl: string,\n interceptionContext: string | null,\n mountedSlotsHeader: string | null,\n navigationKind: NavigationKind,\n): VisitedResponseCacheEntry | null {\n const cacheKey = AppElementsWire.encodeCacheKey(rscUrl, interceptionContext);\n const cached = visitedResponseCache.get(cacheKey);\n if (!cached) {\n return null;\n }\n\n if ((cached.response.mountedSlotsHeader ?? null) !== mountedSlotsHeader) {\n visitedResponseCache.delete(cacheKey);\n return null;\n }\n\n if (navigationKind === \"refresh\") {\n return null;\n }\n\n if (navigationKind === \"traverse\") {\n const createdAt = cached.expiresAt - VISITED_RESPONSE_CACHE_TTL;\n if (Date.now() - createdAt >= MAX_TRAVERSAL_CACHE_TTL) {\n visitedResponseCache.delete(cacheKey);\n return null;\n }\n // LRU: promote to most-recently-used (delete + re-insert moves to end of Map)\n visitedResponseCache.delete(cacheKey);\n visitedResponseCache.set(cacheKey, cached);\n return cached;\n }\n\n if (cached.expiresAt > Date.now()) {\n // LRU: promote to most-recently-used\n visitedResponseCache.delete(cacheKey);\n visitedResponseCache.set(cacheKey, cached);\n return cached;\n }\n\n visitedResponseCache.delete(cacheKey);\n return null;\n}\n\nfunction storeVisitedResponseSnapshot(\n rscUrl: string,\n interceptionContext: string | null,\n snapshot: CachedRscResponse,\n params: Record<string, string | string[]>,\n): void {\n const cacheKey = AppElementsWire.encodeCacheKey(rscUrl, interceptionContext);\n visitedResponseCache.delete(cacheKey);\n evictVisitedResponseCacheIfNeeded();\n const now = Date.now();\n visitedResponseCache.set(cacheKey, {\n params,\n expiresAt: now + VISITED_RESPONSE_CACHE_TTL,\n response: snapshot,\n });\n}\n\ntype NavigationRequestState = {\n interceptionContext: string | null;\n previousNextUrl: string | null;\n};\n\nfunction getRequestState(\n navigationKind: NavigationKind,\n targetPathname: string,\n previousNextUrlOverride?: string | null,\n traverseHistoryState?: unknown,\n): NavigationRequestState {\n if (previousNextUrlOverride !== undefined) {\n return {\n interceptionContext: resolveInterceptionContextFromPreviousNextUrl(\n previousNextUrlOverride,\n __basePath,\n ),\n previousNextUrl: previousNextUrlOverride,\n };\n }\n\n // Three branches for \"navigate\":\n // 1. previousNextUrl !== null → a committed intercepted navigation set this\n // in browser state (requires proof). This is the proven interception path.\n // 2. route manifest declares current URL can intercept target URL → ask the\n // server for an intercepted payload using manifest route facts only.\n // 3. otherwise, send no interception context.\n switch (navigationKind) {\n case \"navigate\": {\n const currentPreviousNextUrl = getBrowserRouterState().previousNextUrl;\n if (currentPreviousNextUrl !== null) {\n return {\n interceptionContext: resolveInterceptionContextFromPreviousNextUrl(\n currentPreviousNextUrl,\n __basePath,\n ),\n previousNextUrl: currentPreviousNextUrl,\n };\n }\n const manifestInterceptionContext = resolveManifestNavigationInterceptionContext({\n basePath: __basePath,\n currentPathname: window.location.pathname,\n routeManifest: getBrowserRouteManifest(),\n targetPathname,\n });\n if (manifestInterceptionContext !== null) {\n return {\n interceptionContext: manifestInterceptionContext,\n previousNextUrl: window.location.pathname + window.location.search,\n };\n }\n return {\n interceptionContext: null,\n previousNextUrl: null,\n };\n }\n case \"traverse\": {\n const previousNextUrl = readHistoryStatePreviousNextUrl(\n traverseHistoryState ?? window.history.state,\n );\n return {\n interceptionContext: resolveInterceptionContextFromPreviousNextUrl(\n previousNextUrl,\n __basePath,\n ),\n previousNextUrl,\n };\n }\n case \"refresh\": {\n const currentPreviousNextUrl = getBrowserRouterState().previousNextUrl;\n return {\n interceptionContext: resolveInterceptionContextFromPreviousNextUrl(\n currentPreviousNextUrl,\n __basePath,\n ),\n previousNextUrl: currentPreviousNextUrl,\n };\n }\n default: {\n const _exhaustive: never = navigationKind;\n throw new Error(\"[vinext] Unknown navigation kind: \" + String(_exhaustive));\n }\n }\n}\n\n// Dev-only callback invoked when DevRecoveryBoundary catches. The replaced\n// subtree means NavigationCommitSignal's useLayoutEffect never fires, so the\n// URL update for the in-flight navigation would otherwise be lost. Force-drain\n// the queued pre-paint effect for this renderId so the URL still moves to the\n// navigation target, the dev overlay shows which URL is broken, and HMR's\n// rsc:update fetches the right payload after the bug is fixed.\nfunction handleDevRecoveryBoundaryCatch(resetKey: number): void {\n // React's onCaughtError option already routes the error to the dev overlay.\n // Our job here is purely to drive the URL update for the in-flight\n // navigation that this failed render belonged to.\n browserNavigationController.drainPrePaintEffects(resetKey);\n}\n\nfunction isMpaNavigationState(\n value: AppRouterState | Promise<AppRouterState> | MpaNavigationState,\n): value is MpaNavigationState {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"kind\" in value &&\n value.kind === \"mpa-navigation\"\n );\n}\n\nfunction performMpaNavigation(href: string, historyUpdateMode: HistoryUpdateMode): void {\n // Match Next's MPA path by suspending forever, but delay the actual location\n // mutation just enough for the old tree to commit the pending transition\n // signal before unload.\n mpaNavigationScheduler.navigate(window, href, historyUpdateMode);\n}\n\nfunction AppRouterRedirectBridge({ children }: { children?: React.ReactNode }) {\n const router = useRouter();\n\n useEffect(() => {\n const handleUnhandledRedirect = (event: ErrorEvent | PromiseRejectionEvent): void => {\n const error = \"reason\" in event ? event.reason : event.error;\n if (!isRedirectError(error)) return;\n\n const result = decodeRedirectError(error.digest);\n if (!result) return;\n\n event.preventDefault();\n startTransition(() => {\n if (result.type === \"push\") {\n router.push(result.url);\n } else {\n router.replace(result.url);\n }\n });\n };\n\n window.addEventListener(\"error\", handleUnhandledRedirect);\n window.addEventListener(\"unhandledrejection\", handleUnhandledRedirect);\n\n return () => {\n window.removeEventListener(\"error\", handleUnhandledRedirect);\n window.removeEventListener(\"unhandledrejection\", handleUnhandledRedirect);\n };\n }, [router]);\n\n return children ?? null;\n}\n\nfunction decodeAppElementsPromise(payload: Promise<AppWireElements>): Promise<AppElements> {\n // Wrap in Promise.resolve() because createFromReadableStream() returns a\n // React Flight thenable whose .then() returns undefined (not a new Promise).\n // Without the wrap, chaining .then() produces undefined → use() crashes.\n return Promise.resolve(payload).then((elements) => AppElementsWire.decode(elements));\n}\n\nfunction BrowserRoot({\n initialElements,\n initialNavigationSnapshot,\n}: {\n initialElements: Promise<AppElements>;\n initialNavigationSnapshot: ClientNavigationRenderSnapshot;\n}) {\n const resolvedElements = use(initialElements);\n const initialMetadata = AppElementsWire.readMetadata(resolvedElements);\n const [treeStateValue, setTreeStateValue] = useState<\n AppRouterState | Promise<AppRouterState> | MpaNavigationState\n >({\n activeOperation: null,\n elements: resolvedElements,\n interception: initialMetadata.interception,\n interceptionContext: initialMetadata.interceptionContext,\n layoutIds: initialMetadata.layoutIds,\n layoutFlags: initialMetadata.layoutFlags,\n navigationSnapshot: initialNavigationSnapshot,\n previousNextUrl: null,\n renderId: 0,\n rootLayoutTreePath: initialMetadata.rootLayoutTreePath,\n routeId: initialMetadata.routeId,\n slotBindings: initialMetadata.slotBindings,\n visibleCommitVersion: 0,\n });\n if (isMpaNavigationState(treeStateValue)) {\n performMpaNavigation(treeStateValue.href, treeStateValue.historyUpdateMode);\n throw unresolvedMpaNavigation;\n }\n const treeState = isRouterStatePromise(treeStateValue) ? use(treeStateValue) : treeStateValue;\n\n // Keep the latest router state in a ref so external callers (navigate(),\n // server actions, HMR) always read the current state. Safe: those readers\n // run from events/effects, never from React render itself.\n // Note: stateRef.current is written during render, not in an effect, to\n // avoid a stale-read window between commit and layout effects. This mirrors\n // the same render-phase ref update pattern used by Next.js's own router.\n const stateRef = useRef(treeState);\n stateRef.current = treeState;\n\n // Publish the stable ref object and dispatch during layout commit. This keeps\n // the module-level escape hatches aligned with React's committed tree without\n // performing module writes during render. The navigation runtime is registered\n // after hydrateRoot() returns; by then this layout effect has already run for\n // the hydration commit, so getBrowserRouterState() never observes a null ref.\n useLayoutEffect(() => {\n const setAppRouterStateValue = (value: AppRouterState | Promise<AppRouterState>) => {\n setTreeStateValue(value);\n };\n const detach = browserNavigationController.attachBrowserRouterState(\n setAppRouterStateValue,\n stateRef,\n );\n registerNavigationRuntimeFunctions({\n navigateExternal: (href, historyUpdateMode) => {\n setTreeStateValue({\n href,\n historyUpdateMode,\n kind: \"mpa-navigation\",\n });\n return new Promise<void>(() => {});\n },\n });\n browserRouterStateHasEverCommitted = true;\n // App Router uses this timestamp as first committed tree readiness: the\n // browser router state is attached and link/router interactions can safely\n // observe the committed tree. It is intentionally later than hydrateRoot()\n // returning.\n const hydratedAt = performance.now();\n window.__VINEXT_HYDRATED_AT = hydratedAt;\n window.__NEXT_HYDRATED = true;\n window.__NEXT_HYDRATED_AT = hydratedAt;\n window.__NEXT_HYDRATED_CB?.();\n return () => {\n registerNavigationRuntimeFunctions({ navigateExternal: undefined });\n detach();\n setMountedSlotsHeader(null);\n };\n }, [setTreeStateValue]);\n\n useLayoutEffect(() => {\n setMountedSlotsHeader(getMountedSlotIdsHeader(stateRef.current.elements));\n removeStylesheetLinksCoveredByInlineCss();\n getNavigationRuntime()?.functions.pingVisibleLinks?.();\n }, [treeState.elements]);\n\n useLayoutEffect(() => {\n if (treeState.renderId !== 0) {\n return;\n }\n\n replaceHistoryStateWithoutNotify(\n createHistoryStateWithNavigationMetadata(window.history.state, {\n previousNextUrl: treeState.previousNextUrl,\n traversalIndex: currentHistoryTraversalIndex,\n }),\n \"\",\n window.location.href,\n );\n }, [treeState.previousNextUrl, treeState.renderId]);\n\n const routeTree = createElement(\n RedirectBoundary,\n null,\n createElement(\n NavigationCommitSignal,\n { renderId: treeState.renderId },\n createElement(\n ElementsContext.Provider,\n { value: treeState.elements },\n createElement(Slot, { id: treeState.routeId }),\n ),\n ),\n );\n const innerTree = AppRouterContext\n ? createElement(\n AppRouterContext.Provider,\n { value: appRouterInstance },\n createElement(AppRouterRedirectBridge, null, routeTree),\n )\n : routeTree;\n\n // In dev, wrap the route tree in a top-level recovery boundary. A render\n // error (e.g. a slot's RSC reference rejects) is caught here instead of\n // tearing down BrowserRoot, so HMR can dispatch the next payload —\n // identified by an incremented renderId, which doubles as the boundary's\n // reset key — without a full page reload. The dev overlay (a separate\n // React root) shows the error itself.\n //\n // onCatch drains the pending pre-paint effect for the failed render so\n // the URL update bound to that navigation still runs. Without this, a\n // soft-nav whose target throws would leave the browser on the previous\n // URL, hiding which route is broken and mis-targeting the next HMR\n // payload (which fetches RSC for window.location.pathname).\n //\n // This file is .ts, not .tsx — children are passed positionally to satisfy\n // both the createElement overload and eslint's no-children-prop rule.\n const committedTree = import.meta.env.DEV\n ? createElement(\n DevRecoveryBoundary,\n {\n resetKey: treeState.renderId,\n onCatch: handleDevRecoveryBoundaryCatch,\n },\n innerTree,\n )\n : innerTree;\n\n const scrollScopedTree = createElement(\n AppRouterScrollCommitProvider,\n { commitId: treeState.renderId },\n committedTree,\n );\n\n const ClientNavigationRenderContext = getClientNavigationRenderContext();\n if (!ClientNavigationRenderContext) {\n return scrollScopedTree;\n }\n\n return createElement(\n ClientNavigationRenderContext.Provider,\n { value: treeState.navigationSnapshot },\n scrollScopedTree,\n );\n}\n\nfunction restoreHydrationNavigationContext(\n pathname: string,\n searchParams: SearchParamInput,\n params: Record<string, string | string[]>,\n): void {\n setNavigationContext({\n pathname,\n searchParams: new URLSearchParams(searchParams),\n params,\n });\n}\n\nfunction restorePopstateScrollPosition(\n state: unknown,\n options?: {\n shouldContinue?: () => boolean;\n },\n): void {\n const shouldContinue = options?.shouldContinue ?? (() => true);\n if (!shouldContinue()) return;\n\n if (!(state && typeof state === \"object\" && \"__vinext_scrollY\" in state)) {\n if (window.location.hash) {\n scrollToHashTargetOnNextFrame(window.location.hash);\n }\n return;\n }\n\n const y = Number(state.__vinext_scrollY);\n const x = \"__vinext_scrollX\" in state ? Number(state.__vinext_scrollX) : 0;\n\n retryScrollTo(x, y, { shouldContinue });\n}\n\nfunction isSameAppRoutePopstateTarget(href: string): boolean {\n if (!hasBrowserRouterState()) return false;\n\n const target = new URL(href, window.location.origin);\n const routerState = getBrowserRouterState();\n const targetPathname = stripBasePath(target.pathname, __basePath);\n const targetSearch = new URLSearchParams(target.search).toString();\n const currentSearch = routerState.navigationSnapshot.searchParams.toString();\n\n return (\n targetPathname === routerState.navigationSnapshot.pathname && targetSearch === currentSearch\n );\n}\n\n// Set on pagehide so the RSC navigation catch block can distinguish expected\n// fetch aborts (triggered by the unload itself) from real errors worth logging.\nlet isPageUnloading = false;\n\nconst RSC_RELOAD_KEY = \"__vinext_rsc_initial_reload__\";\n\n// sessionStorage can throw SecurityError in strict-mode iframes, storage-\n// disabled browsers, and some Safari private-browsing configurations. Wrap\n// every access so a recovery path for one error does not crash hydration.\nfunction readReloadFlag(): string | null {\n try {\n return sessionStorage.getItem(RSC_RELOAD_KEY);\n } catch {\n return null;\n }\n}\nfunction writeReloadFlag(path: string): void {\n try {\n sessionStorage.setItem(RSC_RELOAD_KEY, path);\n } catch {}\n}\nfunction clearReloadFlag(): void {\n try {\n sessionStorage.removeItem(RSC_RELOAD_KEY);\n } catch {}\n}\n\n// A non-ok or wrong-content-type RSC response during initial hydration means\n// the server cannot deliver a valid RSC payload for this URL. Parsing the\n// response as RSC causes an opaque parse failure. On the first attempt,\n// reload once so the server has a chance to render the correct error page\n// as HTML. On the second attempt (detected via the sessionStorage flag), the\n// endpoint is persistently broken. Returns null so main() aborts the\n// hydration bootstrap without registering RSC navigation globals —\n// including during the brief window between reload() firing and the page\n// actually unloading — so external probes never see a half-hydrated page.\nfunction recoverFromBadInitialRscResponse(reason: string): null {\n const currentPath = window.location.pathname + window.location.search;\n if (readReloadFlag() === currentPath) {\n clearReloadFlag();\n console.error(\n `[vinext] Initial RSC fetch ${reason} after reload; aborting hydration. ` +\n \"Server-rendered HTML remains visible; client components will not hydrate.\",\n );\n return null;\n }\n writeReloadFlag(currentPath);\n // Verify the write persisted. In storage-denied environments (strict-mode\n // iframes, locked-down enterprise policies), every getItem returns null and\n // every setItem silently no-ops, so the reload-loop guard cannot survive\n // the reload — the page would loop forever. Abort instead so the user at\n // least sees the server-rendered HTML.\n if (readReloadFlag() !== currentPath) {\n console.error(\n `[vinext] Initial RSC fetch ${reason}; sessionStorage unavailable so the ` +\n \"reload-loop guard cannot persist — aborting hydration. \" +\n \"Server-rendered HTML remains visible; client components will not hydrate.\",\n );\n return null;\n }\n // One-shot diagnostic so a production reload is traceable. Only fires once\n // per broken path thanks to the sessionStorage flag above; not noisy.\n console.warn(\n `[vinext] Initial RSC fetch ${reason}; reloading once to let the server render the HTML error page`,\n );\n window.location.reload();\n return null;\n}\n\nasync function readInitialRscStream(): Promise<ReadableStream<Uint8Array> | null> {\n const vinext = getVinextBrowserGlobal();\n const runtimeRsc = getNavigationRuntime()?.bootstrap.rsc;\n\n if (runtimeRsc || vinext.__VINEXT_RSC_CHUNKS__ || vinext.__VINEXT_RSC_DONE__) {\n // Reaching the embedded-RSC branch means the server successfully rendered\n // the page — any prior reload flag for this path is stale and must be\n // cleared so a future failure gets its own fresh recovery attempt.\n clearReloadFlag();\n clearHardNavigationLoopGuard();\n\n if (runtimeRsc) {\n applyRuntimeRscBootstrap(runtimeRsc);\n if (runtimeRsc.done) {\n registerNavigationRuntimeBootstrap({ rsc: undefined });\n return chunksToReadableStream(runtimeRsc.rsc);\n }\n // The progressive stream must capture this bootstrap object before any\n // cleanup clears it from the runtime.\n return createProgressiveRscStream();\n }\n\n const params = vinext.__VINEXT_RSC_PARAMS__ ?? {};\n if (vinext.__VINEXT_RSC_PARAMS__) {\n applyClientParams(vinext.__VINEXT_RSC_PARAMS__);\n }\n if (vinext.__VINEXT_RSC_NAV__) {\n restoreHydrationNavigationContext(\n vinext.__VINEXT_RSC_NAV__.pathname,\n vinext.__VINEXT_RSC_NAV__.searchParams,\n params,\n );\n }\n\n return createProgressiveRscStream();\n }\n\n const rscHeaders = createRscRequestHeaders();\n const rscResponse = await fetch(\n await createRscRequestUrl(window.location.pathname + window.location.search, rscHeaders),\n { credentials: \"include\", headers: rscHeaders },\n );\n\n if (!rscResponse.ok) {\n return recoverFromBadInitialRscResponse(`returned ${rscResponse.status}`);\n }\n // Guard against proxies/CDNs that return 200 with a rewritten Content-Type\n // (e.g. text/html instead of text/x-component). Such responses cannot be\n // parsed as RSC and would throw the same opaque parse error this fallback\n // exists to prevent.\n const contentType = rscResponse.headers.get(\"content-type\") ?? \"\";\n if (!contentType.startsWith(VINEXT_RSC_CONTENT_TYPE)) {\n return recoverFromBadInitialRscResponse(\n `returned non-RSC content-type \"${contentType || \"(missing)\"}\"`,\n );\n }\n // Missing body (e.g. 204 No Content, or an edge worker that returned ok\n // headers without piping the stream) fails the same way downstream.\n // Matches Next.js' `!res.body` branch in fetch-server-response.ts.\n if (!rscResponse.body) {\n return recoverFromBadInitialRscResponse(\"returned empty body\");\n }\n // Successful RSC response clears the guard so a subsequent reload of the\n // same path after a transient failure still gets one recovery attempt.\n clearReloadFlag();\n clearHardNavigationLoopGuard();\n\n // Ignore malformed param headers and continue with hydration. The original\n // try/catch also swallowed errors from applyClientParams; preserve that.\n const parsedParams = parseEncodedJsonHeader<Record<string, string | string[]>>(\n rscResponse.headers.get(VINEXT_PARAMS_HEADER),\n );\n const params: Record<string, string | string[]> = parsedParams ?? {};\n if (parsedParams) {\n try {\n applyClientParams(parsedParams);\n } catch {\n // Ignore — matches the previous combined try/catch behavior.\n }\n }\n\n restoreHydrationNavigationContext(window.location.pathname, window.location.search, params);\n\n return rscResponse.body;\n}\n\nfunction applyRuntimeRscBootstrap(rsc: NavigationRuntimeRscBootstrap): void {\n const params = rsc.params ?? {};\n if (rsc.params) {\n applyClientParams(rsc.params);\n }\n if (rsc.nav) {\n restoreHydrationNavigationContext(rsc.nav.pathname, rsc.nav.searchParams, params);\n }\n}\n\nfunction registerServerActionCallback(): void {\n setServerCallback(async (id, args) => {\n syncServerActionHttpFallbackHead(null);\n const temporaryReferences = createTemporaryReferenceSet();\n\n // Carry the interception context + mounted slots from the current router\n // state so the server-action re-render rebuilds the intercepted tree\n // instead of replacing it with the direct page. Parity with Next.js,\n // which sends `Next-URL` on action POSTs when the current tree contains\n // an interception route.\n const actionInitiation = createActionInitiationSnapshot();\n // Keep history aligned with the captured snapshot. Action POST headers\n // read from actionInitiation, not from history, after this point.\n syncCurrentHistoryStatePreviousNextUrl(actionInitiation.routerState.previousNextUrl);\n const body = await encodeReply(args, { temporaryReferences });\n const { headers } = resolveServerActionRequestState({\n actionId: id,\n basePath: __basePath,\n elements: actionInitiation.routerState.elements,\n previousNextUrl: actionInitiation.routerState.previousNextUrl,\n });\n\n const fetchResponse = await fetch(createServerActionRequestUrl(actionInitiation.path), {\n method: \"POST\",\n headers,\n body,\n });\n\n // Surface an `UnrecognizedActionError` so client `catch` blocks can detect\n // client/server deployment skew via `unstable_isUnrecognizedActionError`.\n throwOnServerActionNotFound(fetchResponse, id);\n\n const hasActionRedirect = fetchResponse.headers.has(ACTION_REDIRECT_HEADER);\n const actionRedirectTarget = resolveActionRedirectTarget(fetchResponse);\n if (hasActionRedirect && !actionRedirectTarget) {\n return undefined;\n }\n\n const actionRedirectCompatibilityHardNavigationTarget =\n resolveServerActionRedirectCompatibilityHardNavigationTarget({\n actionRedirectHref: actionRedirectTarget?.href ?? null,\n clientCompatibilityId: CLIENT_RSC_COMPATIBILITY_ID,\n response: fetchResponse,\n });\n if (actionRedirectCompatibilityHardNavigationTarget) {\n clearClientNavigationCaches();\n browserNavigationController.performHardNavigation(\n actionRedirectCompatibilityHardNavigationTarget,\n actionRedirectTarget?.type === \"push\" ? \"assign\" : \"replace\",\n );\n return undefined;\n }\n\n if (\n !actionRedirectTarget &&\n shouldCheckRscCompatibilityForServerActionResponse(fetchResponse) &&\n resolveRscCompatibilityNavigationDecision({\n clientCompatibilityId: CLIENT_RSC_COMPATIBILITY_ID,\n currentHref: actionInitiation.href,\n origin: window.location.origin,\n responseCompatibilityId: fetchResponse.headers.get(VINEXT_RSC_COMPATIBILITY_ID_HEADER),\n responseUrl: fetchResponse.url,\n }).kind === \"hard-navigate\"\n ) {\n browserNavigationController.performHardNavigation(actionInitiation.href);\n return undefined;\n }\n\n const revalidation = parseServerActionRevalidationHeader(fetchResponse.headers);\n const invalidResponseError = await readInvalidServerActionResponseError(\n fetchResponse.clone(),\n actionRedirectTarget !== null,\n );\n if (invalidResponseError) {\n throw invalidResponseError;\n }\n if (\n actionRedirectTarget &&\n !shouldCheckRscCompatibilityForServerActionResponse(fetchResponse)\n ) {\n browserNavigationController.performHardNavigation(actionRedirectTarget.href);\n return undefined;\n }\n const flightResponse =\n fetchResponse.status === 303\n ? new Response(fetchResponse.body, {\n headers: fetchResponse.headers,\n status: 200,\n statusText: \"OK\",\n })\n : fetchResponse;\n const result = await createFromFetch<ServerActionResult | AppWireElements>(\n Promise.resolve(flightResponse),\n { temporaryReferences },\n );\n if (shouldClearClientNavigationCachesForServerActionResult(result, revalidation)) {\n clearClientNavigationCaches();\n }\n\n if (actionRedirectTarget) {\n if (isServerActionResult(result) && result.root !== undefined) {\n const decoded = AppElementsWire.decode(result.root);\n const hashIdx = actionRedirectTarget.href.indexOf(\"#\");\n const hash = hashIdx !== -1 ? actionRedirectTarget.href.slice(hashIdx) : \"\";\n const actionScrollIntent = beginAppRouterScrollIntent(hash || null);\n if (actionRedirectTarget.type === \"push\") {\n saveScrollPosition();\n }\n void renderNavigationPayload(\n Promise.resolve(decoded),\n createClientNavigationRenderSnapshot(\n actionRedirectTarget.href,\n actionInitiation.routerState.navigationSnapshot.params,\n ),\n actionRedirectTarget.href,\n actionInitiation.navigationId,\n actionRedirectTarget.type === \"push\" ? \"push\" : \"replace\",\n {},\n null,\n null,\n FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN,\n actionRedirectTarget.type === \"push\" ? \"navigate\" : \"replace\",\n \"server-action\",\n null,\n actionScrollIntent,\n ).catch(() => {\n browserNavigationController.performHardNavigation(actionRedirectTarget.href);\n });\n // Action redirects must throw a redirect error to abort the action call and\n // propagate the redirect to the caller. Unlike Next.js which can suspend\n // form actions on the client, vinext commits the SPA redirect navigation\n // asynchronously in the background; returning a pending promise would suspend\n // the React tree and block the background navigation's state update from committing.\n throw createServerActionRedirectError(actionRedirectTarget);\n }\n\n browserNavigationController.performHardNavigation(actionRedirectTarget.href);\n return undefined;\n }\n\n const hasSameUrlRerenderPayload = isServerActionResult(result) && result.root !== undefined;\n syncServerActionHttpFallbackHead(hasSameUrlRerenderPayload ? null : fetchResponse.status);\n\n // Server actions stay on the same URL and use commitSameUrlNavigatePayload()\n // for merge-based dispatch. This path does not call\n // activateNavigationSnapshot() because there is no URL change to commit, so\n // hooks continue reading the live external-store values directly. If server\n // actions ever trigger URL changes via RSC payload (instead of hard\n // redirects), this would need renderNavigationPayload().\n if (isServerActionResult(result)) {\n if (result.root !== undefined) {\n const returnValue =\n result.returnValue && !result.returnValue.ok\n ? {\n ok: false,\n data: normalizeServerActionThrownValue(\n result.returnValue.data,\n fetchResponse.status,\n ),\n }\n : result.returnValue;\n return commitSameUrlNavigatePayload(\n Promise.resolve(AppElementsWire.decode(result.root)),\n actionInitiation,\n returnValue,\n revalidation,\n );\n }\n\n if (result.returnValue) {\n if (!result.returnValue.ok) {\n throw normalizeServerActionThrownValue(result.returnValue.data, fetchResponse.status);\n }\n return result.returnValue.data;\n }\n\n return undefined;\n }\n\n return commitSameUrlNavigatePayload(\n Promise.resolve(AppElementsWire.decode(result)),\n actionInitiation,\n undefined,\n revalidation,\n );\n });\n}\n\nasync function main(): Promise<void> {\n registerServerActionCallback();\n\n const rscStream = await readInitialRscStream();\n // null signals that readInitialRscStream aborted hydration — either because\n // a reload is in flight (first-attempt recovery) or the endpoint is\n // persistently broken (post-reload). Bootstrap is a separate synchronous\n // helper so the null-branch structurally cannot reach any RSC bootstrap\n // global assignment, even if a future refactor interposes async work here.\n if (rscStream === null) return;\n bootstrapHydration(rscStream);\n}\n\nfunction bootstrapHydration(rscStream: ReadableStream<Uint8Array>): void {\n if (import.meta.env.DEV) {\n installDevErrorOverlay();\n }\n\n const root = decodeAppElementsPromise(createFromReadableStream<AppWireElements>(rscStream));\n const initialNavigationSnapshot = createClientNavigationRenderSnapshot(\n window.location.href,\n latestClientParams,\n );\n replaceHistoryStateWithoutNotify(\n createHistoryStateWithNavigationMetadata(window.history.state, {\n previousNextUrl: null,\n traversalIndex: currentHistoryTraversalIndex,\n }),\n \"\",\n window.location.href,\n );\n\n // In dev we route uncaught errors into the dev overlay rather than the\n // hard-nav recovery: the overlay is what the developer needs to see, and a\n // recovery nav would wipe it. In prod we keep the recovery hard-nav so the\n // user lands on a renderable URL with the actual error UI.\n const onUncaughtError = import.meta.env.DEV\n ? devOnUncaughtError\n : createOnUncaughtError(() => pendingNavigationRecoveryHref);\n const formState = consumeInitialFormState(getVinextBrowserGlobal());\n const hydrateRootOptions = import.meta.env.DEV\n ? createVinextHydrateRootOptions({\n formState,\n onCaughtError: devOnCaughtError,\n onUncaughtError,\n })\n : createVinextHydrateRootOptions({\n formState,\n onUncaughtError,\n });\n window.__VINEXT_RSC_ROOT__ = hydrateRootInTransition({\n children: createElement(BrowserRoot, {\n initialElements: root,\n initialNavigationSnapshot,\n }),\n container: document,\n hydrateRoot,\n options: hydrateRootOptions,\n startTransition,\n });\n\n const navigateRsc: NavigationRuntimeNavigate = async function navigateRsc(\n href: string,\n redirectDepth = 0,\n navigationKind: NavigationKind = \"navigate\",\n historyUpdateMode?: HistoryUpdateMode,\n previousNextUrlOverride?: string | null,\n programmaticTransition = false,\n traversalIntent?: HistoryTraversalIntent,\n scrollIntent?: AppRouterScrollIntent | null,\n ): Promise<void> {\n let pendingRouterState: PendingBrowserRouterState | null = null;\n // Hoist navId above try so the catch and finally blocks can reference it.\n const navId = browserNavigationController.beginNavigation();\n discardedServerActionRefreshScheduler.markNavigationStart();\n\n // Loop variables for inline redirect following. On a redirect, these are\n // updated and the loop continues without returning or re-entering navigateRsc,\n // so a single pendingRouterState spans all hops and isPending never flashes.\n let currentHref = href;\n let currentHistoryMode = historyUpdateMode;\n let currentPrevNextUrl = previousNextUrlOverride;\n let redirectCount = redirectDepth;\n let detachedNavigationCommits = false;\n const activeTraversalIntent =\n navigationKind === \"traverse\"\n ? (traversalIntent ??\n resolveHistoryTraversalIntent({\n currentHistoryIndex: currentHistoryTraversalIndex,\n historyState: window.history.state,\n }))\n : null;\n const performHardNavigationForScrollIntent = (targetHref: string): boolean => {\n consumeAppRouterScrollIntent(scrollIntent ?? null);\n return browserNavigationController.performHardNavigation(targetHref);\n };\n\n try {\n const shouldUsePendingRouterState = programmaticTransition;\n if (shouldUsePendingRouterState && hasBrowserRouterState()) {\n pendingRouterState = beginPendingBrowserRouterState();\n } else {\n await waitForBrowserRouterStateReady();\n if (!browserNavigationController.isCurrentNavigation(navId)) return;\n\n if (shouldUsePendingRouterState) {\n pendingRouterState = beginPendingBrowserRouterState();\n }\n }\n\n while (true) {\n const url = new URL(currentHref, window.location.origin);\n const requestState = getRequestState(\n navigationKind,\n url.pathname,\n currentPrevNextUrl,\n activeTraversalIntent?.historyState,\n );\n const requestInterceptionContext = requestState.interceptionContext;\n const requestPreviousNextUrl = requestState.previousNextUrl;\n if (navigationKind === \"refresh\") {\n syncCurrentHistoryStatePreviousNextUrl(requestPreviousNextUrl);\n }\n\n // Set this navigation as the pending pathname, overwriting any previous.\n // Pass navId so only this navigation (or a newer one) can clear it later.\n setPendingPathname(url.pathname, navId);\n\n const elementsAtNavStart = getBrowserRouterState().elements;\n const mountedSlotsHeader = getMountedSlotIdsHeader(elementsAtNavStart);\n const requestHeaders = createRscRequestHeaders({\n interceptionContext: requestInterceptionContext,\n renderMode:\n navigationKind === \"refresh\" ? APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI : undefined,\n });\n if (mountedSlotsHeader) {\n requestHeaders.set(VINEXT_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);\n }\n const rscUrl = await createRscRequestUrl(url.pathname + url.search, requestHeaders);\n const cachedRoute = getVisitedResponse(\n rscUrl,\n requestInterceptionContext,\n mountedSlotsHeader,\n navigationKind,\n );\n if (cachedRoute) {\n const compatibilityDecision = resolveRscCompatibilityNavigationDecision({\n clientCompatibilityId: CLIENT_RSC_COMPATIBILITY_ID,\n currentHref,\n origin: window.location.origin,\n responseCompatibilityId: cachedRoute.response.compatibilityIdHeader,\n responseUrl: cachedRoute.response.url,\n });\n if (compatibilityDecision.kind === \"hard-navigate\") {\n performHardNavigationForScrollIntent(compatibilityDecision.hardNavigationTarget);\n return;\n }\n // Check stale-navigation before and after createFromFetch. The pre-check\n // avoids wasted parse work; the post-check catches supersessions that\n // occur during the await. createFromFetch on a buffered response is fast\n // but still async, so the window exists. The non-cached path (below) places\n // its heavyweight async steps (fetch, body.tee + createFromFetch on the\n // live RSC branch) between navId checks consistently; the cached path omits\n // the check between createClientNavigationRenderSnapshot (synchronous) and\n // createFromFetch because there is no await in that gap.\n if (!browserNavigationController.isCurrentNavigation(navId)) return;\n const cachedParams = cachedRoute.params;\n // createClientNavigationRenderSnapshot is synchronous (URL parsing + param\n // wrapping only) — no stale-navigation recheck needed between here and the\n // next await.\n const cachedNavigationSnapshot = createClientNavigationRenderSnapshot(\n currentHref,\n cachedParams,\n );\n const cachedPayload = decodeAppElementsPromise(\n createFromFetch<AppWireElements>(\n Promise.resolve(restoreRscResponse(cachedRoute.response)),\n ),\n );\n if (!browserNavigationController.isCurrentNavigation(navId)) return;\n await renderNavigationPayload(\n cachedPayload,\n cachedNavigationSnapshot,\n currentHref,\n navId,\n currentHistoryMode,\n cachedParams,\n requestPreviousNextUrl,\n detachedNavigationCommits ? null : pendingRouterState,\n VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN,\n toActionType(navigationKind),\n toOperationLane(navigationKind),\n activeTraversalIntent,\n scrollIntent,\n );\n return;\n }\n\n // Continue using the slot state captured at navigation start for fetches\n // and prefetch compatibility decisions.\n\n let navResponse: Response | undefined;\n let navResponseUrl: string | null = null;\n if (navigationKind !== \"refresh\") {\n const prefetchedResponse = await consumePrefetchResponseForNavigation(\n rscUrl,\n requestInterceptionContext,\n mountedSlotsHeader,\n {\n shouldConsume: () => browserNavigationController.isCurrentNavigation(navId),\n },\n );\n if (!browserNavigationController.isCurrentNavigation(navId)) return;\n if (prefetchedResponse) {\n navResponse = restoreRscResponse(prefetchedResponse, false);\n navResponseUrl = prefetchedResponse.url;\n }\n }\n\n if (!navResponse && navigationKind === \"navigate\") {\n const routeManifest = getBrowserRouteManifest();\n await learnOptimisticRouteTemplatesFromPrefetchCache({\n interceptionContext: requestInterceptionContext,\n mountedSlotsHeader,\n routeManifest,\n });\n if (!browserNavigationController.isCurrentNavigation(navId)) return;\n\n if (routeManifest !== null) {\n const optimisticPayload = resolveOptimisticNavigationPayload({\n basePath: __basePath,\n href: currentHref,\n interceptionContext: requestInterceptionContext,\n mountedSlotsHeader,\n routeManifest,\n templates: optimisticRouteTemplates,\n });\n\n if (optimisticPayload !== null) {\n detachedNavigationCommits = true;\n const optimisticNavigationSnapshot = createClientNavigationRenderSnapshot(\n currentHref,\n optimisticPayload.params,\n );\n // The optimistic shell is a detached commit for this navigation.\n // It uses the same navId gate as the real payload, while the real\n // payload skips pending-router-state reuse via\n // detachedNavigationCommits. That keeps late optimistic errors or\n // transitions from mutating a newer navigation or sharing mutable\n // pending state with the authoritative render.\n void renderNavigationPayload(\n Promise.resolve(optimisticPayload.elements),\n optimisticNavigationSnapshot,\n currentHref,\n navId,\n currentHistoryMode,\n optimisticPayload.params,\n requestPreviousNextUrl,\n null,\n FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN,\n toActionType(navigationKind),\n toOperationLane(navigationKind),\n activeTraversalIntent,\n scrollIntent,\n ).catch((error) => {\n if (browserNavigationController.isCurrentNavigation(navId)) {\n console.error(\"[vinext] Optimistic RSC navigation error:\", error);\n }\n });\n }\n }\n }\n\n if (!navResponse) {\n navResponse = await fetch(rscUrl, {\n headers: requestHeaders,\n credentials: \"include\",\n });\n }\n\n if (!browserNavigationController.isCurrentNavigation(navId)) return;\n\n // Any response that isn't a valid RSC payload (non-ok status,\n // missing/rewritten Content-Type, or missing body) means the server\n // returned something we cannot parse — typically an HTML error page\n // or a proxy-rewritten response. Parsing such a body as an RSC stream\n // throws a cryptic \"Connection closed\" error. Match Next.js behavior\n // (fetch-server-response.ts:211, `!isFlightResponse || !res.ok || !res.body`):\n // hard-navigate to the response URL so the server can render the correct\n // error page as HTML. The outer finally handles\n // settlePendingBrowserRouterState and clearPendingPathname on this\n // return path.\n //\n // Prefer the post-redirect response URL over `currentHref`: on a\n // redirect chain like `/old` → 307 → `/new` → 500, the browser's\n // fetch already followed the redirect, so `navResponse.url` is the\n // failing `/new` destination. Hard-navigating there directly avoids\n // bouncing off `/old` just to re-follow the same 307, which would\n // flash the wrong URL in the address bar and mis-key analytics.\n // Matches Next.js' `doMpaNavigation(responseUrl.toString())`. Falls\n // back to `currentHref` when no response URL is available.\n const navContentType = navResponse.headers.get(\"content-type\") ?? \"\";\n const isRscResponse = navContentType.startsWith(\"text/x-component\");\n if (!navResponse.ok || !isRscResponse || !navResponse.body) {\n const responseUrl = navResponseUrl ?? navResponse.url;\n performHardNavigationForScrollIntent(\n resolveHardNavigationTargetFromRscResponse(\n responseUrl,\n currentHref,\n window.location.origin,\n ),\n );\n return;\n }\n\n const compatibilityDecision = resolveRscCompatibilityNavigationDecision({\n clientCompatibilityId: CLIENT_RSC_COMPATIBILITY_ID,\n currentHref,\n origin: window.location.origin,\n responseCompatibilityId: navResponse.headers.get(VINEXT_RSC_COMPATIBILITY_ID_HEADER),\n responseUrl: navResponseUrl ?? navResponse.url,\n });\n if (compatibilityDecision.kind === \"hard-navigate\") {\n performHardNavigationForScrollIntent(compatibilityDecision.hardNavigationTarget);\n return;\n }\n\n const redirectDecision = resolveRscRedirectLifecycleHop({\n currentHref,\n historyUpdateMode: currentHistoryMode ?? \"replace\",\n origin: window.location.origin,\n redirectDepth: redirectCount,\n requestPreviousNextUrl,\n responseUrl: navResponseUrl ?? navResponse.url,\n });\n\n if (redirectDecision.kind === \"terminal-hard-navigation\") {\n if (redirectDecision.reason === \"maxRedirectsExceeded\") {\n console.error(\n \"[vinext] Too many RSC redirects — aborting navigation to prevent infinite loop.\",\n );\n }\n performHardNavigationForScrollIntent(redirectDecision.href);\n return;\n }\n\n if (redirectDecision.kind === \"follow\") {\n // Server-side redirect: keep the redirect chain inside this operation\n // and defer URL/history mutation to the eventual approved commit.\n // This keeps isPending true across all hops and avoids publishing a\n // destination URL before its RSC payload is lifecycle-approved.\n currentHref = redirectDecision.href;\n currentHistoryMode = redirectDecision.historyUpdateMode;\n currentPrevNextUrl = redirectDecision.previousNextUrl;\n redirectCount = redirectDecision.redirectDepth;\n continue;\n }\n\n // RSC redirect encoded as 200 + flight payload (the server's response\n // for `redirect()` thrown from a server component during RSC rendering;\n // see issue #1347 and `buildAppPageSpecialErrorResponse`). The flight\n // body carries the canonical `NEXT_REDIRECT;...` digest for clients\n // that decode it through React's RedirectBoundary, but vinext's\n // browser-navigation loop catches it ahead of decode via this\n // side-channel header so the redirect-following loop above can drain\n // the body and continue without bouncing through the catch path.\n // Reusing the same loop variables keeps `pendingRouterState` and the\n // outer `useTransition` pending state continuous across the hop —\n // matching the pre-1347 fetch-auto-follow-307 behavior.\n const flightRedirectTarget = navResponse.headers.get(VINEXT_RSC_REDIRECT_HEADER);\n if (flightRedirectTarget) {\n // Drain the response body so the underlying connection is released.\n // We do this best-effort: the destination's `.rsc` fetch on the next\n // loop iteration will replace this response entirely.\n void navResponse.body?.cancel().catch(() => {});\n const resolvedTarget = new URL(flightRedirectTarget, window.location.origin);\n if (resolvedTarget.origin !== window.location.origin) {\n performHardNavigationForScrollIntent(resolvedTarget.href);\n return;\n }\n if (redirectCount >= MAX_RSC_REDIRECT_DEPTH) {\n console.error(\n \"[vinext] Too many RSC redirects — aborting navigation to prevent infinite loop.\",\n );\n performHardNavigationForScrollIntent(resolvedTarget.href);\n return;\n }\n currentHref = `${resolvedTarget.pathname}${resolvedTarget.search}${resolvedTarget.hash}`;\n redirectCount += 1;\n continue;\n }\n\n // navParams falls back to {} on a missing or malformed header.\n const navParams: Record<string, string | string[]> =\n parseEncodedJsonHeader<Record<string, string | string[]>>(\n navResponse.headers.get(VINEXT_PARAMS_HEADER),\n ) ?? {};\n // Build snapshot from local params, not latestClientParams\n const navigationSnapshot = createClientNavigationRenderSnapshot(currentHref, navParams);\n\n // Tee the response body so React can consume it incrementally —\n // shell parses fast, and any Suspense boundary inside (e.g. the\n // route's loading.tsx) shows its fallback while the rest of the\n // RSC stream resolves. Buffering with `await response.arrayBuffer()`\n // here would block the commit until the page's slowest server\n // promise resolved, hiding the loading state entirely.\n //\n // The cache branch is read in the background so the visited-\n // response snapshot lands as soon as the full stream completes,\n // without holding up React's commit.\n const navBody = navResponse.body;\n if (!navBody) {\n // Already validated above (`!navResponse.body` triggers a hard\n // navigation), so this branch is unreachable — kept for type\n // narrowing only.\n return;\n }\n const [reactBranch, cacheBranch] = navBody.tee();\n const reactResponse = new Response(reactBranch, {\n status: navResponse.status,\n headers: navResponse.headers,\n });\n const cacheBufferPromise = new Response(cacheBranch).arrayBuffer();\n\n if (!browserNavigationController.isCurrentNavigation(navId)) return;\n\n const rscPayload = decodeAppElementsPromise(\n createFromFetch<AppWireElements>(Promise.resolve(reactResponse)),\n );\n\n if (!browserNavigationController.isCurrentNavigation(navId)) return;\n\n const renderOutcome = await renderNavigationPayload(\n rscPayload,\n navigationSnapshot,\n currentHref,\n navId,\n currentHistoryMode,\n navParams,\n requestPreviousNextUrl,\n detachedNavigationCommits ? null : pendingRouterState,\n FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN,\n toActionType(navigationKind),\n toOperationLane(navigationKind),\n activeTraversalIntent,\n scrollIntent,\n );\n if (renderOutcome !== \"committed\") return;\n // Don't cache the response if this navigation was superseded during\n // renderNavigationPayload's await — the elements were never dispatched.\n if (!browserNavigationController.isCurrentNavigation(navId)) return;\n // Store the visited response only after renderNavigationPayload succeeds.\n // If we stored it before and renderNavigationPayload threw, a future\n // back/forward navigation could replay a snapshot from a navigation that\n // never actually rendered successfully.\n const resolvedElements = await rscPayload;\n const metadata = AppElementsWire.readMetadata(resolvedElements);\n if (!isCacheRestorableAppPayloadMetadata(metadata)) {\n void cacheBufferPromise.catch(() => {});\n return;\n }\n void cacheBufferPromise\n .then((cacheBuffer) => {\n storeVisitedResponseSnapshot(\n rscUrl,\n resolveVisitedResponseInterceptionContext(\n requestInterceptionContext,\n metadata.interceptionContext,\n ),\n createCachedRscResponseSnapshot(navResponse, cacheBuffer, navResponseUrl),\n navParams,\n );\n })\n .catch(() => {});\n return;\n }\n } catch (error) {\n // Don't hard-navigate to a stale URL if this navigation was superseded by\n // a newer one — the newer navigation is already in flight and would be clobbered.\n if (!browserNavigationController.isCurrentNavigation(navId)) return;\n // Suppress the diagnostic when the page is unloading: a hard-nav or anchor\n // click tears down the document and aborts any in-flight RSC fetch, which\n // surfaces here as an error. The page is already going away, so the log\n // is just noise. Mirrors Next.js' isPageUnloading pattern.\n if (!isPageUnloading) {\n console.error(\"[vinext] RSC navigation error:\", error);\n }\n performHardNavigationForScrollIntent(currentHref);\n } finally {\n // Single settlement site: covers normal return, early returns on stale-id\n // checks, and error paths. The finally runs even when the catch returns.\n // settlePendingBrowserRouterState is idempotent via the settled flag.\n browserNavigationController.finalizeNavigation(navId, pendingRouterState);\n discardedServerActionRefreshScheduler.markNavigationSettled();\n }\n };\n\n // Exposed through one typed runtime seam so next/navigation, Link, Form, and\n // the browser entry share a single App Router capability contract.\n registerNavigationRuntimeFunctions({\n clearNavigationCaches: clearClientNavigationCaches,\n commitHashNavigation: commitHashOnlyNavigation,\n navigate: navigateRsc,\n });\n\n if (\"scrollRestoration\" in history) {\n history.scrollRestoration = \"manual\";\n }\n\n // Note: This popstate handler runs for App Router (RSC navigation available).\n // It coordinates scroll restoration with the pending RSC navigation.\n // Pages Router scroll restoration is handled in shims/navigation.ts:1289 with\n // microtask-based deferral for compatibility with non-RSC navigation.\n // See: https://github.com/vercel/next.js/discussions/41934#discussioncomment-4602607\n const handlePopstate = createPopstateRestoreHandler({\n getActiveNavigationId: browserNavigationController.getActiveNavigationId.bind(\n browserNavigationController,\n ),\n getPendingNavigation: () => window.__VINEXT_RSC_PENDING__,\n getNavigate: () => getNavigationRuntime()?.functions.navigate,\n isCurrentNavigation: browserNavigationController.isCurrentNavigation.bind(\n browserNavigationController,\n ),\n notifyAppRouterTransitionStart: (href) => {\n notifyAppRouterTransitionStart(href, \"traverse\");\n },\n restorePopstateScrollPosition,\n setPendingNavigation: (pendingNavigation) => {\n window.__VINEXT_RSC_PENDING__ = pendingNavigation;\n },\n });\n\n window.addEventListener(\"popstate\", (event) => {\n // The browser has already applied the history entry by the time popstate\n // fires. App Router state does not include hashes, so matching the\n // committed pathname/search proves this traversal does not need a new RSC\n // payload. This covers both /page#target -> /page and /page -> /page#target.\n // Notify the transition start so observers still see the URL change, then\n // restore scroll directly and skip the RSC dispatch.\n const href = window.location.href;\n if (isSameAppRoutePopstateTarget(href)) {\n notifyAppRouterTransitionStart(href, \"traverse\");\n commitTraversalIndexFromHistoryState(event.state);\n restorePopstateScrollPosition(event.state);\n return;\n }\n handlePopstate(event);\n });\n\n if (import.meta.hot) {\n const handleRscUpdate = async (): Promise<void> => {\n try {\n // If BrowserRoot has been mounted before but isn't now, a render\n // error tore down the tree (e.g. a server route threw). HMR can't\n // dispatch into a missing setter, and waitForBrowserRouterStateReady\n // would block forever — the tree won't remount until the page reloads.\n // Trigger that reload so the user's fix actually lands without a\n // manual refresh. Cleared after a successful mount, so this only\n // fires once per teardown.\n if (\n browserRouterStateHasEverCommitted &&\n !browserNavigationController.hasBrowserRouterState()\n ) {\n window.location.reload();\n return;\n }\n // HMR can also fire before BrowserRoot's layout effect publishes\n // the browser router state (e.g. saving a file while the initial RSC\n // stream is still suspended). Wait for readiness, then re-check the\n // mounted state — readiness can race with cleanup, which nulls it again.\n // Skip silently when the tree is not currently mounted; the next\n // HMR push or full reload will reconcile.\n await waitForBrowserRouterStateReady();\n if (!browserNavigationController.hasBrowserRouterState()) {\n return;\n }\n clearClientNavigationCaches();\n const navigationSnapshot = createClientNavigationRenderSnapshot(\n window.location.href,\n latestClientParams,\n );\n // Clear stale errors from the dev overlay before dispatching the\n // fresh tree. If the new tree renders cleanly, the overlay stays\n // empty; if it throws again, devOnCaughtError/devOnUncaughtError\n // re-populates it. Without this, an old \"DropZone is not defined\"\n // error would linger after the developer fixed the bug.\n dismissOverlay();\n // Interception context on HMR re-renders is intentionally deferred:\n // preserving intercepted modal state across HMR reloads is out of scope\n // for the previousNextUrl mechanism.\n const hmrHeaders = createRscRequestHeaders();\n await browserNavigationController.hmrReplaceTree(\n decodeAppElementsPromise(\n createFromFetch<AppWireElements>(\n fetch(\n await createRscRequestUrl(\n window.location.pathname + window.location.search,\n hmrHeaders,\n ),\n { headers: hmrHeaders },\n ),\n ),\n ),\n navigationSnapshot,\n );\n } catch (error) {\n console.error(\"[vinext] RSC HMR error:\", error);\n }\n };\n\n import.meta.hot.on(\"rsc:update\", () => {\n void handleRscUpdate();\n });\n }\n}\n\nif (typeof document !== \"undefined\") {\n // Install `window.next` as early as possible so any client component that\n // synchronously dereferences it during hydration (or any third-party\n // library script tag that loads before the React tree mounts) sees the\n // expected shape. Mirrors Next.js's app-bootstrap.ts (line 13) which sets\n // `window.next = { version, appDir: true }` before the React runtime\n // initializes, and `app-router-instance.ts` (line 510) which assigns\n // `router: publicAppRouterInstance` at module load.\n installWindowNext({ appDir: true, router: appRouterInstance });\n\n window.addEventListener(\"pagehide\", () => {\n isPageUnloading = true;\n });\n // Reset on pageshow so a bfcache-restored document does not resume with\n // the flag stuck at true, which would silently swallow every subsequent\n // RSC navigation error for the lifetime of that tab. Matches Next.js'\n // fetch-server-response.ts handler pair.\n window.addEventListener(\"pageshow\", (event) => {\n isPageUnloading = false;\n if (event.persisted) {\n mpaNavigationScheduler.reset();\n }\n });\n void main();\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-browser-error.js","names":[],"sources":["../../src/server/app-browser-error.ts"],"sourcesContent":["// Build the onUncaughtError handler for hydrateRoot. When a render error\n// tears down the tree without an error boundary catching, the\n// NavigationCommitSignal layout effect never runs, so the URL update for\n// the in-flight navigation is lost — the user sees a blank page on the\n// previous URL. Hard-navigate to the intended target so the server can\n// render its actual error UI for that route. getRecoveryHref reads the\n// in-flight navigation target and returns null when nothing is pending\n// (e.g. an error during initial hydration).\n//\n// This is the *prod* handler. The dev variant lives in dev-error-overlay.tsx\n// alongside the rest of the dev-only overlay code so the entire overlay\n// module — including its React component tree, createRoot import, and inline\n// CSS — is structurally unreachable in production builds.\nexport function createOnUncaughtError(\n getRecoveryHref: () => string | null,\n): (error: unknown, errorInfo: { componentStack?: string }) => void {\n return (error, errorInfo) => {\n console.error(error);\n if (errorInfo?.componentStack) {\n console.error(\"The above error occurred in a React component:\\n\" + errorInfo.componentStack);\n }\n const recoveryHref = getRecoveryHref();\n if (recoveryHref !== null) {\n window.location.assign(recoveryHref);\n }\n };\n}\n"],"mappings":";AAaA,SAAgB,sBACd,iBACkE;CAClE,QAAQ,OAAO,cAAc;EAC3B,QAAQ,MAAM,MAAM;EACpB,IAAI,WAAW,gBACb,QAAQ,MAAM,qDAAqD,UAAU,eAAe;EAE9F,MAAM,eAAe,iBAAiB;EACtC,IAAI,iBAAiB,MACnB,OAAO,SAAS,OAAO,aAAa"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-browser-hydration.js","names":[],"sources":["../../src/server/app-browser-hydration.ts"],"sourcesContent":["import type { hydrateRoot, ReactFormState } from \"react-dom/client\";\n\ntype HydrateRootOptions = NonNullable<Parameters<typeof hydrateRoot>[2]>;\ntype HydrateRoot = typeof hydrateRoot;\ntype HydrateRootContainer = Parameters<HydrateRoot>[0];\ntype HydrateRootChildren = Parameters<HydrateRoot>[1];\ntype HydrateRootReturn = ReturnType<HydrateRoot>;\ntype HydrateRootCaughtErrorHandler = NonNullable<HydrateRootOptions[\"onCaughtError\"]>;\ntype HydrateRootUncaughtErrorHandler = NonNullable<HydrateRootOptions[\"onUncaughtError\"]>;\ntype StartTransition = (action: () => void) => void;\n\nexport const RSC_FORM_STATE_GLOBAL = \"__VINEXT_RSC_FORM_STATE__\";\n\ntype FormStateGlobal = {\n [RSC_FORM_STATE_GLOBAL]?: ReactFormState;\n};\n\nexport function consumeInitialFormState(global: FormStateGlobal): ReactFormState | null {\n const formState = global[RSC_FORM_STATE_GLOBAL] ?? null;\n delete global[RSC_FORM_STATE_GLOBAL];\n return formState;\n}\n\nexport function createVinextHydrateRootOptions(options: {\n formState: ReactFormState | null;\n onCaughtError?: HydrateRootCaughtErrorHandler;\n onUncaughtError: HydrateRootUncaughtErrorHandler;\n}): HydrateRootOptions {\n const hydrateOptions = {\n formState: options.formState,\n onUncaughtError: options.onUncaughtError,\n };\n\n if (options.onCaughtError) {\n return {\n ...hydrateOptions,\n onCaughtError: options.onCaughtError,\n };\n }\n\n return hydrateOptions;\n}\n\nexport function hydrateRootInTransition(options: {\n children: HydrateRootChildren;\n container: HydrateRootContainer;\n hydrateRoot: HydrateRoot;\n options: HydrateRootOptions;\n startTransition: StartTransition;\n}): HydrateRootReturn {\n let root: HydrateRootReturn | undefined;\n\n options.startTransition(() => {\n root = options.hydrateRoot(options.container, options.children, options.options);\n });\n\n if (root === undefined) {\n throw new Error(\"[vinext] React.startTransition did not synchronously start hydration\");\n }\n\n return root;\n}\n"],"mappings":";AAWA,MAAa,wBAAwB;AAMrC,SAAgB,wBAAwB,QAAgD;CACtF,MAAM,YAAY,OAAA,gCAAiC;CACnD,OAAO,OAAO;CACd,OAAO;;AAGT,SAAgB,+BAA+B,SAIxB;CACrB,MAAM,iBAAiB;EACrB,WAAW,QAAQ;EACnB,iBAAiB,QAAQ;EAC1B;CAED,IAAI,QAAQ,eACV,OAAO;EACL,GAAG;EACH,eAAe,QAAQ;EACxB;CAGH,OAAO;;AAGT,SAAgB,wBAAwB,SAMlB;CACpB,IAAI;CAEJ,QAAQ,sBAAsB;EAC5B,OAAO,QAAQ,YAAY,QAAQ,WAAW,QAAQ,UAAU,QAAQ,QAAQ;GAChF;CAEF,IAAI,SAAS,KAAA,GACX,MAAM,IAAI,MAAM,uEAAuE;CAGzF,OAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-browser-interception-context.js","names":[],"sources":["../../src/server/app-browser-interception-context.ts"],"sourcesContent":["import type { RouteManifest } from \"../routing/app-route-graph.js\";\nimport { matchRoutePattern, matchRoutePatternPrefix } from \"../routing/route-pattern.js\";\nimport { splitPathnameForRouteMatch } from \"../routing/utils.js\";\nimport { stripBasePath } from \"../utils/base-path.js\";\n\ntype ResolveManifestNavigationInterceptionContextOptions = {\n basePath: string;\n currentPathname: string;\n routeManifest: RouteManifest | null;\n targetPathname: string;\n};\n\n/**\n * Resolve the first-hop interception context from declared route topology.\n *\n * This is intentionally manifest-only: it lets a normal browser navigation\n * ask the server for an intercepted payload when the current URL is a declared\n * interception source for the target URL, without reintroducing snapshot\n * topology as route/layout/slot authority.\n *\n * When multiple manifest interceptions match, the first one wins. That order\n * is owned by the deterministic route graph builder.\n */\nexport function resolveManifestNavigationInterceptionContext(\n options: ResolveManifestNavigationInterceptionContextOptions,\n): string | null {\n if (options.routeManifest === null) return null;\n\n const currentPathname = stripBasePath(options.currentPathname, options.basePath);\n const targetPathname = stripBasePath(options.targetPathname, options.basePath);\n const sourceParts = splitPathnameForRouteMatch(currentPathname);\n const targetParts = splitPathnameForRouteMatch(targetPathname);\n\n for (const interception of options.routeManifest.segmentGraph.interceptions.values()) {\n if (!matchRoutePatternPrefix(sourceParts, interception.sourcePatternParts)) continue;\n if (matchRoutePattern(targetParts, interception.targetPatternParts) === null) continue;\n return currentPathname;\n }\n\n return null;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAuBA,SAAgB,6CACd,SACe;CACf,IAAI,QAAQ,kBAAkB,MAAM,OAAO;CAE3C,MAAM,kBAAkB,cAAc,QAAQ,iBAAiB,QAAQ,SAAS;CAChF,MAAM,iBAAiB,cAAc,QAAQ,gBAAgB,QAAQ,SAAS;CAC9E,MAAM,cAAc,2BAA2B,gBAAgB;CAC/D,MAAM,cAAc,2BAA2B,eAAe;CAE9D,KAAK,MAAM,gBAAgB,QAAQ,cAAc,aAAa,cAAc,QAAQ,EAAE;EACpF,IAAI,CAAC,wBAAwB,aAAa,aAAa,mBAAmB,EAAE;EAC5E,IAAI,kBAAkB,aAAa,aAAa,mBAAmB,KAAK,MAAM;EAC9E,OAAO;;CAGT,OAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-browser-mpa-navigation.js","names":["#pendingNavigation","#nextToken"],"sources":["../../src/server/app-browser-mpa-navigation.ts"],"sourcesContent":["import type { HistoryUpdateMode } from \"./app-browser-navigation-controller.js\";\n\nexport type AppBrowserMpaNavigationWindow = {\n location: Pick<Location, \"assign\" | \"replace\">;\n requestAnimationFrame?: (callback: FrameRequestCallback) => unknown;\n setTimeout(callback: () => void, timeout: number): unknown;\n};\n\ntype PendingMpaNavigation = {\n href: string;\n historyUpdateMode: HistoryUpdateMode;\n token: number;\n};\n\nexport class AppBrowserMpaNavigationScheduler {\n #pendingNavigation: PendingMpaNavigation | null = null;\n #nextToken = 0;\n\n reset(): void {\n this.#pendingNavigation = null;\n }\n\n navigate(\n targetWindow: AppBrowserMpaNavigationWindow,\n href: string,\n historyUpdateMode: HistoryUpdateMode,\n ): void {\n const pendingNavigation = this.#pendingNavigation;\n if (\n pendingNavigation?.href === href &&\n pendingNavigation.historyUpdateMode === historyUpdateMode\n ) {\n return;\n }\n\n const token = this.#nextToken + 1;\n this.#nextToken = token;\n this.#pendingNavigation = { href, historyUpdateMode, token };\n\n const navigate = () => {\n const currentNavigation = this.#pendingNavigation;\n if (\n currentNavigation?.href !== href ||\n currentNavigation.historyUpdateMode !== historyUpdateMode ||\n currentNavigation.token !== token\n ) {\n return;\n }\n\n if (historyUpdateMode === \"replace\") {\n targetWindow.location.replace(href);\n } else {\n targetWindow.location.assign(href);\n }\n };\n\n if (typeof targetWindow.requestAnimationFrame === \"function\") {\n targetWindow.requestAnimationFrame(() => {\n targetWindow.setTimeout(navigate, 0);\n });\n return;\n }\n\n targetWindow.setTimeout(navigate, 0);\n }\n}\n"],"mappings":";AAcA,IAAa,mCAAb,MAA8C;CAC5C,qBAAkD;CAClD,aAAa;CAEb,QAAc;EACZ,KAAKA,qBAAqB;;CAG5B,SACE,cACA,MACA,mBACM;EACN,MAAM,oBAAoB,KAAKA;EAC/B,IACE,mBAAmB,SAAS,QAC5B,kBAAkB,sBAAsB,mBAExC;EAGF,MAAM,QAAQ,KAAKC,aAAa;EAChC,KAAKA,aAAa;EAClB,KAAKD,qBAAqB;GAAE;GAAM;GAAmB;GAAO;EAE5D,MAAM,iBAAiB;GACrB,MAAM,oBAAoB,KAAKA;GAC/B,IACE,mBAAmB,SAAS,QAC5B,kBAAkB,sBAAsB,qBACxC,kBAAkB,UAAU,OAE5B;GAGF,IAAI,sBAAsB,WACxB,aAAa,SAAS,QAAQ,KAAK;QAEnC,aAAa,SAAS,OAAO,KAAK;;EAItC,IAAI,OAAO,aAAa,0BAA0B,YAAY;GAC5D,aAAa,4BAA4B;IACvC,aAAa,WAAW,UAAU,EAAE;KACpC;GACF;;EAGF,aAAa,WAAW,UAAU,EAAE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-browser-navigation-controller.js","names":[],"sources":["../../src/server/app-browser-navigation-controller.ts"],"sourcesContent":["import { startTransition, useLayoutEffect, type Dispatch, type ReactNode } from \"react\";\nimport {\n activateNavigationSnapshot,\n clearPendingPathname,\n commitClientNavigationState,\n} from \"vinext/shims/navigation\";\nimport type { ClientNavigationRenderSnapshot } from \"vinext/shims/navigation\";\nimport {\n claimAppRouterScrollIntentForCommit,\n consumeAppRouterScrollIntent,\n type AppRouterScrollIntent,\n} from \"vinext/shims/app-router-scroll-state\";\nimport type { RouteManifest } from \"../routing/app-route-graph.js\";\nimport {\n FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN,\n createPendingNavigationCommit,\n type AppNavigationPayloadOrigin,\n type AppRouterState,\n type OperationLane,\n} from \"./app-browser-state.js\";\nimport {\n applyApprovedVisibleCommit,\n approveHmrVisibleCommit,\n approvePendingNavigationCommit,\n resolveAndClassifyNavigationCommit,\n type ApprovedVisibleCommit,\n} from \"./app-browser-visible-commit.js\";\nimport {\n shouldScheduleRefreshForDiscardedServerAction,\n type ServerActionRevalidationKind,\n} from \"./app-browser-action-result.js\";\nimport type { AppElements } from \"./app-elements.js\";\n\nexport type HistoryUpdateMode = \"push\" | \"replace\";\n\nexport type PendingBrowserRouterState = {\n promise: Promise<AppRouterState>;\n resolve: (state: AppRouterState) => void;\n settled: boolean;\n};\nexport type NavigationPayloadOutcome = \"committed\" | \"no-commit\" | \"hard-navigate\";\ntype HardNavigationMode = \"assign\" | \"replace\";\n\ntype BrowserNavigationCommitEffectFactory = (options: {\n href: string;\n historyUpdateMode: HistoryUpdateMode | undefined;\n navId: number;\n params: Record<string, string | string[]>;\n previousNextUrl: string | null;\n targetHistoryIndex?: number | null;\n}) => () => void;\n\ntype BrowserRouterStateRef = {\n current: AppRouterState;\n};\n\ntype SameUrlServerActionLifecycleOptions = {\n onDiscardedRevalidation?: () => void;\n revalidation?: ServerActionRevalidationKind;\n startedNavigationId?: number;\n targetHref?: string;\n};\n\ntype BrowserNavigationControllerDeps = {\n commitClientNavigationState?: typeof commitClientNavigationState;\n performHardNavigation?: (href: string, mode?: HardNavigationMode) => boolean;\n getRouteManifest?: () => RouteManifest | null;\n syncHistoryStatePreviousNextUrl?: (previousNextUrl: string | null) => void;\n};\n\ntype BrowserNavigationController = {\n beginNavigation(): number;\n getActiveNavigationId(): number;\n hasBrowserRouterState(): boolean;\n getBrowserRouterState(): AppRouterState;\n isCurrentNavigation(navId: number): boolean;\n performHardNavigation(href: string, mode?: HardNavigationMode): boolean;\n waitForBrowserRouterStateReady(): Promise<void>;\n attachBrowserRouterState(\n setter: Dispatch<AppRouterState | Promise<AppRouterState>>,\n stateRef: BrowserRouterStateRef,\n ): () => void;\n beginPendingBrowserRouterState(): PendingBrowserRouterState;\n finalizeNavigation(navId: number, pending: PendingBrowserRouterState | null | undefined): void;\n renderNavigationPayload(options: {\n actionType: \"navigate\" | \"replace\" | \"traverse\";\n createNavigationCommitEffect: BrowserNavigationCommitEffectFactory;\n historyUpdateMode: HistoryUpdateMode | undefined;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n nextElements: Promise<AppElements>;\n operationLane: OperationLane;\n payloadOrigin: AppNavigationPayloadOrigin;\n params: Record<string, string | string[]>;\n pendingRouterState: PendingBrowserRouterState | null;\n previousNextUrl: string | null;\n scrollIntent?: AppRouterScrollIntent | null;\n targetHistoryIndex?: number | null;\n targetHref: string;\n navId: number;\n }): Promise<NavigationPayloadOutcome>;\n commitSameUrlNavigatePayload(\n nextElements: Promise<AppElements>,\n navigationSnapshot: ClientNavigationRenderSnapshot,\n returnValue?: { ok: boolean; data: unknown },\n actionInitiationState?: AppRouterState,\n lifecycleOptions?: SameUrlServerActionLifecycleOptions,\n ): Promise<unknown>;\n hmrReplaceTree(\n nextElements: Promise<AppElements>,\n navigationSnapshot: ClientNavigationRenderSnapshot,\n ): Promise<void>;\n /**\n * Force-drain the queued pre-paint effect for the given renderId without\n * waiting for NavigationCommitSignal to commit. Used by the dev recovery\n * boundary in app-browser-entry.ts: when a render error replaces\n * NavigationCommitSignal with the boundary's null fallback, its\n * useLayoutEffect never fires, so the URL update for the in-flight\n * navigation would otherwise be lost.\n */\n drainPrePaintEffects(renderId: number): void;\n NavigationCommitSignal(\n this: void,\n {\n renderId,\n children,\n }: {\n renderId: number;\n children?: ReactNode;\n },\n ): ReactNode;\n};\n\nconst HARD_NAVIGATION_LOOP_GUARD_KEY = \"__vinext_hard_navigation_target__\";\n\nfunction normalizeBrowserHref(href: string): string {\n try {\n return new URL(href, window.location.href).href;\n } catch {\n return href;\n }\n}\n\nfunction readHardNavigationLoopGuard(): string | null {\n try {\n return window.sessionStorage.getItem(HARD_NAVIGATION_LOOP_GUARD_KEY);\n } catch {\n return null;\n }\n}\n\nfunction writeHardNavigationLoopGuard(targetHref: string): boolean {\n try {\n window.sessionStorage.setItem(HARD_NAVIGATION_LOOP_GUARD_KEY, targetHref);\n return window.sessionStorage.getItem(HARD_NAVIGATION_LOOP_GUARD_KEY) === targetHref;\n } catch {\n return false;\n }\n}\n\nexport function clearHardNavigationLoopGuard(): void {\n try {\n window.sessionStorage.removeItem(HARD_NAVIGATION_LOOP_GUARD_KEY);\n } catch {}\n}\n\nfunction performHardNavigationWithLoopGuard(\n href: string,\n mode: HardNavigationMode = \"assign\",\n): boolean {\n const targetHref = normalizeBrowserHref(href);\n const currentHref = normalizeBrowserHref(window.location.href);\n\n if (readHardNavigationLoopGuard() === targetHref && currentHref === targetHref) {\n clearHardNavigationLoopGuard();\n console.error(\n `[vinext] Prevented repeated hard navigation to ${targetHref}; ` +\n \"leaving the current document in place to avoid a reload loop.\",\n );\n return false;\n }\n\n const guardPersisted = writeHardNavigationLoopGuard(targetHref);\n if (!guardPersisted && currentHref === targetHref) {\n console.error(\n `[vinext] Hard navigation to ${targetHref} requires a reload-loop guard, ` +\n \"but sessionStorage is unavailable; leaving the current document in place.\",\n );\n return false;\n }\n // If storage is unavailable but the target is a different URL, the browser\n // can still make forward progress. Only same-target reloads need a persisted\n // guard because they can re-enter this exact recovery path indefinitely.\n\n if (mode === \"replace\") {\n window.location.replace(href);\n } else {\n window.location.assign(href);\n }\n return true;\n}\n\nexport function createAppBrowserNavigationController(\n deps: BrowserNavigationControllerDeps = {},\n): BrowserNavigationController {\n const commitClientNavigationStateImpl =\n deps.commitClientNavigationState ?? commitClientNavigationState;\n const performHardNavigation = deps.performHardNavigation ?? performHardNavigationWithLoopGuard;\n const getRouteManifest = deps.getRouteManifest ?? (() => null);\n const syncHistoryStatePreviousNextUrl = deps.syncHistoryStatePreviousNextUrl ?? (() => {});\n\n // These are plain module-level variables (inside the controller closure),\n // unlike ClientNavigationState which uses Symbol.for to survive multiple\n // Vite module instances. The browser entry is loaded exactly once (via the\n // RSC plugin's generated bootstrap), so the controller running in a single\n // module instance is safe. If that assumption ever changes, these should be\n // migrated to a Symbol.for-backed global.\n //\n // The most severe consequence of multiple instances would be Map fragmentation:\n // pendingNavigationCommits and pendingNavigationPrePaintEffects would split\n // across instances, so drainPrePaintEffects in one instance could never drain\n // effects queued by the other, permanently leaking navigationSnapshotActiveCount\n // and causing hooks to prefer stale snapshot values indefinitely.\n let nextNavigationRenderId = 0;\n let activeNavigationId = 0;\n const pendingNavigationCommits = new Map<number, () => void>();\n const pendingNavigationPrePaintEffects = new Map<number, () => void>();\n\n let setBrowserRouterState: Dispatch<AppRouterState | Promise<AppRouterState>> | null = null;\n let browserRouterStateRef: BrowserRouterStateRef | null = null;\n let activePendingBrowserRouterState: PendingBrowserRouterState | null = null;\n let resolveBrowserRouterStateReady: (() => void) | null = null;\n let browserRouterStateReadyPromise: Promise<void> | null = null;\n let browserRouterStateHasCommitted = false;\n\n function getBrowserRouterStateSetter(): Dispatch<AppRouterState | Promise<AppRouterState>> {\n if (!setBrowserRouterState) {\n throw new Error(\"[vinext] Browser router state setter is not initialized\");\n }\n return setBrowserRouterState;\n }\n\n function getBrowserRouterState(): AppRouterState {\n if (!browserRouterStateRef) {\n throw new Error(\"[vinext] Browser router state is not initialized\");\n }\n return browserRouterStateRef.current;\n }\n\n function waitForBrowserRouterStateReady(): Promise<void> {\n if (browserRouterStateRef || browserRouterStateHasCommitted) {\n return Promise.resolve();\n }\n\n if (!browserRouterStateReadyPromise) {\n browserRouterStateReadyPromise = new Promise((resolve) => {\n resolveBrowserRouterStateReady = resolve;\n });\n }\n\n return browserRouterStateReadyPromise;\n }\n\n function markBrowserRouterStateReady(): void {\n browserRouterStateHasCommitted = true;\n const resolveReady = resolveBrowserRouterStateReady;\n resolveBrowserRouterStateReady = null;\n browserRouterStateReadyPromise = null;\n resolveReady?.();\n }\n\n function beginNavigation(): number {\n activeNavigationId += 1;\n return activeNavigationId;\n }\n\n function getActiveNavigationId(): number {\n return activeNavigationId;\n }\n\n function allocateRenderId(): number {\n nextNavigationRenderId += 1;\n return nextNavigationRenderId;\n }\n\n function hasBrowserRouterState(): boolean {\n return browserRouterStateRef !== null;\n }\n\n function isCurrentNavigation(navId: number): boolean {\n return navId === activeNavigationId;\n }\n\n function beginPendingBrowserRouterState(): PendingBrowserRouterState {\n const setter = getBrowserRouterStateSetter();\n\n if (activePendingBrowserRouterState && !activePendingBrowserRouterState.settled) {\n activePendingBrowserRouterState.settled = true;\n activePendingBrowserRouterState.resolve(getBrowserRouterState());\n }\n\n let resolvePending: ((state: AppRouterState) => void) | undefined;\n const promise = new Promise<AppRouterState>((resolve) => {\n resolvePending = resolve;\n });\n\n if (!resolvePending) {\n throw new Error(\"[vinext] Failed to initialize browser router promise\");\n }\n\n const pending: PendingBrowserRouterState = {\n promise,\n resolve: resolvePending,\n settled: false,\n };\n\n activePendingBrowserRouterState = pending;\n setter(promise);\n\n return pending;\n }\n\n function settlePendingBrowserRouterState(\n pending: PendingBrowserRouterState | null | undefined,\n ): void {\n if (!pending || pending.settled) return;\n\n pending.settled = true;\n pending.resolve(getBrowserRouterState());\n\n if (activePendingBrowserRouterState === pending) {\n activePendingBrowserRouterState = null;\n }\n }\n\n function finalizeNavigation(\n navId: number,\n pending: PendingBrowserRouterState | null | undefined,\n ): void {\n settlePendingBrowserRouterState(pending);\n\n if (isCurrentNavigation(navId)) {\n clearPendingPathname(navId);\n }\n }\n\n function resolvePendingBrowserRouterState(\n pending: PendingBrowserRouterState | null | undefined,\n commit: ApprovedVisibleCommit,\n ): void {\n if (!pending || pending.settled) return;\n\n pending.settled = true;\n pending.resolve(applyApprovedVisibleCommit(getBrowserRouterState(), commit));\n\n if (activePendingBrowserRouterState === pending) {\n activePendingBrowserRouterState = null;\n }\n }\n\n function queuePrePaintNavigationEffect(renderId: number, effect: (() => void) | null): void {\n if (!effect) {\n return;\n }\n pendingNavigationPrePaintEffects.set(renderId, effect);\n }\n\n /**\n * Run all queued pre-paint effects for renderIds up to and including the\n * given renderId. When React supersedes a startTransition update (rapid\n * clicks on same-route links), the superseded NavigationCommitSignal never\n * mounts, so its pre-paint effect never fires. By draining all effects\n * <= the committed renderId here, the winning transition cleans up after\n * any superseded ones, keeping the counter balanced.\n *\n * Invariant: each superseded navigation gets a commitClientNavigationState()\n * to balance the activateNavigationSnapshot() from its renderNavigationPayload call.\n */\n function drainPrePaintEffects(upToRenderId: number): void {\n for (const [id, effect] of pendingNavigationPrePaintEffects) {\n if (id > upToRenderId) {\n continue;\n }\n\n pendingNavigationPrePaintEffects.delete(id);\n if (id === upToRenderId) {\n effect();\n } else {\n // Superseded navigations still need to balance the snapshot counter.\n commitClientNavigationStateImpl(undefined, { releaseSnapshot: true });\n }\n }\n }\n\n /**\n * Resolve all pending navigation commits with renderId <= the committed renderId.\n * Note: Map iteration handles concurrent deletion safely — entries are visited in\n * insertion order and deletion doesn't affect the iterator's view of remaining entries.\n * This pattern is also used in drainPrePaintEffects with the same semantics.\n */\n function resolveCommittedNavigations(renderId: number): void {\n for (const [pendingId, resolve] of pendingNavigationCommits) {\n if (pendingId > renderId) {\n continue;\n }\n\n pendingNavigationCommits.delete(pendingId);\n resolve();\n }\n }\n\n async function hmrReplaceTree(\n nextElements: Promise<AppElements>,\n navigationSnapshot: ClientNavigationRenderSnapshot,\n ): Promise<void> {\n if (!hasBrowserRouterState()) return;\n\n const currentState = getBrowserRouterState();\n const renderId = allocateRenderId();\n const pending = await createPendingNavigationCommit({\n currentState,\n nextElements,\n navigationSnapshot,\n operationLane: \"hmr\",\n payloadOrigin: FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN,\n renderId,\n type: \"replace\",\n });\n\n // createPendingNavigationCommit awaits the new RSC payload. While\n // suspended, the prior broken render can unmount BrowserRoot. Re-check\n // before dispatching so a racing unmount doesn't surface as an\n // initialized-setter error.\n if (!hasBrowserRouterState()) return;\n\n dispatchSynchronousVisibleCommit(approveHmrVisibleCommit(pending));\n }\n\n function NavigationCommitSignal(\n this: void,\n {\n renderId,\n children,\n }: {\n renderId: number;\n children?: ReactNode;\n },\n ): ReactNode {\n useLayoutEffect(() => {\n drainPrePaintEffects(renderId);\n\n const frame = requestAnimationFrame(() => {\n resolveCommittedNavigations(renderId);\n });\n\n return () => {\n cancelAnimationFrame(frame);\n // Resolve pending commits to prevent callers from hanging if React\n // unmounts this component without committing (e.g., error boundary).\n resolveCommittedNavigations(renderId);\n };\n }, [renderId]);\n\n return children;\n }\n\n function dispatchApprovedVisibleCommit(\n commit: ApprovedVisibleCommit,\n pendingRouterState: PendingBrowserRouterState | null,\n ): void {\n const setter = getBrowserRouterStateSetter();\n\n if (pendingRouterState) {\n // The programmatic navigation is already running inside React.startTransition\n // (from router.push/replace/refresh/Link), so resolving the deferred promise\n // is sufficient.\n resolvePendingBrowserRouterState(pendingRouterState, commit);\n return;\n }\n\n startTransition(() => {\n setter(applyApprovedVisibleCommit(getBrowserRouterState(), commit));\n });\n }\n\n function dispatchSynchronousVisibleCommit(commit: ApprovedVisibleCommit): void {\n const setter = getBrowserRouterStateSetter();\n setter(applyApprovedVisibleCommit(getBrowserRouterState(), commit));\n }\n\n function notifyDiscardedServerActionRevalidation(\n lifecycleOptions: SameUrlServerActionLifecycleOptions | undefined,\n ): void {\n const revalidation = lifecycleOptions?.revalidation ?? \"none\";\n if (!shouldScheduleRefreshForDiscardedServerAction(revalidation)) return;\n\n lifecycleOptions?.onDiscardedRevalidation?.();\n }\n\n async function renderNavigationPayload(options: {\n actionType: \"navigate\" | \"replace\" | \"traverse\";\n createNavigationCommitEffect: BrowserNavigationCommitEffectFactory;\n historyUpdateMode: HistoryUpdateMode | undefined;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n nextElements: Promise<AppElements>;\n operationLane: OperationLane;\n payloadOrigin: AppNavigationPayloadOrigin;\n params: Record<string, string | string[]>;\n pendingRouterState: PendingBrowserRouterState | null;\n previousNextUrl: string | null;\n scrollIntent?: AppRouterScrollIntent | null;\n targetHistoryIndex?: number | null;\n targetHref: string;\n navId: number;\n }): Promise<NavigationPayloadOutcome> {\n const renderId = allocateRenderId();\n let resolveCommitted: (() => void) | undefined;\n const committed = new Promise<void>((resolve) => {\n resolveCommitted = resolve;\n pendingNavigationCommits.set(renderId, resolve);\n });\n\n let snapshotActivated = false;\n try {\n const startedState = getBrowserRouterState();\n const pending = await createPendingNavigationCommit({\n currentState: startedState,\n nextElements: options.nextElements,\n navigationSnapshot: options.navigationSnapshot,\n operationLane: options.operationLane,\n payloadOrigin: options.payloadOrigin,\n previousNextUrl: options.previousNextUrl,\n renderId,\n type: options.actionType,\n });\n\n const approval = approvePendingNavigationCommit({\n activeNavigationId,\n currentState: getBrowserRouterState(),\n pending,\n routeManifest: getRouteManifest(),\n startedNavigationId: options.navId,\n targetHref: options.targetHref,\n });\n\n if (approval.decision.disposition === \"no-commit\") {\n settlePendingBrowserRouterState(options.pendingRouterState);\n pendingNavigationCommits.delete(renderId);\n resolveCommitted?.();\n consumeAppRouterScrollIntent(options.scrollIntent ?? null);\n return \"no-commit\";\n }\n\n if (approval.decision.disposition === \"hard-navigate\") {\n settlePendingBrowserRouterState(options.pendingRouterState);\n pendingNavigationCommits.delete(renderId);\n consumeAppRouterScrollIntent(options.scrollIntent ?? null);\n return performHardNavigation(options.targetHref) ? \"hard-navigate\" : \"no-commit\";\n }\n\n const approvedCommit = approval.approvedCommit;\n if (approvedCommit === null) {\n throw new Error(\"[vinext] Commit decision did not approve a visible commit\");\n }\n\n queuePrePaintNavigationEffect(\n renderId,\n options.createNavigationCommitEffect({\n href: options.targetHref,\n historyUpdateMode: options.historyUpdateMode,\n navId: options.navId,\n params: options.params,\n previousNextUrl: approvedCommit.previousNextUrl,\n targetHistoryIndex: options.targetHistoryIndex,\n }),\n );\n claimAppRouterScrollIntentForCommit(options.scrollIntent, renderId);\n activateNavigationSnapshot();\n snapshotActivated = true;\n dispatchApprovedVisibleCommit(approvedCommit, options.pendingRouterState);\n } catch (error) {\n pendingNavigationPrePaintEffects.delete(renderId);\n pendingNavigationCommits.delete(renderId);\n if (snapshotActivated) {\n commitClientNavigationStateImpl(options.navId);\n }\n settlePendingBrowserRouterState(options.pendingRouterState);\n resolveCommitted?.();\n throw error;\n }\n\n return committed.then(() => \"committed\");\n }\n\n async function commitSameUrlNavigatePayload(\n nextElements: Promise<AppElements>,\n navigationSnapshot: ClientNavigationRenderSnapshot,\n returnValue?: { ok: boolean; data: unknown },\n actionInitiationState?: AppRouterState,\n lifecycleOptions?: SameUrlServerActionLifecycleOptions,\n ): Promise<unknown> {\n const currentState = actionInitiationState ?? getBrowserRouterState();\n const startedNavigationId = lifecycleOptions?.startedNavigationId ?? activeNavigationId;\n const targetHref = lifecycleOptions?.targetHref ?? window.location.href;\n const {\n approvedCommit,\n decision,\n pending,\n // Intentionally retained as #726-OPS-01 trace-shell scaffolding. The\n // same-URL action path can consume this trace once later lifecycle gates\n // need an observable commit explanation.\n trace: _navigationTrace,\n } = await resolveAndClassifyNavigationCommit({\n activeNavigationId,\n currentState,\n getActiveNavigationId: () => activeNavigationId,\n getCurrentStateForApproval: getBrowserRouterState,\n navigationSnapshot,\n nextElements,\n renderId: allocateRenderId(),\n operationLane: \"server-action\",\n payloadOrigin: FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN,\n startedNavigationId,\n routeManifest: getRouteManifest(),\n targetHref,\n type: \"navigate\",\n });\n\n if (decision.disposition === \"hard-navigate\") {\n // Same-URL action hard navigations do not expose a navigation outcome to\n // callers. If the loop guard blocks, the degraded state is still the\n // existing return contract: no visible commit and no action value.\n performHardNavigation(targetHref);\n return undefined;\n }\n\n if (approvedCommit) {\n // The helper approval and this continuation are separated by a microtask\n // boundary, so re-check lifecycle authority before mutating visible UI.\n const latestApproval = approvePendingNavigationCommit({\n activeNavigationId,\n currentState: getBrowserRouterState(),\n pending,\n routeManifest: getRouteManifest(),\n startedNavigationId,\n targetHref,\n });\n\n if (latestApproval.decision.disposition === \"hard-navigate\") {\n // See the same-URL hard-navigation note above. The guard result is\n // deliberately not surfaced through the server-action return channel.\n performHardNavigation(targetHref);\n return undefined;\n }\n\n if (latestApproval.approvedCommit) {\n dispatchSynchronousVisibleCommit(latestApproval.approvedCommit);\n syncHistoryStatePreviousNextUrl(latestApproval.approvedCommit.previousNextUrl);\n } else {\n notifyDiscardedServerActionRevalidation(lifecycleOptions);\n }\n } else if (decision.disposition === \"no-commit\") {\n notifyDiscardedServerActionRevalidation(lifecycleOptions);\n }\n\n // Same-URL server actions still return their action value even if the UI\n // update was skipped due to a superseding navigation. That preserves the\n // existing caller contract; a future Phase 2 router state model could make\n // skipped UI updates observable to the caller without conflating them here.\n if (returnValue) {\n if (!returnValue.ok) {\n throw returnValue.data;\n }\n return returnValue.data;\n }\n\n return undefined;\n }\n\n function attachBrowserRouterState(\n setter: Dispatch<AppRouterState | Promise<AppRouterState>>,\n stateRef: BrowserRouterStateRef,\n ): () => void {\n setBrowserRouterState = setter;\n browserRouterStateRef = stateRef;\n markBrowserRouterStateReady();\n\n return () => {\n if (setBrowserRouterState === setter) {\n setBrowserRouterState = null;\n }\n if (browserRouterStateRef === stateRef) {\n browserRouterStateRef = null;\n browserRouterStateHasCommitted = false;\n }\n };\n }\n\n return {\n beginNavigation,\n getActiveNavigationId,\n hasBrowserRouterState,\n getBrowserRouterState,\n isCurrentNavigation,\n performHardNavigation,\n waitForBrowserRouterStateReady,\n attachBrowserRouterState,\n beginPendingBrowserRouterState,\n finalizeNavigation,\n renderNavigationPayload,\n commitSameUrlNavigatePayload,\n hmrReplaceTree,\n drainPrePaintEffects,\n NavigationCommitSignal,\n };\n}\n"],"mappings":";;;;;;;AAoIA,MAAM,iCAAiC;AAEvC,SAAS,qBAAqB,MAAsB;CAClD,IAAI;EACF,OAAO,IAAI,IAAI,MAAM,OAAO,SAAS,KAAK,CAAC;SACrC;EACN,OAAO;;;AAIX,SAAS,8BAA6C;CACpD,IAAI;EACF,OAAO,OAAO,eAAe,QAAQ,+BAA+B;SAC9D;EACN,OAAO;;;AAIX,SAAS,6BAA6B,YAA6B;CACjE,IAAI;EACF,OAAO,eAAe,QAAQ,gCAAgC,WAAW;EACzE,OAAO,OAAO,eAAe,QAAQ,+BAA+B,KAAK;SACnE;EACN,OAAO;;;AAIX,SAAgB,+BAAqC;CACnD,IAAI;EACF,OAAO,eAAe,WAAW,+BAA+B;SAC1D;;AAGV,SAAS,mCACP,MACA,OAA2B,UAClB;CACT,MAAM,aAAa,qBAAqB,KAAK;CAC7C,MAAM,cAAc,qBAAqB,OAAO,SAAS,KAAK;CAE9D,IAAI,6BAA6B,KAAK,cAAc,gBAAgB,YAAY;EAC9E,8BAA8B;EAC9B,QAAQ,MACN,kDAAkD,WAAW,iEAE9D;EACD,OAAO;;CAIT,IAAI,CADmB,6BAA6B,WACjC,IAAI,gBAAgB,YAAY;EACjD,QAAQ,MACN,+BAA+B,WAAW,0GAE3C;EACD,OAAO;;CAMT,IAAI,SAAS,WACX,OAAO,SAAS,QAAQ,KAAK;MAE7B,OAAO,SAAS,OAAO,KAAK;CAE9B,OAAO;;AAGT,SAAgB,qCACd,OAAwC,EAAE,EACb;CAC7B,MAAM,kCACJ,KAAK,+BAA+B;CACtC,MAAM,wBAAwB,KAAK,yBAAyB;CAC5D,MAAM,mBAAmB,KAAK,2BAA2B;CACzD,MAAM,kCAAkC,KAAK,0CAA0C;CAcvF,IAAI,yBAAyB;CAC7B,IAAI,qBAAqB;CACzB,MAAM,2CAA2B,IAAI,KAAyB;CAC9D,MAAM,mDAAmC,IAAI,KAAyB;CAEtE,IAAI,wBAAmF;CACvF,IAAI,wBAAsD;CAC1D,IAAI,kCAAoE;CACxE,IAAI,iCAAsD;CAC1D,IAAI,iCAAuD;CAC3D,IAAI,iCAAiC;CAErC,SAAS,8BAAkF;EACzF,IAAI,CAAC,uBACH,MAAM,IAAI,MAAM,0DAA0D;EAE5E,OAAO;;CAGT,SAAS,wBAAwC;EAC/C,IAAI,CAAC,uBACH,MAAM,IAAI,MAAM,mDAAmD;EAErE,OAAO,sBAAsB;;CAG/B,SAAS,iCAAgD;EACvD,IAAI,yBAAyB,gCAC3B,OAAO,QAAQ,SAAS;EAG1B,IAAI,CAAC,gCACH,iCAAiC,IAAI,SAAS,YAAY;GACxD,iCAAiC;IACjC;EAGJ,OAAO;;CAGT,SAAS,8BAAoC;EAC3C,iCAAiC;EACjC,MAAM,eAAe;EACrB,iCAAiC;EACjC,iCAAiC;EACjC,gBAAgB;;CAGlB,SAAS,kBAA0B;EACjC,sBAAsB;EACtB,OAAO;;CAGT,SAAS,wBAAgC;EACvC,OAAO;;CAGT,SAAS,mBAA2B;EAClC,0BAA0B;EAC1B,OAAO;;CAGT,SAAS,wBAAiC;EACxC,OAAO,0BAA0B;;CAGnC,SAAS,oBAAoB,OAAwB;EACnD,OAAO,UAAU;;CAGnB,SAAS,iCAA4D;EACnE,MAAM,SAAS,6BAA6B;EAE5C,IAAI,mCAAmC,CAAC,gCAAgC,SAAS;GAC/E,gCAAgC,UAAU;GAC1C,gCAAgC,QAAQ,uBAAuB,CAAC;;EAGlE,IAAI;EACJ,MAAM,UAAU,IAAI,SAAyB,YAAY;GACvD,iBAAiB;IACjB;EAEF,IAAI,CAAC,gBACH,MAAM,IAAI,MAAM,uDAAuD;EAGzE,MAAM,UAAqC;GACzC;GACA,SAAS;GACT,SAAS;GACV;EAED,kCAAkC;EAClC,OAAO,QAAQ;EAEf,OAAO;;CAGT,SAAS,gCACP,SACM;EACN,IAAI,CAAC,WAAW,QAAQ,SAAS;EAEjC,QAAQ,UAAU;EAClB,QAAQ,QAAQ,uBAAuB,CAAC;EAExC,IAAI,oCAAoC,SACtC,kCAAkC;;CAItC,SAAS,mBACP,OACA,SACM;EACN,gCAAgC,QAAQ;EAExC,IAAI,oBAAoB,MAAM,EAC5B,qBAAqB,MAAM;;CAI/B,SAAS,iCACP,SACA,QACM;EACN,IAAI,CAAC,WAAW,QAAQ,SAAS;EAEjC,QAAQ,UAAU;EAClB,QAAQ,QAAQ,2BAA2B,uBAAuB,EAAE,OAAO,CAAC;EAE5E,IAAI,oCAAoC,SACtC,kCAAkC;;CAItC,SAAS,8BAA8B,UAAkB,QAAmC;EAC1F,IAAI,CAAC,QACH;EAEF,iCAAiC,IAAI,UAAU,OAAO;;;;;;;;;;;;;CAcxD,SAAS,qBAAqB,cAA4B;EACxD,KAAK,MAAM,CAAC,IAAI,WAAW,kCAAkC;GAC3D,IAAI,KAAK,cACP;GAGF,iCAAiC,OAAO,GAAG;GAC3C,IAAI,OAAO,cACT,QAAQ;QAGR,gCAAgC,KAAA,GAAW,EAAE,iBAAiB,MAAM,CAAC;;;;;;;;;CAW3E,SAAS,4BAA4B,UAAwB;EAC3D,KAAK,MAAM,CAAC,WAAW,YAAY,0BAA0B;GAC3D,IAAI,YAAY,UACd;GAGF,yBAAyB,OAAO,UAAU;GAC1C,SAAS;;;CAIb,eAAe,eACb,cACA,oBACe;EACf,IAAI,CAAC,uBAAuB,EAAE;EAI9B,MAAM,UAAU,MAAM,8BAA8B;GAClD,cAHmB,uBAGP;GACZ;GACA;GACA,eAAe;GACf,eAAe;GACf,UAPe,kBAOP;GACR,MAAM;GACP,CAAC;EAMF,IAAI,CAAC,uBAAuB,EAAE;EAE9B,iCAAiC,wBAAwB,QAAQ,CAAC;;CAGpE,SAAS,uBAEP,EACE,UACA,YAKS;EACX,sBAAsB;GACpB,qBAAqB,SAAS;GAE9B,MAAM,QAAQ,4BAA4B;IACxC,4BAA4B,SAAS;KACrC;GAEF,aAAa;IACX,qBAAqB,MAAM;IAG3B,4BAA4B,SAAS;;KAEtC,CAAC,SAAS,CAAC;EAEd,OAAO;;CAGT,SAAS,8BACP,QACA,oBACM;EACN,MAAM,SAAS,6BAA6B;EAE5C,IAAI,oBAAoB;GAItB,iCAAiC,oBAAoB,OAAO;GAC5D;;EAGF,sBAAsB;GACpB,OAAO,2BAA2B,uBAAuB,EAAE,OAAO,CAAC;IACnE;;CAGJ,SAAS,iCAAiC,QAAqC;EAE7E,6BAAM,CAAC,2BAA2B,uBAAuB,EAAE,OAAO,CAAC;;CAGrE,SAAS,wCACP,kBACM;EAEN,IAAI,CAAC,8CADgB,kBAAkB,gBAAgB,OACS,EAAE;EAElE,kBAAkB,2BAA2B;;CAG/C,eAAe,wBAAwB,SAeD;EACpC,MAAM,WAAW,kBAAkB;EACnC,IAAI;EACJ,MAAM,YAAY,IAAI,SAAe,YAAY;GAC/C,mBAAmB;GACnB,yBAAyB,IAAI,UAAU,QAAQ;IAC/C;EAEF,IAAI,oBAAoB;EACxB,IAAI;GAEF,MAAM,UAAU,MAAM,8BAA8B;IAClD,cAFmB,uBAEO;IAC1B,cAAc,QAAQ;IACtB,oBAAoB,QAAQ;IAC5B,eAAe,QAAQ;IACvB,eAAe,QAAQ;IACvB,iBAAiB,QAAQ;IACzB;IACA,MAAM,QAAQ;IACf,CAAC;GAEF,MAAM,WAAW,+BAA+B;IAC9C;IACA,cAAc,uBAAuB;IACrC;IACA,eAAe,kBAAkB;IACjC,qBAAqB,QAAQ;IAC7B,YAAY,QAAQ;IACrB,CAAC;GAEF,IAAI,SAAS,SAAS,gBAAgB,aAAa;IACjD,gCAAgC,QAAQ,mBAAmB;IAC3D,yBAAyB,OAAO,SAAS;IACzC,oBAAoB;IACpB,6BAA6B,QAAQ,gBAAgB,KAAK;IAC1D,OAAO;;GAGT,IAAI,SAAS,SAAS,gBAAgB,iBAAiB;IACrD,gCAAgC,QAAQ,mBAAmB;IAC3D,yBAAyB,OAAO,SAAS;IACzC,6BAA6B,QAAQ,gBAAgB,KAAK;IAC1D,OAAO,sBAAsB,QAAQ,WAAW,GAAG,kBAAkB;;GAGvE,MAAM,iBAAiB,SAAS;GAChC,IAAI,mBAAmB,MACrB,MAAM,IAAI,MAAM,4DAA4D;GAG9E,8BACE,UACA,QAAQ,6BAA6B;IACnC,MAAM,QAAQ;IACd,mBAAmB,QAAQ;IAC3B,OAAO,QAAQ;IACf,QAAQ,QAAQ;IAChB,iBAAiB,eAAe;IAChC,oBAAoB,QAAQ;IAC7B,CAAC,CACH;GACD,oCAAoC,QAAQ,cAAc,SAAS;GACnE,4BAA4B;GAC5B,oBAAoB;GACpB,8BAA8B,gBAAgB,QAAQ,mBAAmB;WAClE,OAAO;GACd,iCAAiC,OAAO,SAAS;GACjD,yBAAyB,OAAO,SAAS;GACzC,IAAI,mBACF,gCAAgC,QAAQ,MAAM;GAEhD,gCAAgC,QAAQ,mBAAmB;GAC3D,oBAAoB;GACpB,MAAM;;EAGR,OAAO,UAAU,WAAW,YAAY;;CAG1C,eAAe,6BACb,cACA,oBACA,aACA,uBACA,kBACkB;EAClB,MAAM,eAAe,yBAAyB,uBAAuB;EACrE,MAAM,sBAAsB,kBAAkB,uBAAuB;EACrE,MAAM,aAAa,kBAAkB,cAAc,OAAO,SAAS;EACnE,MAAM,EACJ,gBACA,UACA,SAIA,OAAO,qBACL,MAAM,mCAAmC;GAC3C;GACA;GACA,6BAA6B;GAC7B,4BAA4B;GAC5B;GACA;GACA,UAAU,kBAAkB;GAC5B,eAAe;GACf,eAAe;GACf;GACA,eAAe,kBAAkB;GACjC;GACA,MAAM;GACP,CAAC;EAEF,IAAI,SAAS,gBAAgB,iBAAiB;GAI5C,sBAAsB,WAAW;GACjC;;EAGF,IAAI,gBAAgB;GAGlB,MAAM,iBAAiB,+BAA+B;IACpD;IACA,cAAc,uBAAuB;IACrC;IACA,eAAe,kBAAkB;IACjC;IACA;IACD,CAAC;GAEF,IAAI,eAAe,SAAS,gBAAgB,iBAAiB;IAG3D,sBAAsB,WAAW;IACjC;;GAGF,IAAI,eAAe,gBAAgB;IACjC,iCAAiC,eAAe,eAAe;IAC/D,gCAAgC,eAAe,eAAe,gBAAgB;UAE9E,wCAAwC,iBAAiB;SAEtD,IAAI,SAAS,gBAAgB,aAClC,wCAAwC,iBAAiB;EAO3D,IAAI,aAAa;GACf,IAAI,CAAC,YAAY,IACf,MAAM,YAAY;GAEpB,OAAO,YAAY;;;CAMvB,SAAS,yBACP,QACA,UACY;EACZ,wBAAwB;EACxB,wBAAwB;EACxB,6BAA6B;EAE7B,aAAa;GACX,IAAI,0BAA0B,QAC5B,wBAAwB;GAE1B,IAAI,0BAA0B,UAAU;IACtC,wBAAwB;IACxB,iCAAiC;;;;CAKvC,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-browser-popstate.js","names":[],"sources":["../../src/server/app-browser-popstate.ts"],"sourcesContent":["type RestoreScrollPosition = (\n state: unknown,\n options?: {\n shouldContinue?: () => boolean;\n },\n) => void;\ntype NavigateRsc = (\n href: string,\n redirectDepth?: number,\n navigationKind?: \"navigate\" | \"traverse\" | \"refresh\",\n) => Promise<void>;\n\ntype BrowserPopstateRestoreDeps = {\n getActiveNavigationId: () => number;\n getPendingNavigation: () => Promise<void> | null | undefined;\n getNavigate: () => NavigateRsc | undefined;\n isCurrentNavigation: (navId: number) => boolean;\n notifyAppRouterTransitionStart: (href: string) => void;\n restorePopstateScrollPosition: RestoreScrollPosition;\n setPendingNavigation: (pendingNavigation: Promise<void> | null) => void;\n};\n\nfunction hasSavedScrollPosition(state: unknown): boolean {\n return Boolean(state && typeof state === \"object\" && \"__vinext_scrollY\" in state);\n}\n\nfunction scheduleAfterFrame(callback: () => void): void {\n if (typeof window !== \"undefined\" && typeof window.requestAnimationFrame === \"function\") {\n window.requestAnimationFrame(callback);\n return;\n }\n\n queueMicrotask(callback);\n}\n\nexport function createPopstateRestoreHandler(\n deps: BrowserPopstateRestoreDeps,\n): (event: PopStateEvent) => void {\n return (event) => {\n deps.notifyAppRouterTransitionStart(window.location.href);\n const navigate = deps.getNavigate();\n const pendingNavigation = navigate?.(window.location.href, 0, \"traverse\") ?? Promise.resolve();\n const popstateNavId = deps.getActiveNavigationId();\n\n deps.setPendingNavigation(pendingNavigation);\n const shouldRestoreSavedScroll = hasSavedScrollPosition(event.state);\n if (shouldRestoreSavedScroll) {\n scheduleAfterFrame(() => {\n if (deps.isCurrentNavigation(popstateNavId)) {\n deps.restorePopstateScrollPosition(event.state, {\n shouldContinue: () => deps.isCurrentNavigation(popstateNavId),\n });\n }\n });\n }\n\n void pendingNavigation.finally(() => {\n if (deps.isCurrentNavigation(popstateNavId) && !shouldRestoreSavedScroll) {\n deps.restorePopstateScrollPosition(event.state);\n }\n\n if (deps.getPendingNavigation() === pendingNavigation) {\n deps.setPendingNavigation(null);\n }\n });\n };\n}\n"],"mappings":";AAsBA,SAAS,uBAAuB,OAAyB;CACvD,OAAO,QAAQ,SAAS,OAAO,UAAU,YAAY,sBAAsB,MAAM;;AAGnF,SAAS,mBAAmB,UAA4B;CACtD,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO,0BAA0B,YAAY;EACvF,OAAO,sBAAsB,SAAS;EACtC;;CAGF,eAAe,SAAS;;AAG1B,SAAgB,6BACd,MACgC;CAChC,QAAQ,UAAU;EAChB,KAAK,+BAA+B,OAAO,SAAS,KAAK;EAEzD,MAAM,oBADW,KAAK,aACY,GAAG,OAAO,SAAS,MAAM,GAAG,WAAW,IAAI,QAAQ,SAAS;EAC9F,MAAM,gBAAgB,KAAK,uBAAuB;EAElD,KAAK,qBAAqB,kBAAkB;EAC5C,MAAM,2BAA2B,uBAAuB,MAAM,MAAM;EACpE,IAAI,0BACF,yBAAyB;GACvB,IAAI,KAAK,oBAAoB,cAAc,EACzC,KAAK,8BAA8B,MAAM,OAAO,EAC9C,sBAAsB,KAAK,oBAAoB,cAAc,EAC9D,CAAC;IAEJ;EAGJ,kBAAuB,cAAc;GACnC,IAAI,KAAK,oBAAoB,cAAc,IAAI,CAAC,0BAC9C,KAAK,8BAA8B,MAAM,MAAM;GAGjD,IAAI,KAAK,sBAAsB,KAAK,mBAClC,KAAK,qBAAqB,KAAK;IAEjC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-browser-rsc-redirect.js","names":[],"sources":["../../src/server/app-browser-rsc-redirect.ts"],"sourcesContent":["import {\n resolveHardNavigationTargetFromRscResponse,\n stripRscCacheBustingSearchParam,\n stripRscSuffix,\n} from \"./app-rsc-cache-busting.js\";\n\nexport const MAX_RSC_REDIRECT_DEPTH = 10;\n\ntype RscRedirectHistoryUpdateMode = \"push\" | \"replace\" | undefined;\n\ntype RscRedirectLifecycleDecision =\n | { kind: \"no-redirect\" }\n | {\n href: string;\n historyUpdateMode: RscRedirectHistoryUpdateMode;\n kind: \"follow\";\n previousNextUrl: string | null;\n redirectDepth: number;\n }\n | {\n href: string;\n kind: \"terminal-hard-navigation\";\n reason: \"externalRedirect\" | \"maxRedirectsExceeded\";\n redirectDepth: number;\n };\n\nfunction toVisibleAppHref(href: string, origin: string): string {\n const url = new URL(href, origin);\n stripRscCacheBustingSearchParam(url);\n return `${stripRscSuffix(url.pathname)}${url.search}${url.hash}`;\n}\n\nexport function resolveRscRedirectLifecycleHop(options: {\n currentHref: string;\n historyUpdateMode: RscRedirectHistoryUpdateMode;\n maxRedirectDepth?: number;\n origin: string;\n redirectDepth: number;\n requestPreviousNextUrl: string | null;\n responseUrl: string;\n}): RscRedirectLifecycleDecision {\n const responseUrl = new URL(options.responseUrl, options.origin);\n\n if (responseUrl.origin !== options.origin) {\n return {\n href: responseUrl.href,\n kind: \"terminal-hard-navigation\",\n reason: \"externalRedirect\",\n redirectDepth: options.redirectDepth,\n };\n }\n\n const redirectedHref = resolveHardNavigationTargetFromRscResponse(\n responseUrl.href,\n options.currentHref,\n options.origin,\n );\n if (redirectedHref === toVisibleAppHref(options.currentHref, options.origin)) {\n return { kind: \"no-redirect\" };\n }\n\n const maxRedirectDepth = options.maxRedirectDepth ?? MAX_RSC_REDIRECT_DEPTH;\n if (options.redirectDepth >= maxRedirectDepth) {\n return {\n href: redirectedHref,\n kind: \"terminal-hard-navigation\",\n reason: \"maxRedirectsExceeded\",\n redirectDepth: options.redirectDepth,\n };\n }\n\n return {\n href: redirectedHref,\n historyUpdateMode: options.historyUpdateMode,\n kind: \"follow\",\n previousNextUrl: options.requestPreviousNextUrl,\n redirectDepth: options.redirectDepth + 1,\n };\n}\n"],"mappings":";;AAMA,MAAa,yBAAyB;AAoBtC,SAAS,iBAAiB,MAAc,QAAwB;CAC9D,MAAM,MAAM,IAAI,IAAI,MAAM,OAAO;CACjC,gCAAgC,IAAI;CACpC,OAAO,GAAG,eAAe,IAAI,SAAS,GAAG,IAAI,SAAS,IAAI;;AAG5D,SAAgB,+BAA+B,SAQd;CAC/B,MAAM,cAAc,IAAI,IAAI,QAAQ,aAAa,QAAQ,OAAO;CAEhE,IAAI,YAAY,WAAW,QAAQ,QACjC,OAAO;EACL,MAAM,YAAY;EAClB,MAAM;EACN,QAAQ;EACR,eAAe,QAAQ;EACxB;CAGH,MAAM,iBAAiB,2CACrB,YAAY,MACZ,QAAQ,aACR,QAAQ,OACT;CACD,IAAI,mBAAmB,iBAAiB,QAAQ,aAAa,QAAQ,OAAO,EAC1E,OAAO,EAAE,MAAM,eAAe;CAGhC,MAAM,mBAAmB,QAAQ,oBAAA;CACjC,IAAI,QAAQ,iBAAiB,kBAC3B,OAAO;EACL,MAAM;EACN,MAAM;EACN,QAAQ;EACR,eAAe,QAAQ;EACxB;CAGH,OAAO;EACL,MAAM;EACN,mBAAmB,QAAQ;EAC3B,MAAM;EACN,iBAAiB,QAAQ;EACzB,eAAe,QAAQ,gBAAgB;EACxC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-browser-state.js","names":["_exhaustive"],"sources":["../../src/server/app-browser-state.ts"],"sourcesContent":["import { stripBasePath } from \"../utils/base-path.js\";\nimport type { RouteManifest } from \"../routing/app-route-graph.js\";\nimport {\n AppElementsWire,\n getMountedSlotIds,\n getMountedSlotIdsHeader,\n type AppElements,\n type AppElementsInterception,\n type AppElementsSlotBinding,\n type LayoutFlags,\n} from \"./app-elements.js\";\nimport { createRscRequestHeaders } from \"./app-rsc-cache-busting.js\";\nimport {\n NEXT_ACTION_HEADER,\n RSC_ACTION_HEADER,\n VINEXT_INTERCEPTION_CONTEXT_HEADER,\n VINEXT_MOUNTED_SLOTS_HEADER,\n} from \"./headers.js\";\nimport {\n NavigationTraceReasonCodes,\n createNavigationLifecycleTraceFields,\n createNavigationTrace,\n type NavigationTrace,\n type NavigationTraceFields,\n} from \"./navigation-trace.js\";\nimport { createCacheEntryReuseProof, type CacheEntryReuseProof } from \"./cache-proof.js\";\nimport {\n navigationPlanner,\n type MountedParallelSlotSnapshotV0,\n type NavigationDecisionV0,\n type OperationLane,\n type OperationToken,\n type RouteSnapshotV0,\n} from \"./navigation-planner.js\";\nimport type { ClientNavigationRenderSnapshot } from \"vinext/shims/navigation\";\nimport { normalizePathnameForRouteMatch } from \"../routing/utils.js\";\nimport { normalizePath } from \"./normalize-path.js\";\nexport {\n createHistoryStateWithNavigationMetadata,\n createHistoryStateWithPreviousNextUrl,\n readHistoryStatePreviousNextUrl,\n readHistoryStateTraversalIndex,\n resolveHistoryTraversalIntent,\n type HistoryTraversalIntent,\n} from \"./app-history-state.js\";\n\nexport type { OperationLane } from \"./navigation-planner.js\";\n\ntype OperationRecordBase = {\n id: number;\n lane: OperationLane;\n startedVisibleCommitVersion: number;\n};\n\nexport type PendingOperationRecord = OperationRecordBase & {\n state: \"pending\";\n};\n\nexport type CommittedOperationRecord = OperationRecordBase & {\n state: \"committed\";\n visibleCommitVersion: number;\n};\n\nexport type OperationRecord = PendingOperationRecord | CommittedOperationRecord;\n\nexport type AppRouterState = {\n activeOperation: OperationRecord | null;\n elements: AppElements;\n interception: AppElementsInterception | null;\n interceptionContext: string | null;\n layoutFlags: LayoutFlags;\n layoutIds: readonly string[];\n previousNextUrl: string | null;\n renderId: number;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n rootLayoutTreePath: string | null;\n routeId: string;\n slotBindings: readonly AppElementsSlotBinding[];\n visibleCommitVersion: number;\n};\n\nexport type AppRouterAction = {\n cacheEntryReuseProof?: CacheEntryReuseProof;\n elements: AppElements;\n interception: AppElementsInterception | null;\n interceptionContext: string | null;\n layoutFlags: LayoutFlags;\n layoutIds: readonly string[];\n navigationSnapshot: ClientNavigationRenderSnapshot;\n operation: PendingOperationRecord;\n previousNextUrl: string | null;\n renderId: number;\n rootLayoutTreePath: string | null;\n routeId: string;\n slotBindings: readonly AppElementsSlotBinding[];\n type: \"navigate\" | \"replace\" | \"traverse\";\n};\n\nexport type PendingNavigationCommit = {\n action: AppRouterAction;\n cacheEntryReuseProof?: CacheEntryReuseProof;\n interception: AppElementsInterception | null;\n interceptionContext: string | null;\n previousNextUrl: string | null;\n rootLayoutTreePath: string | null;\n routeId: string;\n};\n\nexport type AppNavigationPayloadOrigin = Readonly<\n { origin: \"fresh\" } | { origin: \"visited-cache\" }\n>;\n\nexport const FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN: AppNavigationPayloadOrigin = {\n origin: \"fresh\",\n};\nexport const VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN: AppNavigationPayloadOrigin = {\n origin: \"visited-cache\",\n};\n\ntype PendingNavigationCommitDisposition = \"dispatch\" | \"hard-navigate\" | \"skip\";\ntype CacheRestorableAppPayloadMetadata = Readonly<{\n cacheEntryReuseProof?: CacheEntryReuseProof;\n}>;\ntype DispatchPendingNavigationCommitDispositionDecision = {\n disposition: \"dispatch\";\n preserveAbsentSlots: boolean;\n preserveElementIds: readonly string[];\n preservePreviousSlotIds: readonly string[];\n trace: NavigationTrace;\n};\ntype NonDispatchPendingNavigationCommitDispositionDecision = {\n disposition: Exclude<PendingNavigationCommitDisposition, \"dispatch\">;\n preserveElementIds: readonly [];\n trace: NavigationTrace;\n};\ntype PendingNavigationCommitDispositionDecision =\n | DispatchPendingNavigationCommitDispositionDecision\n | NonDispatchPendingNavigationCommitDispositionDecision;\nfunction createOperationRecord(options: {\n id: number;\n lane: OperationLane;\n startedVisibleCommitVersion: number;\n}): PendingOperationRecord {\n return {\n id: options.id,\n lane: options.lane,\n startedVisibleCommitVersion: options.startedVisibleCommitVersion,\n state: \"pending\",\n };\n}\n\nexport function isCacheRestorableAppPayloadMetadata(\n metadata: CacheRestorableAppPayloadMetadata,\n): metadata is CacheRestorableAppPayloadMetadata & { cacheEntryReuseProof: CacheEntryReuseProof } {\n return metadata.cacheEntryReuseProof !== undefined;\n}\n\nfunction requiresCacheEntryReuseProof(origin: AppNavigationPayloadOrigin): boolean {\n switch (origin.origin) {\n case \"fresh\":\n return false;\n case \"visited-cache\":\n return true;\n default: {\n const _exhaustive: never = origin;\n throw new Error(\"[vinext] Unknown App Router payload origin: \" + String(_exhaustive));\n }\n }\n}\n\nfunction normalizeNavigationSnapshotMatchedUrl(pathname: string): string {\n return normalizePath(normalizePathnameForRouteMatch(pathname));\n}\n\nfunction createRouteSnapshotRouteId(options: {\n interception: AppElementsInterception | null;\n routeId: string;\n}): string {\n if (options.interception !== null) return options.routeId;\n\n const parsed = AppElementsWire.parseElementKey(options.routeId);\n if (parsed?.kind !== \"route\" || parsed.interceptionContext === null) {\n return options.routeId;\n }\n\n // A context suffix keeps AppElements render keys partitioned, but without\n // explicit interception proof it is not semantic route authority.\n return AppElementsWire.encodeRouteId(parsed.path, null);\n}\n\nexport function resolveInterceptionContextFromPreviousNextUrl(\n previousNextUrl: string | null,\n basePath: string = \"\",\n): string | null {\n if (previousNextUrl === null) {\n return null;\n }\n\n const parsedUrl = new URL(previousNextUrl, \"http://localhost\");\n return stripBasePath(parsedUrl.pathname, basePath);\n}\n\ntype ResolveServerActionRequestStateOptions = {\n actionId: string;\n basePath: string;\n elements: AppElements;\n previousNextUrl: string | null;\n};\n\ntype ResolveServerActionRequestStateResult = {\n headers: Headers;\n};\n\n/**\n * Pure: builds the fetch Headers for a server-action POST. Carries the same\n * interception-context and mounted-slots headers the refresh path already\n * sends, so the server-action re-render can rebuild the intercepted tree\n * instead of replacing it with the direct route.\n *\n * Next.js sends `Next-URL: state.previousNextUrl || state.nextUrl` on action\n * POSTs when `hasInterceptionRouteInCurrentTree(state.tree)`. Vinext's\n * X-Vinext-Interception-Context is the equivalent signal for the server-side\n * `findIntercept` lookup.\n */\nexport function resolveServerActionRequestState(\n options: ResolveServerActionRequestStateOptions,\n): ResolveServerActionRequestStateResult {\n const headers = createRscRequestHeaders();\n headers.set(RSC_ACTION_HEADER, options.actionId);\n headers.set(NEXT_ACTION_HEADER, options.actionId);\n\n const interceptionContext = resolveInterceptionContextFromPreviousNextUrl(\n options.previousNextUrl,\n options.basePath,\n );\n if (interceptionContext !== null) {\n headers.set(VINEXT_INTERCEPTION_CONTEXT_HEADER, interceptionContext);\n }\n\n const mountedSlotsHeader = getMountedSlotIdsHeader(options.elements);\n if (mountedSlotsHeader !== null) {\n headers.set(VINEXT_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);\n }\n\n return { headers };\n}\n\nexport function resolvePendingNavigationCommitDispositionDecision(options: {\n activeNavigationId: number;\n currentState: AppRouterState;\n pending: PendingNavigationCommit;\n routeManifest?: RouteManifest | null;\n startedNavigationId: number;\n targetHref?: string;\n}): PendingNavigationCommitDispositionDecision {\n const traceFields = createPendingNavigationTraceFields(options);\n\n if (\n options.startedNavigationId !== options.activeNavigationId ||\n options.pending.action.operation.startedVisibleCommitVersion !==\n options.currentState.visibleCommitVersion\n ) {\n return {\n disposition: \"skip\",\n preserveElementIds: [],\n trace: createNavigationTrace(NavigationTraceReasonCodes.staleOperation, traceFields),\n };\n }\n\n return mapNavigationDecisionToPendingDisposition(\n planPendingRootBoundaryFlightResponse({\n currentState: options.currentState,\n pending: options.pending,\n routeManifest: options.routeManifest ?? null,\n targetHref: options.targetHref,\n traceFields,\n }),\n );\n}\n\nfunction createPendingNavigationTraceFields(options: {\n activeNavigationId: number;\n currentState: AppRouterState;\n pending: PendingNavigationCommit;\n startedNavigationId: number;\n targetHref?: string;\n}): NavigationTraceFields {\n return {\n ...createNavigationLifecycleTraceFields({\n activeNavigationId: options.activeNavigationId,\n currentRootLayoutTreePath: options.currentState.rootLayoutTreePath,\n currentVisibleCommitVersion: options.currentState.visibleCommitVersion,\n nextRootLayoutTreePath: options.pending.rootLayoutTreePath,\n startedNavigationId: options.startedNavigationId,\n startedVisibleCommitVersion: options.pending.action.operation.startedVisibleCommitVersion,\n }),\n ...(options.targetHref !== undefined ? { targetHref: options.targetHref } : {}),\n };\n}\n\nfunction createNavigationSnapshotUrl(snapshot: ClientNavigationRenderSnapshot): string {\n const query = snapshot.searchParams.toString();\n return query === \"\" ? snapshot.pathname : `${snapshot.pathname}?${query}`;\n}\n\nfunction createMountedParallelSlotSnapshots(\n elements: AppElements,\n): readonly MountedParallelSlotSnapshotV0[] {\n const snapshots: MountedParallelSlotSnapshotV0[] = [];\n for (const slotId of getMountedSlotIds(elements)) {\n const parsed = AppElementsWire.parseElementKey(slotId);\n if (parsed?.kind !== \"slot\") continue;\n snapshots.push({\n ownerLayoutId: AppElementsWire.encodeLayoutId(parsed.treePath),\n slotId,\n });\n }\n return snapshots;\n}\n\nfunction createVisibleRouteSnapshot(state: AppRouterState): RouteSnapshotV0 {\n const displayUrl = createNavigationSnapshotUrl(state.navigationSnapshot);\n const matchedUrl = normalizeNavigationSnapshotMatchedUrl(state.navigationSnapshot.pathname);\n return {\n displayUrl,\n interception: state.interception,\n interceptionContext: state.interceptionContext,\n layoutIds: state.layoutIds,\n // `displayUrl` preserves the browser-visible URL for decisions and traces.\n // `matchedUrl` uses the route-state canonical pathname, matching the\n // server's segment-decoded representation without changing user-facing\n // navigation state such as usePathname().\n matchedUrl,\n mountedParallelSlots: createMountedParallelSlotSnapshots(state.elements),\n rootBoundaryId: state.rootLayoutTreePath,\n routeId: createRouteSnapshotRouteId({\n interception: state.interception,\n routeId: state.routeId,\n }),\n slotBindings: state.slotBindings,\n };\n}\n\nfunction createPendingRouteSnapshot(pending: PendingNavigationCommit): RouteSnapshotV0 {\n const displayUrl = createNavigationSnapshotUrl(pending.action.navigationSnapshot);\n const matchedUrl = normalizeNavigationSnapshotMatchedUrl(\n pending.action.navigationSnapshot.pathname,\n );\n return {\n displayUrl,\n interception: pending.action.interception,\n interceptionContext: pending.action.interceptionContext,\n layoutIds: pending.action.layoutIds,\n // See createVisibleRouteSnapshot: matchedUrl intentionally models the route\n // identity, not the address bar URL.\n matchedUrl,\n mountedParallelSlots: createMountedParallelSlotSnapshots(pending.action.elements),\n rootBoundaryId: pending.rootLayoutTreePath,\n routeId: createRouteSnapshotRouteId({\n interception: pending.action.interception,\n routeId: pending.routeId,\n }),\n slotBindings: pending.action.slotBindings,\n };\n}\n\nfunction createPendingNavigationOperationToken(options: {\n pending: PendingNavigationCommit;\n routeManifest: RouteManifest | null;\n targetSnapshot: RouteSnapshotV0;\n}): OperationToken {\n return {\n baseVisibleCommitVersion: options.pending.action.operation.startedVisibleCommitVersion,\n deploymentVersion: null,\n graphVersion: options.routeManifest?.graphVersion ?? null,\n lane: options.pending.action.operation.lane,\n operationId: options.pending.action.operation.id,\n targetSnapshotFingerprint: createRootBoundarySnapshotFingerprint(options.targetSnapshot),\n };\n}\n\nfunction createRootBoundarySnapshotFingerprint(snapshot: RouteSnapshotV0): string {\n return `${snapshot.routeId}|root:${snapshot.rootBoundaryId ?? \"unknown\"}`;\n}\n\nfunction planPendingRootBoundaryFlightResponse(options: {\n currentState: AppRouterState;\n pending: PendingNavigationCommit;\n routeManifest: RouteManifest | null;\n targetHref?: string;\n traceFields: NavigationTraceFields;\n}): NavigationDecisionV0 {\n const targetSnapshot = createPendingRouteSnapshot(options.pending);\n const token = createPendingNavigationOperationToken({\n pending: options.pending,\n routeManifest: options.routeManifest,\n targetSnapshot,\n });\n const cacheEntryReuseProof = options.pending.cacheEntryReuseProof;\n\n // #726-CORE-07/08 keeps the browser state layer as the lifecycle gate and\n // only translates committed AppElements metadata into planner snapshots.\n // RouteManifest now supplies graph-owned route topology while snapshots\n // continue to carry runtime state such as visible slot content.\n return navigationPlanner.plan({\n routeManifest: options.routeManifest,\n state: {\n nextOperationToken: token,\n traceFields: options.traceFields,\n visibleCommitVersion: options.currentState.visibleCommitVersion,\n visibleSnapshot: createVisibleRouteSnapshot(options.currentState),\n },\n event: {\n kind: \"flightResponseArrived\",\n result: {\n ...(cacheEntryReuseProof ? { cacheEntryReuseProof } : {}),\n // Approval call sites must pass the executor's targetHref so the\n // planner trace and future hard-nav executor agree with the browser\n // URL. The fallback remains for lower-level tests and direct disposition\n // callers that exercise only snapshot-derived planner semantics.\n href: options.targetHref ?? targetSnapshot.displayUrl,\n targetSnapshot,\n },\n token,\n },\n });\n}\n\nfunction mapNavigationDecisionToPendingDisposition(\n decision: NavigationDecisionV0,\n): PendingNavigationCommitDispositionDecision {\n switch (decision.kind) {\n case \"proposeCommit\":\n return {\n disposition: \"dispatch\",\n preserveAbsentSlots: decision.proposal.preserveAbsentSlots,\n preserveElementIds: decision.proposal.preserveElementIds,\n preservePreviousSlotIds: decision.proposal.preservePreviousSlotIds,\n trace: decision.trace,\n };\n case \"hardNavigate\":\n return { disposition: \"hard-navigate\", preserveElementIds: [], trace: decision.trace };\n case \"noCommit\":\n return { disposition: \"skip\", preserveElementIds: [], trace: decision.trace };\n case \"requestWork\":\n throw new Error(\n `[vinext] Root-boundary commit planning returned requestWork (${decision.work.kind}); flightResponseArrived should never request work`,\n );\n default: {\n const _exhaustive: never = decision;\n throw new Error(\"[vinext] Unknown navigation decision: \" + String(_exhaustive));\n }\n }\n}\n\nexport async function createPendingNavigationCommit(options: {\n currentState: AppRouterState;\n nextElements: Promise<AppElements>;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n operationLane: OperationLane;\n payloadOrigin: AppNavigationPayloadOrigin;\n // Advisory: non-intercepted responses clear this even when callers pass the\n // current visible previousNextUrl.\n previousNextUrl?: string | null;\n renderId: number;\n type: \"navigate\" | \"replace\" | \"traverse\";\n}): Promise<PendingNavigationCommit> {\n const elements = await options.nextElements;\n const metadata = AppElementsWire.readMetadata(elements);\n const cacheEntryReuseProof =\n metadata.cacheEntryReuseProof ??\n (requiresCacheEntryReuseProof(options.payloadOrigin)\n ? createCacheEntryReuseProof(null)\n : undefined);\n const requestedPreviousNextUrl =\n options.previousNextUrl !== undefined\n ? options.previousNextUrl\n : options.currentState.previousNextUrl;\n const previousNextUrl = metadata.interception === null ? null : requestedPreviousNextUrl;\n\n return {\n action: {\n ...(cacheEntryReuseProof ? { cacheEntryReuseProof } : {}),\n elements,\n interception: metadata.interception,\n interceptionContext: metadata.interceptionContext,\n layoutIds: metadata.layoutIds,\n layoutFlags: metadata.layoutFlags,\n slotBindings: metadata.slotBindings,\n navigationSnapshot: options.navigationSnapshot,\n operation: createOperationRecord({\n id: options.renderId,\n lane: options.operationLane,\n startedVisibleCommitVersion: options.currentState.visibleCommitVersion,\n }),\n previousNextUrl,\n renderId: options.renderId,\n rootLayoutTreePath: metadata.rootLayoutTreePath,\n routeId: metadata.routeId,\n type: options.type,\n },\n // Convenience aliases — always equal their action.* counterparts.\n ...(cacheEntryReuseProof ? { cacheEntryReuseProof } : {}),\n interception: metadata.interception,\n interceptionContext: metadata.interceptionContext,\n previousNextUrl,\n rootLayoutTreePath: metadata.rootLayoutTreePath,\n routeId: metadata.routeId,\n };\n}\n"],"mappings":";;;;;;;;;;;;AAgHA,MAAa,sCAAkE,EAC7E,QAAQ,SACT;AACD,MAAa,8CAA0E,EACrF,QAAQ,iBACT;AAqBD,SAAS,sBAAsB,SAIJ;CACzB,OAAO;EACL,IAAI,QAAQ;EACZ,MAAM,QAAQ;EACd,6BAA6B,QAAQ;EACrC,OAAO;EACR;;AAGH,SAAgB,oCACd,UACgG;CAChG,OAAO,SAAS,yBAAyB,KAAA;;AAG3C,SAAS,6BAA6B,QAA6C;CACjF,QAAQ,OAAO,QAAf;EACE,KAAK,SACH,OAAO;EACT,KAAK,iBACH,OAAO;EACT,SAEE,MAAM,IAAI,MAAM,iDAAiD,OAAOA,OAAY,CAAC;;;AAK3F,SAAS,sCAAsC,UAA0B;CACvE,OAAO,cAAc,+BAA+B,SAAS,CAAC;;AAGhE,SAAS,2BAA2B,SAGzB;CACT,IAAI,QAAQ,iBAAiB,MAAM,OAAO,QAAQ;CAElD,MAAM,SAAS,gBAAgB,gBAAgB,QAAQ,QAAQ;CAC/D,IAAI,QAAQ,SAAS,WAAW,OAAO,wBAAwB,MAC7D,OAAO,QAAQ;CAKjB,OAAO,gBAAgB,cAAc,OAAO,MAAM,KAAK;;AAGzD,SAAgB,8CACd,iBACA,WAAmB,IACJ;CACf,IAAI,oBAAoB,MACtB,OAAO;CAIT,OAAO,cAAc,IADC,IAAI,iBAAiB,mBACb,CAAC,UAAU,SAAS;;;;;;;;;;;;;AAyBpD,SAAgB,gCACd,SACuC;CACvC,MAAM,UAAU,yBAAyB;CACzC,QAAQ,IAAI,mBAAmB,QAAQ,SAAS;CAChD,QAAQ,IAAI,oBAAoB,QAAQ,SAAS;CAEjD,MAAM,sBAAsB,8CAC1B,QAAQ,iBACR,QAAQ,SACT;CACD,IAAI,wBAAwB,MAC1B,QAAQ,IAAI,oCAAoC,oBAAoB;CAGtE,MAAM,qBAAqB,wBAAwB,QAAQ,SAAS;CACpE,IAAI,uBAAuB,MACzB,QAAQ,IAAI,6BAA6B,mBAAmB;CAG9D,OAAO,EAAE,SAAS;;AAGpB,SAAgB,kDAAkD,SAOnB;CAC7C,MAAM,cAAc,mCAAmC,QAAQ;CAE/D,IACE,QAAQ,wBAAwB,QAAQ,sBACxC,QAAQ,QAAQ,OAAO,UAAU,gCAC/B,QAAQ,aAAa,sBAEvB,OAAO;EACL,aAAa;EACb,oBAAoB,EAAE;EACtB,OAAO,sBAAsB,2BAA2B,gBAAgB,YAAY;EACrF;CAGH,OAAO,0CACL,sCAAsC;EACpC,cAAc,QAAQ;EACtB,SAAS,QAAQ;EACjB,eAAe,QAAQ,iBAAiB;EACxC,YAAY,QAAQ;EACpB;EACD,CAAC,CACH;;AAGH,SAAS,mCAAmC,SAMlB;CACxB,OAAO;EACL,GAAG,qCAAqC;GACtC,oBAAoB,QAAQ;GAC5B,2BAA2B,QAAQ,aAAa;GAChD,6BAA6B,QAAQ,aAAa;GAClD,wBAAwB,QAAQ,QAAQ;GACxC,qBAAqB,QAAQ;GAC7B,6BAA6B,QAAQ,QAAQ,OAAO,UAAU;GAC/D,CAAC;EACF,GAAI,QAAQ,eAAe,KAAA,IAAY,EAAE,YAAY,QAAQ,YAAY,GAAG,EAAE;EAC/E;;AAGH,SAAS,4BAA4B,UAAkD;CACrF,MAAM,QAAQ,SAAS,aAAa,UAAU;CAC9C,OAAO,UAAU,KAAK,SAAS,WAAW,GAAG,SAAS,SAAS,GAAG;;AAGpE,SAAS,mCACP,UAC0C;CAC1C,MAAM,YAA6C,EAAE;CACrD,KAAK,MAAM,UAAU,kBAAkB,SAAS,EAAE;EAChD,MAAM,SAAS,gBAAgB,gBAAgB,OAAO;EACtD,IAAI,QAAQ,SAAS,QAAQ;EAC7B,UAAU,KAAK;GACb,eAAe,gBAAgB,eAAe,OAAO,SAAS;GAC9D;GACD,CAAC;;CAEJ,OAAO;;AAGT,SAAS,2BAA2B,OAAwC;CAC1E,MAAM,aAAa,4BAA4B,MAAM,mBAAmB;CACxE,MAAM,aAAa,sCAAsC,MAAM,mBAAmB,SAAS;CAC3F,OAAO;EACL;EACA,cAAc,MAAM;EACpB,qBAAqB,MAAM;EAC3B,WAAW,MAAM;EAKjB;EACA,sBAAsB,mCAAmC,MAAM,SAAS;EACxE,gBAAgB,MAAM;EACtB,SAAS,2BAA2B;GAClC,cAAc,MAAM;GACpB,SAAS,MAAM;GAChB,CAAC;EACF,cAAc,MAAM;EACrB;;AAGH,SAAS,2BAA2B,SAAmD;CACrF,MAAM,aAAa,4BAA4B,QAAQ,OAAO,mBAAmB;CACjF,MAAM,aAAa,sCACjB,QAAQ,OAAO,mBAAmB,SACnC;CACD,OAAO;EACL;EACA,cAAc,QAAQ,OAAO;EAC7B,qBAAqB,QAAQ,OAAO;EACpC,WAAW,QAAQ,OAAO;EAG1B;EACA,sBAAsB,mCAAmC,QAAQ,OAAO,SAAS;EACjF,gBAAgB,QAAQ;EACxB,SAAS,2BAA2B;GAClC,cAAc,QAAQ,OAAO;GAC7B,SAAS,QAAQ;GAClB,CAAC;EACF,cAAc,QAAQ,OAAO;EAC9B;;AAGH,SAAS,sCAAsC,SAI5B;CACjB,OAAO;EACL,0BAA0B,QAAQ,QAAQ,OAAO,UAAU;EAC3D,mBAAmB;EACnB,cAAc,QAAQ,eAAe,gBAAgB;EACrD,MAAM,QAAQ,QAAQ,OAAO,UAAU;EACvC,aAAa,QAAQ,QAAQ,OAAO,UAAU;EAC9C,2BAA2B,sCAAsC,QAAQ,eAAe;EACzF;;AAGH,SAAS,sCAAsC,UAAmC;CAChF,OAAO,GAAG,SAAS,QAAQ,QAAQ,SAAS,kBAAkB;;AAGhE,SAAS,sCAAsC,SAMtB;CACvB,MAAM,iBAAiB,2BAA2B,QAAQ,QAAQ;CAClE,MAAM,QAAQ,sCAAsC;EAClD,SAAS,QAAQ;EACjB,eAAe,QAAQ;EACvB;EACD,CAAC;CACF,MAAM,uBAAuB,QAAQ,QAAQ;CAM7C,OAAO,kBAAkB,KAAK;EAC5B,eAAe,QAAQ;EACvB,OAAO;GACL,oBAAoB;GACpB,aAAa,QAAQ;GACrB,sBAAsB,QAAQ,aAAa;GAC3C,iBAAiB,2BAA2B,QAAQ,aAAa;GAClE;EACD,OAAO;GACL,MAAM;GACN,QAAQ;IACN,GAAI,uBAAuB,EAAE,sBAAsB,GAAG,EAAE;IAKxD,MAAM,QAAQ,cAAc,eAAe;IAC3C;IACD;GACD;GACD;EACF,CAAC;;AAGJ,SAAS,0CACP,UAC4C;CAC5C,QAAQ,SAAS,MAAjB;EACE,KAAK,iBACH,OAAO;GACL,aAAa;GACb,qBAAqB,SAAS,SAAS;GACvC,oBAAoB,SAAS,SAAS;GACtC,yBAAyB,SAAS,SAAS;GAC3C,OAAO,SAAS;GACjB;EACH,KAAK,gBACH,OAAO;GAAE,aAAa;GAAiB,oBAAoB,EAAE;GAAE,OAAO,SAAS;GAAO;EACxF,KAAK,YACH,OAAO;GAAE,aAAa;GAAQ,oBAAoB,EAAE;GAAE,OAAO,SAAS;GAAO;EAC/E,KAAK,eACH,MAAM,IAAI,MACR,gEAAgE,SAAS,KAAK,KAAK,oDACpF;EACH,SAEE,MAAM,IAAI,MAAM,2CAA2C,OAAOA,SAAY,CAAC;;;AAKrF,eAAsB,8BAA8B,SAWf;CACnC,MAAM,WAAW,MAAM,QAAQ;CAC/B,MAAM,WAAW,gBAAgB,aAAa,SAAS;CACvD,MAAM,uBACJ,SAAS,yBACR,6BAA6B,QAAQ,cAAc,GAChD,2BAA2B,KAAK,GAChC,KAAA;CACN,MAAM,2BACJ,QAAQ,oBAAoB,KAAA,IACxB,QAAQ,kBACR,QAAQ,aAAa;CAC3B,MAAM,kBAAkB,SAAS,iBAAiB,OAAO,OAAO;CAEhE,OAAO;EACL,QAAQ;GACN,GAAI,uBAAuB,EAAE,sBAAsB,GAAG,EAAE;GACxD;GACA,cAAc,SAAS;GACvB,qBAAqB,SAAS;GAC9B,WAAW,SAAS;GACpB,aAAa,SAAS;GACtB,cAAc,SAAS;GACvB,oBAAoB,QAAQ;GAC5B,WAAW,sBAAsB;IAC/B,IAAI,QAAQ;IACZ,MAAM,QAAQ;IACd,6BAA6B,QAAQ,aAAa;IACnD,CAAC;GACF;GACA,UAAU,QAAQ;GAClB,oBAAoB,SAAS;GAC7B,SAAS,SAAS;GAClB,MAAM,QAAQ;GACf;EAED,GAAI,uBAAuB,EAAE,sBAAsB,GAAG,EAAE;EACxD,cAAc,SAAS;EACvB,qBAAqB,SAAS;EAC9B;EACA,oBAAoB,SAAS;EAC7B,SAAS,SAAS;EACnB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-browser-stream.js","names":[],"sources":["../../src/server/app-browser-stream.ts"],"sourcesContent":["import type { ReactFormState } from \"react-dom/client\";\nimport {\n ensureNavigationRuntimeRscBootstrap,\n getNavigationRuntime,\n type NavigationRuntimeRscBootstrap,\n type NavigationRuntimeSnapshot,\n} from \"../client/navigation-runtime.js\";\nimport { RSC_FORM_STATE_GLOBAL } from \"./app-browser-hydration.js\";\nimport { decodeRscEmbeddedChunk, type RscEmbeddedChunk } from \"./app-rsc-embedded-chunks.js\";\n\ntype VinextBrowserGlobals = {\n __VINEXT_RSC_CHUNKS__?: RscEmbeddedChunk[];\n __VINEXT_RSC_DONE__?: boolean;\n [RSC_FORM_STATE_GLOBAL]?: ReactFormState;\n __VINEXT_RSC_PARAMS__?: Record<string, string | string[]>;\n __VINEXT_RSC_NAV__?: NavigationRuntimeSnapshot;\n};\n\nexport function getVinextBrowserGlobal(): typeof globalThis & VinextBrowserGlobals {\n return globalThis as typeof globalThis & VinextBrowserGlobals;\n}\n\nfunction createUnexpectedRscStreamCloseError(): Error {\n return new Error(\n \"The connection to the page was unexpectedly closed, possibly due to the stop button being clicked, loss of Wi-Fi, or an unstable internet connection.\",\n );\n}\n\n/**\n * Convert embedded chunks back to a ReadableStream of Uint8Array chunks.\n */\nexport function chunksToReadableStream(\n chunks: readonly RscEmbeddedChunk[],\n): ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n for (const chunk of chunks) {\n controller.enqueue(decodeRscEmbeddedChunk(chunk));\n }\n controller.close();\n },\n });\n}\n\nfunction getNavigationRuntimeRscBootstrap(): NavigationRuntimeRscBootstrap | null {\n return getNavigationRuntime()?.bootstrap.rsc ?? null;\n}\n\n/**\n * Create a ReadableStream from progressively-embedded RSC chunks.\n *\n * The server pushes chunks into the typed navigation runtime via inline\n * <script> tags. We monkey-patch `push()` so new chunks stream to React\n * immediately instead of polling with setTimeout.\n */\nexport function createProgressiveRscStream(): ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n const vinext = getVinextBrowserGlobal();\n const runtimeRsc = getNavigationRuntimeRscBootstrap();\n const initialChunks = runtimeRsc?.rsc ?? vinext.__VINEXT_RSC_CHUNKS__ ?? [];\n\n for (const chunk of initialChunks) {\n controller.enqueue(decodeRscEmbeddedChunk(chunk));\n }\n\n if (runtimeRsc?.done || vinext.__VINEXT_RSC_DONE__) {\n controller.close();\n return;\n }\n\n let closed = false;\n let cancelDocumentCompletionCheck: (() => void) | undefined;\n const cancelPendingDocumentCompletionCheck = () => {\n const cancel = cancelDocumentCompletionCheck;\n cancelDocumentCompletionCheck = undefined;\n cancel?.();\n };\n const closeOnce = () => {\n if (!closed) {\n closed = true;\n cancelPendingDocumentCompletionCheck();\n controller.close();\n }\n };\n const errorOnce = () => {\n if (!closed) {\n closed = true;\n cancelPendingDocumentCompletionCheck();\n controller.error(createUnexpectedRscStreamCloseError());\n }\n };\n\n const liveRuntimeRsc =\n getNavigationRuntime() === null ? null : ensureNavigationRuntimeRscBootstrap();\n const arr = liveRuntimeRsc?.rsc ?? (vinext.__VINEXT_RSC_CHUNKS__ ??= []);\n // Capture the bootstrap object before it can be cleared. Inline done\n // scripts mutate this same object, and clearing happens only after the\n // stream has already been consumed or closed.\n arr.push = function (...chunks: RscEmbeddedChunk[]): number {\n const length = Array.prototype.push.apply(this, chunks);\n\n if (closed) return length;\n\n for (const chunk of chunks) {\n controller.enqueue(decodeRscEmbeddedChunk(chunk));\n }\n\n if (liveRuntimeRsc?.done || vinext.__VINEXT_RSC_DONE__) {\n closeOnce();\n }\n\n return length;\n };\n\n if (typeof document !== \"undefined\") {\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", errorOnce);\n cancelDocumentCompletionCheck = () =>\n document.removeEventListener(\"DOMContentLoaded\", errorOnce);\n } else {\n const timeoutId = setTimeout(errorOnce);\n cancelDocumentCompletionCheck = () => clearTimeout(timeoutId);\n }\n }\n },\n });\n}\n"],"mappings":";;;AAkBA,SAAgB,yBAAmE;CACjF,OAAO;;AAGT,SAAS,sCAA6C;CACpD,uBAAO,IAAI,MACT,wJACD;;;;;AAMH,SAAgB,uBACd,QAC4B;CAC5B,OAAO,IAAI,eAA2B,EACpC,MAAM,YAAY;EAChB,KAAK,MAAM,SAAS,QAClB,WAAW,QAAQ,uBAAuB,MAAM,CAAC;EAEnD,WAAW,OAAO;IAErB,CAAC;;AAGJ,SAAS,mCAAyE;CAChF,OAAO,sBAAsB,EAAE,UAAU,OAAO;;;;;;;;;AAUlD,SAAgB,6BAAyD;CACvE,OAAO,IAAI,eAA2B,EACpC,MAAM,YAAY;EAChB,MAAM,SAAS,wBAAwB;EACvC,MAAM,aAAa,kCAAkC;EACrD,MAAM,gBAAgB,YAAY,OAAO,OAAO,yBAAyB,EAAE;EAE3E,KAAK,MAAM,SAAS,eAClB,WAAW,QAAQ,uBAAuB,MAAM,CAAC;EAGnD,IAAI,YAAY,QAAQ,OAAO,qBAAqB;GAClD,WAAW,OAAO;GAClB;;EAGF,IAAI,SAAS;EACb,IAAI;EACJ,MAAM,6CAA6C;GACjD,MAAM,SAAS;GACf,gCAAgC,KAAA;GAChC,UAAU;;EAEZ,MAAM,kBAAkB;GACtB,IAAI,CAAC,QAAQ;IACX,SAAS;IACT,sCAAsC;IACtC,WAAW,OAAO;;;EAGtB,MAAM,kBAAkB;GACtB,IAAI,CAAC,QAAQ;IACX,SAAS;IACT,sCAAsC;IACtC,WAAW,MAAM,qCAAqC,CAAC;;;EAI3D,MAAM,iBACJ,sBAAsB,KAAK,OAAO,OAAO,qCAAqC;EAChF,MAAM,MAAM,gBAAgB,QAAQ,OAAO,0BAA0B,EAAE;EAIvE,IAAI,OAAO,SAAU,GAAG,QAAoC;GAC1D,MAAM,SAAS,MAAM,UAAU,KAAK,MAAM,MAAM,OAAO;GAEvD,IAAI,QAAQ,OAAO;GAEnB,KAAK,MAAM,SAAS,QAClB,WAAW,QAAQ,uBAAuB,MAAM,CAAC;GAGnD,IAAI,gBAAgB,QAAQ,OAAO,qBACjC,WAAW;GAGb,OAAO;;EAGT,IAAI,OAAO,aAAa,aACtB,IAAI,SAAS,eAAe,WAAW;GACrC,SAAS,iBAAiB,oBAAoB,UAAU;GACxD,sCACE,SAAS,oBAAoB,oBAAoB,UAAU;SACxD;GACL,MAAM,YAAY,WAAW,UAAU;GACvC,sCAAsC,aAAa,UAAU;;IAIpE,CAAC"}