@rangojs/router 0.0.0-experimental.4 → 0.0.0-experimental.40

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 (1104) hide show
  1. package/AGENTS.md +9 -0
  2. package/README.md +884 -4
  3. package/dist/__internal.d.ts +83 -0
  4. package/dist/__internal.d.ts.map +1 -0
  5. package/dist/__internal.js +19 -0
  6. package/dist/__internal.js.map +1 -0
  7. package/dist/__mocks__/version.d.ts +7 -0
  8. package/dist/__mocks__/version.d.ts.map +1 -0
  9. package/dist/__mocks__/version.js +7 -0
  10. package/dist/__mocks__/version.js.map +1 -0
  11. package/dist/__tests__/client-href.test.d.ts +2 -0
  12. package/dist/__tests__/client-href.test.d.ts.map +1 -0
  13. package/dist/__tests__/client-href.test.js +74 -0
  14. package/dist/__tests__/client-href.test.js.map +1 -0
  15. package/dist/__tests__/component-utils.test.d.ts +2 -0
  16. package/dist/__tests__/component-utils.test.d.ts.map +1 -0
  17. package/dist/__tests__/component-utils.test.js +51 -0
  18. package/dist/__tests__/component-utils.test.js.map +1 -0
  19. package/dist/__tests__/event-controller.test.d.ts +2 -0
  20. package/dist/__tests__/event-controller.test.d.ts.map +1 -0
  21. package/dist/__tests__/event-controller.test.js +538 -0
  22. package/dist/__tests__/event-controller.test.js.map +1 -0
  23. package/dist/__tests__/helpers/route-tree.d.ts +118 -0
  24. package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
  25. package/dist/__tests__/helpers/route-tree.js +374 -0
  26. package/dist/__tests__/helpers/route-tree.js.map +1 -0
  27. package/dist/__tests__/match-result.test.d.ts +2 -0
  28. package/dist/__tests__/match-result.test.d.ts.map +1 -0
  29. package/dist/__tests__/match-result.test.js +154 -0
  30. package/dist/__tests__/match-result.test.js.map +1 -0
  31. package/dist/__tests__/navigation-store.test.d.ts +2 -0
  32. package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
  33. package/dist/__tests__/navigation-store.test.js +440 -0
  34. package/dist/__tests__/navigation-store.test.js.map +1 -0
  35. package/dist/__tests__/partial-update.test.d.ts +2 -0
  36. package/dist/__tests__/partial-update.test.d.ts.map +1 -0
  37. package/dist/__tests__/partial-update.test.js +1009 -0
  38. package/dist/__tests__/partial-update.test.js.map +1 -0
  39. package/dist/__tests__/reverse-types.test.d.ts +8 -0
  40. package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
  41. package/dist/__tests__/reverse-types.test.js +656 -0
  42. package/dist/__tests__/reverse-types.test.js.map +1 -0
  43. package/dist/__tests__/route-definition.test.d.ts +2 -0
  44. package/dist/__tests__/route-definition.test.d.ts.map +1 -0
  45. package/dist/__tests__/route-definition.test.js +55 -0
  46. package/dist/__tests__/route-definition.test.js.map +1 -0
  47. package/dist/__tests__/router-helpers.test.d.ts +2 -0
  48. package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
  49. package/dist/__tests__/router-helpers.test.js +377 -0
  50. package/dist/__tests__/router-helpers.test.js.map +1 -0
  51. package/dist/__tests__/router-integration-2.test.d.ts +2 -0
  52. package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
  53. package/dist/__tests__/router-integration-2.test.js +426 -0
  54. package/dist/__tests__/router-integration-2.test.js.map +1 -0
  55. package/dist/__tests__/router-integration.test.d.ts +2 -0
  56. package/dist/__tests__/router-integration.test.d.ts.map +1 -0
  57. package/dist/__tests__/router-integration.test.js +1051 -0
  58. package/dist/__tests__/router-integration.test.js.map +1 -0
  59. package/dist/__tests__/search-params.test.d.ts +5 -0
  60. package/dist/__tests__/search-params.test.d.ts.map +1 -0
  61. package/dist/__tests__/search-params.test.js +306 -0
  62. package/dist/__tests__/search-params.test.js.map +1 -0
  63. package/dist/__tests__/segment-system.test.d.ts +2 -0
  64. package/dist/__tests__/segment-system.test.d.ts.map +1 -0
  65. package/dist/__tests__/segment-system.test.js +627 -0
  66. package/dist/__tests__/segment-system.test.js.map +1 -0
  67. package/dist/__tests__/static-handler-types.test.d.ts +8 -0
  68. package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
  69. package/dist/__tests__/static-handler-types.test.js +63 -0
  70. package/dist/__tests__/static-handler-types.test.js.map +1 -0
  71. package/dist/__tests__/urls.test.d.ts +2 -0
  72. package/dist/__tests__/urls.test.d.ts.map +1 -0
  73. package/dist/__tests__/urls.test.js +421 -0
  74. package/dist/__tests__/urls.test.js.map +1 -0
  75. package/dist/__tests__/use-mount.test.d.ts +2 -0
  76. package/dist/__tests__/use-mount.test.d.ts.map +1 -0
  77. package/dist/__tests__/use-mount.test.js +35 -0
  78. package/dist/__tests__/use-mount.test.js.map +1 -0
  79. package/dist/bin/rango.d.ts +2 -0
  80. package/dist/bin/rango.d.ts.map +1 -0
  81. package/dist/bin/rango.js +1601 -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 +4544 -685
  798. package/dist/vite/index.js.map +1 -0
  799. package/dist/vite/index.named-routes.gen.ts +103 -0
  800. package/dist/vite/package-resolution.d.ts +43 -0
  801. package/dist/vite/package-resolution.d.ts.map +1 -0
  802. package/dist/vite/package-resolution.js +112 -0
  803. package/dist/vite/package-resolution.js.map +1 -0
  804. package/dist/vite/virtual-entries.d.ts +25 -0
  805. package/dist/vite/virtual-entries.d.ts.map +1 -0
  806. package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +16 -18
  807. package/dist/vite/virtual-entries.js.map +1 -0
  808. package/package.json +77 -58
  809. package/skills/breadcrumbs/SKILL.md +250 -0
  810. package/skills/cache-guide/SKILL.md +262 -0
  811. package/skills/caching/SKILL.md +50 -21
  812. package/skills/composability/SKILL.md +172 -0
  813. package/skills/debug-manifest/SKILL.md +12 -8
  814. package/skills/document-cache/SKILL.md +18 -16
  815. package/skills/fonts/SKILL.md +167 -0
  816. package/skills/hooks/SKILL.md +334 -72
  817. package/skills/host-router/SKILL.md +218 -0
  818. package/skills/intercept/SKILL.md +131 -8
  819. package/skills/layout/SKILL.md +100 -3
  820. package/skills/links/SKILL.md +89 -30
  821. package/skills/loader/SKILL.md +388 -38
  822. package/skills/middleware/SKILL.md +171 -34
  823. package/skills/mime-routes/SKILL.md +128 -0
  824. package/skills/parallel/SKILL.md +78 -1
  825. package/skills/prerender/SKILL.md +643 -0
  826. package/skills/rango/SKILL.md +85 -16
  827. package/skills/response-routes/SKILL.md +411 -0
  828. package/skills/route/SKILL.md +226 -14
  829. package/skills/router-setup/SKILL.md +153 -29
  830. package/skills/tailwind/SKILL.md +129 -0
  831. package/skills/theme/SKILL.md +9 -8
  832. package/skills/typesafety/SKILL.md +318 -89
  833. package/skills/use-cache/SKILL.md +324 -0
  834. package/src/__internal.ts +102 -4
  835. package/src/bin/rango.ts +321 -0
  836. package/src/browser/action-coordinator.ts +97 -0
  837. package/src/browser/action-response-classifier.ts +99 -0
  838. package/src/browser/event-controller.ts +87 -64
  839. package/src/browser/history-state.ts +80 -0
  840. package/src/browser/intercept-utils.ts +52 -0
  841. package/src/browser/link-interceptor.ts +24 -4
  842. package/src/browser/logging.ts +55 -0
  843. package/src/browser/merge-segment-loaders.ts +20 -12
  844. package/src/browser/navigation-bridge.ts +281 -554
  845. package/src/browser/navigation-client.ts +124 -71
  846. package/src/browser/navigation-store.ts +33 -50
  847. package/src/browser/navigation-transaction.ts +295 -0
  848. package/src/browser/network-error-handler.ts +61 -0
  849. package/src/browser/partial-update.ts +261 -309
  850. package/src/browser/prefetch/cache.ts +154 -0
  851. package/src/browser/prefetch/fetch.ts +135 -0
  852. package/src/browser/prefetch/observer.ts +65 -0
  853. package/src/browser/prefetch/policy.ts +48 -0
  854. package/src/browser/prefetch/queue.ts +88 -0
  855. package/src/browser/rango-state.ts +112 -0
  856. package/src/browser/react/Link.tsx +185 -73
  857. package/src/browser/react/NavigationProvider.tsx +139 -10
  858. package/src/browser/react/context.ts +6 -0
  859. package/src/browser/react/filter-segment-order.ts +11 -0
  860. package/src/browser/react/index.ts +12 -12
  861. package/src/browser/react/location-state-shared.ts +95 -53
  862. package/src/browser/react/location-state.ts +60 -15
  863. package/src/browser/react/mount-context.ts +24 -1
  864. package/src/browser/react/nonce-context.ts +23 -0
  865. package/src/browser/react/shallow-equal.ts +27 -0
  866. package/src/browser/react/use-action.ts +29 -51
  867. package/src/browser/react/use-client-cache.ts +5 -3
  868. package/src/browser/react/use-handle.ts +32 -79
  869. package/src/browser/react/use-href.tsx +2 -2
  870. package/src/browser/react/use-link-status.ts +6 -5
  871. package/src/browser/react/use-navigation.ts +22 -63
  872. package/src/browser/react/use-params.ts +65 -0
  873. package/src/browser/react/use-pathname.ts +47 -0
  874. package/src/browser/react/use-router.ts +63 -0
  875. package/src/browser/react/use-search-params.ts +56 -0
  876. package/src/browser/react/use-segments.ts +80 -97
  877. package/src/browser/response-adapter.ts +73 -0
  878. package/src/browser/rsc-router.tsx +111 -30
  879. package/src/browser/scroll-restoration.ts +98 -38
  880. package/src/browser/segment-reconciler.ts +216 -0
  881. package/src/browser/segment-structure-assert.ts +16 -0
  882. package/src/browser/server-action-bridge.ts +504 -599
  883. package/src/browser/shallow.ts +6 -1
  884. package/src/browser/types.ts +109 -47
  885. package/src/browser/validate-redirect-origin.ts +29 -0
  886. package/src/build/generate-manifest.ts +235 -24
  887. package/src/build/generate-route-types.ts +36 -0
  888. package/src/build/index.ts +13 -0
  889. package/src/build/route-trie.ts +265 -0
  890. package/src/build/route-types/ast-helpers.ts +25 -0
  891. package/src/build/route-types/ast-route-extraction.ts +98 -0
  892. package/src/build/route-types/codegen.ts +102 -0
  893. package/src/build/route-types/include-resolution.ts +411 -0
  894. package/src/build/route-types/param-extraction.ts +48 -0
  895. package/src/build/route-types/per-module-writer.ts +128 -0
  896. package/src/build/route-types/router-processing.ts +469 -0
  897. package/src/build/route-types/scan-filter.ts +78 -0
  898. package/src/build/runtime-discovery.ts +231 -0
  899. package/src/cache/background-task.ts +34 -0
  900. package/src/cache/cache-key-utils.ts +44 -0
  901. package/src/cache/cache-policy.ts +125 -0
  902. package/src/cache/cache-runtime.ts +338 -0
  903. package/src/cache/cache-scope.ts +120 -303
  904. package/src/cache/cf/cf-cache-store.ts +119 -7
  905. package/src/cache/cf/index.ts +8 -2
  906. package/src/cache/document-cache.ts +101 -72
  907. package/src/cache/handle-capture.ts +81 -0
  908. package/src/cache/handle-snapshot.ts +41 -0
  909. package/src/cache/index.ts +0 -15
  910. package/src/cache/memory-segment-store.ts +191 -13
  911. package/src/cache/profile-registry.ts +73 -0
  912. package/src/cache/read-through-swr.ts +134 -0
  913. package/src/cache/segment-codec.ts +256 -0
  914. package/src/cache/taint.ts +98 -0
  915. package/src/cache/types.ts +72 -122
  916. package/src/client.rsc.tsx +3 -1
  917. package/src/client.tsx +106 -126
  918. package/src/component-utils.ts +4 -4
  919. package/src/components/DefaultDocument.tsx +5 -1
  920. package/src/context-var.ts +86 -0
  921. package/src/debug.ts +17 -7
  922. package/src/errors.ts +108 -2
  923. package/src/handle.ts +15 -29
  924. package/src/handles/MetaTags.tsx +73 -24
  925. package/src/handles/breadcrumbs.ts +66 -0
  926. package/src/handles/index.ts +1 -0
  927. package/src/handles/meta.ts +30 -13
  928. package/src/host/cookie-handler.ts +165 -0
  929. package/src/host/errors.ts +97 -0
  930. package/src/host/index.ts +53 -0
  931. package/src/host/pattern-matcher.ts +214 -0
  932. package/src/host/router.ts +352 -0
  933. package/src/host/testing.ts +79 -0
  934. package/src/host/types.ts +146 -0
  935. package/src/host/utils.ts +25 -0
  936. package/src/href-client.ts +119 -29
  937. package/src/index.rsc.ts +153 -19
  938. package/src/index.ts +211 -30
  939. package/src/internal-debug.ts +11 -0
  940. package/src/loader.rsc.ts +26 -147
  941. package/src/loader.ts +27 -10
  942. package/src/network-error-thrower.tsx +3 -1
  943. package/src/outlet-provider.tsx +45 -0
  944. package/src/prerender/param-hash.ts +37 -0
  945. package/src/prerender/store.ts +185 -0
  946. package/src/prerender.ts +463 -0
  947. package/src/reverse.ts +330 -0
  948. package/src/root-error-boundary.tsx +41 -29
  949. package/src/route-content-wrapper.tsx +7 -4
  950. package/src/route-definition/dsl-helpers.ts +934 -0
  951. package/src/route-definition/helper-factories.ts +200 -0
  952. package/src/route-definition/helpers-types.ts +430 -0
  953. package/src/route-definition/index.ts +52 -0
  954. package/src/route-definition/redirect.ts +93 -0
  955. package/src/route-definition.ts +1 -1428
  956. package/src/route-map-builder.ts +211 -123
  957. package/src/route-name.ts +53 -0
  958. package/src/route-types.ts +59 -8
  959. package/src/router/content-negotiation.ts +116 -0
  960. package/src/router/debug-manifest.ts +72 -0
  961. package/src/router/error-handling.ts +9 -9
  962. package/src/router/find-match.ts +158 -0
  963. package/src/router/handler-context.ts +374 -81
  964. package/src/router/intercept-resolution.ts +395 -0
  965. package/src/router/lazy-includes.ts +234 -0
  966. package/src/router/loader-resolution.ts +215 -122
  967. package/src/router/logging.ts +248 -0
  968. package/src/router/manifest.ts +148 -35
  969. package/src/router/match-api.ts +620 -0
  970. package/src/router/match-context.ts +5 -3
  971. package/src/router/match-handlers.ts +440 -0
  972. package/src/router/match-middleware/background-revalidation.ts +80 -93
  973. package/src/router/match-middleware/cache-lookup.ts +382 -9
  974. package/src/router/match-middleware/cache-store.ts +51 -22
  975. package/src/router/match-middleware/intercept-resolution.ts +55 -17
  976. package/src/router/match-middleware/segment-resolution.ts +24 -6
  977. package/src/router/match-pipelines.ts +10 -45
  978. package/src/router/match-result.ts +34 -28
  979. package/src/router/metrics.ts +235 -15
  980. package/src/router/middleware-cookies.ts +55 -0
  981. package/src/router/middleware-types.ts +222 -0
  982. package/src/router/middleware.ts +324 -367
  983. package/src/router/pattern-matching.ts +211 -43
  984. package/src/router/prerender-match.ts +402 -0
  985. package/src/router/preview-match.ts +170 -0
  986. package/src/router/revalidation.ts +137 -38
  987. package/src/router/router-context.ts +36 -21
  988. package/src/router/router-interfaces.ts +452 -0
  989. package/src/router/router-options.ts +592 -0
  990. package/src/router/router-registry.ts +24 -0
  991. package/src/router/segment-resolution/fresh.ts +570 -0
  992. package/src/router/segment-resolution/helpers.ts +263 -0
  993. package/src/router/segment-resolution/loader-cache.ts +198 -0
  994. package/src/router/segment-resolution/revalidation.ts +1239 -0
  995. package/src/router/segment-resolution/static-store.ts +67 -0
  996. package/src/router/segment-resolution.ts +21 -0
  997. package/src/router/segment-wrappers.ts +289 -0
  998. package/src/router/telemetry-otel.ts +299 -0
  999. package/src/router/telemetry.ts +300 -0
  1000. package/src/router/timeout.ts +148 -0
  1001. package/src/router/trie-matching.ts +239 -0
  1002. package/src/router/types.ts +77 -3
  1003. package/src/router.ts +661 -4182
  1004. package/src/rsc/handler-context.ts +45 -0
  1005. package/src/rsc/handler.ts +764 -756
  1006. package/src/rsc/helpers.ts +140 -6
  1007. package/src/rsc/index.ts +0 -20
  1008. package/src/rsc/loader-fetch.ts +209 -0
  1009. package/src/rsc/manifest-init.ts +86 -0
  1010. package/src/rsc/nonce.ts +14 -0
  1011. package/src/rsc/origin-guard.ts +141 -0
  1012. package/src/rsc/progressive-enhancement.ts +379 -0
  1013. package/src/rsc/response-error.ts +37 -0
  1014. package/src/rsc/response-route-handler.ts +347 -0
  1015. package/src/rsc/rsc-rendering.ts +237 -0
  1016. package/src/rsc/runtime-warnings.ts +42 -0
  1017. package/src/rsc/server-action.ts +348 -0
  1018. package/src/rsc/ssr-setup.ts +128 -0
  1019. package/src/rsc/types.ts +38 -11
  1020. package/src/search-params.ts +230 -0
  1021. package/src/segment-system.tsx +32 -17
  1022. package/src/server/context.ts +182 -51
  1023. package/src/server/cookie-store.ts +190 -0
  1024. package/src/server/fetchable-loader-store.ts +37 -0
  1025. package/src/server/handle-store.ts +94 -15
  1026. package/src/server/loader-registry.ts +15 -56
  1027. package/src/server/request-context.ts +430 -70
  1028. package/src/server.ts +35 -128
  1029. package/src/ssr/index.tsx +100 -31
  1030. package/src/static-handler.ts +114 -0
  1031. package/src/theme/ThemeProvider.tsx +21 -15
  1032. package/src/theme/ThemeScript.tsx +5 -5
  1033. package/src/theme/constants.ts +5 -2
  1034. package/src/theme/index.ts +4 -14
  1035. package/src/theme/theme-context.ts +4 -30
  1036. package/src/theme/theme-script.ts +21 -18
  1037. package/src/types/boundaries.ts +158 -0
  1038. package/src/types/cache-types.ts +198 -0
  1039. package/src/types/error-types.ts +192 -0
  1040. package/src/types/global-namespace.ts +100 -0
  1041. package/src/types/handler-context.ts +687 -0
  1042. package/src/types/index.ts +88 -0
  1043. package/src/types/loader-types.ts +183 -0
  1044. package/src/types/route-config.ts +170 -0
  1045. package/src/types/route-entry.ts +102 -0
  1046. package/src/types/segments.ts +148 -0
  1047. package/src/types.ts +1 -1623
  1048. package/src/urls/include-helper.ts +197 -0
  1049. package/src/urls/index.ts +53 -0
  1050. package/src/urls/path-helper-types.ts +339 -0
  1051. package/src/urls/path-helper.ts +329 -0
  1052. package/src/urls/pattern-types.ts +95 -0
  1053. package/src/urls/response-types.ts +106 -0
  1054. package/src/urls/type-extraction.ts +372 -0
  1055. package/src/urls/urls-function.ts +98 -0
  1056. package/src/urls.ts +1 -802
  1057. package/src/use-loader.tsx +85 -77
  1058. package/src/vite/discovery/bundle-postprocess.ts +184 -0
  1059. package/src/vite/discovery/discover-routers.ts +344 -0
  1060. package/src/vite/discovery/prerender-collection.ts +385 -0
  1061. package/src/vite/discovery/route-types-writer.ts +258 -0
  1062. package/src/vite/discovery/self-gen-tracking.ts +47 -0
  1063. package/src/vite/discovery/state.ts +110 -0
  1064. package/src/vite/discovery/virtual-module-codegen.ts +203 -0
  1065. package/src/vite/index.ts +11 -782
  1066. package/src/vite/plugin-types.ts +131 -0
  1067. package/src/vite/plugins/cjs-to-esm.ts +93 -0
  1068. package/src/vite/plugins/client-ref-dedup.ts +115 -0
  1069. package/src/vite/plugins/client-ref-hashing.ts +105 -0
  1070. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -51
  1071. package/src/vite/plugins/expose-id-utils.ts +287 -0
  1072. package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
  1073. package/src/vite/plugins/expose-ids/handler-transform.ts +179 -0
  1074. package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
  1075. package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
  1076. package/src/vite/plugins/expose-ids/types.ts +45 -0
  1077. package/src/vite/plugins/expose-internal-ids.ts +569 -0
  1078. package/src/vite/plugins/refresh-cmd.ts +65 -0
  1079. package/src/vite/plugins/use-cache-transform.ts +323 -0
  1080. package/src/vite/plugins/version-injector.ts +83 -0
  1081. package/src/vite/plugins/version-plugin.ts +254 -0
  1082. package/src/vite/plugins/virtual-entries.ts +123 -0
  1083. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  1084. package/src/vite/rango.ts +510 -0
  1085. package/src/vite/router-discovery.ts +785 -0
  1086. package/src/vite/utils/ast-handler-extract.ts +517 -0
  1087. package/src/vite/utils/banner.ts +36 -0
  1088. package/src/vite/utils/bundle-analysis.ts +137 -0
  1089. package/src/vite/utils/manifest-utils.ts +70 -0
  1090. package/src/vite/{package-resolution.ts → utils/package-resolution.ts} +25 -29
  1091. package/src/vite/utils/prerender-utils.ts +189 -0
  1092. package/src/vite/utils/shared-utils.ts +169 -0
  1093. package/CLAUDE.md +0 -43
  1094. package/src/browser/lru-cache.ts +0 -69
  1095. package/src/browser/request-controller.ts +0 -164
  1096. package/src/cache/memory-store.ts +0 -253
  1097. package/src/href.ts +0 -255
  1098. package/src/server/route-manifest-cache.ts +0 -173
  1099. package/src/vite/expose-handle-id.ts +0 -209
  1100. package/src/vite/expose-loader-id.ts +0 -426
  1101. package/src/vite/expose-location-state-id.ts +0 -177
  1102. package/src/warmup/connection-warmup.tsx +0 -94
  1103. package/src/warmup/warmup-context.ts +0 -35
  1104. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
@@ -1,442 +1,45 @@
1
1
  import type {
2
2
  NavigationBridge,
3
3
  NavigationBridgeConfig,
4
- NavigateOptions,
5
- NavigationStore,
4
+ NavigateOptionsInternal,
6
5
  ResolvedSegment,
7
6
  } from "./types.js";
7
+ import * as React from "react";
8
+ import { startTransition } from "react";
8
9
  import {
9
- isLocationStateEntry,
10
- resolveLocationStateEntries,
11
- } from "./react/location-state-shared.js";
12
-
13
- /**
14
- * Check if state is from typed LocationStateEntry[] (has __rsc_ls_ keys)
15
- */
16
- function isTypedLocationState(
17
- state: unknown
18
- ): state is Record<string, unknown> {
19
- if (state === null || typeof state !== "object") return false;
20
- return Object.keys(state).some((key) => key.startsWith("__rsc_ls_"));
21
- }
10
+ createNavigationTransaction,
11
+ resolveNavigationState,
12
+ } from "./navigation-transaction.js";
13
+ import { buildHistoryState } from "./history-state.js";
14
+ import {
15
+ handleNavigationStart,
16
+ handleNavigationEnd,
17
+ ensureHistoryKey,
18
+ } from "./scroll-restoration.js";
22
19
 
23
- /**
24
- * Resolve navigation state - handles both LocationStateEntry[] and legacy formats
25
- */
26
- function resolveNavigationState(state: unknown): unknown {
27
- // Check if it's an array of LocationStateEntry
28
- if (
29
- Array.isArray(state) &&
30
- state.length > 0 &&
31
- isLocationStateEntry(state[0])
32
- ) {
33
- return resolveLocationStateEntries(state);
34
- }
35
- // Return as-is for legacy formats
36
- return state;
37
- }
20
+ // addTransitionType is only available in React experimental
21
+ const addTransitionType: ((type: string) => void) | undefined =
22
+ "addTransitionType" in React ? (React as any).addTransitionType : undefined;
38
23
 
39
- /**
40
- * Build history state object from user state
41
- * - Typed state: spread directly into history.state
42
- * - Legacy state: store in history.state.state
43
- */
44
- function buildHistoryState(
45
- userState: unknown,
46
- routerState?: { intercept?: boolean; sourceUrl?: string }
47
- ): Record<string, unknown> | null {
48
- const result: Record<string, unknown> = {};
49
-
50
- // Add router internal state
51
- if (routerState?.intercept) {
52
- result.intercept = true;
53
- if (routerState.sourceUrl) {
54
- result.sourceUrl = routerState.sourceUrl;
55
- }
56
- }
57
-
58
- // Add user state
59
- if (userState !== undefined) {
60
- if (isTypedLocationState(userState)) {
61
- // Typed state: spread directly
62
- Object.assign(result, userState);
63
- } else {
64
- // Legacy state: store in .state
65
- result.state = userState;
66
- }
67
- }
68
-
69
- return Object.keys(result).length > 0 ? result : null;
70
- }
71
24
  import { setupLinkInterception } from "./link-interceptor.js";
72
25
  import { createPartialUpdater } from "./partial-update.js";
73
26
  import { generateHistoryKey } from "./navigation-store.js";
27
+ import type { EventController } from "./event-controller.js";
28
+ import { isInterceptOnlyCache } from "./intercept-utils.js";
74
29
  import {
75
- handleNavigationStart,
76
- handleNavigationEnd,
77
- ensureHistoryKey,
78
- } from "./scroll-restoration.js";
79
- import type { EventController, NavigationHandle } from "./event-controller.js";
80
- import { NetworkError, isNetworkError } from "../errors.js";
81
- import { NetworkErrorThrower } from "../network-error-thrower.js";
82
- import { createElement, startTransition } from "react";
30
+ toNetworkError,
31
+ emitNetworkError,
32
+ isBackgroundSuppressible,
33
+ } from "./network-error-handler.js";
34
+ import { debugLog } from "./logging.js";
35
+ import { ServerRedirect } from "../errors.js";
36
+ import { validateRedirectOrigin } from "./validate-redirect-origin.js";
83
37
 
84
38
  // Polyfill Symbol.dispose for Safari and older browsers
85
39
  if (typeof Symbol.dispose === "undefined") {
86
40
  (Symbol as any).dispose = Symbol("Symbol.dispose");
87
41
  }
88
42
 
89
- /**
90
- * Check if a segment is an intercept segment
91
- * Intercept segments have namespace starting with "intercept:" or ID containing .@
92
- */
93
- function isInterceptSegment(s: ResolvedSegment): boolean {
94
- return (
95
- s.namespace?.startsWith("intercept:") ||
96
- (s.type === "parallel" && s.id.includes(".@"))
97
- );
98
- }
99
-
100
- /**
101
- * Check if cached segments are intercept-only (no main route segments)
102
- * Intercept responses shouldn't be used for optimistic rendering since
103
- * whether interception happens depends on the current page context
104
- */
105
- function isInterceptOnlyCache(segments: ResolvedSegment[]): boolean {
106
- return segments.some(isInterceptSegment);
107
- }
108
-
109
- /**
110
- * Options for committing a navigation transaction
111
- */
112
- interface CommitOptions {
113
- url: string;
114
- segmentIds: string[];
115
- segments: ResolvedSegment[];
116
- replace?: boolean;
117
- scroll?: boolean;
118
- /** User-provided state to store in history.state */
119
- state?: unknown;
120
- /** If true, only update store without changing URL/history (for server actions) */
121
- storeOnly?: boolean;
122
- /** If true, this is an intercept route - store in history.state for popstate handling */
123
- intercept?: boolean;
124
- /** Source URL where the intercept was triggered from (stored in history.state) */
125
- interceptSourceUrl?: string;
126
- /** If true, only update cache without touching store or history (for background stale revalidation) */
127
- cacheOnly?: boolean;
128
- }
129
-
130
- /**
131
- * Options that can override the pre-configured commit settings
132
- */
133
- interface BoundCommitOverrides {
134
- /** Override scroll behavior (e.g., disable for intercepts) */
135
- scroll?: boolean;
136
- /** Override replace behavior (e.g., force replace for intercepts) */
137
- replace?: boolean;
138
- /** Override user-provided state */
139
- state?: unknown;
140
- /** Mark this as an intercept route */
141
- intercept?: boolean;
142
- /** Source URL where intercept was triggered from */
143
- interceptSourceUrl?: string;
144
- /** If true, only update cache (for stale revalidation) */
145
- cacheOnly?: boolean;
146
- }
147
-
148
- /**
149
- * Token for tracking an active stream - call end() when stream completes
150
- */
151
- export interface StreamingToken {
152
- end(): void;
153
- }
154
-
155
- /**
156
- * Bound transaction with pre-configured commit options (without segmentIds/segments)
157
- */
158
- export interface BoundTransaction {
159
- readonly currentUrl: string;
160
- /** Start streaming and get a token to end it when the stream completes */
161
- startStreaming(): StreamingToken;
162
- commit(
163
- segmentIds: string[],
164
- segments: ResolvedSegment[],
165
- overrides?: BoundCommitOverrides
166
- ): void;
167
- }
168
-
169
- /**
170
- * Navigation transaction for managing state during navigation
171
- * Uses the event controller handle for lifecycle management
172
- */
173
- interface NavigationTransaction extends Disposable {
174
- /** Optimistically commit from cache - instant render before revalidation */
175
- optimisticCommit(options: CommitOptions): void;
176
- /** Final commit with server data (or reconciliation after optimistic) */
177
- commit(options: CommitOptions): void;
178
- with(
179
- options: Omit<CommitOptions, "segmentIds" | "segments">
180
- ): BoundTransaction;
181
- /** The navigation handle from the event controller */
182
- handle: NavigationHandle;
183
- }
184
-
185
- /**
186
- * Creates a navigation transaction that coordinates with the event controller.
187
- * Handles loading state transitions and cleanup on completion/abort.
188
- *
189
- * Supports optimistic navigation: render from cache immediately,
190
- * then revalidate in background and reconcile if data changed.
191
- */
192
- function createNavigationTransaction(
193
- store: NavigationStore,
194
- eventController: EventController,
195
- url: string,
196
- options?: NavigateOptions & { skipLoadingState?: boolean }
197
- ): NavigationTransaction {
198
- let committed = false;
199
- let optimisticallyCommitted = false;
200
- let earlyStatePushed = false;
201
- const currentUrl = window.location.href;
202
-
203
- // Start navigation in event controller (this sets loading state)
204
- const handle = eventController.startNavigation(url, options);
205
-
206
- // If state is provided, push it to history immediately so loading UI can access it
207
- // This enables "optimistic state" - showing product names in skeletons etc.
208
- if (options?.state !== undefined && !options?.replace) {
209
- const earlyHistoryState = buildHistoryState(options.state);
210
- window.history.pushState(earlyHistoryState, "", url);
211
- earlyStatePushed = true;
212
- }
213
-
214
- /**
215
- * Optimistically commit from cache - renders immediately before revalidation
216
- * Sets optimisticallyCommitted flag so final commit() knows to reconcile
217
- */
218
- function optimisticCommit(opts: CommitOptions): void {
219
- optimisticallyCommitted = true;
220
-
221
- const { url, segmentIds, segments, replace, scroll } = opts;
222
- const parsedUrl = new URL(url, window.location.origin);
223
-
224
- // Save current scroll position before navigating
225
- handleNavigationStart();
226
-
227
- // Update segment state
228
- store.setSegmentIds(segmentIds);
229
- store.setCurrentUrl(url);
230
- store.setPath(parsedUrl.pathname);
231
-
232
- // Generate history key from URL
233
- const historyKey = generateHistoryKey(url);
234
- store.setHistoryKey(historyKey);
235
-
236
- // Cache segments with current handleData (will be overwritten by fresh data on final commit)
237
- const currentHandleData = eventController.getHandleState().data;
238
- store.cacheSegmentsForHistory(historyKey, segments, currentHandleData);
239
-
240
- // Build history state with user state if provided
241
- const historyState = buildHistoryState(opts.state);
242
-
243
- // Update browser URL
244
- // Use replaceState if we already pushed early (for optimistic state access)
245
- if (replace || earlyStatePushed) {
246
- window.history.replaceState(historyState, "", url);
247
- } else {
248
- window.history.pushState(historyState, "", url);
249
- }
250
-
251
- // Ensure new history entry has a scroll restoration key
252
- ensureHistoryKey();
253
-
254
- // Complete the navigation in event controller (sets idle state)
255
- handle.complete(parsedUrl);
256
-
257
- // Handle scroll after navigation
258
- handleNavigationEnd({ scroll });
259
-
260
- console.log(
261
- "[Browser] Optimistic commit from cache, historyKey:",
262
- historyKey
263
- );
264
- }
265
-
266
- /**
267
- * Commit the navigation - updates store and URL atomically
268
- * If optimisticCommit was called, this becomes a reconciliation
269
- */
270
- function commit(opts: CommitOptions): void {
271
- committed = true;
272
-
273
- // If optimistic commit already done, adjust options for reconciliation
274
- const isReconciliation = optimisticallyCommitted;
275
- const {
276
- url,
277
- segmentIds,
278
- segments,
279
- storeOnly,
280
- intercept,
281
- interceptSourceUrl,
282
- cacheOnly,
283
- } = opts;
284
- // For reconciliation: always replace (URL already pushed), no scroll
285
- const replace = isReconciliation ? true : opts.replace;
286
- const scroll = isReconciliation ? false : opts.scroll;
287
-
288
- const parsedUrl = new URL(url, window.location.origin);
289
-
290
- // Generate history key from URL (with intercept suffix for separate caching)
291
- const historyKey = generateHistoryKey(url, { intercept });
292
-
293
- // For cache-only commits (stale revalidation), only update cache and return
294
- // Don't touch store state or history - user may have navigated elsewhere
295
- if (cacheOnly) {
296
- const currentHandleData = eventController.getHandleState().data;
297
- store.cacheSegmentsForHistory(historyKey, segments, currentHandleData);
298
- console.log("[Browser] Cache-only commit, historyKey:", historyKey);
299
- return;
300
- }
301
-
302
- // Save current scroll position before navigating (only for non-reconciliation)
303
- if (!isReconciliation) {
304
- handleNavigationStart();
305
- }
306
-
307
- // Update segment state atomically
308
- store.setSegmentIds(segmentIds);
309
- store.setCurrentUrl(url);
310
- store.setPath(parsedUrl.pathname);
311
-
312
- store.setHistoryKey(historyKey);
313
-
314
- // Cache segments with current handleData for this history entry (fresh data overwrites optimistic)
315
- const currentHandleData = eventController.getHandleState().data;
316
- store.cacheSegmentsForHistory(historyKey, segments, currentHandleData);
317
-
318
- // For server actions, skip URL/history updates but still complete navigation
319
- if (storeOnly) {
320
- console.log("[Browser] Store updated (action)");
321
- // Complete navigation to clear loading state
322
- handle.complete(parsedUrl);
323
- return;
324
- }
325
-
326
- // Build history state - include user state and intercept info for popstate handling
327
- const historyState = buildHistoryState(opts.state, {
328
- intercept,
329
- sourceUrl: interceptSourceUrl,
330
- });
331
-
332
- // Update browser URL (skip if reconciliation - already done in optimisticCommit)
333
- if (!isReconciliation) {
334
- // Use replaceState if we already pushed early (for optimistic state access) or replace requested
335
- if (replace || earlyStatePushed) {
336
- window.history.replaceState(historyState, "", url);
337
- } else {
338
- window.history.pushState(historyState, "", url);
339
- }
340
- // Ensure new history entry has a scroll restoration key
341
- ensureHistoryKey();
342
- }
343
-
344
- // Complete the navigation in event controller (sets idle state, updates location)
345
- handle.complete(parsedUrl);
346
-
347
- // Handle scroll after navigation (skip if reconciliation)
348
- if (!isReconciliation) {
349
- handleNavigationEnd({ scroll });
350
- }
351
-
352
- if (isReconciliation) {
353
- console.log("[Browser] Reconciliation commit, historyKey:", historyKey);
354
- } else {
355
- console.log(
356
- "[Browser] Navigation committed, historyKey:",
357
- historyKey,
358
- intercept ? "(intercept)" : ""
359
- );
360
- }
361
- }
362
-
363
- return {
364
- handle,
365
- optimisticCommit,
366
- commit,
367
-
368
- /**
369
- * Create a bound transaction with pre-configured URL options
370
- * segmentIds and segments provided at commit time (after they're resolved)
371
- */
372
- with(
373
- opts: Omit<CommitOptions, "segmentIds" | "segments">
374
- ): BoundTransaction {
375
- return {
376
- get currentUrl() {
377
- return currentUrl;
378
- },
379
- startStreaming() {
380
- return handle.startStreaming();
381
- },
382
- commit: (
383
- segmentIds: string[],
384
- segments: ResolvedSegment[],
385
- overrides?: BoundCommitOverrides
386
- ) => {
387
- // Allow overrides to disable scroll (e.g., for intercepts)
388
- const finalScroll =
389
- overrides?.scroll !== undefined ? overrides.scroll : opts.scroll;
390
- // Allow overrides to force replace (e.g., for intercepts)
391
- const finalReplace =
392
- overrides?.replace !== undefined ? overrides.replace : opts.replace;
393
- // Intercept info: overrides take precedence, fallback to opts
394
- const intercept =
395
- overrides?.intercept !== undefined
396
- ? overrides.intercept
397
- : opts.intercept;
398
- const interceptSourceUrl =
399
- overrides?.interceptSourceUrl !== undefined
400
- ? overrides.interceptSourceUrl
401
- : opts.interceptSourceUrl;
402
- // Cache-only mode: overrides take precedence, fallback to opts
403
- const cacheOnly =
404
- overrides?.cacheOnly !== undefined
405
- ? overrides.cacheOnly
406
- : opts.cacheOnly;
407
- // User state: overrides take precedence, fallback to opts
408
- const state =
409
- overrides?.state !== undefined ? overrides.state : opts.state;
410
- commit({
411
- ...opts,
412
- segmentIds,
413
- segments,
414
- scroll: finalScroll,
415
- replace: finalReplace,
416
- state,
417
- intercept,
418
- interceptSourceUrl,
419
- cacheOnly,
420
- });
421
- },
422
- };
423
- },
424
-
425
- [Symbol.dispose]() {
426
- // If aborted, another navigation took over - don't touch state
427
- if (handle.signal.aborted) return;
428
-
429
- // If not committed (and not optimistically committed), the handle's dispose
430
- // will reset state to idle via the event controller
431
- if (!committed && !optimisticallyCommitted) {
432
- handle[Symbol.dispose]();
433
- // The NavigationHandle's [Symbol.dispose] handles this
434
- }
435
- },
436
- };
437
- }
438
-
439
- // Export for use by server-action-bridge
440
43
  export { createNavigationTransaction };
441
44
 
442
45
  /**
@@ -462,9 +65,10 @@ export interface NavigationBridgeConfigWithController extends NavigationBridgeCo
462
65
  * @returns NavigationBridge instance
463
66
  */
464
67
  export function createNavigationBridge(
465
- config: NavigationBridgeConfigWithController
68
+ config: NavigationBridgeConfigWithController,
466
69
  ): NavigationBridge {
467
- const { store, client, eventController, onUpdate, renderSegments, version } = config;
70
+ const { store, client, eventController, onUpdate, renderSegments, version } =
71
+ config;
468
72
 
469
73
  // Create shared partial updater
470
74
  const fetchPartialUpdate = createPartialUpdater({
@@ -478,19 +82,121 @@ export function createNavigationBridge(
478
82
  return {
479
83
  /**
480
84
  * Navigate to a URL
481
- * Uses optimistic rendering from cache when available (SWR pattern)
85
+ * Uses cached segments for SWR revalidation when available
482
86
  */
483
- async navigate(url: string, options?: NavigateOptions): Promise<void> {
87
+ async navigate(
88
+ url: string,
89
+ options?: NavigateOptionsInternal,
90
+ ): Promise<void> {
484
91
  // Resolve LocationStateEntry[] to flat object if needed
485
92
  const resolvedState =
486
93
  options?.state !== undefined
487
94
  ? resolveNavigationState(options.state)
488
95
  : undefined;
489
96
 
97
+ // Cross-origin URLs are not handled by SPA navigation.
98
+ // Fall back to a full browser navigation for http/https only.
99
+ let targetUrl: URL;
100
+ try {
101
+ targetUrl = new URL(url, window.location.origin);
102
+ } catch {
103
+ console.warn(`[rango] navigate() ignored: malformed URL "${url}"`);
104
+ return;
105
+ }
106
+ if (targetUrl.origin !== window.location.origin) {
107
+ if (targetUrl.protocol !== "http:" && targetUrl.protocol !== "https:") {
108
+ console.error(
109
+ `[rango] navigate() blocked: unsupported scheme "${targetUrl.protocol}"`,
110
+ );
111
+ return;
112
+ }
113
+ window.location.href = targetUrl.href;
114
+ return;
115
+ }
116
+
117
+ // Shallow navigation: skip RSC fetch when revalidate is false
118
+ // and the pathname hasn't changed (search param / hash only change).
119
+ if (
120
+ options?.revalidate === false &&
121
+ targetUrl.pathname === new URL(window.location.href).pathname
122
+ ) {
123
+ // Preserve intercept context from the current history entry so that
124
+ // popstate uses the correct cache key (:intercept suffix) and restores
125
+ // the right full-page vs modal semantics.
126
+ const currentHistoryState = window.history.state;
127
+ const isIntercept = currentHistoryState?.intercept === true;
128
+ const interceptSourceUrl = isIntercept
129
+ ? currentHistoryState?.sourceUrl
130
+ : undefined;
131
+
132
+ const historyKey = generateHistoryKey(url, { intercept: isIntercept });
133
+
134
+ // Copy current segments to the new history key so back/forward restores instantly
135
+ const currentKey = store.getHistoryKey();
136
+ const currentCache = store.getCachedSegments(currentKey);
137
+ if (currentCache?.segments) {
138
+ const currentHandleData = eventController.getHandleState().data;
139
+ store.cacheSegmentsForHistory(
140
+ historyKey,
141
+ currentCache.segments,
142
+ currentHandleData,
143
+ );
144
+ }
145
+
146
+ // Save current scroll position before changing URL
147
+ handleNavigationStart();
148
+
149
+ // Snapshot old state before pushState/replaceState overwrites it
150
+ const oldState = window.history.state;
151
+
152
+ // Update browser URL (carry intercept context into history state)
153
+ const historyState = buildHistoryState(
154
+ resolvedState,
155
+ {
156
+ intercept: isIntercept || undefined,
157
+ sourceUrl: interceptSourceUrl,
158
+ },
159
+ {},
160
+ );
161
+ if (options.replace) {
162
+ window.history.replaceState(historyState, "", url);
163
+ } else {
164
+ window.history.pushState(historyState, "", url);
165
+ }
166
+
167
+ // Ensure new history entry has a scroll restoration key
168
+ ensureHistoryKey();
169
+
170
+ // Notify useLocationState() hooks when state changes
171
+ const hasOldState =
172
+ oldState &&
173
+ typeof oldState === "object" &&
174
+ ("state" in oldState ||
175
+ Object.keys(oldState).some((k) => k.startsWith("__rsc_ls_")));
176
+ const hasNewState =
177
+ historyState &&
178
+ ("state" in historyState ||
179
+ Object.keys(historyState).some((k) => k.startsWith("__rsc_ls_")));
180
+ if (hasOldState || hasNewState) {
181
+ window.dispatchEvent(new Event("__rsc_locationstate"));
182
+ }
183
+
184
+ // Update store history key so future navigations reference the right cache
185
+ store.setHistoryKey(historyKey);
186
+ store.setCurrentUrl(url);
187
+
188
+ // Notify hooks — location updates, state stays idle
189
+ eventController.setLocation(targetUrl);
190
+
191
+ // Handle post-navigation scroll
192
+ handleNavigationEnd({ scroll: options.scroll });
193
+ return;
194
+ }
195
+
490
196
  // Only abort pending requests when navigating to a different route
491
197
  // Same-route navigation (e.g., /todos -> /todos) should not cancel in-flight actions
492
198
  const currentPath = new URL(window.location.href).pathname;
493
- const targetPath = new URL(url, window.location.origin).pathname;
199
+ const targetPath = targetUrl.pathname;
494
200
  if (currentPath !== targetPath) {
495
201
  eventController.abortNavigation();
496
202
  }
@@ -503,7 +209,9 @@ export function createNavigationBridge(
503
209
  const isLeavingIntercept = isCurrentlyIntercept && isSamePathNavigation;
504
210
 
505
211
  if (isLeavingIntercept) {
506
- console.log(`[Browser] Leaving intercept - same URL navigation from intercept`);
212
+ debugLog(
213
+ "[Browser] Leaving intercept - same URL navigation from intercept",
214
+ );
507
215
  // Clear intercept source URL to ensure server doesn't treat this as intercept
508
216
  store.setInterceptSourceUrl(null);
509
217
  }
@@ -517,7 +225,7 @@ export function createNavigationBridge(
517
225
  store.cacheSegmentsForHistory(
518
226
  sourceHistoryKey,
519
227
  sourceCached.segments,
520
- currentHandleData
228
+ currentHandleData,
521
229
  );
522
230
  }
523
231
 
@@ -532,7 +240,7 @@ export function createNavigationBridge(
532
240
  const cachedHandleData = cached?.handleData;
533
241
  if (cachedSegments && sourceCached?.segments) {
534
242
  const sourceSegmentMap = new Map(
535
- sourceCached.segments.map((s) => [s.id, s])
243
+ sourceCached.segments.map((s) => [s.id, s]),
536
244
  );
537
245
  cachedSegments = cachedSegments.map((targetSeg) => {
538
246
  const sourceSeg = sourceSegmentMap.get(targetSeg.id);
@@ -547,18 +255,20 @@ export function createNavigationBridge(
547
255
  const interceptHistoryKey = generateHistoryKey(url, { intercept: true });
548
256
  const hasInterceptCache = store.hasHistoryCache(interceptHistoryKey);
549
257
 
550
- // Skip optimistic rendering for:
258
+ // Skip cached SWR for:
551
259
  // 1. intercept caches - interception depends on source page context
552
260
  // 2. routes that CAN be intercepted - we don't know if this navigation will intercept
553
261
  // 3. when leaving intercept - we need fresh non-intercept segments from server
262
+ // 4. redirect-with-state - force re-render so hooks read fresh state
554
263
  const hasUsableCache =
555
264
  cachedSegments &&
556
265
  cachedSegments.length > 0 &&
557
266
  !isInterceptOnlyCache(cachedSegments) &&
558
267
  !hasInterceptCache &&
559
- !isLeavingIntercept;
268
+ !isLeavingIntercept &&
269
+ !options?._skipCache;
560
270
 
561
- using tx = createNavigationTransaction(store, eventController, url, {
271
+ const tx = createNavigationTransaction(store, eventController, url, {
562
272
  ...options,
563
273
  state: resolvedState,
564
274
  skipLoadingState: hasUsableCache,
@@ -568,7 +278,11 @@ export function createNavigationBridge(
568
278
  try {
569
279
  await fetchPartialUpdate(
570
280
  url,
571
- hasUsableCache ? cachedSegments!.map((s) => s.id) : undefined,
281
+ hasUsableCache
282
+ ? cachedSegments!.map((s) => s.id)
283
+ : options?._skipCache
284
+ ? [] // Action redirect: send no segments so server renders everything fresh
285
+ : undefined,
572
286
  false,
573
287
  tx.handle.signal,
574
288
  tx.with({
@@ -577,55 +291,56 @@ export function createNavigationBridge(
577
291
  scroll: options?.scroll,
578
292
  state: resolvedState,
579
293
  }),
580
- // Pass cached segments (merged with current page's fresh segments for shared IDs)
581
- // so the segment map is consistent with what we tell the server we have.
582
- // Server decides what needs revalidation based on route matching and custom functions.
583
- // No need for staleRevalidation flag - we're sending the freshest segments we have.
584
- // Also pass cached handle data for restoring breadcrumbs when server returns empty diff.
585
- // When leaving intercept, pass the flag so fetchPartialUpdate knows to filter segments.
586
294
  hasUsableCache
587
- ? { targetCacheSegments: cachedSegments, targetCacheHandleData: cachedHandleData }
295
+ ? {
296
+ type: "navigate" as const,
297
+ targetCacheSegments: cachedSegments,
298
+ targetCacheHandleData: cachedHandleData,
299
+ }
588
300
  : isLeavingIntercept
589
- ? { leavingIntercept: true }
590
- : undefined
301
+ ? { type: "leave-intercept" as const }
302
+ : undefined,
591
303
  );
592
304
  } catch (error) {
593
- // Ignore AbortError - navigation was cancelled by a newer navigation
305
+ // Server-side redirect with location state: the current transaction's
306
+ // cleanup resets loading state. Re-navigate to the redirect
307
+ // target carrying the server-set state into history.pushState.
308
+ if (error instanceof ServerRedirect) {
309
+ const redirectUrl = validateRedirectOrigin(
310
+ error.url,
311
+ window.location.origin,
312
+ );
313
+ if (!redirectUrl) {
314
+ return;
315
+ }
316
+ return this.navigate(redirectUrl, {
317
+ state: error.state,
318
+ replace: options?.replace,
319
+ _skipCache: true,
320
+ } as NavigateOptionsInternal);
321
+ }
322
+
594
323
  if (error instanceof DOMException && error.name === "AbortError") {
595
- console.log("[Browser] Navigation aborted by newer navigation");
324
+ debugLog("[Browser] Navigation aborted by newer navigation");
596
325
  return;
597
326
  }
598
327
 
599
- // Handle network errors by triggering root error boundary
600
- if (error instanceof NetworkError || isNetworkError(error)) {
601
- const networkError =
602
- error instanceof NetworkError
603
- ? error
604
- : new NetworkError(
605
- "Unable to connect to server. Please check your connection.",
606
- { cause: error, url, operation: "navigation" }
607
- );
608
-
328
+ const networkError = toNetworkError(error, {
329
+ url,
330
+ operation: "navigation",
331
+ });
332
+ if (networkError) {
609
333
  console.error(
610
334
  "[Browser] Network error during navigation:",
611
- networkError
335
+ networkError,
612
336
  );
613
-
614
- // Emit update with NetworkErrorThrower to trigger root error boundary
615
- startTransition(() => {
616
- onUpdate({
617
- root: createElement(NetworkErrorThrower, { error: networkError }),
618
- metadata: {
619
- pathname: url,
620
- segments: [],
621
- isError: true,
622
- },
623
- });
624
- });
337
+ emitNetworkError(onUpdate, networkError, url);
625
338
  return;
626
339
  }
627
340
 
628
341
  throw error;
342
+ } finally {
343
+ tx[Symbol.dispose]();
629
344
  }
630
345
  },
631
346
 
@@ -635,11 +350,11 @@ export function createNavigationBridge(
635
350
  async refresh(): Promise<void> {
636
351
  eventController.abortNavigation();
637
352
 
638
- using tx = createNavigationTransaction(
353
+ const tx = createNavigationTransaction(
639
354
  store,
640
355
  eventController,
641
356
  window.location.href,
642
- { replace: true }
357
+ { replace: true },
643
358
  );
644
359
 
645
360
  try {
@@ -649,41 +364,24 @@ export function createNavigationBridge(
649
364
  [],
650
365
  false,
651
366
  tx.handle.signal,
652
- tx.with({ url: window.location.href, replace: true, scroll: false })
367
+ tx.with({ url: window.location.href, replace: true, scroll: false }),
653
368
  );
654
369
  } catch (error) {
655
- // Handle network errors by triggering root error boundary
656
- if (error instanceof NetworkError || isNetworkError(error)) {
657
- const networkError =
658
- error instanceof NetworkError
659
- ? error
660
- : new NetworkError(
661
- "Unable to connect to server. Please check your connection.",
662
- {
663
- cause: error,
664
- url: window.location.href,
665
- operation: "revalidation",
666
- }
667
- );
668
-
370
+ const networkError = toNetworkError(error, {
371
+ url: window.location.href,
372
+ operation: "revalidation",
373
+ });
374
+ if (networkError) {
669
375
  console.error(
670
376
  "[Browser] Network error during refresh:",
671
- networkError
377
+ networkError,
672
378
  );
673
-
674
- startTransition(() => {
675
- onUpdate({
676
- root: createElement(NetworkErrorThrower, { error: networkError }),
677
- metadata: {
678
- pathname: window.location.href,
679
- segments: [],
680
- isError: true,
681
- },
682
- });
683
- });
379
+ emitNetworkError(onUpdate, networkError, window.location.href);
684
380
  return;
685
381
  }
686
382
  throw error;
383
+ } finally {
384
+ tx[Symbol.dispose]();
687
385
  }
688
386
  },
689
387
 
@@ -707,8 +405,8 @@ export function createNavigationBridge(
707
405
  const currentInterceptSource = store.getInterceptSourceUrl();
708
406
  const newInterceptSource = interceptSourceUrl ?? null;
709
407
  if (currentInterceptSource !== newInterceptSource) {
710
- console.log(
711
- `[Browser] Intercept context changing (${currentInterceptSource} -> ${newInterceptSource}), aborting in-flight actions`
408
+ debugLog(
409
+ `[Browser] Intercept context changing (${currentInterceptSource} -> ${newInterceptSource}), aborting in-flight actions`,
712
410
  );
713
411
  eventController.abortAllActions();
714
412
  }
@@ -716,11 +414,11 @@ export function createNavigationBridge(
716
414
  // Compute history key from URL (with intercept suffix if applicable)
717
415
  const historyKey = generateHistoryKey(url, { intercept: isIntercept });
718
416
 
719
- console.log(
417
+ debugLog(
720
418
  "[Browser] Popstate -",
721
419
  isIntercept ? "intercept" : "normal",
722
420
  "key:",
723
- historyKey
421
+ historyKey,
724
422
  );
725
423
 
726
424
  // Update location in event controller
@@ -751,10 +449,19 @@ export function createNavigationBridge(
751
449
 
752
450
  // Render from cache - force await to skip loading fallbacks
753
451
  try {
754
- const root = renderSegments(cachedSegments, {
452
+ const root = await renderSegments(cachedSegments, {
755
453
  forceAwait: true,
756
454
  });
757
- onUpdate({
455
+ // Merge params from cached segments for useParams restoration.
456
+ // Set params on event controller before onUpdate so both location
457
+ // and params are current when the debounced notify() fires.
458
+ const cachedParams: Record<string, string> = {};
459
+ for (const s of cachedSegments) {
460
+ if (s.params) Object.assign(cachedParams, s.params);
461
+ }
462
+ eventController.setParams(cachedParams);
463
+
464
+ const popstateUpdate = {
758
465
  root,
759
466
  metadata: {
760
467
  pathname: new URL(url).pathname,
@@ -763,23 +470,35 @@ export function createNavigationBridge(
763
470
  matched: cachedSegments.map((s) => s.id),
764
471
  diff: [],
765
472
  cachedHandleData,
473
+ params: cachedParams,
766
474
  },
767
- });
475
+ };
476
+ const hasTransition = cachedSegments.some((s) => s.transition);
477
+ if (hasTransition) {
478
+ startTransition(() => {
479
+ if (addTransitionType) {
480
+ addTransitionType("navigation-back");
481
+ }
482
+ onUpdate(popstateUpdate);
483
+ });
484
+ } else {
485
+ onUpdate(popstateUpdate);
486
+ }
768
487
 
769
488
  // Restore scroll position for back/forward navigation
770
489
  handleNavigationEnd({ restore: true, isStreaming });
771
490
 
772
491
  // SWR: If stale, trigger background revalidation
773
492
  if (isStale) {
774
- console.log("[Browser] Cache is stale, background revalidating...");
493
+ debugLog("[Browser] Cache is stale, background revalidating...");
775
494
  // Background revalidation - don't await, just fire and forget
776
495
  const segmentIds = cachedSegments.map((s) => s.id);
777
496
 
778
- using tx = createNavigationTransaction(
497
+ const tx = createNavigationTransaction(
779
498
  store,
780
499
  eventController,
781
500
  url,
782
- { skipLoadingState: true, replace: true }
501
+ { skipLoadingState: true, replace: true },
783
502
  );
784
503
 
785
504
  fetchPartialUpdate(
@@ -795,41 +514,33 @@ export function createNavigationBridge(
795
514
  interceptSourceUrl,
796
515
  cacheOnly: true,
797
516
  }),
798
- { staleRevalidation: true, interceptSourceUrl }
799
- ).catch((error) => {
800
- if (
801
- error instanceof DOMException &&
802
- error.name === "AbortError"
803
- ) {
804
- console.log("[Browser] Background revalidation aborted");
805
- return;
806
- }
807
- // For background revalidation, network errors are logged but don't trigger error boundary
808
- // since the user is already seeing cached content
809
- if (error instanceof NetworkError || isNetworkError(error)) {
810
- console.warn(
811
- "[Browser] Background revalidation network error (cached content preserved):",
812
- error.message
517
+ { type: "stale-revalidation", interceptSourceUrl },
518
+ )
519
+ .catch((error) => {
520
+ if (isBackgroundSuppressible(error)) return;
521
+ console.error(
522
+ "[Browser] Background revalidation failed:",
523
+ error,
813
524
  );
814
- return;
815
- }
816
- console.error("[Browser] Background revalidation failed:", error);
817
- });
525
+ })
526
+ .finally(() => {
527
+ tx[Symbol.dispose]();
528
+ });
818
529
  }
819
530
  return;
820
531
  } catch (error) {
821
532
  console.warn(
822
533
  "[Browser] Failed to render from cache, fetching:",
823
- error
534
+ error,
824
535
  );
825
536
  // Fall through to fetch
826
537
  }
827
538
  } else {
828
- console.log("[Browser] History cache miss for key:", historyKey);
539
+ debugLog("[Browser] History cache miss for key:", historyKey);
829
540
  }
830
541
 
831
542
  // Fetch if not cached
832
- using tx = createNavigationTransaction(store, eventController, url, {
543
+ const tx = createNavigationTransaction(store, eventController, url, {
833
544
  replace: true,
834
545
  });
835
546
 
@@ -839,45 +550,39 @@ export function createNavigationBridge(
839
550
  undefined,
840
551
  false,
841
552
  tx.handle.signal,
842
- tx.with({ url, replace: true, scroll: false })
553
+ tx.with({
554
+ url,
555
+ replace: true,
556
+ scroll: false,
557
+ intercept: isIntercept,
558
+ interceptSourceUrl,
559
+ }),
560
+ isIntercept ? { type: "navigate", interceptSourceUrl } : undefined,
843
561
  );
844
562
  // Restore scroll position after fetch completes
845
563
  handleNavigationEnd({ restore: true, isStreaming });
846
564
  } catch (error) {
847
565
  if (error instanceof DOMException && error.name === "AbortError") {
848
- console.log("[Browser] Popstate navigation aborted");
566
+ debugLog("[Browser] Popstate navigation aborted");
849
567
  return;
850
568
  }
851
569
 
852
- // Handle network errors by triggering root error boundary
853
- if (error instanceof NetworkError || isNetworkError(error)) {
854
- const networkError =
855
- error instanceof NetworkError
856
- ? error
857
- : new NetworkError(
858
- "Unable to connect to server. Please check your connection.",
859
- { cause: error, url, operation: "navigation" }
860
- );
861
-
570
+ const networkError = toNetworkError(error, {
571
+ url,
572
+ operation: "navigation",
573
+ });
574
+ if (networkError) {
862
575
  console.error(
863
- "[Browser] Network error during popstate navigation:",
864
- networkError
576
+ "[Browser] Network error during popstate:",
577
+ networkError,
865
578
  );
866
-
867
- startTransition(() => {
868
- onUpdate({
869
- root: createElement(NetworkErrorThrower, { error: networkError }),
870
- metadata: {
871
- pathname: url,
872
- segments: [],
873
- isError: true,
874
- },
875
- });
876
- });
579
+ emitNetworkError(onUpdate, networkError, url);
877
580
  return;
878
581
  }
879
582
 
880
583
  throw error;
584
+ } finally {
585
+ tx[Symbol.dispose]();
881
586
  }
882
587
  },
883
588
 
@@ -894,17 +599,39 @@ export function createNavigationBridge(
894
599
  this.handlePopstate();
895
600
  };
896
601
 
602
+ // When the browser restores a page from bfcache (back-forward cache),
603
+ // any in-flight navigation state is stale. This happens when:
604
+ // 1. A navigation triggers X-RSC-Reload (e.g., response route hit via SPA)
605
+ // 2. window.location.href does a hard navigation
606
+ // 3. The user presses back and the browser restores from bfcache
607
+ // At that point, currentNavigation is still set from step 1, so
608
+ // getState() returns "loading" and the progress bar shows.
609
+ // Abort the stale navigation to reset state to idle.
610
+ const handlePageShow = (event: PageTransitionEvent) => {
611
+ if (event.persisted) {
612
+ debugLog(
613
+ "[Browser] Page restored from bfcache, resetting navigation state",
614
+ );
615
+ eventController.abortNavigation();
616
+ // pagehide flips scrollRestoration to "auto" for bfcache compat;
617
+ // restore "manual" so the router controls scroll on SPA navigations.
618
+ window.history.scrollRestoration = "manual";
619
+ }
620
+ };
621
+
897
622
  // Register cross-tab refresh callback with the store
898
623
  store.setCrossTabRefreshCallback(() => {
899
624
  this.refresh();
900
625
  });
901
626
 
902
627
  window.addEventListener("popstate", handlePopstate);
903
- console.log("[Browser] Navigation bridge ready");
628
+ window.addEventListener("pageshow", handlePageShow);
629
+ debugLog("[Browser] Navigation bridge ready");
904
630
 
905
631
  return () => {
906
632
  cleanupLinks();
907
633
  window.removeEventListener("popstate", handlePopstate);
634
+ window.removeEventListener("pageshow", handlePageShow);
908
635
  };
909
636
  },
910
637
  };