@rangojs/router 0.0.0-experimental.12 → 0.0.0-experimental.121

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