vinext 0.0.50 → 0.0.52

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 (462) hide show
  1. package/dist/build/google-fonts/fallback-metrics-data.js +14031 -0
  2. package/dist/build/google-fonts/fallback-metrics-data.js.map +1 -0
  3. package/dist/build/google-fonts/fallback-metrics.d.ts +13 -0
  4. package/dist/build/google-fonts/fallback-metrics.js +46 -0
  5. package/dist/build/google-fonts/fallback-metrics.js.map +1 -0
  6. package/dist/build/precompress.d.ts +13 -2
  7. package/dist/build/precompress.js +23 -13
  8. package/dist/build/precompress.js.map +1 -1
  9. package/dist/build/prerender.d.ts +4 -15
  10. package/dist/build/prerender.js +83 -53
  11. package/dist/build/prerender.js.map +1 -1
  12. package/dist/build/report.d.ts +5 -4
  13. package/dist/build/report.js +196 -348
  14. package/dist/build/report.js.map +1 -1
  15. package/dist/check.js +5 -0
  16. package/dist/check.js.map +1 -1
  17. package/dist/cli-args.d.ts +1 -0
  18. package/dist/cli-args.js +5 -0
  19. package/dist/cli-args.js.map +1 -1
  20. package/dist/cli.js +99 -3
  21. package/dist/cli.js.map +1 -1
  22. package/dist/client/navigation-runtime.d.ts +47 -0
  23. package/dist/client/navigation-runtime.js +156 -0
  24. package/dist/client/navigation-runtime.js.map +1 -0
  25. package/dist/client/pages-router-link-navigation.d.ts +26 -0
  26. package/dist/client/pages-router-link-navigation.js +14 -0
  27. package/dist/client/pages-router-link-navigation.js.map +1 -0
  28. package/dist/client/vinext-next-data.d.ts +12 -2
  29. package/dist/client/vinext-next-data.js +50 -1
  30. package/dist/client/vinext-next-data.js.map +1 -0
  31. package/dist/client/window-next.d.ts +3 -1
  32. package/dist/client/window-next.js.map +1 -1
  33. package/dist/cloudflare/kv-cache-handler.js +2 -1
  34. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  35. package/dist/config/config-matchers.d.ts +63 -16
  36. package/dist/config/config-matchers.js +143 -8
  37. package/dist/config/config-matchers.js.map +1 -1
  38. package/dist/config/dotenv.d.ts +11 -1
  39. package/dist/config/dotenv.js.map +1 -1
  40. package/dist/config/next-config.d.ts +107 -5
  41. package/dist/config/next-config.js +233 -7
  42. package/dist/config/next-config.js.map +1 -1
  43. package/dist/config/tsconfig-paths.d.ts +13 -0
  44. package/dist/config/tsconfig-paths.js +117 -0
  45. package/dist/config/tsconfig-paths.js.map +1 -0
  46. package/dist/deploy.js +104 -41
  47. package/dist/deploy.js.map +1 -1
  48. package/dist/entries/app-browser-entry.d.ts +2 -2
  49. package/dist/entries/app-browser-entry.js +34 -3
  50. package/dist/entries/app-browser-entry.js.map +1 -1
  51. package/dist/entries/app-rsc-entry.d.ts +19 -1
  52. package/dist/entries/app-rsc-entry.js +89 -23
  53. package/dist/entries/app-rsc-entry.js.map +1 -1
  54. package/dist/entries/app-rsc-manifest.d.ts +10 -0
  55. package/dist/entries/app-rsc-manifest.js +57 -7
  56. package/dist/entries/app-rsc-manifest.js.map +1 -1
  57. package/dist/entries/app-ssr-entry.d.ts +3 -3
  58. package/dist/entries/app-ssr-entry.js +4 -4
  59. package/dist/entries/app-ssr-entry.js.map +1 -1
  60. package/dist/entries/pages-client-entry.js +21 -7
  61. package/dist/entries/pages-client-entry.js.map +1 -1
  62. package/dist/entries/pages-server-entry.js +77 -9
  63. package/dist/entries/pages-server-entry.js.map +1 -1
  64. package/dist/entries/runtime-entry-module.d.ts +2 -1
  65. package/dist/entries/runtime-entry-module.js +9 -3
  66. package/dist/entries/runtime-entry-module.js.map +1 -1
  67. package/dist/index.js +260 -75
  68. package/dist/index.js.map +1 -1
  69. package/dist/plugins/client-reference-dedup.d.ts +15 -2
  70. package/dist/plugins/client-reference-dedup.js +138 -16
  71. package/dist/plugins/client-reference-dedup.js.map +1 -1
  72. package/dist/plugins/css-data-url.d.ts +7 -0
  73. package/dist/plugins/css-data-url.js +81 -0
  74. package/dist/plugins/css-data-url.js.map +1 -0
  75. package/dist/plugins/fonts.d.ts +2 -2
  76. package/dist/plugins/fonts.js +20 -9
  77. package/dist/plugins/fonts.js.map +1 -1
  78. package/dist/plugins/middleware-server-only.d.ts +54 -0
  79. package/dist/plugins/middleware-server-only.js +91 -0
  80. package/dist/plugins/middleware-server-only.js.map +1 -0
  81. package/dist/plugins/optimize-imports.js +4 -4
  82. package/dist/plugins/optimize-imports.js.map +1 -1
  83. package/dist/plugins/sass.d.ts +34 -0
  84. package/dist/plugins/sass.js +22 -0
  85. package/dist/plugins/sass.js.map +1 -0
  86. package/dist/plugins/strip-server-exports.js +5 -8
  87. package/dist/plugins/strip-server-exports.js.map +1 -1
  88. package/dist/routing/app-route-graph.d.ts +50 -2
  89. package/dist/routing/app-route-graph.js +140 -16
  90. package/dist/routing/app-route-graph.js.map +1 -1
  91. package/dist/routing/app-router.d.ts +2 -2
  92. package/dist/routing/app-router.js +2 -2
  93. package/dist/routing/app-router.js.map +1 -1
  94. package/dist/routing/route-pattern.d.ts +56 -1
  95. package/dist/routing/route-pattern.js +60 -1
  96. package/dist/routing/route-pattern.js.map +1 -1
  97. package/dist/routing/utils.d.ts +2 -1
  98. package/dist/routing/utils.js +4 -1
  99. package/dist/routing/utils.js.map +1 -1
  100. package/dist/server/api-handler.js +139 -37
  101. package/dist/server/api-handler.js.map +1 -1
  102. package/dist/server/app-browser-action-result.d.ts +27 -2
  103. package/dist/server/app-browser-action-result.js +63 -2
  104. package/dist/server/app-browser-action-result.js.map +1 -1
  105. package/dist/server/app-browser-entry.js +493 -195
  106. package/dist/server/app-browser-entry.js.map +1 -1
  107. package/dist/server/app-browser-hydration.d.ts +13 -1
  108. package/dist/server/app-browser-hydration.js +9 -1
  109. package/dist/server/app-browser-hydration.js.map +1 -1
  110. package/dist/server/app-browser-interception-context.d.ts +24 -0
  111. package/dist/server/app-browser-interception-context.js +32 -0
  112. package/dist/server/app-browser-interception-context.js.map +1 -0
  113. package/dist/server/app-browser-navigation-controller.d.ts +17 -2
  114. package/dist/server/app-browser-navigation-controller.js +33 -10
  115. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  116. package/dist/server/app-browser-popstate.d.ts +16 -0
  117. package/dist/server/app-browser-popstate.js +17 -0
  118. package/dist/server/app-browser-popstate.js.map +1 -0
  119. package/dist/server/app-browser-rsc-redirect.d.ts +29 -0
  120. package/dist/server/app-browser-rsc-redirect.js +37 -0
  121. package/dist/server/app-browser-rsc-redirect.js.map +1 -0
  122. package/dist/server/app-browser-state.d.ts +28 -7
  123. package/dist/server/app-browser-state.js +63 -27
  124. package/dist/server/app-browser-state.js.map +1 -1
  125. package/dist/server/app-browser-stream.d.ts +9 -17
  126. package/dist/server/app-browser-stream.js +18 -13
  127. package/dist/server/app-browser-stream.js.map +1 -1
  128. package/dist/server/app-browser-visible-commit.d.ts +7 -1
  129. package/dist/server/app-browser-visible-commit.js +39 -5
  130. package/dist/server/app-browser-visible-commit.js.map +1 -1
  131. package/dist/server/app-elements-wire.d.ts +43 -6
  132. package/dist/server/app-elements-wire.js +189 -7
  133. package/dist/server/app-elements-wire.js.map +1 -1
  134. package/dist/server/app-elements.d.ts +3 -2
  135. package/dist/server/app-elements.js +3 -2
  136. package/dist/server/app-elements.js.map +1 -1
  137. package/dist/server/app-fallback-renderer.d.ts +10 -1
  138. package/dist/server/app-fallback-renderer.js +41 -3
  139. package/dist/server/app-fallback-renderer.js.map +1 -1
  140. package/dist/server/app-history-state.d.ts +26 -0
  141. package/dist/server/app-history-state.js +53 -0
  142. package/dist/server/app-history-state.js.map +1 -0
  143. package/dist/server/app-middleware.d.ts +13 -0
  144. package/dist/server/app-middleware.js +3 -1
  145. package/dist/server/app-middleware.js.map +1 -1
  146. package/dist/server/app-optimistic-routing.d.ts +54 -0
  147. package/dist/server/app-optimistic-routing.js +200 -0
  148. package/dist/server/app-optimistic-routing.js.map +1 -0
  149. package/dist/server/app-page-boundary-render.d.ts +10 -1
  150. package/dist/server/app-page-boundary-render.js +13 -6
  151. package/dist/server/app-page-boundary-render.js.map +1 -1
  152. package/dist/server/app-page-boundary.js +3 -2
  153. package/dist/server/app-page-boundary.js.map +1 -1
  154. package/dist/server/app-page-cache.d.ts +26 -1
  155. package/dist/server/app-page-cache.js +86 -14
  156. package/dist/server/app-page-cache.js.map +1 -1
  157. package/dist/server/app-page-dispatch.d.ts +7 -0
  158. package/dist/server/app-page-dispatch.js +96 -12
  159. package/dist/server/app-page-dispatch.js.map +1 -1
  160. package/dist/server/app-page-element-builder.d.ts +7 -0
  161. package/dist/server/app-page-element-builder.js +34 -5
  162. package/dist/server/app-page-element-builder.js.map +1 -1
  163. package/dist/server/app-page-execution.d.ts +28 -1
  164. package/dist/server/app-page-execution.js +91 -7
  165. package/dist/server/app-page-execution.js.map +1 -1
  166. package/dist/server/app-page-head.d.ts +7 -0
  167. package/dist/server/app-page-head.js +23 -3
  168. package/dist/server/app-page-head.js.map +1 -1
  169. package/dist/server/app-page-probe.d.ts +23 -1
  170. package/dist/server/app-page-probe.js +29 -1
  171. package/dist/server/app-page-probe.js.map +1 -1
  172. package/dist/server/app-page-render-observation.d.ts +35 -0
  173. package/dist/server/app-page-render-observation.js +68 -0
  174. package/dist/server/app-page-render-observation.js.map +1 -0
  175. package/dist/server/app-page-render.d.ts +7 -1
  176. package/dist/server/app-page-render.js +81 -4
  177. package/dist/server/app-page-render.js.map +1 -1
  178. package/dist/server/app-page-request.d.ts +1 -0
  179. package/dist/server/app-page-request.js.map +1 -1
  180. package/dist/server/app-page-response.js +7 -5
  181. package/dist/server/app-page-response.js.map +1 -1
  182. package/dist/server/app-page-route-wiring.d.ts +3 -1
  183. package/dist/server/app-page-route-wiring.js +59 -24
  184. package/dist/server/app-page-route-wiring.js.map +1 -1
  185. package/dist/server/app-page-stream.d.ts +5 -0
  186. package/dist/server/app-page-stream.js +2 -0
  187. package/dist/server/app-page-stream.js.map +1 -1
  188. package/dist/server/app-prerender-static-params.d.ts +2 -1
  189. package/dist/server/app-prerender-static-params.js +44 -8
  190. package/dist/server/app-prerender-static-params.js.map +1 -1
  191. package/dist/server/app-route-handler-cache.d.ts +2 -2
  192. package/dist/server/app-route-handler-cache.js +3 -2
  193. package/dist/server/app-route-handler-cache.js.map +1 -1
  194. package/dist/server/app-route-handler-dispatch.d.ts +6 -1
  195. package/dist/server/app-route-handler-dispatch.js +1 -1
  196. package/dist/server/app-route-handler-dispatch.js.map +1 -1
  197. package/dist/server/app-route-handler-execution.d.ts +17 -2
  198. package/dist/server/app-route-handler-execution.js.map +1 -1
  199. package/dist/server/app-route-handler-response.js +5 -4
  200. package/dist/server/app-route-handler-response.js.map +1 -1
  201. package/dist/server/app-router-entry.js +7 -15
  202. package/dist/server/app-router-entry.js.map +1 -1
  203. package/dist/server/app-rsc-cache-busting.d.ts +19 -1
  204. package/dist/server/app-rsc-cache-busting.js +36 -1
  205. package/dist/server/app-rsc-cache-busting.js.map +1 -1
  206. package/dist/server/app-rsc-embedded-chunks.d.ts +9 -0
  207. package/dist/server/app-rsc-embedded-chunks.js +34 -0
  208. package/dist/server/app-rsc-embedded-chunks.js.map +1 -0
  209. package/dist/server/app-rsc-errors.d.ts +4 -1
  210. package/dist/server/app-rsc-errors.js +1 -1
  211. package/dist/server/app-rsc-errors.js.map +1 -1
  212. package/dist/server/app-rsc-handler.d.ts +21 -5
  213. package/dist/server/app-rsc-handler.js +38 -15
  214. package/dist/server/app-rsc-handler.js.map +1 -1
  215. package/dist/server/app-rsc-render-mode.d.ts +4 -3
  216. package/dist/server/app-rsc-render-mode.js +7 -1
  217. package/dist/server/app-rsc-render-mode.js.map +1 -1
  218. package/dist/server/app-rsc-request-normalization.d.ts +4 -1
  219. package/dist/server/app-rsc-request-normalization.js +4 -1
  220. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  221. package/dist/server/app-rsc-response-finalizer.d.ts +8 -1
  222. package/dist/server/app-rsc-response-finalizer.js +10 -3
  223. package/dist/server/app-rsc-response-finalizer.js.map +1 -1
  224. package/dist/server/app-rsc-route-matching.d.ts +23 -0
  225. package/dist/server/app-rsc-route-matching.js +47 -25
  226. package/dist/server/app-rsc-route-matching.js.map +1 -1
  227. package/dist/server/app-server-action-execution.d.ts +35 -3
  228. package/dist/server/app-server-action-execution.js +87 -33
  229. package/dist/server/app-server-action-execution.js.map +1 -1
  230. package/dist/server/app-ssr-entry.d.ts +3 -0
  231. package/dist/server/app-ssr-entry.js +83 -58
  232. package/dist/server/app-ssr-entry.js.map +1 -1
  233. package/dist/server/app-ssr-error-meta.d.ts +14 -0
  234. package/dist/server/app-ssr-error-meta.js +50 -0
  235. package/dist/server/app-ssr-error-meta.js.map +1 -0
  236. package/dist/server/app-ssr-stream.d.ts +7 -2
  237. package/dist/server/app-ssr-stream.js +26 -15
  238. package/dist/server/app-ssr-stream.js.map +1 -1
  239. package/dist/server/artifact-compatibility.d.ts +13 -3
  240. package/dist/server/artifact-compatibility.js +12 -8
  241. package/dist/server/artifact-compatibility.js.map +1 -1
  242. package/dist/server/cache-headers.d.ts +7 -0
  243. package/dist/server/cache-headers.js +19 -0
  244. package/dist/server/cache-headers.js.map +1 -0
  245. package/dist/server/cache-proof.d.ts +170 -5
  246. package/dist/server/cache-proof.js +472 -18
  247. package/dist/server/cache-proof.js.map +1 -1
  248. package/dist/server/client-reuse-manifest.d.ts +99 -0
  249. package/dist/server/client-reuse-manifest.js +212 -0
  250. package/dist/server/client-reuse-manifest.js.map +1 -0
  251. package/dist/server/default-global-error-module.d.ts +20 -0
  252. package/dist/server/default-global-error-module.js +20 -0
  253. package/dist/server/default-global-error-module.js.map +1 -0
  254. package/dist/server/dev-lockfile.d.ts +110 -0
  255. package/dist/server/dev-lockfile.js +180 -0
  256. package/dist/server/dev-lockfile.js.map +1 -0
  257. package/dist/server/dev-server.d.ts +9 -1
  258. package/dist/server/dev-server.js +76 -19
  259. package/dist/server/dev-server.js.map +1 -1
  260. package/dist/server/edge-api-runtime.d.ts +5 -0
  261. package/dist/server/edge-api-runtime.js +8 -0
  262. package/dist/server/edge-api-runtime.js.map +1 -0
  263. package/dist/server/file-based-metadata.d.ts +13 -0
  264. package/dist/server/file-based-metadata.js +49 -2
  265. package/dist/server/file-based-metadata.js.map +1 -1
  266. package/dist/server/headers.d.ts +20 -1
  267. package/dist/server/headers.js +22 -2
  268. package/dist/server/headers.js.map +1 -1
  269. package/dist/server/html.js +1 -1
  270. package/dist/server/html.js.map +1 -1
  271. package/dist/server/http-error-responses.d.ts +26 -1
  272. package/dist/server/http-error-responses.js +32 -2
  273. package/dist/server/http-error-responses.js.map +1 -1
  274. package/dist/server/isr-cache.d.ts +8 -3
  275. package/dist/server/isr-cache.js +24 -6
  276. package/dist/server/isr-cache.js.map +1 -1
  277. package/dist/server/metadata-route-response.js +22 -5
  278. package/dist/server/metadata-route-response.js.map +1 -1
  279. package/dist/server/metadata-routes.js +27 -8
  280. package/dist/server/metadata-routes.js.map +1 -1
  281. package/dist/server/middleware-runtime.d.ts +15 -0
  282. package/dist/server/middleware-runtime.js +60 -7
  283. package/dist/server/middleware-runtime.js.map +1 -1
  284. package/dist/server/middleware.d.ts +13 -1
  285. package/dist/server/middleware.js +16 -2
  286. package/dist/server/middleware.js.map +1 -1
  287. package/dist/server/navigation-planner.d.ts +26 -6
  288. package/dist/server/navigation-planner.js +358 -24
  289. package/dist/server/navigation-planner.js.map +1 -1
  290. package/dist/server/navigation-trace.d.ts +9 -1
  291. package/dist/server/navigation-trace.js +8 -0
  292. package/dist/server/navigation-trace.js.map +1 -1
  293. package/dist/server/normalize-path.d.ts +2 -1
  294. package/dist/server/normalize-path.js +4 -1
  295. package/dist/server/normalize-path.js.map +1 -1
  296. package/dist/server/pages-api-route.d.ts +27 -1
  297. package/dist/server/pages-api-route.js +25 -3
  298. package/dist/server/pages-api-route.js.map +1 -1
  299. package/dist/server/pages-data-route.d.ts +77 -0
  300. package/dist/server/pages-data-route.js +97 -0
  301. package/dist/server/pages-data-route.js.map +1 -0
  302. package/dist/server/pages-i18n.d.ts +51 -1
  303. package/dist/server/pages-i18n.js +61 -1
  304. package/dist/server/pages-i18n.js.map +1 -1
  305. package/dist/server/pages-page-data.d.ts +32 -4
  306. package/dist/server/pages-page-data.js +52 -19
  307. package/dist/server/pages-page-data.js.map +1 -1
  308. package/dist/server/pages-page-response.d.ts +11 -1
  309. package/dist/server/pages-page-response.js +6 -4
  310. package/dist/server/pages-page-response.js.map +1 -1
  311. package/dist/server/prod-server.d.ts +26 -1
  312. package/dist/server/prod-server.js +150 -44
  313. package/dist/server/prod-server.js.map +1 -1
  314. package/dist/server/request-pipeline.d.ts +11 -2
  315. package/dist/server/request-pipeline.js +28 -11
  316. package/dist/server/request-pipeline.js.map +1 -1
  317. package/dist/server/seed-cache.d.ts +12 -31
  318. package/dist/server/seed-cache.js +22 -35
  319. package/dist/server/seed-cache.js.map +1 -1
  320. package/dist/server/server-action-not-found.d.ts +16 -3
  321. package/dist/server/server-action-not-found.js +27 -4
  322. package/dist/server/server-action-not-found.js.map +1 -1
  323. package/dist/server/server-globals.d.ts +5 -0
  324. package/dist/server/server-globals.js +37 -0
  325. package/dist/server/server-globals.js.map +1 -0
  326. package/dist/server/skip-cache-proof.d.ts +41 -0
  327. package/dist/server/skip-cache-proof.js +101 -0
  328. package/dist/server/skip-cache-proof.js.map +1 -0
  329. package/dist/server/static-file-cache.d.ts +1 -1
  330. package/dist/server/static-file-cache.js +7 -6
  331. package/dist/server/static-file-cache.js.map +1 -1
  332. package/dist/shims/cache-runtime.d.ts +19 -2
  333. package/dist/shims/cache-runtime.js +67 -11
  334. package/dist/shims/cache-runtime.js.map +1 -1
  335. package/dist/shims/cache.d.ts +5 -18
  336. package/dist/shims/cache.js +2 -0
  337. package/dist/shims/cache.js.map +1 -1
  338. package/dist/shims/client-locale.d.ts +15 -0
  339. package/dist/shims/client-locale.js +13 -0
  340. package/dist/shims/client-locale.js.map +1 -0
  341. package/dist/shims/default-global-error.d.ts +32 -0
  342. package/dist/shims/default-global-error.js +181 -0
  343. package/dist/shims/default-global-error.js.map +1 -0
  344. package/dist/shims/document.d.ts +59 -3
  345. package/dist/shims/document.js +36 -5
  346. package/dist/shims/document.js.map +1 -1
  347. package/dist/shims/error-boundary.d.ts +2 -2
  348. package/dist/shims/error-boundary.js +6 -8
  349. package/dist/shims/error-boundary.js.map +1 -1
  350. package/dist/shims/error.d.ts +18 -1
  351. package/dist/shims/error.js +56 -1
  352. package/dist/shims/error.js.map +1 -1
  353. package/dist/shims/fetch-cache.d.ts +4 -1
  354. package/dist/shims/fetch-cache.js +40 -5
  355. package/dist/shims/fetch-cache.js.map +1 -1
  356. package/dist/shims/font-google-base.d.ts +22 -8
  357. package/dist/shims/font-google-base.js +41 -71
  358. package/dist/shims/font-google-base.js.map +1 -1
  359. package/dist/shims/font-local.d.ts +3 -20
  360. package/dist/shims/font-local.js +23 -75
  361. package/dist/shims/font-local.js.map +1 -1
  362. package/dist/shims/font-utils.d.ts +51 -0
  363. package/dist/shims/font-utils.js +97 -0
  364. package/dist/shims/font-utils.js.map +1 -0
  365. package/dist/shims/form.js +13 -6
  366. package/dist/shims/form.js.map +1 -1
  367. package/dist/shims/hash-scroll.d.ts +7 -0
  368. package/dist/shims/hash-scroll.js +30 -0
  369. package/dist/shims/hash-scroll.js.map +1 -0
  370. package/dist/shims/headers.d.ts +8 -11
  371. package/dist/shims/headers.js +22 -2
  372. package/dist/shims/headers.js.map +1 -1
  373. package/dist/shims/image.d.ts +1 -0
  374. package/dist/shims/image.js +144 -78
  375. package/dist/shims/image.js.map +1 -1
  376. package/dist/shims/internal/app-router-context.d.ts +6 -6
  377. package/dist/shims/internal/app-router-context.js +17 -6
  378. package/dist/shims/internal/app-router-context.js.map +1 -1
  379. package/dist/shims/link-prefetch.d.ts +9 -1
  380. package/dist/shims/link-prefetch.js +11 -6
  381. package/dist/shims/link-prefetch.js.map +1 -1
  382. package/dist/shims/link.d.ts +33 -5
  383. package/dist/shims/link.js +205 -50
  384. package/dist/shims/link.js.map +1 -1
  385. package/dist/shims/metadata.d.ts +16 -30
  386. package/dist/shims/metadata.js +91 -32
  387. package/dist/shims/metadata.js.map +1 -1
  388. package/dist/shims/navigation.d.ts +164 -17
  389. package/dist/shims/navigation.js +355 -84
  390. package/dist/shims/navigation.js.map +1 -1
  391. package/dist/shims/navigation.react-server.d.ts +3 -2
  392. package/dist/shims/navigation.react-server.js +5 -2
  393. package/dist/shims/navigation.react-server.js.map +1 -1
  394. package/dist/shims/og.d.ts +18 -2
  395. package/dist/shims/og.js +49 -1
  396. package/dist/shims/og.js.map +1 -0
  397. package/dist/shims/pages-router-runtime.d.ts +7 -0
  398. package/dist/shims/pages-router-runtime.js +16 -0
  399. package/dist/shims/pages-router-runtime.js.map +1 -0
  400. package/dist/shims/request-state-types.d.ts +1 -1
  401. package/dist/shims/root-params.d.ts +3 -1
  402. package/dist/shims/root-params.js +11 -3
  403. package/dist/shims/root-params.js.map +1 -1
  404. package/dist/shims/router-state.d.ts +1 -0
  405. package/dist/shims/router-state.js.map +1 -1
  406. package/dist/shims/router.d.ts +40 -7
  407. package/dist/shims/router.js +355 -250
  408. package/dist/shims/router.js.map +1 -1
  409. package/dist/shims/script.js +110 -32
  410. package/dist/shims/script.js.map +1 -1
  411. package/dist/shims/server.d.ts +21 -4
  412. package/dist/shims/server.js +31 -10
  413. package/dist/shims/server.js.map +1 -1
  414. package/dist/shims/slot.d.ts +1 -0
  415. package/dist/shims/slot.js +45 -1
  416. package/dist/shims/slot.js.map +1 -1
  417. package/dist/shims/unified-request-context.d.ts +1 -1
  418. package/dist/shims/unified-request-context.js +2 -0
  419. package/dist/shims/unified-request-context.js.map +1 -1
  420. package/dist/shims/unrecognized-action-error.d.ts +35 -0
  421. package/dist/shims/unrecognized-action-error.js +41 -0
  422. package/dist/shims/unrecognized-action-error.js.map +1 -0
  423. package/dist/shims/url-safety.d.ts +23 -1
  424. package/dist/shims/url-safety.js +29 -2
  425. package/dist/shims/url-safety.js.map +1 -1
  426. package/dist/shims/url-utils.d.ts +21 -1
  427. package/dist/shims/url-utils.js +67 -3
  428. package/dist/shims/url-utils.js.map +1 -1
  429. package/dist/typegen.d.ts +10 -0
  430. package/dist/typegen.js +242 -0
  431. package/dist/typegen.js.map +1 -0
  432. package/dist/utils/asset-prefix.d.ts +97 -0
  433. package/dist/utils/asset-prefix.js +124 -0
  434. package/dist/utils/asset-prefix.js.map +1 -0
  435. package/dist/utils/base-path.d.ts +7 -1
  436. package/dist/utils/base-path.js +10 -1
  437. package/dist/utils/base-path.js.map +1 -1
  438. package/dist/utils/cache-control-metadata.d.ts +2 -1
  439. package/dist/utils/cache-control-metadata.js +1 -3
  440. package/dist/utils/cache-control-metadata.js.map +1 -1
  441. package/dist/utils/domain-locale.d.ts +2 -1
  442. package/dist/utils/domain-locale.js +9 -1
  443. package/dist/utils/domain-locale.js.map +1 -1
  444. package/dist/utils/lazy-chunks.d.ts +1 -1
  445. package/dist/utils/lazy-chunks.js +1 -1
  446. package/dist/utils/lazy-chunks.js.map +1 -1
  447. package/dist/utils/navigation-signal.d.ts +1 -2
  448. package/dist/utils/navigation-signal.js +1 -1
  449. package/dist/utils/navigation-signal.js.map +1 -1
  450. package/dist/utils/prerender-output-paths.d.ts +15 -0
  451. package/dist/utils/prerender-output-paths.js +24 -0
  452. package/dist/utils/prerender-output-paths.js.map +1 -0
  453. package/dist/utils/query.d.ts +17 -1
  454. package/dist/utils/query.js +36 -1
  455. package/dist/utils/query.js.map +1 -1
  456. package/dist/utils/record.d.ts +5 -0
  457. package/dist/utils/record.js +8 -0
  458. package/dist/utils/record.js.map +1 -0
  459. package/dist/utils/sorted-array.d.ts +9 -0
  460. package/dist/utils/sorted-array.js +22 -0
  461. package/dist/utils/sorted-array.js.map +1 -0
  462. package/package.json +13 -5
@@ -1,13 +1,21 @@
1
+ import { splitPathnameForRouteMatch } from "../routing/utils.js";
2
+ import { matchRoutePattern, matchRoutePatternPrefix } from "../routing/route-pattern.js";
3
+ import { compareAppElementsSlotIds } from "./app-elements-wire.js";
4
+ import "./app-elements.js";
1
5
  import { NavigationTraceReasonCodes, createNavigationLifecycleTraceFields, createNavigationTrace } from "./navigation-trace.js";
2
6
  //#region src/server/navigation-planner.ts
7
+ const ROUTE_INTERCEPTION_CONTEXT_SEPARATOR = "\0";
8
+ const CACHE_ENTRY_PROOF_MISSING_CODE = "CP_CACHE_ENTRY_PROOF_MISSING";
3
9
  function createRequestWorkDecision(options) {
10
+ const traverseFields = options.work.kind === "traverseFlight" ? { traverseDirection: options.work.direction } : {};
4
11
  return {
5
12
  kind: "requestWork",
6
13
  token: options.state.nextOperationToken,
7
14
  work: options.work,
8
15
  trace: createNavigationTrace(NavigationTraceReasonCodes.requestWork, {
9
16
  eventKind: options.eventKind,
10
- targetHref: getRequestedWorkTargetHref(options.work)
17
+ targetHref: getRequestedWorkTargetHref(options.work),
18
+ ...traverseFields
11
19
  })
12
20
  };
13
21
  }
@@ -19,25 +27,131 @@ function getRequestedWorkTargetHref(work) {
19
27
  default: throw new Error("[vinext] Unknown requested navigation work: " + String(work));
20
28
  }
21
29
  }
30
+ function createSnapshotRouteTopology(snapshot) {
31
+ return {
32
+ layoutIds: snapshot.layoutIds,
33
+ rootBoundaryId: snapshot.rootBoundaryId,
34
+ rootLayoutTreePath: snapshot.rootBoundaryId,
35
+ slotBindings: snapshot.slotBindings
36
+ };
37
+ }
38
+ function stripInterceptionContextFromRouteId(routeId) {
39
+ const separatorIndex = routeId.indexOf(ROUTE_INTERCEPTION_CONTEXT_SEPARATOR);
40
+ return separatorIndex === -1 ? routeId : routeId.slice(0, separatorIndex);
41
+ }
42
+ function getMatchedUrlPathname(matchedUrl) {
43
+ try {
44
+ return new URL(matchedUrl, "https://vinext.local").pathname;
45
+ } catch {
46
+ const [withoutHash = ""] = matchedUrl.split("#");
47
+ const [pathname = ""] = withoutHash.split("?");
48
+ return pathname === "" ? "/" : pathname;
49
+ }
50
+ }
51
+ function splitMatchedUrlIntoRouteParts(matchedUrl) {
52
+ return splitPathnameForRouteMatch(getMatchedUrlPathname(matchedUrl));
53
+ }
54
+ function findRouteManifestRouteByMatchedUrl(routeManifest, matchedUrl) {
55
+ const urlParts = splitMatchedUrlIntoRouteParts(matchedUrl);
56
+ for (const route of routeManifest.segmentGraph.routes.values()) if (matchRoutePattern(urlParts, route.patternParts) !== null) return route;
57
+ return null;
58
+ }
59
+ function routeManifestRouteMatchesUrl(route, matchedUrl) {
60
+ return matchRoutePattern(splitMatchedUrlIntoRouteParts(matchedUrl), route.patternParts) !== null;
61
+ }
62
+ function findRouteManifestRouteByIdOrMatchedUrl(options) {
63
+ const routeId = stripInterceptionContextFromRouteId(options.routeId);
64
+ const route = options.routeManifest.segmentGraph.routes.get(routeId);
65
+ if (route && routeManifestRouteMatchesUrl(route, options.matchedUrl)) return route;
66
+ return findRouteManifestRouteByMatchedUrl(options.routeManifest, options.matchedUrl);
67
+ }
68
+ function findRouteManifestRouteForSnapshot(routeManifest, snapshot) {
69
+ if (snapshot.interception !== null) return findRouteManifestRouteByIdOrMatchedUrl({
70
+ matchedUrl: snapshot.interception.sourceMatchedUrl,
71
+ routeId: snapshot.interception.sourceRouteId,
72
+ routeManifest
73
+ });
74
+ return findRouteManifestRouteByIdOrMatchedUrl({
75
+ matchedUrl: snapshot.matchedUrl,
76
+ routeId: snapshot.routeId,
77
+ routeManifest
78
+ });
79
+ }
80
+ function resolveRouteManifestSlotBindings(routeManifest, route) {
81
+ const bindings = [];
82
+ for (const slotId of route.slotIds) {
83
+ const binding = routeManifest.segmentGraph.slotBindings.get(`${route.id}::${slotId}`);
84
+ if (!binding) continue;
85
+ bindings.push({
86
+ ownerLayoutId: binding.ownerLayoutId,
87
+ slotId: binding.slotId,
88
+ state: binding.state
89
+ });
90
+ }
91
+ return bindings.sort((left, right) => compareAppElementsSlotIds(left.slotId, right.slotId));
92
+ }
93
+ function resolveRouteManifestRootLayoutTreePath(routeManifest, route) {
94
+ if (route.rootBoundaryId === null) return null;
95
+ return routeManifest.segmentGraph.rootBoundaries.get(route.rootBoundaryId)?.treePath ?? null;
96
+ }
97
+ function resolveRouteTopologySnapshot(options) {
98
+ const route = options.routeManifest === null ? null : findRouteManifestRouteForSnapshot(options.routeManifest, options.snapshot);
99
+ if (route === null || options.routeManifest === null) return { kind: "unknown" };
100
+ const shouldUseManifestSlotBindings = options.slotBindingSource === "manifestTarget" && options.snapshot.interception === null;
101
+ return {
102
+ kind: "known",
103
+ topology: {
104
+ layoutIds: route.layoutIds,
105
+ rootBoundaryId: route.rootBoundaryId,
106
+ rootLayoutTreePath: resolveRouteManifestRootLayoutTreePath(options.routeManifest, route),
107
+ slotBindings: shouldUseManifestSlotBindings ? resolveRouteManifestSlotBindings(options.routeManifest, route) : options.snapshot.slotBindings
108
+ }
109
+ };
110
+ }
111
+ function findRouteManifestInterceptionForProof(routeManifest, proof) {
112
+ const sourceParts = splitMatchedUrlIntoRouteParts(proof.sourceMatchedUrl);
113
+ const targetParts = splitMatchedUrlIntoRouteParts(proof.targetMatchedUrl);
114
+ const targetRoute = findRouteManifestRouteByIdOrMatchedUrl({
115
+ matchedUrl: proof.targetMatchedUrl,
116
+ routeId: proof.targetRouteId,
117
+ routeManifest
118
+ });
119
+ const candidateInterceptions = routeManifest.segmentGraph.interceptionsBySlotId.get(proof.slotId) ?? [];
120
+ for (const interception of candidateInterceptions) {
121
+ if (!matchRoutePatternPrefix(sourceParts, interception.sourcePatternParts)) continue;
122
+ if (matchRoutePattern(targetParts, interception.targetPatternParts) === null) continue;
123
+ if (interception.targetRouteId !== null && targetRoute?.id !== interception.targetRouteId) continue;
124
+ return interception;
125
+ }
126
+ return null;
127
+ }
22
128
  function createRootBoundaryTraceFields(options) {
23
- return options.state.traceFields ?? createNavigationLifecycleTraceFields({
24
- currentRootLayoutTreePath: options.state.visibleSnapshot.rootBoundaryId,
129
+ if (options.state.traceFields) return {
130
+ ...options.state.traceFields,
131
+ currentRootLayoutTreePath: options.currentRootLayoutTreePath,
132
+ nextRootLayoutTreePath: options.nextRootLayoutTreePath
133
+ };
134
+ return createNavigationLifecycleTraceFields({
135
+ currentRootLayoutTreePath: options.currentRootLayoutTreePath,
25
136
  currentVisibleCommitVersion: options.state.visibleCommitVersion,
26
- nextRootLayoutTreePath: options.event.result.targetSnapshot.rootBoundaryId,
137
+ nextRootLayoutTreePath: options.nextRootLayoutTreePath,
27
138
  startedVisibleCommitVersion: options.event.token.baseVisibleCommitVersion
28
139
  });
29
140
  }
30
141
  function classifyRootBoundaryTransition(currentRootBoundaryId, nextRootBoundaryId) {
31
- if (currentRootBoundaryId === null || nextRootBoundaryId === null) return "rootBoundaryUnknownFallback";
142
+ if (currentRootBoundaryId === null || nextRootBoundaryId === null) return "rootBoundaryUnknown";
32
143
  return currentRootBoundaryId === nextRootBoundaryId ? "currentRootBoundary" : "rootBoundaryChanged";
33
144
  }
34
145
  function resolveSameLayoutAncestorPersistence(currentSnapshot, targetSnapshot) {
35
- if (classifyRootBoundaryTransition(currentSnapshot.rootBoundaryId, targetSnapshot.rootBoundaryId) !== "currentRootBoundary") return [];
146
+ return resolveSameLayoutAncestorPersistenceForTopologies(createSnapshotRouteTopology(currentSnapshot), createSnapshotRouteTopology(targetSnapshot));
147
+ }
148
+ function resolveSameLayoutAncestorPersistenceForTopologies(currentTopology, targetTopology) {
149
+ if (classifyRootBoundaryTransition(currentTopology.rootBoundaryId, targetTopology.rootBoundaryId) !== "currentRootBoundary") return [];
36
150
  const commonLayoutIds = [];
37
- const maxLength = Math.min(currentSnapshot.layoutIds.length, targetSnapshot.layoutIds.length);
151
+ const maxLength = Math.min(currentTopology.layoutIds.length, targetTopology.layoutIds.length);
38
152
  for (let index = 0; index < maxLength; index++) {
39
- const layoutId = currentSnapshot.layoutIds[index];
40
- if (layoutId !== targetSnapshot.layoutIds[index]) break;
153
+ const layoutId = currentTopology.layoutIds[index];
154
+ if (layoutId !== targetTopology.layoutIds[index]) break;
41
155
  commonLayoutIds.push(layoutId);
42
156
  }
43
157
  return commonLayoutIds;
@@ -64,51 +178,270 @@ function resolveCurrentRootBoundaryElementPersistence(currentSnapshot, targetSna
64
178
  return [...preservedLayoutIds, ...resolveMountedParallelSlotPersistenceForLayouts(currentSnapshot, preservedLayoutIds)];
65
179
  }
66
180
  function resolveCurrentRootBoundaryCommitElementPersistence(options) {
67
- const preservedLayoutIds = resolveSameLayoutAncestorPersistence(options.currentSnapshot, options.targetSnapshot);
68
- if (options.lane === "traverse") return preservedLayoutIds;
69
- return [...preservedLayoutIds, ...resolveMountedParallelSlotPersistenceForLayouts(options.currentSnapshot, preservedLayoutIds)];
181
+ return resolveSameLayoutAncestorPersistenceForTopologies(options.currentTopology, options.targetTopology);
182
+ }
183
+ function resolveCurrentRootBoundaryCommitSlotPersistence(options) {
184
+ if (options.lane === "traverse") return [];
185
+ const preservedLayoutIds = resolveSameLayoutAncestorPersistenceForTopologies(options.currentTopology, options.targetTopology);
186
+ if (preservedLayoutIds.length === 0) return [];
187
+ return resolveDefaultOrUnmatchedSlotPersistenceForLayouts({
188
+ currentSlotBindings: options.currentTopology.slotBindings,
189
+ preservedLayoutIds,
190
+ targetSlotBindings: options.targetTopology.slotBindings
191
+ });
192
+ }
193
+ /**
194
+ * Default/unmatched slot preservation law:
195
+ *
196
+ * A target default/unmatched slot may reuse previous content only when:
197
+ * - the slot's owner layout is part of the preserved layout ancestor set;
198
+ * - the current visible snapshot proves the same slot had renderable content;
199
+ * - the navigation is not a traversal.
200
+ *
201
+ * Wire absence and UNMATCHED_SLOT markers are not semantic proof.
202
+ */
203
+ function resolveDefaultOrUnmatchedSlotPersistenceForLayouts(options) {
204
+ const preservedLayoutIdSet = new Set(options.preservedLayoutIds);
205
+ const slotIdsWithContent = /* @__PURE__ */ new Set();
206
+ for (const binding of options.currentSlotBindings) {
207
+ if (binding.state === "unmatched") continue;
208
+ slotIdsWithContent.add(binding.slotId);
209
+ }
210
+ const preservedSlotIds = [];
211
+ const seenSlotIds = /* @__PURE__ */ new Set();
212
+ for (const binding of options.targetSlotBindings) {
213
+ if (binding.ownerLayoutId === null) continue;
214
+ if (!preservedLayoutIdSet.has(binding.ownerLayoutId)) continue;
215
+ if (binding.state === "active") continue;
216
+ if (!slotIdsWithContent.has(binding.slotId)) continue;
217
+ if (seenSlotIds.has(binding.slotId)) continue;
218
+ preservedSlotIds.push(binding.slotId);
219
+ seenSlotIds.add(binding.slotId);
220
+ }
221
+ return preservedSlotIds.sort(compareAppElementsSlotIds);
222
+ }
223
+ function getVisibleInterceptionSourceIdentity(snapshot) {
224
+ if (snapshot.interception) return {
225
+ matchedUrl: snapshot.interception.sourceMatchedUrl,
226
+ routeId: snapshot.interception.sourceRouteId
227
+ };
228
+ return {
229
+ matchedUrl: snapshot.matchedUrl,
230
+ routeId: snapshot.routeId
231
+ };
232
+ }
233
+ function createInterceptionProofRejectedDecision(options) {
234
+ return {
235
+ kind: "hardNavigate",
236
+ reason: "interceptionProofRejected",
237
+ token: options.event.token,
238
+ trace: createNavigationTrace(options.reasonCode, options.traceFields),
239
+ url: options.event.result.href
240
+ };
241
+ }
242
+ function evaluateCacheEntryReuseProof(proof) {
243
+ if (proof === void 0) return {
244
+ kind: "accepted",
245
+ decision: null
246
+ };
247
+ if (proof.decision === null) return {
248
+ kind: "rejected",
249
+ decision: null
250
+ };
251
+ if (proof.decision.canReuse) return {
252
+ kind: "accepted",
253
+ decision: proof.decision
254
+ };
255
+ return {
256
+ kind: "rejected",
257
+ decision: proof.decision
258
+ };
259
+ }
260
+ function createCacheProofRejectedTraceFields(traceFields, decision) {
261
+ if (decision === null) return {
262
+ ...traceFields,
263
+ cacheProofCode: CACHE_ENTRY_PROOF_MISSING_CODE
264
+ };
265
+ return {
266
+ ...traceFields,
267
+ cacheProofCode: decision.code,
268
+ cacheProofMode: decision.mode,
269
+ cacheProofScope: decision.scope
270
+ };
271
+ }
272
+ function createCacheProofRejectedDecision(options) {
273
+ return {
274
+ kind: "hardNavigate",
275
+ reason: "cacheProofRejected",
276
+ token: options.event.token,
277
+ trace: createNavigationTrace(NavigationTraceReasonCodes.cacheProofRejected, createCacheProofRejectedTraceFields(options.traceFields, options.rejection.decision)),
278
+ url: options.event.result.href
279
+ };
280
+ }
281
+ function createAcceptedCacheProofTraceFields(traceFields, decision) {
282
+ if (decision === null) return traceFields;
283
+ return {
284
+ ...traceFields,
285
+ cacheProofCode: decision.code,
286
+ cacheProofReuseClass: decision.reuseClass
287
+ };
288
+ }
289
+ function createCacheEntryProposalFields(decision) {
290
+ if (decision === null) return {};
291
+ return { cacheEntryReuseDecision: decision };
292
+ }
293
+ function validateInterceptedPreservation(options) {
294
+ const proof = options.targetSnapshot.interception;
295
+ if (!proof) return {
296
+ kind: "rejected",
297
+ reasonCode: NavigationTraceReasonCodes.interceptedRejectedMissingProof
298
+ };
299
+ if (proof.targetMatchedUrl !== options.targetSnapshot.matchedUrl) return {
300
+ kind: "rejected",
301
+ reasonCode: NavigationTraceReasonCodes.interceptedRejectedTargetMismatch
302
+ };
303
+ const sourceIdentity = getVisibleInterceptionSourceIdentity(options.currentSnapshot);
304
+ if (proof.sourceMatchedUrl !== sourceIdentity.matchedUrl || proof.sourceRouteId !== sourceIdentity.routeId) return {
305
+ kind: "rejected",
306
+ reasonCode: NavigationTraceReasonCodes.interceptedRejectedUnknownSource
307
+ };
308
+ const declaredInterception = options.routeManifest === null ? null : findRouteManifestInterceptionForProof(options.routeManifest, proof);
309
+ if (options.routeManifest !== null && declaredInterception === null) return {
310
+ kind: "rejected",
311
+ reasonCode: NavigationTraceReasonCodes.interceptedRejectedUndeclaredTopology
312
+ };
313
+ const preservedLayoutIds = resolveSameLayoutAncestorPersistenceForTopologies(options.currentTopology, options.targetTopology);
314
+ if (preservedLayoutIds.length === 0) return {
315
+ kind: "rejected",
316
+ reasonCode: NavigationTraceReasonCodes.interceptedRejectedIncompatibleRoot
317
+ };
318
+ const preservedLayoutIdSet = new Set(preservedLayoutIds);
319
+ const targetSlotBinding = options.targetTopology.slotBindings.find((binding) => binding.slotId === proof.slotId);
320
+ if (!targetSlotBinding || targetSlotBinding.state !== "active" || targetSlotBinding.ownerLayoutId === null || !preservedLayoutIdSet.has(targetSlotBinding.ownerLayoutId)) return {
321
+ kind: "rejected",
322
+ reasonCode: NavigationTraceReasonCodes.interceptedRejectedMissingSlotProof
323
+ };
324
+ if (declaredInterception !== null && targetSlotBinding.ownerLayoutId !== declaredInterception.ownerLayoutId) return {
325
+ kind: "rejected",
326
+ reasonCode: NavigationTraceReasonCodes.interceptedRejectedUndeclaredTopology
327
+ };
328
+ return {
329
+ kind: "approved",
330
+ preserveElementIds: preservedLayoutIds,
331
+ preservePreviousSlotIds: resolveDefaultOrUnmatchedSlotPersistenceForLayouts({
332
+ currentSlotBindings: options.currentTopology.slotBindings,
333
+ preservedLayoutIds,
334
+ targetSlotBindings: options.targetTopology.slotBindings
335
+ }).filter((slotId) => slotId !== proof.slotId)
336
+ };
70
337
  }
71
338
  function planFlightResponseArrived(options) {
72
- const traceFields = createRootBoundaryTraceFields(options);
339
+ const targetSnapshot = options.event.result.targetSnapshot;
340
+ const currentTopology = resolveRouteTopologySnapshot({
341
+ routeManifest: options.routeManifest,
342
+ slotBindingSource: "snapshot",
343
+ snapshot: options.state.visibleSnapshot
344
+ });
345
+ const targetTopology = resolveRouteTopologySnapshot({
346
+ routeManifest: options.routeManifest,
347
+ slotBindingSource: "manifestTarget",
348
+ snapshot: targetSnapshot
349
+ });
350
+ const traceFields = createRootBoundaryTraceFields({
351
+ currentRootLayoutTreePath: currentTopology.kind === "known" ? currentTopology.topology.rootLayoutTreePath : null,
352
+ event: options.event,
353
+ nextRootLayoutTreePath: targetTopology.kind === "known" ? targetTopology.topology.rootLayoutTreePath : null,
354
+ state: options.state
355
+ });
73
356
  if (options.event.token.lane === "prefetch") return {
74
357
  kind: "noCommit",
75
358
  reason: "prefetchOnly",
76
359
  token: options.event.token,
77
360
  trace: createNavigationTrace(NavigationTraceReasonCodes.prefetchOnly, traceFields)
78
361
  };
79
- const transition = classifyRootBoundaryTransition(options.state.visibleSnapshot.rootBoundaryId, options.event.result.targetSnapshot.rootBoundaryId);
362
+ const cacheEntryProofEvaluation = evaluateCacheEntryReuseProof(options.event.result.cacheEntryReuseProof);
363
+ if (cacheEntryProofEvaluation.kind === "rejected") return createCacheProofRejectedDecision({
364
+ event: options.event,
365
+ rejection: cacheEntryProofEvaluation,
366
+ traceFields
367
+ });
368
+ const acceptedCacheEntryDecision = cacheEntryProofEvaluation.decision;
369
+ const commitTraceFields = createAcceptedCacheProofTraceFields(traceFields, acceptedCacheEntryDecision);
370
+ const cacheEntryProposalFields = createCacheEntryProposalFields(acceptedCacheEntryDecision);
371
+ if (targetSnapshot.interception !== null) {
372
+ if (currentTopology.kind === "unknown" || targetTopology.kind === "unknown") return createInterceptionProofRejectedDecision({
373
+ event: options.event,
374
+ reasonCode: NavigationTraceReasonCodes.interceptedRejectedUndeclaredTopology,
375
+ traceFields: commitTraceFields
376
+ });
377
+ const validation = validateInterceptedPreservation({
378
+ currentSnapshot: options.state.visibleSnapshot,
379
+ currentTopology: currentTopology.topology,
380
+ routeManifest: options.routeManifest,
381
+ targetSnapshot,
382
+ targetTopology: targetTopology.topology
383
+ });
384
+ if (validation.kind === "rejected") return createInterceptionProofRejectedDecision({
385
+ event: options.event,
386
+ reasonCode: validation.reasonCode,
387
+ traceFields: commitTraceFields
388
+ });
389
+ return {
390
+ kind: "proposeCommit",
391
+ proposal: {
392
+ ...cacheEntryProposalFields,
393
+ preserveAbsentSlots: false,
394
+ preserveElementIds: validation.preserveElementIds,
395
+ preservePreviousSlotIds: validation.preservePreviousSlotIds,
396
+ reason: "interceptedCurrentRootBoundary",
397
+ targetSnapshot
398
+ },
399
+ token: options.event.token,
400
+ trace: createNavigationTrace(NavigationTraceReasonCodes.interceptedCommitCurrent, commitTraceFields)
401
+ };
402
+ }
403
+ const transition = currentTopology.kind === "unknown" || targetTopology.kind === "unknown" ? "rootBoundaryUnknown" : classifyRootBoundaryTransition(currentTopology.topology.rootBoundaryId, targetTopology.topology.rootBoundaryId);
80
404
  if (transition === "rootBoundaryChanged") return {
81
405
  kind: "hardNavigate",
82
406
  reason: "rootBoundaryChanged",
83
407
  token: options.event.token,
84
- trace: createNavigationTrace(NavigationTraceReasonCodes.rootBoundaryChanged, traceFields),
408
+ trace: createNavigationTrace(NavigationTraceReasonCodes.rootBoundaryChanged, commitTraceFields),
85
409
  url: options.event.result.href
86
410
  };
87
- if (transition === "rootBoundaryUnknownFallback") return {
411
+ if (transition === "rootBoundaryUnknown") return {
88
412
  kind: "proposeCommit",
89
413
  proposal: {
90
- preserveAbsentSlots: true,
414
+ ...cacheEntryProposalFields,
415
+ preserveAbsentSlots: false,
91
416
  preserveElementIds: [],
92
- reason: "rootBoundaryUnknownFallback",
93
- targetSnapshot: options.event.result.targetSnapshot
417
+ preservePreviousSlotIds: [],
418
+ reason: "unprovenTopologyFallback",
419
+ targetSnapshot
94
420
  },
95
421
  token: options.event.token,
96
- trace: createNavigationTrace(NavigationTraceReasonCodes.rootBoundaryUnknown, traceFields)
422
+ trace: createNavigationTrace(NavigationTraceReasonCodes.rootBoundaryUnknown, commitTraceFields)
97
423
  };
424
+ if (currentTopology.kind !== "known" || targetTopology.kind !== "known") throw new Error("[vinext] Current-root navigation planning requires manifest topology");
98
425
  return {
99
426
  kind: "proposeCommit",
100
427
  proposal: {
428
+ ...cacheEntryProposalFields,
101
429
  preserveAbsentSlots: false,
102
430
  preserveElementIds: resolveCurrentRootBoundaryCommitElementPersistence({
103
- currentSnapshot: options.state.visibleSnapshot,
431
+ currentTopology: currentTopology.topology,
432
+ lane: options.event.token.lane,
433
+ targetTopology: targetTopology.topology
434
+ }),
435
+ preservePreviousSlotIds: resolveCurrentRootBoundaryCommitSlotPersistence({
436
+ currentTopology: currentTopology.topology,
104
437
  lane: options.event.token.lane,
105
- targetSnapshot: options.event.result.targetSnapshot
438
+ targetTopology: targetTopology.topology
106
439
  }),
107
440
  reason: "currentRootBoundary",
108
- targetSnapshot: options.event.result.targetSnapshot
441
+ targetSnapshot
109
442
  },
110
443
  token: options.event.token,
111
- trace: createNavigationTrace(NavigationTraceReasonCodes.commitCurrent, traceFields)
444
+ trace: createNavigationTrace(NavigationTraceReasonCodes.commitCurrent, commitTraceFields)
112
445
  };
113
446
  }
114
447
  function planNavigation(input) {
@@ -150,6 +483,7 @@ function planNavigation(input) {
150
483
  });
151
484
  case "flightResponseArrived": return planFlightResponseArrived({
152
485
  event: input.event,
486
+ routeManifest: input.routeManifest,
153
487
  state: input.state
154
488
  });
155
489
  default: {
@@ -1 +1 @@
1
- {"version":3,"file":"navigation-planner.js","names":["_exhaustive"],"sources":["../../src/server/navigation-planner.ts"],"sourcesContent":["import type { RouteManifest } from \"../routing/app-route-graph.js\";\nimport {\n NavigationTraceReasonCodes,\n createNavigationLifecycleTraceFields,\n createNavigationTrace,\n type NavigationTrace,\n type NavigationTraceFields,\n} from \"./navigation-trace.js\";\n\nexport type OperationLane =\n | \"hmr\"\n | \"navigation\"\n | \"prefetch\"\n | \"refresh\"\n | \"server-action\"\n | \"traverse\";\n\nexport type OperationToken = {\n operationId: number;\n lane: OperationLane;\n baseVisibleCommitVersion: number;\n graphVersion: string | null;\n deploymentVersion: string | null;\n targetSnapshotFingerprint: string;\n cacheVariantFingerprint?: string;\n};\n\nexport type RouteSnapshotV0 = {\n routeId: string;\n // Ordered ancestor-first, with the root layout at index 0. Same-layout\n // persistence uses prefix comparison, so callers must preserve this order.\n layoutIds: readonly string[];\n mountedParallelSlots: readonly MountedParallelSlotSnapshotV0[];\n rootBoundaryId: string | null;\n displayUrl: string;\n matchedUrl: string;\n};\n\nexport type MountedParallelSlotSnapshotV0 = {\n slotId: string;\n ownerLayoutId: string | null;\n};\n\nexport type NavigationPlannerStateV0 = {\n // V0 keeps a single state shape so intent events and result events can move\n // through one planner surface. flightResponseArrived uses event.token; later\n // #726 slices can split this by event kind once more result paths are routed\n // through the planner.\n nextOperationToken: OperationToken;\n // Callers that have lifecycle authority should pass the complete trace\n // context. When absent, the planner emits the stable root-boundary facts it\n // can derive from the event and visible snapshot.\n traceFields?: NavigationTraceFields;\n visibleCommitVersion: number;\n visibleSnapshot: RouteSnapshotV0;\n};\n\nexport type RefreshScope = \"visible\";\n\nexport type NavigationEvent =\n | { kind: \"navigate\"; href: string; mode: \"push\" | \"replace\" }\n | { kind: \"refresh\"; scope: RefreshScope }\n | { kind: \"traverse\"; direction: \"back\" | \"forward\"; historyState: unknown }\n | { kind: \"prefetch\"; href: string }\n | { kind: \"flightResponseArrived\"; token: OperationToken; result: FlightResultV0 };\n\nexport type RequestedWork =\n | { kind: \"flight\"; href: string; mode: \"push\" | \"replace\" | \"refresh\" }\n | { direction: \"back\" | \"forward\"; historyState: unknown; kind: \"traverseFlight\" }\n | { kind: \"prefetch\"; href: string };\n\nexport type CommitProposal = {\n preserveAbsentSlots: boolean;\n preserveElementIds: readonly string[];\n reason: \"currentRootBoundary\" | \"rootBoundaryUnknownFallback\";\n targetSnapshot: RouteSnapshotV0;\n};\n\nexport type NoCommitReason = \"prefetchOnly\";\nexport type HardNavigationReason = \"rootBoundaryChanged\";\nexport type RootBoundaryTransition =\n | \"currentRootBoundary\"\n | \"rootBoundaryChanged\"\n | \"rootBoundaryUnknownFallback\";\n\nexport type NavigationDecisionV0 =\n | {\n kind: \"requestWork\";\n token: OperationToken;\n work: RequestedWork;\n trace: NavigationTrace;\n }\n | {\n kind: \"proposeCommit\";\n token: OperationToken;\n proposal: CommitProposal;\n trace: NavigationTrace;\n }\n | {\n kind: \"noCommit\";\n token: OperationToken;\n reason: NoCommitReason;\n trace: NavigationTrace;\n }\n | {\n kind: \"hardNavigate\";\n token: OperationToken;\n url: string;\n reason: HardNavigationReason;\n trace: NavigationTrace;\n };\n\nexport type FlightResultV0 = {\n href: string;\n targetSnapshot: RouteSnapshotV0;\n};\n\nexport type NavigationPlannerInput = {\n // Reserved for #726-CORE-09 route-graph-aware planning. CORE-07/08 only\n // routes the existing root-boundary decision through the planner, so browser\n // callers pass null until route topology becomes part of the decision input.\n routeManifest: RouteManifest | null;\n state: NavigationPlannerStateV0;\n event: NavigationEvent;\n};\n\nfunction createRequestWorkDecision(options: {\n eventKind: NavigationEvent[\"kind\"];\n state: NavigationPlannerStateV0;\n work: RequestedWork;\n}): NavigationDecisionV0 {\n return {\n kind: \"requestWork\",\n token: options.state.nextOperationToken,\n work: options.work,\n trace: createNavigationTrace(NavigationTraceReasonCodes.requestWork, {\n eventKind: options.eventKind,\n targetHref: getRequestedWorkTargetHref(options.work),\n }),\n };\n}\n\nfunction getRequestedWorkTargetHref(work: RequestedWork): string | null {\n switch (work.kind) {\n case \"flight\":\n case \"prefetch\":\n return work.href;\n case \"traverseFlight\":\n return null;\n default: {\n const _exhaustive: never = work;\n throw new Error(\"[vinext] Unknown requested navigation work: \" + String(_exhaustive));\n }\n }\n}\n\nfunction createRootBoundaryTraceFields(options: {\n event: Extract<NavigationEvent, { kind: \"flightResponseArrived\" }>;\n state: NavigationPlannerStateV0;\n}): NavigationTraceFields {\n // Browser commit approval supplies lifecycle trace context before calling\n // the planner. This fallback exists for pure planner callers and tests; it\n // intentionally cannot invent lifecycle-only fields such as active nav id.\n return (\n options.state.traceFields ??\n createNavigationLifecycleTraceFields({\n currentRootLayoutTreePath: options.state.visibleSnapshot.rootBoundaryId,\n currentVisibleCommitVersion: options.state.visibleCommitVersion,\n nextRootLayoutTreePath: options.event.result.targetSnapshot.rootBoundaryId,\n startedVisibleCommitVersion: options.event.token.baseVisibleCommitVersion,\n })\n );\n}\n\nfunction classifyRootBoundaryTransition(\n currentRootBoundaryId: string | null,\n nextRootBoundaryId: string | null,\n): RootBoundaryTransition {\n if (currentRootBoundaryId === null || nextRootBoundaryId === null) {\n // Both null directions intentionally share the v0 fallback because this\n // slice only knows boundary identity from the current flight payload.\n // #726-CORE-09 can split \"unknown current\" from \"unknown target\" once the\n // planner consumes graph-owned root boundary facts for both sides.\n return \"rootBoundaryUnknownFallback\";\n }\n\n return currentRootBoundaryId === nextRootBoundaryId\n ? \"currentRootBoundary\"\n : \"rootBoundaryChanged\";\n}\n\nfunction resolveSameLayoutAncestorPersistence(\n currentSnapshot: RouteSnapshotV0,\n targetSnapshot: RouteSnapshotV0,\n): readonly string[] {\n if (\n classifyRootBoundaryTransition(\n currentSnapshot.rootBoundaryId,\n targetSnapshot.rootBoundaryId,\n ) !== \"currentRootBoundary\"\n ) {\n return [];\n }\n\n const commonLayoutIds: string[] = [];\n const maxLength = Math.min(currentSnapshot.layoutIds.length, targetSnapshot.layoutIds.length);\n for (let index = 0; index < maxLength; index++) {\n const layoutId = currentSnapshot.layoutIds[index];\n if (layoutId !== targetSnapshot.layoutIds[index]) break;\n commonLayoutIds.push(layoutId);\n }\n return commonLayoutIds;\n}\n\nfunction resolveMountedParallelSlotPersistence(\n currentSnapshot: RouteSnapshotV0,\n targetSnapshot: RouteSnapshotV0,\n): readonly string[] {\n const preservedLayoutIds = resolveSameLayoutAncestorPersistence(currentSnapshot, targetSnapshot);\n return resolveMountedParallelSlotPersistenceForLayouts(currentSnapshot, preservedLayoutIds);\n}\n\nfunction resolveMountedParallelSlotPersistenceForLayouts(\n currentSnapshot: RouteSnapshotV0,\n preservedLayoutIds: readonly string[],\n): readonly string[] {\n if (preservedLayoutIds.length === 0) return [];\n const preservedLayoutIdSet = new Set(preservedLayoutIds);\n\n const preservedSlotIds: string[] = [];\n const seenSlotIds = new Set<string>();\n for (const slot of currentSnapshot.mountedParallelSlots) {\n if (slot.ownerLayoutId === null) continue;\n if (!preservedLayoutIdSet.has(slot.ownerLayoutId)) continue;\n if (seenSlotIds.has(slot.slotId)) continue;\n\n preservedSlotIds.push(slot.slotId);\n seenSlotIds.add(slot.slotId);\n }\n return preservedSlotIds;\n}\n\nfunction resolveCurrentRootBoundaryElementPersistence(\n currentSnapshot: RouteSnapshotV0,\n targetSnapshot: RouteSnapshotV0,\n): readonly string[] {\n const preservedLayoutIds = resolveSameLayoutAncestorPersistence(currentSnapshot, targetSnapshot);\n return [\n ...preservedLayoutIds,\n ...resolveMountedParallelSlotPersistenceForLayouts(currentSnapshot, preservedLayoutIds),\n ];\n}\n\nfunction resolveCurrentRootBoundaryCommitElementPersistence(options: {\n currentSnapshot: RouteSnapshotV0;\n lane: OperationLane;\n targetSnapshot: RouteSnapshotV0;\n}): readonly string[] {\n const preservedLayoutIds = resolveSameLayoutAncestorPersistence(\n options.currentSnapshot,\n options.targetSnapshot,\n );\n\n if (options.lane === \"traverse\") {\n return preservedLayoutIds;\n }\n\n return [\n ...preservedLayoutIds,\n ...resolveMountedParallelSlotPersistenceForLayouts(options.currentSnapshot, preservedLayoutIds),\n ];\n}\n\nfunction planFlightResponseArrived(options: {\n event: Extract<NavigationEvent, { kind: \"flightResponseArrived\" }>;\n state: NavigationPlannerStateV0;\n}): NavigationDecisionV0 {\n const traceFields = createRootBoundaryTraceFields(options);\n\n if (options.event.token.lane === \"prefetch\") {\n return {\n kind: \"noCommit\",\n reason: \"prefetchOnly\",\n token: options.event.token,\n trace: createNavigationTrace(NavigationTraceReasonCodes.prefetchOnly, traceFields),\n };\n }\n\n const transition = classifyRootBoundaryTransition(\n options.state.visibleSnapshot.rootBoundaryId,\n options.event.result.targetSnapshot.rootBoundaryId,\n );\n\n if (transition === \"rootBoundaryChanged\") {\n return {\n kind: \"hardNavigate\",\n reason: \"rootBoundaryChanged\",\n token: options.event.token,\n trace: createNavigationTrace(NavigationTraceReasonCodes.rootBoundaryChanged, traceFields),\n url: options.event.result.href,\n };\n }\n\n if (transition === \"rootBoundaryUnknownFallback\") {\n // Unknown root identity is an uncertainty fallback, not evidence that\n // reuse is safe. #726-CORE-09 can delete the legacy soft-commit writer\n // once every promoted caller supplies graph-owned root boundary IDs from\n // the route graph read model documented in routing/app-router.ts.\n return {\n kind: \"proposeCommit\",\n proposal: {\n preserveAbsentSlots: true,\n preserveElementIds: [],\n reason: \"rootBoundaryUnknownFallback\",\n targetSnapshot: options.event.result.targetSnapshot,\n },\n token: options.event.token,\n trace: createNavigationTrace(NavigationTraceReasonCodes.rootBoundaryUnknown, traceFields),\n };\n }\n\n return {\n kind: \"proposeCommit\",\n proposal: {\n preserveAbsentSlots: false,\n preserveElementIds: resolveCurrentRootBoundaryCommitElementPersistence({\n currentSnapshot: options.state.visibleSnapshot,\n lane: options.event.token.lane,\n targetSnapshot: options.event.result.targetSnapshot,\n }),\n reason: \"currentRootBoundary\",\n targetSnapshot: options.event.result.targetSnapshot,\n },\n token: options.event.token,\n trace: createNavigationTrace(NavigationTraceReasonCodes.commitCurrent, traceFields),\n };\n}\n\nfunction planNavigation(input: NavigationPlannerInput): NavigationDecisionV0 {\n switch (input.event.kind) {\n case \"navigate\":\n return createRequestWorkDecision({\n eventKind: input.event.kind,\n state: input.state,\n work: {\n href: input.event.href,\n kind: \"flight\",\n mode: input.event.mode,\n },\n });\n case \"refresh\":\n return createRequestWorkDecision({\n eventKind: input.event.kind,\n state: input.state,\n work: {\n href: input.state.visibleSnapshot.displayUrl,\n kind: \"flight\",\n mode: \"refresh\",\n },\n });\n case \"traverse\":\n return createRequestWorkDecision({\n eventKind: input.event.kind,\n state: input.state,\n work: {\n direction: input.event.direction,\n historyState: input.event.historyState,\n kind: \"traverseFlight\",\n },\n });\n case \"prefetch\":\n return createRequestWorkDecision({\n eventKind: input.event.kind,\n state: input.state,\n work: {\n href: input.event.href,\n kind: \"prefetch\",\n },\n });\n case \"flightResponseArrived\":\n return planFlightResponseArrived({\n event: input.event,\n state: input.state,\n });\n default: {\n const _exhaustive: never = input.event;\n throw new Error(\"[vinext] Unknown navigation event: \" + String(_exhaustive));\n }\n }\n}\n\nexport const navigationPlanner = {\n classifyRootBoundaryTransition,\n plan: planNavigation,\n resolveCurrentRootBoundaryElementPersistence,\n resolveMountedParallelSlotPersistence,\n resolveSameLayoutAncestorPersistence,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"navigation-planner.js","names":["_exhaustive"],"sources":["../../src/server/navigation-planner.ts"],"sourcesContent":["import { matchRoutePattern, matchRoutePatternPrefix } from \"../routing/route-pattern.js\";\nimport { splitPathnameForRouteMatch } from \"../routing/utils.js\";\nimport type {\n RouteManifest,\n RouteManifestInterception,\n RouteManifestRoute,\n} from \"../routing/app-route-graph.js\";\nimport { compareAppElementsSlotIds, type AppElementsSlotBinding } from \"./app-elements.js\";\nimport type {\n CacheEntryReuseDecision,\n CacheEntryReuseProof,\n CacheProofRejectionCode,\n} from \"./cache-proof.js\";\nimport {\n NavigationTraceReasonCodes,\n createNavigationLifecycleTraceFields,\n createNavigationTrace,\n type NavigationTrace,\n type NavigationTraceFields,\n type NavigationTraceReasonCode,\n} from \"./navigation-trace.js\";\n\nexport type OperationLane =\n | \"hmr\"\n | \"navigation\"\n | \"prefetch\"\n | \"refresh\"\n | \"server-action\"\n | \"traverse\";\n\nexport type OperationToken = {\n operationId: number;\n lane: OperationLane;\n baseVisibleCommitVersion: number;\n graphVersion: string | null;\n deploymentVersion: string | null;\n targetSnapshotFingerprint: string;\n cacheVariantFingerprint?: string;\n};\n\nexport type RouteSnapshotV0 = {\n interception: InterceptionSnapshotV0 | null;\n interceptionContext: string | null;\n routeId: string;\n // Ordered ancestor-first, with the root layout at index 0. Same-layout\n // persistence uses prefix comparison, so callers must preserve this order.\n layoutIds: readonly string[];\n mountedParallelSlots: readonly MountedParallelSlotSnapshotV0[];\n rootBoundaryId: string | null;\n displayUrl: string;\n matchedUrl: string;\n slotBindings: readonly ParallelSlotBindingSnapshotV0[];\n};\n\nexport type InterceptionSnapshotV0 = {\n sourceMatchedUrl: string;\n sourceRouteId: string;\n slotId: string;\n targetMatchedUrl: string;\n targetRouteId: string;\n};\n\nexport type MountedParallelSlotSnapshotV0 = {\n slotId: string;\n ownerLayoutId: string | null;\n};\n\n// Planner snapshots consume the same canonical slot-binding facts decoded from\n// AppElements metadata. Keep the alias explicit so route-state and transport\n// readers cannot drift into structurally identical but semantically separate\n// shapes.\nexport type ParallelSlotBindingSnapshotV0 = AppElementsSlotBinding;\n\nexport type NavigationPlannerStateV0 = {\n // V0 keeps a single state shape so intent events and result events can move\n // through one planner surface. flightResponseArrived uses event.token; later\n // #726 slices can split this by event kind once more result paths are routed\n // through the planner.\n nextOperationToken: OperationToken;\n // Callers that have lifecycle authority should pass the complete trace\n // context. When absent, the planner emits the stable root-boundary facts it\n // can derive from the event and visible snapshot.\n traceFields?: NavigationTraceFields;\n visibleCommitVersion: number;\n visibleSnapshot: RouteSnapshotV0;\n};\n\nexport type RefreshScope = \"visible\";\nexport type TraverseDirection = \"back\" | \"forward\" | \"unknown\";\n\nexport type NavigationEvent =\n | { kind: \"navigate\"; href: string; mode: \"push\" | \"replace\" }\n | { kind: \"refresh\"; scope: RefreshScope }\n | { kind: \"traverse\"; direction: TraverseDirection; historyState: unknown }\n | { kind: \"prefetch\"; href: string }\n | { kind: \"flightResponseArrived\"; token: OperationToken; result: FlightResultV0 };\n\nexport type RequestedWork =\n | { kind: \"flight\"; href: string; mode: \"push\" | \"replace\" | \"refresh\" }\n | { direction: TraverseDirection; historyState: unknown; kind: \"traverseFlight\" }\n | { kind: \"prefetch\"; href: string };\n\nexport type CommitProposal = {\n cacheEntryReuseDecision?: AcceptedCacheEntryReuseDecision;\n preserveAbsentSlots: boolean;\n preserveElementIds: readonly string[];\n preservePreviousSlotIds: readonly string[];\n reason: \"currentRootBoundary\" | \"interceptedCurrentRootBoundary\" | \"unprovenTopologyFallback\";\n targetSnapshot: RouteSnapshotV0;\n};\n\nexport type NoCommitReason = \"prefetchOnly\";\nexport type HardNavigationReason =\n | \"cacheProofRejected\"\n | \"interceptionProofRejected\"\n | \"rootBoundaryChanged\";\nexport type RootBoundaryTransition =\n | \"currentRootBoundary\"\n | \"rootBoundaryChanged\"\n | \"rootBoundaryUnknown\";\n\nexport type NavigationDecisionV0 =\n | {\n kind: \"requestWork\";\n token: OperationToken;\n work: RequestedWork;\n trace: NavigationTrace;\n }\n | {\n kind: \"proposeCommit\";\n token: OperationToken;\n proposal: CommitProposal;\n trace: NavigationTrace;\n }\n | {\n kind: \"noCommit\";\n token: OperationToken;\n reason: NoCommitReason;\n trace: NavigationTrace;\n }\n | {\n kind: \"hardNavigate\";\n token: OperationToken;\n url: string;\n reason: HardNavigationReason;\n trace: NavigationTrace;\n };\n\nexport type FlightResultV0 = {\n cacheEntryReuseProof?: CacheEntryReuseProof;\n href: string;\n targetSnapshot: RouteSnapshotV0;\n};\n\nexport type NavigationPlannerInput = {\n // Graph-owned route topology is the semantic authority for root/layout/slot\n // decisions whenever the caller can supply it. Null keeps the legacy\n // snapshot-only path for low-level tests and unknown route shapes.\n routeManifest: RouteManifest | null;\n state: NavigationPlannerStateV0;\n event: NavigationEvent;\n};\n\ntype RouteTopologySnapshot = {\n layoutIds: readonly string[];\n rootBoundaryId: string | null;\n rootLayoutTreePath: string | null;\n slotBindings: readonly ParallelSlotBindingSnapshotV0[];\n};\n\ntype RouteTopologyResolution =\n | {\n kind: \"known\";\n topology: RouteTopologySnapshot;\n }\n | {\n kind: \"unknown\";\n };\n\ntype RouteTopologySlotBindingSource = \"snapshot\" | \"manifestTarget\";\ntype AcceptedCacheEntryReuseDecision = Extract<CacheEntryReuseDecision, { canReuse: true }>;\ntype RejectedCacheEntryReuseDecision = Extract<CacheEntryReuseDecision, { canReuse: false }>;\ntype CacheEntryProofEvaluation =\n | Readonly<{\n decision: AcceptedCacheEntryReuseDecision | null;\n kind: \"accepted\";\n }>\n | Readonly<{\n decision: RejectedCacheEntryReuseDecision | null;\n kind: \"rejected\";\n }>;\n\nconst ROUTE_INTERCEPTION_CONTEXT_SEPARATOR = \"\\0\";\nconst CACHE_ENTRY_PROOF_MISSING_CODE =\n \"CP_CACHE_ENTRY_PROOF_MISSING\" satisfies CacheProofRejectionCode;\n\nfunction createRequestWorkDecision(options: {\n eventKind: NavigationEvent[\"kind\"];\n state: NavigationPlannerStateV0;\n work: RequestedWork;\n}): NavigationDecisionV0 {\n const traverseFields =\n options.work.kind === \"traverseFlight\" ? { traverseDirection: options.work.direction } : {};\n return {\n kind: \"requestWork\",\n token: options.state.nextOperationToken,\n work: options.work,\n trace: createNavigationTrace(NavigationTraceReasonCodes.requestWork, {\n eventKind: options.eventKind,\n targetHref: getRequestedWorkTargetHref(options.work),\n ...traverseFields,\n }),\n };\n}\n\nfunction getRequestedWorkTargetHref(work: RequestedWork): string | null {\n switch (work.kind) {\n case \"flight\":\n case \"prefetch\":\n return work.href;\n case \"traverseFlight\":\n return null;\n default: {\n const _exhaustive: never = work;\n throw new Error(\"[vinext] Unknown requested navigation work: \" + String(_exhaustive));\n }\n }\n}\n\nfunction createSnapshotRouteTopology(snapshot: RouteSnapshotV0): RouteTopologySnapshot {\n return {\n layoutIds: snapshot.layoutIds,\n rootBoundaryId: snapshot.rootBoundaryId,\n rootLayoutTreePath: snapshot.rootBoundaryId,\n slotBindings: snapshot.slotBindings,\n };\n}\n\nfunction stripInterceptionContextFromRouteId(routeId: string): string {\n const separatorIndex = routeId.indexOf(ROUTE_INTERCEPTION_CONTEXT_SEPARATOR);\n return separatorIndex === -1 ? routeId : routeId.slice(0, separatorIndex);\n}\n\nfunction getMatchedUrlPathname(matchedUrl: string): string {\n try {\n return new URL(matchedUrl, \"https://vinext.local\").pathname;\n } catch {\n const [withoutHash = \"\"] = matchedUrl.split(\"#\");\n const [pathname = \"\"] = withoutHash.split(\"?\");\n return pathname === \"\" ? \"/\" : pathname;\n }\n}\n\nfunction splitMatchedUrlIntoRouteParts(matchedUrl: string): string[] {\n return splitPathnameForRouteMatch(getMatchedUrlPathname(matchedUrl));\n}\n\nfunction findRouteManifestRouteByMatchedUrl(\n routeManifest: RouteManifest,\n matchedUrl: string,\n): RouteManifestRoute | null {\n const urlParts = splitMatchedUrlIntoRouteParts(matchedUrl);\n\n // RouteManifest preserves buildAppRouteGraph's compareRoutes() order, so the\n // first pattern match follows the same static/dynamic/catch-all precedence as\n // request-time route matching instead of raw filesystem scan order.\n for (const route of routeManifest.segmentGraph.routes.values()) {\n if (matchRoutePattern(urlParts, route.patternParts) !== null) {\n return route;\n }\n }\n\n return null;\n}\n\nfunction routeManifestRouteMatchesUrl(route: RouteManifestRoute, matchedUrl: string): boolean {\n return matchRoutePattern(splitMatchedUrlIntoRouteParts(matchedUrl), route.patternParts) !== null;\n}\n\nfunction findRouteManifestRouteByIdOrMatchedUrl(options: {\n matchedUrl: string;\n routeId: string;\n routeManifest: RouteManifest;\n}): RouteManifestRoute | null {\n const routeId = stripInterceptionContextFromRouteId(options.routeId);\n const route = options.routeManifest.segmentGraph.routes.get(routeId);\n if (route && routeManifestRouteMatchesUrl(route, options.matchedUrl)) {\n return route;\n }\n\n return findRouteManifestRouteByMatchedUrl(options.routeManifest, options.matchedUrl);\n}\n\nfunction findRouteManifestRouteForSnapshot(\n routeManifest: RouteManifest,\n snapshot: RouteSnapshotV0,\n): RouteManifestRoute | null {\n if (snapshot.interception !== null) {\n return findRouteManifestRouteByIdOrMatchedUrl({\n matchedUrl: snapshot.interception.sourceMatchedUrl,\n routeId: snapshot.interception.sourceRouteId,\n routeManifest,\n });\n }\n\n return findRouteManifestRouteByIdOrMatchedUrl({\n matchedUrl: snapshot.matchedUrl,\n routeId: snapshot.routeId,\n routeManifest,\n });\n}\n\nfunction resolveRouteManifestSlotBindings(\n routeManifest: RouteManifest,\n route: RouteManifestRoute,\n): readonly ParallelSlotBindingSnapshotV0[] {\n const bindings: ParallelSlotBindingSnapshotV0[] = [];\n for (const slotId of route.slotIds) {\n const binding = routeManifest.segmentGraph.slotBindings.get(`${route.id}::${slotId}`);\n if (!binding) continue;\n bindings.push({\n ownerLayoutId: binding.ownerLayoutId,\n slotId: binding.slotId,\n state: binding.state,\n });\n }\n\n return bindings.sort((left, right) => compareAppElementsSlotIds(left.slotId, right.slotId));\n}\n\nfunction resolveRouteManifestRootLayoutTreePath(\n routeManifest: RouteManifest,\n route: RouteManifestRoute,\n): string | null {\n if (route.rootBoundaryId === null) return null;\n return routeManifest.segmentGraph.rootBoundaries.get(route.rootBoundaryId)?.treePath ?? null;\n}\n\nfunction resolveRouteTopologySnapshot(options: {\n routeManifest: RouteManifest | null;\n slotBindingSource: RouteTopologySlotBindingSource;\n snapshot: RouteSnapshotV0;\n}): RouteTopologyResolution {\n const route =\n options.routeManifest === null\n ? null\n : findRouteManifestRouteForSnapshot(options.routeManifest, options.snapshot);\n if (route === null || options.routeManifest === null) {\n return { kind: \"unknown\" };\n }\n\n // Intercepted targets carry the source route's tree topology, not the direct\n // target route's, so direct-target manifest slot bindings do not apply.\n const shouldUseManifestSlotBindings =\n options.slotBindingSource === \"manifestTarget\" && options.snapshot.interception === null;\n\n return {\n kind: \"known\",\n topology: {\n layoutIds: route.layoutIds,\n rootBoundaryId: route.rootBoundaryId,\n rootLayoutTreePath: resolveRouteManifestRootLayoutTreePath(options.routeManifest, route),\n slotBindings: shouldUseManifestSlotBindings\n ? resolveRouteManifestSlotBindings(options.routeManifest, route)\n : options.snapshot.slotBindings,\n },\n };\n}\n\nfunction findRouteManifestInterceptionForProof(\n routeManifest: RouteManifest,\n proof: InterceptionSnapshotV0,\n): RouteManifestInterception | null {\n const sourceParts = splitMatchedUrlIntoRouteParts(proof.sourceMatchedUrl);\n const targetParts = splitMatchedUrlIntoRouteParts(proof.targetMatchedUrl);\n const targetRoute = findRouteManifestRouteByIdOrMatchedUrl({\n matchedUrl: proof.targetMatchedUrl,\n routeId: proof.targetRouteId,\n routeManifest,\n });\n const candidateInterceptions =\n routeManifest.segmentGraph.interceptionsBySlotId.get(proof.slotId) ?? [];\n\n for (const interception of candidateInterceptions) {\n if (!matchRoutePatternPrefix(sourceParts, interception.sourcePatternParts)) {\n continue;\n }\n if (matchRoutePattern(targetParts, interception.targetPatternParts) === null) continue;\n if (interception.targetRouteId !== null && targetRoute?.id !== interception.targetRouteId) {\n continue;\n }\n return interception;\n }\n\n return null;\n}\n\nfunction createRootBoundaryTraceFields(options: {\n currentRootLayoutTreePath: string | null;\n event: Extract<NavigationEvent, { kind: \"flightResponseArrived\" }>;\n nextRootLayoutTreePath: string | null;\n state: NavigationPlannerStateV0;\n}): NavigationTraceFields {\n // Browser commit approval supplies lifecycle trace context before calling\n // the planner. This fallback exists for pure planner callers and tests; it\n // intentionally cannot invent lifecycle-only fields such as active nav id.\n if (options.state.traceFields) {\n return {\n ...options.state.traceFields,\n currentRootLayoutTreePath: options.currentRootLayoutTreePath,\n nextRootLayoutTreePath: options.nextRootLayoutTreePath,\n };\n }\n\n return createNavigationLifecycleTraceFields({\n currentRootLayoutTreePath: options.currentRootLayoutTreePath,\n currentVisibleCommitVersion: options.state.visibleCommitVersion,\n nextRootLayoutTreePath: options.nextRootLayoutTreePath,\n startedVisibleCommitVersion: options.event.token.baseVisibleCommitVersion,\n });\n}\n\nfunction classifyRootBoundaryTransition(\n currentRootBoundaryId: string | null,\n nextRootBoundaryId: string | null,\n): RootBoundaryTransition {\n if (currentRootBoundaryId === null || nextRootBoundaryId === null) {\n return \"rootBoundaryUnknown\";\n }\n\n return currentRootBoundaryId === nextRootBoundaryId\n ? \"currentRootBoundary\"\n : \"rootBoundaryChanged\";\n}\n\nfunction resolveSameLayoutAncestorPersistence(\n currentSnapshot: RouteSnapshotV0,\n targetSnapshot: RouteSnapshotV0,\n): readonly string[] {\n return resolveSameLayoutAncestorPersistenceForTopologies(\n createSnapshotRouteTopology(currentSnapshot),\n createSnapshotRouteTopology(targetSnapshot),\n );\n}\n\nfunction resolveSameLayoutAncestorPersistenceForTopologies(\n currentTopology: RouteTopologySnapshot,\n targetTopology: RouteTopologySnapshot,\n): readonly string[] {\n if (\n classifyRootBoundaryTransition(\n currentTopology.rootBoundaryId,\n targetTopology.rootBoundaryId,\n ) !== \"currentRootBoundary\"\n ) {\n return [];\n }\n\n const commonLayoutIds: string[] = [];\n const maxLength = Math.min(currentTopology.layoutIds.length, targetTopology.layoutIds.length);\n for (let index = 0; index < maxLength; index++) {\n const layoutId = currentTopology.layoutIds[index];\n if (layoutId !== targetTopology.layoutIds[index]) break;\n commonLayoutIds.push(layoutId);\n }\n return commonLayoutIds;\n}\n\nfunction resolveMountedParallelSlotPersistence(\n currentSnapshot: RouteSnapshotV0,\n targetSnapshot: RouteSnapshotV0,\n): readonly string[] {\n const preservedLayoutIds = resolveSameLayoutAncestorPersistence(currentSnapshot, targetSnapshot);\n return resolveMountedParallelSlotPersistenceForLayouts(currentSnapshot, preservedLayoutIds);\n}\n\nfunction resolveMountedParallelSlotPersistenceForLayouts(\n currentSnapshot: RouteSnapshotV0,\n preservedLayoutIds: readonly string[],\n): readonly string[] {\n if (preservedLayoutIds.length === 0) return [];\n const preservedLayoutIdSet = new Set(preservedLayoutIds);\n\n const preservedSlotIds: string[] = [];\n const seenSlotIds = new Set<string>();\n for (const slot of currentSnapshot.mountedParallelSlots) {\n if (slot.ownerLayoutId === null) continue;\n if (!preservedLayoutIdSet.has(slot.ownerLayoutId)) continue;\n if (seenSlotIds.has(slot.slotId)) continue;\n\n preservedSlotIds.push(slot.slotId);\n seenSlotIds.add(slot.slotId);\n }\n return preservedSlotIds;\n}\n\nfunction resolveCurrentRootBoundaryElementPersistence(\n currentSnapshot: RouteSnapshotV0,\n targetSnapshot: RouteSnapshotV0,\n): readonly string[] {\n const preservedLayoutIds = resolveSameLayoutAncestorPersistence(currentSnapshot, targetSnapshot);\n // Non-commit consumers still receive the legacy mounted-slot element list.\n // Commit promotion uses preservePreviousSlotIds instead so default/unmatched\n // slot reuse requires route-state proof.\n return [\n ...preservedLayoutIds,\n ...resolveMountedParallelSlotPersistenceForLayouts(currentSnapshot, preservedLayoutIds),\n ];\n}\n\nfunction resolveCurrentRootBoundaryCommitElementPersistence(options: {\n currentTopology: RouteTopologySnapshot;\n lane: OperationLane;\n targetTopology: RouteTopologySnapshot;\n}): readonly string[] {\n // Commit element persistence only keeps layout IDs. Default/unmatched slot\n // reuse is handled separately by preservePreviousSlotIds, using slot-binding\n // metadata as proof; payloads without __slotBindings get no semantic reuse.\n // resolveCurrentRootBoundaryCommitSlotPersistence recomputes this same\n // ancestor set; planner correctness relies on both calls agreeing so any\n // preserved slot's owner layout is also present in preserveElementIds.\n return resolveSameLayoutAncestorPersistenceForTopologies(\n options.currentTopology,\n options.targetTopology,\n );\n}\n\nfunction resolveCurrentRootBoundaryCommitSlotPersistence(options: {\n currentTopology: RouteTopologySnapshot;\n lane: OperationLane;\n targetTopology: RouteTopologySnapshot;\n}): readonly string[] {\n if (options.lane === \"traverse\") return [];\n\n const preservedLayoutIds = resolveSameLayoutAncestorPersistenceForTopologies(\n options.currentTopology,\n options.targetTopology,\n );\n if (preservedLayoutIds.length === 0) return [];\n\n return resolveDefaultOrUnmatchedSlotPersistenceForLayouts({\n currentSlotBindings: options.currentTopology.slotBindings,\n preservedLayoutIds,\n targetSlotBindings: options.targetTopology.slotBindings,\n });\n}\n\n/**\n * Default/unmatched slot preservation law:\n *\n * A target default/unmatched slot may reuse previous content only when:\n * - the slot's owner layout is part of the preserved layout ancestor set;\n * - the current visible snapshot proves the same slot had renderable content;\n * - the navigation is not a traversal.\n *\n * Wire absence and UNMATCHED_SLOT markers are not semantic proof.\n */\nfunction resolveDefaultOrUnmatchedSlotPersistenceForLayouts(options: {\n currentSlotBindings: readonly ParallelSlotBindingSnapshotV0[];\n preservedLayoutIds: readonly string[];\n targetSlotBindings: readonly ParallelSlotBindingSnapshotV0[];\n}): readonly string[] {\n const preservedLayoutIdSet = new Set(options.preservedLayoutIds);\n const slotIdsWithContent = new Set<string>();\n for (const binding of options.currentSlotBindings) {\n if (binding.state === \"unmatched\") continue;\n slotIdsWithContent.add(binding.slotId);\n }\n\n const preservedSlotIds: string[] = [];\n const seenSlotIds = new Set<string>();\n for (const binding of options.targetSlotBindings) {\n if (binding.ownerLayoutId === null) continue;\n if (!preservedLayoutIdSet.has(binding.ownerLayoutId)) continue;\n if (binding.state === \"active\") continue;\n if (!slotIdsWithContent.has(binding.slotId)) continue;\n if (seenSlotIds.has(binding.slotId)) continue;\n\n preservedSlotIds.push(binding.slotId);\n seenSlotIds.add(binding.slotId);\n }\n return preservedSlotIds.sort(compareAppElementsSlotIds);\n}\n\ntype VisibleInterceptionSourceIdentity = {\n matchedUrl: string;\n routeId: string;\n};\n\ntype InterceptedPreservationValidation =\n | {\n kind: \"approved\";\n preserveElementIds: readonly string[];\n preservePreviousSlotIds: readonly string[];\n }\n | {\n kind: \"rejected\";\n reasonCode: NavigationTraceReasonCode;\n };\n\nfunction getVisibleInterceptionSourceIdentity(\n snapshot: RouteSnapshotV0,\n): VisibleInterceptionSourceIdentity {\n if (snapshot.interception) {\n return {\n matchedUrl: snapshot.interception.sourceMatchedUrl,\n routeId: snapshot.interception.sourceRouteId,\n };\n }\n return {\n matchedUrl: snapshot.matchedUrl,\n routeId: snapshot.routeId,\n };\n}\n\nfunction createInterceptionProofRejectedDecision(options: {\n event: Extract<NavigationEvent, { kind: \"flightResponseArrived\" }>;\n reasonCode: NavigationTraceReasonCode;\n traceFields: NavigationTraceFields;\n}): NavigationDecisionV0 {\n return {\n kind: \"hardNavigate\",\n reason: \"interceptionProofRejected\",\n token: options.event.token,\n trace: createNavigationTrace(options.reasonCode, options.traceFields),\n url: options.event.result.href,\n };\n}\n\nfunction evaluateCacheEntryReuseProof(\n proof: CacheEntryReuseProof | undefined,\n): CacheEntryProofEvaluation {\n if (proof === undefined) {\n return {\n kind: \"accepted\",\n decision: null,\n };\n }\n\n if (proof.decision === null) {\n return {\n kind: \"rejected\",\n decision: null,\n };\n }\n\n if (proof.decision.canReuse) {\n return {\n kind: \"accepted\",\n decision: proof.decision,\n };\n }\n\n return {\n kind: \"rejected\",\n decision: proof.decision,\n };\n}\n\nfunction createCacheProofRejectedTraceFields(\n traceFields: NavigationTraceFields,\n decision: RejectedCacheEntryReuseDecision | null,\n): NavigationTraceFields {\n if (decision === null) {\n return {\n ...traceFields,\n cacheProofCode: CACHE_ENTRY_PROOF_MISSING_CODE,\n };\n }\n\n return {\n ...traceFields,\n cacheProofCode: decision.code,\n cacheProofMode: decision.mode,\n cacheProofScope: decision.scope,\n };\n}\n\nfunction createCacheProofRejectedDecision(options: {\n event: Extract<NavigationEvent, { kind: \"flightResponseArrived\" }>;\n rejection: Extract<CacheEntryProofEvaluation, { kind: \"rejected\" }>;\n traceFields: NavigationTraceFields;\n}): NavigationDecisionV0 {\n return {\n kind: \"hardNavigate\",\n reason: \"cacheProofRejected\",\n token: options.event.token,\n trace: createNavigationTrace(\n NavigationTraceReasonCodes.cacheProofRejected,\n createCacheProofRejectedTraceFields(options.traceFields, options.rejection.decision),\n ),\n url: options.event.result.href,\n };\n}\n\nfunction createAcceptedCacheProofTraceFields(\n traceFields: NavigationTraceFields,\n decision: AcceptedCacheEntryReuseDecision | null,\n): NavigationTraceFields {\n if (decision === null) return traceFields;\n return {\n ...traceFields,\n cacheProofCode: decision.code,\n cacheProofReuseClass: decision.reuseClass,\n };\n}\n\nfunction createCacheEntryProposalFields(\n decision: AcceptedCacheEntryReuseDecision | null,\n): Pick<CommitProposal, \"cacheEntryReuseDecision\"> {\n if (decision === null) return {};\n return {\n cacheEntryReuseDecision: decision,\n };\n}\n\nfunction validateInterceptedPreservation(options: {\n currentSnapshot: RouteSnapshotV0;\n currentTopology: RouteTopologySnapshot;\n routeManifest: RouteManifest | null;\n targetSnapshot: RouteSnapshotV0;\n targetTopology: RouteTopologySnapshot;\n}): InterceptedPreservationValidation {\n const proof = options.targetSnapshot.interception;\n if (!proof) {\n return {\n kind: \"rejected\",\n reasonCode: NavigationTraceReasonCodes.interceptedRejectedMissingProof,\n };\n }\n\n if (proof.targetMatchedUrl !== options.targetSnapshot.matchedUrl) {\n return {\n kind: \"rejected\",\n reasonCode: NavigationTraceReasonCodes.interceptedRejectedTargetMismatch,\n };\n }\n\n const sourceIdentity = getVisibleInterceptionSourceIdentity(options.currentSnapshot);\n if (\n proof.sourceMatchedUrl !== sourceIdentity.matchedUrl ||\n proof.sourceRouteId !== sourceIdentity.routeId\n ) {\n return {\n kind: \"rejected\",\n reasonCode: NavigationTraceReasonCodes.interceptedRejectedUnknownSource,\n };\n }\n\n const declaredInterception =\n options.routeManifest === null\n ? null\n : findRouteManifestInterceptionForProof(options.routeManifest, proof);\n if (options.routeManifest !== null && declaredInterception === null) {\n return {\n kind: \"rejected\",\n reasonCode: NavigationTraceReasonCodes.interceptedRejectedUndeclaredTopology,\n };\n }\n\n const preservedLayoutIds = resolveSameLayoutAncestorPersistenceForTopologies(\n options.currentTopology,\n options.targetTopology,\n );\n if (preservedLayoutIds.length === 0) {\n return {\n kind: \"rejected\",\n reasonCode: NavigationTraceReasonCodes.interceptedRejectedIncompatibleRoot,\n };\n }\n\n const preservedLayoutIdSet = new Set(preservedLayoutIds);\n const targetSlotBinding = options.targetTopology.slotBindings.find(\n (binding) => binding.slotId === proof.slotId,\n );\n if (\n !targetSlotBinding ||\n targetSlotBinding.state !== \"active\" ||\n targetSlotBinding.ownerLayoutId === null ||\n !preservedLayoutIdSet.has(targetSlotBinding.ownerLayoutId)\n ) {\n return {\n kind: \"rejected\",\n reasonCode: NavigationTraceReasonCodes.interceptedRejectedMissingSlotProof,\n };\n }\n if (\n declaredInterception !== null &&\n targetSlotBinding.ownerLayoutId !== declaredInterception.ownerLayoutId\n ) {\n return {\n kind: \"rejected\",\n reasonCode: NavigationTraceReasonCodes.interceptedRejectedUndeclaredTopology,\n };\n }\n\n const preservePreviousSlotIds = resolveDefaultOrUnmatchedSlotPersistenceForLayouts({\n currentSlotBindings: options.currentTopology.slotBindings,\n preservedLayoutIds,\n targetSlotBindings: options.targetTopology.slotBindings,\n }).filter((slotId) => slotId !== proof.slotId);\n\n return {\n kind: \"approved\",\n preserveElementIds: preservedLayoutIds,\n preservePreviousSlotIds,\n };\n}\n\nfunction planFlightResponseArrived(options: {\n event: Extract<NavigationEvent, { kind: \"flightResponseArrived\" }>;\n routeManifest: RouteManifest | null;\n state: NavigationPlannerStateV0;\n}): NavigationDecisionV0 {\n const targetSnapshot = options.event.result.targetSnapshot;\n const currentTopology = resolveRouteTopologySnapshot({\n routeManifest: options.routeManifest,\n slotBindingSource: \"snapshot\",\n snapshot: options.state.visibleSnapshot,\n });\n const targetTopology = resolveRouteTopologySnapshot({\n routeManifest: options.routeManifest,\n slotBindingSource: \"manifestTarget\",\n snapshot: targetSnapshot,\n });\n const traceFields = createRootBoundaryTraceFields({\n currentRootLayoutTreePath:\n currentTopology.kind === \"known\" ? currentTopology.topology.rootLayoutTreePath : null,\n event: options.event,\n nextRootLayoutTreePath:\n targetTopology.kind === \"known\" ? targetTopology.topology.rootLayoutTreePath : null,\n state: options.state,\n });\n\n if (options.event.token.lane === \"prefetch\") {\n return {\n kind: \"noCommit\",\n reason: \"prefetchOnly\",\n token: options.event.token,\n trace: createNavigationTrace(NavigationTraceReasonCodes.prefetchOnly, traceFields),\n };\n }\n\n const cacheEntryProofEvaluation = evaluateCacheEntryReuseProof(\n options.event.result.cacheEntryReuseProof,\n );\n if (cacheEntryProofEvaluation.kind === \"rejected\") {\n return createCacheProofRejectedDecision({\n event: options.event,\n rejection: cacheEntryProofEvaluation,\n traceFields,\n });\n }\n const acceptedCacheEntryDecision = cacheEntryProofEvaluation.decision;\n const commitTraceFields = createAcceptedCacheProofTraceFields(\n traceFields,\n acceptedCacheEntryDecision,\n );\n const cacheEntryProposalFields = createCacheEntryProposalFields(acceptedCacheEntryDecision);\n\n // interceptionContext is transport evidence, not authority. Normal payloads\n // can carry it when a request was sent from an intercepted visible world, so\n // only explicit __interception proof enters the preservation branch.\n const hasInterceptedPayload = targetSnapshot.interception !== null;\n if (hasInterceptedPayload) {\n if (currentTopology.kind === \"unknown\" || targetTopology.kind === \"unknown\") {\n return createInterceptionProofRejectedDecision({\n event: options.event,\n reasonCode: NavigationTraceReasonCodes.interceptedRejectedUndeclaredTopology,\n traceFields: commitTraceFields,\n });\n }\n\n const validation = validateInterceptedPreservation({\n currentSnapshot: options.state.visibleSnapshot,\n currentTopology: currentTopology.topology,\n routeManifest: options.routeManifest,\n targetSnapshot,\n targetTopology: targetTopology.topology,\n });\n if (validation.kind === \"rejected\") {\n return createInterceptionProofRejectedDecision({\n event: options.event,\n reasonCode: validation.reasonCode,\n traceFields: commitTraceFields,\n });\n }\n\n return {\n kind: \"proposeCommit\",\n proposal: {\n ...cacheEntryProposalFields,\n preserveAbsentSlots: false,\n preserveElementIds: validation.preserveElementIds,\n preservePreviousSlotIds: validation.preservePreviousSlotIds,\n reason: \"interceptedCurrentRootBoundary\",\n targetSnapshot,\n },\n token: options.event.token,\n trace: createNavigationTrace(\n NavigationTraceReasonCodes.interceptedCommitCurrent,\n commitTraceFields,\n ),\n };\n }\n\n const transition =\n currentTopology.kind === \"unknown\" || targetTopology.kind === \"unknown\"\n ? \"rootBoundaryUnknown\"\n : classifyRootBoundaryTransition(\n currentTopology.topology.rootBoundaryId,\n targetTopology.topology.rootBoundaryId,\n );\n\n if (transition === \"rootBoundaryChanged\") {\n return {\n kind: \"hardNavigate\",\n reason: \"rootBoundaryChanged\",\n token: options.event.token,\n trace: createNavigationTrace(\n NavigationTraceReasonCodes.rootBoundaryChanged,\n commitTraceFields,\n ),\n url: options.event.result.href,\n };\n }\n\n if (transition === \"rootBoundaryUnknown\") {\n // Unknown topology is not semantic proof. The event may still commit its\n // fully supplied payload, but it must not preserve absent slots, layouts,\n // or previous slot content from snapshot-derived route shape.\n return {\n kind: \"proposeCommit\",\n proposal: {\n ...cacheEntryProposalFields,\n preserveAbsentSlots: false,\n preserveElementIds: [],\n preservePreviousSlotIds: [],\n reason: \"unprovenTopologyFallback\",\n targetSnapshot,\n },\n token: options.event.token,\n trace: createNavigationTrace(\n NavigationTraceReasonCodes.rootBoundaryUnknown,\n commitTraceFields,\n ),\n };\n }\n\n if (currentTopology.kind !== \"known\" || targetTopology.kind !== \"known\") {\n throw new Error(\"[vinext] Current-root navigation planning requires manifest topology\");\n }\n\n return {\n kind: \"proposeCommit\",\n proposal: {\n ...cacheEntryProposalFields,\n preserveAbsentSlots: false,\n preserveElementIds: resolveCurrentRootBoundaryCommitElementPersistence({\n currentTopology: currentTopology.topology,\n lane: options.event.token.lane,\n targetTopology: targetTopology.topology,\n }),\n preservePreviousSlotIds: resolveCurrentRootBoundaryCommitSlotPersistence({\n currentTopology: currentTopology.topology,\n lane: options.event.token.lane,\n targetTopology: targetTopology.topology,\n }),\n reason: \"currentRootBoundary\",\n targetSnapshot,\n },\n token: options.event.token,\n trace: createNavigationTrace(NavigationTraceReasonCodes.commitCurrent, commitTraceFields),\n };\n}\n\nfunction planNavigation(input: NavigationPlannerInput): NavigationDecisionV0 {\n switch (input.event.kind) {\n case \"navigate\":\n return createRequestWorkDecision({\n eventKind: input.event.kind,\n state: input.state,\n work: {\n href: input.event.href,\n kind: \"flight\",\n mode: input.event.mode,\n },\n });\n case \"refresh\":\n return createRequestWorkDecision({\n eventKind: input.event.kind,\n state: input.state,\n work: {\n href: input.state.visibleSnapshot.displayUrl,\n kind: \"flight\",\n mode: \"refresh\",\n },\n });\n case \"traverse\":\n return createRequestWorkDecision({\n eventKind: input.event.kind,\n state: input.state,\n work: {\n direction: input.event.direction,\n historyState: input.event.historyState,\n kind: \"traverseFlight\",\n },\n });\n case \"prefetch\":\n return createRequestWorkDecision({\n eventKind: input.event.kind,\n state: input.state,\n work: {\n href: input.event.href,\n kind: \"prefetch\",\n },\n });\n case \"flightResponseArrived\":\n return planFlightResponseArrived({\n event: input.event,\n routeManifest: input.routeManifest,\n state: input.state,\n });\n default: {\n const _exhaustive: never = input.event;\n throw new Error(\"[vinext] Unknown navigation event: \" + String(_exhaustive));\n }\n }\n}\n\nexport const navigationPlanner = {\n classifyRootBoundaryTransition,\n plan: planNavigation,\n resolveCurrentRootBoundaryElementPersistence,\n resolveMountedParallelSlotPersistence,\n resolveSameLayoutAncestorPersistence,\n};\n"],"mappings":"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"}
@@ -2,7 +2,15 @@
2
2
  declare const NAVIGATION_TRACE_SCHEMA_VERSION = 0;
3
3
  type NavigationTraceSchemaVersion = 0;
4
4
  declare const NavigationTraceReasonCodes: {
5
+ cacheProofRejected: "NC_CACHE_REJECT";
5
6
  commitCurrent: "NC_COMMIT";
7
+ interceptedCommitCurrent: "NC_INTERCEPT_COMMIT";
8
+ interceptedRejectedIncompatibleRoot: "NC_INTERCEPT_REJECT_ROOT";
9
+ interceptedRejectedMissingProof: "NC_INTERCEPT_REJECT_MISSING_PROOF";
10
+ interceptedRejectedMissingSlotProof: "NC_INTERCEPT_REJECT_SLOT";
11
+ interceptedRejectedTargetMismatch: "NC_INTERCEPT_REJECT_TARGET";
12
+ interceptedRejectedUndeclaredTopology: "NC_INTERCEPT_REJECT_GRAPH";
13
+ interceptedRejectedUnknownSource: "NC_INTERCEPT_REJECT_SOURCE";
6
14
  prefetchOnly: "NC_PREFETCH_ONLY";
7
15
  requestWork: "NC_REQUEST";
8
16
  rootBoundaryChanged: "NC_ROOT";
@@ -17,7 +25,7 @@ declare const NavigationTraceTransactionCodes: {
17
25
  type NavigationTraceReasonCode = (typeof NavigationTraceReasonCodes)[keyof typeof NavigationTraceReasonCodes];
18
26
  type NavigationTraceTransactionCode = (typeof NavigationTraceTransactionCodes)[keyof typeof NavigationTraceTransactionCodes];
19
27
  type NavigationTraceCode = NavigationTraceReasonCode | NavigationTraceTransactionCode;
20
- type NavigationTraceFieldName = "activeNavigationId" | "currentRootLayoutTreePath" | "currentVisibleCommitVersion" | "nextRootLayoutTreePath" | "eventKind" | "operationLane" | "pendingOperationId" | "startedVisibleCommitVersion" | "startedNavigationId" | "targetHref";
28
+ type NavigationTraceFieldName = "activeNavigationId" | "cacheProofCode" | "cacheProofMode" | "cacheProofReuseClass" | "cacheProofScope" | "currentRootLayoutTreePath" | "currentVisibleCommitVersion" | "nextRootLayoutTreePath" | "eventKind" | "operationLane" | "pendingOperationId" | "startedVisibleCommitVersion" | "startedNavigationId" | "targetHref" | "traverseDirection";
21
29
  type NavigationTraceFieldValue = string | number | boolean | null;
22
30
  type NavigationTraceFields = Readonly<Partial<Record<NavigationTraceFieldName, NavigationTraceFieldValue>>>;
23
31
  type NavigationTraceEntry = Readonly<{
@@ -1,7 +1,15 @@
1
1
  //#region src/server/navigation-trace.ts
2
2
  const NAVIGATION_TRACE_SCHEMA_VERSION = 0;
3
3
  const NavigationTraceReasonCodes = {
4
+ cacheProofRejected: "NC_CACHE_REJECT",
4
5
  commitCurrent: "NC_COMMIT",
6
+ interceptedCommitCurrent: "NC_INTERCEPT_COMMIT",
7
+ interceptedRejectedIncompatibleRoot: "NC_INTERCEPT_REJECT_ROOT",
8
+ interceptedRejectedMissingProof: "NC_INTERCEPT_REJECT_MISSING_PROOF",
9
+ interceptedRejectedMissingSlotProof: "NC_INTERCEPT_REJECT_SLOT",
10
+ interceptedRejectedTargetMismatch: "NC_INTERCEPT_REJECT_TARGET",
11
+ interceptedRejectedUndeclaredTopology: "NC_INTERCEPT_REJECT_GRAPH",
12
+ interceptedRejectedUnknownSource: "NC_INTERCEPT_REJECT_SOURCE",
5
13
  prefetchOnly: "NC_PREFETCH_ONLY",
6
14
  requestWork: "NC_REQUEST",
7
15
  rootBoundaryChanged: "NC_ROOT",