@rangojs/router 0.0.0-experimental.122 → 0.0.0-experimental.124

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 (909) hide show
  1. package/dist/__internal.d.ts +83 -0
  2. package/dist/__internal.d.ts.map +1 -0
  3. package/dist/__internal.js +19 -0
  4. package/dist/__internal.js.map +1 -0
  5. package/dist/__mocks__/version.d.ts +7 -0
  6. package/dist/__mocks__/version.d.ts.map +1 -0
  7. package/dist/__mocks__/version.js +7 -0
  8. package/dist/__mocks__/version.js.map +1 -0
  9. package/dist/__tests__/client-href.test.d.ts +2 -0
  10. package/dist/__tests__/client-href.test.d.ts.map +1 -0
  11. package/dist/__tests__/client-href.test.js +74 -0
  12. package/dist/__tests__/client-href.test.js.map +1 -0
  13. package/dist/__tests__/component-utils.test.d.ts +2 -0
  14. package/dist/__tests__/component-utils.test.d.ts.map +1 -0
  15. package/dist/__tests__/component-utils.test.js +51 -0
  16. package/dist/__tests__/component-utils.test.js.map +1 -0
  17. package/dist/__tests__/event-controller.test.d.ts +2 -0
  18. package/dist/__tests__/event-controller.test.d.ts.map +1 -0
  19. package/dist/__tests__/event-controller.test.js +538 -0
  20. package/dist/__tests__/event-controller.test.js.map +1 -0
  21. package/dist/__tests__/helpers/route-tree.d.ts +118 -0
  22. package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
  23. package/dist/__tests__/helpers/route-tree.js +374 -0
  24. package/dist/__tests__/helpers/route-tree.js.map +1 -0
  25. package/dist/__tests__/match-result.test.d.ts +2 -0
  26. package/dist/__tests__/match-result.test.d.ts.map +1 -0
  27. package/dist/__tests__/match-result.test.js +154 -0
  28. package/dist/__tests__/match-result.test.js.map +1 -0
  29. package/dist/__tests__/navigation-store.test.d.ts +2 -0
  30. package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
  31. package/dist/__tests__/navigation-store.test.js +440 -0
  32. package/dist/__tests__/navigation-store.test.js.map +1 -0
  33. package/dist/__tests__/partial-update.test.d.ts +2 -0
  34. package/dist/__tests__/partial-update.test.d.ts.map +1 -0
  35. package/dist/__tests__/partial-update.test.js +1009 -0
  36. package/dist/__tests__/partial-update.test.js.map +1 -0
  37. package/dist/__tests__/reverse-types.test.d.ts +8 -0
  38. package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
  39. package/dist/__tests__/reverse-types.test.js +656 -0
  40. package/dist/__tests__/reverse-types.test.js.map +1 -0
  41. package/dist/__tests__/route-definition.test.d.ts +2 -0
  42. package/dist/__tests__/route-definition.test.d.ts.map +1 -0
  43. package/dist/__tests__/route-definition.test.js +55 -0
  44. package/dist/__tests__/route-definition.test.js.map +1 -0
  45. package/dist/__tests__/router-helpers.test.d.ts +2 -0
  46. package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
  47. package/dist/__tests__/router-helpers.test.js +377 -0
  48. package/dist/__tests__/router-helpers.test.js.map +1 -0
  49. package/dist/__tests__/router-integration-2.test.d.ts +2 -0
  50. package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
  51. package/dist/__tests__/router-integration-2.test.js +426 -0
  52. package/dist/__tests__/router-integration-2.test.js.map +1 -0
  53. package/dist/__tests__/router-integration.test.d.ts +2 -0
  54. package/dist/__tests__/router-integration.test.d.ts.map +1 -0
  55. package/dist/__tests__/router-integration.test.js +1051 -0
  56. package/dist/__tests__/router-integration.test.js.map +1 -0
  57. package/dist/__tests__/search-params.test.d.ts +5 -0
  58. package/dist/__tests__/search-params.test.d.ts.map +1 -0
  59. package/dist/__tests__/search-params.test.js +306 -0
  60. package/dist/__tests__/search-params.test.js.map +1 -0
  61. package/dist/__tests__/segment-system.test.d.ts +2 -0
  62. package/dist/__tests__/segment-system.test.d.ts.map +1 -0
  63. package/dist/__tests__/segment-system.test.js +627 -0
  64. package/dist/__tests__/segment-system.test.js.map +1 -0
  65. package/dist/__tests__/static-handler-types.test.d.ts +8 -0
  66. package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
  67. package/dist/__tests__/static-handler-types.test.js +63 -0
  68. package/dist/__tests__/static-handler-types.test.js.map +1 -0
  69. package/dist/__tests__/urls.test.d.ts +2 -0
  70. package/dist/__tests__/urls.test.d.ts.map +1 -0
  71. package/dist/__tests__/urls.test.js +421 -0
  72. package/dist/__tests__/urls.test.js.map +1 -0
  73. package/dist/__tests__/use-mount.test.d.ts +2 -0
  74. package/dist/__tests__/use-mount.test.d.ts.map +1 -0
  75. package/dist/__tests__/use-mount.test.js +35 -0
  76. package/dist/__tests__/use-mount.test.js.map +1 -0
  77. package/dist/bin/rango.d.ts +2 -0
  78. package/dist/bin/rango.d.ts.map +1 -0
  79. package/dist/bin/rango.js +7 -2
  80. package/dist/bin/rango.js.map +1 -0
  81. package/dist/browser/event-controller.d.ts +191 -0
  82. package/dist/browser/event-controller.d.ts.map +1 -0
  83. package/dist/browser/event-controller.js +559 -0
  84. package/dist/browser/event-controller.js.map +1 -0
  85. package/dist/browser/index.d.ts +2 -0
  86. package/dist/browser/index.d.ts.map +1 -0
  87. package/dist/browser/index.js +14 -0
  88. package/dist/browser/index.js.map +1 -0
  89. package/dist/browser/link-interceptor.d.ts +38 -0
  90. package/dist/browser/link-interceptor.d.ts.map +1 -0
  91. package/dist/browser/link-interceptor.js +99 -0
  92. package/dist/browser/link-interceptor.js.map +1 -0
  93. package/dist/browser/logging.d.ts +10 -0
  94. package/dist/browser/logging.d.ts.map +1 -0
  95. package/dist/browser/logging.js +29 -0
  96. package/dist/browser/logging.js.map +1 -0
  97. package/dist/browser/lru-cache.d.ts +17 -0
  98. package/dist/browser/lru-cache.d.ts.map +1 -0
  99. package/dist/browser/lru-cache.js +50 -0
  100. package/dist/browser/lru-cache.js.map +1 -0
  101. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  102. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  103. package/dist/browser/merge-segment-loaders.js +102 -0
  104. package/dist/browser/merge-segment-loaders.js.map +1 -0
  105. package/dist/browser/navigation-bridge.d.ts +102 -0
  106. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  107. package/dist/browser/navigation-bridge.js +708 -0
  108. package/dist/browser/navigation-bridge.js.map +1 -0
  109. package/dist/browser/navigation-client.d.ts +25 -0
  110. package/dist/browser/navigation-client.d.ts.map +1 -0
  111. package/dist/browser/navigation-client.js +157 -0
  112. package/dist/browser/navigation-client.js.map +1 -0
  113. package/dist/browser/navigation-store.d.ts +101 -0
  114. package/dist/browser/navigation-store.d.ts.map +1 -0
  115. package/dist/browser/navigation-store.js +625 -0
  116. package/dist/browser/navigation-store.js.map +1 -0
  117. package/dist/browser/partial-update.d.ts +75 -0
  118. package/dist/browser/partial-update.d.ts.map +1 -0
  119. package/dist/browser/partial-update.js +426 -0
  120. package/dist/browser/partial-update.js.map +1 -0
  121. package/dist/browser/react/Link.d.ts +86 -0
  122. package/dist/browser/react/Link.d.ts.map +1 -0
  123. package/dist/browser/react/Link.js +128 -0
  124. package/dist/browser/react/Link.js.map +1 -0
  125. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  126. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  127. package/dist/browser/react/NavigationProvider.js +216 -0
  128. package/dist/browser/react/NavigationProvider.js.map +1 -0
  129. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  130. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  131. package/dist/browser/react/ScrollRestoration.js +57 -0
  132. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  133. package/dist/browser/react/context.d.ts +46 -0
  134. package/dist/browser/react/context.d.ts.map +1 -0
  135. package/dist/browser/react/context.js +10 -0
  136. package/dist/browser/react/context.js.map +1 -0
  137. package/dist/browser/react/index.d.ts +11 -0
  138. package/dist/browser/react/index.d.ts.map +1 -0
  139. package/dist/browser/react/index.js +22 -0
  140. package/dist/browser/react/index.js.map +1 -0
  141. package/dist/browser/react/location-state-shared.d.ts +63 -0
  142. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  143. package/dist/browser/react/location-state-shared.js +81 -0
  144. package/dist/browser/react/location-state-shared.js.map +1 -0
  145. package/dist/browser/react/location-state.d.ts +23 -0
  146. package/dist/browser/react/location-state.d.ts.map +1 -0
  147. package/dist/browser/react/location-state.js +29 -0
  148. package/dist/browser/react/location-state.js.map +1 -0
  149. package/dist/browser/react/mount-context.d.ts +24 -0
  150. package/dist/browser/react/mount-context.d.ts.map +1 -0
  151. package/dist/browser/react/mount-context.js +24 -0
  152. package/dist/browser/react/mount-context.js.map +1 -0
  153. package/dist/browser/react/use-action.d.ts +64 -0
  154. package/dist/browser/react/use-action.d.ts.map +1 -0
  155. package/dist/browser/react/use-action.js +134 -0
  156. package/dist/browser/react/use-action.js.map +1 -0
  157. package/dist/browser/react/use-client-cache.d.ts +41 -0
  158. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  159. package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -28
  160. package/dist/browser/react/use-client-cache.js.map +1 -0
  161. package/dist/browser/react/use-handle.d.ts +31 -0
  162. package/dist/browser/react/use-handle.d.ts.map +1 -0
  163. package/dist/browser/react/use-handle.js +144 -0
  164. package/dist/browser/react/use-handle.js.map +1 -0
  165. package/dist/browser/react/use-href.d.ts +33 -0
  166. package/dist/browser/react/use-href.d.ts.map +1 -0
  167. package/dist/browser/react/use-href.js +39 -0
  168. package/dist/browser/react/use-href.js.map +1 -0
  169. package/dist/browser/react/use-link-status.d.ts +37 -0
  170. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  171. package/dist/browser/react/use-link-status.js +99 -0
  172. package/dist/browser/react/use-link-status.js.map +1 -0
  173. package/dist/browser/react/use-mount.d.ts +25 -0
  174. package/dist/browser/react/use-mount.d.ts.map +1 -0
  175. package/dist/browser/react/use-mount.js +30 -0
  176. package/dist/browser/react/use-mount.js.map +1 -0
  177. package/dist/browser/react/use-navigation.d.ts +27 -0
  178. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  179. package/dist/browser/react/use-navigation.js +87 -0
  180. package/dist/browser/react/use-navigation.js.map +1 -0
  181. package/dist/browser/react/use-segments.d.ts +38 -0
  182. package/dist/browser/react/use-segments.d.ts.map +1 -0
  183. package/dist/browser/react/use-segments.js +130 -0
  184. package/dist/browser/react/use-segments.js.map +1 -0
  185. package/dist/browser/request-controller.d.ts +26 -0
  186. package/dist/browser/request-controller.d.ts.map +1 -0
  187. package/dist/browser/request-controller.js +147 -0
  188. package/dist/browser/request-controller.js.map +1 -0
  189. package/dist/browser/rsc-router.d.ts +129 -0
  190. package/dist/browser/rsc-router.d.ts.map +1 -0
  191. package/dist/browser/rsc-router.js +195 -0
  192. package/dist/browser/rsc-router.js.map +1 -0
  193. package/dist/browser/scroll-restoration.d.ts +93 -0
  194. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  195. package/dist/browser/scroll-restoration.js +321 -0
  196. package/dist/browser/scroll-restoration.js.map +1 -0
  197. package/dist/browser/segment-structure-assert.d.ts +17 -0
  198. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  199. package/dist/browser/segment-structure-assert.js +59 -0
  200. package/dist/browser/segment-structure-assert.js.map +1 -0
  201. package/dist/browser/server-action-bridge.d.ts +26 -0
  202. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  203. package/dist/browser/server-action-bridge.js +668 -0
  204. package/dist/browser/server-action-bridge.js.map +1 -0
  205. package/dist/browser/shallow.d.ts +12 -0
  206. package/dist/browser/shallow.d.ts.map +1 -0
  207. package/dist/browser/shallow.js +34 -0
  208. package/dist/browser/shallow.js.map +1 -0
  209. package/dist/browser/types.d.ts +369 -0
  210. package/dist/browser/types.d.ts.map +1 -0
  211. package/dist/browser/types.js +2 -0
  212. package/dist/browser/types.js.map +1 -0
  213. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  214. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  215. package/dist/build/__tests__/generate-cli.test.js +237 -0
  216. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  217. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  218. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  219. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  220. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  221. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  222. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  223. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  224. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  225. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  226. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  227. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  228. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  229. package/dist/build/generate-manifest.d.ts +81 -0
  230. package/dist/build/generate-manifest.d.ts.map +1 -0
  231. package/dist/build/generate-manifest.js +276 -0
  232. package/dist/build/generate-manifest.js.map +1 -0
  233. package/dist/build/generate-route-types.d.ts +115 -0
  234. package/dist/build/generate-route-types.d.ts.map +1 -0
  235. package/dist/build/generate-route-types.js +740 -0
  236. package/dist/build/generate-route-types.js.map +1 -0
  237. package/dist/build/index.d.ts +21 -0
  238. package/dist/build/index.d.ts.map +1 -0
  239. package/dist/build/index.js +21 -0
  240. package/dist/build/index.js.map +1 -0
  241. package/dist/build/route-trie.d.ts +71 -0
  242. package/dist/build/route-trie.d.ts.map +1 -0
  243. package/dist/build/route-trie.js +175 -0
  244. package/dist/build/route-trie.js.map +1 -0
  245. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  246. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  247. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  248. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  249. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  250. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  251. package/dist/cache/__tests__/document-cache.test.js +345 -0
  252. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  253. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  254. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  257. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  258. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  259. package/dist/cache/__tests__/memory-store.test.js +367 -0
  260. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  261. package/dist/cache/cache-scope.d.ts +102 -0
  262. package/dist/cache/cache-scope.d.ts.map +1 -0
  263. package/dist/cache/cache-scope.js +440 -0
  264. package/dist/cache/cache-scope.js.map +1 -0
  265. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  266. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  269. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  270. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  271. package/dist/cache/cf/cf-cache-store.js +242 -0
  272. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  273. package/dist/cache/cf/index.d.ts +14 -0
  274. package/dist/cache/cf/index.d.ts.map +1 -0
  275. package/dist/cache/cf/index.js +17 -0
  276. package/dist/cache/cf/index.js.map +1 -0
  277. package/dist/cache/document-cache.d.ts +64 -0
  278. package/dist/cache/document-cache.d.ts.map +1 -0
  279. package/dist/cache/document-cache.js +228 -0
  280. package/dist/cache/document-cache.js.map +1 -0
  281. package/dist/cache/index.d.ts +19 -0
  282. package/dist/cache/index.d.ts.map +1 -0
  283. package/dist/cache/index.js +21 -0
  284. package/dist/cache/index.js.map +1 -0
  285. package/dist/cache/memory-segment-store.d.ts +110 -0
  286. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  287. package/dist/cache/memory-segment-store.js +117 -0
  288. package/dist/cache/memory-segment-store.js.map +1 -0
  289. package/dist/cache/memory-store.d.ts +41 -0
  290. package/dist/cache/memory-store.d.ts.map +1 -0
  291. package/dist/cache/memory-store.js +191 -0
  292. package/dist/cache/memory-store.js.map +1 -0
  293. package/dist/cache/types.d.ts +317 -0
  294. package/dist/cache/types.d.ts.map +1 -0
  295. package/dist/cache/types.js +12 -0
  296. package/dist/cache/types.js.map +1 -0
  297. package/dist/client.d.ts +248 -0
  298. package/dist/client.d.ts.map +1 -0
  299. package/dist/client.js +367 -0
  300. package/dist/client.js.map +1 -0
  301. package/dist/client.rsc.d.ts +26 -0
  302. package/dist/client.rsc.d.ts.map +1 -0
  303. package/dist/client.rsc.js +46 -0
  304. package/dist/client.rsc.js.map +1 -0
  305. package/dist/component-utils.d.ts +36 -0
  306. package/dist/component-utils.d.ts.map +1 -0
  307. package/dist/component-utils.js +61 -0
  308. package/dist/component-utils.js.map +1 -0
  309. package/dist/components/DefaultDocument.d.ts +13 -0
  310. package/dist/components/DefaultDocument.d.ts.map +1 -0
  311. package/dist/components/DefaultDocument.js +15 -0
  312. package/dist/components/DefaultDocument.js.map +1 -0
  313. package/dist/debug.d.ts +58 -0
  314. package/dist/debug.d.ts.map +1 -0
  315. package/dist/debug.js +157 -0
  316. package/dist/debug.js.map +1 -0
  317. package/dist/default-error-boundary.d.ts +11 -0
  318. package/dist/default-error-boundary.d.ts.map +1 -0
  319. package/dist/default-error-boundary.js +45 -0
  320. package/dist/default-error-boundary.js.map +1 -0
  321. package/dist/deps/browser.d.ts +2 -0
  322. package/dist/deps/browser.d.ts.map +1 -0
  323. package/dist/deps/browser.js +3 -0
  324. package/dist/deps/browser.js.map +1 -0
  325. package/dist/deps/html-stream-client.d.ts +2 -0
  326. package/dist/deps/html-stream-client.d.ts.map +1 -0
  327. package/dist/deps/html-stream-client.js +3 -0
  328. package/dist/deps/html-stream-client.js.map +1 -0
  329. package/dist/deps/html-stream-server.d.ts +2 -0
  330. package/dist/deps/html-stream-server.d.ts.map +1 -0
  331. package/dist/deps/html-stream-server.js +3 -0
  332. package/dist/deps/html-stream-server.js.map +1 -0
  333. package/dist/deps/rsc.d.ts +2 -0
  334. package/dist/deps/rsc.d.ts.map +1 -0
  335. package/dist/deps/rsc.js +4 -0
  336. package/dist/deps/rsc.js.map +1 -0
  337. package/dist/deps/ssr.d.ts +2 -0
  338. package/dist/deps/ssr.d.ts.map +1 -0
  339. package/dist/deps/ssr.js +3 -0
  340. package/dist/deps/ssr.js.map +1 -0
  341. package/dist/errors.d.ts +174 -0
  342. package/dist/errors.d.ts.map +1 -0
  343. package/dist/errors.js +241 -0
  344. package/dist/errors.js.map +1 -0
  345. package/dist/handle.d.ts +78 -0
  346. package/dist/handle.d.ts.map +1 -0
  347. package/dist/handle.js +82 -0
  348. package/dist/handle.js.map +1 -0
  349. package/dist/handles/MetaTags.d.ts +14 -0
  350. package/dist/handles/MetaTags.d.ts.map +1 -0
  351. package/dist/handles/MetaTags.js +136 -0
  352. package/dist/handles/MetaTags.js.map +1 -0
  353. package/dist/handles/index.d.ts +6 -0
  354. package/dist/handles/index.d.ts.map +1 -0
  355. package/dist/handles/index.js +6 -0
  356. package/dist/handles/index.js.map +1 -0
  357. package/dist/handles/meta.d.ts +39 -0
  358. package/dist/handles/meta.d.ts.map +1 -0
  359. package/dist/handles/meta.js +202 -0
  360. package/dist/handles/meta.js.map +1 -0
  361. package/dist/host/__tests__/errors.test.d.ts +2 -0
  362. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  363. package/dist/host/__tests__/errors.test.js +76 -0
  364. package/dist/host/__tests__/errors.test.js.map +1 -0
  365. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  366. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  369. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  370. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  371. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  372. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  373. package/dist/host/__tests__/router.test.d.ts +2 -0
  374. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  375. package/dist/host/__tests__/router.test.js +241 -0
  376. package/dist/host/__tests__/router.test.js.map +1 -0
  377. package/dist/host/__tests__/testing.test.d.ts +2 -0
  378. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  379. package/dist/host/__tests__/testing.test.js +64 -0
  380. package/dist/host/__tests__/testing.test.js.map +1 -0
  381. package/dist/host/__tests__/utils.test.d.ts +2 -0
  382. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  383. package/dist/host/__tests__/utils.test.js +29 -0
  384. package/dist/host/__tests__/utils.test.js.map +1 -0
  385. package/dist/host/cookie-handler.d.ts +34 -0
  386. package/dist/host/cookie-handler.d.ts.map +1 -0
  387. package/dist/host/cookie-handler.js +124 -0
  388. package/dist/host/cookie-handler.js.map +1 -0
  389. package/dist/host/errors.d.ts +56 -0
  390. package/dist/host/errors.d.ts.map +1 -0
  391. package/dist/host/errors.js +79 -0
  392. package/dist/host/errors.js.map +1 -0
  393. package/dist/host/index.d.ts +29 -0
  394. package/dist/host/index.d.ts.map +1 -0
  395. package/dist/host/index.js +32 -0
  396. package/dist/host/index.js.map +1 -0
  397. package/dist/host/pattern-matcher.d.ts +36 -0
  398. package/dist/host/pattern-matcher.d.ts.map +1 -0
  399. package/dist/host/pattern-matcher.js +172 -0
  400. package/dist/host/pattern-matcher.js.map +1 -0
  401. package/dist/host/router.d.ts +26 -0
  402. package/dist/host/router.d.ts.map +1 -0
  403. package/dist/host/router.js +218 -0
  404. package/dist/host/router.js.map +1 -0
  405. package/dist/host/testing.d.ts +36 -0
  406. package/dist/host/testing.d.ts.map +1 -0
  407. package/dist/host/testing.js +55 -0
  408. package/dist/host/testing.js.map +1 -0
  409. package/dist/host/types.d.ts +115 -0
  410. package/dist/host/types.d.ts.map +1 -0
  411. package/dist/host/types.js +7 -0
  412. package/dist/host/types.js.map +1 -0
  413. package/dist/host/utils.d.ts +21 -0
  414. package/dist/host/utils.d.ts.map +1 -0
  415. package/dist/host/utils.js +23 -0
  416. package/dist/host/utils.js.map +1 -0
  417. package/dist/href-client.d.ts +131 -0
  418. package/dist/href-client.d.ts.map +1 -0
  419. package/dist/href-client.js +64 -0
  420. package/dist/href-client.js.map +1 -0
  421. package/dist/href-context.d.ts +29 -0
  422. package/dist/href-context.d.ts.map +1 -0
  423. package/dist/href-context.js +21 -0
  424. package/dist/href-context.js.map +1 -0
  425. package/dist/index.d.ts +73 -0
  426. package/dist/index.d.ts.map +1 -0
  427. package/dist/index.js +91 -0
  428. package/dist/index.js.map +1 -0
  429. package/dist/index.rsc.d.ts +32 -0
  430. package/dist/index.rsc.d.ts.map +1 -0
  431. package/dist/index.rsc.js +40 -0
  432. package/dist/index.rsc.js.map +1 -0
  433. package/dist/internal-debug.d.ts +2 -0
  434. package/dist/internal-debug.d.ts.map +1 -0
  435. package/dist/internal-debug.js +5 -0
  436. package/dist/internal-debug.js.map +1 -0
  437. package/dist/loader.d.ts +14 -0
  438. package/dist/loader.d.ts.map +1 -0
  439. package/dist/loader.js +20 -0
  440. package/dist/loader.js.map +1 -0
  441. package/dist/loader.rsc.d.ts +19 -0
  442. package/dist/loader.rsc.d.ts.map +1 -0
  443. package/dist/loader.rsc.js +99 -0
  444. package/dist/loader.rsc.js.map +1 -0
  445. package/dist/network-error-thrower.d.ts +17 -0
  446. package/dist/network-error-thrower.d.ts.map +1 -0
  447. package/dist/network-error-thrower.js +14 -0
  448. package/dist/network-error-thrower.js.map +1 -0
  449. package/dist/outlet-context.d.ts +13 -0
  450. package/dist/outlet-context.d.ts.map +1 -0
  451. package/dist/outlet-context.js +3 -0
  452. package/dist/outlet-context.js.map +1 -0
  453. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  454. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  455. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  456. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  457. package/dist/prerender/param-hash.d.ts +16 -0
  458. package/dist/prerender/param-hash.d.ts.map +1 -0
  459. package/dist/prerender/param-hash.js +36 -0
  460. package/dist/prerender/param-hash.js.map +1 -0
  461. package/dist/prerender/store.d.ts +38 -0
  462. package/dist/prerender/store.d.ts.map +1 -0
  463. package/dist/prerender/store.js +61 -0
  464. package/dist/prerender/store.js.map +1 -0
  465. package/dist/prerender.d.ts +66 -0
  466. package/dist/prerender.d.ts.map +1 -0
  467. package/dist/prerender.js +57 -0
  468. package/dist/prerender.js.map +1 -0
  469. package/dist/reverse.d.ts +196 -0
  470. package/dist/reverse.d.ts.map +1 -0
  471. package/dist/reverse.js +78 -0
  472. package/dist/reverse.js.map +1 -0
  473. package/dist/root-error-boundary.d.ts +33 -0
  474. package/dist/root-error-boundary.d.ts.map +1 -0
  475. package/dist/root-error-boundary.js +165 -0
  476. package/dist/root-error-boundary.js.map +1 -0
  477. package/dist/route-content-wrapper.d.ts +46 -0
  478. package/dist/route-content-wrapper.d.ts.map +1 -0
  479. package/dist/route-content-wrapper.js +77 -0
  480. package/dist/route-content-wrapper.js.map +1 -0
  481. package/dist/route-definition.d.ts +421 -0
  482. package/dist/route-definition.d.ts.map +1 -0
  483. package/dist/route-definition.js +868 -0
  484. package/dist/route-definition.js.map +1 -0
  485. package/dist/route-map-builder.d.ts +155 -0
  486. package/dist/route-map-builder.d.ts.map +1 -0
  487. package/dist/route-map-builder.js +237 -0
  488. package/dist/route-map-builder.js.map +1 -0
  489. package/dist/route-types.d.ts +165 -0
  490. package/dist/route-types.d.ts.map +1 -0
  491. package/dist/route-types.js +7 -0
  492. package/dist/route-types.js.map +1 -0
  493. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  494. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  495. package/dist/router/__tests__/handler-context.test.js +65 -0
  496. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  497. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  498. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  501. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  502. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  503. package/dist/router/__tests__/match-context.test.js +92 -0
  504. package/dist/router/__tests__/match-context.test.js.map +1 -0
  505. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  506. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  507. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  508. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  509. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  510. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  511. package/dist/router/__tests__/match-result.test.js +457 -0
  512. package/dist/router/__tests__/match-result.test.js.map +1 -0
  513. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  514. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  515. package/dist/router/__tests__/on-error.test.js +678 -0
  516. package/dist/router/__tests__/on-error.test.js.map +1 -0
  517. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  518. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  519. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  520. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  521. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  522. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  525. package/dist/router/error-handling.d.ts +77 -0
  526. package/dist/router/error-handling.d.ts.map +1 -0
  527. package/dist/router/error-handling.js +202 -0
  528. package/dist/router/error-handling.js.map +1 -0
  529. package/dist/router/handler-context.d.ts +20 -0
  530. package/dist/router/handler-context.d.ts.map +1 -0
  531. package/dist/router/handler-context.js +198 -0
  532. package/dist/router/handler-context.js.map +1 -0
  533. package/dist/router/intercept-resolution.d.ts +66 -0
  534. package/dist/router/intercept-resolution.d.ts.map +1 -0
  535. package/dist/router/intercept-resolution.js +246 -0
  536. package/dist/router/intercept-resolution.js.map +1 -0
  537. package/dist/router/loader-resolution.d.ts +64 -0
  538. package/dist/router/loader-resolution.d.ts.map +1 -0
  539. package/dist/router/loader-resolution.js +284 -0
  540. package/dist/router/loader-resolution.js.map +1 -0
  541. package/dist/router/logging.d.ts +15 -0
  542. package/dist/router/logging.d.ts.map +1 -0
  543. package/dist/router/logging.js +99 -0
  544. package/dist/router/logging.js.map +1 -0
  545. package/dist/router/manifest.d.ts +22 -0
  546. package/dist/router/manifest.d.ts.map +1 -0
  547. package/dist/router/manifest.js +181 -0
  548. package/dist/router/manifest.js.map +1 -0
  549. package/dist/router/match-api.d.ts +35 -0
  550. package/dist/router/match-api.d.ts.map +1 -0
  551. package/dist/router/match-api.js +406 -0
  552. package/dist/router/match-api.js.map +1 -0
  553. package/dist/router/match-context.d.ts +206 -0
  554. package/dist/router/match-context.d.ts.map +1 -0
  555. package/dist/router/match-context.js +17 -0
  556. package/dist/router/match-context.js.map +1 -0
  557. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  558. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  559. package/dist/router/match-middleware/background-revalidation.js +75 -0
  560. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  561. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  562. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  563. package/dist/router/match-middleware/cache-lookup.js +257 -0
  564. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  565. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  566. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  567. package/dist/router/match-middleware/cache-store.js +108 -0
  568. package/dist/router/match-middleware/cache-store.js.map +1 -0
  569. package/dist/router/match-middleware/index.d.ts +81 -0
  570. package/dist/router/match-middleware/index.d.ts.map +1 -0
  571. package/dist/router/match-middleware/index.js +80 -0
  572. package/dist/router/match-middleware/index.js.map +1 -0
  573. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  574. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  575. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  576. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  577. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  578. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  579. package/dist/router/match-middleware/segment-resolution.js +53 -0
  580. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  581. package/dist/router/match-pipelines.d.ts +147 -0
  582. package/dist/router/match-pipelines.d.ts.map +1 -0
  583. package/dist/router/match-pipelines.js +82 -0
  584. package/dist/router/match-pipelines.js.map +1 -0
  585. package/dist/router/match-result.d.ts +126 -0
  586. package/dist/router/match-result.d.ts.map +1 -0
  587. package/dist/router/match-result.js +93 -0
  588. package/dist/router/match-result.js.map +1 -0
  589. package/dist/router/metrics.d.ts +20 -0
  590. package/dist/router/metrics.d.ts.map +1 -0
  591. package/dist/router/metrics.js +47 -0
  592. package/dist/router/metrics.js.map +1 -0
  593. package/dist/router/middleware.d.ts +249 -0
  594. package/dist/router/middleware.d.ts.map +1 -0
  595. package/dist/router/middleware.js +434 -0
  596. package/dist/router/middleware.js.map +1 -0
  597. package/dist/router/middleware.test.d.ts +2 -0
  598. package/dist/router/middleware.test.d.ts.map +1 -0
  599. package/dist/router/middleware.test.js +816 -0
  600. package/dist/router/middleware.test.js.map +1 -0
  601. package/dist/router/pattern-matching.d.ts +149 -0
  602. package/dist/router/pattern-matching.d.ts.map +1 -0
  603. package/dist/router/pattern-matching.js +349 -0
  604. package/dist/router/pattern-matching.js.map +1 -0
  605. package/dist/router/revalidation.d.ts +44 -0
  606. package/dist/router/revalidation.d.ts.map +1 -0
  607. package/dist/router/revalidation.js +147 -0
  608. package/dist/router/revalidation.js.map +1 -0
  609. package/dist/router/router-context.d.ts +135 -0
  610. package/dist/router/router-context.d.ts.map +1 -0
  611. package/dist/router/router-context.js +36 -0
  612. package/dist/router/router-context.js.map +1 -0
  613. package/dist/router/segment-resolution.d.ts +127 -0
  614. package/dist/router/segment-resolution.d.ts.map +1 -0
  615. package/dist/router/segment-resolution.js +919 -0
  616. package/dist/router/segment-resolution.js.map +1 -0
  617. package/dist/router/trie-matching.d.ts +40 -0
  618. package/dist/router/trie-matching.d.ts.map +1 -0
  619. package/dist/router/trie-matching.js +127 -0
  620. package/dist/router/trie-matching.js.map +1 -0
  621. package/dist/router/types.d.ts +136 -0
  622. package/dist/router/types.d.ts.map +1 -0
  623. package/dist/router/types.js +7 -0
  624. package/dist/router/types.js.map +1 -0
  625. package/dist/router.d.ts +753 -0
  626. package/dist/router.d.ts.map +1 -0
  627. package/dist/router.gen.d.ts +6 -0
  628. package/dist/router.gen.d.ts.map +1 -0
  629. package/dist/router.gen.js +6 -0
  630. package/dist/router.gen.js.map +1 -0
  631. package/dist/router.js +1304 -0
  632. package/dist/router.js.map +1 -0
  633. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  634. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  635. package/dist/rsc/__tests__/helpers.test.js +140 -0
  636. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  637. package/dist/rsc/handler.d.ts +45 -0
  638. package/dist/rsc/handler.d.ts.map +1 -0
  639. package/dist/rsc/handler.js +1172 -0
  640. package/dist/rsc/handler.js.map +1 -0
  641. package/dist/rsc/helpers.d.ts +16 -0
  642. package/dist/rsc/helpers.d.ts.map +1 -0
  643. package/dist/rsc/helpers.js +55 -0
  644. package/dist/rsc/helpers.js.map +1 -0
  645. package/dist/rsc/index.d.ts +22 -0
  646. package/dist/rsc/index.d.ts.map +1 -0
  647. package/dist/rsc/index.js +23 -0
  648. package/dist/rsc/index.js.map +1 -0
  649. package/dist/rsc/nonce.d.ts +9 -0
  650. package/dist/rsc/nonce.d.ts.map +1 -0
  651. package/dist/rsc/nonce.js +18 -0
  652. package/dist/rsc/nonce.js.map +1 -0
  653. package/dist/rsc/types.d.ts +206 -0
  654. package/dist/rsc/types.d.ts.map +1 -0
  655. package/dist/rsc/types.js +8 -0
  656. package/dist/rsc/types.js.map +1 -0
  657. package/dist/search-params.d.ts +103 -0
  658. package/dist/search-params.d.ts.map +1 -0
  659. package/dist/search-params.js +74 -0
  660. package/dist/search-params.js.map +1 -0
  661. package/dist/segment-system.d.ts +75 -0
  662. package/dist/segment-system.d.ts.map +1 -0
  663. package/dist/segment-system.js +336 -0
  664. package/dist/segment-system.js.map +1 -0
  665. package/dist/server/context.d.ts +245 -0
  666. package/dist/server/context.d.ts.map +1 -0
  667. package/dist/server/context.js +197 -0
  668. package/dist/server/context.js.map +1 -0
  669. package/dist/server/fetchable-loader-store.d.ts +18 -0
  670. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  671. package/dist/server/fetchable-loader-store.js +18 -0
  672. package/dist/server/fetchable-loader-store.js.map +1 -0
  673. package/dist/server/handle-store.d.ts +85 -0
  674. package/dist/server/handle-store.d.ts.map +1 -0
  675. package/dist/server/handle-store.js +142 -0
  676. package/dist/server/handle-store.js.map +1 -0
  677. package/dist/server/loader-registry.d.ts +55 -0
  678. package/dist/server/loader-registry.d.ts.map +1 -0
  679. package/dist/server/loader-registry.js +132 -0
  680. package/dist/server/loader-registry.js.map +1 -0
  681. package/dist/server/request-context.d.ts +226 -0
  682. package/dist/server/request-context.d.ts.map +1 -0
  683. package/dist/server/request-context.js +290 -0
  684. package/dist/server/request-context.js.map +1 -0
  685. package/dist/server/root-layout.d.ts +4 -0
  686. package/dist/server/root-layout.d.ts.map +1 -0
  687. package/dist/server/root-layout.js +5 -0
  688. package/dist/server/root-layout.js.map +1 -0
  689. package/dist/server.d.ts +15 -0
  690. package/dist/server.d.ts.map +1 -0
  691. package/dist/server.js +20 -0
  692. package/dist/server.js.map +1 -0
  693. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  694. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  697. package/dist/ssr/index.d.ts +98 -0
  698. package/dist/ssr/index.d.ts.map +1 -0
  699. package/dist/ssr/index.js +158 -0
  700. package/dist/ssr/index.js.map +1 -0
  701. package/dist/static-handler.d.ts +50 -0
  702. package/dist/static-handler.d.ts.map +1 -0
  703. package/dist/static-handler.gen.d.ts +5 -0
  704. package/dist/static-handler.gen.d.ts.map +1 -0
  705. package/dist/static-handler.gen.js +5 -0
  706. package/dist/static-handler.gen.js.map +1 -0
  707. package/dist/static-handler.js +29 -0
  708. package/dist/static-handler.js.map +1 -0
  709. package/dist/testing/vitest.js +82 -0
  710. package/dist/theme/ThemeProvider.d.ts +20 -0
  711. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  712. package/dist/theme/ThemeProvider.js +240 -0
  713. package/dist/theme/ThemeProvider.js.map +1 -0
  714. package/dist/theme/ThemeScript.d.ts +48 -0
  715. package/dist/theme/ThemeScript.d.ts.map +1 -0
  716. package/dist/theme/ThemeScript.js +13 -0
  717. package/dist/theme/ThemeScript.js.map +1 -0
  718. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  719. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  720. package/dist/theme/__tests__/theme.test.js +103 -0
  721. package/dist/theme/__tests__/theme.test.js.map +1 -0
  722. package/dist/theme/constants.d.ts +29 -0
  723. package/dist/theme/constants.d.ts.map +1 -0
  724. package/dist/theme/constants.js +48 -0
  725. package/dist/theme/constants.js.map +1 -0
  726. package/dist/theme/index.d.ts +31 -0
  727. package/dist/theme/index.d.ts.map +1 -0
  728. package/dist/theme/index.js +36 -0
  729. package/dist/theme/index.js.map +1 -0
  730. package/dist/theme/theme-context.d.ts +40 -0
  731. package/dist/theme/theme-context.d.ts.map +1 -0
  732. package/dist/theme/theme-context.js +60 -0
  733. package/dist/theme/theme-context.js.map +1 -0
  734. package/dist/theme/theme-script.d.ts +27 -0
  735. package/dist/theme/theme-script.d.ts.map +1 -0
  736. package/dist/theme/theme-script.js +147 -0
  737. package/dist/theme/theme-script.js.map +1 -0
  738. package/dist/theme/types.d.ts +163 -0
  739. package/dist/theme/types.d.ts.map +1 -0
  740. package/dist/theme/types.js +11 -0
  741. package/dist/theme/types.js.map +1 -0
  742. package/dist/theme/use-theme.d.ts +12 -0
  743. package/dist/theme/use-theme.d.ts.map +1 -0
  744. package/dist/theme/use-theme.js +40 -0
  745. package/dist/theme/use-theme.js.map +1 -0
  746. package/dist/types.d.ts +1479 -0
  747. package/dist/types.d.ts.map +1 -0
  748. package/dist/types.js +10 -0
  749. package/dist/types.js.map +1 -0
  750. package/dist/urls.d.ts +441 -0
  751. package/dist/urls.d.ts.map +1 -0
  752. package/dist/urls.gen.d.ts +8 -0
  753. package/dist/urls.gen.d.ts.map +1 -0
  754. package/dist/urls.gen.js +8 -0
  755. package/dist/urls.gen.js.map +1 -0
  756. package/dist/urls.js +443 -0
  757. package/dist/urls.js.map +1 -0
  758. package/dist/use-loader.d.ts +127 -0
  759. package/dist/use-loader.d.ts.map +1 -0
  760. package/dist/use-loader.js +237 -0
  761. package/dist/use-loader.js.map +1 -0
  762. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  763. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  766. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  767. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  770. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  771. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  774. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  775. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  776. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  777. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  778. package/dist/vite/ast-handler-extract.d.ts +49 -0
  779. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  780. package/dist/vite/ast-handler-extract.js +249 -0
  781. package/dist/vite/ast-handler-extract.js.map +1 -0
  782. package/dist/vite/expose-action-id.d.ts +19 -0
  783. package/dist/vite/expose-action-id.d.ts.map +1 -0
  784. package/dist/vite/expose-action-id.js +250 -0
  785. package/dist/vite/expose-action-id.js.map +1 -0
  786. package/dist/vite/expose-id-utils.d.ts +69 -0
  787. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  788. package/dist/vite/expose-id-utils.js +289 -0
  789. package/dist/vite/expose-id-utils.js.map +1 -0
  790. package/dist/vite/expose-internal-ids.d.ts +22 -0
  791. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  792. package/dist/vite/expose-internal-ids.js +886 -0
  793. package/dist/vite/expose-internal-ids.js.map +1 -0
  794. package/dist/vite/index.d.ts +149 -0
  795. package/dist/vite/index.d.ts.map +1 -0
  796. package/dist/vite/index.js +47 -6
  797. package/dist/vite/index.js.bak +5448 -0
  798. package/dist/vite/index.js.map +1 -0
  799. package/dist/vite/index.named-routes.gen.ts +103 -0
  800. package/dist/vite/package-resolution.d.ts +43 -0
  801. package/dist/vite/package-resolution.d.ts.map +1 -0
  802. package/dist/vite/package-resolution.js +112 -0
  803. package/dist/vite/package-resolution.js.map +1 -0
  804. package/dist/vite/virtual-entries.d.ts +25 -0
  805. package/dist/vite/virtual-entries.d.ts.map +1 -0
  806. package/dist/vite/virtual-entries.js +110 -0
  807. package/dist/vite/virtual-entries.js.map +1 -0
  808. package/package.json +61 -21
  809. package/skills/caching/SKILL.md +2 -1
  810. package/skills/hooks/SKILL.md +38 -27
  811. package/skills/host-router/SKILL.md +16 -2
  812. package/skills/intercept/SKILL.md +4 -2
  813. package/skills/layout/SKILL.md +11 -6
  814. package/skills/loader/SKILL.md +6 -2
  815. package/skills/middleware/SKILL.md +4 -2
  816. package/skills/migrate-nextjs/SKILL.md +3 -1
  817. package/skills/parallel/SKILL.md +9 -4
  818. package/skills/rango/SKILL.md +12 -0
  819. package/skills/route/SKILL.md +4 -2
  820. package/skills/testing/SKILL.md +129 -0
  821. package/skills/testing/bindings.md +89 -0
  822. package/skills/testing/cache-prerender.md +98 -0
  823. package/skills/testing/client-components.md +122 -0
  824. package/skills/testing/e2e-parity.md +125 -0
  825. package/skills/testing/flight.md +89 -0
  826. package/skills/testing/handles.md +129 -0
  827. package/skills/testing/loader.md +128 -0
  828. package/skills/testing/middleware.md +99 -0
  829. package/skills/testing/render-handler.md +118 -0
  830. package/skills/testing/response-routes.md +95 -0
  831. package/skills/testing/reverse-and-types.md +84 -0
  832. package/skills/testing/server-actions.md +107 -0
  833. package/skills/testing/server-tree.md +128 -0
  834. package/skills/testing/setup.md +120 -0
  835. package/src/browser/action-fence.ts +37 -0
  836. package/src/browser/cookie-name.ts +140 -0
  837. package/src/browser/invalidate-client-cache.ts +52 -0
  838. package/src/browser/navigation-bridge.ts +14 -1
  839. package/src/browser/navigation-client.ts +14 -1
  840. package/src/browser/navigation-store-handle.ts +39 -0
  841. package/src/browser/navigation-store.ts +26 -12
  842. package/src/browser/prefetch/fetch.ts +7 -0
  843. package/src/browser/rango-state.ts +176 -97
  844. package/src/browser/react/index.ts +0 -6
  845. package/src/browser/rsc-router.tsx +12 -4
  846. package/src/browser/server-action-bridge.ts +77 -15
  847. package/src/browser/types.ts +7 -1
  848. package/src/cache/cf/cf-cache-store.ts +22 -1
  849. package/src/cache/document-cache.ts +11 -0
  850. package/src/cache/memory-segment-store.ts +6 -0
  851. package/src/client.rsc.tsx +1 -1
  852. package/src/client.tsx +0 -6
  853. package/src/component-utils.ts +19 -0
  854. package/src/handle.ts +29 -9
  855. package/src/host/testing.ts +43 -14
  856. package/src/index.rsc.ts +22 -1
  857. package/src/index.ts +31 -1
  858. package/src/loader.rsc.ts +24 -3
  859. package/src/loader.ts +16 -2
  860. package/src/prerender.ts +24 -3
  861. package/src/router/basename.ts +14 -0
  862. package/src/router/match-handlers.ts +62 -20
  863. package/src/router/prerender-match.ts +4 -0
  864. package/src/router/router-interfaces.ts +7 -0
  865. package/src/router/router-options.ts +30 -0
  866. package/src/router/state-cookie-name.ts +33 -0
  867. package/src/router/telemetry.ts +99 -0
  868. package/src/router.ts +36 -7
  869. package/src/rsc/handler.ts +3 -0
  870. package/src/rsc/helpers.ts +19 -0
  871. package/src/rsc/progressive-enhancement.ts +2 -0
  872. package/src/rsc/rsc-rendering.ts +2 -0
  873. package/src/rsc/types.ts +2 -0
  874. package/src/runtime-env.ts +18 -0
  875. package/src/server/cookie-store.ts +52 -1
  876. package/src/server/request-context.ts +69 -0
  877. package/src/static-handler.ts +25 -3
  878. package/src/testing/cache-status.ts +166 -0
  879. package/src/testing/collect-handle.ts +63 -0
  880. package/src/testing/dispatch.ts +581 -0
  881. package/src/testing/dom.entry.ts +22 -0
  882. package/src/testing/e2e/fixture.ts +188 -0
  883. package/src/testing/e2e/index.ts +149 -0
  884. package/src/testing/e2e/matchers.ts +51 -0
  885. package/src/testing/e2e/page-helpers.ts +272 -0
  886. package/src/testing/e2e/parity.ts +387 -0
  887. package/src/testing/e2e/server.ts +195 -0
  888. package/src/testing/flight-matchers.ts +110 -0
  889. package/src/testing/flight-normalize.ts +38 -0
  890. package/src/testing/flight-runtime.d.ts +57 -0
  891. package/src/testing/flight-tree.ts +682 -0
  892. package/src/testing/flight.entry.ts +52 -0
  893. package/src/testing/flight.ts +234 -0
  894. package/src/testing/generated-routes.ts +223 -0
  895. package/src/testing/index.ts +119 -0
  896. package/src/testing/internal/context.ts +390 -0
  897. package/src/testing/internal/flight-client-globals.ts +30 -0
  898. package/src/testing/internal/seed-vars.ts +80 -0
  899. package/src/testing/render-handler.ts +360 -0
  900. package/src/testing/render-route.tsx +594 -0
  901. package/src/testing/run-loader.ts +474 -0
  902. package/src/testing/run-middleware.ts +231 -0
  903. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  904. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  905. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  906. package/src/testing/vitest-stubs/version.ts +5 -0
  907. package/src/testing/vitest.ts +305 -0
  908. package/src/types/global-namespace.ts +11 -1
  909. package/src/types/handler-context.ts +16 -5
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Client seat of `invalidateClientCache()` (the `default` export condition).
3
+ *
4
+ * Makes the current client behave as if a server action had just completed:
5
+ * the history cache is marked stale (SWR), the prefetch map is flushed, the
6
+ * state rotates, and sibling tabs are broadcast to — the same
7
+ * `markCacheAsStaleAndBroadcast()` path the server-action bridge uses. This is
8
+ * the gentler mark-stale (not hard-clear) behavior, so Back renders the cached
9
+ * entry instantly and revalidates.
10
+ */
11
+
12
+ import { getRegisteredStore } from "./navigation-store-handle.js";
13
+ import { clearPrefetchCache } from "./prefetch/cache.js";
14
+
15
+ export function invalidateClientCache(): void {
16
+ if (typeof document === "undefined") {
17
+ // SSR pass of a client component also resolves the default condition. A
18
+ // render-time call must not take down the page; no-op with a dev warning.
19
+ if (process.env.NODE_ENV !== "production") {
20
+ console.warn(
21
+ "[rango] invalidateClientCache() was called during a server render; " +
22
+ "it is a no-op outside the browser.",
23
+ );
24
+ }
25
+ return;
26
+ }
27
+
28
+ const store = getRegisteredStore();
29
+ if (store) {
30
+ store.markCacheAsStaleAndBroadcast();
31
+ return;
32
+ }
33
+
34
+ // Pre-boot: no store registered yet. clearPrefetchCache() (which rotates the
35
+ // state) is complete at this point — there is no history cache to mark and no
36
+ // sibling state worth broadcasting.
37
+ clearPrefetchCache();
38
+ }
39
+
40
+ /**
41
+ * Client no-op for `keepClientCache()`. It is a server action directive (the
42
+ * `react-server` condition sets a response header the action bridge reads);
43
+ * there is nothing to suppress from the client side.
44
+ */
45
+ export function keepClientCache(): void {
46
+ if (process.env.NODE_ENV !== "production") {
47
+ console.warn(
48
+ "[rango] keepClientCache() has no effect on the client; it is a server " +
49
+ "action directive. Call it from inside a server action.",
50
+ );
51
+ }
52
+ }
@@ -5,6 +5,8 @@ import type {
5
5
  ResolvedSegment,
6
6
  } from "./types.js";
7
7
  import { setAppVersion } from "./app-version.js";
8
+ import { isActionFenceActive } from "./action-fence.js";
9
+ import { getRangoState } from "./rango-state.js";
8
10
  import * as React from "react";
9
11
  import { startTransition } from "react";
10
12
  import {
@@ -446,11 +448,22 @@ export function createNavigationBridge(
446
448
  // Helper to check if streaming is in progress
447
449
  const isStreaming = () => eventController.getState().isStreaming;
448
450
 
451
+ // Surface any external rotation of the rango state cookie (a server
452
+ // Set-Cookie, a sibling tab, a cookie clear) BEFORE reading the stale bit.
453
+ // The divergence observer only runs inside getRangoState() — fetch-time —
454
+ // so a popstate-first interaction would otherwise serve a pre-mutation
455
+ // page as fresh and never fetch to trigger the observer. Reading here lets
456
+ // the observer mark the history cache stale so getCachedSegments sees it.
457
+ getRangoState();
458
+
449
459
  // Check if we can restore from history cache
450
460
  const cached = store.getCachedSegments(historyKey);
451
461
  const cachedSegments = cached?.segments;
452
462
  const cachedHandleData = cached?.handleData;
453
- const isStale = cached?.stale ?? false;
463
+ // While an action is in flight the fence persists no stale flag, so OR it
464
+ // in here: a popstate during the flight serves the cached entry AND
465
+ // revalidates (SWR) instead of serving it as fresh.
466
+ const isStale = (cached?.stale ?? false) || isActionFenceActive();
454
467
 
455
468
  if (cachedSegments && cachedSegments.length > 0) {
456
469
  // Update store to point to this history entry
@@ -12,6 +12,7 @@ import {
12
12
  startBrowserTransaction,
13
13
  } from "./logging.js";
14
14
  import { getRangoState } from "./rango-state.js";
15
+ import { isActionFenceActive } from "./action-fence.js";
15
16
  import {
16
17
  extractRscHeaderUrl,
17
18
  emptyResponse,
@@ -108,7 +109,14 @@ export function createNavigationClient(
108
109
  // server-action invalidation) auto-invalidates both scopes.
109
110
  // Skip cache for stale revalidation (needs fresh data), HMR (needs
110
111
  // fresh modules), and intercept contexts (source-dependent responses).
111
- const canUsePrefetch = !staleRevalidation && !hmr && !interceptSourceUrl;
112
+ // Suspend prefetch consumption while an action is in flight: a queued
113
+ // prefetch holds pre-mutation data and must not be served until the
114
+ // action's response decides whether anything changed.
115
+ const canUsePrefetch =
116
+ !staleRevalidation &&
117
+ !hmr &&
118
+ !interceptSourceUrl &&
119
+ !isActionFenceActive();
112
120
  const rangoState = getRangoState();
113
121
  const wildcardKey = buildPrefetchKey(rangoState, fetchUrl);
114
122
  const cacheKey = buildSourceKey(rangoState, previousUrl, fetchUrl);
@@ -207,6 +215,11 @@ export function createNavigationClient(
207
215
  }
208
216
 
209
217
  return fetch(fetchUrl, {
218
+ // During an action's flight the state is not rotated, so the old
219
+ // X-Rango-State still matches the Vary-keyed HTTP-cache entry; bypass
220
+ // it so a genuine mid-action navigation fetches fresh instead of being
221
+ // served the stale prefetched bytes.
222
+ ...(isActionFenceActive() && { cache: "no-store" as RequestCache }),
210
223
  headers: {
211
224
  "X-RSC-Router-Client-Path": previousUrl,
212
225
  "X-Rango-State": getRangoState(),
@@ -0,0 +1,39 @@
1
+ /**
2
+ * A module-level handle to the active navigation store.
3
+ *
4
+ * The real boot path (`rsc-router.tsx`) calls `createNavigationStore()`
5
+ * directly, so the `getNavigationStore()` singleton in `navigation-store.ts`
6
+ * is never populated in a running app (it throws; only unit tests use it).
7
+ * This handle is the live reference for code that needs the store but does not
8
+ * receive it by argument: the jar-divergence observer (below) and the client
9
+ * seat of `invalidateClientCache()` (added later).
10
+ *
11
+ * Dependency-light on purpose: it imports only `setRangoStateObserver` and the
12
+ * store type, so pulling it into the default root entry does not drag the
13
+ * navigation store into bundles that previously lacked it.
14
+ */
15
+
16
+ import { setRangoStateObserver } from "./rango-state.js";
17
+ import type { NavigationStore } from "./types.js";
18
+
19
+ let registeredStore: NavigationStore | null = null;
20
+
21
+ /**
22
+ * Register the active navigation store at boot, and wire the jar-divergence
23
+ * observer: when a per-request cookie read detects an EXTERNAL rotation (a
24
+ * sibling tab, a server `Set-Cookie`, or a cookie clear), mark this tab's
25
+ * history cache stale. The history cache is not state-keyed, so the value
26
+ * rotation alone does not reach it. No broadcast, no prefetch clear, no
27
+ * re-rotation — the value already changed externally.
28
+ */
29
+ export function registerNavigationStore(store: NavigationStore): void {
30
+ registeredStore = store;
31
+ setRangoStateObserver(() => {
32
+ registeredStore?.markHistoryCacheStale();
33
+ });
34
+ }
35
+
36
+ /** The active navigation store, or null before boot has registered it. */
37
+ export function getRegisteredStore(): NavigationStore | null {
38
+ return registeredStore;
39
+ }
@@ -130,14 +130,14 @@ export interface NavigationStoreConfig {
130
130
 
131
131
  /**
132
132
  * Enable cross-tab cache invalidation via BroadcastChannel (default: true)
133
- * When cache is cleared (via server actions or useClientCache().clear()),
133
+ * When cache is cleared (via server actions or invalidateClientCache()),
134
134
  * other tabs will also clear their cache
135
135
  */
136
136
  crossTabSync?: boolean;
137
137
 
138
138
  /**
139
139
  * Auto-refresh when another tab mutates data on the same path (default: true)
140
- * Triggered when cache is cleared via server actions or useClientCache().clear()
140
+ * Triggered when cache is cleared via server actions or invalidateClientCache()
141
141
  * Requires crossTabSync to be enabled
142
142
  */
143
143
  crossTabAutoRefresh?: boolean;
@@ -335,12 +335,24 @@ export function createNavigationStore(
335
335
  }
336
336
 
337
337
  /**
338
- * Mark all cache entries as stale (internal - does not broadcast)
338
+ * Mark every history entry stale WITHOUT touching the prefetch caches or the
339
+ * rango state. Used by the jar-divergence observer: an external rotation has
340
+ * already changed the state value (so prefetch/HTTP entries strand under the
341
+ * retired key), and this tab must NOT re-rotate — only the history cache,
342
+ * which is not state-keyed, needs marking.
339
343
  */
340
- function markCacheAsStaleInternal(): void {
344
+ function markHistoryStale(): void {
341
345
  for (let i = 0; i < historyCache.length; i++) {
342
346
  historyCache[i][2] = true;
343
347
  }
348
+ }
349
+
350
+ /**
351
+ * Mark all cache entries as stale (internal - does not broadcast). Also
352
+ * clears the prefetch caches, which rotates the rango state.
353
+ */
354
+ function markCacheAsStaleInternal(): void {
355
+ markHistoryStale();
344
356
  clearPrefetchCache();
345
357
  }
346
358
 
@@ -659,6 +671,16 @@ export function createNavigationStore(
659
671
  markCacheAsStaleInternal();
660
672
  },
661
673
 
674
+ /**
675
+ * Mark every history entry stale WITHOUT clearing the prefetch caches or
676
+ * rotating the rango state. The jar-divergence observer calls this after an
677
+ * external rotation has already changed the state value, so re-rotating
678
+ * here would ping-pong with the tab that rotated.
679
+ */
680
+ markHistoryCacheStale(): void {
681
+ markHistoryStale();
682
+ },
683
+
662
684
  /**
663
685
  * Clear the history cache and broadcast to other tabs
664
686
  * Use this for hard invalidation when data is definitely stale
@@ -675,14 +697,6 @@ export function createNavigationStore(
675
697
  markStaleAndBroadcast();
676
698
  },
677
699
 
678
- /**
679
- * Broadcast cache invalidation to other tabs without clearing local cache
680
- * Used after consolidation fetch where local cache has fresh data
681
- */
682
- broadcastCacheInvalidation(): void {
683
- broadcastInvalidation();
684
- },
685
-
686
700
  /**
687
701
  * Set the callback to invoke when cross-tab refresh is triggered
688
702
  * Called by navigation bridge during initialization
@@ -27,6 +27,7 @@ import {
27
27
  type DecodedPrefetch,
28
28
  } from "./cache.js";
29
29
  import { getRangoState } from "../rango-state.js";
30
+ import { isActionFenceActive } from "../action-fence.js";
30
31
  import { enqueuePrefetch } from "./queue.js";
31
32
  import { shouldPrefetch } from "./policy.js";
32
33
  import { debugLog } from "../logging.js";
@@ -150,6 +151,12 @@ function executePrefetchFetch(
150
151
 
151
152
  const promise: Promise<DecodedPrefetch | null> = fetch(fetchUrl, {
152
153
  priority: "low" as RequestPriority,
154
+ // During an action's flight the state is not rotated, so the old
155
+ // X-Rango-State still matches the Vary-keyed HTTP-cache entry; bypass it so
156
+ // a prefetch fetches fresh rather than warming the map with stale bytes (the
157
+ // fence's HTTP-cache-bypass requirement applies to prefetch as well as
158
+ // navigation fetches).
159
+ ...(isActionFenceActive() && { cache: "no-store" as RequestCache }),
153
160
  signal,
154
161
  headers: {
155
162
  "X-Rango-State": getRangoState(),
@@ -1,136 +1,215 @@
1
1
  /**
2
2
  * Rango State
3
3
  *
4
- * Manages a localStorage-based state key for HTTP cache invalidation.
5
- * The key is sent as the `X-Rango-State` header on both prefetch and
6
- * navigation requests. The server responds with `Vary: X-Rango-State`,
7
- * so the browser HTTP cache keys responses by (URL, X-Rango-State value).
4
+ * Manages a session-cookie-based state value for HTTP cache invalidation. The
5
+ * value is sent as the `X-Rango-State` header on prefetch and navigation
6
+ * requests; the server responds with `Vary: X-Rango-State`, so the browser HTTP
7
+ * cache keys responses by (URL, X-Rango-State value).
8
8
  *
9
9
  * Value format: `{buildVersion}:{invalidationTimestamp}`
10
- * - Build version changes on deploy, busting all cached prefetches.
11
- * - Timestamp changes on server action invalidation.
10
+ * - Build version changes on deploy, busting all cached prefetches at boot.
11
+ * - Timestamp rotates on invalidation (server action, invalidateClientCache).
12
12
  *
13
- * Storage key is namespaced per routerId (`rango-state:{routerId}`) so
14
- * tabs in different apps on the same origin do not collide. Two tabs in
15
- * the same app share a key one tab's invalidation is picked up by the
16
- * other via the `storage` event. The key is bound once at document init; a
17
- * cross-app navigation is a full document load (X-RSC-Reload), so the target
18
- * app's document binds its own key on load (tabs in the old app keep theirs).
13
+ * Storage is a session cookie named by the server-resolved name passed to
14
+ * initRangoState (`{prefix}_{routerId}`, default prefix `rango-state`). The
15
+ * cookie jar is shared across tabs, so a per-request read IS the cross-tab
16
+ * value sync no `storage` event is needed. An in-memory mirror is a
17
+ * write-through copy that is authoritative only when the cookie is unreadable
18
+ * (e.g. a sandboxed frame, or site data blocked wholesale): the failure
19
+ * direction is always toward freshness.
19
20
  *
20
- * If no routerId is supplied, falls back to a single legacy key for
21
- * backward compatibility (single-app deployments unaffected).
21
+ * Precedence is load-bearing: when `document.cookie` is readable, the
22
+ * per-request read wins; the mirror is a fallback, never a cache of the read.
23
+ * Caching the read across requests would reintroduce the staleness this
24
+ * mechanism removes.
22
25
  */
23
26
 
24
- const LEGACY_STORAGE_KEY = "rango-state";
27
+ import {
28
+ DEFAULT_STATE_COOKIE_PREFIX,
29
+ decodeStateValue,
30
+ getRawCookieValue,
31
+ mintStateValue,
32
+ serializeStateCookie,
33
+ } from "./cookie-name.js";
34
+
35
+ // The resolved cookie name this document is bound to (server-resolved, read
36
+ // from payload metadata at boot). Bare default until initRangoState runs.
37
+ let cookieName: string = DEFAULT_STATE_COOKIE_PREFIX;
38
+
39
+ // Build version for this document, used as the prefix of minted values.
40
+ let currentVersion = "0";
41
+
42
+ // Write-through mirror of the value. Authoritative only when the cookie is
43
+ // unreadable. `cookieBacked` records whether the mirror was last confirmed
44
+ // present in the jar, so a present->absent transition (an external clear) is
45
+ // detected exactly once instead of re-firing on every subsequent read.
46
+ let mirror: string | null = null;
47
+ let cookieBacked = false;
48
+
49
+ // External-rotation observer, registered by the store-handle wiring (so a
50
+ // sibling tab's rotation or a server Set-Cookie marks the history cache stale).
51
+ // Null until registered; self-rotations never call it.
52
+ let externalRotationObserver: ((value: string) => void) | null = null;
25
53
 
26
- function buildStorageKey(routerId: string | undefined): string {
27
- return routerId ? `${LEGACY_STORAGE_KEY}:${routerId}` : LEGACY_STORAGE_KEY;
54
+ /**
55
+ * Register the observer invoked when a read detects an EXTERNAL rotation (a
56
+ * sibling tab, a server `Set-Cookie`, or a cookie clear). Self-rotations
57
+ * (invalidateRangoState) update the mirror synchronously and never fire it.
58
+ */
59
+ export function setRangoStateObserver(
60
+ observer: ((value: string) => void) | null,
61
+ ): void {
62
+ externalRotationObserver = observer;
28
63
  }
29
64
 
30
- // Module-level cache avoids hitting localStorage on every getRangoState() call.
31
- // Initialized from localStorage on first access or by initRangoState().
32
- let cachedState: string | null = null;
33
-
34
- // The localStorage key this tab is currently bound to. Bound on
35
- // initRangoState (document boot). The storage listener filters cross-tab
36
- // events by this key so events from tabs in a different app are ignored.
37
- let currentStorageKey: string = LEGACY_STORAGE_KEY;
38
-
39
- // Cross-tab sync: the `storage` event fires in OTHER tabs when one tab writes
40
- // to localStorage, keeping cachedState fresh without polling.
41
- let storageListenerAttached = false;
42
-
43
- function attachStorageListener(): void {
44
- if (storageListenerAttached || typeof window === "undefined") return;
45
- window.addEventListener("storage", (e) => {
46
- // Only react to events for this tab's current app namespace. Events
47
- // under other routerId-scoped keys belong to other apps and must not
48
- // clobber this tab's state.
49
- if (e.key !== currentStorageKey) return;
50
- cachedState = e.newValue;
51
- });
52
- storageListenerAttached = true;
65
+ function notifyExternalRotation(value: string): void {
66
+ externalRotationObserver?.(value);
53
67
  }
54
68
 
55
- /**
56
- * Initialize the Rango state key in localStorage.
57
- * Called once at app startup with the build version from the server.
58
- * The routerId scopes the storage key to this app; in multi-app setups
59
- * each app owns its own `rango-state:{routerId}` key and cannot observe
60
- * invalidations from sibling apps on the same origin.
61
- *
62
- * If localStorage already has a matching-version entry under the key,
63
- * keeps it (preserves invalidation state across refresh). Otherwise
64
- * writes a new value.
65
- */
66
- export function initRangoState(version: string, routerId?: string): void {
67
- currentStorageKey = buildStorageKey(routerId);
68
- if (typeof window === "undefined") return;
69
+ interface CookieRead {
70
+ /** False when there is no document or the read threw (sandboxed frame). */
71
+ readable: boolean;
72
+ /** The cookie value, or null when readable but absent. */
73
+ value: string | null;
74
+ }
69
75
 
70
- attachStorageListener();
76
+ function readCookie(name: string): CookieRead {
77
+ if (typeof document === "undefined") return { readable: false, value: null };
78
+ let raw: string;
79
+ try {
80
+ raw = document.cookie;
81
+ } catch {
82
+ return { readable: false, value: null };
83
+ }
84
+ // Shared parser with the server seat so both read the same jar entry.
85
+ return { readable: true, value: getRawCookieValue(raw, name) };
86
+ }
71
87
 
88
+ function writeCookie(name: string, value: string): void {
89
+ if (typeof document === "undefined") return;
90
+ const secure =
91
+ typeof location !== "undefined" && location.protocol === "https:";
72
92
  try {
73
- const existing = localStorage.getItem(currentStorageKey);
74
- if (existing) {
75
- const colonIdx = existing.indexOf(":");
76
- if (colonIdx > 0) {
77
- const existingVersion = existing.slice(0, colonIdx);
78
- if (existingVersion === version) {
79
- cachedState = existing;
80
- return;
81
- }
82
- }
83
- }
84
- // New version or first load
85
- const newState = `${version}:${Date.now()}`;
86
- localStorage.setItem(currentStorageKey, newState);
87
- cachedState = newState;
93
+ document.cookie = serializeStateCookie(name, value, secure);
88
94
  } catch {
89
- // localStorage may be unavailable (private browsing in some browsers)
90
- cachedState = `${version}:${Date.now()}`;
95
+ // Write failures are silently absorbed; the mirror carries the value.
91
96
  }
92
97
  }
93
98
 
99
+ // Mint a fresh value: same version, a timestamp strictly greater than the
100
+ // current one (the in-memory mirror is the previous value). The monotonic guard
101
+ // lives in mintStateValue, shared with the server seat.
102
+ function mintValue(): string {
103
+ return mintStateValue(currentVersion, mirror);
104
+ }
105
+
94
106
  /**
95
- * Get the current Rango state key value.
96
- * Used as the `X-Rango-State` header value for prefetch and navigation requests.
107
+ * Initialize the Rango state cookie at app startup. `version` is the build
108
+ * version; `stateCookieName` is the server-resolved cookie name from payload
109
+ * metadata (falls back to the bare default prefix when a payload arrives
110
+ * without it). Keeps an existing matching-version cookie (preserves the cache
111
+ * key across reloads); mints fresh on a version change or a missing cookie.
112
+ */
113
+ export function initRangoState(
114
+ version: string,
115
+ stateCookieName?: string,
116
+ ): void {
117
+ currentVersion = version;
118
+ cookieName = stateCookieName || DEFAULT_STATE_COOKIE_PREFIX;
119
+ cleanupLegacyStorage();
120
+
121
+ const read = readCookie(cookieName);
122
+ if (!read.readable) {
123
+ // Cookies unreadable: the mirror is the source of truth for this session.
124
+ mirror = mintValue();
125
+ cookieBacked = false;
126
+ return;
127
+ }
128
+ if (read.value !== null) {
129
+ const decoded = decodeStateValue(read.value);
130
+ if (decoded && decoded.version === version) {
131
+ // Keep: a matching-version cookie survives the reload warm.
132
+ mirror = read.value;
133
+ cookieBacked = true;
134
+ return;
135
+ }
136
+ }
137
+ // Absent, malformed, or a version change (deploy): mint fresh and write.
138
+ mirror = mintValue();
139
+ cookieBacked = false;
140
+ writeCookie(cookieName, mirror);
141
+ }
142
+
143
+ /**
144
+ * Get the current Rango state value, used as the `X-Rango-State` header on
145
+ * prefetch and navigation requests. Reads the cookie every call (the read is
146
+ * the cross-tab sync channel) and reconciles the mirror.
97
147
  */
98
148
  export function getRangoState(): string {
99
- if (cachedState) return cachedState;
149
+ const read = readCookie(cookieName);
100
150
 
101
- if (typeof window === "undefined") return "0:0";
151
+ if (!read.readable) {
152
+ // Mirror authoritative when the jar is unreadable.
153
+ return mirror ?? "0:0";
154
+ }
102
155
 
103
- try {
104
- const stored = localStorage.getItem(currentStorageKey);
105
- if (stored) {
106
- cachedState = stored;
107
- return stored;
156
+ if (read.value !== null) {
157
+ if (read.value !== mirror) {
158
+ // External rotation (sibling tab / server Set-Cookie): adopt it. The
159
+ // mirror update makes this idempotent across a burst of reads.
160
+ mirror = read.value;
161
+ cookieBacked = true;
162
+ notifyExternalRotation(read.value);
163
+ } else {
164
+ cookieBacked = true;
108
165
  }
109
- } catch {
110
- // Fallback for unavailable localStorage
166
+ return read.value;
111
167
  }
112
168
 
113
- return "0:0";
169
+ // Readable but absent.
170
+ if (cookieBacked) {
171
+ // present -> absent: an external clear. Mint fresh, write back, and notify
172
+ // once (cookieBacked flips to false so we don't re-fire on the next read).
173
+ mirror = mintValue();
174
+ cookieBacked = false;
175
+ writeCookie(cookieName, mirror);
176
+ notifyExternalRotation(mirror);
177
+ } else if (mirror === null) {
178
+ // First access with no cookie yet (pre-boot): mint silently — there is
179
+ // nothing to invalidate.
180
+ mirror = mintValue();
181
+ writeCookie(cookieName, mirror);
182
+ }
183
+ return mirror;
114
184
  }
115
185
 
116
186
  /**
117
- * Invalidate the Rango state key. Called when server actions mutate data.
118
- * Updates the timestamp portion while keeping the version prefix.
119
- * The new value takes effect immediately for all subsequent fetches,
120
- * causing Vary mismatches with previously cached responses.
187
+ * Invalidate the Rango state (self-rotation). Called when the client clears its
188
+ * prefetch caches (e.g. via the server-action bridge). Rotates the timestamp,
189
+ * keeps the version, writes the cookie, and updates the mirror synchronously so
190
+ * the external-rotation observer is NOT triggered by our own write.
121
191
  */
122
192
  export function invalidateRangoState(): void {
123
- const current = getRangoState();
124
- const colonIdx = current.indexOf(":");
125
- const version = colonIdx > 0 ? current.slice(0, colonIdx) : "0";
126
- const newState = `${version}:${Date.now()}`;
127
- cachedState = newState;
128
-
129
- if (typeof window === "undefined") return;
193
+ mirror = mintValue();
194
+ cookieBacked = false;
195
+ writeCookie(cookieName, mirror);
196
+ }
130
197
 
198
+ // One-time migration: remove the legacy localStorage keys this mechanism used
199
+ // before the cookie cutover. No value porting — a fresh cookie mint just misses
200
+ // cleanly. Idempotent: scans for `rango-state` and `rango-state:{routerId}`.
201
+ function cleanupLegacyStorage(): void {
202
+ if (typeof localStorage === "undefined") return;
131
203
  try {
132
- localStorage.setItem(currentStorageKey, newState);
204
+ const toRemove: string[] = [];
205
+ for (let i = 0; i < localStorage.length; i++) {
206
+ const key = localStorage.key(i);
207
+ if (key === "rango-state" || (key && key.startsWith("rango-state:"))) {
208
+ toRemove.push(key);
209
+ }
210
+ }
211
+ for (const key of toRemove) localStorage.removeItem(key);
133
212
  } catch {
134
- // Silently handle localStorage errors
213
+ // localStorage unavailable; nothing to clean.
135
214
  }
136
215
  }
@@ -23,12 +23,6 @@ export { useHandle } from "./use-handle.js";
23
23
  // Mount-aware reverse hook
24
24
  export { useReverse } from "./use-reverse.js";
25
25
 
26
- // Client cache controls hook
27
- export {
28
- useClientCache,
29
- type ClientCacheControls,
30
- } from "./use-client-cache.js";
31
-
32
26
  // Provider
33
27
  export {
34
28
  NavigationProvider,
@@ -22,6 +22,7 @@ import type {
22
22
  import type { EventController } from "./event-controller.js";
23
23
  import type { ResolvedThemeConfig, Theme } from "../theme/types.js";
24
24
  import { initRangoState } from "./rango-state.js";
25
+ import { registerNavigationStore } from "./navigation-store-handle.js";
25
26
  import { initPrefetchCache } from "./prefetch/cache.js";
26
27
  import { setPrefetchDecoder } from "./prefetch/fetch.js";
27
28
  import { setAppVersion } from "./app-version.js";
@@ -175,6 +176,12 @@ export async function initBrowserApp(
175
176
  ...(storeOptions?.cacheSize && { cacheSize: storeOptions.cacheSize }),
176
177
  });
177
178
 
179
+ // Register the active store on the module-level handle and wire the
180
+ // jar-divergence observer before any getRangoState() read can detect a
181
+ // cross-tab/server rotation. The real boot path never populates the
182
+ // getNavigationStore() singleton, so this handle is the live reference.
183
+ registerNavigationStore(store);
184
+
178
185
  // Seed router identity from the initial SSR payload so the first
179
186
  // cross-app SPA navigation can detect the app switch.
180
187
  if (initialPayload.metadata?.routerId) {
@@ -228,10 +235,11 @@ export async function initBrowserApp(
228
235
  version,
229
236
  });
230
237
 
231
- // Initialize the localStorage state key for cache invalidation.
232
- // The build version busts cached prefetches on deploy; the routerId
233
- // namespaces the key so sibling apps on the same origin don't collide.
234
- initRangoState(version ?? "0", initialPayload.metadata?.routerId);
238
+ // Initialize the rango state cookie for cache invalidation. The build version
239
+ // busts cached prefetches on deploy; the server-resolved cookie name
240
+ // namespaces the cookie so sibling apps on the same origin don't collide
241
+ // (falls back to the bare default prefix if metadata lacks the name).
242
+ initRangoState(version ?? "0", initialPayload.metadata?.stateCookieName);
235
243
  setAppVersion(version);
236
244
 
237
245
  // Initialize the in-memory prefetch cache TTL from server config.