@rangojs/router 0.0.0-experimental.11 → 0.0.0-experimental.110

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 (1140) hide show
  1. package/AGENTS.md +9 -0
  2. package/README.md +1037 -4
  3. package/dist/__internal.d.ts +83 -0
  4. package/dist/__internal.d.ts.map +1 -0
  5. package/dist/__internal.js +19 -0
  6. package/dist/__internal.js.map +1 -0
  7. package/dist/__mocks__/version.d.ts +7 -0
  8. package/dist/__mocks__/version.d.ts.map +1 -0
  9. package/dist/__mocks__/version.js +7 -0
  10. package/dist/__mocks__/version.js.map +1 -0
  11. package/dist/__tests__/client-href.test.d.ts +2 -0
  12. package/dist/__tests__/client-href.test.d.ts.map +1 -0
  13. package/dist/__tests__/client-href.test.js +74 -0
  14. package/dist/__tests__/client-href.test.js.map +1 -0
  15. package/dist/__tests__/component-utils.test.d.ts +2 -0
  16. package/dist/__tests__/component-utils.test.d.ts.map +1 -0
  17. package/dist/__tests__/component-utils.test.js +51 -0
  18. package/dist/__tests__/component-utils.test.js.map +1 -0
  19. package/dist/__tests__/event-controller.test.d.ts +2 -0
  20. package/dist/__tests__/event-controller.test.d.ts.map +1 -0
  21. package/dist/__tests__/event-controller.test.js +538 -0
  22. package/dist/__tests__/event-controller.test.js.map +1 -0
  23. package/dist/__tests__/helpers/route-tree.d.ts +118 -0
  24. package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
  25. package/dist/__tests__/helpers/route-tree.js +374 -0
  26. package/dist/__tests__/helpers/route-tree.js.map +1 -0
  27. package/dist/__tests__/match-result.test.d.ts +2 -0
  28. package/dist/__tests__/match-result.test.d.ts.map +1 -0
  29. package/dist/__tests__/match-result.test.js +154 -0
  30. package/dist/__tests__/match-result.test.js.map +1 -0
  31. package/dist/__tests__/navigation-store.test.d.ts +2 -0
  32. package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
  33. package/dist/__tests__/navigation-store.test.js +440 -0
  34. package/dist/__tests__/navigation-store.test.js.map +1 -0
  35. package/dist/__tests__/partial-update.test.d.ts +2 -0
  36. package/dist/__tests__/partial-update.test.d.ts.map +1 -0
  37. package/dist/__tests__/partial-update.test.js +1009 -0
  38. package/dist/__tests__/partial-update.test.js.map +1 -0
  39. package/dist/__tests__/reverse-types.test.d.ts +8 -0
  40. package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
  41. package/dist/__tests__/reverse-types.test.js +656 -0
  42. package/dist/__tests__/reverse-types.test.js.map +1 -0
  43. package/dist/__tests__/route-definition.test.d.ts +2 -0
  44. package/dist/__tests__/route-definition.test.d.ts.map +1 -0
  45. package/dist/__tests__/route-definition.test.js +55 -0
  46. package/dist/__tests__/route-definition.test.js.map +1 -0
  47. package/dist/__tests__/router-helpers.test.d.ts +2 -0
  48. package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
  49. package/dist/__tests__/router-helpers.test.js +377 -0
  50. package/dist/__tests__/router-helpers.test.js.map +1 -0
  51. package/dist/__tests__/router-integration-2.test.d.ts +2 -0
  52. package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
  53. package/dist/__tests__/router-integration-2.test.js +426 -0
  54. package/dist/__tests__/router-integration-2.test.js.map +1 -0
  55. package/dist/__tests__/router-integration.test.d.ts +2 -0
  56. package/dist/__tests__/router-integration.test.d.ts.map +1 -0
  57. package/dist/__tests__/router-integration.test.js +1051 -0
  58. package/dist/__tests__/router-integration.test.js.map +1 -0
  59. package/dist/__tests__/search-params.test.d.ts +5 -0
  60. package/dist/__tests__/search-params.test.d.ts.map +1 -0
  61. package/dist/__tests__/search-params.test.js +306 -0
  62. package/dist/__tests__/search-params.test.js.map +1 -0
  63. package/dist/__tests__/segment-system.test.d.ts +2 -0
  64. package/dist/__tests__/segment-system.test.d.ts.map +1 -0
  65. package/dist/__tests__/segment-system.test.js +627 -0
  66. package/dist/__tests__/segment-system.test.js.map +1 -0
  67. package/dist/__tests__/static-handler-types.test.d.ts +8 -0
  68. package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
  69. package/dist/__tests__/static-handler-types.test.js +63 -0
  70. package/dist/__tests__/static-handler-types.test.js.map +1 -0
  71. package/dist/__tests__/urls.test.d.ts +2 -0
  72. package/dist/__tests__/urls.test.d.ts.map +1 -0
  73. package/dist/__tests__/urls.test.js +421 -0
  74. package/dist/__tests__/urls.test.js.map +1 -0
  75. package/dist/__tests__/use-mount.test.d.ts +2 -0
  76. package/dist/__tests__/use-mount.test.d.ts.map +1 -0
  77. package/dist/__tests__/use-mount.test.js +35 -0
  78. package/dist/__tests__/use-mount.test.js.map +1 -0
  79. package/dist/bin/rango.d.ts +2 -0
  80. package/dist/bin/rango.d.ts.map +1 -0
  81. package/dist/bin/rango.js +1635 -158
  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 +6148 -2425
  798. package/dist/vite/index.js.bak +5448 -0
  799. package/dist/vite/index.js.map +1 -0
  800. package/dist/vite/index.named-routes.gen.ts +103 -0
  801. package/dist/vite/package-resolution.d.ts +43 -0
  802. package/dist/vite/package-resolution.d.ts.map +1 -0
  803. package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
  804. package/dist/vite/package-resolution.js.map +1 -0
  805. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  806. package/dist/vite/virtual-entries.d.ts +25 -0
  807. package/dist/vite/virtual-entries.d.ts.map +1 -0
  808. package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
  809. package/dist/vite/virtual-entries.js.map +1 -0
  810. package/package.json +73 -66
  811. package/skills/breadcrumbs/SKILL.md +252 -0
  812. package/skills/bundle-analysis/SKILL.md +159 -0
  813. package/skills/cache-guide/SKILL.md +473 -0
  814. package/skills/caching/SKILL.md +94 -24
  815. package/skills/composability/SKILL.md +197 -0
  816. package/skills/debug-manifest/SKILL.md +12 -8
  817. package/skills/document-cache/SKILL.md +18 -16
  818. package/skills/fonts/SKILL.md +6 -4
  819. package/skills/handler-use/SKILL.md +364 -0
  820. package/skills/hooks/SKILL.md +524 -71
  821. package/skills/host-router/SKILL.md +243 -0
  822. package/skills/i18n/SKILL.md +276 -0
  823. package/skills/intercept/SKILL.md +173 -8
  824. package/skills/layout/SKILL.md +123 -5
  825. package/skills/links/SKILL.md +316 -25
  826. package/skills/loader/SKILL.md +620 -50
  827. package/skills/middleware/SKILL.md +211 -37
  828. package/skills/migrate-nextjs/SKILL.md +562 -0
  829. package/skills/migrate-react-router/SKILL.md +769 -0
  830. package/skills/mime-routes/SKILL.md +42 -11
  831. package/skills/observability/SKILL.md +137 -0
  832. package/skills/parallel/SKILL.md +271 -3
  833. package/skills/prerender/SKILL.md +448 -63
  834. package/skills/rango/SKILL.md +273 -21
  835. package/skills/response-routes/SKILL.md +210 -100
  836. package/skills/route/SKILL.md +310 -14
  837. package/skills/router-setup/SKILL.md +211 -33
  838. package/skills/server-actions/SKILL.md +751 -0
  839. package/skills/streams-and-websockets/SKILL.md +283 -0
  840. package/skills/theme/SKILL.md +9 -8
  841. package/skills/typesafety/SKILL.md +622 -91
  842. package/skills/use-cache/SKILL.md +324 -0
  843. package/skills/view-transitions/SKILL.md +212 -0
  844. package/src/__augment-tests__/augment.ts +81 -0
  845. package/src/__augment-tests__/augmented.check.ts +117 -0
  846. package/src/__internal.ts +102 -4
  847. package/src/bin/rango.ts +312 -15
  848. package/src/browser/action-coordinator.ts +97 -0
  849. package/src/browser/action-response-classifier.ts +99 -0
  850. package/src/browser/app-shell.ts +52 -0
  851. package/src/browser/app-version.ts +14 -0
  852. package/src/browser/event-controller.ts +136 -68
  853. package/src/browser/history-state.ts +101 -0
  854. package/src/browser/index.ts +3 -3
  855. package/src/browser/intercept-utils.ts +52 -0
  856. package/src/browser/link-interceptor.ts +24 -4
  857. package/src/browser/logging.ts +55 -0
  858. package/src/browser/merge-segment-loaders.ts +20 -12
  859. package/src/browser/navigation-bridge.ts +370 -561
  860. package/src/browser/navigation-client.ts +228 -70
  861. package/src/browser/navigation-store.ts +97 -55
  862. package/src/browser/navigation-transaction.ts +293 -0
  863. package/src/browser/network-error-handler.ts +61 -0
  864. package/src/browser/partial-update.ts +376 -315
  865. package/src/browser/prefetch/cache.ts +314 -0
  866. package/src/browser/prefetch/fetch.ts +282 -0
  867. package/src/browser/prefetch/observer.ts +65 -0
  868. package/src/browser/prefetch/policy.ts +48 -0
  869. package/src/browser/prefetch/queue.ts +191 -0
  870. package/src/browser/prefetch/resource-ready.ts +77 -0
  871. package/src/browser/rango-state.ts +152 -0
  872. package/src/browser/react/Link.tsx +255 -71
  873. package/src/browser/react/NavigationProvider.tsx +152 -24
  874. package/src/browser/react/context.ts +11 -0
  875. package/src/browser/react/filter-segment-order.ts +55 -0
  876. package/src/browser/react/index.ts +15 -12
  877. package/src/browser/react/location-state-shared.ts +176 -53
  878. package/src/browser/react/location-state.ts +90 -19
  879. package/src/browser/react/mount-context.ts +6 -1
  880. package/src/browser/react/nonce-context.ts +23 -0
  881. package/src/browser/react/shallow-equal.ts +27 -0
  882. package/src/browser/react/use-action.ts +29 -51
  883. package/src/browser/react/use-client-cache.ts +5 -3
  884. package/src/browser/react/use-handle.ts +41 -123
  885. package/src/browser/react/use-link-status.ts +6 -5
  886. package/src/browser/react/use-navigation.ts +44 -65
  887. package/src/browser/react/use-params.ts +78 -0
  888. package/src/browser/react/use-pathname.ts +47 -0
  889. package/src/browser/react/use-reverse.ts +99 -0
  890. package/src/browser/react/use-router.ts +96 -0
  891. package/src/browser/react/use-search-params.ts +56 -0
  892. package/src/browser/react/use-segments.ts +85 -99
  893. package/src/browser/response-adapter.ts +73 -0
  894. package/src/browser/rsc-router.tsx +254 -72
  895. package/src/browser/scroll-restoration.ts +132 -49
  896. package/src/browser/segment-reconciler.ts +243 -0
  897. package/src/browser/segment-structure-assert.ts +17 -1
  898. package/src/browser/server-action-bridge.ts +510 -603
  899. package/src/browser/shallow.ts +6 -1
  900. package/src/browser/types.ts +158 -48
  901. package/src/browser/validate-redirect-origin.ts +29 -0
  902. package/src/build/generate-manifest.ts +87 -26
  903. package/src/build/generate-route-types.ts +39 -828
  904. package/src/build/index.ts +2 -5
  905. package/src/build/route-trie.ts +84 -31
  906. package/src/build/route-types/ast-helpers.ts +25 -0
  907. package/src/build/route-types/ast-route-extraction.ts +98 -0
  908. package/src/build/route-types/codegen.ts +102 -0
  909. package/src/build/route-types/include-resolution.ts +418 -0
  910. package/src/build/route-types/param-extraction.ts +48 -0
  911. package/src/build/route-types/per-module-writer.ts +128 -0
  912. package/src/build/route-types/router-processing.ts +618 -0
  913. package/src/build/route-types/scan-filter.ts +85 -0
  914. package/src/build/runtime-discovery.ts +231 -0
  915. package/src/cache/background-task.ts +34 -0
  916. package/src/cache/cache-key-utils.ts +44 -0
  917. package/src/cache/cache-policy.ts +125 -0
  918. package/src/cache/cache-runtime.ts +342 -0
  919. package/src/cache/cache-scope.ts +167 -307
  920. package/src/cache/cf/cf-cache-store.ts +573 -21
  921. package/src/cache/cf/index.ts +13 -3
  922. package/src/cache/document-cache.ts +116 -77
  923. package/src/cache/handle-capture.ts +81 -0
  924. package/src/cache/handle-snapshot.ts +41 -0
  925. package/src/cache/index.ts +1 -15
  926. package/src/cache/memory-segment-store.ts +191 -13
  927. package/src/cache/profile-registry.ts +73 -0
  928. package/src/cache/read-through-swr.ts +134 -0
  929. package/src/cache/segment-codec.ts +256 -0
  930. package/src/cache/taint.ts +153 -0
  931. package/src/cache/types.ts +72 -122
  932. package/src/client.rsc.tsx +6 -1
  933. package/src/client.tsx +117 -303
  934. package/src/component-utils.ts +4 -4
  935. package/src/components/DefaultDocument.tsx +5 -1
  936. package/src/context-var.ts +156 -0
  937. package/src/debug.ts +19 -9
  938. package/src/errors.ts +78 -8
  939. package/src/handle.ts +56 -11
  940. package/src/handles/MetaTags.tsx +73 -20
  941. package/src/handles/breadcrumbs.ts +66 -0
  942. package/src/handles/index.ts +1 -0
  943. package/src/handles/meta.ts +30 -13
  944. package/src/host/cookie-handler.ts +21 -15
  945. package/src/host/errors.ts +8 -8
  946. package/src/host/index.ts +6 -9
  947. package/src/host/pattern-matcher.ts +27 -27
  948. package/src/host/router.ts +176 -82
  949. package/src/host/testing.ts +8 -8
  950. package/src/host/types.ts +46 -9
  951. package/src/host/utils.ts +2 -2
  952. package/src/href-client.ts +196 -56
  953. package/src/index.rsc.ts +140 -22
  954. package/src/index.ts +214 -53
  955. package/src/internal-debug.ts +11 -0
  956. package/src/loader-store.ts +463 -0
  957. package/src/loader.rsc.ts +25 -143
  958. package/src/loader.ts +27 -10
  959. package/src/network-error-thrower.tsx +3 -1
  960. package/src/outlet-context.ts +1 -1
  961. package/src/outlet-provider.tsx +45 -0
  962. package/src/prerender/param-hash.ts +4 -2
  963. package/src/prerender/store.ts +122 -17
  964. package/src/prerender.ts +397 -29
  965. package/src/response-utils.ts +28 -0
  966. package/src/reverse.ts +231 -121
  967. package/src/root-error-boundary.tsx +41 -29
  968. package/src/route-content-wrapper.tsx +7 -4
  969. package/src/route-definition/dsl-helpers.ts +1134 -0
  970. package/src/route-definition/helper-factories.ts +200 -0
  971. package/src/route-definition/helpers-types.ts +485 -0
  972. package/src/route-definition/index.ts +55 -0
  973. package/src/route-definition/redirect.ts +101 -0
  974. package/src/route-definition/resolve-handler-use.ts +155 -0
  975. package/src/route-definition.ts +1 -1431
  976. package/src/route-map-builder.ts +162 -123
  977. package/src/route-name.ts +53 -0
  978. package/src/route-types.ts +64 -9
  979. package/src/router/content-negotiation.ts +215 -0
  980. package/src/router/debug-manifest.ts +72 -0
  981. package/src/router/error-handling.ts +10 -10
  982. package/src/router/find-match.ts +160 -0
  983. package/src/router/handler-context.ts +376 -109
  984. package/src/router/intercept-resolution.ts +35 -20
  985. package/src/router/lazy-includes.ts +237 -0
  986. package/src/router/loader-resolution.ts +330 -145
  987. package/src/router/logging.ts +251 -0
  988. package/src/router/manifest.ts +70 -22
  989. package/src/router/match-api.ts +196 -261
  990. package/src/router/match-context.ts +4 -2
  991. package/src/router/match-handlers.ts +441 -0
  992. package/src/router/match-middleware/background-revalidation.ts +108 -93
  993. package/src/router/match-middleware/cache-lookup.ts +414 -91
  994. package/src/router/match-middleware/cache-store.ts +91 -29
  995. package/src/router/match-middleware/intercept-resolution.ts +48 -21
  996. package/src/router/match-middleware/segment-resolution.ts +73 -9
  997. package/src/router/match-pipelines.ts +10 -45
  998. package/src/router/match-result.ts +154 -35
  999. package/src/router/metrics.ts +241 -16
  1000. package/src/router/middleware-cookies.ts +55 -0
  1001. package/src/router/middleware-types.ts +209 -0
  1002. package/src/router/middleware.ts +373 -371
  1003. package/src/router/navigation-snapshot.ts +182 -0
  1004. package/src/router/pattern-matching.ts +291 -54
  1005. package/src/router/prerender-match.ts +502 -0
  1006. package/src/router/preview-match.ts +98 -0
  1007. package/src/router/request-classification.ts +310 -0
  1008. package/src/router/revalidation.ts +195 -40
  1009. package/src/router/route-snapshot.ts +245 -0
  1010. package/src/router/router-context.ts +41 -21
  1011. package/src/router/router-interfaces.ts +490 -0
  1012. package/src/router/router-options.ts +618 -0
  1013. package/src/router/router-registry.ts +21 -0
  1014. package/src/router/segment-resolution/fresh.ts +756 -0
  1015. package/src/router/segment-resolution/helpers.ts +268 -0
  1016. package/src/router/segment-resolution/loader-cache.ts +199 -0
  1017. package/src/router/segment-resolution/revalidation.ts +1407 -0
  1018. package/src/router/segment-resolution/static-store.ts +67 -0
  1019. package/src/router/segment-resolution.ts +21 -1336
  1020. package/src/router/segment-wrappers.ts +291 -0
  1021. package/src/router/substitute-pattern-params.ts +56 -0
  1022. package/src/router/telemetry-otel.ts +299 -0
  1023. package/src/router/telemetry.ts +300 -0
  1024. package/src/router/timeout.ts +148 -0
  1025. package/src/router/trie-matching.ts +111 -39
  1026. package/src/router/types.ts +17 -9
  1027. package/src/router/url-params.ts +49 -0
  1028. package/src/router.ts +707 -2291
  1029. package/src/rsc/handler-context.ts +45 -0
  1030. package/src/rsc/handler.ts +864 -1117
  1031. package/src/rsc/helpers.ts +181 -19
  1032. package/src/rsc/index.ts +1 -21
  1033. package/src/rsc/loader-fetch.ts +229 -0
  1034. package/src/rsc/manifest-init.ts +90 -0
  1035. package/src/rsc/nonce.ts +14 -0
  1036. package/src/rsc/origin-guard.ts +141 -0
  1037. package/src/rsc/progressive-enhancement.ts +395 -0
  1038. package/src/rsc/response-error.ts +37 -0
  1039. package/src/rsc/response-route-handler.ts +360 -0
  1040. package/src/rsc/rsc-rendering.ts +256 -0
  1041. package/src/rsc/runtime-warnings.ts +42 -0
  1042. package/src/rsc/server-action.ts +360 -0
  1043. package/src/rsc/ssr-setup.ts +128 -0
  1044. package/src/rsc/types.ts +52 -11
  1045. package/src/search-params.ts +230 -0
  1046. package/src/segment-content-promise.ts +67 -0
  1047. package/src/segment-loader-promise.ts +122 -0
  1048. package/src/segment-system.tsx +187 -38
  1049. package/src/serialize.ts +243 -0
  1050. package/src/server/context.ts +344 -70
  1051. package/src/server/cookie-store.ts +190 -0
  1052. package/src/server/fetchable-loader-store.ts +37 -0
  1053. package/src/server/handle-store.ts +113 -15
  1054. package/src/server/loader-registry.ts +24 -64
  1055. package/src/server/request-context.ts +603 -109
  1056. package/src/server.ts +35 -155
  1057. package/src/ssr/index.tsx +107 -30
  1058. package/src/static-handler.ts +126 -0
  1059. package/src/theme/ThemeProvider.tsx +21 -15
  1060. package/src/theme/ThemeScript.tsx +5 -5
  1061. package/src/theme/constants.ts +5 -2
  1062. package/src/theme/index.ts +4 -14
  1063. package/src/theme/theme-context.ts +4 -30
  1064. package/src/theme/theme-script.ts +21 -18
  1065. package/src/types/boundaries.ts +158 -0
  1066. package/src/types/cache-types.ts +198 -0
  1067. package/src/types/error-types.ts +192 -0
  1068. package/src/types/global-namespace.ts +113 -0
  1069. package/src/types/handler-context.ts +806 -0
  1070. package/src/types/index.ts +89 -0
  1071. package/src/types/loader-types.ts +209 -0
  1072. package/src/types/request-scope.ts +126 -0
  1073. package/src/types/route-config.ts +170 -0
  1074. package/src/types/route-entry.ts +120 -0
  1075. package/src/types/segments.ts +167 -0
  1076. package/src/types.ts +1 -1763
  1077. package/src/urls/include-helper.ts +207 -0
  1078. package/src/urls/index.ts +53 -0
  1079. package/src/urls/path-helper-types.ts +372 -0
  1080. package/src/urls/path-helper.ts +364 -0
  1081. package/src/urls/pattern-types.ts +141 -0
  1082. package/src/urls/response-types.ts +108 -0
  1083. package/src/urls/type-extraction.ts +377 -0
  1084. package/src/urls/urls-function.ts +98 -0
  1085. package/src/urls.ts +1 -1288
  1086. package/src/use-loader.tsx +511 -107
  1087. package/src/vite/debug.ts +184 -0
  1088. package/src/vite/discovery/bundle-postprocess.ts +181 -0
  1089. package/src/vite/discovery/discover-routers.ts +374 -0
  1090. package/src/vite/discovery/discovery-errors.ts +194 -0
  1091. package/src/vite/discovery/gate-state.ts +171 -0
  1092. package/src/vite/discovery/prerender-collection.ts +480 -0
  1093. package/src/vite/discovery/route-types-writer.ts +258 -0
  1094. package/src/vite/discovery/self-gen-tracking.ts +73 -0
  1095. package/src/vite/discovery/state.ts +143 -0
  1096. package/src/vite/discovery/virtual-module-codegen.ts +193 -0
  1097. package/src/vite/index.ts +15 -2012
  1098. package/src/vite/plugin-types.ts +103 -0
  1099. package/src/vite/plugins/cjs-to-esm.ts +98 -0
  1100. package/src/vite/plugins/client-ref-dedup.ts +131 -0
  1101. package/src/vite/plugins/client-ref-hashing.ts +117 -0
  1102. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1103. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1104. package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
  1105. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +109 -66
  1106. package/src/vite/plugins/expose-id-utils.ts +303 -0
  1107. package/src/vite/plugins/expose-ids/export-analysis.ts +320 -0
  1108. package/src/vite/plugins/expose-ids/handler-transform.ts +209 -0
  1109. package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
  1110. package/src/vite/plugins/expose-ids/router-transform.ts +127 -0
  1111. package/src/vite/plugins/expose-ids/types.ts +45 -0
  1112. package/src/vite/plugins/expose-internal-ids.ts +816 -0
  1113. package/src/vite/plugins/performance-tracks.ts +92 -0
  1114. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1115. package/src/vite/plugins/use-cache-transform.ts +336 -0
  1116. package/src/vite/plugins/version-injector.ts +109 -0
  1117. package/src/vite/plugins/version-plugin.ts +323 -0
  1118. package/src/vite/plugins/virtual-entries.ts +123 -0
  1119. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  1120. package/src/vite/rango.ts +509 -0
  1121. package/src/vite/router-discovery.ts +1511 -0
  1122. package/src/vite/utils/ast-handler-extract.ts +517 -0
  1123. package/src/vite/utils/banner.ts +36 -0
  1124. package/src/vite/utils/bundle-analysis.ts +139 -0
  1125. package/src/vite/utils/forward-user-plugins.ts +193 -0
  1126. package/src/vite/utils/manifest-utils.ts +86 -0
  1127. package/src/vite/utils/package-resolution.ts +161 -0
  1128. package/src/vite/utils/prerender-utils.ts +222 -0
  1129. package/src/vite/utils/shared-utils.ts +174 -0
  1130. package/CLAUDE.md +0 -43
  1131. package/src/browser/lru-cache.ts +0 -69
  1132. package/src/browser/request-controller.ts +0 -164
  1133. package/src/cache/memory-store.ts +0 -253
  1134. package/src/router.gen.ts +0 -6
  1135. package/src/urls.gen.ts +0 -8
  1136. package/src/vite/expose-handle-id.ts +0 -209
  1137. package/src/vite/expose-loader-id.ts +0 -426
  1138. package/src/vite/expose-location-state-id.ts +0 -177
  1139. package/src/vite/expose-prerender-handler-id.ts +0 -429
  1140. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
@@ -1,442 +1,48 @@
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 { setAppVersion } from "./app-version.js";
8
+ import { setRangoStateLocal } from "./rango-state.js";
9
+ import type { AppShell, AppShellRef } from "./app-shell.js";
10
+ import * as React from "react";
11
+ import { startTransition } from "react";
8
12
  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
- }
22
-
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
- }
38
-
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
- }
13
+ createNavigationTransaction,
14
+ resolveNavigationState,
15
+ } from "./navigation-transaction.js";
16
+ import { buildHistoryState, pushHistoryWithIdx } from "./history-state.js";
17
+ import {
18
+ handleNavigationStart,
19
+ handleNavigationEnd,
20
+ ensureHistoryKey,
21
+ } from "./scroll-restoration.js";
57
22
 
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
- }
23
+ // addTransitionType is only available in React experimental
24
+ const addTransitionType: ((type: string) => void) | undefined =
25
+ "addTransitionType" in React ? (React as any).addTransitionType : undefined;
68
26
 
69
- return Object.keys(result).length > 0 ? result : null;
70
- }
71
27
  import { setupLinkInterception } from "./link-interceptor.js";
72
28
  import { createPartialUpdater } from "./partial-update.js";
73
29
  import { generateHistoryKey } from "./navigation-store.js";
30
+ import type { EventController } from "./event-controller.js";
31
+ import { isInterceptOnlyCache } from "./intercept-utils.js";
74
32
  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";
33
+ toNetworkError,
34
+ emitNetworkError,
35
+ isBackgroundSuppressible,
36
+ } from "./network-error-handler.js";
37
+ import { debugLog } from "./logging.js";
38
+ import { ServerRedirect } from "../errors.js";
39
+ import { validateRedirectOrigin } from "./validate-redirect-origin.js";
83
40
 
84
41
  // Polyfill Symbol.dispose for Safari and older browsers
85
42
  if (typeof Symbol.dispose === "undefined") {
86
43
  (Symbol as any).dispose = Symbol("Symbol.dispose");
87
44
  }
88
45
 
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
46
  export { createNavigationTransaction };
441
47
 
442
48
  /**
@@ -444,8 +50,13 @@ export { createNavigationTransaction };
444
50
  */
445
51
  export interface NavigationBridgeConfigWithController extends NavigationBridgeConfig {
446
52
  eventController: EventController;
447
- /** RSC version from initial payload metadata */
53
+ /** RSC version from initial payload metadata (fallback when appShellRef is not provided) */
448
54
  version?: string;
55
+ /**
56
+ * Live app-shell ref. When supplied, the bridge reads version/basename
57
+ * from this ref so cross-app navigations propagate correctly.
58
+ */
59
+ appShellRef?: AppShellRef;
449
60
  }
450
61
 
451
62
  /**
@@ -462,9 +73,47 @@ export interface NavigationBridgeConfigWithController extends NavigationBridgeCo
462
73
  * @returns NavigationBridge instance
463
74
  */
464
75
  export function createNavigationBridge(
465
- config: NavigationBridgeConfigWithController
76
+ config: NavigationBridgeConfigWithController,
466
77
  ): NavigationBridge {
467
- const { store, client, eventController, onUpdate, renderSegments, version } = config;
78
+ const {
79
+ store,
80
+ client,
81
+ eventController,
82
+ onUpdate,
83
+ renderSegments,
84
+ appShellRef,
85
+ } = config;
86
+ let version = config.version;
87
+
88
+ /**
89
+ * Replace the active app-shell snapshot atomically. Called by the partial
90
+ * updater when a response's routerId indicates the navigation crossed
91
+ * into a different app. Runs the local-only side-effects tied to
92
+ * app-shell fields (app version, rango-state namespace) so the new app
93
+ * owns them after the swap. Theme, warmup, and prefetch TTL are
94
+ * document-lifetime and are NOT touched here.
95
+ */
96
+ function applyAppShell(next: AppShell): void {
97
+ if (appShellRef) {
98
+ appShellRef.update(next);
99
+ }
100
+ if (next.version !== undefined) {
101
+ version = next.version;
102
+ setAppVersion(next.version);
103
+ // Use the local-only setter — initRangoState writes the shared
104
+ // localStorage key and fires a storage event in other tabs still in
105
+ // the old app. setRangoStateLocal only mutates this tab's in-memory
106
+ // cache and rebinds it to the target app's routerId-scoped key,
107
+ // preserving the "local-only, no broadcast/rotation" contract for
108
+ // smooth app-switch transitions.
109
+ setRangoStateLocal(next.version, next.routerId);
110
+ }
111
+ // Cross-app: prior cache entries belong to a different app's segments.
112
+ // Drop them locally only — do NOT broadcast invalidation or rotate the
113
+ // shared X-Rango-State token, since other tabs still in the old app are
114
+ // unaffected by this tab's transition.
115
+ store.clearHistoryCacheLocal();
116
+ }
468
117
 
469
118
  // Create shared partial updater
470
119
  const fetchPartialUpdate = createPartialUpdater({
@@ -472,25 +121,124 @@ export function createNavigationBridge(
472
121
  client,
473
122
  onUpdate,
474
123
  renderSegments,
475
- version,
124
+ getVersion: () => version,
125
+ applyAppShell,
476
126
  });
477
127
 
478
128
  return {
479
129
  /**
480
130
  * Navigate to a URL
481
- * Uses optimistic rendering from cache when available (SWR pattern)
131
+ * Uses cached segments for SWR revalidation when available
482
132
  */
483
- async navigate(url: string, options?: NavigateOptions): Promise<void> {
133
+ async navigate(
134
+ url: string,
135
+ options?: NavigateOptionsInternal,
136
+ ): Promise<void> {
484
137
  // Resolve LocationStateEntry[] to flat object if needed
485
138
  const resolvedState =
486
139
  options?.state !== undefined
487
140
  ? resolveNavigationState(options.state)
488
141
  : undefined;
489
142
 
143
+ // Cross-origin URLs are not handled by SPA navigation.
144
+ // Fall back to a full browser navigation for http/https only.
145
+ let targetUrl: URL;
146
+ try {
147
+ targetUrl = new URL(url, window.location.origin);
148
+ } catch {
149
+ console.warn(`[rango] navigate() ignored: malformed URL "${url}"`);
150
+ return;
151
+ }
152
+ if (targetUrl.origin !== window.location.origin) {
153
+ if (targetUrl.protocol !== "http:" && targetUrl.protocol !== "https:") {
154
+ console.error(
155
+ `[rango] navigate() blocked: unsupported scheme "${targetUrl.protocol}"`,
156
+ );
157
+ return;
158
+ }
159
+ window.location.href = targetUrl.href;
160
+ return;
161
+ }
162
+
163
+ // Shallow navigation: skip RSC fetch when revalidate is false
164
+ // and the pathname hasn't changed (search param / hash only change).
165
+ if (
166
+ options?.revalidate === false &&
167
+ targetUrl.pathname === new URL(window.location.href).pathname
168
+ ) {
169
+ // Preserve intercept context from the current history entry so that
170
+ // popstate uses the correct cache key (:intercept suffix) and restores
171
+ // the right full-page vs modal semantics.
172
+ const currentHistoryState = window.history.state;
173
+ const isIntercept = currentHistoryState?.intercept === true;
174
+ const interceptSourceUrl = isIntercept
175
+ ? currentHistoryState?.sourceUrl
176
+ : undefined;
177
+
178
+ const historyKey = generateHistoryKey(url, { intercept: isIntercept });
179
+
180
+ // Copy current segments to the new history key so back/forward restores instantly
181
+ const currentKey = store.getHistoryKey();
182
+ const currentCache = store.getCachedSegments(currentKey);
183
+ if (currentCache?.segments) {
184
+ const currentHandleData = eventController.getHandleState().data;
185
+ store.cacheSegmentsForHistory(
186
+ historyKey,
187
+ currentCache.segments,
188
+ currentHandleData,
189
+ );
190
+ }
191
+
192
+ // Save current scroll position before changing URL
193
+ handleNavigationStart();
194
+
195
+ // Snapshot old state before pushState/replaceState overwrites it
196
+ const oldState = window.history.state;
197
+
198
+ // Update browser URL (carry intercept context into history state)
199
+ const historyState = buildHistoryState(
200
+ resolvedState,
201
+ {
202
+ intercept: isIntercept || undefined,
203
+ sourceUrl: interceptSourceUrl,
204
+ },
205
+ {},
206
+ );
207
+ pushHistoryWithIdx(historyState, url, options?.replace ?? false);
208
+
209
+ // Ensure new history entry has a scroll restoration key
210
+ ensureHistoryKey();
211
+
212
+ // Notify useLocationState() hooks when state changes
213
+ const hasOldState =
214
+ oldState &&
215
+ typeof oldState === "object" &&
216
+ ("state" in oldState ||
217
+ Object.keys(oldState).some((k) => k.startsWith("__rsc_ls_")));
218
+ const hasNewState =
219
+ historyState &&
220
+ ("state" in historyState ||
221
+ Object.keys(historyState).some((k) => k.startsWith("__rsc_ls_")));
222
+ if (hasOldState || hasNewState) {
223
+ window.dispatchEvent(new Event("__rsc_locationstate"));
224
+ }
225
+
226
+ // Update store history key so future navigations reference the right cache
227
+ store.setHistoryKey(historyKey);
228
+ store.setCurrentUrl(url);
229
+
230
+ // Notify hooks — location updates, state stays idle
231
+ eventController.setLocation(targetUrl);
232
+
233
+ // Handle post-navigation scroll
234
+ handleNavigationEnd({ scroll: options.scroll });
235
+ return;
236
+ }
237
+
490
238
  // Only abort pending requests when navigating to a different route
491
239
  // Same-route navigation (e.g., /todos -> /todos) should not cancel in-flight actions
492
240
  const currentPath = new URL(window.location.href).pathname;
493
- const targetPath = new URL(url, window.location.origin).pathname;
241
+ const targetPath = targetUrl.pathname;
494
242
  if (currentPath !== targetPath) {
495
243
  eventController.abortNavigation();
496
244
  }
@@ -503,7 +251,9 @@ export function createNavigationBridge(
503
251
  const isLeavingIntercept = isCurrentlyIntercept && isSamePathNavigation;
504
252
 
505
253
  if (isLeavingIntercept) {
506
- console.log(`[Browser] Leaving intercept - same URL navigation from intercept`);
254
+ debugLog(
255
+ "[Browser] Leaving intercept - same URL navigation from intercept",
256
+ );
507
257
  // Clear intercept source URL to ensure server doesn't treat this as intercept
508
258
  store.setInterceptSourceUrl(null);
509
259
  }
@@ -517,7 +267,7 @@ export function createNavigationBridge(
517
267
  store.cacheSegmentsForHistory(
518
268
  sourceHistoryKey,
519
269
  sourceCached.segments,
520
- currentHandleData
270
+ currentHandleData,
521
271
  );
522
272
  }
523
273
 
@@ -532,7 +282,7 @@ export function createNavigationBridge(
532
282
  const cachedHandleData = cached?.handleData;
533
283
  if (cachedSegments && sourceCached?.segments) {
534
284
  const sourceSegmentMap = new Map(
535
- sourceCached.segments.map((s) => [s.id, s])
285
+ sourceCached.segments.map((s) => [s.id, s]),
536
286
  );
537
287
  cachedSegments = cachedSegments.map((targetSeg) => {
538
288
  const sourceSeg = sourceSegmentMap.get(targetSeg.id);
@@ -547,28 +297,40 @@ export function createNavigationBridge(
547
297
  const interceptHistoryKey = generateHistoryKey(url, { intercept: true });
548
298
  const hasInterceptCache = store.hasHistoryCache(interceptHistoryKey);
549
299
 
550
- // Skip optimistic rendering for:
300
+ // Skip cached SWR for:
551
301
  // 1. intercept caches - interception depends on source page context
552
302
  // 2. routes that CAN be intercepted - we don't know if this navigation will intercept
553
303
  // 3. when leaving intercept - we need fresh non-intercept segments from server
304
+ // 4. redirect-with-state - force re-render so hooks read fresh state
305
+ // 5. stale cache - server action invalidated it, need fresh data with loading state
554
306
  const hasUsableCache =
555
307
  cachedSegments &&
556
308
  cachedSegments.length > 0 &&
557
309
  !isInterceptOnlyCache(cachedSegments) &&
558
310
  !hasInterceptCache &&
559
- !isLeavingIntercept;
560
-
561
- using tx = createNavigationTransaction(store, eventController, url, {
311
+ !isLeavingIntercept &&
312
+ !cached?.stale &&
313
+ !options?._skipCache;
314
+
315
+ // Forward navigations always await fetchPartialUpdate before rendering,
316
+ // so useNavigation should always report "loading". skipLoadingState is
317
+ // only used for popstate background revalidation (line ~526) where
318
+ // cached content renders instantly without a network wait.
319
+ const tx = createNavigationTransaction(store, eventController, url, {
562
320
  ...options,
563
321
  state: resolvedState,
564
- skipLoadingState: hasUsableCache,
322
+ skipLoadingState: false,
565
323
  });
566
324
 
567
325
  // REVALIDATE: Fetch fresh data from server
568
326
  try {
569
327
  await fetchPartialUpdate(
570
328
  url,
571
- hasUsableCache ? cachedSegments!.map((s) => s.id) : undefined,
329
+ hasUsableCache
330
+ ? cachedSegments!.map((s) => s.id)
331
+ : options?._skipCache
332
+ ? [] // Action redirect: send no segments so server renders everything fresh
333
+ : undefined,
572
334
  false,
573
335
  tx.handle.signal,
574
336
  tx.with({
@@ -577,55 +339,56 @@ export function createNavigationBridge(
577
339
  scroll: options?.scroll,
578
340
  state: resolvedState,
579
341
  }),
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
342
  hasUsableCache
587
- ? { targetCacheSegments: cachedSegments, targetCacheHandleData: cachedHandleData }
343
+ ? {
344
+ type: "navigate" as const,
345
+ targetCacheSegments: cachedSegments,
346
+ targetCacheHandleData: cachedHandleData,
347
+ }
588
348
  : isLeavingIntercept
589
- ? { leavingIntercept: true }
590
- : undefined
349
+ ? { type: "leave-intercept" as const }
350
+ : undefined,
591
351
  );
592
352
  } catch (error) {
593
- // Ignore AbortError - navigation was cancelled by a newer navigation
353
+ // Server-side redirect with location state: the current transaction's
354
+ // cleanup resets loading state. Re-navigate to the redirect
355
+ // target carrying the server-set state into history.pushState.
356
+ if (error instanceof ServerRedirect) {
357
+ const redirectUrl = validateRedirectOrigin(
358
+ error.url,
359
+ window.location.origin,
360
+ );
361
+ if (!redirectUrl) {
362
+ return;
363
+ }
364
+ return this.navigate(redirectUrl, {
365
+ state: error.state,
366
+ replace: options?.replace,
367
+ _skipCache: true,
368
+ } as NavigateOptionsInternal);
369
+ }
370
+
594
371
  if (error instanceof DOMException && error.name === "AbortError") {
595
- console.log("[Browser] Navigation aborted by newer navigation");
372
+ debugLog("[Browser] Navigation aborted by newer navigation");
596
373
  return;
597
374
  }
598
375
 
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
-
376
+ const networkError = toNetworkError(error, {
377
+ url,
378
+ operation: "navigation",
379
+ });
380
+ if (networkError) {
609
381
  console.error(
610
382
  "[Browser] Network error during navigation:",
611
- networkError
383
+ networkError,
612
384
  );
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
- });
385
+ emitNetworkError(onUpdate, networkError, url);
625
386
  return;
626
387
  }
627
388
 
628
389
  throw error;
390
+ } finally {
391
+ tx[Symbol.dispose]();
629
392
  }
630
393
  },
631
394
 
@@ -635,11 +398,11 @@ export function createNavigationBridge(
635
398
  async refresh(): Promise<void> {
636
399
  eventController.abortNavigation();
637
400
 
638
- using tx = createNavigationTransaction(
401
+ const tx = createNavigationTransaction(
639
402
  store,
640
403
  eventController,
641
404
  window.location.href,
642
- { replace: true }
405
+ { replace: true },
643
406
  );
644
407
 
645
408
  try {
@@ -649,41 +412,24 @@ export function createNavigationBridge(
649
412
  [],
650
413
  false,
651
414
  tx.handle.signal,
652
- tx.with({ url: window.location.href, replace: true, scroll: false })
415
+ tx.with({ url: window.location.href, replace: true, scroll: false }),
653
416
  );
654
417
  } 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
-
418
+ const networkError = toNetworkError(error, {
419
+ url: window.location.href,
420
+ operation: "revalidation",
421
+ });
422
+ if (networkError) {
669
423
  console.error(
670
424
  "[Browser] Network error during refresh:",
671
- networkError
425
+ networkError,
672
426
  );
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
- });
427
+ emitNetworkError(onUpdate, networkError, window.location.href);
684
428
  return;
685
429
  }
686
430
  throw error;
431
+ } finally {
432
+ tx[Symbol.dispose]();
687
433
  }
688
434
  },
689
435
 
@@ -707,20 +453,29 @@ export function createNavigationBridge(
707
453
  const currentInterceptSource = store.getInterceptSourceUrl();
708
454
  const newInterceptSource = interceptSourceUrl ?? null;
709
455
  if (currentInterceptSource !== newInterceptSource) {
710
- console.log(
711
- `[Browser] Intercept context changing (${currentInterceptSource} -> ${newInterceptSource}), aborting in-flight actions`
456
+ debugLog(
457
+ `[Browser] Intercept context changing (${currentInterceptSource} -> ${newInterceptSource}), aborting in-flight actions`,
712
458
  );
713
459
  eventController.abortAllActions();
714
460
  }
715
461
 
462
+ // Popstate that exits an intercept to a non-intercept destination. The
463
+ // fallback fetch path below needs `leave-intercept` mode so it filters
464
+ // the cached @modal segment from the request and forces a re-render —
465
+ // otherwise a cache-miss popstate whose server response has an empty
466
+ // diff hits the "no changes" branch in partial-update and the modal
467
+ // stays on screen.
468
+ const isLeavingIntercept =
469
+ !isIntercept && currentInterceptSource !== null;
470
+
716
471
  // Compute history key from URL (with intercept suffix if applicable)
717
472
  const historyKey = generateHistoryKey(url, { intercept: isIntercept });
718
473
 
719
- console.log(
474
+ debugLog(
720
475
  "[Browser] Popstate -",
721
476
  isIntercept ? "intercept" : "normal",
722
477
  "key:",
723
- historyKey
478
+ historyKey,
724
479
  );
725
480
 
726
481
  // Update location in event controller
@@ -749,12 +504,27 @@ export function createNavigationBridge(
749
504
  store.setCurrentUrl(url);
750
505
  store.setPath(new URL(url).pathname);
751
506
 
507
+ // Restore router identity from cache so subsequent navigations
508
+ // don't falsely detect an app switch.
509
+ if (cached?.routerId) {
510
+ store.setRouterId?.(cached.routerId);
511
+ }
512
+
752
513
  // Render from cache - force await to skip loading fallbacks
753
514
  try {
754
- const root = renderSegments(cachedSegments, {
515
+ const root = await renderSegments(cachedSegments, {
755
516
  forceAwait: true,
756
517
  });
757
- onUpdate({
518
+ // Merge params from cached segments for useParams restoration.
519
+ // Set params on event controller before onUpdate so both location
520
+ // and params are current when the debounced notify() fires.
521
+ const cachedParams: Record<string, string> = {};
522
+ for (const s of cachedSegments) {
523
+ if (s.params) Object.assign(cachedParams, s.params);
524
+ }
525
+ eventController.setParams(cachedParams);
526
+
527
+ const popstateUpdate = {
758
528
  root,
759
529
  metadata: {
760
530
  pathname: new URL(url).pathname,
@@ -763,23 +533,40 @@ export function createNavigationBridge(
763
533
  matched: cachedSegments.map((s) => s.id),
764
534
  diff: [],
765
535
  cachedHandleData,
536
+ params: cachedParams,
766
537
  },
767
- });
768
-
769
- // Restore scroll position for back/forward navigation
770
- handleNavigationEnd({ restore: true, isStreaming });
538
+ scroll: { restore: true, isStreaming },
539
+ };
540
+ // Intercept-driven popstate (entering OR leaving an intercept) only
541
+ // mutates the parallel slot; the main outlet shows the same content.
542
+ // Skip startViewTransition in those cases — same rationale as the
543
+ // intercept guard in partial-update.ts's hasTransition computation.
544
+ const hasTransition =
545
+ !isIntercept &&
546
+ !isLeavingIntercept &&
547
+ cachedSegments.some((s) => s.transition);
548
+ if (hasTransition) {
549
+ startTransition(() => {
550
+ if (addTransitionType) {
551
+ addTransitionType("navigation-back");
552
+ }
553
+ onUpdate(popstateUpdate);
554
+ });
555
+ } else {
556
+ onUpdate(popstateUpdate);
557
+ }
771
558
 
772
559
  // SWR: If stale, trigger background revalidation
773
560
  if (isStale) {
774
- console.log("[Browser] Cache is stale, background revalidating...");
561
+ debugLog("[Browser] Cache is stale, background revalidating...");
775
562
  // Background revalidation - don't await, just fire and forget
776
563
  const segmentIds = cachedSegments.map((s) => s.id);
777
564
 
778
- using tx = createNavigationTransaction(
565
+ const tx = createNavigationTransaction(
779
566
  store,
780
567
  eventController,
781
568
  url,
782
- { skipLoadingState: true, replace: true }
569
+ { skipLoadingState: true, replace: true },
783
570
  );
784
571
 
785
572
  fetchPartialUpdate(
@@ -795,41 +582,33 @@ export function createNavigationBridge(
795
582
  interceptSourceUrl,
796
583
  cacheOnly: true,
797
584
  }),
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
585
+ { type: "stale-revalidation", interceptSourceUrl },
586
+ )
587
+ .catch((error) => {
588
+ if (isBackgroundSuppressible(error)) return;
589
+ console.error(
590
+ "[Browser] Background revalidation failed:",
591
+ error,
813
592
  );
814
- return;
815
- }
816
- console.error("[Browser] Background revalidation failed:", error);
817
- });
593
+ })
594
+ .finally(() => {
595
+ tx[Symbol.dispose]();
596
+ });
818
597
  }
819
598
  return;
820
599
  } catch (error) {
821
600
  console.warn(
822
601
  "[Browser] Failed to render from cache, fetching:",
823
- error
602
+ error,
824
603
  );
825
604
  // Fall through to fetch
826
605
  }
827
606
  } else {
828
- console.log("[Browser] History cache miss for key:", historyKey);
607
+ debugLog("[Browser] History cache miss for key:", historyKey);
829
608
  }
830
609
 
831
610
  // Fetch if not cached
832
- using tx = createNavigationTransaction(store, eventController, url, {
611
+ const tx = createNavigationTransaction(store, eventController, url, {
833
612
  replace: true,
834
613
  });
835
614
 
@@ -839,45 +618,43 @@ export function createNavigationBridge(
839
618
  undefined,
840
619
  false,
841
620
  tx.handle.signal,
842
- tx.with({ url, replace: true, scroll: false })
621
+ tx.with({
622
+ url,
623
+ replace: true,
624
+ scroll: false,
625
+ intercept: isIntercept,
626
+ interceptSourceUrl,
627
+ }),
628
+ isIntercept
629
+ ? { type: "navigate", interceptSourceUrl }
630
+ : isLeavingIntercept
631
+ ? { type: "leave-intercept" }
632
+ : undefined,
843
633
  );
844
634
  // Restore scroll position after fetch completes
845
635
  handleNavigationEnd({ restore: true, isStreaming });
846
636
  } catch (error) {
847
637
  if (error instanceof DOMException && error.name === "AbortError") {
848
- console.log("[Browser] Popstate navigation aborted");
638
+ debugLog("[Browser] Popstate navigation aborted");
849
639
  return;
850
640
  }
851
641
 
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
-
642
+ const networkError = toNetworkError(error, {
643
+ url,
644
+ operation: "navigation",
645
+ });
646
+ if (networkError) {
862
647
  console.error(
863
- "[Browser] Network error during popstate navigation:",
864
- networkError
648
+ "[Browser] Network error during popstate:",
649
+ networkError,
865
650
  );
866
-
867
- startTransition(() => {
868
- onUpdate({
869
- root: createElement(NetworkErrorThrower, { error: networkError }),
870
- metadata: {
871
- pathname: url,
872
- segments: [],
873
- isError: true,
874
- },
875
- });
876
- });
651
+ emitNetworkError(onUpdate, networkError, url);
877
652
  return;
878
653
  }
879
654
 
880
655
  throw error;
656
+ } finally {
657
+ tx[Symbol.dispose]();
881
658
  }
882
659
  },
883
660
 
@@ -894,19 +671,51 @@ export function createNavigationBridge(
894
671
  this.handlePopstate();
895
672
  };
896
673
 
674
+ // When the browser restores a page from bfcache (back-forward cache),
675
+ // any in-flight navigation state is stale. This happens when:
676
+ // 1. A navigation triggers X-RSC-Reload (e.g., response route hit via SPA)
677
+ // 2. window.location.href does a hard navigation
678
+ // 3. The user presses back and the browser restores from bfcache
679
+ // At that point, currentNavigation is still set from step 1, so
680
+ // getState() returns "loading" and the progress bar shows.
681
+ // Abort the stale navigation to reset state to idle.
682
+ const handlePageShow = (event: PageTransitionEvent) => {
683
+ if (event.persisted) {
684
+ debugLog(
685
+ "[Browser] Page restored from bfcache, resetting navigation state",
686
+ );
687
+ eventController.abortNavigation();
688
+ // pagehide flips scrollRestoration to "auto" for bfcache compat;
689
+ // restore "manual" so the router controls scroll on SPA navigations.
690
+ window.history.scrollRestoration = "manual";
691
+ }
692
+ };
693
+
897
694
  // Register cross-tab refresh callback with the store
898
695
  store.setCrossTabRefreshCallback(() => {
899
696
  this.refresh();
900
697
  });
901
698
 
902
699
  window.addEventListener("popstate", handlePopstate);
903
- console.log("[Browser] Navigation bridge ready");
700
+ window.addEventListener("pageshow", handlePageShow);
701
+ debugLog("[Browser] Navigation bridge ready");
904
702
 
905
703
  return () => {
906
704
  cleanupLinks();
907
705
  window.removeEventListener("popstate", handlePopstate);
706
+ window.removeEventListener("pageshow", handlePageShow);
908
707
  };
909
708
  },
709
+
710
+ updateVersion(newVersion: string): void {
711
+ version = newVersion;
712
+ setAppVersion(newVersion);
713
+ store.clearHistoryCache();
714
+ },
715
+
716
+ updateAppShell(next: AppShell): void {
717
+ applyAppShell(next);
718
+ },
910
719
  };
911
720
  }
912
721