vinext 0.0.49 → 0.0.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/dist/build/client-build-config.js.map +1 -1
  2. package/dist/build/google-fonts/build-url.js.map +1 -1
  3. package/dist/build/google-fonts/fallback-metrics-data.js +14031 -0
  4. package/dist/build/google-fonts/fallback-metrics-data.js.map +1 -0
  5. package/dist/build/google-fonts/fallback-metrics.d.ts +13 -0
  6. package/dist/build/google-fonts/fallback-metrics.js +46 -0
  7. package/dist/build/google-fonts/fallback-metrics.js.map +1 -0
  8. package/dist/build/google-fonts/get-axes.js.map +1 -1
  9. package/dist/build/google-fonts/sort-variants.js.map +1 -1
  10. package/dist/build/google-fonts/validate.js.map +1 -1
  11. package/dist/build/layout-classification.js.map +1 -1
  12. package/dist/build/nitro-route-rules.js.map +1 -1
  13. package/dist/build/precompress.d.ts +13 -2
  14. package/dist/build/precompress.js +12 -3
  15. package/dist/build/precompress.js.map +1 -1
  16. package/dist/build/prerender.d.ts +17 -1
  17. package/dist/build/prerender.js +114 -23
  18. package/dist/build/prerender.js.map +1 -1
  19. package/dist/build/report.d.ts +5 -4
  20. package/dist/build/report.js +196 -348
  21. package/dist/build/report.js.map +1 -1
  22. package/dist/build/route-classification-injector.js.map +1 -1
  23. package/dist/build/route-classification-manifest.js.map +1 -1
  24. package/dist/build/run-prerender.js.map +1 -1
  25. package/dist/build/server-manifest.js.map +1 -1
  26. package/dist/build/ssr-manifest.js.map +1 -1
  27. package/dist/build/standalone.js.map +1 -1
  28. package/dist/build/static-export.js.map +1 -1
  29. package/dist/check.js +2 -1
  30. package/dist/check.js.map +1 -1
  31. package/dist/cli-args.js.map +1 -1
  32. package/dist/cli.js +68 -7
  33. package/dist/cli.js.map +1 -1
  34. package/dist/client/instrumentation-client-state.js.map +1 -1
  35. package/dist/client/validate-module-path.js.map +1 -1
  36. package/dist/client/vinext-next-data.d.ts +5 -1
  37. package/dist/client/window-next.d.ts +151 -0
  38. package/dist/client/window-next.js +48 -0
  39. package/dist/client/window-next.js.map +1 -0
  40. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  41. package/dist/cloudflare/tpr.js +2 -1
  42. package/dist/cloudflare/tpr.js.map +1 -1
  43. package/dist/config/config-matchers.d.ts +3 -1
  44. package/dist/config/config-matchers.js +5 -4
  45. package/dist/config/config-matchers.js.map +1 -1
  46. package/dist/config/dotenv.d.ts +11 -1
  47. package/dist/config/dotenv.js.map +1 -1
  48. package/dist/config/next-config.d.ts +93 -6
  49. package/dist/config/next-config.js +233 -6
  50. package/dist/config/next-config.js.map +1 -1
  51. package/dist/config/tsconfig-paths.d.ts +13 -0
  52. package/dist/config/tsconfig-paths.js +117 -0
  53. package/dist/config/tsconfig-paths.js.map +1 -0
  54. package/dist/deploy.js +16 -7
  55. package/dist/deploy.js.map +1 -1
  56. package/dist/entries/app-browser-entry.d.ts +3 -1
  57. package/dist/entries/app-browser-entry.js +36 -2
  58. package/dist/entries/app-browser-entry.js.map +1 -1
  59. package/dist/entries/app-rsc-entry.d.ts +19 -1
  60. package/dist/entries/app-rsc-entry.js +49 -12
  61. package/dist/entries/app-rsc-entry.js.map +1 -1
  62. package/dist/entries/app-rsc-manifest.d.ts +9 -0
  63. package/dist/entries/app-rsc-manifest.js +8 -1
  64. package/dist/entries/app-rsc-manifest.js.map +1 -1
  65. package/dist/entries/app-ssr-entry.js.map +1 -1
  66. package/dist/entries/pages-client-entry.js +3 -5
  67. package/dist/entries/pages-client-entry.js.map +1 -1
  68. package/dist/entries/pages-entry-helpers.js.map +1 -1
  69. package/dist/entries/pages-server-entry.js +34 -1
  70. package/dist/entries/pages-server-entry.js.map +1 -1
  71. package/dist/entries/runtime-entry-module.js.map +1 -1
  72. package/dist/index.js +204 -53
  73. package/dist/index.js.map +1 -1
  74. package/dist/init.js.map +1 -1
  75. package/dist/plugins/async-hooks-stub.js.map +1 -1
  76. package/dist/plugins/client-reference-dedup.d.ts +15 -2
  77. package/dist/plugins/client-reference-dedup.js +138 -16
  78. package/dist/plugins/client-reference-dedup.js.map +1 -1
  79. package/dist/plugins/fonts.d.ts +2 -2
  80. package/dist/plugins/fonts.js +15 -6
  81. package/dist/plugins/fonts.js.map +1 -1
  82. package/dist/plugins/instrumentation-client.js.map +1 -1
  83. package/dist/plugins/og-assets.js.map +1 -1
  84. package/dist/plugins/optimize-imports.js.map +1 -1
  85. package/dist/plugins/postcss.js.map +1 -1
  86. package/dist/plugins/rsc-client-reference-loaders.d.ts +7 -0
  87. package/dist/plugins/rsc-client-reference-loaders.js +48 -0
  88. package/dist/plugins/rsc-client-reference-loaders.js.map +1 -0
  89. package/dist/plugins/rsc-client-shim-excludes.js.map +1 -1
  90. package/dist/plugins/sass.d.ts +34 -0
  91. package/dist/plugins/sass.js +22 -0
  92. package/dist/plugins/sass.js.map +1 -0
  93. package/dist/plugins/server-externals-manifest.js.map +1 -1
  94. package/dist/plugins/strip-server-exports.js.map +1 -1
  95. package/dist/routing/app-route-graph.d.ts +78 -6
  96. package/dist/routing/app-route-graph.js +241 -25
  97. package/dist/routing/app-route-graph.js.map +1 -1
  98. package/dist/routing/app-router.js.map +1 -1
  99. package/dist/routing/file-matcher.js.map +1 -1
  100. package/dist/routing/pages-router.js.map +1 -1
  101. package/dist/routing/route-matching.js.map +1 -1
  102. package/dist/routing/route-pattern.d.ts +56 -1
  103. package/dist/routing/route-pattern.js +60 -1
  104. package/dist/routing/route-pattern.js.map +1 -1
  105. package/dist/routing/route-trie.js.map +1 -1
  106. package/dist/routing/route-validation.js.map +1 -1
  107. package/dist/routing/utils.js.map +1 -1
  108. package/dist/server/api-handler.js.map +1 -1
  109. package/dist/server/app-browser-action-result.d.ts +44 -0
  110. package/dist/server/app-browser-action-result.js +79 -0
  111. package/dist/server/app-browser-action-result.js.map +1 -0
  112. package/dist/server/app-browser-entry.js +330 -133
  113. package/dist/server/app-browser-entry.js.map +1 -1
  114. package/dist/server/app-browser-error.js.map +1 -1
  115. package/dist/server/app-browser-hydration.d.ts +31 -0
  116. package/dist/server/app-browser-hydration.js +30 -0
  117. package/dist/server/app-browser-hydration.js.map +1 -0
  118. package/dist/server/app-browser-navigation-controller.d.ts +20 -4
  119. package/dist/server/app-browser-navigation-controller.js +90 -23
  120. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  121. package/dist/server/app-browser-popstate.d.ts +16 -0
  122. package/dist/server/app-browser-popstate.js +17 -0
  123. package/dist/server/app-browser-popstate.js.map +1 -0
  124. package/dist/server/app-browser-rsc-redirect.d.ts +28 -0
  125. package/dist/server/app-browser-rsc-redirect.js +37 -0
  126. package/dist/server/app-browser-rsc-redirect.js.map +1 -0
  127. package/dist/server/app-browser-state.d.ts +27 -23
  128. package/dist/server/app-browser-state.js +158 -54
  129. package/dist/server/app-browser-state.js.map +1 -1
  130. package/dist/server/app-browser-stream.d.ts +9 -4
  131. package/dist/server/app-browser-stream.js +29 -8
  132. package/dist/server/app-browser-stream.js.map +1 -1
  133. package/dist/server/app-browser-visible-commit.d.ts +11 -1
  134. package/dist/server/app-browser-visible-commit.js +69 -21
  135. package/dist/server/app-browser-visible-commit.js.map +1 -1
  136. package/dist/server/app-client-reference-preloader.js.map +1 -1
  137. package/dist/server/app-elements-wire.d.ts +43 -6
  138. package/dist/server/app-elements-wire.js +121 -5
  139. package/dist/server/app-elements-wire.js.map +1 -1
  140. package/dist/server/app-elements.d.ts +2 -2
  141. package/dist/server/app-elements.js +2 -2
  142. package/dist/server/app-elements.js.map +1 -1
  143. package/dist/server/app-fallback-renderer.d.ts +10 -1
  144. package/dist/server/app-fallback-renderer.js +37 -1
  145. package/dist/server/app-fallback-renderer.js.map +1 -1
  146. package/dist/server/app-history-state.d.ts +26 -0
  147. package/dist/server/app-history-state.js +53 -0
  148. package/dist/server/app-history-state.js.map +1 -0
  149. package/dist/server/app-hook-warning-suppression.js.map +1 -1
  150. package/dist/server/app-middleware.d.ts +1 -1
  151. package/dist/server/app-middleware.js +4 -9
  152. package/dist/server/app-middleware.js.map +1 -1
  153. package/dist/server/app-mounted-slots-header.js.map +1 -1
  154. package/dist/server/app-page-boundary-render.d.ts +11 -1
  155. package/dist/server/app-page-boundary-render.js +27 -19
  156. package/dist/server/app-page-boundary-render.js.map +1 -1
  157. package/dist/server/app-page-boundary.d.ts +1 -0
  158. package/dist/server/app-page-boundary.js +10 -7
  159. package/dist/server/app-page-boundary.js.map +1 -1
  160. package/dist/server/app-page-cache.d.ts +23 -3
  161. package/dist/server/app-page-cache.js +63 -27
  162. package/dist/server/app-page-cache.js.map +1 -1
  163. package/dist/server/app-page-dispatch.d.ts +11 -1
  164. package/dist/server/app-page-dispatch.js +85 -14
  165. package/dist/server/app-page-dispatch.js.map +1 -1
  166. package/dist/server/app-page-element-builder.d.ts +10 -1
  167. package/dist/server/app-page-element-builder.js +38 -6
  168. package/dist/server/app-page-element-builder.js.map +1 -1
  169. package/dist/server/app-page-execution.js +2 -3
  170. package/dist/server/app-page-execution.js.map +1 -1
  171. package/dist/server/app-page-head.d.ts +7 -0
  172. package/dist/server/app-page-head.js +6 -1
  173. package/dist/server/app-page-head.js.map +1 -1
  174. package/dist/server/app-page-method.js.map +1 -1
  175. package/dist/server/app-page-params.js.map +1 -1
  176. package/dist/server/app-page-probe.d.ts +23 -1
  177. package/dist/server/app-page-probe.js +29 -1
  178. package/dist/server/app-page-probe.js.map +1 -1
  179. package/dist/server/app-page-render-observation.d.ts +35 -0
  180. package/dist/server/app-page-render-observation.js +68 -0
  181. package/dist/server/app-page-render-observation.js.map +1 -0
  182. package/dist/server/app-page-render.d.ts +12 -2
  183. package/dist/server/app-page-render.js +90 -7
  184. package/dist/server/app-page-render.js.map +1 -1
  185. package/dist/server/app-page-request.d.ts +1 -0
  186. package/dist/server/app-page-request.js +2 -1
  187. package/dist/server/app-page-request.js.map +1 -1
  188. package/dist/server/app-page-response.d.ts +2 -0
  189. package/dist/server/app-page-response.js +18 -7
  190. package/dist/server/app-page-response.js.map +1 -1
  191. package/dist/server/app-page-route-wiring.d.ts +9 -3
  192. package/dist/server/app-page-route-wiring.js +91 -62
  193. package/dist/server/app-page-route-wiring.js.map +1 -1
  194. package/dist/server/app-page-segment-state.d.ts +10 -0
  195. package/dist/server/app-page-segment-state.js +87 -0
  196. package/dist/server/app-page-segment-state.js.map +1 -0
  197. package/dist/server/app-page-stream.d.ts +9 -2
  198. package/dist/server/app-page-stream.js +4 -1
  199. package/dist/server/app-page-stream.js.map +1 -1
  200. package/dist/server/app-post-middleware-context.js.map +1 -1
  201. package/dist/server/app-prerender-endpoints.js.map +1 -1
  202. package/dist/server/app-prerender-static-params.js.map +1 -1
  203. package/dist/server/app-render-dependency.js.map +1 -1
  204. package/dist/server/app-request-context.js.map +1 -1
  205. package/dist/server/app-route-handler-cache.js.map +1 -1
  206. package/dist/server/app-route-handler-dispatch.js +3 -1
  207. package/dist/server/app-route-handler-dispatch.js.map +1 -1
  208. package/dist/server/app-route-handler-execution.js.map +1 -1
  209. package/dist/server/app-route-handler-policy.js +1 -0
  210. package/dist/server/app-route-handler-policy.js.map +1 -1
  211. package/dist/server/app-route-handler-response.js +4 -3
  212. package/dist/server/app-route-handler-response.js.map +1 -1
  213. package/dist/server/app-route-handler-runtime.js.map +1 -1
  214. package/dist/server/app-router-entry.js +7 -15
  215. package/dist/server/app-router-entry.js.map +1 -1
  216. package/dist/server/app-rsc-cache-busting.d.ts +23 -2
  217. package/dist/server/app-rsc-cache-busting.js +75 -19
  218. package/dist/server/app-rsc-cache-busting.js.map +1 -1
  219. package/dist/server/app-rsc-embedded-chunks.d.ts +9 -0
  220. package/dist/server/app-rsc-embedded-chunks.js +34 -0
  221. package/dist/server/app-rsc-embedded-chunks.js.map +1 -0
  222. package/dist/server/app-rsc-error-handler.js.map +1 -1
  223. package/dist/server/app-rsc-errors.d.ts +4 -1
  224. package/dist/server/app-rsc-errors.js +1 -1
  225. package/dist/server/app-rsc-errors.js.map +1 -1
  226. package/dist/server/app-rsc-handler.d.ts +18 -1
  227. package/dist/server/app-rsc-handler.js +55 -16
  228. package/dist/server/app-rsc-handler.js.map +1 -1
  229. package/dist/server/app-rsc-render-mode.d.ts +11 -0
  230. package/dist/server/app-rsc-render-mode.js +21 -0
  231. package/dist/server/app-rsc-render-mode.js.map +1 -0
  232. package/dist/server/app-rsc-request-normalization.d.ts +4 -1
  233. package/dist/server/app-rsc-request-normalization.js +7 -2
  234. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  235. package/dist/server/app-rsc-response-finalizer.d.ts +2 -1
  236. package/dist/server/app-rsc-response-finalizer.js +6 -1
  237. package/dist/server/app-rsc-response-finalizer.js.map +1 -1
  238. package/dist/server/app-rsc-route-matching.d.ts +23 -0
  239. package/dist/server/app-rsc-route-matching.js +45 -23
  240. package/dist/server/app-rsc-route-matching.js.map +1 -1
  241. package/dist/server/app-segment-config.js.map +1 -1
  242. package/dist/server/app-server-action-execution.d.ts +51 -5
  243. package/dist/server/app-server-action-execution.js +161 -51
  244. package/dist/server/app-server-action-execution.js.map +1 -1
  245. package/dist/server/app-ssr-entry.d.ts +7 -0
  246. package/dist/server/app-ssr-entry.js +44 -14
  247. package/dist/server/app-ssr-entry.js.map +1 -1
  248. package/dist/server/app-ssr-error-meta.d.ts +14 -0
  249. package/dist/server/app-ssr-error-meta.js +50 -0
  250. package/dist/server/app-ssr-error-meta.js.map +1 -0
  251. package/dist/server/app-ssr-stream.d.ts +1 -1
  252. package/dist/server/app-ssr-stream.js +9 -12
  253. package/dist/server/app-ssr-stream.js.map +1 -1
  254. package/dist/server/app-static-generation.js.map +1 -1
  255. package/dist/server/artifact-compatibility.d.ts +12 -2
  256. package/dist/server/artifact-compatibility.js +12 -8
  257. package/dist/server/artifact-compatibility.js.map +1 -1
  258. package/dist/server/cache-control.js +1 -0
  259. package/dist/server/cache-control.js.map +1 -1
  260. package/dist/server/cache-proof.d.ts +124 -5
  261. package/dist/server/cache-proof.js +416 -18
  262. package/dist/server/cache-proof.js.map +1 -1
  263. package/dist/server/csp.js.map +1 -1
  264. package/dist/server/dev-error-overlay-store.js.map +1 -1
  265. package/dist/server/dev-error-overlay.js +5 -0
  266. package/dist/server/dev-error-overlay.js.map +1 -1
  267. package/dist/server/dev-lockfile.d.ts +110 -0
  268. package/dist/server/dev-lockfile.js +180 -0
  269. package/dist/server/dev-lockfile.js.map +1 -0
  270. package/dist/server/dev-module-runner.js.map +1 -1
  271. package/dist/server/dev-origin-check.js.map +1 -1
  272. package/dist/server/dev-route-files.js.map +1 -1
  273. package/dist/server/dev-server.js +23 -10
  274. package/dist/server/dev-server.js.map +1 -1
  275. package/dist/server/file-based-metadata.d.ts +13 -0
  276. package/dist/server/file-based-metadata.js +49 -2
  277. package/dist/server/file-based-metadata.js.map +1 -1
  278. package/dist/server/headers.d.ts +81 -0
  279. package/dist/server/headers.js +104 -0
  280. package/dist/server/headers.js.map +1 -0
  281. package/dist/server/html.js +1 -1
  282. package/dist/server/html.js.map +1 -1
  283. package/dist/server/http-error-responses.d.ts +10 -0
  284. package/dist/server/http-error-responses.js +11 -1
  285. package/dist/server/http-error-responses.js.map +1 -1
  286. package/dist/server/image-optimization.d.ts +11 -1
  287. package/dist/server/image-optimization.js.map +1 -1
  288. package/dist/server/implicit-tags.js +2 -1
  289. package/dist/server/implicit-tags.js.map +1 -1
  290. package/dist/server/instrumentation-runtime.js.map +1 -1
  291. package/dist/server/instrumentation.js.map +1 -1
  292. package/dist/server/isr-cache.d.ts +12 -2
  293. package/dist/server/isr-cache.js +16 -5
  294. package/dist/server/isr-cache.js.map +1 -1
  295. package/dist/server/metadata-route-build-data.js.map +1 -1
  296. package/dist/server/metadata-route-response.js +22 -5
  297. package/dist/server/metadata-route-response.js.map +1 -1
  298. package/dist/server/metadata-routes.js +27 -8
  299. package/dist/server/metadata-routes.js.map +1 -1
  300. package/dist/server/middleware-matcher.js.map +1 -1
  301. package/dist/server/middleware-request-headers.d.ts +4 -1
  302. package/dist/server/middleware-request-headers.js +15 -8
  303. package/dist/server/middleware-request-headers.js.map +1 -1
  304. package/dist/server/middleware-response-headers.d.ts +2 -1
  305. package/dist/server/middleware-response-headers.js +1 -1
  306. package/dist/server/middleware-response-headers.js.map +1 -1
  307. package/dist/server/middleware-runtime.d.ts +1 -0
  308. package/dist/server/middleware-runtime.js +7 -3
  309. package/dist/server/middleware-runtime.js.map +1 -1
  310. package/dist/server/middleware.d.ts +12 -0
  311. package/dist/server/middleware.js +12 -0
  312. package/dist/server/middleware.js.map +1 -1
  313. package/dist/server/navigation-planner.d.ts +133 -0
  314. package/dist/server/navigation-planner.js +432 -0
  315. package/dist/server/navigation-planner.js.map +1 -0
  316. package/dist/server/navigation-trace.d.ts +19 -2
  317. package/dist/server/navigation-trace.js +20 -1
  318. package/dist/server/navigation-trace.js.map +1 -1
  319. package/dist/server/next-error-digest.d.ts +3 -2
  320. package/dist/server/next-error-digest.js +4 -2
  321. package/dist/server/next-error-digest.js.map +1 -1
  322. package/dist/server/normalize-path.d.ts +2 -1
  323. package/dist/server/normalize-path.js +4 -1
  324. package/dist/server/normalize-path.js.map +1 -1
  325. package/dist/server/pages-api-route.js +1 -0
  326. package/dist/server/pages-api-route.js.map +1 -1
  327. package/dist/server/pages-i18n.js.map +1 -1
  328. package/dist/server/pages-media-type.js.map +1 -1
  329. package/dist/server/pages-node-compat.js.map +1 -1
  330. package/dist/server/pages-page-data.d.ts +3 -2
  331. package/dist/server/pages-page-data.js +27 -5
  332. package/dist/server/pages-page-data.js.map +1 -1
  333. package/dist/server/pages-page-response.js +2 -1
  334. package/dist/server/pages-page-response.js.map +1 -1
  335. package/dist/server/prerender-work-unit-setup.js +1 -1
  336. package/dist/server/prerender-work-unit-setup.js.map +1 -1
  337. package/dist/server/prod-server.d.ts +28 -1
  338. package/dist/server/prod-server.js +97 -22
  339. package/dist/server/prod-server.js.map +1 -1
  340. package/dist/server/request-log.js.map +1 -1
  341. package/dist/server/request-pipeline.d.ts +1 -13
  342. package/dist/server/request-pipeline.js +3 -25
  343. package/dist/server/request-pipeline.js.map +1 -1
  344. package/dist/server/rsc-stream-hints.js.map +1 -1
  345. package/dist/server/seed-cache.js.map +1 -1
  346. package/dist/server/server-action-not-found.d.ts +16 -3
  347. package/dist/server/server-action-not-found.js +22 -4
  348. package/dist/server/server-action-not-found.js.map +1 -1
  349. package/dist/server/server-globals.d.ts +5 -0
  350. package/dist/server/server-globals.js +37 -0
  351. package/dist/server/server-globals.js.map +1 -0
  352. package/dist/server/socket-error-backstop.js.map +1 -1
  353. package/dist/server/static-file-cache.js +1 -1
  354. package/dist/server/static-file-cache.js.map +1 -1
  355. package/dist/server/worker-utils.d.ts +0 -7
  356. package/dist/server/worker-utils.js +3 -2
  357. package/dist/server/worker-utils.js.map +1 -1
  358. package/dist/shims/amp.js.map +1 -1
  359. package/dist/shims/app.d.ts +37 -4
  360. package/dist/shims/app.js +50 -1
  361. package/dist/shims/app.js.map +1 -0
  362. package/dist/shims/cache-for-request.js.map +1 -1
  363. package/dist/shims/cache-runtime.d.ts +19 -2
  364. package/dist/shims/cache-runtime.js +87 -19
  365. package/dist/shims/cache-runtime.js.map +1 -1
  366. package/dist/shims/cache.d.ts +20 -21
  367. package/dist/shims/cache.js +101 -15
  368. package/dist/shims/cache.js.map +1 -1
  369. package/dist/shims/client-hook-error.js.map +1 -1
  370. package/dist/shims/compat-router.js.map +1 -1
  371. package/dist/shims/config.js.map +1 -1
  372. package/dist/shims/constants.js.map +1 -1
  373. package/dist/shims/document.js.map +1 -1
  374. package/dist/shims/dynamic.d.ts +18 -10
  375. package/dist/shims/dynamic.js +107 -51
  376. package/dist/shims/dynamic.js.map +1 -1
  377. package/dist/shims/error-boundary.d.ts +35 -6
  378. package/dist/shims/error-boundary.js +116 -33
  379. package/dist/shims/error-boundary.js.map +1 -1
  380. package/dist/shims/error.d.ts +18 -1
  381. package/dist/shims/error.js +56 -1
  382. package/dist/shims/error.js.map +1 -1
  383. package/dist/shims/fetch-cache.d.ts +25 -1
  384. package/dist/shims/fetch-cache.js +159 -13
  385. package/dist/shims/fetch-cache.js.map +1 -1
  386. package/dist/shims/font-google-base.d.ts +22 -8
  387. package/dist/shims/font-google-base.js +41 -71
  388. package/dist/shims/font-google-base.js.map +1 -1
  389. package/dist/shims/font-local.d.ts +3 -20
  390. package/dist/shims/font-local.js +23 -75
  391. package/dist/shims/font-local.js.map +1 -1
  392. package/dist/shims/font-utils.d.ts +51 -0
  393. package/dist/shims/font-utils.js +97 -0
  394. package/dist/shims/font-utils.js.map +1 -0
  395. package/dist/shims/form.js +3 -1
  396. package/dist/shims/form.js.map +1 -1
  397. package/dist/shims/hash-scroll.d.ts +7 -0
  398. package/dist/shims/hash-scroll.js +30 -0
  399. package/dist/shims/hash-scroll.js.map +1 -0
  400. package/dist/shims/head-state.js.map +1 -1
  401. package/dist/shims/head.d.ts +3 -1
  402. package/dist/shims/head.js +28 -16
  403. package/dist/shims/head.js.map +1 -1
  404. package/dist/shims/headers.d.ts +11 -12
  405. package/dist/shims/headers.js +45 -8
  406. package/dist/shims/headers.js.map +1 -1
  407. package/dist/shims/i18n-context.js.map +1 -1
  408. package/dist/shims/i18n-state.js.map +1 -1
  409. package/dist/shims/image-config.d.ts +14 -1
  410. package/dist/shims/image-config.js +24 -1
  411. package/dist/shims/image-config.js.map +1 -1
  412. package/dist/shims/image.d.ts +1 -0
  413. package/dist/shims/image.js +159 -80
  414. package/dist/shims/image.js.map +1 -1
  415. package/dist/shims/internal/als-registry.js.map +1 -1
  416. package/dist/shims/internal/app-router-context.d.ts +7 -6
  417. package/dist/shims/internal/app-router-context.js +17 -6
  418. package/dist/shims/internal/app-router-context.js.map +1 -1
  419. package/dist/shims/internal/cookie-serialize.js.map +1 -1
  420. package/dist/shims/internal/make-hanging-promise.d.ts +1 -1
  421. package/dist/shims/internal/make-hanging-promise.js +1 -1
  422. package/dist/shims/internal/make-hanging-promise.js.map +1 -1
  423. package/dist/shims/internal/parse-cookie-header.js.map +1 -1
  424. package/dist/shims/internal/utils.js.map +1 -1
  425. package/dist/shims/internal/work-unit-async-storage.js +2 -2
  426. package/dist/shims/internal/work-unit-async-storage.js.map +1 -1
  427. package/dist/shims/layout-segment-context.js.map +1 -1
  428. package/dist/shims/legacy-image.js.map +1 -1
  429. package/dist/shims/link-prefetch.d.ts +42 -0
  430. package/dist/shims/link-prefetch.js +45 -0
  431. package/dist/shims/link-prefetch.js.map +1 -0
  432. package/dist/shims/link.d.ts +37 -4
  433. package/dist/shims/link.js +156 -46
  434. package/dist/shims/link.js.map +1 -1
  435. package/dist/shims/metadata.d.ts +16 -30
  436. package/dist/shims/metadata.js +87 -28
  437. package/dist/shims/metadata.js.map +1 -1
  438. package/dist/shims/navigation-state.js.map +1 -1
  439. package/dist/shims/navigation.d.ts +172 -10
  440. package/dist/shims/navigation.js +335 -70
  441. package/dist/shims/navigation.js.map +1 -1
  442. package/dist/shims/navigation.react-server.d.ts +3 -2
  443. package/dist/shims/navigation.react-server.js +5 -2
  444. package/dist/shims/navigation.react-server.js.map +1 -1
  445. package/dist/shims/offline.js.map +1 -1
  446. package/dist/shims/pages-router-runtime.d.ts +7 -0
  447. package/dist/shims/pages-router-runtime.js +16 -0
  448. package/dist/shims/pages-router-runtime.js.map +1 -0
  449. package/dist/shims/readonly-url-search-params.js.map +1 -1
  450. package/dist/shims/request-context.js.map +1 -1
  451. package/dist/shims/root-params.js.map +1 -1
  452. package/dist/shims/router-state.js.map +1 -1
  453. package/dist/shims/router.d.ts +69 -7
  454. package/dist/shims/router.js +232 -249
  455. package/dist/shims/router.js.map +1 -1
  456. package/dist/shims/script-nonce-context.js.map +1 -1
  457. package/dist/shims/script.js +110 -32
  458. package/dist/shims/script.js.map +1 -1
  459. package/dist/shims/server.js +12 -15
  460. package/dist/shims/server.js.map +1 -1
  461. package/dist/shims/slot.d.ts +7 -1
  462. package/dist/shims/slot.js +60 -7
  463. package/dist/shims/slot.js.map +1 -1
  464. package/dist/shims/thenable-params.js.map +1 -1
  465. package/dist/shims/unified-request-context.js +5 -0
  466. package/dist/shims/unified-request-context.js.map +1 -1
  467. package/dist/shims/unrecognized-action-error.d.ts +35 -0
  468. package/dist/shims/unrecognized-action-error.js +41 -0
  469. package/dist/shims/unrecognized-action-error.js.map +1 -0
  470. package/dist/shims/url-safety.js.map +1 -1
  471. package/dist/shims/url-utils.d.ts +22 -1
  472. package/dist/shims/url-utils.js +76 -3
  473. package/dist/shims/url-utils.js.map +1 -1
  474. package/dist/shims/use-merged-ref.js.map +1 -1
  475. package/dist/shims/web-vitals.d.ts +4 -21
  476. package/dist/shims/web-vitals.js +19 -6
  477. package/dist/shims/web-vitals.js.map +1 -1
  478. package/dist/utils/asset-prefix.d.ts +69 -0
  479. package/dist/utils/asset-prefix.js +91 -0
  480. package/dist/utils/asset-prefix.js.map +1 -0
  481. package/dist/utils/base-path.d.ts +7 -1
  482. package/dist/utils/base-path.js +10 -1
  483. package/dist/utils/base-path.js.map +1 -1
  484. package/dist/utils/cache-control-metadata.js.map +1 -1
  485. package/dist/utils/domain-locale.js.map +1 -1
  486. package/dist/utils/encode-cache-tag.d.ts +31 -0
  487. package/dist/utils/encode-cache-tag.js +38 -0
  488. package/dist/utils/encode-cache-tag.js.map +1 -0
  489. package/dist/utils/error-cause.js.map +1 -1
  490. package/dist/utils/hash.js.map +1 -1
  491. package/dist/utils/lazy-chunks.js.map +1 -1
  492. package/dist/utils/manifest-paths.js.map +1 -1
  493. package/dist/utils/mdx-scan.js.map +1 -1
  494. package/dist/utils/navigation-signal.d.ts +5 -0
  495. package/dist/utils/navigation-signal.js +14 -0
  496. package/dist/utils/navigation-signal.js.map +1 -0
  497. package/dist/utils/project.js.map +1 -1
  498. package/dist/utils/public-routes.js.map +1 -1
  499. package/dist/utils/query.js.map +1 -1
  500. package/dist/utils/safe-json-file.js.map +1 -1
  501. package/dist/utils/sorted-array.d.ts +9 -0
  502. package/dist/utils/sorted-array.js +22 -0
  503. package/dist/utils/sorted-array.js.map +1 -0
  504. package/dist/utils/text-stream.js.map +1 -1
  505. package/dist/utils/vinext-root.js.map +1 -1
  506. package/package.json +8 -6
@@ -1,26 +1,14 @@
1
+ import { normalizePathnameForRouteMatch } from "../routing/utils.js";
1
2
  import { stripBasePath } from "../utils/base-path.js";
3
+ import { RSC_ACTION_HEADER, VINEXT_INTERCEPTION_CONTEXT_HEADER, VINEXT_MOUNTED_SLOTS_HEADER } from "./headers.js";
4
+ import { normalizePath } from "./normalize-path.js";
2
5
  import { AppElementsWire } from "./app-elements-wire.js";
3
- import { getMountedSlotIdsHeader } from "./app-elements.js";
6
+ import { getMountedSlotIds, getMountedSlotIdsHeader } from "./app-elements.js";
7
+ import { createHistoryStateWithNavigationMetadata, createHistoryStateWithPreviousNextUrl, readHistoryStatePreviousNextUrl, readHistoryStateTraversalIndex, resolveHistoryTraversalIntent } from "./app-history-state.js";
4
8
  import { createRscRequestHeaders } from "./app-rsc-cache-busting.js";
5
- import { NavigationTraceReasonCodes, createNavigationTrace } from "./navigation-trace.js";
9
+ import { NavigationTraceReasonCodes, createNavigationLifecycleTraceFields, createNavigationTrace } from "./navigation-trace.js";
10
+ import { navigationPlanner } from "./navigation-planner.js";
6
11
  //#region src/server/app-browser-state.ts
7
- const VINEXT_PREVIOUS_NEXT_URL_HISTORY_STATE_KEY = "__vinext_previousNextUrl";
8
- function cloneHistoryState(state) {
9
- if (!state || typeof state !== "object") return {};
10
- const nextState = {};
11
- for (const [key, value] of Object.entries(state)) nextState[key] = value;
12
- return nextState;
13
- }
14
- function createHistoryStateWithPreviousNextUrl(state, previousNextUrl) {
15
- const nextState = cloneHistoryState(state);
16
- if (previousNextUrl === null) delete nextState[VINEXT_PREVIOUS_NEXT_URL_HISTORY_STATE_KEY];
17
- else nextState[VINEXT_PREVIOUS_NEXT_URL_HISTORY_STATE_KEY] = previousNextUrl;
18
- return Object.keys(nextState).length > 0 ? nextState : null;
19
- }
20
- function readHistoryStatePreviousNextUrl(state) {
21
- const value = cloneHistoryState(state)[VINEXT_PREVIOUS_NEXT_URL_HISTORY_STATE_KEY];
22
- return typeof value === "string" ? value : null;
23
- }
24
12
  function createOperationRecord(options) {
25
13
  return {
26
14
  id: options.id,
@@ -29,6 +17,15 @@ function createOperationRecord(options) {
29
17
  state: "pending"
30
18
  };
31
19
  }
20
+ function normalizeNavigationSnapshotMatchedUrl(pathname) {
21
+ return normalizePath(normalizePathnameForRouteMatch(pathname));
22
+ }
23
+ function createRouteSnapshotRouteId(options) {
24
+ if (options.interception !== null) return options.routeId;
25
+ const parsed = AppElementsWire.parseElementKey(options.routeId);
26
+ if (parsed?.kind !== "route" || parsed.interceptionContext === null) return options.routeId;
27
+ return AppElementsWire.encodeRouteId(parsed.path, null);
28
+ }
32
29
  function resolveInterceptionContextFromPreviousNextUrl(previousNextUrl, basePath = "") {
33
30
  if (previousNextUrl === null) return null;
34
31
  return stripBasePath(new URL(previousNextUrl, "http://localhost").pathname, basePath);
@@ -46,61 +43,167 @@ function resolveInterceptionContextFromPreviousNextUrl(previousNextUrl, basePath
46
43
  */
47
44
  function resolveServerActionRequestState(options) {
48
45
  const headers = createRscRequestHeaders();
49
- headers.set("x-rsc-action", options.actionId);
46
+ headers.set(RSC_ACTION_HEADER, options.actionId);
50
47
  const interceptionContext = resolveInterceptionContextFromPreviousNextUrl(options.previousNextUrl, options.basePath);
51
- if (interceptionContext !== null) headers.set("X-Vinext-Interception-Context", interceptionContext);
48
+ if (interceptionContext !== null) headers.set(VINEXT_INTERCEPTION_CONTEXT_HEADER, interceptionContext);
52
49
  const mountedSlotsHeader = getMountedSlotIdsHeader(options.elements);
53
- if (mountedSlotsHeader !== null) headers.set("X-Vinext-Mounted-Slots", mountedSlotsHeader);
50
+ if (mountedSlotsHeader !== null) headers.set(VINEXT_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);
54
51
  return { headers };
55
52
  }
56
- function shouldHardNavigate(currentRootLayoutTreePath, nextRootLayoutTreePath) {
57
- return currentRootLayoutTreePath !== null && nextRootLayoutTreePath !== null && currentRootLayoutTreePath !== nextRootLayoutTreePath;
53
+ function resolvePendingNavigationCommitDispositionDecision(options) {
54
+ const traceFields = createPendingNavigationTraceFields(options);
55
+ if (options.startedNavigationId !== options.activeNavigationId || options.pending.action.operation.startedVisibleCommitVersion !== options.currentState.visibleCommitVersion) return {
56
+ disposition: "skip",
57
+ preserveElementIds: [],
58
+ trace: createNavigationTrace(NavigationTraceReasonCodes.staleOperation, traceFields)
59
+ };
60
+ return mapNavigationDecisionToPendingDisposition(planPendingRootBoundaryFlightResponse({
61
+ currentState: options.currentState,
62
+ pending: options.pending,
63
+ routeManifest: options.routeManifest ?? null,
64
+ targetHref: options.targetHref,
65
+ traceFields
66
+ }));
67
+ }
68
+ function createPendingNavigationTraceFields(options) {
69
+ return {
70
+ ...createNavigationLifecycleTraceFields({
71
+ activeNavigationId: options.activeNavigationId,
72
+ currentRootLayoutTreePath: options.currentState.rootLayoutTreePath,
73
+ currentVisibleCommitVersion: options.currentState.visibleCommitVersion,
74
+ nextRootLayoutTreePath: options.pending.rootLayoutTreePath,
75
+ startedNavigationId: options.startedNavigationId,
76
+ startedVisibleCommitVersion: options.pending.action.operation.startedVisibleCommitVersion
77
+ }),
78
+ ...options.targetHref !== void 0 ? { targetHref: options.targetHref } : {}
79
+ };
58
80
  }
59
- function resolvePendingNavigationCommitDisposition(options) {
60
- if (options.startedNavigationId !== options.activeNavigationId) return "skip";
61
- if (options.startedVisibleCommitVersion !== options.currentVisibleCommitVersion) return "skip";
62
- if (shouldHardNavigate(options.currentRootLayoutTreePath, options.nextRootLayoutTreePath)) return "hard-navigate";
63
- return "dispatch";
81
+ function createNavigationSnapshotUrl(snapshot) {
82
+ const query = snapshot.searchParams.toString();
83
+ return query === "" ? snapshot.pathname : `${snapshot.pathname}?${query}`;
64
84
  }
65
- function resolvePendingNavigationCommitDispositionDecision(options) {
66
- const disposition = resolvePendingNavigationCommitDisposition(options);
67
- const traceFields = {
68
- activeNavigationId: options.activeNavigationId,
69
- currentRootLayoutTreePath: options.currentRootLayoutTreePath,
70
- currentVisibleCommitVersion: options.currentVisibleCommitVersion,
71
- nextRootLayoutTreePath: options.nextRootLayoutTreePath,
72
- startedNavigationId: options.startedNavigationId,
73
- startedVisibleCommitVersion: options.startedVisibleCommitVersion
85
+ function createMountedParallelSlotSnapshots(elements) {
86
+ const snapshots = [];
87
+ for (const slotId of getMountedSlotIds(elements)) {
88
+ const parsed = AppElementsWire.parseElementKey(slotId);
89
+ if (parsed?.kind !== "slot") continue;
90
+ snapshots.push({
91
+ ownerLayoutId: AppElementsWire.encodeLayoutId(parsed.treePath),
92
+ slotId
93
+ });
94
+ }
95
+ return snapshots;
96
+ }
97
+ function createVisibleRouteSnapshot(state) {
98
+ const displayUrl = createNavigationSnapshotUrl(state.navigationSnapshot);
99
+ const matchedUrl = normalizeNavigationSnapshotMatchedUrl(state.navigationSnapshot.pathname);
100
+ return {
101
+ displayUrl,
102
+ interception: state.interception,
103
+ interceptionContext: state.interceptionContext,
104
+ layoutIds: state.layoutIds,
105
+ matchedUrl,
106
+ mountedParallelSlots: createMountedParallelSlotSnapshots(state.elements),
107
+ rootBoundaryId: state.rootLayoutTreePath,
108
+ routeId: createRouteSnapshotRouteId({
109
+ interception: state.interception,
110
+ routeId: state.routeId
111
+ }),
112
+ slotBindings: state.slotBindings
74
113
  };
114
+ }
115
+ function createPendingRouteSnapshot(pending) {
116
+ const displayUrl = createNavigationSnapshotUrl(pending.action.navigationSnapshot);
117
+ const matchedUrl = normalizeNavigationSnapshotMatchedUrl(pending.action.navigationSnapshot.pathname);
75
118
  return {
76
- disposition,
77
- trace: createNavigationTrace(getPendingNavigationCommitDispositionTraceCode({
78
- currentRootLayoutTreePath: options.currentRootLayoutTreePath,
79
- disposition,
80
- nextRootLayoutTreePath: options.nextRootLayoutTreePath
81
- }), traceFields)
119
+ displayUrl,
120
+ interception: pending.action.interception,
121
+ interceptionContext: pending.action.interceptionContext,
122
+ layoutIds: pending.action.layoutIds,
123
+ matchedUrl,
124
+ mountedParallelSlots: createMountedParallelSlotSnapshots(pending.action.elements),
125
+ rootBoundaryId: pending.rootLayoutTreePath,
126
+ routeId: createRouteSnapshotRouteId({
127
+ interception: pending.action.interception,
128
+ routeId: pending.routeId
129
+ }),
130
+ slotBindings: pending.action.slotBindings
82
131
  };
83
132
  }
84
- function getPendingNavigationCommitDispositionTraceCode(options) {
85
- switch (options.disposition) {
86
- case "skip": return NavigationTraceReasonCodes.staleOperation;
87
- case "hard-navigate": return NavigationTraceReasonCodes.rootBoundaryChanged;
88
- case "dispatch": return options.currentRootLayoutTreePath === null || options.nextRootLayoutTreePath === null ? NavigationTraceReasonCodes.rootBoundaryUnknown : NavigationTraceReasonCodes.commitCurrent;
89
- default: {
90
- const _exhaustive = options.disposition;
91
- throw new Error("[vinext] Unknown navigation commit disposition: " + String(_exhaustive));
133
+ function createPendingNavigationOperationToken(options) {
134
+ return {
135
+ baseVisibleCommitVersion: options.pending.action.operation.startedVisibleCommitVersion,
136
+ deploymentVersion: null,
137
+ graphVersion: options.routeManifest?.graphVersion ?? null,
138
+ lane: options.pending.action.operation.lane,
139
+ operationId: options.pending.action.operation.id,
140
+ targetSnapshotFingerprint: createRootBoundarySnapshotFingerprint(options.targetSnapshot)
141
+ };
142
+ }
143
+ function createRootBoundarySnapshotFingerprint(snapshot) {
144
+ return `${snapshot.routeId}|root:${snapshot.rootBoundaryId ?? "unknown"}`;
145
+ }
146
+ function planPendingRootBoundaryFlightResponse(options) {
147
+ const targetSnapshot = createPendingRouteSnapshot(options.pending);
148
+ const token = createPendingNavigationOperationToken({
149
+ pending: options.pending,
150
+ routeManifest: options.routeManifest,
151
+ targetSnapshot
152
+ });
153
+ return navigationPlanner.plan({
154
+ routeManifest: options.routeManifest,
155
+ state: {
156
+ nextOperationToken: token,
157
+ traceFields: options.traceFields,
158
+ visibleCommitVersion: options.currentState.visibleCommitVersion,
159
+ visibleSnapshot: createVisibleRouteSnapshot(options.currentState)
160
+ },
161
+ event: {
162
+ kind: "flightResponseArrived",
163
+ result: {
164
+ href: options.targetHref ?? targetSnapshot.displayUrl,
165
+ targetSnapshot
166
+ },
167
+ token
92
168
  }
169
+ });
170
+ }
171
+ function mapNavigationDecisionToPendingDisposition(decision) {
172
+ switch (decision.kind) {
173
+ case "proposeCommit": return {
174
+ disposition: "dispatch",
175
+ preserveAbsentSlots: decision.proposal.preserveAbsentSlots,
176
+ preserveElementIds: decision.proposal.preserveElementIds,
177
+ preservePreviousSlotIds: decision.proposal.preservePreviousSlotIds,
178
+ trace: decision.trace
179
+ };
180
+ case "hardNavigate": return {
181
+ disposition: "hard-navigate",
182
+ preserveElementIds: [],
183
+ trace: decision.trace
184
+ };
185
+ case "noCommit": return {
186
+ disposition: "skip",
187
+ preserveElementIds: [],
188
+ trace: decision.trace
189
+ };
190
+ case "requestWork": throw new Error(`[vinext] Root-boundary commit planning returned requestWork (${decision.work.kind}); flightResponseArrived should never request work`);
191
+ default: throw new Error("[vinext] Unknown navigation decision: " + String(decision));
93
192
  }
94
193
  }
95
194
  async function createPendingNavigationCommit(options) {
96
195
  const elements = await options.nextElements;
97
196
  const metadata = AppElementsWire.readMetadata(elements);
98
- const previousNextUrl = options.previousNextUrl !== void 0 ? options.previousNextUrl : options.currentState.previousNextUrl;
197
+ const requestedPreviousNextUrl = options.previousNextUrl !== void 0 ? options.previousNextUrl : options.currentState.previousNextUrl;
198
+ const previousNextUrl = metadata.interception === null ? null : requestedPreviousNextUrl;
99
199
  return {
100
200
  action: {
101
201
  elements,
202
+ interception: metadata.interception,
102
203
  interceptionContext: metadata.interceptionContext,
204
+ layoutIds: metadata.layoutIds,
103
205
  layoutFlags: metadata.layoutFlags,
206
+ slotBindings: metadata.slotBindings,
104
207
  navigationSnapshot: options.navigationSnapshot,
105
208
  operation: createOperationRecord({
106
209
  id: options.renderId,
@@ -113,6 +216,7 @@ async function createPendingNavigationCommit(options) {
113
216
  routeId: metadata.routeId,
114
217
  type: options.type
115
218
  },
219
+ interception: metadata.interception,
116
220
  interceptionContext: metadata.interceptionContext,
117
221
  previousNextUrl,
118
222
  rootLayoutTreePath: metadata.rootLayoutTreePath,
@@ -120,6 +224,6 @@ async function createPendingNavigationCommit(options) {
120
224
  };
121
225
  }
122
226
  //#endregion
123
- export { createHistoryStateWithPreviousNextUrl, createPendingNavigationCommit, readHistoryStatePreviousNextUrl, resolveInterceptionContextFromPreviousNextUrl, resolvePendingNavigationCommitDisposition, resolvePendingNavigationCommitDispositionDecision, resolveServerActionRequestState, shouldHardNavigate };
227
+ export { createHistoryStateWithNavigationMetadata, createHistoryStateWithPreviousNextUrl, createPendingNavigationCommit, readHistoryStatePreviousNextUrl, readHistoryStateTraversalIndex, resolveHistoryTraversalIntent, resolveInterceptionContextFromPreviousNextUrl, resolvePendingNavigationCommitDispositionDecision, resolveServerActionRequestState };
124
228
 
125
229
  //# sourceMappingURL=app-browser-state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-browser-state.js","names":[],"sources":["../../src/server/app-browser-state.ts"],"sourcesContent":["import { stripBasePath } from \"../utils/base-path.js\";\nimport {\n AppElementsWire,\n getMountedSlotIdsHeader,\n type AppElements,\n type LayoutFlags,\n} from \"./app-elements.js\";\nimport { createRscRequestHeaders } from \"./app-rsc-cache-busting.js\";\nimport {\n NavigationTraceReasonCodes,\n createNavigationTrace,\n type NavigationTrace,\n type NavigationTraceReasonCode,\n} from \"./navigation-trace.js\";\nimport type { ClientNavigationRenderSnapshot } from \"vinext/shims/navigation\";\n\nconst VINEXT_PREVIOUS_NEXT_URL_HISTORY_STATE_KEY = \"__vinext_previousNextUrl\";\n\ntype HistoryStateRecord = {\n [key: string]: unknown;\n};\n\nexport type OperationLane = \"navigation\" | \"refresh\" | \"traverse\" | \"server-action\" | \"hmr\";\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 interceptionContext: string | null;\n layoutFlags: LayoutFlags;\n previousNextUrl: string | null;\n renderId: number;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n rootLayoutTreePath: string | null;\n routeId: string;\n visibleCommitVersion: number;\n};\n\nexport type AppRouterAction = {\n elements: AppElements;\n interceptionContext: string | null;\n layoutFlags: LayoutFlags;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n operation: PendingOperationRecord;\n previousNextUrl: string | null;\n renderId: number;\n rootLayoutTreePath: string | null;\n routeId: string;\n type: \"navigate\" | \"replace\" | \"traverse\";\n};\n\nexport type PendingNavigationCommit = {\n action: AppRouterAction;\n interceptionContext: string | null;\n previousNextUrl: string | null;\n rootLayoutTreePath: string | null;\n routeId: string;\n};\n\ntype PendingNavigationCommitDisposition = \"dispatch\" | \"hard-navigate\" | \"skip\";\ntype PendingNavigationCommitDispositionDecision = {\n disposition: PendingNavigationCommitDisposition;\n trace: NavigationTrace;\n};\n\nfunction cloneHistoryState(state: unknown): HistoryStateRecord {\n if (!state || typeof state !== \"object\") {\n return {};\n }\n\n const nextState: HistoryStateRecord = {};\n for (const [key, value] of Object.entries(state)) {\n nextState[key] = value;\n }\n return nextState;\n}\n\nexport function createHistoryStateWithPreviousNextUrl(\n state: unknown,\n previousNextUrl: string | null,\n): HistoryStateRecord | null {\n const nextState = cloneHistoryState(state);\n\n if (previousNextUrl === null) {\n delete nextState[VINEXT_PREVIOUS_NEXT_URL_HISTORY_STATE_KEY];\n } else {\n nextState[VINEXT_PREVIOUS_NEXT_URL_HISTORY_STATE_KEY] = previousNextUrl;\n }\n\n return Object.keys(nextState).length > 0 ? nextState : null;\n}\n\nexport function readHistoryStatePreviousNextUrl(state: unknown): string | null {\n const value = cloneHistoryState(state)[VINEXT_PREVIOUS_NEXT_URL_HISTORY_STATE_KEY];\n return typeof value === \"string\" ? value : null;\n}\n\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 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(\"x-rsc-action\", options.actionId);\n\n const interceptionContext = resolveInterceptionContextFromPreviousNextUrl(\n options.previousNextUrl,\n options.basePath,\n );\n if (interceptionContext !== null) {\n headers.set(\"X-Vinext-Interception-Context\", interceptionContext);\n }\n\n const mountedSlotsHeader = getMountedSlotIdsHeader(options.elements);\n if (mountedSlotsHeader !== null) {\n headers.set(\"X-Vinext-Mounted-Slots\", mountedSlotsHeader);\n }\n\n return { headers };\n}\n\nexport function shouldHardNavigate(\n currentRootLayoutTreePath: string | null,\n nextRootLayoutTreePath: string | null,\n): boolean {\n // `null` means the payload could not identify an enclosing root layout\n // boundary. Treat that as soft-navigation compatible so fallback payloads\n // do not force a hard reload purely because metadata is absent.\n return (\n currentRootLayoutTreePath !== null &&\n nextRootLayoutTreePath !== null &&\n currentRootLayoutTreePath !== nextRootLayoutTreePath\n );\n}\n\nexport function resolvePendingNavigationCommitDisposition(options: {\n activeNavigationId: number;\n currentVisibleCommitVersion: number;\n currentRootLayoutTreePath: string | null;\n nextRootLayoutTreePath: string | null;\n startedNavigationId: number;\n startedVisibleCommitVersion: number;\n}): PendingNavigationCommitDisposition {\n if (options.startedNavigationId !== options.activeNavigationId) {\n return \"skip\";\n }\n\n if (options.startedVisibleCommitVersion !== options.currentVisibleCommitVersion) {\n return \"skip\";\n }\n\n if (shouldHardNavigate(options.currentRootLayoutTreePath, options.nextRootLayoutTreePath)) {\n return \"hard-navigate\";\n }\n\n return \"dispatch\";\n}\n\nexport function resolvePendingNavigationCommitDispositionDecision(options: {\n activeNavigationId: number;\n currentVisibleCommitVersion: number;\n currentRootLayoutTreePath: string | null;\n nextRootLayoutTreePath: string | null;\n startedNavigationId: number;\n startedVisibleCommitVersion: number;\n}): PendingNavigationCommitDispositionDecision {\n const disposition = resolvePendingNavigationCommitDisposition(options);\n const traceFields = {\n activeNavigationId: options.activeNavigationId,\n currentRootLayoutTreePath: options.currentRootLayoutTreePath,\n currentVisibleCommitVersion: options.currentVisibleCommitVersion,\n nextRootLayoutTreePath: options.nextRootLayoutTreePath,\n startedNavigationId: options.startedNavigationId,\n startedVisibleCommitVersion: options.startedVisibleCommitVersion,\n };\n\n return {\n disposition,\n trace: createNavigationTrace(\n getPendingNavigationCommitDispositionTraceCode({\n currentRootLayoutTreePath: options.currentRootLayoutTreePath,\n disposition,\n nextRootLayoutTreePath: options.nextRootLayoutTreePath,\n }),\n traceFields,\n ),\n };\n}\n\nfunction getPendingNavigationCommitDispositionTraceCode(options: {\n currentRootLayoutTreePath: string | null;\n disposition: PendingNavigationCommitDisposition;\n nextRootLayoutTreePath: string | null;\n}): NavigationTraceReasonCode {\n switch (options.disposition) {\n case \"skip\":\n return NavigationTraceReasonCodes.staleOperation;\n case \"hard-navigate\":\n return NavigationTraceReasonCodes.rootBoundaryChanged;\n case \"dispatch\":\n return options.currentRootLayoutTreePath === null || options.nextRootLayoutTreePath === null\n ? NavigationTraceReasonCodes.rootBoundaryUnknown\n : NavigationTraceReasonCodes.commitCurrent;\n default: {\n const _exhaustive: never = options.disposition;\n throw new Error(\"[vinext] Unknown navigation commit disposition: \" + 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 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 previousNextUrl =\n options.previousNextUrl !== undefined\n ? options.previousNextUrl\n : options.currentState.previousNextUrl;\n\n return {\n action: {\n elements,\n interceptionContext: metadata.interceptionContext,\n layoutFlags: metadata.layoutFlags,\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 action.interceptionContext / action.rootLayoutTreePath / action.routeId.\n interceptionContext: metadata.interceptionContext,\n previousNextUrl,\n rootLayoutTreePath: metadata.rootLayoutTreePath,\n routeId: metadata.routeId,\n };\n}\n"],"mappings":"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"}
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 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 {\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 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 interception: AppElementsInterception | null;\n interceptionContext: string | null;\n previousNextUrl: string | null;\n rootLayoutTreePath: string | null;\n routeId: string;\n};\n\ntype PendingNavigationCommitDisposition = \"dispatch\" | \"hard-navigate\" | \"skip\";\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\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\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\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 // 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 // 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 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 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 action.interceptionContext / action.rootLayoutTreePath / action.routeId.\n interception: metadata.interception,\n interceptionContext: metadata.interceptionContext,\n previousNextUrl,\n rootLayoutTreePath: metadata.rootLayoutTreePath,\n routeId: metadata.routeId,\n };\n}\n"],"mappings":"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"}
@@ -1,25 +1,30 @@
1
+ import { RSC_FORM_STATE_GLOBAL } from "./app-browser-hydration.js";
2
+ import { RscEmbeddedChunk } from "./app-rsc-embedded-chunks.js";
3
+ import { ReactFormState } from "react-dom/client";
4
+
1
5
  //#region src/server/app-browser-stream.d.ts
2
6
  type NavigationSnapshot = {
3
7
  pathname: string;
4
8
  searchParams: [string, string][];
5
9
  };
6
10
  type LegacyRscEmbedData = {
7
- rsc: string[];
11
+ rsc: RscEmbeddedChunk[];
8
12
  params?: Record<string, string | string[]>;
9
13
  nav?: NavigationSnapshot;
10
14
  };
11
15
  type VinextBrowserGlobals = {
12
16
  __VINEXT_RSC__?: LegacyRscEmbedData;
13
- __VINEXT_RSC_CHUNKS__?: string[];
17
+ __VINEXT_RSC_CHUNKS__?: RscEmbeddedChunk[];
14
18
  __VINEXT_RSC_DONE__?: boolean;
19
+ [RSC_FORM_STATE_GLOBAL]?: ReactFormState;
15
20
  __VINEXT_RSC_PARAMS__?: Record<string, string | string[]>;
16
21
  __VINEXT_RSC_NAV__?: NavigationSnapshot;
17
22
  };
18
23
  declare function getVinextBrowserGlobal(): typeof globalThis & VinextBrowserGlobals;
19
24
  /**
20
- * Convert embedded text chunks back to a ReadableStream of Uint8Array chunks.
25
+ * Convert embedded chunks back to a ReadableStream of Uint8Array chunks.
21
26
  */
22
- declare function chunksToReadableStream(chunks: readonly string[]): ReadableStream<Uint8Array>;
27
+ declare function chunksToReadableStream(chunks: readonly RscEmbeddedChunk[]): ReadableStream<Uint8Array>;
23
28
  /**
24
29
  * Create a ReadableStream from progressively-embedded RSC chunks.
25
30
  *
@@ -1,14 +1,17 @@
1
+ import { decodeRscEmbeddedChunk } from "./app-rsc-embedded-chunks.js";
1
2
  //#region src/server/app-browser-stream.ts
2
3
  function getVinextBrowserGlobal() {
3
4
  return globalThis;
4
5
  }
6
+ function createUnexpectedRscStreamCloseError() {
7
+ return /* @__PURE__ */ new Error("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.");
8
+ }
5
9
  /**
6
- * Convert embedded text chunks back to a ReadableStream of Uint8Array chunks.
10
+ * Convert embedded chunks back to a ReadableStream of Uint8Array chunks.
7
11
  */
8
12
  function chunksToReadableStream(chunks) {
9
- const encoder = new TextEncoder();
10
13
  return new ReadableStream({ start(controller) {
11
- for (const chunk of chunks) controller.enqueue(encoder.encode(chunk));
14
+ for (const chunk of chunks) controller.enqueue(decodeRscEmbeddedChunk(chunk));
12
15
  controller.close();
13
16
  } });
14
17
  }
@@ -20,32 +23,50 @@ function chunksToReadableStream(chunks) {
20
23
  * instead of polling with setTimeout.
21
24
  */
22
25
  function createProgressiveRscStream() {
23
- const encoder = new TextEncoder();
24
26
  return new ReadableStream({ start(controller) {
25
27
  const vinext = getVinextBrowserGlobal();
26
28
  const initialChunks = vinext.__VINEXT_RSC_CHUNKS__ ?? [];
27
- for (const chunk of initialChunks) controller.enqueue(encoder.encode(chunk));
29
+ for (const chunk of initialChunks) controller.enqueue(decodeRscEmbeddedChunk(chunk));
28
30
  if (vinext.__VINEXT_RSC_DONE__) {
29
31
  controller.close();
30
32
  return;
31
33
  }
32
34
  let closed = false;
35
+ let cancelDocumentCompletionCheck;
36
+ const cancelPendingDocumentCompletionCheck = () => {
37
+ const cancel = cancelDocumentCompletionCheck;
38
+ cancelDocumentCompletionCheck = void 0;
39
+ cancel?.();
40
+ };
33
41
  const closeOnce = () => {
34
42
  if (!closed) {
35
43
  closed = true;
44
+ cancelPendingDocumentCompletionCheck();
36
45
  controller.close();
37
46
  }
38
47
  };
48
+ const errorOnce = () => {
49
+ if (!closed) {
50
+ closed = true;
51
+ cancelPendingDocumentCompletionCheck();
52
+ controller.error(createUnexpectedRscStreamCloseError());
53
+ }
54
+ };
39
55
  const arr = vinext.__VINEXT_RSC_CHUNKS__ ??= [];
40
56
  arr.push = function(...chunks) {
41
57
  const length = Array.prototype.push.apply(this, chunks);
42
58
  if (closed) return length;
43
- for (const chunk of chunks) controller.enqueue(encoder.encode(chunk));
59
+ for (const chunk of chunks) controller.enqueue(decodeRscEmbeddedChunk(chunk));
44
60
  if (vinext.__VINEXT_RSC_DONE__) closeOnce();
45
61
  return length;
46
62
  };
47
- if (typeof document !== "undefined") if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", closeOnce);
48
- else closeOnce();
63
+ if (typeof document !== "undefined") if (document.readyState === "loading") {
64
+ document.addEventListener("DOMContentLoaded", errorOnce);
65
+ cancelDocumentCompletionCheck = () => document.removeEventListener("DOMContentLoaded", errorOnce);
66
+ } else {
67
+ const timeoutId = setTimeout(errorOnce);
68
+ cancelDocumentCompletionCheck = () => clearTimeout(timeoutId);
69
+ }
49
70
  } });
50
71
  }
51
72
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"app-browser-stream.js","names":[],"sources":["../../src/server/app-browser-stream.ts"],"sourcesContent":["type NavigationSnapshot = {\n pathname: string;\n searchParams: [string, string][];\n};\n\ntype LegacyRscEmbedData = {\n rsc: string[];\n params?: Record<string, string | string[]>;\n nav?: NavigationSnapshot;\n};\n\ntype VinextBrowserGlobals = {\n __VINEXT_RSC__?: LegacyRscEmbedData;\n __VINEXT_RSC_CHUNKS__?: string[];\n __VINEXT_RSC_DONE__?: boolean;\n __VINEXT_RSC_PARAMS__?: Record<string, string | string[]>;\n __VINEXT_RSC_NAV__?: NavigationSnapshot;\n};\n\nexport function getVinextBrowserGlobal(): typeof globalThis & VinextBrowserGlobals {\n return globalThis as typeof globalThis & VinextBrowserGlobals;\n}\n\n/**\n * Convert embedded text chunks back to a ReadableStream of Uint8Array chunks.\n */\nexport function chunksToReadableStream(chunks: readonly string[]): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n return new ReadableStream<Uint8Array>({\n start(controller) {\n for (const chunk of chunks) {\n controller.enqueue(encoder.encode(chunk));\n }\n controller.close();\n },\n });\n}\n\n/**\n * Create a ReadableStream from progressively-embedded RSC chunks.\n *\n * The server pushes chunks into `__VINEXT_RSC_CHUNKS__` via inline <script>\n * tags. We monkey-patch `push()` so new chunks stream to React immediately\n * instead of polling with setTimeout.\n */\nexport function createProgressiveRscStream(): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream<Uint8Array>({\n start(controller) {\n const vinext = getVinextBrowserGlobal();\n const initialChunks = vinext.__VINEXT_RSC_CHUNKS__ ?? [];\n\n for (const chunk of initialChunks) {\n controller.enqueue(encoder.encode(chunk));\n }\n\n if (vinext.__VINEXT_RSC_DONE__) {\n controller.close();\n return;\n }\n\n let closed = false;\n const closeOnce = () => {\n if (!closed) {\n closed = true;\n controller.close();\n }\n };\n\n const arr = (vinext.__VINEXT_RSC_CHUNKS__ ??= []);\n arr.push = function (...chunks: string[]): 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(encoder.encode(chunk));\n }\n\n if (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\", closeOnce);\n } else {\n closeOnce();\n }\n }\n },\n });\n}\n"],"mappings":";AAmBA,SAAgB,yBAAmE;AACjF,QAAO;;;;;AAMT,SAAgB,uBAAuB,QAAuD;CAC5F,MAAM,UAAU,IAAI,aAAa;AACjC,QAAO,IAAI,eAA2B,EACpC,MAAM,YAAY;AAChB,OAAK,MAAM,SAAS,OAClB,YAAW,QAAQ,QAAQ,OAAO,MAAM,CAAC;AAE3C,aAAW,OAAO;IAErB,CAAC;;;;;;;;;AAUJ,SAAgB,6BAAyD;CACvE,MAAM,UAAU,IAAI,aAAa;AAEjC,QAAO,IAAI,eAA2B,EACpC,MAAM,YAAY;EAChB,MAAM,SAAS,wBAAwB;EACvC,MAAM,gBAAgB,OAAO,yBAAyB,EAAE;AAExD,OAAK,MAAM,SAAS,cAClB,YAAW,QAAQ,QAAQ,OAAO,MAAM,CAAC;AAG3C,MAAI,OAAO,qBAAqB;AAC9B,cAAW,OAAO;AAClB;;EAGF,IAAI,SAAS;EACb,MAAM,kBAAkB;AACtB,OAAI,CAAC,QAAQ;AACX,aAAS;AACT,eAAW,OAAO;;;EAItB,MAAM,MAAO,OAAO,0BAA0B,EAAE;AAChD,MAAI,OAAO,SAAU,GAAG,QAA0B;GAChD,MAAM,SAAS,MAAM,UAAU,KAAK,MAAM,MAAM,OAAO;AAEvD,OAAI,OAAQ,QAAO;AAEnB,QAAK,MAAM,SAAS,OAClB,YAAW,QAAQ,QAAQ,OAAO,MAAM,CAAC;AAG3C,OAAI,OAAO,oBACT,YAAW;AAGb,UAAO;;AAGT,MAAI,OAAO,aAAa,YACtB,KAAI,SAAS,eAAe,UAC1B,UAAS,iBAAiB,oBAAoB,UAAU;MAExD,YAAW;IAIlB,CAAC"}
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 { RSC_FORM_STATE_GLOBAL } from \"./app-browser-hydration.js\";\nimport { decodeRscEmbeddedChunk, type RscEmbeddedChunk } from \"./app-rsc-embedded-chunks.js\";\n\ntype NavigationSnapshot = {\n pathname: string;\n searchParams: [string, string][];\n};\n\ntype LegacyRscEmbedData = {\n rsc: RscEmbeddedChunk[];\n params?: Record<string, string | string[]>;\n nav?: NavigationSnapshot;\n};\n\ntype VinextBrowserGlobals = {\n __VINEXT_RSC__?: LegacyRscEmbedData;\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__?: NavigationSnapshot;\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\n/**\n * Create a ReadableStream from progressively-embedded RSC chunks.\n *\n * The server pushes chunks into `__VINEXT_RSC_CHUNKS__` via inline <script>\n * tags. We monkey-patch `push()` so new chunks stream to React immediately\n * 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 initialChunks = vinext.__VINEXT_RSC_CHUNKS__ ?? [];\n\n for (const chunk of initialChunks) {\n controller.enqueue(decodeRscEmbeddedChunk(chunk));\n }\n\n if (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 arr = (vinext.__VINEXT_RSC_CHUNKS__ ??= []);\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 (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":";;AAwBA,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;;;;;;;;;AAUJ,SAAgB,6BAAyD;CACvE,OAAO,IAAI,eAA2B,EACpC,MAAM,YAAY;EAChB,MAAM,SAAS,wBAAwB;EACvC,MAAM,gBAAgB,OAAO,yBAAyB,EAAE;EAExD,KAAK,MAAM,SAAS,eAClB,WAAW,QAAQ,uBAAuB,MAAM,CAAC;EAGnD,IAAI,OAAO,qBAAqB;GAC9B,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,MAAO,OAAO,0BAA0B,EAAE;EAChD,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,OAAO,qBACT,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"}
@@ -1,11 +1,16 @@
1
+ import { RouteManifest } from "../routing/app-route-graph.js";
1
2
  import { ClientNavigationRenderSnapshot } from "../shims/navigation.js";
2
3
  import { AppElements } from "./app-elements-wire.js";
3
4
  import { NavigationTrace } from "./navigation-trace.js";
4
- import { AppRouterAction, AppRouterState, OperationLane, PendingNavigationCommit } from "./app-browser-state.js";
5
+ import { OperationLane } from "./navigation-planner.js";
6
+ import { AppRouterAction, AppRouterState, PendingNavigationCommit } from "./app-browser-state.js";
5
7
 
6
8
  //#region src/server/app-browser-visible-commit.d.ts
7
9
  type VisibleCommitDecision = {
8
10
  disposition: "commit";
11
+ preserveAbsentSlots: boolean;
12
+ preserveElementIds: readonly string[];
13
+ preservePreviousSlotIds: readonly string[];
9
14
  trace: NavigationTrace;
10
15
  };
11
16
  type HardNavigateCommitDecision = {
@@ -22,6 +27,7 @@ type ApprovedVisibleCommit = {
22
27
  readonly [approvedVisibleCommitBrand]: true;
23
28
  readonly action: AppRouterAction;
24
29
  readonly decision: VisibleCommitDecision;
30
+ readonly interception: AppRouterAction["interception"];
25
31
  readonly interceptionContext: string | null;
26
32
  readonly previousNextUrl: string | null;
27
33
  readonly rootLayoutTreePath: string | null;
@@ -48,7 +54,9 @@ declare function approvePendingNavigationCommit(options: {
48
54
  activeNavigationId: number;
49
55
  currentState: AppRouterState;
50
56
  pending: PendingNavigationCommit;
57
+ routeManifest?: RouteManifest | null;
51
58
  startedNavigationId: number;
59
+ targetHref: string;
52
60
  }): CommitApproval;
53
61
  declare function resolveAndClassifyNavigationCommit(options: {
54
62
  activeNavigationId: number;
@@ -60,7 +68,9 @@ declare function resolveAndClassifyNavigationCommit(options: {
60
68
  operationLane: OperationLane;
61
69
  previousNextUrl?: string | null;
62
70
  renderId: number;
71
+ routeManifest?: RouteManifest | null;
63
72
  startedNavigationId: number;
73
+ targetHref: string;
64
74
  type: "navigate" | "replace" | "traverse";
65
75
  }): Promise<ClassifiedPendingNavigationCommit>;
66
76
  //#endregion