@rangojs/router 0.0.0-experimental.2 → 0.0.0-experimental.20dbba0c

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