@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
@@ -4,6 +4,8 @@ import type {
4
4
  RscPayload,
5
5
  } from "./types.js";
6
6
  import { createPartialUpdater } from "./partial-update.js";
7
+ import { enterActionFence, exitActionFence } from "./action-fence.js";
8
+ import { KEEP_CACHE_HEADER } from "./cookie-name.js";
7
9
  import { createNavigationTransaction } from "./navigation-transaction.js";
8
10
  import {
9
11
  reconcileSegments,
@@ -156,12 +158,40 @@ export function createServerActionBridge(
156
158
 
157
159
  // Start action in event controller - handles lifecycle tracking
158
160
  const handle = eventController.startAction(id, args);
161
+ // Whether the action's response carried the keepClientCache() directive.
162
+ // Set when the response arrives; gates the deferred invalidation below.
163
+ let keepCache = false;
164
+ // Single deferred invalidation + fence release, run exactly ONCE however the
165
+ // action terminates (normal, redirect, error, abort, intercept, concurrent).
166
+ // This replaces main's eager clear at action start: every directive-free
167
+ // action invalidates once; keepClientCache() suppresses only the automatic
168
+ // invalidation, so a concurrent directive-free action still invalidates via
169
+ // its own latch. Latched so the finally AND the early SPA-redirect returns
170
+ // (whose Flight stream never settles) can both call it safely.
171
+ let actionFinalized = false;
172
+ // skipInvalidation: the version-mismatch reload terminal released nothing
173
+ // server-side, so it releases the fence without invalidating.
174
+ const finalizeAction = (skipInvalidation = false): void => {
175
+ if (actionFinalized) return;
176
+ actionFinalized = true;
177
+ // finally so a throw in invalidation cannot leak the fence (latch is set).
178
+ try {
179
+ if (!keepCache && !skipInvalidation) {
180
+ store.markCacheAsStaleAndBroadcast();
181
+ }
182
+ } finally {
183
+ exitActionFence();
184
+ }
185
+ };
159
186
  try {
160
187
  const segmentState = store.getSegmentState();
161
188
 
162
- // Mark cache as stale immediately when action starts
163
- // This ensures SWR pattern kicks in if user navigates away during action
164
- store.markCacheAsStaleAndBroadcast();
189
+ // Raise the action fence (replaces the old eager clear). Nothing is wiped,
190
+ // rotated, or broadcast yet: navigations during the flight fetch fresh
191
+ // (no-store) and popstate is treated as SWR, but the decision to
192
+ // invalidate is deferred to the response so a no-op action (keepClientCache)
193
+ // can leave the caches and the jar untouched.
194
+ enterActionFence();
165
195
 
166
196
  // Create temporary references for serialization
167
197
  const temporaryReferences = deps.createTemporaryReferenceSet();
@@ -237,11 +267,22 @@ export function createServerActionBridge(
237
267
  // abortAllActions() doesn't disrupt the in-progress Flight stream.
238
268
  handle.signal.removeEventListener("abort", onHandleAbort);
239
269
 
270
+ // Did the action call keepClientCache()? If so the deferred invalidation
271
+ // below is suppressed for THIS action (a concurrent directive-free
272
+ // action still invalidates via its own response).
273
+ keepCache = response.headers.get(KEEP_CACHE_HEADER) === "1";
274
+
240
275
  // Check for version mismatch - server wants us to reload
241
276
  const reloadResult = handleReloadHeader(response, {
242
277
  onBlocked: resolveStreamComplete,
243
- onReload: (url) =>
244
- log("version mismatch on action, reloading", { reloadUrl: url }),
278
+ onReload: (url) => {
279
+ log("version mismatch on action, reloading", { reloadUrl: url });
280
+ // Never-settling terminal (navigates away), so the finally never
281
+ // runs: release the fence here. skipInvalidation — the mismatch
282
+ // short-circuits the action server-side, so nothing mutated and a
283
+ // broadcast would only risk hard-reloading a sibling mid-task.
284
+ finalizeAction(true);
285
+ },
245
286
  });
246
287
  if (reloadResult) return reloadResult;
247
288
 
@@ -253,6 +294,10 @@ export function createServerActionBridge(
253
294
  if (redirect && redirect !== "blocked" && !handle.signal.aborted) {
254
295
  log("action simple redirect", { url: redirect.url });
255
296
  handle.complete(undefined);
297
+ // This path returns a never-settling promise, so the finally never
298
+ // runs: invalidate + release the fence here (the mutation committed
299
+ // and we're navigating away). Latched, so the finally is a no-op.
300
+ finalizeAction();
256
301
  await dispatchRedirect(redirect.url);
257
302
  return new Promise<Response>(() => {});
258
303
  }
@@ -277,6 +322,9 @@ export function createServerActionBridge(
277
322
  log("action router id mismatch, reloading to re-sync");
278
323
  handle.complete(undefined);
279
324
  resolveStreamComplete();
325
+ // Never-settling return: release the fence before the reload (the
326
+ // reload resets module state anyway, but stay balanced). Latched.
327
+ finalizeAction();
280
328
  window.location.reload();
281
329
  return new Promise<Response>(() => {});
282
330
  }
@@ -542,8 +590,9 @@ export function createServerActionBridge(
542
590
  handle.clearConsolidation();
543
591
 
544
592
  if (scenario.historyKeyChanged) {
545
- if (!scenario.onInterceptRoute) {
546
- store.markCacheAsStaleAndBroadcast();
593
+ // Invalidation is deferred to finalizeAction(); here we only trigger
594
+ // the revalidation refetch of the new route (suppressed on keep).
595
+ if (!scenario.onInterceptRoute && !keepCache) {
547
596
  refetchRoute().catch((error) => {
548
597
  if (isBackgroundSuppressible(error)) return;
549
598
  console.error(
@@ -555,11 +604,14 @@ export function createServerActionBridge(
555
604
  break;
556
605
  }
557
606
 
558
- // Same history key but different pathname - safe to refetch current route
559
- store.markCacheAsStaleAndBroadcast();
560
- await refetchRoute({
561
- interceptSourceUrl: store.getInterceptSourceUrl(),
562
- });
607
+ // Same history key but different pathname - safe to refetch current
608
+ // route. Invalidation is deferred to finalizeAction(); here we only
609
+ // trigger the revalidation refetch (suppressed on keep).
610
+ if (!keepCache) {
611
+ await refetchRoute({
612
+ interceptSourceUrl: store.getInterceptSourceUrl(),
613
+ });
614
+ }
563
615
  break;
564
616
  }
565
617
 
@@ -567,8 +619,11 @@ export function createServerActionBridge(
567
619
  console.warn(
568
620
  `[Browser] Missing segments after action (HMR detected), refetching...`,
569
621
  );
622
+ // Repair (not revalidation), so ungated on keepCache: a keep action
623
+ // resolving last must discharge a directive-free sibling's repair.
624
+ // See the keep row in docs/design/rango-state-cookie.md (the all-keep
625
+ // edge, and the benign re-mark-stale-after-refetch end-state delta).
570
626
  await refetchRoute({ interceptSourceUrl });
571
- store.broadcastCacheInvalidation();
572
627
  break;
573
628
  }
574
629
 
@@ -585,11 +640,11 @@ export function createServerActionBridge(
585
640
  // Clear consolidation tracking before fetch
586
641
  handle.clearConsolidation();
587
642
 
643
+ // Ungated on keepCache, same as hmr-missing above (see the keep row).
588
644
  await refetchRoute({
589
645
  segments: segmentsToSend,
590
646
  interceptSourceUrl,
591
647
  });
592
- store.broadcastCacheInvalidation();
593
648
  break;
594
649
  }
595
650
 
@@ -653,7 +708,9 @@ export function createServerActionBridge(
653
708
  fullSegments,
654
709
  currentHandleData,
655
710
  );
656
- store.markCacheAsStaleAndBroadcast();
711
+ // Invalidation deferred to finalizeAction() (runs after this caches
712
+ // the fresh segments), suppressed when the action called
713
+ // keepClientCache().
657
714
  break;
658
715
  }
659
716
  }
@@ -661,6 +718,11 @@ export function createServerActionBridge(
661
718
  handle.complete(returnData);
662
719
  return returnData;
663
720
  } finally {
721
+ // The single deferred invalidation + fence release for this action. Runs
722
+ // for every terminal that settles (normal, navigated-away, error, abort,
723
+ // intercept, concurrent); the SPA-redirect paths above already ran it.
724
+ // Latched, so it fires exactly once.
725
+ finalizeAction();
664
726
  handle[Symbol.dispose]();
665
727
  }
666
728
  }
@@ -71,6 +71,12 @@ export interface RscMetadata {
71
71
  * Sent on initial render so the browser can configure its cache duration.
72
72
  */
73
73
  prefetchCacheTTL?: number;
74
+ /**
75
+ * Server-resolved rango state cookie name (`{prefix}_{routerId}`). The client
76
+ * reads it verbatim and binds the rango state cookie to it; composition
77
+ * happens only server-side.
78
+ */
79
+ stateCookieName?: string;
74
80
  /**
75
81
  * Theme configuration from router.
76
82
  * Included when theme is enabled in router config.
@@ -433,9 +439,9 @@ export interface NavigationStore {
433
439
  hasHistoryCache(historyKey: string): boolean;
434
440
  updateCacheHandleData(historyKey: string, handleData: HandleData): void;
435
441
  markCacheAsStale(): void;
442
+ markHistoryCacheStale(): void;
436
443
  markCacheAsStaleAndBroadcast(): void;
437
444
  clearHistoryCache(): void;
438
- broadcastCacheInvalidation(): void;
439
445
 
440
446
  // Cross-tab refresh callback (set by navigation bridge)
441
447
  setCrossTabRefreshCallback(callback: () => void): void;
@@ -40,6 +40,10 @@ import {
40
40
  type RequestContext,
41
41
  } from "../../server/request-context.js";
42
42
  import { VERSION } from "@rangojs/router:version";
43
+ import {
44
+ isPerClientSignalHeader,
45
+ stripPerClientSignals,
46
+ } from "../../browser/cookie-name.js";
43
47
  import {
44
48
  resolveTtl,
45
49
  resolveSwrWindow,
@@ -1611,6 +1615,9 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
1611
1615
  headers.delete(CACHE_STATUS_HEADER);
1612
1616
  headers.delete(CACHE_TAGS_HEADER);
1613
1617
  headers.delete(CACHE_TAGGED_AT_HEADER);
1618
+ // Finding #3 (read side): strip per-client signals a pre-fix or
1619
+ // pinned-version L1 entry may carry. See the read-side note in the design doc.
1620
+ stripPerClientSignals(headers);
1614
1621
  return new Response(response.body, {
1615
1622
  status: response.status,
1616
1623
  statusText: response.statusText,
@@ -1651,6 +1658,10 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
1651
1658
  // replaced with a long max-age so the CF Cache API holds the entry across
1652
1659
  // the SWR window; getResponse restores the original before serving.
1653
1660
  const headers = new Headers(response.headers);
1661
+ // Finding #3: never persist a per-client signal in the shared L1 entry
1662
+ // (the platform's Set-Cookie rejection is unverified and ignores the
1663
+ // directive anyway). See stripPerClientSignals.
1664
+ stripPerClientSignals(headers);
1654
1665
  const originalCacheControl = response.headers.get("Cache-Control");
1655
1666
  if (originalCacheControl !== null) {
1656
1667
  headers.set(CACHE_ORIG_CC_HEADER, originalCacheControl);
@@ -1688,8 +1699,12 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
1688
1699
  // L2: persist to KV (KV requires expirationTtl >= 60s)
1689
1700
  if (this.kv && this.waitUntil && totalTtl >= 60) {
1690
1701
  const kvKey = this.toKVKey(`doc:${key}`);
1702
+ // Finding #3: never persist a per-client signal in the KV envelope.
1691
1703
  const headersArray: [string, string][] = [];
1692
- response.headers.forEach((v, k) => headersArray.push([k, v]));
1704
+ response.headers.forEach((v, k) => {
1705
+ if (isPerClientSignalHeader(k)) return;
1706
+ headersArray.push([k, v]);
1707
+ });
1693
1708
  // Read body as ArrayBuffer and encode to base64 to preserve binary payloads
1694
1709
  const bodyBuf = kvBody
1695
1710
  ? await new Response(kvBody).arrayBuffer()
@@ -2848,6 +2863,12 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
2848
2863
  // so evict it and miss rather than re-failing every read until TTL.
2849
2864
  let response: Response;
2850
2865
  try {
2866
+ // Finding #3 (read side): strip per-client signals a stale envelope may
2867
+ // carry. Inside the try so a malformed `hd` evicts (not throws through);
2868
+ // mutates `hd` in place so promoteResponseToL1 re-seeds from it too.
2869
+ envelope.hd = envelope.hd.filter(
2870
+ ([name]) => !isPerClientSignalHeader(name),
2871
+ );
2851
2872
  const bodyBuffer = base64ToBuffer(envelope.b);
2852
2873
  const headers = new Headers(envelope.hd);
2853
2874
  response = new Response(bodyBuffer, {
@@ -12,6 +12,7 @@
12
12
  */
13
13
 
14
14
  import type { MiddlewareFn, MiddlewareContext } from "../router/middleware.js";
15
+ import { hasPerClientSignal } from "../browser/cookie-name.js";
15
16
  import {
16
17
  getRequestContext,
17
18
  type RequestContext,
@@ -121,6 +122,16 @@ function shouldCacheResponse(response: Response): CacheDirectives | null {
121
122
  return null;
122
123
  }
123
124
 
125
+ // Never cache a per-client signal into a SHARED response store. A Set-Cookie
126
+ // (e.g. a rango state rotation from invalidateClientCache(), or any cookie a
127
+ // loader set) would be replayed to every client on a hit — pinning them to
128
+ // one value and even rolling a rotated client back to a prior one. The
129
+ // x-rango-keep-cache directive header is the mirror image: a replayed "keep"
130
+ // would suppress invalidation for every replayed client. Refuse both.
131
+ if (hasPerClientSignal(response.headers)) {
132
+ return null;
133
+ }
134
+
124
135
  const cacheControl = response.headers.get("Cache-Control");
125
136
  return parseCacheControl(cacheControl);
126
137
  }
@@ -14,6 +14,7 @@ import type {
14
14
  CacheItemOptions,
15
15
  } from "./types.js";
16
16
  import type { RequestContext } from "../server/request-context.js";
17
+ import { isPerClientSignalHeader } from "../browser/cookie-name.js";
17
18
  import {
18
19
  resolveTtl,
19
20
  resolveSwrWindow,
@@ -292,8 +293,13 @@ export class MemorySegmentCacheStore<
292
293
  // failure must degrade to a no-op (entry simply not cached), never throw
293
294
  // up and fail the request.
294
295
  const body = await response.clone().arrayBuffer();
296
+ // Defense-in-depth (Finding #3): never persist a per-client signal into a
297
+ // shared store. The document-cache chokepoint already refuses these, but
298
+ // putResponse is public and reachable directly (e.g. tag-revalidation
299
+ // re-puts), so strip them here too.
295
300
  const headers: [string, string][] = [];
296
301
  response.headers.forEach((value, name) => {
302
+ if (isPerClientSignalHeader(name)) return;
297
303
  headers.push([name, value]);
298
304
  });
299
305
 
@@ -50,7 +50,7 @@ export { href } from "./href-client.js";
50
50
  // Mount context re-exports (useMount is client-only, but MountContext can be referenced)
51
51
  export { MountContext } from "./browser/react/mount-context.js";
52
52
 
53
- // Note: useNavigation, useAction, useClientCache are NOT re-exported here
53
+ // Note: useNavigation and useAction are NOT re-exported here
54
54
  // because they use client-side state and should only be used in client components
55
55
 
56
56
  // Handle API - for accumulating data across route segments
package/src/client.tsx CHANGED
@@ -358,12 +358,6 @@ export {
358
358
  type SegmentsState,
359
359
  } from "./browser/react/use-segments.js";
360
360
 
361
- // Client cache controls hook
362
- export {
363
- useClientCache,
364
- type ClientCacheControls,
365
- } from "./browser/react/use-client-cache.js";
366
-
367
361
  // Provider
368
362
  export {
369
363
  NavigationProvider,
@@ -5,6 +5,7 @@
5
5
  */
6
6
 
7
7
  import type { ComponentType } from "react";
8
+ import { isUnderTestRunner } from "./runtime-env.js";
8
9
 
9
10
  /**
10
11
  * Symbol used by React to mark client component references.
@@ -48,11 +49,21 @@ export function isClientComponent(
48
49
  *
49
50
  * @param component - The component to check
50
51
  * @param name - Name to use in error message (e.g., "document")
52
+ * @param opts.allowServerInTest - When true AND running under a test runner
53
+ * (`isUnderTestRunner()`), relax ONLY the "use client" requirement: a server
54
+ * component is accepted. The plugin's "use client" transform does not run in a
55
+ * bare unit test, so a real exported `document` (almost every app sets one) has
56
+ * no client marker and would otherwise throw at `createRouter`, blocking
57
+ * `dispatch`/`assertGeneratedRoutesMatch` against the real router. The document
58
+ * reference is irrelevant to those (no Flight render). The "not a JSX element"
59
+ * guard still fires, and a real dev/build still throws (mirrors the runtime
60
+ * fallback-id gating in handle.ts/loader.ts).
51
61
  * @throws Error if the component is not a client component
52
62
  */
53
63
  export function assertClientComponent(
54
64
  component: ComponentType<unknown> | unknown,
55
65
  name: string,
66
+ opts?: { allowServerInTest?: boolean },
56
67
  ): asserts component is ComponentType<unknown> {
57
68
  if (typeof component !== "function") {
58
69
  throw new Error(
@@ -62,6 +73,14 @@ export function assertClientComponent(
62
73
  );
63
74
  }
64
75
 
76
+ // Under a test runner the "use client" transform did not run, so a real
77
+ // server-rendered `document` has no client marker; accept it (the reference is
78
+ // never serialized in dispatch/route-map checks). Outside a test runner this
79
+ // still throws — the build-time safety net is preserved.
80
+ if (opts?.allowServerInTest && isUnderTestRunner()) {
81
+ return;
82
+ }
83
+
65
84
  if (!isClientComponent(component)) {
66
85
  throw new Error(
67
86
  `${name} must be a client component with "use client" directive at the top of the file. ` +
package/src/handle.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { missingInjectedIdError } from "./missing-id-error.js";
2
+ import { isUnderTestRunner } from "./runtime-env.js";
2
3
 
3
4
  /**
4
5
  * Handle definition for accumulating data across route segments.
@@ -45,6 +46,11 @@ function defaultCollect<T>(segments: T[][]): T[] {
45
46
  // Used by useHandle() to recover collect when handle is deserialized from RSC prop.
46
47
  const collectRegistry = new Map<string, (segments: unknown[][]) => unknown>();
47
48
 
49
+ // Monotonic counter for runtime fallback ids (see createHandle). Module-scoped
50
+ // and deterministic, so each createHandle() call gets a stable, unique id within
51
+ // the process. Only used when no build id was injected (a bare unit test).
52
+ let runtimeHandleIdCounter = 0;
53
+
48
54
  /**
49
55
  * Look up a collect function from the registry by handle $$id.
50
56
  * Returns undefined if not registered (falls back to defaultCollect in useHandle).
@@ -95,10 +101,26 @@ export function createHandle<TData, TAccumulated = TData[]>(
95
101
  collect?: (segments: TData[][]) => TAccumulated,
96
102
  __injectedId?: string,
97
103
  ): Handle<TData, TAccumulated> {
98
- const handleId = __injectedId ?? "";
104
+ let handleId = __injectedId ?? "";
99
105
 
100
- if (!handleId && process.env.NODE_ENV === "development") {
101
- throw missingInjectedIdError("Handle", "createHandle");
106
+ // No build-injected id. Under a test runner: fall back to a synthetic id so the
107
+ // collect registers below and the handle is exercisable in tests (useHandle,
108
+ // collectHandle, renderRoute's `handles` run the REAL collect). Otherwise (dev
109
+ // or a real build) it means an UNSUPPORTED handler shape the plugin skipped —
110
+ // fail loud. The rich, stack-parsing diagnostic stays behind the NODE_ENV check
111
+ // so a production build folds it away and tree-shakes missing-id-error.ts out,
112
+ // shipping the small throw instead. isUnderTestRunner() is runtime-safe.
113
+ if (!handleId) {
114
+ if (isUnderTestRunner()) {
115
+ handleId = `__rango_runtime_handle_${runtimeHandleIdCounter++}`;
116
+ } else if (process.env.NODE_ENV !== "production") {
117
+ throw missingInjectedIdError("Handle", "createHandle");
118
+ } else {
119
+ throw new Error(
120
+ "[rango] Handle is missing $$id — the build plugin did not inject one. " +
121
+ "Export it as `export const X = createHandle(...)`.",
122
+ );
123
+ }
102
124
  }
103
125
 
104
126
  const collectFn =
@@ -107,12 +129,10 @@ export function createHandle<TData, TAccumulated = TData[]>(
107
129
 
108
130
  // Register collect in module-level registry so useHandle() can recover it
109
131
  // when the handle is deserialized from RSC props (toJSON strips collect).
110
- if (handleId) {
111
- collectRegistry.set(
112
- handleId,
113
- collectFn as (segments: unknown[][]) => unknown,
114
- );
115
- }
132
+ collectRegistry.set(
133
+ handleId,
134
+ collectFn as (segments: unknown[][]) => unknown,
135
+ );
116
136
 
117
137
  return {
118
138
  __brand: "handle" as const,
@@ -4,7 +4,7 @@
4
4
  * Helper functions for testing host routing.
5
5
  */
6
6
 
7
- import { matchPattern } from "./pattern-matcher.js";
7
+ import { matchPattern, parseRequest } from "./pattern-matcher.js";
8
8
 
9
9
  export interface CreateTestRequestOptions {
10
10
  host: string;
@@ -52,28 +52,57 @@ export function createTestRequest(options: CreateTestRequestOptions): Request {
52
52
  });
53
53
  }
54
54
 
55
+ // Try each pattern (a single pattern or any in an array) against the already
56
+ // parsed host + path. Shared by testPattern and matchesHost so the
57
+ // normalize-and-loop lives once.
58
+ function matchPatterns(
59
+ pattern: string | string[],
60
+ hostname: string,
61
+ pathname: string,
62
+ parts: string[],
63
+ ): boolean {
64
+ const patterns = Array.isArray(pattern) ? pattern : [pattern];
65
+ return patterns.some((p) => matchPattern(p, hostname, pathname, parts));
66
+ }
67
+
55
68
  /**
56
- * Test if a pattern matches a hostname
69
+ * Test if a pattern matches a hostname (and, for path-based patterns, a pathname).
70
+ *
71
+ * `pathname` defaults to `"/"`, so a host-only pattern works with two args. Pass
72
+ * the third arg to test a path-based pattern (`**.workers.dev/admin`,
73
+ * `localhost/shop`) — without it those patterns can never match.
57
74
  *
58
75
  * @example
59
76
  * ```ts
60
- * expect(testPattern('admin.*', 'admin.example.com')).toBe(true);
61
- * expect(testPattern(['*', 'www.*'], 'example.com')).toBe(true);
77
+ * expect(testPattern("admin.*", "admin.example.com")).toBe(true);
78
+ * expect(testPattern(["*", "www.*"], "example.com")).toBe(true);
79
+ * expect(testPattern("**.workers.dev/admin", "foo.workers.dev", "/admin")).toBe(true);
62
80
  * ```
63
81
  */
64
82
  export function testPattern(
65
83
  pattern: string | string[],
66
84
  hostname: string,
85
+ pathname: string = "/",
67
86
  ): boolean {
68
- const patterns = Array.isArray(pattern) ? pattern : [pattern];
69
- const parts = hostname.split(".");
70
- const pathname = "/";
71
-
72
- for (const p of patterns) {
73
- if (matchPattern(p, hostname, pathname, parts)) {
74
- return true;
75
- }
76
- }
87
+ return matchPatterns(pattern, hostname, pathname, hostname.split("."));
88
+ }
77
89
 
78
- return false;
90
+ /**
91
+ * Test if a pattern matches a `Request` — the hostname AND pathname are taken
92
+ * from the request URL (via the same `parseRequest` the host router uses), so a
93
+ * path-based pattern is tested against a real request without splitting the URL
94
+ * by hand.
95
+ *
96
+ * @example
97
+ * ```ts
98
+ * const req = new Request("https://foo.workers.dev/admin");
99
+ * expect(matchesHost("**.workers.dev/admin", req)).toBe(true);
100
+ * ```
101
+ */
102
+ export function matchesHost(
103
+ pattern: string | string[],
104
+ request: Request,
105
+ ): boolean {
106
+ const { hostname, pathname, parts } = parseRequest(request);
107
+ return matchPatterns(pattern, hostname, pathname, parts);
79
108
  }
package/src/index.rsc.ts CHANGED
@@ -184,6 +184,8 @@ export const getRequestContext: <
184
184
  export {
185
185
  cookies,
186
186
  headers,
187
+ invalidateClientCache,
188
+ keepClientCache,
187
189
  type CookieStore,
188
190
  type Cookie,
189
191
  type ReadonlyHeaders,
@@ -235,7 +237,26 @@ export {
235
237
  export { createConsoleSink } from "./router/telemetry.js";
236
238
  export { createOTelSink } from "./router/telemetry-otel.js";
237
239
  export type { OTelTracer, OTelSpan } from "./router/telemetry-otel.js";
238
- export type { TelemetrySink, TelemetryEvent } from "./router/telemetry.js";
240
+ // The full TelemetryEvent union PLUS its member types, so a consumer writing a
241
+ // TelemetrySink can annotate a per-`type` handler (or construct an event literal
242
+ // in a test) instead of only narrowing the opaque union.
243
+ export type {
244
+ TelemetrySink,
245
+ TelemetryEvent,
246
+ RequestStartEvent,
247
+ RequestEndEvent,
248
+ RequestErrorEvent,
249
+ LoaderStartEvent,
250
+ LoaderEndEvent,
251
+ LoaderErrorEvent,
252
+ HandlerErrorEvent,
253
+ CacheSegmentStatus,
254
+ CacheSegmentSignal,
255
+ CacheDecisionEvent,
256
+ RevalidationDecisionEvent,
257
+ RequestTimeoutEvent,
258
+ OriginCheckRejectedEvent,
259
+ } from "./router/telemetry.js";
239
260
 
240
261
  // Timeout types and error class
241
262
  export { RouterTimeoutError } from "./router/timeout.js";
package/src/index.ts CHANGED
@@ -217,6 +217,17 @@ export function headers(): never {
217
217
  throw serverOnlyStubError("headers");
218
218
  }
219
219
 
220
+ /**
221
+ * Client implementation of `invalidateClientCache()`. Unlike the server-only
222
+ * stubs above this is a REAL function under the `default` condition (it marks
223
+ * the client's caches stale); the `react-server` condition (index.rsc.ts)
224
+ * selects the server implementation that writes a rotated `Set-Cookie`.
225
+ */
226
+ export {
227
+ invalidateClientCache,
228
+ keepClientCache,
229
+ } from "./browser/invalidate-client-cache.js";
230
+
220
231
  /**
221
232
  * Error-throwing stub for server-only `createReverse` function.
222
233
  */
@@ -327,7 +338,26 @@ export {
327
338
  // who need the values in non-RSC contexts can import from
328
339
  // `@rangojs/router/server`.
329
340
  export type { OTelTracer, OTelSpan } from "./router/telemetry-otel.js";
330
- export type { TelemetrySink, TelemetryEvent } from "./router/telemetry.js";
341
+ // The full TelemetryEvent union PLUS its member types, so a consumer writing a
342
+ // TelemetrySink can annotate a per-`type` handler (or construct an event literal
343
+ // in a test) instead of only narrowing the opaque union.
344
+ export type {
345
+ TelemetrySink,
346
+ TelemetryEvent,
347
+ RequestStartEvent,
348
+ RequestEndEvent,
349
+ RequestErrorEvent,
350
+ LoaderStartEvent,
351
+ LoaderEndEvent,
352
+ LoaderErrorEvent,
353
+ HandlerErrorEvent,
354
+ CacheSegmentStatus,
355
+ CacheSegmentSignal,
356
+ CacheDecisionEvent,
357
+ RevalidationDecisionEvent,
358
+ RequestTimeoutEvent,
359
+ OriginCheckRejectedEvent,
360
+ } from "./router/telemetry.js";
331
361
 
332
362
  // Timeout types and error class
333
363
  export { RouterTimeoutError } from "./router/timeout.js";
package/src/loader.rsc.ts CHANGED
@@ -22,9 +22,14 @@ import {
22
22
  getFetchableLoader,
23
23
  } from "./server/fetchable-loader-store.js";
24
24
  import { missingInjectedIdError } from "./missing-id-error.js";
25
+ import { isUnderTestRunner } from "./runtime-env.js";
25
26
 
26
27
  export { getFetchableLoader };
27
28
 
29
+ // Counter for runtime-fallback loader ids assigned only in a bare unit test
30
+ // (no Vite plugin to inject one). Process-stable; never reached in a real build.
31
+ let runtimeLoaderIdCounter = 0;
32
+
28
33
  // Overload 1: With function only (not fetchable)
29
34
  export function createLoader<T>(
30
35
  fn: LoaderFn<T, Record<string, string | undefined>, any>,
@@ -51,10 +56,26 @@ export function createLoader<T>(
51
56
  ): LoaderDefinition<Awaited<T>, Record<string, string | undefined>> {
52
57
  // The $$id will be set on the returned object by Vite plugin
53
58
  // For fetchable loaders, __injectedId is also passed as a parameter
54
- const loaderId = __injectedId || "";
59
+ let loaderId = __injectedId || "";
55
60
 
56
- if (!loaderId && process.env.NODE_ENV === "development") {
57
- throw missingInjectedIdError("Loader", "createLoader");
61
+ // No build-injected id. Under a test runner: fall back to a synthetic id so the
62
+ // fn registers below and the loader is exercisable via runLoader(loaderHandle)
63
+ // (it recovers the fn from the registry by $$id). Otherwise (dev or a real
64
+ // build) it means an UNSUPPORTED shape (e.g. a namespace import
65
+ // `rango.createLoader(...)`) the plugin skipped — fail loud. The rich
66
+ // diagnostic stays behind the NODE_ENV check so production folds it away and
67
+ // ships the small throw. isUnderTestRunner() is runtime-safe. Mirrors createHandle.
68
+ if (!loaderId) {
69
+ if (isUnderTestRunner()) {
70
+ loaderId = `__rango_runtime_loader_${runtimeLoaderIdCounter++}`;
71
+ } else if (process.env.NODE_ENV !== "production") {
72
+ throw missingInjectedIdError("Loader", "createLoader");
73
+ } else {
74
+ throw new Error(
75
+ "[rango] Loader is missing $$id — the build plugin did not inject one. " +
76
+ "Export it as `export const X = createLoader(...)`.",
77
+ );
78
+ }
58
79
  }
59
80
 
60
81
  // If not fetchable, store fn in registry (for SSR ctx.use() resolution)