vinext 0.0.49 → 0.0.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/dist/build/client-build-config.js.map +1 -1
  2. package/dist/build/google-fonts/build-url.js.map +1 -1
  3. package/dist/build/google-fonts/fallback-metrics-data.js +14031 -0
  4. package/dist/build/google-fonts/fallback-metrics-data.js.map +1 -0
  5. package/dist/build/google-fonts/fallback-metrics.d.ts +13 -0
  6. package/dist/build/google-fonts/fallback-metrics.js +46 -0
  7. package/dist/build/google-fonts/fallback-metrics.js.map +1 -0
  8. package/dist/build/google-fonts/get-axes.js.map +1 -1
  9. package/dist/build/google-fonts/sort-variants.js.map +1 -1
  10. package/dist/build/google-fonts/validate.js.map +1 -1
  11. package/dist/build/layout-classification.js.map +1 -1
  12. package/dist/build/nitro-route-rules.js.map +1 -1
  13. package/dist/build/precompress.d.ts +13 -2
  14. package/dist/build/precompress.js +12 -3
  15. package/dist/build/precompress.js.map +1 -1
  16. package/dist/build/prerender.d.ts +17 -1
  17. package/dist/build/prerender.js +114 -23
  18. package/dist/build/prerender.js.map +1 -1
  19. package/dist/build/report.d.ts +5 -4
  20. package/dist/build/report.js +196 -348
  21. package/dist/build/report.js.map +1 -1
  22. package/dist/build/route-classification-injector.js.map +1 -1
  23. package/dist/build/route-classification-manifest.js.map +1 -1
  24. package/dist/build/run-prerender.js.map +1 -1
  25. package/dist/build/server-manifest.js.map +1 -1
  26. package/dist/build/ssr-manifest.js.map +1 -1
  27. package/dist/build/standalone.js.map +1 -1
  28. package/dist/build/static-export.js.map +1 -1
  29. package/dist/check.js +2 -1
  30. package/dist/check.js.map +1 -1
  31. package/dist/cli-args.js.map +1 -1
  32. package/dist/cli.js +68 -7
  33. package/dist/cli.js.map +1 -1
  34. package/dist/client/instrumentation-client-state.js.map +1 -1
  35. package/dist/client/validate-module-path.js.map +1 -1
  36. package/dist/client/vinext-next-data.d.ts +5 -1
  37. package/dist/client/window-next.d.ts +151 -0
  38. package/dist/client/window-next.js +48 -0
  39. package/dist/client/window-next.js.map +1 -0
  40. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  41. package/dist/cloudflare/tpr.js +2 -1
  42. package/dist/cloudflare/tpr.js.map +1 -1
  43. package/dist/config/config-matchers.d.ts +3 -1
  44. package/dist/config/config-matchers.js +5 -4
  45. package/dist/config/config-matchers.js.map +1 -1
  46. package/dist/config/dotenv.d.ts +11 -1
  47. package/dist/config/dotenv.js.map +1 -1
  48. package/dist/config/next-config.d.ts +93 -6
  49. package/dist/config/next-config.js +233 -6
  50. package/dist/config/next-config.js.map +1 -1
  51. package/dist/config/tsconfig-paths.d.ts +13 -0
  52. package/dist/config/tsconfig-paths.js +117 -0
  53. package/dist/config/tsconfig-paths.js.map +1 -0
  54. package/dist/deploy.js +16 -7
  55. package/dist/deploy.js.map +1 -1
  56. package/dist/entries/app-browser-entry.d.ts +3 -1
  57. package/dist/entries/app-browser-entry.js +36 -2
  58. package/dist/entries/app-browser-entry.js.map +1 -1
  59. package/dist/entries/app-rsc-entry.d.ts +19 -1
  60. package/dist/entries/app-rsc-entry.js +49 -12
  61. package/dist/entries/app-rsc-entry.js.map +1 -1
  62. package/dist/entries/app-rsc-manifest.d.ts +9 -0
  63. package/dist/entries/app-rsc-manifest.js +8 -1
  64. package/dist/entries/app-rsc-manifest.js.map +1 -1
  65. package/dist/entries/app-ssr-entry.js.map +1 -1
  66. package/dist/entries/pages-client-entry.js +3 -5
  67. package/dist/entries/pages-client-entry.js.map +1 -1
  68. package/dist/entries/pages-entry-helpers.js.map +1 -1
  69. package/dist/entries/pages-server-entry.js +34 -1
  70. package/dist/entries/pages-server-entry.js.map +1 -1
  71. package/dist/entries/runtime-entry-module.js.map +1 -1
  72. package/dist/index.js +204 -53
  73. package/dist/index.js.map +1 -1
  74. package/dist/init.js.map +1 -1
  75. package/dist/plugins/async-hooks-stub.js.map +1 -1
  76. package/dist/plugins/client-reference-dedup.d.ts +15 -2
  77. package/dist/plugins/client-reference-dedup.js +138 -16
  78. package/dist/plugins/client-reference-dedup.js.map +1 -1
  79. package/dist/plugins/fonts.d.ts +2 -2
  80. package/dist/plugins/fonts.js +15 -6
  81. package/dist/plugins/fonts.js.map +1 -1
  82. package/dist/plugins/instrumentation-client.js.map +1 -1
  83. package/dist/plugins/og-assets.js.map +1 -1
  84. package/dist/plugins/optimize-imports.js.map +1 -1
  85. package/dist/plugins/postcss.js.map +1 -1
  86. package/dist/plugins/rsc-client-reference-loaders.d.ts +7 -0
  87. package/dist/plugins/rsc-client-reference-loaders.js +48 -0
  88. package/dist/plugins/rsc-client-reference-loaders.js.map +1 -0
  89. package/dist/plugins/rsc-client-shim-excludes.js.map +1 -1
  90. package/dist/plugins/sass.d.ts +34 -0
  91. package/dist/plugins/sass.js +22 -0
  92. package/dist/plugins/sass.js.map +1 -0
  93. package/dist/plugins/server-externals-manifest.js.map +1 -1
  94. package/dist/plugins/strip-server-exports.js.map +1 -1
  95. package/dist/routing/app-route-graph.d.ts +78 -6
  96. package/dist/routing/app-route-graph.js +241 -25
  97. package/dist/routing/app-route-graph.js.map +1 -1
  98. package/dist/routing/app-router.js.map +1 -1
  99. package/dist/routing/file-matcher.js.map +1 -1
  100. package/dist/routing/pages-router.js.map +1 -1
  101. package/dist/routing/route-matching.js.map +1 -1
  102. package/dist/routing/route-pattern.d.ts +56 -1
  103. package/dist/routing/route-pattern.js +60 -1
  104. package/dist/routing/route-pattern.js.map +1 -1
  105. package/dist/routing/route-trie.js.map +1 -1
  106. package/dist/routing/route-validation.js.map +1 -1
  107. package/dist/routing/utils.js.map +1 -1
  108. package/dist/server/api-handler.js.map +1 -1
  109. package/dist/server/app-browser-action-result.d.ts +44 -0
  110. package/dist/server/app-browser-action-result.js +79 -0
  111. package/dist/server/app-browser-action-result.js.map +1 -0
  112. package/dist/server/app-browser-entry.js +330 -133
  113. package/dist/server/app-browser-entry.js.map +1 -1
  114. package/dist/server/app-browser-error.js.map +1 -1
  115. package/dist/server/app-browser-hydration.d.ts +31 -0
  116. package/dist/server/app-browser-hydration.js +30 -0
  117. package/dist/server/app-browser-hydration.js.map +1 -0
  118. package/dist/server/app-browser-navigation-controller.d.ts +20 -4
  119. package/dist/server/app-browser-navigation-controller.js +90 -23
  120. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  121. package/dist/server/app-browser-popstate.d.ts +16 -0
  122. package/dist/server/app-browser-popstate.js +17 -0
  123. package/dist/server/app-browser-popstate.js.map +1 -0
  124. package/dist/server/app-browser-rsc-redirect.d.ts +28 -0
  125. package/dist/server/app-browser-rsc-redirect.js +37 -0
  126. package/dist/server/app-browser-rsc-redirect.js.map +1 -0
  127. package/dist/server/app-browser-state.d.ts +27 -23
  128. package/dist/server/app-browser-state.js +158 -54
  129. package/dist/server/app-browser-state.js.map +1 -1
  130. package/dist/server/app-browser-stream.d.ts +9 -4
  131. package/dist/server/app-browser-stream.js +29 -8
  132. package/dist/server/app-browser-stream.js.map +1 -1
  133. package/dist/server/app-browser-visible-commit.d.ts +11 -1
  134. package/dist/server/app-browser-visible-commit.js +69 -21
  135. package/dist/server/app-browser-visible-commit.js.map +1 -1
  136. package/dist/server/app-client-reference-preloader.js.map +1 -1
  137. package/dist/server/app-elements-wire.d.ts +43 -6
  138. package/dist/server/app-elements-wire.js +121 -5
  139. package/dist/server/app-elements-wire.js.map +1 -1
  140. package/dist/server/app-elements.d.ts +2 -2
  141. package/dist/server/app-elements.js +2 -2
  142. package/dist/server/app-elements.js.map +1 -1
  143. package/dist/server/app-fallback-renderer.d.ts +10 -1
  144. package/dist/server/app-fallback-renderer.js +37 -1
  145. package/dist/server/app-fallback-renderer.js.map +1 -1
  146. package/dist/server/app-history-state.d.ts +26 -0
  147. package/dist/server/app-history-state.js +53 -0
  148. package/dist/server/app-history-state.js.map +1 -0
  149. package/dist/server/app-hook-warning-suppression.js.map +1 -1
  150. package/dist/server/app-middleware.d.ts +1 -1
  151. package/dist/server/app-middleware.js +4 -9
  152. package/dist/server/app-middleware.js.map +1 -1
  153. package/dist/server/app-mounted-slots-header.js.map +1 -1
  154. package/dist/server/app-page-boundary-render.d.ts +11 -1
  155. package/dist/server/app-page-boundary-render.js +27 -19
  156. package/dist/server/app-page-boundary-render.js.map +1 -1
  157. package/dist/server/app-page-boundary.d.ts +1 -0
  158. package/dist/server/app-page-boundary.js +10 -7
  159. package/dist/server/app-page-boundary.js.map +1 -1
  160. package/dist/server/app-page-cache.d.ts +23 -3
  161. package/dist/server/app-page-cache.js +63 -27
  162. package/dist/server/app-page-cache.js.map +1 -1
  163. package/dist/server/app-page-dispatch.d.ts +11 -1
  164. package/dist/server/app-page-dispatch.js +85 -14
  165. package/dist/server/app-page-dispatch.js.map +1 -1
  166. package/dist/server/app-page-element-builder.d.ts +10 -1
  167. package/dist/server/app-page-element-builder.js +38 -6
  168. package/dist/server/app-page-element-builder.js.map +1 -1
  169. package/dist/server/app-page-execution.js +2 -3
  170. package/dist/server/app-page-execution.js.map +1 -1
  171. package/dist/server/app-page-head.d.ts +7 -0
  172. package/dist/server/app-page-head.js +6 -1
  173. package/dist/server/app-page-head.js.map +1 -1
  174. package/dist/server/app-page-method.js.map +1 -1
  175. package/dist/server/app-page-params.js.map +1 -1
  176. package/dist/server/app-page-probe.d.ts +23 -1
  177. package/dist/server/app-page-probe.js +29 -1
  178. package/dist/server/app-page-probe.js.map +1 -1
  179. package/dist/server/app-page-render-observation.d.ts +35 -0
  180. package/dist/server/app-page-render-observation.js +68 -0
  181. package/dist/server/app-page-render-observation.js.map +1 -0
  182. package/dist/server/app-page-render.d.ts +12 -2
  183. package/dist/server/app-page-render.js +90 -7
  184. package/dist/server/app-page-render.js.map +1 -1
  185. package/dist/server/app-page-request.d.ts +1 -0
  186. package/dist/server/app-page-request.js +2 -1
  187. package/dist/server/app-page-request.js.map +1 -1
  188. package/dist/server/app-page-response.d.ts +2 -0
  189. package/dist/server/app-page-response.js +18 -7
  190. package/dist/server/app-page-response.js.map +1 -1
  191. package/dist/server/app-page-route-wiring.d.ts +9 -3
  192. package/dist/server/app-page-route-wiring.js +91 -62
  193. package/dist/server/app-page-route-wiring.js.map +1 -1
  194. package/dist/server/app-page-segment-state.d.ts +10 -0
  195. package/dist/server/app-page-segment-state.js +87 -0
  196. package/dist/server/app-page-segment-state.js.map +1 -0
  197. package/dist/server/app-page-stream.d.ts +9 -2
  198. package/dist/server/app-page-stream.js +4 -1
  199. package/dist/server/app-page-stream.js.map +1 -1
  200. package/dist/server/app-post-middleware-context.js.map +1 -1
  201. package/dist/server/app-prerender-endpoints.js.map +1 -1
  202. package/dist/server/app-prerender-static-params.js.map +1 -1
  203. package/dist/server/app-render-dependency.js.map +1 -1
  204. package/dist/server/app-request-context.js.map +1 -1
  205. package/dist/server/app-route-handler-cache.js.map +1 -1
  206. package/dist/server/app-route-handler-dispatch.js +3 -1
  207. package/dist/server/app-route-handler-dispatch.js.map +1 -1
  208. package/dist/server/app-route-handler-execution.js.map +1 -1
  209. package/dist/server/app-route-handler-policy.js +1 -0
  210. package/dist/server/app-route-handler-policy.js.map +1 -1
  211. package/dist/server/app-route-handler-response.js +4 -3
  212. package/dist/server/app-route-handler-response.js.map +1 -1
  213. package/dist/server/app-route-handler-runtime.js.map +1 -1
  214. package/dist/server/app-router-entry.js +7 -15
  215. package/dist/server/app-router-entry.js.map +1 -1
  216. package/dist/server/app-rsc-cache-busting.d.ts +23 -2
  217. package/dist/server/app-rsc-cache-busting.js +75 -19
  218. package/dist/server/app-rsc-cache-busting.js.map +1 -1
  219. package/dist/server/app-rsc-embedded-chunks.d.ts +9 -0
  220. package/dist/server/app-rsc-embedded-chunks.js +34 -0
  221. package/dist/server/app-rsc-embedded-chunks.js.map +1 -0
  222. package/dist/server/app-rsc-error-handler.js.map +1 -1
  223. package/dist/server/app-rsc-errors.d.ts +4 -1
  224. package/dist/server/app-rsc-errors.js +1 -1
  225. package/dist/server/app-rsc-errors.js.map +1 -1
  226. package/dist/server/app-rsc-handler.d.ts +18 -1
  227. package/dist/server/app-rsc-handler.js +55 -16
  228. package/dist/server/app-rsc-handler.js.map +1 -1
  229. package/dist/server/app-rsc-render-mode.d.ts +11 -0
  230. package/dist/server/app-rsc-render-mode.js +21 -0
  231. package/dist/server/app-rsc-render-mode.js.map +1 -0
  232. package/dist/server/app-rsc-request-normalization.d.ts +4 -1
  233. package/dist/server/app-rsc-request-normalization.js +7 -2
  234. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  235. package/dist/server/app-rsc-response-finalizer.d.ts +2 -1
  236. package/dist/server/app-rsc-response-finalizer.js +6 -1
  237. package/dist/server/app-rsc-response-finalizer.js.map +1 -1
  238. package/dist/server/app-rsc-route-matching.d.ts +23 -0
  239. package/dist/server/app-rsc-route-matching.js +45 -23
  240. package/dist/server/app-rsc-route-matching.js.map +1 -1
  241. package/dist/server/app-segment-config.js.map +1 -1
  242. package/dist/server/app-server-action-execution.d.ts +51 -5
  243. package/dist/server/app-server-action-execution.js +161 -51
  244. package/dist/server/app-server-action-execution.js.map +1 -1
  245. package/dist/server/app-ssr-entry.d.ts +7 -0
  246. package/dist/server/app-ssr-entry.js +44 -14
  247. package/dist/server/app-ssr-entry.js.map +1 -1
  248. package/dist/server/app-ssr-error-meta.d.ts +14 -0
  249. package/dist/server/app-ssr-error-meta.js +50 -0
  250. package/dist/server/app-ssr-error-meta.js.map +1 -0
  251. package/dist/server/app-ssr-stream.d.ts +1 -1
  252. package/dist/server/app-ssr-stream.js +9 -12
  253. package/dist/server/app-ssr-stream.js.map +1 -1
  254. package/dist/server/app-static-generation.js.map +1 -1
  255. package/dist/server/artifact-compatibility.d.ts +12 -2
  256. package/dist/server/artifact-compatibility.js +12 -8
  257. package/dist/server/artifact-compatibility.js.map +1 -1
  258. package/dist/server/cache-control.js +1 -0
  259. package/dist/server/cache-control.js.map +1 -1
  260. package/dist/server/cache-proof.d.ts +124 -5
  261. package/dist/server/cache-proof.js +416 -18
  262. package/dist/server/cache-proof.js.map +1 -1
  263. package/dist/server/csp.js.map +1 -1
  264. package/dist/server/dev-error-overlay-store.js.map +1 -1
  265. package/dist/server/dev-error-overlay.js +5 -0
  266. package/dist/server/dev-error-overlay.js.map +1 -1
  267. package/dist/server/dev-lockfile.d.ts +110 -0
  268. package/dist/server/dev-lockfile.js +180 -0
  269. package/dist/server/dev-lockfile.js.map +1 -0
  270. package/dist/server/dev-module-runner.js.map +1 -1
  271. package/dist/server/dev-origin-check.js.map +1 -1
  272. package/dist/server/dev-route-files.js.map +1 -1
  273. package/dist/server/dev-server.js +23 -10
  274. package/dist/server/dev-server.js.map +1 -1
  275. package/dist/server/file-based-metadata.d.ts +13 -0
  276. package/dist/server/file-based-metadata.js +49 -2
  277. package/dist/server/file-based-metadata.js.map +1 -1
  278. package/dist/server/headers.d.ts +81 -0
  279. package/dist/server/headers.js +104 -0
  280. package/dist/server/headers.js.map +1 -0
  281. package/dist/server/html.js +1 -1
  282. package/dist/server/html.js.map +1 -1
  283. package/dist/server/http-error-responses.d.ts +10 -0
  284. package/dist/server/http-error-responses.js +11 -1
  285. package/dist/server/http-error-responses.js.map +1 -1
  286. package/dist/server/image-optimization.d.ts +11 -1
  287. package/dist/server/image-optimization.js.map +1 -1
  288. package/dist/server/implicit-tags.js +2 -1
  289. package/dist/server/implicit-tags.js.map +1 -1
  290. package/dist/server/instrumentation-runtime.js.map +1 -1
  291. package/dist/server/instrumentation.js.map +1 -1
  292. package/dist/server/isr-cache.d.ts +12 -2
  293. package/dist/server/isr-cache.js +16 -5
  294. package/dist/server/isr-cache.js.map +1 -1
  295. package/dist/server/metadata-route-build-data.js.map +1 -1
  296. package/dist/server/metadata-route-response.js +22 -5
  297. package/dist/server/metadata-route-response.js.map +1 -1
  298. package/dist/server/metadata-routes.js +27 -8
  299. package/dist/server/metadata-routes.js.map +1 -1
  300. package/dist/server/middleware-matcher.js.map +1 -1
  301. package/dist/server/middleware-request-headers.d.ts +4 -1
  302. package/dist/server/middleware-request-headers.js +15 -8
  303. package/dist/server/middleware-request-headers.js.map +1 -1
  304. package/dist/server/middleware-response-headers.d.ts +2 -1
  305. package/dist/server/middleware-response-headers.js +1 -1
  306. package/dist/server/middleware-response-headers.js.map +1 -1
  307. package/dist/server/middleware-runtime.d.ts +1 -0
  308. package/dist/server/middleware-runtime.js +7 -3
  309. package/dist/server/middleware-runtime.js.map +1 -1
  310. package/dist/server/middleware.d.ts +12 -0
  311. package/dist/server/middleware.js +12 -0
  312. package/dist/server/middleware.js.map +1 -1
  313. package/dist/server/navigation-planner.d.ts +133 -0
  314. package/dist/server/navigation-planner.js +432 -0
  315. package/dist/server/navigation-planner.js.map +1 -0
  316. package/dist/server/navigation-trace.d.ts +19 -2
  317. package/dist/server/navigation-trace.js +20 -1
  318. package/dist/server/navigation-trace.js.map +1 -1
  319. package/dist/server/next-error-digest.d.ts +3 -2
  320. package/dist/server/next-error-digest.js +4 -2
  321. package/dist/server/next-error-digest.js.map +1 -1
  322. package/dist/server/normalize-path.d.ts +2 -1
  323. package/dist/server/normalize-path.js +4 -1
  324. package/dist/server/normalize-path.js.map +1 -1
  325. package/dist/server/pages-api-route.js +1 -0
  326. package/dist/server/pages-api-route.js.map +1 -1
  327. package/dist/server/pages-i18n.js.map +1 -1
  328. package/dist/server/pages-media-type.js.map +1 -1
  329. package/dist/server/pages-node-compat.js.map +1 -1
  330. package/dist/server/pages-page-data.d.ts +3 -2
  331. package/dist/server/pages-page-data.js +27 -5
  332. package/dist/server/pages-page-data.js.map +1 -1
  333. package/dist/server/pages-page-response.js +2 -1
  334. package/dist/server/pages-page-response.js.map +1 -1
  335. package/dist/server/prerender-work-unit-setup.js +1 -1
  336. package/dist/server/prerender-work-unit-setup.js.map +1 -1
  337. package/dist/server/prod-server.d.ts +28 -1
  338. package/dist/server/prod-server.js +97 -22
  339. package/dist/server/prod-server.js.map +1 -1
  340. package/dist/server/request-log.js.map +1 -1
  341. package/dist/server/request-pipeline.d.ts +1 -13
  342. package/dist/server/request-pipeline.js +3 -25
  343. package/dist/server/request-pipeline.js.map +1 -1
  344. package/dist/server/rsc-stream-hints.js.map +1 -1
  345. package/dist/server/seed-cache.js.map +1 -1
  346. package/dist/server/server-action-not-found.d.ts +16 -3
  347. package/dist/server/server-action-not-found.js +22 -4
  348. package/dist/server/server-action-not-found.js.map +1 -1
  349. package/dist/server/server-globals.d.ts +5 -0
  350. package/dist/server/server-globals.js +37 -0
  351. package/dist/server/server-globals.js.map +1 -0
  352. package/dist/server/socket-error-backstop.js.map +1 -1
  353. package/dist/server/static-file-cache.js +1 -1
  354. package/dist/server/static-file-cache.js.map +1 -1
  355. package/dist/server/worker-utils.d.ts +0 -7
  356. package/dist/server/worker-utils.js +3 -2
  357. package/dist/server/worker-utils.js.map +1 -1
  358. package/dist/shims/amp.js.map +1 -1
  359. package/dist/shims/app.d.ts +37 -4
  360. package/dist/shims/app.js +50 -1
  361. package/dist/shims/app.js.map +1 -0
  362. package/dist/shims/cache-for-request.js.map +1 -1
  363. package/dist/shims/cache-runtime.d.ts +19 -2
  364. package/dist/shims/cache-runtime.js +87 -19
  365. package/dist/shims/cache-runtime.js.map +1 -1
  366. package/dist/shims/cache.d.ts +20 -21
  367. package/dist/shims/cache.js +101 -15
  368. package/dist/shims/cache.js.map +1 -1
  369. package/dist/shims/client-hook-error.js.map +1 -1
  370. package/dist/shims/compat-router.js.map +1 -1
  371. package/dist/shims/config.js.map +1 -1
  372. package/dist/shims/constants.js.map +1 -1
  373. package/dist/shims/document.js.map +1 -1
  374. package/dist/shims/dynamic.d.ts +18 -10
  375. package/dist/shims/dynamic.js +107 -51
  376. package/dist/shims/dynamic.js.map +1 -1
  377. package/dist/shims/error-boundary.d.ts +35 -6
  378. package/dist/shims/error-boundary.js +116 -33
  379. package/dist/shims/error-boundary.js.map +1 -1
  380. package/dist/shims/error.d.ts +18 -1
  381. package/dist/shims/error.js +56 -1
  382. package/dist/shims/error.js.map +1 -1
  383. package/dist/shims/fetch-cache.d.ts +25 -1
  384. package/dist/shims/fetch-cache.js +159 -13
  385. package/dist/shims/fetch-cache.js.map +1 -1
  386. package/dist/shims/font-google-base.d.ts +22 -8
  387. package/dist/shims/font-google-base.js +41 -71
  388. package/dist/shims/font-google-base.js.map +1 -1
  389. package/dist/shims/font-local.d.ts +3 -20
  390. package/dist/shims/font-local.js +23 -75
  391. package/dist/shims/font-local.js.map +1 -1
  392. package/dist/shims/font-utils.d.ts +51 -0
  393. package/dist/shims/font-utils.js +97 -0
  394. package/dist/shims/font-utils.js.map +1 -0
  395. package/dist/shims/form.js +3 -1
  396. package/dist/shims/form.js.map +1 -1
  397. package/dist/shims/hash-scroll.d.ts +7 -0
  398. package/dist/shims/hash-scroll.js +30 -0
  399. package/dist/shims/hash-scroll.js.map +1 -0
  400. package/dist/shims/head-state.js.map +1 -1
  401. package/dist/shims/head.d.ts +3 -1
  402. package/dist/shims/head.js +28 -16
  403. package/dist/shims/head.js.map +1 -1
  404. package/dist/shims/headers.d.ts +11 -12
  405. package/dist/shims/headers.js +45 -8
  406. package/dist/shims/headers.js.map +1 -1
  407. package/dist/shims/i18n-context.js.map +1 -1
  408. package/dist/shims/i18n-state.js.map +1 -1
  409. package/dist/shims/image-config.d.ts +14 -1
  410. package/dist/shims/image-config.js +24 -1
  411. package/dist/shims/image-config.js.map +1 -1
  412. package/dist/shims/image.d.ts +1 -0
  413. package/dist/shims/image.js +159 -80
  414. package/dist/shims/image.js.map +1 -1
  415. package/dist/shims/internal/als-registry.js.map +1 -1
  416. package/dist/shims/internal/app-router-context.d.ts +7 -6
  417. package/dist/shims/internal/app-router-context.js +17 -6
  418. package/dist/shims/internal/app-router-context.js.map +1 -1
  419. package/dist/shims/internal/cookie-serialize.js.map +1 -1
  420. package/dist/shims/internal/make-hanging-promise.d.ts +1 -1
  421. package/dist/shims/internal/make-hanging-promise.js +1 -1
  422. package/dist/shims/internal/make-hanging-promise.js.map +1 -1
  423. package/dist/shims/internal/parse-cookie-header.js.map +1 -1
  424. package/dist/shims/internal/utils.js.map +1 -1
  425. package/dist/shims/internal/work-unit-async-storage.js +2 -2
  426. package/dist/shims/internal/work-unit-async-storage.js.map +1 -1
  427. package/dist/shims/layout-segment-context.js.map +1 -1
  428. package/dist/shims/legacy-image.js.map +1 -1
  429. package/dist/shims/link-prefetch.d.ts +42 -0
  430. package/dist/shims/link-prefetch.js +45 -0
  431. package/dist/shims/link-prefetch.js.map +1 -0
  432. package/dist/shims/link.d.ts +37 -4
  433. package/dist/shims/link.js +156 -46
  434. package/dist/shims/link.js.map +1 -1
  435. package/dist/shims/metadata.d.ts +16 -30
  436. package/dist/shims/metadata.js +87 -28
  437. package/dist/shims/metadata.js.map +1 -1
  438. package/dist/shims/navigation-state.js.map +1 -1
  439. package/dist/shims/navigation.d.ts +172 -10
  440. package/dist/shims/navigation.js +335 -70
  441. package/dist/shims/navigation.js.map +1 -1
  442. package/dist/shims/navigation.react-server.d.ts +3 -2
  443. package/dist/shims/navigation.react-server.js +5 -2
  444. package/dist/shims/navigation.react-server.js.map +1 -1
  445. package/dist/shims/offline.js.map +1 -1
  446. package/dist/shims/pages-router-runtime.d.ts +7 -0
  447. package/dist/shims/pages-router-runtime.js +16 -0
  448. package/dist/shims/pages-router-runtime.js.map +1 -0
  449. package/dist/shims/readonly-url-search-params.js.map +1 -1
  450. package/dist/shims/request-context.js.map +1 -1
  451. package/dist/shims/root-params.js.map +1 -1
  452. package/dist/shims/router-state.js.map +1 -1
  453. package/dist/shims/router.d.ts +69 -7
  454. package/dist/shims/router.js +232 -249
  455. package/dist/shims/router.js.map +1 -1
  456. package/dist/shims/script-nonce-context.js.map +1 -1
  457. package/dist/shims/script.js +110 -32
  458. package/dist/shims/script.js.map +1 -1
  459. package/dist/shims/server.js +12 -15
  460. package/dist/shims/server.js.map +1 -1
  461. package/dist/shims/slot.d.ts +7 -1
  462. package/dist/shims/slot.js +60 -7
  463. package/dist/shims/slot.js.map +1 -1
  464. package/dist/shims/thenable-params.js.map +1 -1
  465. package/dist/shims/unified-request-context.js +5 -0
  466. package/dist/shims/unified-request-context.js.map +1 -1
  467. package/dist/shims/unrecognized-action-error.d.ts +35 -0
  468. package/dist/shims/unrecognized-action-error.js +41 -0
  469. package/dist/shims/unrecognized-action-error.js.map +1 -0
  470. package/dist/shims/url-safety.js.map +1 -1
  471. package/dist/shims/url-utils.d.ts +22 -1
  472. package/dist/shims/url-utils.js +76 -3
  473. package/dist/shims/url-utils.js.map +1 -1
  474. package/dist/shims/use-merged-ref.js.map +1 -1
  475. package/dist/shims/web-vitals.d.ts +4 -21
  476. package/dist/shims/web-vitals.js +19 -6
  477. package/dist/shims/web-vitals.js.map +1 -1
  478. package/dist/utils/asset-prefix.d.ts +69 -0
  479. package/dist/utils/asset-prefix.js +91 -0
  480. package/dist/utils/asset-prefix.js.map +1 -0
  481. package/dist/utils/base-path.d.ts +7 -1
  482. package/dist/utils/base-path.js +10 -1
  483. package/dist/utils/base-path.js.map +1 -1
  484. package/dist/utils/cache-control-metadata.js.map +1 -1
  485. package/dist/utils/domain-locale.js.map +1 -1
  486. package/dist/utils/encode-cache-tag.d.ts +31 -0
  487. package/dist/utils/encode-cache-tag.js +38 -0
  488. package/dist/utils/encode-cache-tag.js.map +1 -0
  489. package/dist/utils/error-cause.js.map +1 -1
  490. package/dist/utils/hash.js.map +1 -1
  491. package/dist/utils/lazy-chunks.js.map +1 -1
  492. package/dist/utils/manifest-paths.js.map +1 -1
  493. package/dist/utils/mdx-scan.js.map +1 -1
  494. package/dist/utils/navigation-signal.d.ts +5 -0
  495. package/dist/utils/navigation-signal.js +14 -0
  496. package/dist/utils/navigation-signal.js.map +1 -0
  497. package/dist/utils/project.js.map +1 -1
  498. package/dist/utils/public-routes.js.map +1 -1
  499. package/dist/utils/query.js.map +1 -1
  500. package/dist/utils/safe-json-file.js.map +1 -1
  501. package/dist/utils/sorted-array.d.ts +9 -0
  502. package/dist/utils/sorted-array.js +22 -0
  503. package/dist/utils/sorted-array.js.map +1 -0
  504. package/dist/utils/text-stream.js.map +1 -1
  505. package/dist/utils/vinext-root.js.map +1 -1
  506. package/package.json +8 -6
@@ -0,0 +1,432 @@
1
+ import { normalizePathnameForRouteMatch } 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";
5
+ import { NavigationTraceReasonCodes, createNavigationLifecycleTraceFields, createNavigationTrace } from "./navigation-trace.js";
6
+ //#region src/server/navigation-planner.ts
7
+ const ROUTE_INTERCEPTION_CONTEXT_SEPARATOR = "\0";
8
+ function createRequestWorkDecision(options) {
9
+ const traverseFields = options.work.kind === "traverseFlight" ? { traverseDirection: options.work.direction } : {};
10
+ return {
11
+ kind: "requestWork",
12
+ token: options.state.nextOperationToken,
13
+ work: options.work,
14
+ trace: createNavigationTrace(NavigationTraceReasonCodes.requestWork, {
15
+ eventKind: options.eventKind,
16
+ targetHref: getRequestedWorkTargetHref(options.work),
17
+ ...traverseFields
18
+ })
19
+ };
20
+ }
21
+ function getRequestedWorkTargetHref(work) {
22
+ switch (work.kind) {
23
+ case "flight":
24
+ case "prefetch": return work.href;
25
+ case "traverseFlight": return null;
26
+ default: throw new Error("[vinext] Unknown requested navigation work: " + String(work));
27
+ }
28
+ }
29
+ function createSnapshotRouteTopology(snapshot) {
30
+ return {
31
+ layoutIds: snapshot.layoutIds,
32
+ rootBoundaryId: snapshot.rootBoundaryId,
33
+ rootLayoutTreePath: snapshot.rootBoundaryId,
34
+ slotBindings: snapshot.slotBindings
35
+ };
36
+ }
37
+ function stripInterceptionContextFromRouteId(routeId) {
38
+ const separatorIndex = routeId.indexOf(ROUTE_INTERCEPTION_CONTEXT_SEPARATOR);
39
+ return separatorIndex === -1 ? routeId : routeId.slice(0, separatorIndex);
40
+ }
41
+ function getMatchedUrlPathname(matchedUrl) {
42
+ try {
43
+ return new URL(matchedUrl, "https://vinext.local").pathname;
44
+ } catch {
45
+ const [withoutHash = ""] = matchedUrl.split("#");
46
+ const [pathname = ""] = withoutHash.split("?");
47
+ return pathname === "" ? "/" : pathname;
48
+ }
49
+ }
50
+ function splitMatchedUrlIntoRouteParts(matchedUrl) {
51
+ return normalizePathnameForRouteMatch(getMatchedUrlPathname(matchedUrl)).split("/").filter((part) => part.length > 0);
52
+ }
53
+ function findRouteManifestRouteByMatchedUrl(routeManifest, matchedUrl) {
54
+ const urlParts = splitMatchedUrlIntoRouteParts(matchedUrl);
55
+ for (const route of routeManifest.segmentGraph.routes.values()) if (matchRoutePattern(urlParts, route.patternParts) !== null) return route;
56
+ return null;
57
+ }
58
+ function routeManifestRouteMatchesUrl(route, matchedUrl) {
59
+ return matchRoutePattern(splitMatchedUrlIntoRouteParts(matchedUrl), route.patternParts) !== null;
60
+ }
61
+ function findRouteManifestRouteByIdOrMatchedUrl(options) {
62
+ const routeId = stripInterceptionContextFromRouteId(options.routeId);
63
+ const route = options.routeManifest.segmentGraph.routes.get(routeId);
64
+ if (route && routeManifestRouteMatchesUrl(route, options.matchedUrl)) return route;
65
+ return findRouteManifestRouteByMatchedUrl(options.routeManifest, options.matchedUrl);
66
+ }
67
+ function findRouteManifestRouteForSnapshot(routeManifest, snapshot) {
68
+ if (snapshot.interception !== null) return findRouteManifestRouteByIdOrMatchedUrl({
69
+ matchedUrl: snapshot.interception.sourceMatchedUrl,
70
+ routeId: snapshot.interception.sourceRouteId,
71
+ routeManifest
72
+ });
73
+ return findRouteManifestRouteByIdOrMatchedUrl({
74
+ matchedUrl: snapshot.matchedUrl,
75
+ routeId: snapshot.routeId,
76
+ routeManifest
77
+ });
78
+ }
79
+ function resolveRouteManifestSlotBindings(routeManifest, route) {
80
+ const bindings = [];
81
+ for (const slotId of route.slotIds) {
82
+ const binding = routeManifest.segmentGraph.slotBindings.get(`${route.id}::${slotId}`);
83
+ if (!binding) continue;
84
+ bindings.push({
85
+ ownerLayoutId: binding.ownerLayoutId,
86
+ slotId: binding.slotId,
87
+ state: binding.state
88
+ });
89
+ }
90
+ return bindings.sort((left, right) => compareAppElementsSlotIds(left.slotId, right.slotId));
91
+ }
92
+ function resolveRouteManifestRootLayoutTreePath(routeManifest, route) {
93
+ if (route.rootBoundaryId === null) return null;
94
+ return routeManifest.segmentGraph.rootBoundaries.get(route.rootBoundaryId)?.treePath ?? null;
95
+ }
96
+ function resolveRouteTopologySnapshot(options) {
97
+ const route = options.routeManifest === null ? null : findRouteManifestRouteForSnapshot(options.routeManifest, options.snapshot);
98
+ if (route === null || options.routeManifest === null) return createSnapshotRouteTopology(options.snapshot);
99
+ const shouldUseManifestSlotBindings = options.slotBindingSource === "manifestTarget" && options.snapshot.interception === null;
100
+ return {
101
+ layoutIds: route.layoutIds,
102
+ rootBoundaryId: route.rootBoundaryId,
103
+ rootLayoutTreePath: resolveRouteManifestRootLayoutTreePath(options.routeManifest, route),
104
+ slotBindings: shouldUseManifestSlotBindings ? resolveRouteManifestSlotBindings(options.routeManifest, route) : options.snapshot.slotBindings
105
+ };
106
+ }
107
+ function findRouteManifestInterceptionForProof(routeManifest, proof) {
108
+ const sourceParts = splitMatchedUrlIntoRouteParts(proof.sourceMatchedUrl);
109
+ const targetParts = splitMatchedUrlIntoRouteParts(proof.targetMatchedUrl);
110
+ const targetRoute = findRouteManifestRouteByIdOrMatchedUrl({
111
+ matchedUrl: proof.targetMatchedUrl,
112
+ routeId: proof.targetRouteId,
113
+ routeManifest
114
+ });
115
+ const candidateInterceptions = routeManifest.segmentGraph.interceptionsBySlotId.get(proof.slotId) ?? [];
116
+ for (const interception of candidateInterceptions) {
117
+ if (!matchRoutePatternPrefix(sourceParts, interception.sourcePatternParts)) continue;
118
+ if (matchRoutePattern(targetParts, interception.targetPatternParts) === null) continue;
119
+ if (interception.targetRouteId !== null && targetRoute?.id !== interception.targetRouteId) continue;
120
+ return interception;
121
+ }
122
+ return null;
123
+ }
124
+ function createRootBoundaryTraceFields(options) {
125
+ if (options.state.traceFields) return {
126
+ ...options.state.traceFields,
127
+ currentRootLayoutTreePath: options.currentRootLayoutTreePath,
128
+ nextRootLayoutTreePath: options.nextRootLayoutTreePath
129
+ };
130
+ return createNavigationLifecycleTraceFields({
131
+ currentRootLayoutTreePath: options.currentRootLayoutTreePath,
132
+ currentVisibleCommitVersion: options.state.visibleCommitVersion,
133
+ nextRootLayoutTreePath: options.nextRootLayoutTreePath,
134
+ startedVisibleCommitVersion: options.event.token.baseVisibleCommitVersion
135
+ });
136
+ }
137
+ function classifyRootBoundaryTransition(currentRootBoundaryId, nextRootBoundaryId) {
138
+ if (currentRootBoundaryId === null || nextRootBoundaryId === null) return "rootBoundaryUnknownFallback";
139
+ return currentRootBoundaryId === nextRootBoundaryId ? "currentRootBoundary" : "rootBoundaryChanged";
140
+ }
141
+ function resolveSameLayoutAncestorPersistence(currentSnapshot, targetSnapshot) {
142
+ return resolveSameLayoutAncestorPersistenceForTopologies(createSnapshotRouteTopology(currentSnapshot), createSnapshotRouteTopology(targetSnapshot));
143
+ }
144
+ function resolveSameLayoutAncestorPersistenceForTopologies(currentTopology, targetTopology) {
145
+ if (classifyRootBoundaryTransition(currentTopology.rootBoundaryId, targetTopology.rootBoundaryId) !== "currentRootBoundary") return [];
146
+ const commonLayoutIds = [];
147
+ const maxLength = Math.min(currentTopology.layoutIds.length, targetTopology.layoutIds.length);
148
+ for (let index = 0; index < maxLength; index++) {
149
+ const layoutId = currentTopology.layoutIds[index];
150
+ if (layoutId !== targetTopology.layoutIds[index]) break;
151
+ commonLayoutIds.push(layoutId);
152
+ }
153
+ return commonLayoutIds;
154
+ }
155
+ function resolveMountedParallelSlotPersistence(currentSnapshot, targetSnapshot) {
156
+ return resolveMountedParallelSlotPersistenceForLayouts(currentSnapshot, resolveSameLayoutAncestorPersistence(currentSnapshot, targetSnapshot));
157
+ }
158
+ function resolveMountedParallelSlotPersistenceForLayouts(currentSnapshot, preservedLayoutIds) {
159
+ if (preservedLayoutIds.length === 0) return [];
160
+ const preservedLayoutIdSet = new Set(preservedLayoutIds);
161
+ const preservedSlotIds = [];
162
+ const seenSlotIds = /* @__PURE__ */ new Set();
163
+ for (const slot of currentSnapshot.mountedParallelSlots) {
164
+ if (slot.ownerLayoutId === null) continue;
165
+ if (!preservedLayoutIdSet.has(slot.ownerLayoutId)) continue;
166
+ if (seenSlotIds.has(slot.slotId)) continue;
167
+ preservedSlotIds.push(slot.slotId);
168
+ seenSlotIds.add(slot.slotId);
169
+ }
170
+ return preservedSlotIds;
171
+ }
172
+ function resolveCurrentRootBoundaryElementPersistence(currentSnapshot, targetSnapshot) {
173
+ const preservedLayoutIds = resolveSameLayoutAncestorPersistence(currentSnapshot, targetSnapshot);
174
+ return [...preservedLayoutIds, ...resolveMountedParallelSlotPersistenceForLayouts(currentSnapshot, preservedLayoutIds)];
175
+ }
176
+ function resolveCurrentRootBoundaryCommitElementPersistence(options) {
177
+ return resolveSameLayoutAncestorPersistenceForTopologies(options.currentTopology, options.targetTopology);
178
+ }
179
+ function resolveCurrentRootBoundaryCommitSlotPersistence(options) {
180
+ if (options.lane === "traverse") return [];
181
+ const preservedLayoutIds = resolveSameLayoutAncestorPersistenceForTopologies(options.currentTopology, options.targetTopology);
182
+ if (preservedLayoutIds.length === 0) return [];
183
+ return resolveDefaultOrUnmatchedSlotPersistenceForLayouts({
184
+ currentSlotBindings: options.currentTopology.slotBindings,
185
+ preservedLayoutIds,
186
+ targetSlotBindings: options.targetTopology.slotBindings
187
+ });
188
+ }
189
+ /**
190
+ * Default/unmatched slot preservation law:
191
+ *
192
+ * A target default/unmatched slot may reuse previous content only when:
193
+ * - the slot's owner layout is part of the preserved layout ancestor set;
194
+ * - the current visible snapshot proves the same slot had renderable content;
195
+ * - the navigation is not a traversal.
196
+ *
197
+ * Wire absence and UNMATCHED_SLOT markers are not semantic proof.
198
+ */
199
+ function resolveDefaultOrUnmatchedSlotPersistenceForLayouts(options) {
200
+ const preservedLayoutIdSet = new Set(options.preservedLayoutIds);
201
+ const slotIdsWithContent = /* @__PURE__ */ new Set();
202
+ for (const binding of options.currentSlotBindings) {
203
+ if (binding.state === "unmatched") continue;
204
+ slotIdsWithContent.add(binding.slotId);
205
+ }
206
+ const preservedSlotIds = [];
207
+ const seenSlotIds = /* @__PURE__ */ new Set();
208
+ for (const binding of options.targetSlotBindings) {
209
+ if (binding.ownerLayoutId === null) continue;
210
+ if (!preservedLayoutIdSet.has(binding.ownerLayoutId)) continue;
211
+ if (binding.state === "active") continue;
212
+ if (!slotIdsWithContent.has(binding.slotId)) continue;
213
+ if (seenSlotIds.has(binding.slotId)) continue;
214
+ preservedSlotIds.push(binding.slotId);
215
+ seenSlotIds.add(binding.slotId);
216
+ }
217
+ return preservedSlotIds.sort(compareAppElementsSlotIds);
218
+ }
219
+ function getVisibleInterceptionSourceIdentity(snapshot) {
220
+ if (snapshot.interception) return {
221
+ matchedUrl: snapshot.interception.sourceMatchedUrl,
222
+ routeId: snapshot.interception.sourceRouteId
223
+ };
224
+ return {
225
+ matchedUrl: snapshot.matchedUrl,
226
+ routeId: snapshot.routeId
227
+ };
228
+ }
229
+ function createInterceptionProofRejectedDecision(options) {
230
+ return {
231
+ kind: "hardNavigate",
232
+ reason: "interceptionProofRejected",
233
+ token: options.event.token,
234
+ trace: createNavigationTrace(options.reasonCode, options.traceFields),
235
+ url: options.event.result.href
236
+ };
237
+ }
238
+ function validateInterceptedPreservation(options) {
239
+ const proof = options.targetSnapshot.interception;
240
+ if (!proof) return {
241
+ kind: "rejected",
242
+ reasonCode: NavigationTraceReasonCodes.interceptedRejectedMissingProof
243
+ };
244
+ if (proof.targetMatchedUrl !== options.targetSnapshot.matchedUrl) return {
245
+ kind: "rejected",
246
+ reasonCode: NavigationTraceReasonCodes.interceptedRejectedTargetMismatch
247
+ };
248
+ const sourceIdentity = getVisibleInterceptionSourceIdentity(options.currentSnapshot);
249
+ if (proof.sourceMatchedUrl !== sourceIdentity.matchedUrl || proof.sourceRouteId !== sourceIdentity.routeId) return {
250
+ kind: "rejected",
251
+ reasonCode: NavigationTraceReasonCodes.interceptedRejectedUnknownSource
252
+ };
253
+ const declaredInterception = options.routeManifest === null ? null : findRouteManifestInterceptionForProof(options.routeManifest, proof);
254
+ if (options.routeManifest !== null && declaredInterception === null) return {
255
+ kind: "rejected",
256
+ reasonCode: NavigationTraceReasonCodes.interceptedRejectedUndeclaredTopology
257
+ };
258
+ const preservedLayoutIds = resolveSameLayoutAncestorPersistenceForTopologies(options.currentTopology, options.targetTopology);
259
+ if (preservedLayoutIds.length === 0) return {
260
+ kind: "rejected",
261
+ reasonCode: NavigationTraceReasonCodes.interceptedRejectedIncompatibleRoot
262
+ };
263
+ const preservedLayoutIdSet = new Set(preservedLayoutIds);
264
+ const targetSlotBinding = options.targetTopology.slotBindings.find((binding) => binding.slotId === proof.slotId);
265
+ if (!targetSlotBinding || targetSlotBinding.state !== "active" || targetSlotBinding.ownerLayoutId === null || !preservedLayoutIdSet.has(targetSlotBinding.ownerLayoutId)) return {
266
+ kind: "rejected",
267
+ reasonCode: NavigationTraceReasonCodes.interceptedRejectedMissingSlotProof
268
+ };
269
+ if (declaredInterception !== null && targetSlotBinding.ownerLayoutId !== declaredInterception.ownerLayoutId) return {
270
+ kind: "rejected",
271
+ reasonCode: NavigationTraceReasonCodes.interceptedRejectedUndeclaredTopology
272
+ };
273
+ return {
274
+ kind: "approved",
275
+ preserveElementIds: preservedLayoutIds,
276
+ preservePreviousSlotIds: resolveDefaultOrUnmatchedSlotPersistenceForLayouts({
277
+ currentSlotBindings: options.currentTopology.slotBindings,
278
+ preservedLayoutIds,
279
+ targetSlotBindings: options.targetTopology.slotBindings
280
+ }).filter((slotId) => slotId !== proof.slotId)
281
+ };
282
+ }
283
+ function planFlightResponseArrived(options) {
284
+ const targetSnapshot = options.event.result.targetSnapshot;
285
+ const currentTopology = resolveRouteTopologySnapshot({
286
+ routeManifest: options.routeManifest,
287
+ slotBindingSource: "snapshot",
288
+ snapshot: options.state.visibleSnapshot
289
+ });
290
+ const targetTopology = resolveRouteTopologySnapshot({
291
+ routeManifest: options.routeManifest,
292
+ slotBindingSource: "manifestTarget",
293
+ snapshot: targetSnapshot
294
+ });
295
+ const traceFields = createRootBoundaryTraceFields({
296
+ currentRootLayoutTreePath: currentTopology.rootLayoutTreePath,
297
+ event: options.event,
298
+ nextRootLayoutTreePath: targetTopology.rootLayoutTreePath,
299
+ state: options.state
300
+ });
301
+ if (options.event.token.lane === "prefetch") return {
302
+ kind: "noCommit",
303
+ reason: "prefetchOnly",
304
+ token: options.event.token,
305
+ trace: createNavigationTrace(NavigationTraceReasonCodes.prefetchOnly, traceFields)
306
+ };
307
+ if (targetSnapshot.interception !== null) {
308
+ const validation = validateInterceptedPreservation({
309
+ currentSnapshot: options.state.visibleSnapshot,
310
+ currentTopology,
311
+ routeManifest: options.routeManifest,
312
+ targetSnapshot,
313
+ targetTopology
314
+ });
315
+ if (validation.kind === "rejected") return createInterceptionProofRejectedDecision({
316
+ event: options.event,
317
+ reasonCode: validation.reasonCode,
318
+ traceFields
319
+ });
320
+ return {
321
+ kind: "proposeCommit",
322
+ proposal: {
323
+ preserveAbsentSlots: false,
324
+ preserveElementIds: validation.preserveElementIds,
325
+ preservePreviousSlotIds: validation.preservePreviousSlotIds,
326
+ reason: "interceptedCurrentRootBoundary",
327
+ targetSnapshot
328
+ },
329
+ token: options.event.token,
330
+ trace: createNavigationTrace(NavigationTraceReasonCodes.interceptedCommitCurrent, traceFields)
331
+ };
332
+ }
333
+ const transition = classifyRootBoundaryTransition(currentTopology.rootBoundaryId, targetTopology.rootBoundaryId);
334
+ if (transition === "rootBoundaryChanged") return {
335
+ kind: "hardNavigate",
336
+ reason: "rootBoundaryChanged",
337
+ token: options.event.token,
338
+ trace: createNavigationTrace(NavigationTraceReasonCodes.rootBoundaryChanged, traceFields),
339
+ url: options.event.result.href
340
+ };
341
+ if (transition === "rootBoundaryUnknownFallback") return {
342
+ kind: "proposeCommit",
343
+ proposal: {
344
+ preserveAbsentSlots: true,
345
+ preserveElementIds: [],
346
+ preservePreviousSlotIds: [],
347
+ reason: "rootBoundaryUnknownFallback",
348
+ targetSnapshot
349
+ },
350
+ token: options.event.token,
351
+ trace: createNavigationTrace(NavigationTraceReasonCodes.rootBoundaryUnknown, traceFields)
352
+ };
353
+ return {
354
+ kind: "proposeCommit",
355
+ proposal: {
356
+ preserveAbsentSlots: false,
357
+ preserveElementIds: resolveCurrentRootBoundaryCommitElementPersistence({
358
+ currentTopology,
359
+ lane: options.event.token.lane,
360
+ targetTopology
361
+ }),
362
+ preservePreviousSlotIds: resolveCurrentRootBoundaryCommitSlotPersistence({
363
+ currentTopology,
364
+ lane: options.event.token.lane,
365
+ targetTopology
366
+ }),
367
+ reason: "currentRootBoundary",
368
+ targetSnapshot
369
+ },
370
+ token: options.event.token,
371
+ trace: createNavigationTrace(NavigationTraceReasonCodes.commitCurrent, traceFields)
372
+ };
373
+ }
374
+ function planNavigation(input) {
375
+ switch (input.event.kind) {
376
+ case "navigate": return createRequestWorkDecision({
377
+ eventKind: input.event.kind,
378
+ state: input.state,
379
+ work: {
380
+ href: input.event.href,
381
+ kind: "flight",
382
+ mode: input.event.mode
383
+ }
384
+ });
385
+ case "refresh": return createRequestWorkDecision({
386
+ eventKind: input.event.kind,
387
+ state: input.state,
388
+ work: {
389
+ href: input.state.visibleSnapshot.displayUrl,
390
+ kind: "flight",
391
+ mode: "refresh"
392
+ }
393
+ });
394
+ case "traverse": return createRequestWorkDecision({
395
+ eventKind: input.event.kind,
396
+ state: input.state,
397
+ work: {
398
+ direction: input.event.direction,
399
+ historyState: input.event.historyState,
400
+ kind: "traverseFlight"
401
+ }
402
+ });
403
+ case "prefetch": return createRequestWorkDecision({
404
+ eventKind: input.event.kind,
405
+ state: input.state,
406
+ work: {
407
+ href: input.event.href,
408
+ kind: "prefetch"
409
+ }
410
+ });
411
+ case "flightResponseArrived": return planFlightResponseArrived({
412
+ event: input.event,
413
+ routeManifest: input.routeManifest,
414
+ state: input.state
415
+ });
416
+ default: {
417
+ const _exhaustive = input.event;
418
+ throw new Error("[vinext] Unknown navigation event: " + String(_exhaustive));
419
+ }
420
+ }
421
+ }
422
+ const navigationPlanner = {
423
+ classifyRootBoundaryTransition,
424
+ plan: planNavigation,
425
+ resolveCurrentRootBoundaryElementPersistence,
426
+ resolveMountedParallelSlotPersistence,
427
+ resolveSameLayoutAncestorPersistence
428
+ };
429
+ //#endregion
430
+ export { navigationPlanner };
431
+
432
+ //# sourceMappingURL=navigation-planner.js.map
@@ -0,0 +1 @@
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 { normalizePathnameForRouteMatch } 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 {\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 preserveAbsentSlots: boolean;\n preserveElementIds: readonly string[];\n preservePreviousSlotIds: readonly string[];\n reason: \"currentRootBoundary\" | \"interceptedCurrentRootBoundary\" | \"rootBoundaryUnknownFallback\";\n targetSnapshot: RouteSnapshotV0;\n};\n\nexport type NoCommitReason = \"prefetchOnly\";\nexport type HardNavigationReason = \"interceptionProofRejected\" | \"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 // 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 RouteTopologySlotBindingSource = \"snapshot\" | \"manifestTarget\";\n\nconst ROUTE_INTERCEPTION_CONTEXT_SEPARATOR = \"\\0\";\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 normalizePathnameForRouteMatch(getMatchedUrlPathname(matchedUrl))\n .split(\"/\")\n .filter((part) => part.length > 0);\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}): RouteTopologySnapshot {\n const route =\n options.routeManifest === null\n ? null\n : findRouteManifestRouteForSnapshot(options.routeManifest, options.snapshot);\n if (route === null || options.routeManifest === null) {\n return createSnapshotRouteTopology(options.snapshot);\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 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\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 // Both null directions intentionally share the fallback because unresolved\n // routes or legacy callers cannot prove either same-root reuse or root\n // changes from semantic topology.\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 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 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: currentTopology.rootLayoutTreePath,\n event: options.event,\n nextRootLayoutTreePath: targetTopology.rootLayoutTreePath,\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 // 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 const validation = validateInterceptedPreservation({\n currentSnapshot: options.state.visibleSnapshot,\n currentTopology,\n routeManifest: options.routeManifest,\n targetSnapshot,\n targetTopology,\n });\n if (validation.kind === \"rejected\") {\n return createInterceptionProofRejectedDecision({\n event: options.event,\n reasonCode: validation.reasonCode,\n traceFields,\n });\n }\n\n return {\n kind: \"proposeCommit\",\n proposal: {\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 traceFields,\n ),\n };\n }\n\n const transition = classifyRootBoundaryTransition(\n currentTopology.rootBoundaryId,\n targetTopology.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. It remains only for callers without a manifest or routes\n // that cannot be matched back to RouteManifest topology.\n return {\n kind: \"proposeCommit\",\n proposal: {\n preserveAbsentSlots: true,\n preserveElementIds: [],\n preservePreviousSlotIds: [],\n reason: \"rootBoundaryUnknownFallback\",\n 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 currentTopology,\n lane: options.event.token.lane,\n targetTopology,\n }),\n preservePreviousSlotIds: resolveCurrentRootBoundaryCommitSlotPersistence({\n currentTopology,\n lane: options.event.token.lane,\n targetTopology,\n }),\n reason: \"currentRootBoundary\",\n 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 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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"}
@@ -3,6 +3,15 @@ declare const NAVIGATION_TRACE_SCHEMA_VERSION = 0;
3
3
  type NavigationTraceSchemaVersion = 0;
4
4
  declare const NavigationTraceReasonCodes: {
5
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";
13
+ prefetchOnly: "NC_PREFETCH_ONLY";
14
+ requestWork: "NC_REQUEST";
6
15
  rootBoundaryChanged: "NC_ROOT";
7
16
  rootBoundaryUnknown: "NC_ROOT_UNKNOWN";
8
17
  staleOperation: "NC_STALE";
@@ -15,7 +24,7 @@ declare const NavigationTraceTransactionCodes: {
15
24
  type NavigationTraceReasonCode = (typeof NavigationTraceReasonCodes)[keyof typeof NavigationTraceReasonCodes];
16
25
  type NavigationTraceTransactionCode = (typeof NavigationTraceTransactionCodes)[keyof typeof NavigationTraceTransactionCodes];
17
26
  type NavigationTraceCode = NavigationTraceReasonCode | NavigationTraceTransactionCode;
18
- type NavigationTraceFieldName = "activeNavigationId" | "currentRootLayoutTreePath" | "nextRootLayoutTreePath" | "operationLane" | "pendingOperationId" | "startedVisibleCommitVersion" | "startedNavigationId";
27
+ type NavigationTraceFieldName = "activeNavigationId" | "currentRootLayoutTreePath" | "currentVisibleCommitVersion" | "nextRootLayoutTreePath" | "eventKind" | "operationLane" | "pendingOperationId" | "startedVisibleCommitVersion" | "startedNavigationId" | "targetHref" | "traverseDirection";
19
28
  type NavigationTraceFieldValue = string | number | boolean | null;
20
29
  type NavigationTraceFields = Readonly<Partial<Record<NavigationTraceFieldName, NavigationTraceFieldValue>>>;
21
30
  type NavigationTraceEntry = Readonly<{
@@ -26,8 +35,16 @@ type NavigationTrace = Readonly<{
26
35
  schemaVersion: NavigationTraceSchemaVersion;
27
36
  entries: readonly NavigationTraceEntry[];
28
37
  }>;
38
+ declare function createNavigationLifecycleTraceFields(options: {
39
+ activeNavigationId?: number;
40
+ currentRootLayoutTreePath: string | null;
41
+ currentVisibleCommitVersion: number;
42
+ nextRootLayoutTreePath: string | null;
43
+ startedNavigationId?: number;
44
+ startedVisibleCommitVersion: number;
45
+ }): NavigationTraceFields;
29
46
  declare function createNavigationTrace(code: NavigationTraceCode, fields?: NavigationTraceFields): NavigationTrace;
30
47
  declare function prependNavigationTraceEntry(trace: NavigationTrace, code: NavigationTraceCode, fields?: NavigationTraceFields): NavigationTrace;
31
48
  //#endregion
32
- export { NAVIGATION_TRACE_SCHEMA_VERSION, NavigationTrace, NavigationTraceCode, NavigationTraceEntry, NavigationTraceFieldName, NavigationTraceFieldValue, NavigationTraceFields, NavigationTraceReasonCode, NavigationTraceReasonCodes, NavigationTraceSchemaVersion, NavigationTraceTransactionCode, NavigationTraceTransactionCodes, createNavigationTrace, prependNavigationTraceEntry };
49
+ export { NAVIGATION_TRACE_SCHEMA_VERSION, NavigationTrace, NavigationTraceCode, NavigationTraceEntry, NavigationTraceFieldName, NavigationTraceFieldValue, NavigationTraceFields, NavigationTraceReasonCode, NavigationTraceReasonCodes, NavigationTraceSchemaVersion, NavigationTraceTransactionCode, NavigationTraceTransactionCodes, createNavigationLifecycleTraceFields, createNavigationTrace, prependNavigationTraceEntry };
33
50
  //# sourceMappingURL=navigation-trace.d.ts.map
@@ -2,6 +2,15 @@
2
2
  const NAVIGATION_TRACE_SCHEMA_VERSION = 0;
3
3
  const NavigationTraceReasonCodes = {
4
4
  commitCurrent: "NC_COMMIT",
5
+ interceptedCommitCurrent: "NC_INTERCEPT_COMMIT",
6
+ interceptedRejectedIncompatibleRoot: "NC_INTERCEPT_REJECT_ROOT",
7
+ interceptedRejectedMissingProof: "NC_INTERCEPT_REJECT_MISSING_PROOF",
8
+ interceptedRejectedMissingSlotProof: "NC_INTERCEPT_REJECT_SLOT",
9
+ interceptedRejectedTargetMismatch: "NC_INTERCEPT_REJECT_TARGET",
10
+ interceptedRejectedUndeclaredTopology: "NC_INTERCEPT_REJECT_GRAPH",
11
+ interceptedRejectedUnknownSource: "NC_INTERCEPT_REJECT_SOURCE",
12
+ prefetchOnly: "NC_PREFETCH_ONLY",
13
+ requestWork: "NC_REQUEST",
5
14
  rootBoundaryChanged: "NC_ROOT",
6
15
  rootBoundaryUnknown: "NC_ROOT_UNKNOWN",
7
16
  staleOperation: "NC_STALE"
@@ -11,6 +20,16 @@ const NavigationTraceTransactionCodes = {
11
20
  noCommit: "NT_NO_COMMIT",
12
21
  visibleCommit: "NT_VISIBLE_COMMIT"
13
22
  };
23
+ function createNavigationLifecycleTraceFields(options) {
24
+ return {
25
+ ...options.activeNavigationId !== void 0 ? { activeNavigationId: options.activeNavigationId } : {},
26
+ currentRootLayoutTreePath: options.currentRootLayoutTreePath,
27
+ currentVisibleCommitVersion: options.currentVisibleCommitVersion,
28
+ nextRootLayoutTreePath: options.nextRootLayoutTreePath,
29
+ ...options.startedNavigationId !== void 0 ? { startedNavigationId: options.startedNavigationId } : {},
30
+ startedVisibleCommitVersion: options.startedVisibleCommitVersion
31
+ };
32
+ }
14
33
  function createNavigationTraceEntry(code, fields = {}) {
15
34
  return {
16
35
  code,
@@ -30,6 +49,6 @@ function prependNavigationTraceEntry(trace, code, fields = {}) {
30
49
  };
31
50
  }
32
51
  //#endregion
33
- export { NAVIGATION_TRACE_SCHEMA_VERSION, NavigationTraceReasonCodes, NavigationTraceTransactionCodes, createNavigationTrace, prependNavigationTraceEntry };
52
+ export { NAVIGATION_TRACE_SCHEMA_VERSION, NavigationTraceReasonCodes, NavigationTraceTransactionCodes, createNavigationLifecycleTraceFields, createNavigationTrace, prependNavigationTraceEntry };
34
53
 
35
54
  //# sourceMappingURL=navigation-trace.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"navigation-trace.js","names":[],"sources":["../../src/server/navigation-trace.ts"],"sourcesContent":["export const NAVIGATION_TRACE_SCHEMA_VERSION = 0;\n\nexport type NavigationTraceSchemaVersion = 0;\n\nexport const NavigationTraceReasonCodes = {\n commitCurrent: \"NC_COMMIT\",\n rootBoundaryChanged: \"NC_ROOT\",\n rootBoundaryUnknown: \"NC_ROOT_UNKNOWN\",\n staleOperation: \"NC_STALE\",\n} satisfies Readonly<{\n commitCurrent: \"NC_COMMIT\";\n rootBoundaryChanged: \"NC_ROOT\";\n rootBoundaryUnknown: \"NC_ROOT_UNKNOWN\";\n staleOperation: \"NC_STALE\";\n}>;\n\nexport const NavigationTraceTransactionCodes = {\n hardNavigate: \"NT_HARD_NAVIGATE\",\n noCommit: \"NT_NO_COMMIT\",\n visibleCommit: \"NT_VISIBLE_COMMIT\",\n} satisfies Readonly<{\n hardNavigate: \"NT_HARD_NAVIGATE\";\n noCommit: \"NT_NO_COMMIT\";\n visibleCommit: \"NT_VISIBLE_COMMIT\";\n}>;\n\nexport type NavigationTraceReasonCode =\n (typeof NavigationTraceReasonCodes)[keyof typeof NavigationTraceReasonCodes];\n\nexport type NavigationTraceTransactionCode =\n (typeof NavigationTraceTransactionCodes)[keyof typeof NavigationTraceTransactionCodes];\n\nexport type NavigationTraceCode = NavigationTraceReasonCode | NavigationTraceTransactionCode;\n\nexport type NavigationTraceFieldName =\n | \"activeNavigationId\"\n | \"currentRootLayoutTreePath\"\n | \"nextRootLayoutTreePath\"\n | \"operationLane\"\n | \"pendingOperationId\"\n | \"startedVisibleCommitVersion\"\n | \"startedNavigationId\";\n\nexport type NavigationTraceFieldValue = string | number | boolean | null;\n\nexport type NavigationTraceFields = Readonly<\n Partial<Record<NavigationTraceFieldName, NavigationTraceFieldValue>>\n>;\n\nexport type NavigationTraceEntry = Readonly<{\n code: NavigationTraceCode;\n fields: NavigationTraceFields;\n}>;\n\nexport type NavigationTrace = Readonly<{\n schemaVersion: NavigationTraceSchemaVersion;\n entries: readonly NavigationTraceEntry[];\n}>;\n\nfunction createNavigationTraceEntry(\n code: NavigationTraceCode,\n fields: NavigationTraceFields = {},\n): NavigationTraceEntry {\n return {\n code,\n fields: { ...fields },\n };\n}\n\nexport function createNavigationTrace(\n code: NavigationTraceCode,\n fields: NavigationTraceFields = {},\n): NavigationTrace {\n return {\n schemaVersion: NAVIGATION_TRACE_SCHEMA_VERSION,\n entries: [createNavigationTraceEntry(code, fields)],\n };\n}\n\nexport function prependNavigationTraceEntry(\n trace: NavigationTrace,\n code: NavigationTraceCode,\n fields: NavigationTraceFields = {},\n): NavigationTrace {\n return {\n schemaVersion: trace.schemaVersion,\n entries: [createNavigationTraceEntry(code, fields), ...trace.entries],\n };\n}\n"],"mappings":";AAAA,MAAa,kCAAkC;AAI/C,MAAa,6BAA6B;CACxC,eAAe;CACf,qBAAqB;CACrB,qBAAqB;CACrB,gBAAgB;CACjB;AAOD,MAAa,kCAAkC;CAC7C,cAAc;CACd,UAAU;CACV,eAAe;CAChB;AAuCD,SAAS,2BACP,MACA,SAAgC,EAAE,EACZ;AACtB,QAAO;EACL;EACA,QAAQ,EAAE,GAAG,QAAQ;EACtB;;AAGH,SAAgB,sBACd,MACA,SAAgC,EAAE,EACjB;AACjB,QAAO;EACL,eAAA;EACA,SAAS,CAAC,2BAA2B,MAAM,OAAO,CAAC;EACpD;;AAGH,SAAgB,4BACd,OACA,MACA,SAAgC,EAAE,EACjB;AACjB,QAAO;EACL,eAAe,MAAM;EACrB,SAAS,CAAC,2BAA2B,MAAM,OAAO,EAAE,GAAG,MAAM,QAAQ;EACtE"}
1
+ {"version":3,"file":"navigation-trace.js","names":[],"sources":["../../src/server/navigation-trace.ts"],"sourcesContent":["export const NAVIGATION_TRACE_SCHEMA_VERSION = 0;\n\nexport type NavigationTraceSchemaVersion = 0;\n\nexport const NavigationTraceReasonCodes = {\n commitCurrent: \"NC_COMMIT\",\n interceptedCommitCurrent: \"NC_INTERCEPT_COMMIT\",\n interceptedRejectedIncompatibleRoot: \"NC_INTERCEPT_REJECT_ROOT\",\n interceptedRejectedMissingProof: \"NC_INTERCEPT_REJECT_MISSING_PROOF\",\n interceptedRejectedMissingSlotProof: \"NC_INTERCEPT_REJECT_SLOT\",\n interceptedRejectedTargetMismatch: \"NC_INTERCEPT_REJECT_TARGET\",\n interceptedRejectedUndeclaredTopology: \"NC_INTERCEPT_REJECT_GRAPH\",\n interceptedRejectedUnknownSource: \"NC_INTERCEPT_REJECT_SOURCE\",\n prefetchOnly: \"NC_PREFETCH_ONLY\",\n requestWork: \"NC_REQUEST\",\n rootBoundaryChanged: \"NC_ROOT\",\n rootBoundaryUnknown: \"NC_ROOT_UNKNOWN\",\n staleOperation: \"NC_STALE\",\n} satisfies Readonly<{\n commitCurrent: \"NC_COMMIT\";\n interceptedCommitCurrent: \"NC_INTERCEPT_COMMIT\";\n interceptedRejectedIncompatibleRoot: \"NC_INTERCEPT_REJECT_ROOT\";\n interceptedRejectedMissingProof: \"NC_INTERCEPT_REJECT_MISSING_PROOF\";\n interceptedRejectedMissingSlotProof: \"NC_INTERCEPT_REJECT_SLOT\";\n interceptedRejectedTargetMismatch: \"NC_INTERCEPT_REJECT_TARGET\";\n interceptedRejectedUndeclaredTopology: \"NC_INTERCEPT_REJECT_GRAPH\";\n interceptedRejectedUnknownSource: \"NC_INTERCEPT_REJECT_SOURCE\";\n prefetchOnly: \"NC_PREFETCH_ONLY\";\n requestWork: \"NC_REQUEST\";\n rootBoundaryChanged: \"NC_ROOT\";\n rootBoundaryUnknown: \"NC_ROOT_UNKNOWN\";\n staleOperation: \"NC_STALE\";\n}>;\n\nexport const NavigationTraceTransactionCodes = {\n hardNavigate: \"NT_HARD_NAVIGATE\",\n noCommit: \"NT_NO_COMMIT\",\n visibleCommit: \"NT_VISIBLE_COMMIT\",\n} satisfies Readonly<{\n hardNavigate: \"NT_HARD_NAVIGATE\";\n noCommit: \"NT_NO_COMMIT\";\n visibleCommit: \"NT_VISIBLE_COMMIT\";\n}>;\n\nexport type NavigationTraceReasonCode =\n (typeof NavigationTraceReasonCodes)[keyof typeof NavigationTraceReasonCodes];\n\nexport type NavigationTraceTransactionCode =\n (typeof NavigationTraceTransactionCodes)[keyof typeof NavigationTraceTransactionCodes];\n\nexport type NavigationTraceCode = NavigationTraceReasonCode | NavigationTraceTransactionCode;\n\nexport type NavigationTraceFieldName =\n | \"activeNavigationId\"\n | \"currentRootLayoutTreePath\"\n | \"currentVisibleCommitVersion\"\n | \"nextRootLayoutTreePath\"\n | \"eventKind\"\n | \"operationLane\"\n | \"pendingOperationId\"\n | \"startedVisibleCommitVersion\"\n | \"startedNavigationId\"\n | \"targetHref\"\n | \"traverseDirection\";\n\nexport type NavigationTraceFieldValue = string | number | boolean | null;\n\nexport type NavigationTraceFields = Readonly<\n Partial<Record<NavigationTraceFieldName, NavigationTraceFieldValue>>\n>;\n\nexport type NavigationTraceEntry = Readonly<{\n code: NavigationTraceCode;\n fields: NavigationTraceFields;\n}>;\n\nexport type NavigationTrace = Readonly<{\n schemaVersion: NavigationTraceSchemaVersion;\n entries: readonly NavigationTraceEntry[];\n}>;\n\nexport function createNavigationLifecycleTraceFields(options: {\n activeNavigationId?: number;\n currentRootLayoutTreePath: string | null;\n currentVisibleCommitVersion: number;\n nextRootLayoutTreePath: string | null;\n startedNavigationId?: number;\n startedVisibleCommitVersion: number;\n}): NavigationTraceFields {\n return {\n ...(options.activeNavigationId !== undefined\n ? { activeNavigationId: options.activeNavigationId }\n : {}),\n currentRootLayoutTreePath: options.currentRootLayoutTreePath,\n currentVisibleCommitVersion: options.currentVisibleCommitVersion,\n nextRootLayoutTreePath: options.nextRootLayoutTreePath,\n ...(options.startedNavigationId !== undefined\n ? { startedNavigationId: options.startedNavigationId }\n : {}),\n startedVisibleCommitVersion: options.startedVisibleCommitVersion,\n };\n}\n\nfunction createNavigationTraceEntry(\n code: NavigationTraceCode,\n fields: NavigationTraceFields = {},\n): NavigationTraceEntry {\n return {\n code,\n fields: { ...fields },\n };\n}\n\nexport function createNavigationTrace(\n code: NavigationTraceCode,\n fields: NavigationTraceFields = {},\n): NavigationTrace {\n return {\n schemaVersion: NAVIGATION_TRACE_SCHEMA_VERSION,\n entries: [createNavigationTraceEntry(code, fields)],\n };\n}\n\nexport function prependNavigationTraceEntry(\n trace: NavigationTrace,\n code: NavigationTraceCode,\n fields: NavigationTraceFields = {},\n): NavigationTrace {\n return {\n schemaVersion: trace.schemaVersion,\n entries: [createNavigationTraceEntry(code, fields), ...trace.entries],\n };\n}\n"],"mappings":";AAAA,MAAa,kCAAkC;AAI/C,MAAa,6BAA6B;CACxC,eAAe;CACf,0BAA0B;CAC1B,qCAAqC;CACrC,iCAAiC;CACjC,qCAAqC;CACrC,mCAAmC;CACnC,uCAAuC;CACvC,kCAAkC;CAClC,cAAc;CACd,aAAa;CACb,qBAAqB;CACrB,qBAAqB;CACrB,gBAAgB;CACjB;AAgBD,MAAa,kCAAkC;CAC7C,cAAc;CACd,UAAU;CACV,eAAe;CAChB;AA2CD,SAAgB,qCAAqC,SAO3B;CACxB,OAAO;EACL,GAAI,QAAQ,uBAAuB,KAAA,IAC/B,EAAE,oBAAoB,QAAQ,oBAAoB,GAClD,EAAE;EACN,2BAA2B,QAAQ;EACnC,6BAA6B,QAAQ;EACrC,wBAAwB,QAAQ;EAChC,GAAI,QAAQ,wBAAwB,KAAA,IAChC,EAAE,qBAAqB,QAAQ,qBAAqB,GACpD,EAAE;EACN,6BAA6B,QAAQ;EACtC;;AAGH,SAAS,2BACP,MACA,SAAgC,EAAE,EACZ;CACtB,OAAO;EACL;EACA,QAAQ,EAAE,GAAG,QAAQ;EACtB;;AAGH,SAAgB,sBACd,MACA,SAAgC,EAAE,EACjB;CACjB,OAAO;EACL,eAAA;EACA,SAAS,CAAC,2BAA2B,MAAM,OAAO,CAAC;EACpD;;AAGH,SAAgB,4BACd,OACA,MACA,SAAgC,EAAE,EACjB;CACjB,OAAO;EACL,eAAe,MAAM;EACrB,SAAS,CAAC,2BAA2B,MAAM,OAAO,EAAE,GAAG,MAAM,QAAQ;EACtE"}
@@ -15,7 +15,7 @@
15
15
  */
16
16
  type NextRedirectDigest = {
17
17
  status: number;
18
- type: string;
18
+ type: string | null;
19
19
  url: string;
20
20
  };
21
21
  type NextHttpErrorDigest = {
@@ -30,7 +30,8 @@ declare function getNextErrorDigest(error: unknown): string | null;
30
30
  * Parses a `NEXT_REDIRECT;<type>;<encodedUrl>;<status>` digest. Returns null
31
31
  * when the digest is not a redirect digest or the encoded URL segment is
32
32
  * missing. The `url` is decoded with `decodeURIComponent`; the `status`
33
- * defaults to 307 when omitted; the `type` defaults to "push".
33
+ * defaults to 307 when omitted; an omitted `type` is left as null so the
34
+ * caller can apply the correct context-sensitive default.
34
35
  */
35
36
  declare function parseNextRedirectDigest(digest: string): NextRedirectDigest | null;
36
37
  /**