@rangojs/router 0.0.0-experimental.9 → 0.0.0-experimental.91

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 (1125) hide show
  1. package/AGENTS.md +9 -0
  2. package/README.md +972 -4
  3. package/dist/__internal.d.ts +83 -0
  4. package/dist/__internal.d.ts.map +1 -0
  5. package/dist/__internal.js +19 -0
  6. package/dist/__internal.js.map +1 -0
  7. package/dist/__mocks__/version.d.ts +7 -0
  8. package/dist/__mocks__/version.d.ts.map +1 -0
  9. package/dist/__mocks__/version.js +7 -0
  10. package/dist/__mocks__/version.js.map +1 -0
  11. package/dist/__tests__/client-href.test.d.ts +2 -0
  12. package/dist/__tests__/client-href.test.d.ts.map +1 -0
  13. package/dist/__tests__/client-href.test.js +74 -0
  14. package/dist/__tests__/client-href.test.js.map +1 -0
  15. package/dist/__tests__/component-utils.test.d.ts +2 -0
  16. package/dist/__tests__/component-utils.test.d.ts.map +1 -0
  17. package/dist/__tests__/component-utils.test.js +51 -0
  18. package/dist/__tests__/component-utils.test.js.map +1 -0
  19. package/dist/__tests__/event-controller.test.d.ts +2 -0
  20. package/dist/__tests__/event-controller.test.d.ts.map +1 -0
  21. package/dist/__tests__/event-controller.test.js +538 -0
  22. package/dist/__tests__/event-controller.test.js.map +1 -0
  23. package/dist/__tests__/helpers/route-tree.d.ts +118 -0
  24. package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
  25. package/dist/__tests__/helpers/route-tree.js +374 -0
  26. package/dist/__tests__/helpers/route-tree.js.map +1 -0
  27. package/dist/__tests__/match-result.test.d.ts +2 -0
  28. package/dist/__tests__/match-result.test.d.ts.map +1 -0
  29. package/dist/__tests__/match-result.test.js +154 -0
  30. package/dist/__tests__/match-result.test.js.map +1 -0
  31. package/dist/__tests__/navigation-store.test.d.ts +2 -0
  32. package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
  33. package/dist/__tests__/navigation-store.test.js +440 -0
  34. package/dist/__tests__/navigation-store.test.js.map +1 -0
  35. package/dist/__tests__/partial-update.test.d.ts +2 -0
  36. package/dist/__tests__/partial-update.test.d.ts.map +1 -0
  37. package/dist/__tests__/partial-update.test.js +1009 -0
  38. package/dist/__tests__/partial-update.test.js.map +1 -0
  39. package/dist/__tests__/reverse-types.test.d.ts +8 -0
  40. package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
  41. package/dist/__tests__/reverse-types.test.js +656 -0
  42. package/dist/__tests__/reverse-types.test.js.map +1 -0
  43. package/dist/__tests__/route-definition.test.d.ts +2 -0
  44. package/dist/__tests__/route-definition.test.d.ts.map +1 -0
  45. package/dist/__tests__/route-definition.test.js +55 -0
  46. package/dist/__tests__/route-definition.test.js.map +1 -0
  47. package/dist/__tests__/router-helpers.test.d.ts +2 -0
  48. package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
  49. package/dist/__tests__/router-helpers.test.js +377 -0
  50. package/dist/__tests__/router-helpers.test.js.map +1 -0
  51. package/dist/__tests__/router-integration-2.test.d.ts +2 -0
  52. package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
  53. package/dist/__tests__/router-integration-2.test.js +426 -0
  54. package/dist/__tests__/router-integration-2.test.js.map +1 -0
  55. package/dist/__tests__/router-integration.test.d.ts +2 -0
  56. package/dist/__tests__/router-integration.test.d.ts.map +1 -0
  57. package/dist/__tests__/router-integration.test.js +1051 -0
  58. package/dist/__tests__/router-integration.test.js.map +1 -0
  59. package/dist/__tests__/search-params.test.d.ts +5 -0
  60. package/dist/__tests__/search-params.test.d.ts.map +1 -0
  61. package/dist/__tests__/search-params.test.js +306 -0
  62. package/dist/__tests__/search-params.test.js.map +1 -0
  63. package/dist/__tests__/segment-system.test.d.ts +2 -0
  64. package/dist/__tests__/segment-system.test.d.ts.map +1 -0
  65. package/dist/__tests__/segment-system.test.js +627 -0
  66. package/dist/__tests__/segment-system.test.js.map +1 -0
  67. package/dist/__tests__/static-handler-types.test.d.ts +8 -0
  68. package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
  69. package/dist/__tests__/static-handler-types.test.js +63 -0
  70. package/dist/__tests__/static-handler-types.test.js.map +1 -0
  71. package/dist/__tests__/urls.test.d.ts +2 -0
  72. package/dist/__tests__/urls.test.d.ts.map +1 -0
  73. package/dist/__tests__/urls.test.js +421 -0
  74. package/dist/__tests__/urls.test.js.map +1 -0
  75. package/dist/__tests__/use-mount.test.d.ts +2 -0
  76. package/dist/__tests__/use-mount.test.d.ts.map +1 -0
  77. package/dist/__tests__/use-mount.test.js +35 -0
  78. package/dist/__tests__/use-mount.test.js.map +1 -0
  79. package/dist/bin/rango.d.ts +2 -0
  80. package/dist/bin/rango.d.ts.map +1 -0
  81. package/dist/bin/rango.js +1619 -155
  82. package/dist/bin/rango.js.map +1 -0
  83. package/dist/browser/event-controller.d.ts +191 -0
  84. package/dist/browser/event-controller.d.ts.map +1 -0
  85. package/dist/browser/event-controller.js +559 -0
  86. package/dist/browser/event-controller.js.map +1 -0
  87. package/dist/browser/index.d.ts +2 -0
  88. package/dist/browser/index.d.ts.map +1 -0
  89. package/dist/browser/index.js +14 -0
  90. package/dist/browser/index.js.map +1 -0
  91. package/dist/browser/link-interceptor.d.ts +38 -0
  92. package/dist/browser/link-interceptor.d.ts.map +1 -0
  93. package/dist/browser/link-interceptor.js +99 -0
  94. package/dist/browser/link-interceptor.js.map +1 -0
  95. package/dist/browser/logging.d.ts +10 -0
  96. package/dist/browser/logging.d.ts.map +1 -0
  97. package/dist/browser/logging.js +29 -0
  98. package/dist/browser/logging.js.map +1 -0
  99. package/dist/browser/lru-cache.d.ts +17 -0
  100. package/dist/browser/lru-cache.d.ts.map +1 -0
  101. package/dist/browser/lru-cache.js +50 -0
  102. package/dist/browser/lru-cache.js.map +1 -0
  103. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  104. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  105. package/dist/browser/merge-segment-loaders.js +102 -0
  106. package/dist/browser/merge-segment-loaders.js.map +1 -0
  107. package/dist/browser/navigation-bridge.d.ts +102 -0
  108. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  109. package/dist/browser/navigation-bridge.js +708 -0
  110. package/dist/browser/navigation-bridge.js.map +1 -0
  111. package/dist/browser/navigation-client.d.ts +25 -0
  112. package/dist/browser/navigation-client.d.ts.map +1 -0
  113. package/dist/browser/navigation-client.js +157 -0
  114. package/dist/browser/navigation-client.js.map +1 -0
  115. package/dist/browser/navigation-store.d.ts +101 -0
  116. package/dist/browser/navigation-store.d.ts.map +1 -0
  117. package/dist/browser/navigation-store.js +625 -0
  118. package/dist/browser/navigation-store.js.map +1 -0
  119. package/dist/browser/partial-update.d.ts +75 -0
  120. package/dist/browser/partial-update.d.ts.map +1 -0
  121. package/dist/browser/partial-update.js +426 -0
  122. package/dist/browser/partial-update.js.map +1 -0
  123. package/dist/browser/react/Link.d.ts +86 -0
  124. package/dist/browser/react/Link.d.ts.map +1 -0
  125. package/dist/browser/react/Link.js +128 -0
  126. package/dist/browser/react/Link.js.map +1 -0
  127. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  128. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  129. package/dist/browser/react/NavigationProvider.js +216 -0
  130. package/dist/browser/react/NavigationProvider.js.map +1 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  132. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  133. package/dist/browser/react/ScrollRestoration.js +57 -0
  134. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  135. package/dist/browser/react/context.d.ts +46 -0
  136. package/dist/browser/react/context.d.ts.map +1 -0
  137. package/dist/browser/react/context.js +10 -0
  138. package/dist/browser/react/context.js.map +1 -0
  139. package/dist/browser/react/index.d.ts +11 -0
  140. package/dist/browser/react/index.d.ts.map +1 -0
  141. package/dist/browser/react/index.js +22 -0
  142. package/dist/browser/react/index.js.map +1 -0
  143. package/dist/browser/react/location-state-shared.d.ts +63 -0
  144. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  145. package/dist/browser/react/location-state-shared.js +81 -0
  146. package/dist/browser/react/location-state-shared.js.map +1 -0
  147. package/dist/browser/react/location-state.d.ts +23 -0
  148. package/dist/browser/react/location-state.d.ts.map +1 -0
  149. package/dist/browser/react/location-state.js +29 -0
  150. package/dist/browser/react/location-state.js.map +1 -0
  151. package/dist/browser/react/mount-context.d.ts +24 -0
  152. package/dist/browser/react/mount-context.d.ts.map +1 -0
  153. package/dist/browser/react/mount-context.js +24 -0
  154. package/dist/browser/react/mount-context.js.map +1 -0
  155. package/dist/browser/react/use-action.d.ts +64 -0
  156. package/dist/browser/react/use-action.d.ts.map +1 -0
  157. package/dist/browser/react/use-action.js +134 -0
  158. package/dist/browser/react/use-action.js.map +1 -0
  159. package/dist/browser/react/use-client-cache.d.ts +41 -0
  160. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  161. package/dist/browser/react/use-client-cache.js +39 -0
  162. package/dist/browser/react/use-client-cache.js.map +1 -0
  163. package/dist/browser/react/use-handle.d.ts +31 -0
  164. package/dist/browser/react/use-handle.d.ts.map +1 -0
  165. package/dist/browser/react/use-handle.js +144 -0
  166. package/dist/browser/react/use-handle.js.map +1 -0
  167. package/dist/browser/react/use-href.d.ts +33 -0
  168. package/dist/browser/react/use-href.d.ts.map +1 -0
  169. package/dist/browser/react/use-href.js +39 -0
  170. package/dist/browser/react/use-href.js.map +1 -0
  171. package/dist/browser/react/use-link-status.d.ts +37 -0
  172. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  173. package/dist/browser/react/use-link-status.js +99 -0
  174. package/dist/browser/react/use-link-status.js.map +1 -0
  175. package/dist/browser/react/use-mount.d.ts +25 -0
  176. package/dist/browser/react/use-mount.d.ts.map +1 -0
  177. package/dist/browser/react/use-mount.js +30 -0
  178. package/dist/browser/react/use-mount.js.map +1 -0
  179. package/dist/browser/react/use-navigation.d.ts +27 -0
  180. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  181. package/dist/browser/react/use-navigation.js +87 -0
  182. package/dist/browser/react/use-navigation.js.map +1 -0
  183. package/dist/browser/react/use-segments.d.ts +38 -0
  184. package/dist/browser/react/use-segments.d.ts.map +1 -0
  185. package/dist/browser/react/use-segments.js +130 -0
  186. package/dist/browser/react/use-segments.js.map +1 -0
  187. package/dist/browser/request-controller.d.ts +26 -0
  188. package/dist/browser/request-controller.d.ts.map +1 -0
  189. package/dist/browser/request-controller.js +147 -0
  190. package/dist/browser/request-controller.js.map +1 -0
  191. package/dist/browser/rsc-router.d.ts +129 -0
  192. package/dist/browser/rsc-router.d.ts.map +1 -0
  193. package/dist/browser/rsc-router.js +195 -0
  194. package/dist/browser/rsc-router.js.map +1 -0
  195. package/dist/browser/scroll-restoration.d.ts +93 -0
  196. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  197. package/dist/browser/scroll-restoration.js +321 -0
  198. package/dist/browser/scroll-restoration.js.map +1 -0
  199. package/dist/browser/segment-structure-assert.d.ts +17 -0
  200. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  201. package/dist/browser/segment-structure-assert.js +59 -0
  202. package/dist/browser/segment-structure-assert.js.map +1 -0
  203. package/dist/browser/server-action-bridge.d.ts +26 -0
  204. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  205. package/dist/browser/server-action-bridge.js +668 -0
  206. package/dist/browser/server-action-bridge.js.map +1 -0
  207. package/dist/browser/shallow.d.ts +12 -0
  208. package/dist/browser/shallow.d.ts.map +1 -0
  209. package/dist/browser/shallow.js +34 -0
  210. package/dist/browser/shallow.js.map +1 -0
  211. package/dist/browser/types.d.ts +369 -0
  212. package/dist/browser/types.d.ts.map +1 -0
  213. package/dist/browser/types.js +2 -0
  214. package/dist/browser/types.js.map +1 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  216. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  217. package/dist/build/__tests__/generate-cli.test.js +237 -0
  218. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  220. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  221. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  222. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  224. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  225. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  226. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  228. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  230. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  231. package/dist/build/generate-manifest.d.ts +81 -0
  232. package/dist/build/generate-manifest.d.ts.map +1 -0
  233. package/dist/build/generate-manifest.js +276 -0
  234. package/dist/build/generate-manifest.js.map +1 -0
  235. package/dist/build/generate-route-types.d.ts +115 -0
  236. package/dist/build/generate-route-types.d.ts.map +1 -0
  237. package/dist/build/generate-route-types.js +740 -0
  238. package/dist/build/generate-route-types.js.map +1 -0
  239. package/dist/build/index.d.ts +21 -0
  240. package/dist/build/index.d.ts.map +1 -0
  241. package/dist/build/index.js +21 -0
  242. package/dist/build/index.js.map +1 -0
  243. package/dist/build/route-trie.d.ts +71 -0
  244. package/dist/build/route-trie.d.ts.map +1 -0
  245. package/dist/build/route-trie.js +175 -0
  246. package/dist/build/route-trie.js.map +1 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  248. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  249. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  250. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  252. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  253. package/dist/cache/__tests__/document-cache.test.js +345 -0
  254. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  258. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  260. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  261. package/dist/cache/__tests__/memory-store.test.js +367 -0
  262. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  263. package/dist/cache/cache-scope.d.ts +102 -0
  264. package/dist/cache/cache-scope.d.ts.map +1 -0
  265. package/dist/cache/cache-scope.js +440 -0
  266. package/dist/cache/cache-scope.js.map +1 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  270. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  272. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  273. package/dist/cache/cf/cf-cache-store.js +242 -0
  274. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  275. package/dist/cache/cf/index.d.ts +14 -0
  276. package/dist/cache/cf/index.d.ts.map +1 -0
  277. package/dist/cache/cf/index.js +17 -0
  278. package/dist/cache/cf/index.js.map +1 -0
  279. package/dist/cache/document-cache.d.ts +64 -0
  280. package/dist/cache/document-cache.d.ts.map +1 -0
  281. package/dist/cache/document-cache.js +228 -0
  282. package/dist/cache/document-cache.js.map +1 -0
  283. package/dist/cache/index.d.ts +19 -0
  284. package/dist/cache/index.d.ts.map +1 -0
  285. package/dist/cache/index.js +21 -0
  286. package/dist/cache/index.js.map +1 -0
  287. package/dist/cache/memory-segment-store.d.ts +110 -0
  288. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  289. package/dist/cache/memory-segment-store.js +117 -0
  290. package/dist/cache/memory-segment-store.js.map +1 -0
  291. package/dist/cache/memory-store.d.ts +41 -0
  292. package/dist/cache/memory-store.d.ts.map +1 -0
  293. package/dist/cache/memory-store.js +191 -0
  294. package/dist/cache/memory-store.js.map +1 -0
  295. package/dist/cache/types.d.ts +317 -0
  296. package/dist/cache/types.d.ts.map +1 -0
  297. package/dist/cache/types.js +12 -0
  298. package/dist/cache/types.js.map +1 -0
  299. package/dist/client.d.ts +248 -0
  300. package/dist/client.d.ts.map +1 -0
  301. package/dist/client.js +367 -0
  302. package/dist/client.js.map +1 -0
  303. package/dist/client.rsc.d.ts +26 -0
  304. package/dist/client.rsc.d.ts.map +1 -0
  305. package/dist/client.rsc.js +46 -0
  306. package/dist/client.rsc.js.map +1 -0
  307. package/dist/component-utils.d.ts +36 -0
  308. package/dist/component-utils.d.ts.map +1 -0
  309. package/dist/component-utils.js +61 -0
  310. package/dist/component-utils.js.map +1 -0
  311. package/dist/components/DefaultDocument.d.ts +13 -0
  312. package/dist/components/DefaultDocument.d.ts.map +1 -0
  313. package/dist/components/DefaultDocument.js +15 -0
  314. package/dist/components/DefaultDocument.js.map +1 -0
  315. package/dist/debug.d.ts +58 -0
  316. package/dist/debug.d.ts.map +1 -0
  317. package/dist/debug.js +157 -0
  318. package/dist/debug.js.map +1 -0
  319. package/dist/default-error-boundary.d.ts +11 -0
  320. package/dist/default-error-boundary.d.ts.map +1 -0
  321. package/dist/default-error-boundary.js +45 -0
  322. package/dist/default-error-boundary.js.map +1 -0
  323. package/dist/deps/browser.d.ts +2 -0
  324. package/dist/deps/browser.d.ts.map +1 -0
  325. package/dist/deps/browser.js +3 -0
  326. package/dist/deps/browser.js.map +1 -0
  327. package/dist/deps/html-stream-client.d.ts +2 -0
  328. package/dist/deps/html-stream-client.d.ts.map +1 -0
  329. package/dist/deps/html-stream-client.js +3 -0
  330. package/dist/deps/html-stream-client.js.map +1 -0
  331. package/dist/deps/html-stream-server.d.ts +2 -0
  332. package/dist/deps/html-stream-server.d.ts.map +1 -0
  333. package/dist/deps/html-stream-server.js +3 -0
  334. package/dist/deps/html-stream-server.js.map +1 -0
  335. package/dist/deps/rsc.d.ts +2 -0
  336. package/dist/deps/rsc.d.ts.map +1 -0
  337. package/dist/deps/rsc.js +4 -0
  338. package/dist/deps/rsc.js.map +1 -0
  339. package/dist/deps/ssr.d.ts +2 -0
  340. package/dist/deps/ssr.d.ts.map +1 -0
  341. package/dist/deps/ssr.js +3 -0
  342. package/dist/deps/ssr.js.map +1 -0
  343. package/dist/errors.d.ts +174 -0
  344. package/dist/errors.d.ts.map +1 -0
  345. package/dist/errors.js +241 -0
  346. package/dist/errors.js.map +1 -0
  347. package/dist/handle.d.ts +78 -0
  348. package/dist/handle.d.ts.map +1 -0
  349. package/dist/handle.js +82 -0
  350. package/dist/handle.js.map +1 -0
  351. package/dist/handles/MetaTags.d.ts +14 -0
  352. package/dist/handles/MetaTags.d.ts.map +1 -0
  353. package/dist/handles/MetaTags.js +136 -0
  354. package/dist/handles/MetaTags.js.map +1 -0
  355. package/dist/handles/index.d.ts +6 -0
  356. package/dist/handles/index.d.ts.map +1 -0
  357. package/dist/handles/index.js +6 -0
  358. package/dist/handles/index.js.map +1 -0
  359. package/dist/handles/meta.d.ts +39 -0
  360. package/dist/handles/meta.d.ts.map +1 -0
  361. package/dist/handles/meta.js +202 -0
  362. package/dist/handles/meta.js.map +1 -0
  363. package/dist/host/__tests__/errors.test.d.ts +2 -0
  364. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  365. package/dist/host/__tests__/errors.test.js +76 -0
  366. package/dist/host/__tests__/errors.test.js.map +1 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  370. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  372. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  374. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  375. package/dist/host/__tests__/router.test.d.ts +2 -0
  376. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  377. package/dist/host/__tests__/router.test.js +241 -0
  378. package/dist/host/__tests__/router.test.js.map +1 -0
  379. package/dist/host/__tests__/testing.test.d.ts +2 -0
  380. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  381. package/dist/host/__tests__/testing.test.js +64 -0
  382. package/dist/host/__tests__/testing.test.js.map +1 -0
  383. package/dist/host/__tests__/utils.test.d.ts +2 -0
  384. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  385. package/dist/host/__tests__/utils.test.js +29 -0
  386. package/dist/host/__tests__/utils.test.js.map +1 -0
  387. package/dist/host/cookie-handler.d.ts +34 -0
  388. package/dist/host/cookie-handler.d.ts.map +1 -0
  389. package/dist/host/cookie-handler.js +124 -0
  390. package/dist/host/cookie-handler.js.map +1 -0
  391. package/dist/host/errors.d.ts +56 -0
  392. package/dist/host/errors.d.ts.map +1 -0
  393. package/dist/host/errors.js +79 -0
  394. package/dist/host/errors.js.map +1 -0
  395. package/dist/host/index.d.ts +29 -0
  396. package/dist/host/index.d.ts.map +1 -0
  397. package/dist/host/index.js +32 -0
  398. package/dist/host/index.js.map +1 -0
  399. package/dist/host/pattern-matcher.d.ts +36 -0
  400. package/dist/host/pattern-matcher.d.ts.map +1 -0
  401. package/dist/host/pattern-matcher.js +172 -0
  402. package/dist/host/pattern-matcher.js.map +1 -0
  403. package/dist/host/router.d.ts +26 -0
  404. package/dist/host/router.d.ts.map +1 -0
  405. package/dist/host/router.js +218 -0
  406. package/dist/host/router.js.map +1 -0
  407. package/dist/host/testing.d.ts +36 -0
  408. package/dist/host/testing.d.ts.map +1 -0
  409. package/dist/host/testing.js +55 -0
  410. package/dist/host/testing.js.map +1 -0
  411. package/dist/host/types.d.ts +115 -0
  412. package/dist/host/types.d.ts.map +1 -0
  413. package/dist/host/types.js +7 -0
  414. package/dist/host/types.js.map +1 -0
  415. package/dist/host/utils.d.ts +21 -0
  416. package/dist/host/utils.d.ts.map +1 -0
  417. package/dist/host/utils.js +23 -0
  418. package/dist/host/utils.js.map +1 -0
  419. package/dist/href-client.d.ts +131 -0
  420. package/dist/href-client.d.ts.map +1 -0
  421. package/dist/href-client.js +64 -0
  422. package/dist/href-client.js.map +1 -0
  423. package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
  424. package/dist/href-context.d.ts.map +1 -0
  425. package/dist/href-context.js +21 -0
  426. package/dist/href-context.js.map +1 -0
  427. package/dist/index.d.ts +73 -0
  428. package/dist/index.d.ts.map +1 -0
  429. package/dist/index.js +91 -0
  430. package/dist/index.js.map +1 -0
  431. package/dist/index.rsc.d.ts +32 -0
  432. package/dist/index.rsc.d.ts.map +1 -0
  433. package/dist/index.rsc.js +40 -0
  434. package/dist/index.rsc.js.map +1 -0
  435. package/dist/internal-debug.d.ts +2 -0
  436. package/dist/internal-debug.d.ts.map +1 -0
  437. package/dist/internal-debug.js +5 -0
  438. package/dist/internal-debug.js.map +1 -0
  439. package/dist/loader.d.ts +14 -0
  440. package/dist/loader.d.ts.map +1 -0
  441. package/dist/loader.js +20 -0
  442. package/dist/loader.js.map +1 -0
  443. package/dist/loader.rsc.d.ts +19 -0
  444. package/dist/loader.rsc.d.ts.map +1 -0
  445. package/dist/loader.rsc.js +99 -0
  446. package/dist/loader.rsc.js.map +1 -0
  447. package/dist/network-error-thrower.d.ts +17 -0
  448. package/dist/network-error-thrower.d.ts.map +1 -0
  449. package/dist/network-error-thrower.js +14 -0
  450. package/dist/network-error-thrower.js.map +1 -0
  451. package/dist/outlet-context.d.ts +13 -0
  452. package/dist/outlet-context.d.ts.map +1 -0
  453. package/dist/outlet-context.js +3 -0
  454. package/dist/outlet-context.js.map +1 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  456. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  457. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  458. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  459. package/dist/prerender/param-hash.d.ts +16 -0
  460. package/dist/prerender/param-hash.d.ts.map +1 -0
  461. package/dist/prerender/param-hash.js +36 -0
  462. package/dist/prerender/param-hash.js.map +1 -0
  463. package/dist/prerender/store.d.ts +38 -0
  464. package/dist/prerender/store.d.ts.map +1 -0
  465. package/dist/prerender/store.js +61 -0
  466. package/dist/prerender/store.js.map +1 -0
  467. package/dist/prerender.d.ts +66 -0
  468. package/dist/prerender.d.ts.map +1 -0
  469. package/dist/prerender.js +57 -0
  470. package/dist/prerender.js.map +1 -0
  471. package/dist/reverse.d.ts +196 -0
  472. package/dist/reverse.d.ts.map +1 -0
  473. package/dist/reverse.js +78 -0
  474. package/dist/reverse.js.map +1 -0
  475. package/dist/root-error-boundary.d.ts +33 -0
  476. package/dist/root-error-boundary.d.ts.map +1 -0
  477. package/dist/root-error-boundary.js +165 -0
  478. package/dist/root-error-boundary.js.map +1 -0
  479. package/dist/route-content-wrapper.d.ts +46 -0
  480. package/dist/route-content-wrapper.d.ts.map +1 -0
  481. package/dist/route-content-wrapper.js +77 -0
  482. package/dist/route-content-wrapper.js.map +1 -0
  483. package/dist/route-definition.d.ts +421 -0
  484. package/dist/route-definition.d.ts.map +1 -0
  485. package/dist/route-definition.js +868 -0
  486. package/dist/route-definition.js.map +1 -0
  487. package/dist/route-map-builder.d.ts +155 -0
  488. package/dist/route-map-builder.d.ts.map +1 -0
  489. package/dist/route-map-builder.js +237 -0
  490. package/dist/route-map-builder.js.map +1 -0
  491. package/dist/route-types.d.ts +165 -0
  492. package/dist/route-types.d.ts.map +1 -0
  493. package/dist/route-types.js +7 -0
  494. package/dist/route-types.js.map +1 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  496. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  497. package/dist/router/__tests__/handler-context.test.js +65 -0
  498. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  502. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  503. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  504. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  505. package/dist/router/__tests__/match-context.test.js +92 -0
  506. package/dist/router/__tests__/match-context.test.js.map +1 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  508. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  509. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  510. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  511. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  512. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  513. package/dist/router/__tests__/match-result.test.js +457 -0
  514. package/dist/router/__tests__/match-result.test.js.map +1 -0
  515. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  516. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  517. package/dist/router/__tests__/on-error.test.js +678 -0
  518. package/dist/router/__tests__/on-error.test.js.map +1 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  520. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  521. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  522. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  526. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  527. package/dist/router/error-handling.d.ts +77 -0
  528. package/dist/router/error-handling.d.ts.map +1 -0
  529. package/dist/router/error-handling.js +202 -0
  530. package/dist/router/error-handling.js.map +1 -0
  531. package/dist/router/handler-context.d.ts +20 -0
  532. package/dist/router/handler-context.d.ts.map +1 -0
  533. package/dist/router/handler-context.js +198 -0
  534. package/dist/router/handler-context.js.map +1 -0
  535. package/dist/router/intercept-resolution.d.ts +66 -0
  536. package/dist/router/intercept-resolution.d.ts.map +1 -0
  537. package/dist/router/intercept-resolution.js +246 -0
  538. package/dist/router/intercept-resolution.js.map +1 -0
  539. package/dist/router/loader-resolution.d.ts +64 -0
  540. package/dist/router/loader-resolution.d.ts.map +1 -0
  541. package/dist/router/loader-resolution.js +284 -0
  542. package/dist/router/loader-resolution.js.map +1 -0
  543. package/dist/router/logging.d.ts +15 -0
  544. package/dist/router/logging.d.ts.map +1 -0
  545. package/dist/router/logging.js +99 -0
  546. package/dist/router/logging.js.map +1 -0
  547. package/dist/router/manifest.d.ts +22 -0
  548. package/dist/router/manifest.d.ts.map +1 -0
  549. package/dist/router/manifest.js +181 -0
  550. package/dist/router/manifest.js.map +1 -0
  551. package/dist/router/match-api.d.ts +35 -0
  552. package/dist/router/match-api.d.ts.map +1 -0
  553. package/dist/router/match-api.js +406 -0
  554. package/dist/router/match-api.js.map +1 -0
  555. package/dist/router/match-context.d.ts +206 -0
  556. package/dist/router/match-context.d.ts.map +1 -0
  557. package/dist/router/match-context.js +17 -0
  558. package/dist/router/match-context.js.map +1 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  560. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  561. package/dist/router/match-middleware/background-revalidation.js +75 -0
  562. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  564. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  565. package/dist/router/match-middleware/cache-lookup.js +257 -0
  566. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  567. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  568. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  569. package/dist/router/match-middleware/cache-store.js +108 -0
  570. package/dist/router/match-middleware/cache-store.js.map +1 -0
  571. package/dist/router/match-middleware/index.d.ts +81 -0
  572. package/dist/router/match-middleware/index.d.ts.map +1 -0
  573. package/dist/router/match-middleware/index.js +80 -0
  574. package/dist/router/match-middleware/index.js.map +1 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  576. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  577. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  578. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  580. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  581. package/dist/router/match-middleware/segment-resolution.js +53 -0
  582. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  583. package/dist/router/match-pipelines.d.ts +147 -0
  584. package/dist/router/match-pipelines.d.ts.map +1 -0
  585. package/dist/router/match-pipelines.js +82 -0
  586. package/dist/router/match-pipelines.js.map +1 -0
  587. package/dist/router/match-result.d.ts +126 -0
  588. package/dist/router/match-result.d.ts.map +1 -0
  589. package/dist/router/match-result.js +93 -0
  590. package/dist/router/match-result.js.map +1 -0
  591. package/dist/router/metrics.d.ts +20 -0
  592. package/dist/router/metrics.d.ts.map +1 -0
  593. package/dist/router/metrics.js +47 -0
  594. package/dist/router/metrics.js.map +1 -0
  595. package/dist/router/middleware.d.ts +249 -0
  596. package/dist/router/middleware.d.ts.map +1 -0
  597. package/dist/router/middleware.js +434 -0
  598. package/dist/router/middleware.js.map +1 -0
  599. package/dist/router/middleware.test.d.ts +2 -0
  600. package/dist/router/middleware.test.d.ts.map +1 -0
  601. package/dist/router/middleware.test.js +816 -0
  602. package/dist/router/middleware.test.js.map +1 -0
  603. package/dist/router/pattern-matching.d.ts +149 -0
  604. package/dist/router/pattern-matching.d.ts.map +1 -0
  605. package/dist/router/pattern-matching.js +349 -0
  606. package/dist/router/pattern-matching.js.map +1 -0
  607. package/dist/router/revalidation.d.ts +44 -0
  608. package/dist/router/revalidation.d.ts.map +1 -0
  609. package/dist/router/revalidation.js +147 -0
  610. package/dist/router/revalidation.js.map +1 -0
  611. package/dist/router/router-context.d.ts +135 -0
  612. package/dist/router/router-context.d.ts.map +1 -0
  613. package/dist/router/router-context.js +36 -0
  614. package/dist/router/router-context.js.map +1 -0
  615. package/dist/router/segment-resolution.d.ts +127 -0
  616. package/dist/router/segment-resolution.d.ts.map +1 -0
  617. package/dist/router/segment-resolution.js +919 -0
  618. package/dist/router/segment-resolution.js.map +1 -0
  619. package/dist/router/trie-matching.d.ts +40 -0
  620. package/dist/router/trie-matching.d.ts.map +1 -0
  621. package/dist/router/trie-matching.js +127 -0
  622. package/dist/router/trie-matching.js.map +1 -0
  623. package/dist/router/types.d.ts +136 -0
  624. package/dist/router/types.d.ts.map +1 -0
  625. package/dist/router/types.js +7 -0
  626. package/dist/router/types.js.map +1 -0
  627. package/dist/router.d.ts +753 -0
  628. package/dist/router.d.ts.map +1 -0
  629. package/dist/router.gen.d.ts +6 -0
  630. package/dist/router.gen.d.ts.map +1 -0
  631. package/dist/router.gen.js +6 -0
  632. package/dist/router.gen.js.map +1 -0
  633. package/dist/router.js +1304 -0
  634. package/dist/router.js.map +1 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  636. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  637. package/dist/rsc/__tests__/helpers.test.js +140 -0
  638. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  639. package/dist/rsc/handler.d.ts +45 -0
  640. package/dist/rsc/handler.d.ts.map +1 -0
  641. package/dist/rsc/handler.js +1172 -0
  642. package/dist/rsc/handler.js.map +1 -0
  643. package/dist/rsc/helpers.d.ts +16 -0
  644. package/dist/rsc/helpers.d.ts.map +1 -0
  645. package/dist/rsc/helpers.js +55 -0
  646. package/dist/rsc/helpers.js.map +1 -0
  647. package/dist/rsc/index.d.ts +22 -0
  648. package/dist/rsc/index.d.ts.map +1 -0
  649. package/dist/rsc/index.js +23 -0
  650. package/dist/rsc/index.js.map +1 -0
  651. package/dist/rsc/nonce.d.ts +9 -0
  652. package/dist/rsc/nonce.d.ts.map +1 -0
  653. package/dist/rsc/nonce.js +18 -0
  654. package/dist/rsc/nonce.js.map +1 -0
  655. package/dist/rsc/types.d.ts +206 -0
  656. package/dist/rsc/types.d.ts.map +1 -0
  657. package/dist/rsc/types.js +8 -0
  658. package/dist/rsc/types.js.map +1 -0
  659. package/dist/search-params.d.ts +103 -0
  660. package/dist/search-params.d.ts.map +1 -0
  661. package/dist/search-params.js +74 -0
  662. package/dist/search-params.js.map +1 -0
  663. package/dist/segment-system.d.ts +75 -0
  664. package/dist/segment-system.d.ts.map +1 -0
  665. package/dist/segment-system.js +336 -0
  666. package/dist/segment-system.js.map +1 -0
  667. package/dist/server/context.d.ts +245 -0
  668. package/dist/server/context.d.ts.map +1 -0
  669. package/dist/server/context.js +197 -0
  670. package/dist/server/context.js.map +1 -0
  671. package/dist/server/fetchable-loader-store.d.ts +18 -0
  672. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  673. package/dist/server/fetchable-loader-store.js +18 -0
  674. package/dist/server/fetchable-loader-store.js.map +1 -0
  675. package/dist/server/handle-store.d.ts +85 -0
  676. package/dist/server/handle-store.d.ts.map +1 -0
  677. package/dist/server/handle-store.js +142 -0
  678. package/dist/server/handle-store.js.map +1 -0
  679. package/dist/server/loader-registry.d.ts +55 -0
  680. package/dist/server/loader-registry.d.ts.map +1 -0
  681. package/dist/server/loader-registry.js +132 -0
  682. package/dist/server/loader-registry.js.map +1 -0
  683. package/dist/server/request-context.d.ts +226 -0
  684. package/dist/server/request-context.d.ts.map +1 -0
  685. package/dist/server/request-context.js +290 -0
  686. package/dist/server/request-context.js.map +1 -0
  687. package/dist/server/root-layout.d.ts +4 -0
  688. package/dist/server/root-layout.d.ts.map +1 -0
  689. package/dist/server/root-layout.js +5 -0
  690. package/dist/server/root-layout.js.map +1 -0
  691. package/dist/server.d.ts +15 -0
  692. package/dist/server.d.ts.map +1 -0
  693. package/dist/server.js +20 -0
  694. package/dist/server.js.map +1 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  698. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  699. package/dist/ssr/index.d.ts +98 -0
  700. package/dist/ssr/index.d.ts.map +1 -0
  701. package/dist/ssr/index.js +158 -0
  702. package/dist/ssr/index.js.map +1 -0
  703. package/dist/static-handler.d.ts +50 -0
  704. package/dist/static-handler.d.ts.map +1 -0
  705. package/dist/static-handler.gen.d.ts +5 -0
  706. package/dist/static-handler.gen.d.ts.map +1 -0
  707. package/dist/static-handler.gen.js +5 -0
  708. package/dist/static-handler.gen.js.map +1 -0
  709. package/dist/static-handler.js +29 -0
  710. package/dist/static-handler.js.map +1 -0
  711. package/dist/theme/ThemeProvider.d.ts +20 -0
  712. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  713. package/dist/theme/ThemeProvider.js +240 -0
  714. package/dist/theme/ThemeProvider.js.map +1 -0
  715. package/dist/theme/ThemeScript.d.ts +48 -0
  716. package/dist/theme/ThemeScript.d.ts.map +1 -0
  717. package/dist/theme/ThemeScript.js +13 -0
  718. package/dist/theme/ThemeScript.js.map +1 -0
  719. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  720. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  721. package/dist/theme/__tests__/theme.test.js +103 -0
  722. package/dist/theme/__tests__/theme.test.js.map +1 -0
  723. package/dist/theme/constants.d.ts +29 -0
  724. package/dist/theme/constants.d.ts.map +1 -0
  725. package/dist/theme/constants.js +48 -0
  726. package/dist/theme/constants.js.map +1 -0
  727. package/dist/theme/index.d.ts +31 -0
  728. package/dist/theme/index.d.ts.map +1 -0
  729. package/dist/theme/index.js +36 -0
  730. package/dist/theme/index.js.map +1 -0
  731. package/dist/theme/theme-context.d.ts +40 -0
  732. package/dist/theme/theme-context.d.ts.map +1 -0
  733. package/dist/theme/theme-context.js +60 -0
  734. package/dist/theme/theme-context.js.map +1 -0
  735. package/dist/theme/theme-script.d.ts +27 -0
  736. package/dist/theme/theme-script.d.ts.map +1 -0
  737. package/dist/theme/theme-script.js +147 -0
  738. package/dist/theme/theme-script.js.map +1 -0
  739. package/dist/theme/types.d.ts +163 -0
  740. package/dist/theme/types.d.ts.map +1 -0
  741. package/dist/theme/types.js +11 -0
  742. package/dist/theme/types.js.map +1 -0
  743. package/dist/theme/use-theme.d.ts +12 -0
  744. package/dist/theme/use-theme.d.ts.map +1 -0
  745. package/dist/theme/use-theme.js +40 -0
  746. package/dist/theme/use-theme.js.map +1 -0
  747. package/dist/types.d.ts +1479 -0
  748. package/dist/types.d.ts.map +1 -0
  749. package/dist/types.js +10 -0
  750. package/dist/types.js.map +1 -0
  751. package/dist/urls.d.ts +441 -0
  752. package/dist/urls.d.ts.map +1 -0
  753. package/dist/urls.gen.d.ts +8 -0
  754. package/dist/urls.gen.d.ts.map +1 -0
  755. package/dist/urls.gen.js +8 -0
  756. package/dist/urls.gen.js.map +1 -0
  757. package/dist/urls.js +443 -0
  758. package/dist/urls.js.map +1 -0
  759. package/dist/use-loader.d.ts +127 -0
  760. package/dist/use-loader.d.ts.map +1 -0
  761. package/dist/use-loader.js +237 -0
  762. package/dist/use-loader.js.map +1 -0
  763. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  767. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  771. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  775. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  777. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  779. package/dist/vite/ast-handler-extract.d.ts +49 -0
  780. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  781. package/dist/vite/ast-handler-extract.js +249 -0
  782. package/dist/vite/ast-handler-extract.js.map +1 -0
  783. package/dist/vite/expose-action-id.d.ts +19 -0
  784. package/dist/vite/expose-action-id.d.ts.map +1 -0
  785. package/dist/vite/expose-action-id.js +250 -0
  786. package/dist/vite/expose-action-id.js.map +1 -0
  787. package/dist/vite/expose-id-utils.d.ts +69 -0
  788. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  789. package/dist/vite/expose-id-utils.js +289 -0
  790. package/dist/vite/expose-id-utils.js.map +1 -0
  791. package/dist/vite/expose-internal-ids.d.ts +22 -0
  792. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  793. package/dist/vite/expose-internal-ids.js +886 -0
  794. package/dist/vite/expose-internal-ids.js.map +1 -0
  795. package/dist/vite/index.d.ts +149 -0
  796. package/dist/vite/index.d.ts.map +1 -0
  797. package/dist/vite/index.js +5565 -2291
  798. package/dist/vite/index.js.bak +5448 -0
  799. package/dist/vite/index.js.map +1 -0
  800. package/dist/vite/index.named-routes.gen.ts +103 -0
  801. package/dist/vite/package-resolution.d.ts +43 -0
  802. package/dist/vite/package-resolution.d.ts.map +1 -0
  803. package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
  804. package/dist/vite/package-resolution.js.map +1 -0
  805. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  806. package/dist/vite/virtual-entries.d.ts +25 -0
  807. package/dist/vite/virtual-entries.d.ts.map +1 -0
  808. package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
  809. package/dist/vite/virtual-entries.js.map +1 -0
  810. package/package.json +72 -63
  811. package/skills/breadcrumbs/SKILL.md +252 -0
  812. package/skills/cache-guide/SKILL.md +294 -0
  813. package/skills/caching/SKILL.md +93 -23
  814. package/skills/composability/SKILL.md +172 -0
  815. package/skills/debug-manifest/SKILL.md +12 -8
  816. package/skills/document-cache/SKILL.md +18 -16
  817. package/skills/fonts/SKILL.md +6 -4
  818. package/skills/handler-use/SKILL.md +362 -0
  819. package/skills/hooks/SKILL.md +341 -71
  820. package/skills/host-router/SKILL.md +218 -0
  821. package/skills/intercept/SKILL.md +151 -8
  822. package/skills/layout/SKILL.md +122 -3
  823. package/skills/links/SKILL.md +158 -25
  824. package/skills/loader/SKILL.md +439 -46
  825. package/skills/middleware/SKILL.md +205 -37
  826. package/skills/migrate-nextjs/SKILL.md +560 -0
  827. package/skills/migrate-react-router/SKILL.md +765 -0
  828. package/skills/mime-routes/SKILL.md +15 -11
  829. package/skills/parallel/SKILL.md +263 -1
  830. package/skills/prerender/SKILL.md +467 -65
  831. package/skills/rango/SKILL.md +87 -21
  832. package/skills/response-routes/SKILL.md +152 -91
  833. package/skills/route/SKILL.md +281 -14
  834. package/skills/router-setup/SKILL.md +210 -32
  835. package/skills/streams-and-websockets/SKILL.md +283 -0
  836. package/skills/theme/SKILL.md +9 -8
  837. package/skills/typesafety/SKILL.md +327 -86
  838. package/skills/use-cache/SKILL.md +324 -0
  839. package/src/__internal.ts +102 -4
  840. package/src/bin/rango.ts +312 -15
  841. package/src/browser/action-coordinator.ts +97 -0
  842. package/src/browser/action-response-classifier.ts +99 -0
  843. package/src/browser/app-shell.ts +52 -0
  844. package/src/browser/app-version.ts +14 -0
  845. package/src/browser/event-controller.ts +92 -64
  846. package/src/browser/history-state.ts +80 -0
  847. package/src/browser/intercept-utils.ts +52 -0
  848. package/src/browser/link-interceptor.ts +24 -4
  849. package/src/browser/logging.ts +55 -0
  850. package/src/browser/merge-segment-loaders.ts +20 -12
  851. package/src/browser/navigation-bridge.ts +367 -561
  852. package/src/browser/navigation-client.ts +228 -70
  853. package/src/browser/navigation-store.ts +97 -55
  854. package/src/browser/navigation-transaction.ts +297 -0
  855. package/src/browser/network-error-handler.ts +61 -0
  856. package/src/browser/partial-update.ts +362 -316
  857. package/src/browser/prefetch/cache.ts +314 -0
  858. package/src/browser/prefetch/fetch.ts +282 -0
  859. package/src/browser/prefetch/observer.ts +65 -0
  860. package/src/browser/prefetch/policy.ts +48 -0
  861. package/src/browser/prefetch/queue.ts +191 -0
  862. package/src/browser/prefetch/resource-ready.ts +77 -0
  863. package/src/browser/rango-state.ts +152 -0
  864. package/src/browser/react/Link.tsx +255 -71
  865. package/src/browser/react/NavigationProvider.tsx +132 -17
  866. package/src/browser/react/context.ts +11 -0
  867. package/src/browser/react/filter-segment-order.ts +11 -0
  868. package/src/browser/react/index.ts +12 -12
  869. package/src/browser/react/location-state-shared.ts +95 -53
  870. package/src/browser/react/location-state.ts +60 -15
  871. package/src/browser/react/mount-context.ts +6 -1
  872. package/src/browser/react/nonce-context.ts +23 -0
  873. package/src/browser/react/shallow-equal.ts +27 -0
  874. package/src/browser/react/use-action.ts +29 -51
  875. package/src/browser/react/use-client-cache.ts +5 -3
  876. package/src/browser/react/use-handle.ts +30 -120
  877. package/src/browser/react/use-link-status.ts +6 -5
  878. package/src/browser/react/use-navigation.ts +44 -65
  879. package/src/browser/react/use-params.ts +75 -0
  880. package/src/browser/react/use-pathname.ts +47 -0
  881. package/src/browser/react/use-router.ts +83 -0
  882. package/src/browser/react/use-search-params.ts +56 -0
  883. package/src/browser/react/use-segments.ts +80 -97
  884. package/src/browser/response-adapter.ts +73 -0
  885. package/src/browser/rsc-router.tsx +246 -64
  886. package/src/browser/scroll-restoration.ts +127 -52
  887. package/src/browser/segment-reconciler.ts +243 -0
  888. package/src/browser/segment-structure-assert.ts +16 -0
  889. package/src/browser/server-action-bridge.ts +510 -603
  890. package/src/browser/shallow.ts +6 -1
  891. package/src/browser/types.ts +152 -48
  892. package/src/browser/validate-redirect-origin.ts +29 -0
  893. package/src/build/generate-manifest.ts +84 -23
  894. package/src/build/generate-route-types.ts +39 -752
  895. package/src/build/index.ts +6 -5
  896. package/src/build/route-trie.ts +83 -31
  897. package/src/build/route-types/ast-helpers.ts +25 -0
  898. package/src/build/route-types/ast-route-extraction.ts +98 -0
  899. package/src/build/route-types/codegen.ts +102 -0
  900. package/src/build/route-types/include-resolution.ts +418 -0
  901. package/src/build/route-types/param-extraction.ts +48 -0
  902. package/src/build/route-types/per-module-writer.ts +128 -0
  903. package/src/build/route-types/router-processing.ts +618 -0
  904. package/src/build/route-types/scan-filter.ts +85 -0
  905. package/src/build/runtime-discovery.ts +231 -0
  906. package/src/cache/background-task.ts +34 -0
  907. package/src/cache/cache-key-utils.ts +44 -0
  908. package/src/cache/cache-policy.ts +125 -0
  909. package/src/cache/cache-runtime.ts +342 -0
  910. package/src/cache/cache-scope.ts +167 -307
  911. package/src/cache/cf/cf-cache-store.ts +573 -21
  912. package/src/cache/cf/index.ts +13 -3
  913. package/src/cache/document-cache.ts +116 -77
  914. package/src/cache/handle-capture.ts +81 -0
  915. package/src/cache/handle-snapshot.ts +41 -0
  916. package/src/cache/index.ts +1 -15
  917. package/src/cache/memory-segment-store.ts +191 -13
  918. package/src/cache/profile-registry.ts +73 -0
  919. package/src/cache/read-through-swr.ts +134 -0
  920. package/src/cache/segment-codec.ts +256 -0
  921. package/src/cache/taint.ts +153 -0
  922. package/src/cache/types.ts +72 -122
  923. package/src/client.rsc.tsx +3 -1
  924. package/src/client.tsx +113 -301
  925. package/src/component-utils.ts +4 -4
  926. package/src/components/DefaultDocument.tsx +5 -1
  927. package/src/context-var.ts +156 -0
  928. package/src/debug.ts +19 -9
  929. package/src/errors.ts +77 -7
  930. package/src/handle.ts +55 -10
  931. package/src/handles/MetaTags.tsx +73 -20
  932. package/src/handles/breadcrumbs.ts +66 -0
  933. package/src/handles/index.ts +1 -0
  934. package/src/handles/meta.ts +30 -13
  935. package/src/host/cookie-handler.ts +21 -15
  936. package/src/host/errors.ts +8 -8
  937. package/src/host/index.ts +4 -7
  938. package/src/host/pattern-matcher.ts +27 -27
  939. package/src/host/router.ts +61 -39
  940. package/src/host/testing.ts +8 -8
  941. package/src/host/types.ts +15 -7
  942. package/src/host/utils.ts +1 -1
  943. package/src/href-client.ts +65 -45
  944. package/src/index.rsc.ts +138 -21
  945. package/src/index.ts +206 -51
  946. package/src/internal-debug.ts +11 -0
  947. package/src/loader.rsc.ts +25 -143
  948. package/src/loader.ts +27 -10
  949. package/src/network-error-thrower.tsx +3 -1
  950. package/src/outlet-context.ts +1 -1
  951. package/src/outlet-provider.tsx +45 -0
  952. package/src/prerender/param-hash.ts +4 -2
  953. package/src/prerender/store.ts +159 -13
  954. package/src/prerender.ts +397 -29
  955. package/src/response-utils.ts +28 -0
  956. package/src/reverse.ts +209 -121
  957. package/src/root-error-boundary.tsx +41 -29
  958. package/src/route-content-wrapper.tsx +7 -4
  959. package/src/route-definition/dsl-helpers.ts +1134 -0
  960. package/src/route-definition/helper-factories.ts +200 -0
  961. package/src/route-definition/helpers-types.ts +478 -0
  962. package/src/route-definition/index.ts +55 -0
  963. package/src/route-definition/redirect.ts +101 -0
  964. package/src/route-definition/resolve-handler-use.ts +155 -0
  965. package/src/route-definition.ts +1 -1431
  966. package/src/route-map-builder.ts +162 -123
  967. package/src/route-name.ts +53 -0
  968. package/src/route-types.ts +66 -9
  969. package/src/router/content-negotiation.ts +215 -0
  970. package/src/router/debug-manifest.ts +72 -0
  971. package/src/router/error-handling.ts +9 -9
  972. package/src/router/find-match.ts +160 -0
  973. package/src/router/handler-context.ts +455 -86
  974. package/src/router/intercept-resolution.ts +35 -20
  975. package/src/router/lazy-includes.ts +237 -0
  976. package/src/router/loader-resolution.ts +359 -128
  977. package/src/router/logging.ts +251 -0
  978. package/src/router/manifest.ts +98 -32
  979. package/src/router/match-api.ts +195 -261
  980. package/src/router/match-context.ts +4 -2
  981. package/src/router/match-handlers.ts +440 -0
  982. package/src/router/match-middleware/background-revalidation.ts +108 -93
  983. package/src/router/match-middleware/cache-lookup.ts +415 -86
  984. package/src/router/match-middleware/cache-store.ts +91 -29
  985. package/src/router/match-middleware/intercept-resolution.ts +48 -21
  986. package/src/router/match-middleware/segment-resolution.ts +73 -9
  987. package/src/router/match-pipelines.ts +10 -45
  988. package/src/router/match-result.ts +135 -35
  989. package/src/router/metrics.ts +240 -15
  990. package/src/router/middleware-cookies.ts +55 -0
  991. package/src/router/middleware-types.ts +200 -0
  992. package/src/router/middleware.ts +373 -371
  993. package/src/router/navigation-snapshot.ts +182 -0
  994. package/src/router/pattern-matching.ts +251 -44
  995. package/src/router/prerender-match.ts +502 -0
  996. package/src/router/preview-match.ts +98 -0
  997. package/src/router/request-classification.ts +310 -0
  998. package/src/router/revalidation.ts +152 -39
  999. package/src/router/route-snapshot.ts +245 -0
  1000. package/src/router/router-context.ts +41 -21
  1001. package/src/router/router-interfaces.ts +484 -0
  1002. package/src/router/router-options.ts +618 -0
  1003. package/src/router/router-registry.ts +24 -0
  1004. package/src/router/segment-resolution/fresh.ts +748 -0
  1005. package/src/router/segment-resolution/helpers.ts +268 -0
  1006. package/src/router/segment-resolution/loader-cache.ts +199 -0
  1007. package/src/router/segment-resolution/revalidation.ts +1384 -0
  1008. package/src/router/segment-resolution/static-store.ts +67 -0
  1009. package/src/router/segment-resolution.ts +21 -1315
  1010. package/src/router/segment-wrappers.ts +291 -0
  1011. package/src/router/telemetry-otel.ts +299 -0
  1012. package/src/router/telemetry.ts +300 -0
  1013. package/src/router/timeout.ts +148 -0
  1014. package/src/router/trie-matching.ts +103 -30
  1015. package/src/router/types.ts +17 -9
  1016. package/src/router/url-params.ts +49 -0
  1017. package/src/router.ts +647 -1988
  1018. package/src/rsc/handler-context.ts +45 -0
  1019. package/src/rsc/handler.ts +864 -1114
  1020. package/src/rsc/helpers.ts +181 -19
  1021. package/src/rsc/index.ts +0 -20
  1022. package/src/rsc/loader-fetch.ts +229 -0
  1023. package/src/rsc/manifest-init.ts +90 -0
  1024. package/src/rsc/nonce.ts +14 -0
  1025. package/src/rsc/origin-guard.ts +141 -0
  1026. package/src/rsc/progressive-enhancement.ts +393 -0
  1027. package/src/rsc/response-error.ts +37 -0
  1028. package/src/rsc/response-route-handler.ts +360 -0
  1029. package/src/rsc/rsc-rendering.ts +253 -0
  1030. package/src/rsc/runtime-warnings.ts +42 -0
  1031. package/src/rsc/server-action.ts +358 -0
  1032. package/src/rsc/ssr-setup.ts +128 -0
  1033. package/src/rsc/types.ts +46 -11
  1034. package/src/search-params.ts +230 -0
  1035. package/src/segment-content-promise.ts +67 -0
  1036. package/src/segment-loader-promise.ts +122 -0
  1037. package/src/segment-system.tsx +134 -36
  1038. package/src/server/context.ts +333 -59
  1039. package/src/server/cookie-store.ts +190 -0
  1040. package/src/server/fetchable-loader-store.ts +37 -0
  1041. package/src/server/handle-store.ts +113 -15
  1042. package/src/server/loader-registry.ts +24 -64
  1043. package/src/server/request-context.ts +603 -109
  1044. package/src/server.ts +35 -155
  1045. package/src/ssr/index.tsx +103 -30
  1046. package/src/static-handler.ts +126 -0
  1047. package/src/theme/ThemeProvider.tsx +21 -15
  1048. package/src/theme/ThemeScript.tsx +5 -5
  1049. package/src/theme/constants.ts +5 -2
  1050. package/src/theme/index.ts +4 -14
  1051. package/src/theme/theme-context.ts +4 -30
  1052. package/src/theme/theme-script.ts +21 -18
  1053. package/src/types/boundaries.ts +158 -0
  1054. package/src/types/cache-types.ts +198 -0
  1055. package/src/types/error-types.ts +192 -0
  1056. package/src/types/global-namespace.ts +100 -0
  1057. package/src/types/handler-context.ts +759 -0
  1058. package/src/types/index.ts +88 -0
  1059. package/src/types/loader-types.ts +209 -0
  1060. package/src/types/request-scope.ts +126 -0
  1061. package/src/types/route-config.ts +170 -0
  1062. package/src/types/route-entry.ts +120 -0
  1063. package/src/types/segments.ts +150 -0
  1064. package/src/types.ts +1 -1757
  1065. package/src/urls/include-helper.ts +207 -0
  1066. package/src/urls/index.ts +53 -0
  1067. package/src/urls/path-helper-types.ts +372 -0
  1068. package/src/urls/path-helper.ts +364 -0
  1069. package/src/urls/pattern-types.ts +107 -0
  1070. package/src/urls/response-types.ts +108 -0
  1071. package/src/urls/type-extraction.ts +372 -0
  1072. package/src/urls/urls-function.ts +98 -0
  1073. package/src/urls.ts +1 -1282
  1074. package/src/use-loader.tsx +161 -81
  1075. package/src/vite/debug.ts +184 -0
  1076. package/src/vite/discovery/bundle-postprocess.ts +181 -0
  1077. package/src/vite/discovery/discover-routers.ts +376 -0
  1078. package/src/vite/discovery/prerender-collection.ts +486 -0
  1079. package/src/vite/discovery/route-types-writer.ts +258 -0
  1080. package/src/vite/discovery/self-gen-tracking.ts +47 -0
  1081. package/src/vite/discovery/state.ts +117 -0
  1082. package/src/vite/discovery/virtual-module-codegen.ts +203 -0
  1083. package/src/vite/index.ts +15 -1963
  1084. package/src/vite/plugin-types.ts +103 -0
  1085. package/src/vite/plugins/cjs-to-esm.ts +98 -0
  1086. package/src/vite/plugins/client-ref-dedup.ts +131 -0
  1087. package/src/vite/plugins/client-ref-hashing.ts +117 -0
  1088. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1089. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1090. package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
  1091. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +107 -64
  1092. package/src/vite/plugins/expose-id-utils.ts +299 -0
  1093. package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
  1094. package/src/vite/plugins/expose-ids/handler-transform.ts +209 -0
  1095. package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
  1096. package/src/vite/plugins/expose-ids/router-transform.ts +127 -0
  1097. package/src/vite/plugins/expose-ids/types.ts +45 -0
  1098. package/src/vite/plugins/expose-internal-ids.ts +816 -0
  1099. package/src/vite/plugins/performance-tracks.ts +96 -0
  1100. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1101. package/src/vite/plugins/use-cache-transform.ts +336 -0
  1102. package/src/vite/plugins/version-injector.ts +83 -0
  1103. package/src/vite/plugins/version-plugin.ts +266 -0
  1104. package/src/vite/plugins/virtual-entries.ts +123 -0
  1105. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  1106. package/src/vite/rango.ts +497 -0
  1107. package/src/vite/router-discovery.ts +1111 -0
  1108. package/src/vite/utils/ast-handler-extract.ts +517 -0
  1109. package/src/vite/utils/banner.ts +36 -0
  1110. package/src/vite/utils/bundle-analysis.ts +137 -0
  1111. package/src/vite/utils/manifest-utils.ts +70 -0
  1112. package/src/vite/utils/package-resolution.ts +161 -0
  1113. package/src/vite/utils/prerender-utils.ts +221 -0
  1114. package/src/vite/utils/shared-utils.ts +170 -0
  1115. package/CLAUDE.md +0 -43
  1116. package/src/browser/lru-cache.ts +0 -69
  1117. package/src/browser/request-controller.ts +0 -164
  1118. package/src/cache/memory-store.ts +0 -253
  1119. package/src/router.gen.ts +0 -6
  1120. package/src/urls.gen.ts +0 -8
  1121. package/src/vite/expose-handle-id.ts +0 -209
  1122. package/src/vite/expose-loader-id.ts +0 -426
  1123. package/src/vite/expose-location-state-id.ts +0 -177
  1124. package/src/vite/expose-prerender-handler-id.ts +0 -429
  1125. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
@@ -5,15 +5,28 @@ import type {
5
5
  ResolvedSegment,
6
6
  } from "./types.js";
7
7
  import type { ReactNode } from "react";
8
+ import * as React from "react";
8
9
  import { startTransition } from "react";
10
+
11
+ // addTransitionType is only available in React experimental
12
+ const addTransitionType: ((type: string) => void) | undefined =
13
+ "addTransitionType" in React ? (React as any).addTransitionType : undefined;
9
14
  import type { RenderSegmentsOptions } from "../segment-system.js";
10
- import {
11
- mergeSegmentLoaders,
12
- needsLoaderMerge,
13
- insertMissingDiffSegments,
14
- } from "./merge-segment-loaders.js";
15
- import { assertSegmentStructure } from "./segment-structure-assert.js";
16
- import type { BoundTransaction } from "./navigation-bridge.js";
15
+ import { reconcileSegments } from "./segment-reconciler.js";
16
+ import type { ReconcileActor } from "./segment-reconciler.js";
17
+ import { hasActiveIntercept as hasActiveInterceptSlots } from "./intercept-utils.js";
18
+ import type { BoundTransaction } from "./navigation-transaction.js";
19
+ import { ServerRedirect } from "../errors.js";
20
+ import { debugLog } from "./logging.js";
21
+ import { validateRedirectOrigin } from "./validate-redirect-origin.js";
22
+ import type { NavigationUpdate } from "./types.js";
23
+
24
+ /** Build a scroll payload from the commit's scroll option */
25
+ function toScrollPayload(
26
+ scroll: boolean | undefined,
27
+ ): NonNullable<NavigationUpdate["scroll"]> {
28
+ return { enabled: scroll !== false ? scroll : false };
29
+ }
17
30
 
18
31
  /**
19
32
  * Configuration for creating a partial updater
@@ -26,8 +39,15 @@ export interface PartialUpdateConfig {
26
39
  segments: ResolvedSegment[],
27
40
  options?: RenderSegmentsOptions,
28
41
  ) => Promise<ReactNode> | ReactNode;
29
- /** RSC version received from server (from initial payload metadata) */
30
- version?: string;
42
+ /** RSC version getter returns the current version (may change after HMR) */
43
+ getVersion?: () => string | undefined;
44
+ /**
45
+ * Replace the active app-shell when a cross-app navigation is detected.
46
+ * Called before the full-update tree replacement renders, so the new
47
+ * payload's rootLayout, basename, and version are picked up. Theme,
48
+ * warmup, and prefetch TTL are not part of the shell — see AppShell.
49
+ */
50
+ applyAppShell?: (next: import("./app-shell.js").AppShell) => void;
31
51
  }
32
52
 
33
53
  /**
@@ -42,12 +62,30 @@ export interface CommitOverrides {
42
62
  intercept?: boolean;
43
63
  /** Source URL where intercept was triggered from */
44
64
  interceptSourceUrl?: string;
65
+ /** Server-set location state to merge into history.pushState */
66
+ serverState?: Record<string, unknown>;
45
67
  }
46
68
 
47
69
  /**
48
- * Commit context passed to partial updater for URL updates
49
- * Transaction encapsulates all store mutations for atomic commit
70
+ * Discriminated update mode for partial updates.
50
71
  */
72
+ export type UpdateMode =
73
+ | {
74
+ type: "navigate";
75
+ /** Cached segments for the target URL. When provided, these are used to build
76
+ * the segment map instead of the current page's segments. This ensures consistency
77
+ * when we send cached segment IDs to the server - if the server returns empty diff,
78
+ * we use the same segments we told the server we have. */
79
+ targetCacheSegments?: ResolvedSegment[];
80
+ /** Cached handle data for the target URL. When server returns empty diff and we're
81
+ * rendering from cache, this is passed to the UI to restore breadcrumbs etc. */
82
+ targetCacheHandleData?: Record<string, Record<string, unknown[]>>;
83
+ /** Source URL for intercept restore (popstate cache miss) */
84
+ interceptSourceUrl?: string;
85
+ }
86
+ | { type: "leave-intercept" }
87
+ | { type: "stale-revalidation"; interceptSourceUrl?: string }
88
+ | { type: "action"; interceptSourceUrl?: string };
51
89
 
52
90
  /**
53
91
  * Type for the fetchPartialUpdate function
@@ -57,24 +95,9 @@ export type PartialUpdater = (
57
95
  segmentIds: string[] | undefined,
58
96
  isRetry: boolean,
59
97
  signal: AbortSignal | undefined,
60
- type: BoundTransaction,
61
- options?: {
62
- isAction?: boolean;
63
- staleRevalidation?: boolean;
64
- interceptSourceUrl?: string;
65
- /** Cached segments for the target URL. When provided, these are used to build
66
- * the segment map instead of the current page's segments. This ensures consistency
67
- * when we send cached segment IDs to the server - if the server returns empty diff,
68
- * we use the same segments we told the server we have. */
69
- targetCacheSegments?: ResolvedSegment[];
70
- /** Cached handle data for the target URL. When server returns empty diff and we're
71
- * rendering from cache, this is passed to the UI to restore breadcrumbs etc. */
72
- targetCacheHandleData?: Record<string, Record<string, unknown[]>>;
73
- /** When true, we're leaving an intercept state - don't use current segment IDs
74
- * as fallback and force a fresh render from server */
75
- leavingIntercept?: boolean;
76
- },
77
- ) => Promise<Promise<void>>;
98
+ tx: BoundTransaction,
99
+ mode?: UpdateMode,
100
+ ) => Promise<void>;
78
101
 
79
102
  /**
80
103
  * Create a partial updater for fetching and applying RSC partial updates
@@ -84,39 +107,30 @@ export type PartialUpdater = (
84
107
  *
85
108
  * @param config - Partial update configuration
86
109
  * @returns fetchPartialUpdate function
87
- *
88
- * @example
89
- * ```typescript
90
- * const fetchPartialUpdate = createPartialUpdater({
91
- * store,
92
- * client,
93
- * onUpdate: (update) => store.emit(update),
94
- * renderSegments,
95
- * });
96
- *
97
- * await fetchPartialUpdate('/new-page');
98
- * ```
99
110
  */
100
111
  export function createPartialUpdater(
101
112
  config: PartialUpdateConfig,
102
113
  ): PartialUpdater {
103
- const { store, client, onUpdate, renderSegments, version } = config;
114
+ const {
115
+ store,
116
+ client,
117
+ onUpdate,
118
+ renderSegments,
119
+ getVersion = () => undefined,
120
+ applyAppShell,
121
+ } = config;
104
122
 
105
123
  /**
106
- * Build a lookup map from current page's cached segments
124
+ * Get current page's cached segments as an array
107
125
  */
108
- function getCurrentSegmentMap(): Map<string, ResolvedSegment> {
126
+ function getCurrentCachedSegments(): ResolvedSegment[] {
109
127
  const currentKey = store.getHistoryKey();
110
128
  const cached = store.getCachedSegments(currentKey);
111
- const cachedSegments = cached?.segments || [];
112
- const map = new Map<string, ResolvedSegment>();
113
- cachedSegments.forEach((s) => map.set(s.id, s));
114
- return map;
129
+ return cached?.segments || [];
115
130
  }
116
131
 
117
132
  /**
118
133
  * Fetch partial update and trigger UI update
119
- * Returns a promise that resolves when the RSC stream is fully consumed
120
134
  *
121
135
  * @param tx - Transaction for committing segment state (required)
122
136
  * @param signal - AbortSignal to check if navigation is stale (not for aborting fetch)
@@ -127,251 +141,275 @@ export function createPartialUpdater(
127
141
  isRetry: boolean,
128
142
  signal: AbortSignal | undefined,
129
143
  tx: BoundTransaction,
130
- options?: {
131
- isAction?: boolean;
132
- staleRevalidation?: boolean;
133
- interceptSourceUrl?: string;
134
- targetCacheSegments?: ResolvedSegment[];
135
- targetCacheHandleData?: Record<string, Record<string, unknown[]>>;
136
- leavingIntercept?: boolean;
137
- },
138
- ): Promise<Promise<void>> {
139
- const {
140
- isAction = false,
141
- staleRevalidation = false,
142
- interceptSourceUrl,
143
- targetCacheSegments,
144
- targetCacheHandleData,
145
- leavingIntercept = false,
146
- } = options || {};
144
+ mode: UpdateMode = { type: "navigate" },
145
+ ): Promise<void> {
147
146
  const segmentState = store.getSegmentState();
148
147
  const url = targetUrl || window.location.href;
149
148
 
150
149
  // Capture history key at start for stale revalidation consistency check
151
150
  const historyKeyAtStart = store.getHistoryKey();
152
151
 
153
- // When leaving intercept, don't send current segment IDs - we need fresh non-intercept segments
154
- // Filter out intercept-related segments (parallel slots like @modal) from current segments
152
+ // Derive interceptSourceUrl from modes that carry it
153
+ const interceptSourceUrl =
154
+ mode.type === "stale-revalidation" ||
155
+ mode.type === "action" ||
156
+ mode.type === "navigate"
157
+ ? mode.interceptSourceUrl
158
+ : undefined;
159
+
160
+ // When leaving intercept, filter out intercept-specific segments
155
161
  let segments: string[];
156
- if (leavingIntercept) {
157
- // When leaving intercept, only send segments that aren't intercept-specific
158
- // The server will return the non-intercept version of the route
162
+ if (mode.type === "leave-intercept") {
159
163
  const currentSegments = segmentIds ?? segmentState.currentSegmentIds;
160
- // Filter out modal/intercept segments - keep only the base route segments
161
-
162
- // TODO: why this?
163
- segments = currentSegments.filter((id) => !id.includes(".@"));
164
- console.log(
164
+ const currentCached = getCurrentCachedSegments();
165
+ const interceptIds = new Set(
166
+ currentCached
167
+ .filter((s) => s.namespace?.startsWith("intercept:"))
168
+ .map((s) => s.id),
169
+ );
170
+ segments = currentSegments.filter((id) => !interceptIds.has(id));
171
+ debugLog(
165
172
  `[Browser] Leaving intercept - filtered segments: ${segments.join(", ")}`,
166
173
  );
167
174
  } else {
168
175
  segments = segmentIds ?? segmentState.currentSegmentIds;
169
176
  }
170
177
 
171
- // For intercept revalidation, use the intercept source URL as previousUrl
172
- // This tells the server the route should be treated as an intercept
178
+ // For intercept revalidation, use the intercept source URL as previousUrl.
179
+ // For leave-intercept, tx.currentUrl captures window.location.href at tx
180
+ // creation, which on popstate is already the destination URL and would
181
+ // tell the server "from == to". segmentState.currentUrl still points at
182
+ // the URL the cached segments render (the intercept URL), which is the
183
+ // correct "from" for the server's diff computation.
173
184
  const previousUrl =
174
- interceptSourceUrl || tx.currentUrl || segmentState.currentUrl;
175
-
176
- console.log(`\n[Browser] >>> NAVIGATION`);
177
- console.log(`[Browser] From: ${previousUrl}`);
178
- console.log(`[Browser] To: ${url}`);
179
- console.log(`[Browser] Segments to send: ${segments.join(", ")}`);
185
+ mode.type === "leave-intercept"
186
+ ? segmentState.currentUrl || tx.currentUrl
187
+ : interceptSourceUrl || tx.currentUrl || segmentState.currentUrl;
188
+
189
+ debugLog(`\n[Browser] >>> NAVIGATION`);
190
+ debugLog(`[Browser] From: ${previousUrl}`);
191
+ debugLog(`[Browser] To: ${url}`);
192
+ debugLog(`[Browser] Segments to send: ${segments.join(", ")}`);
180
193
  if (interceptSourceUrl) {
181
- console.log(`[Browser] Intercept context from: ${interceptSourceUrl}`);
194
+ debugLog(`[Browser] Intercept context from: ${interceptSourceUrl}`);
182
195
  }
183
196
 
184
- // Build segment map for merging with server diff.
185
- // When targetCacheSegments is provided (navigating to a cached route), use those
186
- // to ensure consistency - we use the same segments we told the server we have.
197
+ // Get cached segments for merging with server diff.
198
+ // When navigating with targetCacheSegments, use those for consistency.
187
199
  // Otherwise fall back to current page's segments (for same-route revalidation).
188
- let currentSegmentMap: Map<string, ResolvedSegment>;
189
- if (targetCacheSegments && targetCacheSegments.length > 0) {
190
- currentSegmentMap = new Map();
191
- targetCacheSegments.forEach((s) => currentSegmentMap.set(s.id, s));
192
- } else {
193
- currentSegmentMap = getCurrentSegmentMap();
194
- }
195
- // Mark navigation as streaming (response received, now parsing RSC)
196
- // The token is ended when the stream completes
197
- const streamingToken = tx.startStreaming();
200
+ const targetCache =
201
+ mode.type === "navigate" ? mode.targetCacheSegments : undefined;
202
+ const cachedSegs =
203
+ targetCache && targetCache.length > 0
204
+ ? targetCache
205
+ : getCurrentCachedSegments();
206
+ const cachedSegsSource =
207
+ targetCache && targetCache.length > 0 ? "history-cache" : "current-page";
208
+ debugLog(
209
+ `[Browser] cachedSegs source: ${cachedSegsSource} (${cachedSegs.length} segments: ${cachedSegs.map((s) => s.id).join(", ")})`,
210
+ );
211
+
198
212
  // Fetch partial payload (no abort signal - RSC doesn't support it well)
199
- const { payload, streamComplete: rawStreamComplete } =
200
- await client.fetchPartial({
201
- targetUrl: url,
202
- segmentIds: segments,
203
- previousUrl,
204
- staleRevalidation,
205
- version,
206
- });
207
- console.log("payload.metadata", payload.metadata);
213
+ let fetchResult: Awaited<ReturnType<NavigationClient["fetchPartial"]>>;
214
+ fetchResult = await client.fetchPartial({
215
+ targetUrl: url,
216
+ segmentIds: segments,
217
+ previousUrl,
218
+ // Mark stale when explicitly requested OR when no segments are sent
219
+ // (action redirect sends empty segments for a fresh render).
220
+ staleRevalidation:
221
+ mode.type === "stale-revalidation" || segments.length === 0,
222
+ version: getVersion(),
223
+ routerId: store.getRouterId?.(),
224
+ });
225
+ // Mark navigation as streaming (response received, now parsing RSC).
226
+ // Called after fetchPartial so pendingUrl stays set during the network wait,
227
+ // allowing useLinkStatus to show per-link pending indicators.
228
+ const streamingToken = tx.startStreaming();
229
+ const { payload, streamComplete: rawStreamComplete } = fetchResult;
230
+ debugLog("payload.metadata", payload.metadata);
208
231
 
209
232
  const streamComplete = rawStreamComplete.then(() => {
210
233
  streamingToken.end();
211
234
  });
212
235
 
236
+ // Detect app switch: if routerId changed, the navigation crossed into
237
+ // a different router (e.g., via host router path mount). Downgrade
238
+ // partial to full so the entire tree is replaced without reconciliation
239
+ // against stale segments from the previous app, and replace the app
240
+ // shell (rootLayout, basename, version) so the target app's document
241
+ // and router config take effect instead of remaining captured from the
242
+ // initial load. Theme, warmup, and prefetch TTL are intentionally
243
+ // document-lifetime (see AppShell doc); a new document navigation
244
+ // applies them.
245
+ if (payload.metadata?.routerId) {
246
+ const prevRouterId = store.getRouterId?.();
247
+ if (prevRouterId && prevRouterId !== payload.metadata.routerId) {
248
+ debugLog(
249
+ `[Browser] App switch detected (${prevRouterId} → ${payload.metadata.routerId}), forcing full update`,
250
+ );
251
+ payload.metadata.isPartial = false;
252
+ applyAppShell?.({
253
+ routerId: payload.metadata.routerId,
254
+ rootLayout: payload.metadata.rootLayout,
255
+ basename: payload.metadata.basename,
256
+ version: payload.metadata.version,
257
+ });
258
+ }
259
+ store.setRouterId?.(payload.metadata.routerId);
260
+ }
261
+
262
+ // Handle server-side redirect with state
263
+ if (payload.metadata?.redirect) {
264
+ if (signal?.aborted) {
265
+ debugLog("[Browser] Ignoring stale redirect (aborted)");
266
+ return;
267
+ }
268
+ const redirectUrl = validateRedirectOrigin(
269
+ payload.metadata.redirect.url,
270
+ window.location.origin,
271
+ );
272
+ if (!redirectUrl) {
273
+ debugLog("[Browser] Ignoring blocked redirect payload");
274
+ return;
275
+ }
276
+ const serverState = payload.metadata.locationState;
277
+ throw new ServerRedirect(redirectUrl, serverState);
278
+ }
279
+
213
280
  if (payload.metadata?.isPartial) {
214
281
  const { segments: newSegments, matched, diff } = payload.metadata;
215
282
 
216
283
  // Check if this navigation is stale (a newer one started)
217
284
  if (signal?.aborted) {
218
- console.log(`[Browser] Ignoring stale navigation (aborted)`);
219
- return streamComplete;
285
+ debugLog("[Browser] Ignoring stale navigation (aborted)");
286
+ return;
220
287
  }
221
288
 
222
- console.log(`[Browser] Partial update - matched: ${matched?.join(", ")}`);
223
- console.log(`[Browser] Diff: ${diff?.join(", ")}`);
224
-
225
- // Create lookup for new segments from server
226
- const newSegmentMap = new Map<string, ResolvedSegment>();
227
- (newSegments || []).forEach((s: ResolvedSegment) =>
228
- newSegmentMap.set(s.id, s),
229
- );
289
+ debugLog(`[Browser] Partial update - matched: ${matched?.join(", ")}`);
290
+ debugLog(`[Browser] Diff: ${diff?.join(", ")}`);
230
291
 
231
292
  // If diff is empty, nothing changed on server side.
232
- // However, if we're navigating with targetCacheSegments (to a different route),
233
- // we still need to render those segments since the UI is showing the old route.
234
293
  if (!diff || diff.length === 0) {
235
294
  const matchedIds = matched || [];
295
+ const cacheMap = new Map(cachedSegs.map((s) => [s.id, s]));
236
296
  const existingSegments = matchedIds
237
- .map((id: string) => currentSegmentMap.get(id))
297
+ .map((id: string) => cacheMap.get(id))
238
298
  .filter(Boolean) as ResolvedSegment[];
239
299
 
240
300
  // When navigating with cached segments to a different route, render them.
241
- // targetCacheSegments being provided means we're navigating to a cached route.
242
- if (targetCacheSegments && targetCacheSegments.length > 0) {
243
- console.log(
244
- `[Browser] No diff but navigating with cached segments - rendering target route`,
301
+ if (mode.type === "navigate" && targetCache && targetCache.length > 0) {
302
+ debugLog(
303
+ "[Browser] No diff but navigating with cached segments - rendering target route",
245
304
  );
246
305
 
247
306
  const newTree = await renderSegments(existingSegments, {
248
307
  forceAwait: true,
249
308
  });
250
309
 
251
- tx.commit(matchedIds, existingSegments);
310
+ const { scroll: commitScroll } = tx.commit(
311
+ matchedIds,
312
+ existingSegments,
313
+ );
314
+
315
+ // tx.commit() cached the source page's handleData because
316
+ // eventController hasn't been updated yet. Overwrite with the
317
+ // correct cached handleData to prevent cache corruption on
318
+ // subsequent navigations to this same URL.
319
+ if (mode.targetCacheHandleData) {
320
+ store.updateCacheHandleData(
321
+ store.getHistoryKey(),
322
+ mode.targetCacheHandleData,
323
+ );
324
+ }
252
325
 
253
326
  // Include cachedHandleData in metadata so NavigationProvider can restore
254
327
  // breadcrumbs and other handle data from cache.
255
- // IMPORTANT: Remove `handles` from metadata to prevent NavigationProvider from
328
+ // Remove `handles` from metadata to prevent NavigationProvider from
256
329
  // processing an empty handles stream, which would clear the cached breadcrumbs.
257
- // When rendering from cache with empty diff, we want to use cachedHandleData instead.
258
330
  const { handles: _unusedHandles, ...metadataWithoutHandles } =
259
331
  payload.metadata!;
260
- onUpdate({
332
+ const cachedUpdate = {
261
333
  root: newTree,
262
334
  metadata: {
263
335
  ...metadataWithoutHandles,
264
- cachedHandleData: targetCacheHandleData,
336
+ cachedHandleData: mode.targetCacheHandleData,
265
337
  },
266
- });
338
+ scroll: toScrollPayload(commitScroll),
339
+ };
340
+
341
+ const cachedHasTransition = existingSegments.some(
342
+ (s) => s.transition,
343
+ );
344
+ if (cachedHasTransition) {
345
+ startTransition(() => {
346
+ if (addTransitionType) {
347
+ addTransitionType("navigation");
348
+ }
349
+ onUpdate(cachedUpdate);
350
+ });
351
+ } else {
352
+ onUpdate(cachedUpdate);
353
+ }
267
354
 
268
- console.log(`[Browser] Navigation complete (rendered from cache)\n`);
269
- return streamComplete;
355
+ debugLog("[Browser] Navigation complete (rendered from cache)");
356
+ return;
270
357
  }
271
358
 
272
359
  // When leaving intercept, force re-render even with empty diff
273
- // The matched segments are the non-intercept segments, which we need to render
274
- // to remove the modal from the UI
275
- if (leavingIntercept) {
276
- console.log(
277
- `[Browser] Leaving intercept - forcing re-render to remove modal`,
360
+ if (mode.type === "leave-intercept") {
361
+ debugLog(
362
+ "[Browser] Leaving intercept - forcing re-render to remove modal",
278
363
  );
279
364
 
280
365
  const newTree = await renderSegments(existingSegments, {
281
366
  forceAwait: true,
282
367
  });
283
368
 
284
- tx.commit(matchedIds, existingSegments);
369
+ const { scroll: leaveScroll } = tx.commit(
370
+ matchedIds,
371
+ existingSegments,
372
+ );
285
373
 
286
374
  onUpdate({
287
375
  root: newTree,
288
376
  metadata: payload.metadata,
377
+ scroll: toScrollPayload(leaveScroll),
289
378
  });
290
379
 
291
- console.log(`[Browser] Navigation complete (left intercept)\n`);
292
- return streamComplete;
380
+ debugLog("[Browser] Navigation complete (left intercept)");
381
+ return;
293
382
  }
294
383
 
295
384
  // Same route revalidation with no changes - skip UI update
296
- console.log(
297
- `[Browser] No changes - all revalidations returned false, keeping existing UI`,
385
+ debugLog(
386
+ "[Browser] No changes - all revalidations returned false, keeping existing UI",
298
387
  );
299
388
  tx.commit(matchedIds, existingSegments);
300
- console.log(`[Browser] Navigation complete (no re-render)\n`);
301
- return streamComplete;
389
+ debugLog("[Browser] Navigation complete (no re-render)");
390
+ return;
302
391
  }
303
392
 
304
- // Build full segment list by merging:
305
- // - New/changed segments from server response (diff)
306
- // - Unchanged segments from current page's cache
393
+ // Reconcile server segments with cached segments (single source of truth)
307
394
  const matchedIds = matched || [];
308
- console.log(`[Browser] matchedIds: ${matchedIds.join(", ")}`);
309
- console.log(
310
- `[Browser] currentSegmentMap keys: ${[...currentSegmentMap.keys()].join(", ")}`,
311
- );
312
- console.log(
313
- `[Browser] newSegmentMap keys: ${[...newSegmentMap.keys()].join(", ")}`,
314
- newSegmentMap,
315
- );
316
-
317
- // First pass: build segments from matched IDs
318
- const matchedIdSet = new Set(matchedIds);
319
- const allSegments = matchedIds
320
- .map((id: string) => {
321
- // First check server response (new/updated segments)
322
- const fromServer = newSegmentMap.get(id);
323
- if (fromServer) {
324
- // For partial revalidation (stale or action), merge server's new loader data
325
- // with cached loader data when server returns fewer loaders than cached
326
- const fromCache = currentSegmentMap.get(id);
327
- // Dev-mode assertion: warn if tree structure would change
328
- if (fromCache) {
329
- assertSegmentStructure(fromCache, fromServer, "partial-update");
330
- }
331
- if (
332
- (staleRevalidation || isAction) &&
333
- needsLoaderMerge(fromServer, fromCache)
334
- ) {
335
- return mergeSegmentLoaders(fromServer, fromCache);
336
- }
337
- // When server returns component: null for a layout segment, it means
338
- // "this segment doesn't need re-rendering" - preserve the cached component
339
- // to maintain the outlet chain and prevent React tree changes
340
- if (
341
- fromServer.component === null &&
342
- fromServer.type === "layout" &&
343
- fromCache?.component != null
344
- ) {
345
- console.log(
346
- `[Browser] Preserving cached component for layout ${id} (server returned null)`,
347
- );
348
- return { ...fromServer, component: fromCache.component };
349
- }
350
- return fromServer;
351
- }
352
- // Fall back to current page's cached segments
353
- const fromCache = currentSegmentMap.get(id);
354
- if (!fromCache) {
355
- console.warn(`[Browser] Missing segment: ${id}`);
356
- return fromCache;
357
- }
358
- // Clear loading for cached segments to prevent suspense - server decided
359
- // this segment doesn't need re-rendering, so show content as-is
360
- if (fromCache.loading !== undefined) {
361
- return { ...fromCache, loading: undefined };
362
- }
363
- return fromCache;
364
- })
365
- .filter(Boolean) as ResolvedSegment[];
366
-
367
- // Insert diff segments not in matchedIds (e.g., loader segments from consolidation fetch)
368
- insertMissingDiffSegments(allSegments, diff, matchedIdSet, newSegmentMap);
395
+ const actor: ReconcileActor =
396
+ mode.type === "stale-revalidation" || mode.type === "action"
397
+ ? "stale-revalidation"
398
+ : "navigation";
399
+
400
+ const reconciled = reconcileSegments({
401
+ actor,
402
+ matched: matchedIds,
403
+ diff: diff || [],
404
+ serverSegments: newSegments || [],
405
+ cachedSegments: cachedSegs,
406
+ insertMissingDiff: true,
407
+ });
369
408
 
370
409
  // HMR RESILIENCE: Check if we're missing any matched segments
371
- // Note: allSegments may include additional diff segments, so we check matchedIds specifically
372
- const allSegmentIdSet = new Set(allSegments.map((s) => s.id));
410
+ const reconciledIdSet = new Set(reconciled.segments.map((s) => s.id));
373
411
  const missingIds = matchedIds.filter(
374
- (id: string) => !allSegmentIdSet.has(id),
412
+ (id: string) => !reconciledIdSet.has(id),
375
413
  );
376
414
 
377
415
  if (missingIds.length > 0) {
@@ -384,52 +422,39 @@ export function createPartialUpdater(
384
422
  );
385
423
  }
386
424
  if (signal?.aborted) {
387
- console.log(
388
- `[Browser] Ignoring stale navigation (aborted during HMR retry)`,
425
+ debugLog(
426
+ "[Browser] Ignoring stale navigation (aborted during HMR retry)",
389
427
  );
390
- return streamComplete;
428
+ return;
391
429
  }
392
- if (isAction) {
393
- return streamComplete;
430
+ if (mode.type === "action") {
431
+ return;
394
432
  }
395
433
  console.warn(
396
434
  `[Browser] HMR detected: Missing ${missingCount} segments. Refetching all...`,
397
435
  );
398
436
 
399
437
  // Refetch with empty segments = server sends everything
400
- return fetchPartialUpdate(url, [], true, signal, tx, { isAction });
438
+ return fetchPartialUpdate(url, [], true, signal, tx, mode);
401
439
  }
402
440
 
403
- // INTERCEPT HANDLING: Separate intercept segments for explicit injection
404
- // Intercept segments have namespace starting with "intercept:" or ID containing .@
405
- // This makes the flow clearer and easier to debug
406
- const isInterceptSegment = (s: ResolvedSegment) =>
407
- s.namespace?.startsWith("intercept:") ||
408
- (s.type === "parallel" && s.id.includes(".@"));
409
-
410
- const interceptSegments = allSegments.filter(isInterceptSegment);
411
- const mainSegments = allSegments.filter((s) => !isInterceptSegment(s));
412
-
413
441
  if (signal?.aborted) {
414
- console.log(
415
- `[Browser] Ignoring stale navigation (aborted before render)`,
416
- );
417
- return streamComplete;
442
+ debugLog("[Browser] Ignoring stale navigation (aborted before render)");
443
+ return;
418
444
  }
419
445
 
420
446
  // Rebuild tree on client (await for loader data resolution)
421
- // Race against abort signal to allow cancellation during loader awaiting
422
- // Pass intercept segments separately for explicit handling
423
- // For stale revalidation, use forceAwait to ensure no loading fallbacks
424
447
  const renderOptions = {
425
- isAction,
426
- forceAwait: staleRevalidation,
448
+ isAction: mode.type === "action",
449
+ forceAwait: mode.type === "stale-revalidation",
427
450
  interceptSegments:
428
- interceptSegments.length > 0 ? interceptSegments : undefined,
451
+ reconciled.interceptSegments.length > 0
452
+ ? reconciled.interceptSegments
453
+ : undefined,
429
454
  };
430
455
  const newTree = await (signal
431
456
  ? Promise.race([
432
- renderSegments(mainSegments, renderOptions),
457
+ renderSegments(reconciled.mainSegments, renderOptions),
433
458
  new Promise<never>((_, reject) => {
434
459
  if (signal.aborted) {
435
460
  reject(new DOMException("Navigation aborted", "AbortError"));
@@ -439,158 +464,179 @@ export function createPartialUpdater(
439
464
  });
440
465
  }),
441
466
  ])
442
- : renderSegments(mainSegments, renderOptions));
467
+ : renderSegments(reconciled.mainSegments, renderOptions));
443
468
 
444
469
  // Final abort check before committing - another navigation may have started
445
470
  if (signal?.aborted) {
446
- console.log(
447
- `[Browser] Ignoring stale navigation (aborted before commit)`,
448
- );
449
- return streamComplete;
471
+ debugLog("[Browser] Ignoring stale navigation (aborted before commit)");
472
+ return;
450
473
  }
451
474
 
452
475
  // Check if this is an intercept response (any slot is active)
453
- // If so, disable scroll to keep the current scroll position
454
- const hasActiveIntercept = payload.metadata?.slots
455
- ? Object.values(payload.metadata.slots).some((slot) => slot.active)
456
- : false;
457
-
458
- // BUG FIX: When navigating with cached target segments but receiving an intercept response,
459
- // the background segments should come from the SOURCE page (where we navigated from),
460
- // not the TARGET cache. This happens when:
461
- // 1. User visits /product/xxx (detail page) - cached under key "/product/xxx"
462
- // 2. User navigates back to /
463
- // 3. User clicks product link → cache hit for "/product/xxx" (detail page)
464
- // 4. But server returns intercept response (modal with index background)
465
- // 5. Without this fix: background uses detail page segments (wrong!)
466
- // 6. With this fix: rebuild currentSegmentMap from source page
467
- if (hasActiveIntercept && targetCacheSegments) {
468
- console.log(
469
- `[Browser] Intercept response with target cache - rebuilding segment map from source page`,
470
- );
471
- currentSegmentMap = getCurrentSegmentMap();
472
- }
476
+ const isInterceptResponse = hasActiveInterceptSlots(
477
+ payload.metadata?.slots,
478
+ );
473
479
 
474
- // Track intercept context for action revalidation (only on navigation, not actions or stale revalidation)
475
- if (!isAction && !staleRevalidation) {
476
- if (hasActiveIntercept) {
477
- // Save the source URL for action revalidation to maintain intercept context
478
- store.setInterceptSourceUrl(segmentState.currentUrl);
480
+ // Track intercept context (only on navigation, not actions or stale revalidation)
481
+ // Use the authoritative source from mode/history state when restoring an
482
+ // intercept via popstate cache miss; fall back to the current URL for fresh
483
+ // intercept navigations.
484
+ const effectiveInterceptSource =
485
+ interceptSourceUrl || segmentState.currentUrl;
486
+ if (mode.type !== "action" && mode.type !== "stale-revalidation") {
487
+ if (isInterceptResponse) {
488
+ store.setInterceptSourceUrl(effectiveInterceptSource);
479
489
  } else {
480
- // Clear intercept context when navigating to a non-intercept route
481
490
  store.setInterceptSourceUrl(null);
482
491
  }
483
492
  }
484
493
 
485
- // Commit navigation - transaction handles all store mutations atomically
486
- // For intercept responses: disable scroll, mark as intercept, include source URL
487
- // Use allSegmentIds (derived from allSegments) instead of matchedIds because
488
- // we may have added diff segments (like loader segments) not in the matched array
489
- const allSegmentIds = allSegments.map((s) => s.id);
490
- tx.commit(
494
+ // Commit navigation - use server's matched as the authoritative segment ID list.
495
+ // reconciled.segments may be missing IDs (e.g., loader segments not in diff or cache)
496
+ // but the server's matched always includes all expected segment IDs.
497
+ const allSegmentIds = matchedIds;
498
+ const serverLocationState = payload.metadata?.locationState;
499
+ const overrides: CommitOverrides | undefined = isInterceptResponse
500
+ ? {
501
+ scroll: false,
502
+ intercept: true,
503
+ interceptSourceUrl: effectiveInterceptSource,
504
+ ...(serverLocationState && { serverState: serverLocationState }),
505
+ }
506
+ : serverLocationState
507
+ ? { serverState: serverLocationState }
508
+ : undefined;
509
+ const { scroll: navScroll } = tx.commit(
491
510
  allSegmentIds,
492
- allSegments,
493
- hasActiveIntercept
494
- ? {
495
- scroll: false,
496
- intercept: true,
497
- interceptSourceUrl: segmentState.currentUrl,
498
- }
499
- : undefined,
511
+ reconciled.segments,
512
+ overrides,
500
513
  );
501
514
 
502
515
  // For stale revalidation: verify history key hasn't changed before updating UI
503
- // If user navigated away, skip UI update to avoid corrupting current view
504
- if (staleRevalidation) {
516
+ if (mode.type === "stale-revalidation") {
505
517
  const historyKeyNow = store.getHistoryKey();
506
518
  if (historyKeyNow !== historyKeyAtStart) {
507
- console.log(
519
+ debugLog(
508
520
  `[Browser] Stale revalidation: history key changed (${historyKeyAtStart} -> ${historyKeyNow}), skipping UI update`,
509
521
  );
510
- return streamComplete;
522
+ return;
511
523
  }
512
524
  }
513
525
 
514
- console.log("[partial-update] updating document");
526
+ debugLog("[partial-update] updating document");
515
527
 
516
- // Emit update to trigger React render
517
- // For stale revalidation: wait for stream to complete (loaders resolved), then update
518
- // For actions: wrap in startTransition to avoid UI flickering
519
- if (isAction || staleRevalidation) {
528
+ // Emit update to trigger React render.
529
+ // Scroll info is included so NavigationProvider applies it after React commits.
530
+ const hasTransition = reconciled.mainSegments.some((s) => s.transition);
531
+ const scrollPayload = toScrollPayload(navScroll);
532
+
533
+ if (mode.type === "action" || mode.type === "stale-revalidation") {
520
534
  startTransition(() => {
535
+ if (hasTransition && addTransitionType) {
536
+ addTransitionType("action");
537
+ }
521
538
  onUpdate({
522
539
  root: newTree,
523
540
  metadata: payload.metadata!,
541
+ scroll: scrollPayload,
542
+ });
543
+ });
544
+ } else if (hasTransition) {
545
+ startTransition(() => {
546
+ if (addTransitionType) {
547
+ addTransitionType("navigation");
548
+ }
549
+ onUpdate({
550
+ root: newTree,
551
+ metadata: payload.metadata!,
552
+ scroll: scrollPayload,
524
553
  });
525
554
  });
526
555
  } else {
527
556
  onUpdate({
528
557
  root: newTree,
529
558
  metadata: payload.metadata!,
559
+ scroll: scrollPayload,
530
560
  });
531
561
  }
532
562
 
533
- console.log(`[Browser] Navigation complete\n`);
534
- return streamComplete;
563
+ debugLog("[Browser] Navigation complete");
564
+ return;
535
565
  } else {
536
566
  // Full update (fallback)
537
- // Use client-side renderSegments instead of payload.root to ensure
538
- // consistent component references with action revalidation.
539
- // Server-rendered RSC tree has different component references than
540
- // client-created tree, which causes React to remount LoaderBoundary
541
- // when actions trigger revalidation.
542
567
  console.warn(`[Browser] Full update (fallback)`);
543
568
 
544
569
  const segments = payload.metadata?.segments || [];
545
570
 
546
- // Check if this navigation is stale (a newer one started)
547
571
  if (signal?.aborted) {
548
- console.log(`[Browser] Ignoring stale navigation (aborted)`);
549
- return streamComplete;
572
+ debugLog("[Browser] Ignoring stale navigation (aborted)");
573
+ return;
550
574
  }
551
575
 
552
576
  const segmentIds = segments.map((s: ResolvedSegment) => s.id);
553
577
 
554
- // Render on client for consistent component references
555
578
  const newTree = await renderSegments(segments);
556
579
 
557
- // Final abort check before committing - another navigation may have started
558
580
  if (signal?.aborted) {
559
- console.log(
560
- `[Browser] Ignoring stale navigation (aborted before commit)`,
561
- );
562
- return streamComplete;
581
+ debugLog("[Browser] Ignoring stale navigation (aborted before commit)");
582
+ return;
563
583
  }
564
584
 
565
- // Commit navigation - transaction handles all store mutations atomically
566
- tx.commit(segmentIds, segments);
585
+ const fullUpdateServerState = payload.metadata?.locationState;
586
+ const { scroll: fullScroll } = fullUpdateServerState
587
+ ? tx.commit(segmentIds, segments, {
588
+ serverState: fullUpdateServerState,
589
+ })
590
+ : tx.commit(segmentIds, segments);
567
591
 
568
- // Emit update to trigger React render
569
- // For stale revalidation: wait for stream to complete, then update
570
- // For actions: wrap in startTransition to avoid UI flickering
571
- if (staleRevalidation) {
592
+ const fullHasTransition = segments.some(
593
+ (s: ResolvedSegment) => s.transition,
594
+ );
595
+ const fullScrollPayload = toScrollPayload(fullScroll);
596
+
597
+ if (mode.type === "stale-revalidation") {
572
598
  await rawStreamComplete;
573
599
  startTransition(() => {
600
+ if (fullHasTransition && addTransitionType) {
601
+ addTransitionType("action");
602
+ }
574
603
  onUpdate({
575
604
  root: newTree,
576
605
  metadata: payload.metadata!,
606
+ scroll: fullScrollPayload,
577
607
  });
578
608
  });
579
- } else if (isAction) {
609
+ } else if (mode.type === "action") {
580
610
  startTransition(async () => {
611
+ if (fullHasTransition && addTransitionType) {
612
+ addTransitionType("action");
613
+ }
614
+ onUpdate({
615
+ root: newTree,
616
+ metadata: payload.metadata!,
617
+ scroll: fullScrollPayload,
618
+ });
619
+ });
620
+ } else if (fullHasTransition) {
621
+ startTransition(() => {
622
+ if (addTransitionType) {
623
+ addTransitionType("navigation");
624
+ }
581
625
  onUpdate({
582
626
  root: newTree,
583
627
  metadata: payload.metadata!,
628
+ scroll: fullScrollPayload,
584
629
  });
585
630
  });
586
631
  } else {
587
632
  onUpdate({
588
633
  root: newTree,
589
634
  metadata: payload.metadata!,
635
+ scroll: fullScrollPayload,
590
636
  });
591
637
  }
592
638
 
593
- return streamComplete;
639
+ return;
594
640
  }
595
641
  }
596
642