@rangojs/router 0.0.0-experimental.fb6e2f40 → 0.0.0-experimental.fce7fbd1

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 (1060) hide show
  1. package/README.md +120 -25
  2. package/dist/__internal.d.ts +83 -0
  3. package/dist/__internal.d.ts.map +1 -0
  4. package/dist/__internal.js +19 -0
  5. package/dist/__internal.js.map +1 -0
  6. package/dist/__mocks__/version.d.ts +7 -0
  7. package/dist/__mocks__/version.d.ts.map +1 -0
  8. package/dist/__mocks__/version.js +7 -0
  9. package/dist/__mocks__/version.js.map +1 -0
  10. package/dist/__tests__/client-href.test.d.ts +2 -0
  11. package/dist/__tests__/client-href.test.d.ts.map +1 -0
  12. package/dist/__tests__/client-href.test.js +74 -0
  13. package/dist/__tests__/client-href.test.js.map +1 -0
  14. package/dist/__tests__/component-utils.test.d.ts +2 -0
  15. package/dist/__tests__/component-utils.test.d.ts.map +1 -0
  16. package/dist/__tests__/component-utils.test.js +51 -0
  17. package/dist/__tests__/component-utils.test.js.map +1 -0
  18. package/dist/__tests__/event-controller.test.d.ts +2 -0
  19. package/dist/__tests__/event-controller.test.d.ts.map +1 -0
  20. package/dist/__tests__/event-controller.test.js +538 -0
  21. package/dist/__tests__/event-controller.test.js.map +1 -0
  22. package/dist/__tests__/helpers/route-tree.d.ts +118 -0
  23. package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
  24. package/dist/__tests__/helpers/route-tree.js +374 -0
  25. package/dist/__tests__/helpers/route-tree.js.map +1 -0
  26. package/dist/__tests__/match-result.test.d.ts +2 -0
  27. package/dist/__tests__/match-result.test.d.ts.map +1 -0
  28. package/dist/__tests__/match-result.test.js +154 -0
  29. package/dist/__tests__/match-result.test.js.map +1 -0
  30. package/dist/__tests__/navigation-store.test.d.ts +2 -0
  31. package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
  32. package/dist/__tests__/navigation-store.test.js +440 -0
  33. package/dist/__tests__/navigation-store.test.js.map +1 -0
  34. package/dist/__tests__/partial-update.test.d.ts +2 -0
  35. package/dist/__tests__/partial-update.test.d.ts.map +1 -0
  36. package/dist/__tests__/partial-update.test.js +1009 -0
  37. package/dist/__tests__/partial-update.test.js.map +1 -0
  38. package/dist/__tests__/reverse-types.test.d.ts +8 -0
  39. package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
  40. package/dist/__tests__/reverse-types.test.js +656 -0
  41. package/dist/__tests__/reverse-types.test.js.map +1 -0
  42. package/dist/__tests__/route-definition.test.d.ts +2 -0
  43. package/dist/__tests__/route-definition.test.d.ts.map +1 -0
  44. package/dist/__tests__/route-definition.test.js +55 -0
  45. package/dist/__tests__/route-definition.test.js.map +1 -0
  46. package/dist/__tests__/router-helpers.test.d.ts +2 -0
  47. package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
  48. package/dist/__tests__/router-helpers.test.js +377 -0
  49. package/dist/__tests__/router-helpers.test.js.map +1 -0
  50. package/dist/__tests__/router-integration-2.test.d.ts +2 -0
  51. package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
  52. package/dist/__tests__/router-integration-2.test.js +426 -0
  53. package/dist/__tests__/router-integration-2.test.js.map +1 -0
  54. package/dist/__tests__/router-integration.test.d.ts +2 -0
  55. package/dist/__tests__/router-integration.test.d.ts.map +1 -0
  56. package/dist/__tests__/router-integration.test.js +1051 -0
  57. package/dist/__tests__/router-integration.test.js.map +1 -0
  58. package/dist/__tests__/search-params.test.d.ts +5 -0
  59. package/dist/__tests__/search-params.test.d.ts.map +1 -0
  60. package/dist/__tests__/search-params.test.js +306 -0
  61. package/dist/__tests__/search-params.test.js.map +1 -0
  62. package/dist/__tests__/segment-system.test.d.ts +2 -0
  63. package/dist/__tests__/segment-system.test.d.ts.map +1 -0
  64. package/dist/__tests__/segment-system.test.js +627 -0
  65. package/dist/__tests__/segment-system.test.js.map +1 -0
  66. package/dist/__tests__/static-handler-types.test.d.ts +8 -0
  67. package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
  68. package/dist/__tests__/static-handler-types.test.js +63 -0
  69. package/dist/__tests__/static-handler-types.test.js.map +1 -0
  70. package/dist/__tests__/urls.test.d.ts +2 -0
  71. package/dist/__tests__/urls.test.d.ts.map +1 -0
  72. package/dist/__tests__/urls.test.js +421 -0
  73. package/dist/__tests__/urls.test.js.map +1 -0
  74. package/dist/__tests__/use-mount.test.d.ts +2 -0
  75. package/dist/__tests__/use-mount.test.d.ts.map +1 -0
  76. package/dist/__tests__/use-mount.test.js +35 -0
  77. package/dist/__tests__/use-mount.test.js.map +1 -0
  78. package/dist/bin/rango.d.ts +2 -0
  79. package/dist/bin/rango.d.ts.map +1 -0
  80. package/dist/bin/rango.js +147 -57
  81. package/dist/bin/rango.js.map +1 -0
  82. package/dist/browser/event-controller.d.ts +191 -0
  83. package/dist/browser/event-controller.d.ts.map +1 -0
  84. package/dist/browser/event-controller.js +559 -0
  85. package/dist/browser/event-controller.js.map +1 -0
  86. package/dist/browser/index.d.ts +2 -0
  87. package/dist/browser/index.d.ts.map +1 -0
  88. package/dist/browser/index.js +14 -0
  89. package/dist/browser/index.js.map +1 -0
  90. package/dist/browser/link-interceptor.d.ts +38 -0
  91. package/dist/browser/link-interceptor.d.ts.map +1 -0
  92. package/dist/browser/link-interceptor.js +99 -0
  93. package/dist/browser/link-interceptor.js.map +1 -0
  94. package/dist/browser/logging.d.ts +10 -0
  95. package/dist/browser/logging.d.ts.map +1 -0
  96. package/dist/browser/logging.js +29 -0
  97. package/dist/browser/logging.js.map +1 -0
  98. package/dist/browser/lru-cache.d.ts +17 -0
  99. package/dist/browser/lru-cache.d.ts.map +1 -0
  100. package/dist/browser/lru-cache.js +50 -0
  101. package/dist/browser/lru-cache.js.map +1 -0
  102. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  103. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  104. package/dist/browser/merge-segment-loaders.js +102 -0
  105. package/dist/browser/merge-segment-loaders.js.map +1 -0
  106. package/dist/browser/navigation-bridge.d.ts +102 -0
  107. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  108. package/dist/browser/navigation-bridge.js +708 -0
  109. package/dist/browser/navigation-bridge.js.map +1 -0
  110. package/dist/browser/navigation-client.d.ts +25 -0
  111. package/dist/browser/navigation-client.d.ts.map +1 -0
  112. package/dist/browser/navigation-client.js +157 -0
  113. package/dist/browser/navigation-client.js.map +1 -0
  114. package/dist/browser/navigation-store.d.ts +101 -0
  115. package/dist/browser/navigation-store.d.ts.map +1 -0
  116. package/dist/browser/navigation-store.js +625 -0
  117. package/dist/browser/navigation-store.js.map +1 -0
  118. package/dist/browser/partial-update.d.ts +75 -0
  119. package/dist/browser/partial-update.d.ts.map +1 -0
  120. package/dist/browser/partial-update.js +426 -0
  121. package/dist/browser/partial-update.js.map +1 -0
  122. package/dist/browser/react/Link.d.ts +86 -0
  123. package/dist/browser/react/Link.d.ts.map +1 -0
  124. package/dist/browser/react/Link.js +128 -0
  125. package/dist/browser/react/Link.js.map +1 -0
  126. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  127. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  128. package/dist/browser/react/NavigationProvider.js +216 -0
  129. package/dist/browser/react/NavigationProvider.js.map +1 -0
  130. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  132. package/dist/browser/react/ScrollRestoration.js +57 -0
  133. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  134. package/dist/browser/react/context.d.ts +46 -0
  135. package/dist/browser/react/context.d.ts.map +1 -0
  136. package/dist/browser/react/context.js +10 -0
  137. package/dist/browser/react/context.js.map +1 -0
  138. package/dist/browser/react/index.d.ts +11 -0
  139. package/dist/browser/react/index.d.ts.map +1 -0
  140. package/dist/browser/react/index.js +22 -0
  141. package/dist/browser/react/index.js.map +1 -0
  142. package/dist/browser/react/location-state-shared.d.ts +63 -0
  143. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  144. package/dist/browser/react/location-state-shared.js +81 -0
  145. package/dist/browser/react/location-state-shared.js.map +1 -0
  146. package/dist/browser/react/location-state.d.ts +23 -0
  147. package/dist/browser/react/location-state.d.ts.map +1 -0
  148. package/dist/browser/react/location-state.js +29 -0
  149. package/dist/browser/react/location-state.js.map +1 -0
  150. package/dist/browser/react/mount-context.d.ts +24 -0
  151. package/dist/browser/react/mount-context.d.ts.map +1 -0
  152. package/dist/browser/react/mount-context.js +24 -0
  153. package/dist/browser/react/mount-context.js.map +1 -0
  154. package/dist/browser/react/use-action.d.ts +64 -0
  155. package/dist/browser/react/use-action.d.ts.map +1 -0
  156. package/dist/browser/react/use-action.js +134 -0
  157. package/dist/browser/react/use-action.js.map +1 -0
  158. package/dist/browser/react/use-client-cache.d.ts +41 -0
  159. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  160. package/dist/browser/react/use-client-cache.js +39 -0
  161. package/dist/browser/react/use-client-cache.js.map +1 -0
  162. package/dist/browser/react/use-handle.d.ts +31 -0
  163. package/dist/browser/react/use-handle.d.ts.map +1 -0
  164. package/dist/browser/react/use-handle.js +144 -0
  165. package/dist/browser/react/use-handle.js.map +1 -0
  166. package/dist/browser/react/use-href.d.ts +33 -0
  167. package/dist/browser/react/use-href.d.ts.map +1 -0
  168. package/dist/browser/react/use-href.js +39 -0
  169. package/dist/browser/react/use-href.js.map +1 -0
  170. package/dist/browser/react/use-link-status.d.ts +37 -0
  171. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  172. package/dist/browser/react/use-link-status.js +99 -0
  173. package/dist/browser/react/use-link-status.js.map +1 -0
  174. package/dist/browser/react/use-mount.d.ts +25 -0
  175. package/dist/browser/react/use-mount.d.ts.map +1 -0
  176. package/dist/browser/react/use-mount.js +30 -0
  177. package/dist/browser/react/use-mount.js.map +1 -0
  178. package/dist/browser/react/use-navigation.d.ts +27 -0
  179. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  180. package/dist/browser/react/use-navigation.js +87 -0
  181. package/dist/browser/react/use-navigation.js.map +1 -0
  182. package/dist/browser/react/use-segments.d.ts +38 -0
  183. package/dist/browser/react/use-segments.d.ts.map +1 -0
  184. package/dist/browser/react/use-segments.js +130 -0
  185. package/dist/browser/react/use-segments.js.map +1 -0
  186. package/dist/browser/request-controller.d.ts +26 -0
  187. package/dist/browser/request-controller.d.ts.map +1 -0
  188. package/dist/browser/request-controller.js +147 -0
  189. package/dist/browser/request-controller.js.map +1 -0
  190. package/dist/browser/rsc-router.d.ts +129 -0
  191. package/dist/browser/rsc-router.d.ts.map +1 -0
  192. package/dist/browser/rsc-router.js +195 -0
  193. package/dist/browser/rsc-router.js.map +1 -0
  194. package/dist/browser/scroll-restoration.d.ts +93 -0
  195. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  196. package/dist/browser/scroll-restoration.js +321 -0
  197. package/dist/browser/scroll-restoration.js.map +1 -0
  198. package/dist/browser/segment-structure-assert.d.ts +17 -0
  199. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  200. package/dist/browser/segment-structure-assert.js +59 -0
  201. package/dist/browser/segment-structure-assert.js.map +1 -0
  202. package/dist/browser/server-action-bridge.d.ts +26 -0
  203. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  204. package/dist/browser/server-action-bridge.js +668 -0
  205. package/dist/browser/server-action-bridge.js.map +1 -0
  206. package/dist/browser/shallow.d.ts +12 -0
  207. package/dist/browser/shallow.d.ts.map +1 -0
  208. package/dist/browser/shallow.js +34 -0
  209. package/dist/browser/shallow.js.map +1 -0
  210. package/dist/browser/types.d.ts +369 -0
  211. package/dist/browser/types.d.ts.map +1 -0
  212. package/dist/browser/types.js +2 -0
  213. package/dist/browser/types.js.map +1 -0
  214. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  216. package/dist/build/__tests__/generate-cli.test.js +237 -0
  217. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  218. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  220. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  221. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  222. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  224. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  225. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  226. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  228. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  230. package/dist/build/generate-manifest.d.ts +81 -0
  231. package/dist/build/generate-manifest.d.ts.map +1 -0
  232. package/dist/build/generate-manifest.js +276 -0
  233. package/dist/build/generate-manifest.js.map +1 -0
  234. package/dist/build/generate-route-types.d.ts +115 -0
  235. package/dist/build/generate-route-types.d.ts.map +1 -0
  236. package/dist/build/generate-route-types.js +740 -0
  237. package/dist/build/generate-route-types.js.map +1 -0
  238. package/dist/build/index.d.ts +21 -0
  239. package/dist/build/index.d.ts.map +1 -0
  240. package/dist/build/index.js +21 -0
  241. package/dist/build/index.js.map +1 -0
  242. package/dist/build/route-trie.d.ts +71 -0
  243. package/dist/build/route-trie.d.ts.map +1 -0
  244. package/dist/build/route-trie.js +175 -0
  245. package/dist/build/route-trie.js.map +1 -0
  246. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  248. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  249. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  250. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  252. package/dist/cache/__tests__/document-cache.test.js +345 -0
  253. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  254. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  258. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  260. package/dist/cache/__tests__/memory-store.test.js +367 -0
  261. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  262. package/dist/cache/cache-scope.d.ts +102 -0
  263. package/dist/cache/cache-scope.d.ts.map +1 -0
  264. package/dist/cache/cache-scope.js +440 -0
  265. package/dist/cache/cache-scope.js.map +1 -0
  266. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  270. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  272. package/dist/cache/cf/cf-cache-store.js +242 -0
  273. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  274. package/dist/cache/cf/index.d.ts +14 -0
  275. package/dist/cache/cf/index.d.ts.map +1 -0
  276. package/dist/cache/cf/index.js +17 -0
  277. package/dist/cache/cf/index.js.map +1 -0
  278. package/dist/cache/document-cache.d.ts +64 -0
  279. package/dist/cache/document-cache.d.ts.map +1 -0
  280. package/dist/cache/document-cache.js +228 -0
  281. package/dist/cache/document-cache.js.map +1 -0
  282. package/dist/cache/index.d.ts +19 -0
  283. package/dist/cache/index.d.ts.map +1 -0
  284. package/dist/cache/index.js +21 -0
  285. package/dist/cache/index.js.map +1 -0
  286. package/dist/cache/memory-segment-store.d.ts +110 -0
  287. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  288. package/dist/cache/memory-segment-store.js +117 -0
  289. package/dist/cache/memory-segment-store.js.map +1 -0
  290. package/dist/cache/memory-store.d.ts +41 -0
  291. package/dist/cache/memory-store.d.ts.map +1 -0
  292. package/dist/cache/memory-store.js +191 -0
  293. package/dist/cache/memory-store.js.map +1 -0
  294. package/dist/cache/types.d.ts +317 -0
  295. package/dist/cache/types.d.ts.map +1 -0
  296. package/dist/cache/types.js +12 -0
  297. package/dist/cache/types.js.map +1 -0
  298. package/dist/client.d.ts +248 -0
  299. package/dist/client.d.ts.map +1 -0
  300. package/dist/client.js +367 -0
  301. package/dist/client.js.map +1 -0
  302. package/dist/client.rsc.d.ts +26 -0
  303. package/dist/client.rsc.d.ts.map +1 -0
  304. package/dist/client.rsc.js +46 -0
  305. package/dist/client.rsc.js.map +1 -0
  306. package/dist/component-utils.d.ts +36 -0
  307. package/dist/component-utils.d.ts.map +1 -0
  308. package/dist/component-utils.js +61 -0
  309. package/dist/component-utils.js.map +1 -0
  310. package/dist/components/DefaultDocument.d.ts +13 -0
  311. package/dist/components/DefaultDocument.d.ts.map +1 -0
  312. package/dist/components/DefaultDocument.js +15 -0
  313. package/dist/components/DefaultDocument.js.map +1 -0
  314. package/dist/debug.d.ts +58 -0
  315. package/dist/debug.d.ts.map +1 -0
  316. package/dist/debug.js +157 -0
  317. package/dist/debug.js.map +1 -0
  318. package/dist/default-error-boundary.d.ts +11 -0
  319. package/dist/default-error-boundary.d.ts.map +1 -0
  320. package/dist/default-error-boundary.js +45 -0
  321. package/dist/default-error-boundary.js.map +1 -0
  322. package/dist/deps/browser.d.ts +2 -0
  323. package/dist/deps/browser.d.ts.map +1 -0
  324. package/dist/deps/browser.js +3 -0
  325. package/dist/deps/browser.js.map +1 -0
  326. package/dist/deps/html-stream-client.d.ts +2 -0
  327. package/dist/deps/html-stream-client.d.ts.map +1 -0
  328. package/dist/deps/html-stream-client.js +3 -0
  329. package/dist/deps/html-stream-client.js.map +1 -0
  330. package/dist/deps/html-stream-server.d.ts +2 -0
  331. package/dist/deps/html-stream-server.d.ts.map +1 -0
  332. package/dist/deps/html-stream-server.js +3 -0
  333. package/dist/deps/html-stream-server.js.map +1 -0
  334. package/dist/deps/rsc.d.ts +2 -0
  335. package/dist/deps/rsc.d.ts.map +1 -0
  336. package/dist/deps/rsc.js +4 -0
  337. package/dist/deps/rsc.js.map +1 -0
  338. package/dist/deps/ssr.d.ts +2 -0
  339. package/dist/deps/ssr.d.ts.map +1 -0
  340. package/dist/deps/ssr.js +3 -0
  341. package/dist/deps/ssr.js.map +1 -0
  342. package/dist/errors.d.ts +174 -0
  343. package/dist/errors.d.ts.map +1 -0
  344. package/dist/errors.js +241 -0
  345. package/dist/errors.js.map +1 -0
  346. package/dist/handle.d.ts +78 -0
  347. package/dist/handle.d.ts.map +1 -0
  348. package/dist/handle.js +82 -0
  349. package/dist/handle.js.map +1 -0
  350. package/dist/handles/MetaTags.d.ts +14 -0
  351. package/dist/handles/MetaTags.d.ts.map +1 -0
  352. package/dist/handles/MetaTags.js +136 -0
  353. package/dist/handles/MetaTags.js.map +1 -0
  354. package/dist/handles/index.d.ts +6 -0
  355. package/dist/handles/index.d.ts.map +1 -0
  356. package/dist/handles/index.js +6 -0
  357. package/dist/handles/index.js.map +1 -0
  358. package/dist/handles/meta.d.ts +39 -0
  359. package/dist/handles/meta.d.ts.map +1 -0
  360. package/dist/handles/meta.js +202 -0
  361. package/dist/handles/meta.js.map +1 -0
  362. package/dist/host/__tests__/errors.test.d.ts +2 -0
  363. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  364. package/dist/host/__tests__/errors.test.js +76 -0
  365. package/dist/host/__tests__/errors.test.js.map +1 -0
  366. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  370. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  372. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  374. package/dist/host/__tests__/router.test.d.ts +2 -0
  375. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  376. package/dist/host/__tests__/router.test.js +241 -0
  377. package/dist/host/__tests__/router.test.js.map +1 -0
  378. package/dist/host/__tests__/testing.test.d.ts +2 -0
  379. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  380. package/dist/host/__tests__/testing.test.js +64 -0
  381. package/dist/host/__tests__/testing.test.js.map +1 -0
  382. package/dist/host/__tests__/utils.test.d.ts +2 -0
  383. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  384. package/dist/host/__tests__/utils.test.js +29 -0
  385. package/dist/host/__tests__/utils.test.js.map +1 -0
  386. package/dist/host/cookie-handler.d.ts +34 -0
  387. package/dist/host/cookie-handler.d.ts.map +1 -0
  388. package/dist/host/cookie-handler.js +124 -0
  389. package/dist/host/cookie-handler.js.map +1 -0
  390. package/dist/host/errors.d.ts +56 -0
  391. package/dist/host/errors.d.ts.map +1 -0
  392. package/dist/host/errors.js +79 -0
  393. package/dist/host/errors.js.map +1 -0
  394. package/dist/host/index.d.ts +29 -0
  395. package/dist/host/index.d.ts.map +1 -0
  396. package/dist/host/index.js +32 -0
  397. package/dist/host/index.js.map +1 -0
  398. package/dist/host/pattern-matcher.d.ts +36 -0
  399. package/dist/host/pattern-matcher.d.ts.map +1 -0
  400. package/dist/host/pattern-matcher.js +172 -0
  401. package/dist/host/pattern-matcher.js.map +1 -0
  402. package/dist/host/router.d.ts +26 -0
  403. package/dist/host/router.d.ts.map +1 -0
  404. package/dist/host/router.js +218 -0
  405. package/dist/host/router.js.map +1 -0
  406. package/dist/host/testing.d.ts +36 -0
  407. package/dist/host/testing.d.ts.map +1 -0
  408. package/dist/host/testing.js +55 -0
  409. package/dist/host/testing.js.map +1 -0
  410. package/dist/host/types.d.ts +115 -0
  411. package/dist/host/types.d.ts.map +1 -0
  412. package/dist/host/types.js +7 -0
  413. package/dist/host/types.js.map +1 -0
  414. package/dist/host/utils.d.ts +21 -0
  415. package/dist/host/utils.d.ts.map +1 -0
  416. package/dist/host/utils.js +23 -0
  417. package/dist/host/utils.js.map +1 -0
  418. package/dist/href-client.d.ts +131 -0
  419. package/dist/href-client.d.ts.map +1 -0
  420. package/dist/href-client.js +64 -0
  421. package/dist/href-client.js.map +1 -0
  422. package/dist/href-context.d.ts +29 -0
  423. package/dist/href-context.d.ts.map +1 -0
  424. package/dist/href-context.js +21 -0
  425. package/dist/href-context.js.map +1 -0
  426. package/dist/index.d.ts +73 -0
  427. package/dist/index.d.ts.map +1 -0
  428. package/dist/index.js +91 -0
  429. package/dist/index.js.map +1 -0
  430. package/dist/index.rsc.d.ts +32 -0
  431. package/dist/index.rsc.d.ts.map +1 -0
  432. package/dist/index.rsc.js +40 -0
  433. package/dist/index.rsc.js.map +1 -0
  434. package/dist/internal-debug.d.ts +2 -0
  435. package/dist/internal-debug.d.ts.map +1 -0
  436. package/dist/internal-debug.js +5 -0
  437. package/dist/internal-debug.js.map +1 -0
  438. package/dist/loader.d.ts +14 -0
  439. package/dist/loader.d.ts.map +1 -0
  440. package/dist/loader.js +20 -0
  441. package/dist/loader.js.map +1 -0
  442. package/dist/loader.rsc.d.ts +19 -0
  443. package/dist/loader.rsc.d.ts.map +1 -0
  444. package/dist/loader.rsc.js +99 -0
  445. package/dist/loader.rsc.js.map +1 -0
  446. package/dist/network-error-thrower.d.ts +17 -0
  447. package/dist/network-error-thrower.d.ts.map +1 -0
  448. package/dist/network-error-thrower.js +14 -0
  449. package/dist/network-error-thrower.js.map +1 -0
  450. package/dist/outlet-context.d.ts +13 -0
  451. package/dist/outlet-context.d.ts.map +1 -0
  452. package/dist/outlet-context.js +3 -0
  453. package/dist/outlet-context.js.map +1 -0
  454. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  456. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  457. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  458. package/dist/prerender/param-hash.d.ts +16 -0
  459. package/dist/prerender/param-hash.d.ts.map +1 -0
  460. package/dist/prerender/param-hash.js +36 -0
  461. package/dist/prerender/param-hash.js.map +1 -0
  462. package/dist/prerender/store.d.ts +38 -0
  463. package/dist/prerender/store.d.ts.map +1 -0
  464. package/dist/prerender/store.js +61 -0
  465. package/dist/prerender/store.js.map +1 -0
  466. package/dist/prerender.d.ts +66 -0
  467. package/dist/prerender.d.ts.map +1 -0
  468. package/dist/prerender.js +57 -0
  469. package/dist/prerender.js.map +1 -0
  470. package/dist/reverse.d.ts +196 -0
  471. package/dist/reverse.d.ts.map +1 -0
  472. package/dist/reverse.js +78 -0
  473. package/dist/reverse.js.map +1 -0
  474. package/dist/root-error-boundary.d.ts +33 -0
  475. package/dist/root-error-boundary.d.ts.map +1 -0
  476. package/dist/root-error-boundary.js +165 -0
  477. package/dist/root-error-boundary.js.map +1 -0
  478. package/dist/route-content-wrapper.d.ts +46 -0
  479. package/dist/route-content-wrapper.d.ts.map +1 -0
  480. package/dist/route-content-wrapper.js +77 -0
  481. package/dist/route-content-wrapper.js.map +1 -0
  482. package/dist/route-definition.d.ts +421 -0
  483. package/dist/route-definition.d.ts.map +1 -0
  484. package/dist/route-definition.js +868 -0
  485. package/dist/route-definition.js.map +1 -0
  486. package/dist/route-map-builder.d.ts +155 -0
  487. package/dist/route-map-builder.d.ts.map +1 -0
  488. package/dist/route-map-builder.js +237 -0
  489. package/dist/route-map-builder.js.map +1 -0
  490. package/dist/route-types.d.ts +165 -0
  491. package/dist/route-types.d.ts.map +1 -0
  492. package/dist/route-types.js +7 -0
  493. package/dist/route-types.js.map +1 -0
  494. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  496. package/dist/router/__tests__/handler-context.test.js +65 -0
  497. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  498. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  502. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  503. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  504. package/dist/router/__tests__/match-context.test.js +92 -0
  505. package/dist/router/__tests__/match-context.test.js.map +1 -0
  506. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  508. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  509. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  510. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  511. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  512. package/dist/router/__tests__/match-result.test.js +457 -0
  513. package/dist/router/__tests__/match-result.test.js.map +1 -0
  514. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  515. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  516. package/dist/router/__tests__/on-error.test.js +678 -0
  517. package/dist/router/__tests__/on-error.test.js.map +1 -0
  518. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  520. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  521. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  522. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  526. package/dist/router/error-handling.d.ts +77 -0
  527. package/dist/router/error-handling.d.ts.map +1 -0
  528. package/dist/router/error-handling.js +202 -0
  529. package/dist/router/error-handling.js.map +1 -0
  530. package/dist/router/handler-context.d.ts +20 -0
  531. package/dist/router/handler-context.d.ts.map +1 -0
  532. package/dist/router/handler-context.js +198 -0
  533. package/dist/router/handler-context.js.map +1 -0
  534. package/dist/router/intercept-resolution.d.ts +66 -0
  535. package/dist/router/intercept-resolution.d.ts.map +1 -0
  536. package/dist/router/intercept-resolution.js +246 -0
  537. package/dist/router/intercept-resolution.js.map +1 -0
  538. package/dist/router/loader-resolution.d.ts +64 -0
  539. package/dist/router/loader-resolution.d.ts.map +1 -0
  540. package/dist/router/loader-resolution.js +284 -0
  541. package/dist/router/loader-resolution.js.map +1 -0
  542. package/dist/router/logging.d.ts +15 -0
  543. package/dist/router/logging.d.ts.map +1 -0
  544. package/dist/router/logging.js +99 -0
  545. package/dist/router/logging.js.map +1 -0
  546. package/dist/router/manifest.d.ts +22 -0
  547. package/dist/router/manifest.d.ts.map +1 -0
  548. package/dist/router/manifest.js +181 -0
  549. package/dist/router/manifest.js.map +1 -0
  550. package/dist/router/match-api.d.ts +35 -0
  551. package/dist/router/match-api.d.ts.map +1 -0
  552. package/dist/router/match-api.js +406 -0
  553. package/dist/router/match-api.js.map +1 -0
  554. package/dist/router/match-context.d.ts +206 -0
  555. package/dist/router/match-context.d.ts.map +1 -0
  556. package/dist/router/match-context.js +17 -0
  557. package/dist/router/match-context.js.map +1 -0
  558. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  560. package/dist/router/match-middleware/background-revalidation.js +75 -0
  561. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  562. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  564. package/dist/router/match-middleware/cache-lookup.js +257 -0
  565. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  566. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  567. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  568. package/dist/router/match-middleware/cache-store.js +108 -0
  569. package/dist/router/match-middleware/cache-store.js.map +1 -0
  570. package/dist/router/match-middleware/index.d.ts +81 -0
  571. package/dist/router/match-middleware/index.d.ts.map +1 -0
  572. package/dist/router/match-middleware/index.js +80 -0
  573. package/dist/router/match-middleware/index.js.map +1 -0
  574. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  576. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  577. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  578. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  580. package/dist/router/match-middleware/segment-resolution.js +53 -0
  581. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  582. package/dist/router/match-pipelines.d.ts +147 -0
  583. package/dist/router/match-pipelines.d.ts.map +1 -0
  584. package/dist/router/match-pipelines.js +82 -0
  585. package/dist/router/match-pipelines.js.map +1 -0
  586. package/dist/router/match-result.d.ts +126 -0
  587. package/dist/router/match-result.d.ts.map +1 -0
  588. package/dist/router/match-result.js +93 -0
  589. package/dist/router/match-result.js.map +1 -0
  590. package/dist/router/metrics.d.ts +20 -0
  591. package/dist/router/metrics.d.ts.map +1 -0
  592. package/dist/router/metrics.js +47 -0
  593. package/dist/router/metrics.js.map +1 -0
  594. package/dist/router/middleware.d.ts +249 -0
  595. package/dist/router/middleware.d.ts.map +1 -0
  596. package/dist/router/middleware.js +434 -0
  597. package/dist/router/middleware.js.map +1 -0
  598. package/dist/router/middleware.test.d.ts +2 -0
  599. package/dist/router/middleware.test.d.ts.map +1 -0
  600. package/dist/router/middleware.test.js +816 -0
  601. package/dist/router/middleware.test.js.map +1 -0
  602. package/dist/router/pattern-matching.d.ts +149 -0
  603. package/dist/router/pattern-matching.d.ts.map +1 -0
  604. package/dist/router/pattern-matching.js +349 -0
  605. package/dist/router/pattern-matching.js.map +1 -0
  606. package/dist/router/revalidation.d.ts +44 -0
  607. package/dist/router/revalidation.d.ts.map +1 -0
  608. package/dist/router/revalidation.js +147 -0
  609. package/dist/router/revalidation.js.map +1 -0
  610. package/dist/router/router-context.d.ts +135 -0
  611. package/dist/router/router-context.d.ts.map +1 -0
  612. package/dist/router/router-context.js +36 -0
  613. package/dist/router/router-context.js.map +1 -0
  614. package/dist/router/segment-resolution.d.ts +127 -0
  615. package/dist/router/segment-resolution.d.ts.map +1 -0
  616. package/dist/router/segment-resolution.js +919 -0
  617. package/dist/router/segment-resolution.js.map +1 -0
  618. package/dist/router/trie-matching.d.ts +40 -0
  619. package/dist/router/trie-matching.d.ts.map +1 -0
  620. package/dist/router/trie-matching.js +127 -0
  621. package/dist/router/trie-matching.js.map +1 -0
  622. package/dist/router/types.d.ts +136 -0
  623. package/dist/router/types.d.ts.map +1 -0
  624. package/dist/router/types.js +7 -0
  625. package/dist/router/types.js.map +1 -0
  626. package/dist/router.d.ts +753 -0
  627. package/dist/router.d.ts.map +1 -0
  628. package/dist/router.gen.d.ts +6 -0
  629. package/dist/router.gen.d.ts.map +1 -0
  630. package/dist/router.gen.js +6 -0
  631. package/dist/router.gen.js.map +1 -0
  632. package/dist/router.js +1304 -0
  633. package/dist/router.js.map +1 -0
  634. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  636. package/dist/rsc/__tests__/helpers.test.js +140 -0
  637. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  638. package/dist/rsc/handler.d.ts +45 -0
  639. package/dist/rsc/handler.d.ts.map +1 -0
  640. package/dist/rsc/handler.js +1172 -0
  641. package/dist/rsc/handler.js.map +1 -0
  642. package/dist/rsc/helpers.d.ts +16 -0
  643. package/dist/rsc/helpers.d.ts.map +1 -0
  644. package/dist/rsc/helpers.js +55 -0
  645. package/dist/rsc/helpers.js.map +1 -0
  646. package/dist/rsc/index.d.ts +22 -0
  647. package/dist/rsc/index.d.ts.map +1 -0
  648. package/dist/rsc/index.js +23 -0
  649. package/dist/rsc/index.js.map +1 -0
  650. package/dist/rsc/nonce.d.ts +9 -0
  651. package/dist/rsc/nonce.d.ts.map +1 -0
  652. package/dist/rsc/nonce.js +18 -0
  653. package/dist/rsc/nonce.js.map +1 -0
  654. package/dist/rsc/types.d.ts +206 -0
  655. package/dist/rsc/types.d.ts.map +1 -0
  656. package/dist/rsc/types.js +8 -0
  657. package/dist/rsc/types.js.map +1 -0
  658. package/dist/search-params.d.ts +103 -0
  659. package/dist/search-params.d.ts.map +1 -0
  660. package/dist/search-params.js +74 -0
  661. package/dist/search-params.js.map +1 -0
  662. package/dist/segment-system.d.ts +75 -0
  663. package/dist/segment-system.d.ts.map +1 -0
  664. package/dist/segment-system.js +336 -0
  665. package/dist/segment-system.js.map +1 -0
  666. package/dist/server/context.d.ts +245 -0
  667. package/dist/server/context.d.ts.map +1 -0
  668. package/dist/server/context.js +197 -0
  669. package/dist/server/context.js.map +1 -0
  670. package/dist/server/fetchable-loader-store.d.ts +18 -0
  671. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  672. package/dist/server/fetchable-loader-store.js +18 -0
  673. package/dist/server/fetchable-loader-store.js.map +1 -0
  674. package/dist/server/handle-store.d.ts +85 -0
  675. package/dist/server/handle-store.d.ts.map +1 -0
  676. package/dist/server/handle-store.js +142 -0
  677. package/dist/server/handle-store.js.map +1 -0
  678. package/dist/server/loader-registry.d.ts +55 -0
  679. package/dist/server/loader-registry.d.ts.map +1 -0
  680. package/dist/server/loader-registry.js +132 -0
  681. package/dist/server/loader-registry.js.map +1 -0
  682. package/dist/server/request-context.d.ts +226 -0
  683. package/dist/server/request-context.d.ts.map +1 -0
  684. package/dist/server/request-context.js +290 -0
  685. package/dist/server/request-context.js.map +1 -0
  686. package/dist/server/root-layout.d.ts +4 -0
  687. package/dist/server/root-layout.d.ts.map +1 -0
  688. package/dist/server/root-layout.js +5 -0
  689. package/dist/server/root-layout.js.map +1 -0
  690. package/dist/server.d.ts +15 -0
  691. package/dist/server.d.ts.map +1 -0
  692. package/dist/server.js +20 -0
  693. package/dist/server.js.map +1 -0
  694. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  698. package/dist/ssr/index.d.ts +98 -0
  699. package/dist/ssr/index.d.ts.map +1 -0
  700. package/dist/ssr/index.js +158 -0
  701. package/dist/ssr/index.js.map +1 -0
  702. package/dist/static-handler.d.ts +50 -0
  703. package/dist/static-handler.d.ts.map +1 -0
  704. package/dist/static-handler.gen.d.ts +5 -0
  705. package/dist/static-handler.gen.d.ts.map +1 -0
  706. package/dist/static-handler.gen.js +5 -0
  707. package/dist/static-handler.gen.js.map +1 -0
  708. package/dist/static-handler.js +29 -0
  709. package/dist/static-handler.js.map +1 -0
  710. package/dist/testing/vitest.js +48 -0
  711. package/dist/theme/ThemeProvider.d.ts +20 -0
  712. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  713. package/dist/theme/ThemeProvider.js +240 -0
  714. package/dist/theme/ThemeProvider.js.map +1 -0
  715. package/dist/theme/ThemeScript.d.ts +48 -0
  716. package/dist/theme/ThemeScript.d.ts.map +1 -0
  717. package/dist/theme/ThemeScript.js +13 -0
  718. package/dist/theme/ThemeScript.js.map +1 -0
  719. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  720. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  721. package/dist/theme/__tests__/theme.test.js +103 -0
  722. package/dist/theme/__tests__/theme.test.js.map +1 -0
  723. package/dist/theme/constants.d.ts +29 -0
  724. package/dist/theme/constants.d.ts.map +1 -0
  725. package/dist/theme/constants.js +48 -0
  726. package/dist/theme/constants.js.map +1 -0
  727. package/dist/theme/index.d.ts +31 -0
  728. package/dist/theme/index.d.ts.map +1 -0
  729. package/dist/theme/index.js +36 -0
  730. package/dist/theme/index.js.map +1 -0
  731. package/dist/theme/theme-context.d.ts +40 -0
  732. package/dist/theme/theme-context.d.ts.map +1 -0
  733. package/dist/theme/theme-context.js +60 -0
  734. package/dist/theme/theme-context.js.map +1 -0
  735. package/dist/theme/theme-script.d.ts +27 -0
  736. package/dist/theme/theme-script.d.ts.map +1 -0
  737. package/dist/theme/theme-script.js +147 -0
  738. package/dist/theme/theme-script.js.map +1 -0
  739. package/dist/theme/types.d.ts +163 -0
  740. package/dist/theme/types.d.ts.map +1 -0
  741. package/dist/theme/types.js +11 -0
  742. package/dist/theme/types.js.map +1 -0
  743. package/dist/theme/use-theme.d.ts +12 -0
  744. package/dist/theme/use-theme.d.ts.map +1 -0
  745. package/dist/theme/use-theme.js +40 -0
  746. package/dist/theme/use-theme.js.map +1 -0
  747. package/dist/types.d.ts +1479 -0
  748. package/dist/types.d.ts.map +1 -0
  749. package/dist/types.js +10 -0
  750. package/dist/types.js.map +1 -0
  751. package/dist/urls.d.ts +441 -0
  752. package/dist/urls.d.ts.map +1 -0
  753. package/dist/urls.gen.d.ts +8 -0
  754. package/dist/urls.gen.d.ts.map +1 -0
  755. package/dist/urls.gen.js +8 -0
  756. package/dist/urls.gen.js.map +1 -0
  757. package/dist/urls.js +443 -0
  758. package/dist/urls.js.map +1 -0
  759. package/dist/use-loader.d.ts +127 -0
  760. package/dist/use-loader.d.ts.map +1 -0
  761. package/dist/use-loader.js +237 -0
  762. package/dist/use-loader.js.map +1 -0
  763. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  767. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  771. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  775. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  777. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  779. package/dist/vite/ast-handler-extract.d.ts +49 -0
  780. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  781. package/dist/vite/ast-handler-extract.js +249 -0
  782. package/dist/vite/ast-handler-extract.js.map +1 -0
  783. package/dist/vite/expose-action-id.d.ts +19 -0
  784. package/dist/vite/expose-action-id.d.ts.map +1 -0
  785. package/dist/vite/expose-action-id.js +250 -0
  786. package/dist/vite/expose-action-id.js.map +1 -0
  787. package/dist/vite/expose-id-utils.d.ts +69 -0
  788. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  789. package/dist/vite/expose-id-utils.js +289 -0
  790. package/dist/vite/expose-id-utils.js.map +1 -0
  791. package/dist/vite/expose-internal-ids.d.ts +22 -0
  792. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  793. package/dist/vite/expose-internal-ids.js +886 -0
  794. package/dist/vite/expose-internal-ids.js.map +1 -0
  795. package/dist/vite/index.d.ts +149 -0
  796. package/dist/vite/index.d.ts.map +1 -0
  797. package/dist/vite/index.js +2309 -833
  798. package/dist/vite/index.js.bak +5448 -0
  799. package/dist/vite/index.js.map +1 -0
  800. package/dist/vite/index.named-routes.gen.ts +103 -0
  801. package/dist/vite/package-resolution.d.ts +43 -0
  802. package/dist/vite/package-resolution.d.ts.map +1 -0
  803. package/dist/vite/package-resolution.js +112 -0
  804. package/dist/vite/package-resolution.js.map +1 -0
  805. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  806. package/dist/vite/virtual-entries.d.ts +25 -0
  807. package/dist/vite/virtual-entries.d.ts.map +1 -0
  808. package/dist/vite/virtual-entries.js +110 -0
  809. package/dist/vite/virtual-entries.js.map +1 -0
  810. package/package.json +57 -11
  811. package/skills/breadcrumbs/SKILL.md +3 -1
  812. package/skills/bundle-analysis/SKILL.md +159 -0
  813. package/skills/cache-guide/SKILL.md +220 -30
  814. package/skills/caching/SKILL.md +116 -8
  815. package/skills/composability/SKILL.md +27 -2
  816. package/skills/document-cache/SKILL.md +78 -55
  817. package/skills/handler-use/SKILL.md +364 -0
  818. package/skills/hooks/SKILL.md +229 -20
  819. package/skills/host-router/SKILL.md +45 -20
  820. package/skills/i18n/SKILL.md +276 -0
  821. package/skills/intercept/SKILL.md +46 -4
  822. package/skills/layout/SKILL.md +28 -7
  823. package/skills/links/SKILL.md +247 -17
  824. package/skills/loader/SKILL.md +219 -9
  825. package/skills/middleware/SKILL.md +47 -12
  826. package/skills/migrate-nextjs/SKILL.md +562 -0
  827. package/skills/migrate-react-router/SKILL.md +769 -0
  828. package/skills/mime-routes/SKILL.md +27 -0
  829. package/skills/observability/SKILL.md +137 -0
  830. package/skills/parallel/SKILL.md +71 -6
  831. package/skills/prerender/SKILL.md +14 -33
  832. package/skills/rango/SKILL.md +242 -22
  833. package/skills/react-compiler/SKILL.md +168 -0
  834. package/skills/response-routes/SKILL.md +66 -9
  835. package/skills/route/SKILL.md +57 -4
  836. package/skills/router-setup/SKILL.md +3 -3
  837. package/skills/server-actions/SKILL.md +751 -0
  838. package/skills/streams-and-websockets/SKILL.md +283 -0
  839. package/skills/testing/SKILL.md +599 -0
  840. package/skills/typesafety/SKILL.md +319 -27
  841. package/skills/use-cache/SKILL.md +34 -5
  842. package/skills/view-transitions/SKILL.md +294 -0
  843. package/src/__augment-tests__/augment.ts +81 -0
  844. package/src/__augment-tests__/augmented.check.ts +117 -0
  845. package/src/browser/action-coordinator.ts +53 -36
  846. package/src/browser/app-shell.ts +52 -0
  847. package/src/browser/event-controller.ts +86 -70
  848. package/src/browser/history-state.ts +21 -0
  849. package/src/browser/index.ts +3 -3
  850. package/src/browser/navigation-bridge.ts +86 -11
  851. package/src/browser/navigation-client.ts +76 -28
  852. package/src/browser/navigation-store.ts +32 -9
  853. package/src/browser/navigation-transaction.ts +10 -28
  854. package/src/browser/partial-update.ts +64 -26
  855. package/src/browser/prefetch/cache.ts +129 -21
  856. package/src/browser/prefetch/fetch.ts +148 -16
  857. package/src/browser/prefetch/queue.ts +36 -5
  858. package/src/browser/rango-state.ts +53 -13
  859. package/src/browser/react/Link.tsx +30 -2
  860. package/src/browser/react/NavigationProvider.tsx +72 -31
  861. package/src/browser/react/filter-segment-order.ts +51 -7
  862. package/src/browser/react/index.ts +3 -0
  863. package/src/browser/react/location-state-shared.ts +175 -4
  864. package/src/browser/react/location-state.ts +39 -13
  865. package/src/browser/react/use-handle.ts +17 -9
  866. package/src/browser/react/use-navigation.ts +22 -2
  867. package/src/browser/react/use-params.ts +20 -8
  868. package/src/browser/react/use-reverse.ts +106 -0
  869. package/src/browser/react/use-router.ts +22 -2
  870. package/src/browser/react/use-segments.ts +11 -8
  871. package/src/browser/response-adapter.ts +25 -0
  872. package/src/browser/rsc-router.tsx +64 -22
  873. package/src/browser/scroll-restoration.ts +22 -14
  874. package/src/browser/segment-reconciler.ts +36 -14
  875. package/src/browser/segment-structure-assert.ts +2 -2
  876. package/src/browser/server-action-bridge.ts +23 -30
  877. package/src/browser/types.ts +21 -0
  878. package/src/build/collect-fallback-refs.ts +107 -0
  879. package/src/build/generate-manifest.ts +60 -35
  880. package/src/build/generate-route-types.ts +2 -0
  881. package/src/build/index.ts +2 -0
  882. package/src/build/route-trie.ts +52 -25
  883. package/src/build/route-types/codegen.ts +4 -4
  884. package/src/build/route-types/include-resolution.ts +1 -1
  885. package/src/build/route-types/per-module-writer.ts +7 -4
  886. package/src/build/route-types/router-processing.ts +55 -14
  887. package/src/build/route-types/scan-filter.ts +1 -1
  888. package/src/build/route-types/source-scan.ts +118 -0
  889. package/src/build/runtime-discovery.ts +9 -20
  890. package/src/cache/cache-scope.ts +28 -42
  891. package/src/cache/cf/cf-cache-store.ts +54 -13
  892. package/src/client.rsc.tsx +3 -0
  893. package/src/client.tsx +92 -182
  894. package/src/context-var.ts +5 -5
  895. package/src/decode-loader-results.ts +36 -0
  896. package/src/errors.ts +30 -1
  897. package/src/handle.ts +26 -13
  898. package/src/host/index.ts +2 -2
  899. package/src/host/router.ts +129 -57
  900. package/src/host/types.ts +31 -2
  901. package/src/host/utils.ts +1 -1
  902. package/src/href-client.ts +140 -20
  903. package/src/index.rsc.ts +9 -4
  904. package/src/index.ts +57 -15
  905. package/src/loader-store.ts +500 -0
  906. package/src/loader.rsc.ts +2 -5
  907. package/src/loader.ts +3 -10
  908. package/src/missing-id-error.ts +68 -0
  909. package/src/outlet-context.ts +1 -1
  910. package/src/prerender.ts +4 -4
  911. package/src/response-utils.ts +37 -0
  912. package/src/reverse.ts +65 -36
  913. package/src/route-content-wrapper.tsx +6 -28
  914. package/src/route-definition/dsl-helpers.ts +384 -257
  915. package/src/route-definition/helper-factories.ts +29 -139
  916. package/src/route-definition/helpers-types.ts +100 -28
  917. package/src/route-definition/resolve-handler-use.ts +6 -0
  918. package/src/route-definition/use-item-types.ts +32 -0
  919. package/src/route-types.ts +26 -41
  920. package/src/router/basename.ts +14 -0
  921. package/src/router/content-negotiation.ts +15 -2
  922. package/src/router/error-handling.ts +1 -1
  923. package/src/router/handler-context.ts +21 -38
  924. package/src/router/intercept-resolution.ts +4 -18
  925. package/src/router/lazy-includes.ts +8 -8
  926. package/src/router/loader-resolution.ts +89 -49
  927. package/src/router/manifest.ts +22 -13
  928. package/src/router/match-api.ts +4 -3
  929. package/src/router/match-handlers.ts +63 -20
  930. package/src/router/match-middleware/cache-lookup.ts +54 -96
  931. package/src/router/match-middleware/cache-store.ts +3 -2
  932. package/src/router/match-middleware/segment-resolution.ts +1 -1
  933. package/src/router/match-result.ts +103 -4
  934. package/src/router/metrics.ts +1 -1
  935. package/src/router/middleware-types.ts +15 -26
  936. package/src/router/middleware.ts +99 -84
  937. package/src/router/pattern-matching.ts +101 -17
  938. package/src/router/prerender-match.ts +1 -1
  939. package/src/router/preview-match.ts +3 -1
  940. package/src/router/request-classification.ts +4 -28
  941. package/src/router/revalidation.ts +58 -2
  942. package/src/router/router-interfaces.ts +45 -28
  943. package/src/router/router-options.ts +40 -1
  944. package/src/router/router-registry.ts +2 -5
  945. package/src/router/segment-resolution/fresh.ts +32 -6
  946. package/src/router/segment-resolution/revalidation.ts +154 -107
  947. package/src/router/segment-resolution/view-transition-default.ts +36 -0
  948. package/src/router/substitute-pattern-params.ts +56 -0
  949. package/src/router/telemetry.ts +99 -0
  950. package/src/router/trie-matching.ts +18 -13
  951. package/src/router/types.ts +8 -0
  952. package/src/router/url-params.ts +49 -0
  953. package/src/router.ts +38 -23
  954. package/src/rsc/handler-context.ts +2 -2
  955. package/src/rsc/handler.ts +41 -74
  956. package/src/rsc/helpers.ts +91 -43
  957. package/src/rsc/index.ts +1 -1
  958. package/src/rsc/loader-fetch.ts +23 -3
  959. package/src/rsc/origin-guard.ts +28 -10
  960. package/src/rsc/progressive-enhancement.ts +14 -2
  961. package/src/rsc/response-route-handler.ts +46 -53
  962. package/src/rsc/rsc-rendering.ts +40 -52
  963. package/src/rsc/runtime-warnings.ts +9 -10
  964. package/src/rsc/server-action.ts +23 -37
  965. package/src/rsc/ssr-setup.ts +16 -0
  966. package/src/rsc/types.ts +9 -2
  967. package/src/search-params.ts +4 -4
  968. package/src/segment-content-promise.ts +67 -0
  969. package/src/segment-loader-promise.ts +122 -0
  970. package/src/segment-system.tsx +132 -116
  971. package/src/serialize.ts +243 -0
  972. package/src/server/context.ts +143 -53
  973. package/src/server/cookie-store.ts +28 -4
  974. package/src/server/handle-store.ts +19 -0
  975. package/src/server/request-context.ts +50 -44
  976. package/src/ssr/index.tsx +5 -1
  977. package/src/static-handler.ts +1 -1
  978. package/src/testing/cache-status.ts +166 -0
  979. package/src/testing/collect-handle.ts +63 -0
  980. package/src/testing/dispatch.ts +440 -0
  981. package/src/testing/dom.entry.ts +22 -0
  982. package/src/testing/e2e/fixture.ts +154 -0
  983. package/src/testing/e2e/index.ts +149 -0
  984. package/src/testing/e2e/matchers.ts +51 -0
  985. package/src/testing/e2e/page-helpers.ts +272 -0
  986. package/src/testing/e2e/parity.ts +306 -0
  987. package/src/testing/e2e/server.ts +183 -0
  988. package/src/testing/flight-matchers.ts +104 -0
  989. package/src/testing/flight-runtime.d.ts +21 -0
  990. package/src/testing/flight.entry.ts +22 -0
  991. package/src/testing/flight.ts +182 -0
  992. package/src/testing/generated-routes.ts +223 -0
  993. package/src/testing/index.ts +105 -0
  994. package/src/testing/internal/context.ts +193 -0
  995. package/src/testing/render-route.tsx +536 -0
  996. package/src/testing/run-loader.ts +296 -0
  997. package/src/testing/run-middleware.ts +170 -0
  998. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  999. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  1000. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  1001. package/src/testing/vitest-stubs/version.ts +5 -0
  1002. package/src/testing/vitest.ts +183 -0
  1003. package/src/types/global-namespace.ts +39 -26
  1004. package/src/types/handler-context.ts +68 -50
  1005. package/src/types/index.ts +1 -0
  1006. package/src/types/loader-types.ts +5 -6
  1007. package/src/types/request-scope.ts +126 -0
  1008. package/src/types/route-entry.ts +11 -0
  1009. package/src/types/segments.ts +36 -2
  1010. package/src/urls/include-helper.ts +34 -67
  1011. package/src/urls/index.ts +0 -3
  1012. package/src/urls/path-helper-types.ts +41 -7
  1013. package/src/urls/path-helper.ts +17 -52
  1014. package/src/urls/pattern-types.ts +36 -19
  1015. package/src/urls/response-types.ts +22 -29
  1016. package/src/urls/type-extraction.ts +26 -116
  1017. package/src/urls/urls-function.ts +1 -5
  1018. package/src/use-loader.tsx +416 -42
  1019. package/src/vite/debug.ts +185 -0
  1020. package/src/vite/discovery/bundle-postprocess.ts +6 -6
  1021. package/src/vite/discovery/discover-routers.ts +101 -51
  1022. package/src/vite/discovery/discovery-errors.ts +194 -0
  1023. package/src/vite/discovery/gate-state.ts +171 -0
  1024. package/src/vite/discovery/prerender-collection.ts +185 -103
  1025. package/src/vite/discovery/route-types-writer.ts +40 -84
  1026. package/src/vite/discovery/self-gen-tracking.ts +27 -1
  1027. package/src/vite/discovery/state.ts +33 -0
  1028. package/src/vite/discovery/virtual-module-codegen.ts +13 -23
  1029. package/src/vite/index.ts +2 -0
  1030. package/src/vite/plugin-types.ts +67 -0
  1031. package/src/vite/plugins/cjs-to-esm.ts +8 -7
  1032. package/src/vite/plugins/client-ref-dedup.ts +16 -0
  1033. package/src/vite/plugins/client-ref-hashing.ts +28 -5
  1034. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1035. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1036. package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
  1037. package/src/vite/plugins/expose-action-id.ts +54 -30
  1038. package/src/vite/plugins/expose-id-utils.ts +24 -8
  1039. package/src/vite/plugins/expose-ids/export-analysis.ts +100 -20
  1040. package/src/vite/plugins/expose-ids/handler-transform.ts +12 -35
  1041. package/src/vite/plugins/expose-ids/loader-transform.ts +3 -5
  1042. package/src/vite/plugins/expose-ids/router-transform.ts +20 -3
  1043. package/src/vite/plugins/expose-internal-ids.ts +544 -317
  1044. package/src/vite/plugins/performance-tracks.ts +29 -25
  1045. package/src/vite/plugins/use-cache-transform.ts +65 -50
  1046. package/src/vite/plugins/version-injector.ts +39 -23
  1047. package/src/vite/plugins/version-plugin.ts +59 -2
  1048. package/src/vite/plugins/virtual-entries.ts +2 -2
  1049. package/src/vite/rango.ts +116 -29
  1050. package/src/vite/router-discovery.ts +774 -102
  1051. package/src/vite/utils/ast-handler-extract.ts +15 -15
  1052. package/src/vite/utils/banner.ts +1 -1
  1053. package/src/vite/utils/bundle-analysis.ts +4 -2
  1054. package/src/vite/utils/client-chunks.ts +190 -0
  1055. package/src/vite/utils/forward-user-plugins.ts +193 -0
  1056. package/src/vite/utils/manifest-utils.ts +21 -5
  1057. package/src/vite/utils/package-resolution.ts +41 -1
  1058. package/src/vite/utils/prerender-utils.ts +21 -6
  1059. package/src/vite/utils/shared-utils.ts +107 -26
  1060. package/src/browser/action-response-classifier.ts +0 -99
package/src/index.ts CHANGED
@@ -18,6 +18,7 @@ export {
18
18
  MiddlewareError,
19
19
  HandlerError,
20
20
  BuildError,
21
+ DslContextError,
21
22
  InvalidHandlerError,
22
23
  RouterError,
23
24
  Skip,
@@ -43,6 +44,7 @@ export type {
43
44
  // Revalidation types
44
45
  RevalidateParams,
45
46
  Revalidate,
47
+ ActionRef,
46
48
  RouteKeys,
47
49
  // Loader types
48
50
  LoaderDefinition,
@@ -147,24 +149,52 @@ export { createVar, type ContextVar } from "./context-var.js";
147
149
  export { nonce } from "./rsc/nonce.js";
148
150
 
149
151
  /**
150
- * Error-throwing stub for server-only `Prerender` function.
152
+ * SSR/client stub for server-only `Prerender` function.
153
+ *
154
+ * Returns a lightweight stub object instead of throwing so that the
155
+ * production SSR build can safely bundle the RSC entry chunk — the SSR
156
+ * bundler resolves `@rangojs/router` to this (SSR) entry, so Prerender
157
+ * calls in RSC code must not crash at module-evaluation time.
151
158
  */
152
- export function Prerender(): never {
153
- throw serverOnlyStubError("Prerender");
159
+ export function Prerender(
160
+ _handler?: any,
161
+ _optionsOrId?: any,
162
+ __injectedId?: string,
163
+ ): any {
164
+ const id =
165
+ typeof _optionsOrId === "string" ? _optionsOrId : __injectedId || "";
166
+ return { __brand: "prerenderHandler" as const, $$id: id };
154
167
  }
155
168
 
156
169
  /**
157
- * Error-throwing stub for server-only `Passthrough` function.
170
+ * SSR/client stub for server-only `Passthrough` function.
158
171
  */
159
- export function Passthrough(): never {
160
- throw serverOnlyStubError("Passthrough");
172
+ export function Passthrough(
173
+ _handler?: any,
174
+ _optionsOrId?: any,
175
+ __injectedId?: string,
176
+ ): any {
177
+ const id =
178
+ typeof _optionsOrId === "string" ? _optionsOrId : __injectedId || "";
179
+ return { __brand: "passthroughHandler" as const, $$id: id };
161
180
  }
162
181
 
163
182
  /**
164
- * Error-throwing stub for server-only `Static` function.
183
+ * SSR/client stub for server-only `Static` function.
184
+ *
185
+ * Returns a lightweight stub object instead of throwing so that the
186
+ * production SSR build can safely bundle the RSC entry chunk — the SSR
187
+ * bundler resolves `@rangojs/router` to this (SSR) entry, so Static
188
+ * calls in RSC code must not crash at module-evaluation time.
165
189
  */
166
- export function Static(): never {
167
- throw serverOnlyStubError("Static");
190
+ export function Static(
191
+ _handler?: any,
192
+ _optionsOrId?: any,
193
+ __injectedId?: string,
194
+ ): any {
195
+ const id =
196
+ typeof _optionsOrId === "string" ? _optionsOrId : __injectedId || "";
197
+ return { __brand: "staticHandler" as const, $$id: id };
168
198
  }
169
199
 
170
200
  /**
@@ -236,6 +266,9 @@ export function transition(): never {
236
266
  // Request context type (safe for client)
237
267
  export type { PublicRequestContext as RequestContext } from "./server/request-context.js";
238
268
 
269
+ // Shared base for every user-facing request context.
270
+ export type { RequestScope, ExecutionContext } from "./types/request-scope.js";
271
+
239
272
  // Cookie store types (safe for client)
240
273
  export type {
241
274
  CookieStore,
@@ -243,6 +276,10 @@ export type {
243
276
  ReadonlyHeaders,
244
277
  } from "./server/cookie-store.js";
245
278
 
279
+ // Built-in handles (universal — work on both server and client)
280
+ export { Meta } from "./handles/meta.js";
281
+ export { Breadcrumbs } from "./handles/breadcrumbs.js";
282
+
246
283
  // Meta types
247
284
  export type { MetaDescriptor, MetaDescriptorBase } from "./router/types.js";
248
285
 
@@ -267,12 +304,17 @@ export {
267
304
  type LocationStateOptions,
268
305
  } from "./browser/react/location-state-shared.js";
269
306
 
270
- // Path-based response type lookup from RegisteredRoutes
271
- export type { PathResponse } from "./href-client.js";
272
-
273
- // Telemetry sink
274
- export { createConsoleSink } from "./router/telemetry.js";
275
- export { createOTelSink } from "./router/telemetry-otel.js";
307
+ // Path and response types are ambient on the `Rango` namespace (`Rango.Path`,
308
+ // `Rango.PathResponse`, declared in href-client.ts) — no import needed.
309
+
310
+ // Telemetry types only — the createConsoleSink/createOTelSink values are
311
+ // server-only and live in index.rsc.ts (the `react-server` condition of the
312
+ // bare `@rangojs/router` import). Re-exporting them as values from this
313
+ // (default/client) entry would pull telemetry.ts and telemetry-otel.ts into
314
+ // the client module graph; both tree-shake to zero bytes but still appear in
315
+ // bundle analysis output and slow build-time module resolution. Consumers
316
+ // who need the values in non-RSC contexts can import from
317
+ // `@rangojs/router/server`.
276
318
  export type { OTelTracer, OTelSpan } from "./router/telemetry-otel.js";
277
319
  export type { TelemetrySink, TelemetryEvent } from "./router/telemetry.js";
278
320
 
@@ -0,0 +1,500 @@
1
+ /**
2
+ * LoaderStore — shared subscription model for `useLoader` / `useFetchLoader`.
3
+ *
4
+ * Each bucket key gets one entry that holds the latest committed snapshot plus a
5
+ * set of listeners. Snapshots are frozen and replaced atomically on mutation, so
6
+ * subscribers can compare snapshot identity and avoid unnecessary updates
7
+ * between real changes.
8
+ *
9
+ * The bucket key is `loader.$$id` by default, or `loader.$$id + key` when the
10
+ * hook is given an explicit client refresh `key`. Multiple buckets belonging to
11
+ * the same loader form a family (indexed by `loader.$$id`) so a navigation /
12
+ * route-context reset can clear them all at once via `clearFamily`.
13
+ *
14
+ * Mutations that come in for an old request id (e.g. a slow response that
15
+ * resolves after a newer load() was issued, or after a navigation cleared the
16
+ * entry) are silently dropped. `reserveRequestId` is the only way to claim the
17
+ * "latest" slot; `clear` bumps it too so pre-navigation in-flight loads cannot
18
+ * commit into the new route's context.
19
+ *
20
+ * Bucket lifecycle differs by registration:
21
+ * - Sticky buckets (a route-registered reader subscribed at least once) keep
22
+ * their entry after the last subscriber leaves so an in-flight load() can
23
+ * still commit on remount; they reset on navigation via `clearFamily`.
24
+ * - Ephemeral buckets (only ever subscribed by readers with no route context,
25
+ * i.e. keyed `useFetchLoader` of an unregistered loader) have no
26
+ * route-context reset trigger, so they are reference-counted: dropped once
27
+ * the last subscriber unsubscribes. The drop is deferred to a microtask and
28
+ * cancelled on resubscribe so a StrictMode / transition remount does not
29
+ * reclaim a bucket that is about to be reused, and is held until any
30
+ * in-flight load settles.
31
+ *
32
+ * The store is intentionally module-level: each browser tab is its own JS
33
+ * realm, so there is no cross-request pollution. Server renders never mutate
34
+ * the store — the hook falls back to `OutletContext.loaderData`.
35
+ */
36
+
37
+ export interface LoaderEntry<T = unknown> {
38
+ readonly value: T | undefined;
39
+ /**
40
+ * Whether a load has committed a value to this bucket. Distinguishes a
41
+ * committed `null`/`undefined` result from "never loaded", so a loader that
42
+ * resolves to a falsy value is not mistaken for an empty bucket and is not
43
+ * overridden by the server-seeded context value.
44
+ */
45
+ readonly hasValue: boolean;
46
+ readonly error: Error | null;
47
+ readonly isLoading: boolean;
48
+ /** Identifies the request that produced this snapshot. 0 means "no request". */
49
+ readonly requestId: number;
50
+ }
51
+
52
+ const EMPTY_SNAPSHOT: LoaderEntry = Object.freeze({
53
+ value: undefined,
54
+ hasValue: false,
55
+ error: null,
56
+ isLoading: false,
57
+ requestId: 0,
58
+ });
59
+
60
+ /**
61
+ * Options for `subscribe`.
62
+ */
63
+ export interface SubscribeOptions {
64
+ /**
65
+ * Family id (`loader.$$id`) this bucket belongs to. `clearFamily` uses it to
66
+ * reach every keyed bucket of the same loader. Defaults to the bucket key.
67
+ */
68
+ loaderId?: string;
69
+ /**
70
+ * When true, this subscription is from a reader with no route context (keyed
71
+ * `useFetchLoader` of an unregistered loader). Such buckets have no
72
+ * route-context reset trigger and are reference-counted instead. A bucket
73
+ * becomes sticky for the rest of its life as soon as any non-ephemeral
74
+ * subscriber attaches, and from then on resets via `clearFamily`.
75
+ */
76
+ ephemeral?: boolean;
77
+ /**
78
+ * Cross-loader refresh group name(s). Tags this bucket so `refreshGroups(name)`
79
+ * can refresh it alongside buckets of other loaders. A bucket may be tagged
80
+ * with several group names at once (pass an array); it is then refreshed when
81
+ * ANY of its groups is refreshed. Group membership follows subscriber presence:
82
+ * a bucket leaves a group when that group's last subscriber unsubscribes.
83
+ */
84
+ group?: string | string[];
85
+ /**
86
+ * Plain-GET refresh thunk used by `refreshGroups`. Provided alongside `group`.
87
+ * Refreshes this bucket in place (no params/body) and rejects on failure.
88
+ */
89
+ refetch?: () => Promise<void>;
90
+ }
91
+
92
+ interface InternalEntry {
93
+ snapshot: LoaderEntry;
94
+ listeners: Set<() => void>;
95
+ /** Monotonically increasing. Bumped by reserveRequestId() and clear(). */
96
+ latestRequestId: number;
97
+ /** Family id (loader.$$id) this bucket belongs to. */
98
+ loaderId: string;
99
+ /**
100
+ * True once any non-ephemeral subscriber has attached. Sticky buckets are
101
+ * never reference-count-dropped; they reset via clearFamily().
102
+ */
103
+ sticky: boolean;
104
+ /** A deferred refcount-drop microtask is scheduled and not yet cancelled. */
105
+ pendingClear: boolean;
106
+ /**
107
+ * The last subscriber left while a load() was in flight. Drop the bucket once
108
+ * that request settles, if it is still subscriberless.
109
+ */
110
+ clearWhenSettled: boolean;
111
+ /**
112
+ * Cross-loader refresh groups this bucket belongs to, mapped to the number of
113
+ * current subscribers that requested each group. A bucket can be in several
114
+ * groups at once (one read tagged with multiple names, or different subscribers
115
+ * tagging the same shared bucket with different names); refcounting keeps
116
+ * membership independent of subscribe/unsubscribe order.
117
+ */
118
+ groups: Map<string, number>;
119
+ /** Plain-GET refresh thunk for `refreshGroups`, set while in any group. */
120
+ refetch: (() => Promise<void>) | undefined;
121
+ }
122
+
123
+ /**
124
+ * Normalize a group tag option (`undefined | string | string[]`) to a deduped
125
+ * list of names. Deduping keeps a single subscriber from being counted more than
126
+ * once in one group when the caller passes a repeated name.
127
+ */
128
+ function normalizeGroups(group: string | string[] | undefined): string[] {
129
+ if (group === undefined) return [];
130
+ if (typeof group === "string") return [group];
131
+ return [...new Set(group)];
132
+ }
133
+
134
+ export class LoaderStore {
135
+ private readonly entries = new Map<string, InternalEntry>();
136
+ /** loader.$$id -> set of bucket keys, so clearFamily() can reach every bucket. */
137
+ private readonly families = new Map<string, Set<string>>();
138
+ /** refresh group name -> set of bucket keys, for refreshGroups(). */
139
+ private readonly groups = new Map<string, Set<string>>();
140
+
141
+ private getOrCreate(bucketKey: string): InternalEntry {
142
+ let e = this.entries.get(bucketKey);
143
+ if (!e) {
144
+ e = {
145
+ snapshot: EMPTY_SNAPSHOT,
146
+ listeners: new Set(),
147
+ latestRequestId: 0,
148
+ loaderId: bucketKey,
149
+ sticky: false,
150
+ pendingClear: false,
151
+ clearWhenSettled: false,
152
+ groups: new Map(),
153
+ refetch: undefined,
154
+ };
155
+ this.entries.set(bucketKey, e);
156
+ }
157
+ return e;
158
+ }
159
+
160
+ private registerFamily(loaderId: string, bucketKey: string): void {
161
+ let fam = this.families.get(loaderId);
162
+ if (!fam) {
163
+ fam = new Set();
164
+ this.families.set(loaderId, fam);
165
+ }
166
+ fam.add(bucketKey);
167
+ }
168
+
169
+ /**
170
+ * Subscribe to entry changes for `bucketKey`.
171
+ * Returns an unsubscribe function. A sticky bucket's entry is kept around even
172
+ * after the last subscriber leaves so that an in-flight `load()` can still
173
+ * commit if the consumer remounts. An ephemeral bucket is dropped once its
174
+ * last subscriber leaves (deferred, see maybeScheduleRefcountClear).
175
+ */
176
+ subscribe(
177
+ bucketKey: string,
178
+ cb: () => void,
179
+ options?: SubscribeOptions,
180
+ ): () => void {
181
+ const e = this.getOrCreate(bucketKey);
182
+ const loaderId = options?.loaderId ?? bucketKey;
183
+ e.loaderId = loaderId;
184
+ this.registerFamily(loaderId, bucketKey);
185
+ if (options?.ephemeral !== true) e.sticky = true;
186
+ // Normalize the group tag(s) to a deduped list so one subscriber is counted
187
+ // once per distinct group, and subscribe/unsubscribe stay symmetric (the
188
+ // same list drives both addToGroup and releaseGroup).
189
+ const groups = normalizeGroups(options?.group);
190
+ for (const group of groups) {
191
+ this.addToGroup(group, bucketKey, e, options?.refetch);
192
+ }
193
+ // A fresh subscriber means the bucket is wanted again: cancel any pending
194
+ // refcount-drop and the settle-then-drop intent.
195
+ e.pendingClear = false;
196
+ e.clearWhenSettled = false;
197
+ e.listeners.add(cb);
198
+ return () => {
199
+ e.listeners.delete(cb);
200
+ // Group membership is refcounted per subscriber so refreshGroups() never
201
+ // fetches for an unmounted reader, and a bucket shared by subscribers in
202
+ // different groups stays in each group until ALL of that group's
203
+ // subscribers have left (order-independent).
204
+ for (const group of groups) this.releaseGroup(group, bucketKey, e);
205
+ this.maybeScheduleRefcountClear(bucketKey, e);
206
+ };
207
+ }
208
+
209
+ private addToGroup(
210
+ group: string,
211
+ bucketKey: string,
212
+ e: InternalEntry,
213
+ refetch: (() => Promise<void>) | undefined,
214
+ ): void {
215
+ e.groups.set(group, (e.groups.get(group) ?? 0) + 1);
216
+ // One thunk per bucket — every subscriber of a bucket provides an
217
+ // equivalent plain-GET refresh, so keeping the latest is fine.
218
+ if (refetch) e.refetch = refetch;
219
+ let members = this.groups.get(group);
220
+ if (!members) {
221
+ members = new Set();
222
+ this.groups.set(group, members);
223
+ }
224
+ members.add(bucketKey);
225
+ }
226
+
227
+ private releaseGroup(
228
+ group: string,
229
+ bucketKey: string,
230
+ e: InternalEntry,
231
+ ): void {
232
+ const next = (e.groups.get(group) ?? 0) - 1;
233
+ if (next > 0) {
234
+ e.groups.set(group, next);
235
+ return;
236
+ }
237
+ e.groups.delete(group);
238
+ const members = this.groups.get(group);
239
+ if (members) {
240
+ members.delete(bucketKey);
241
+ if (members.size === 0) this.groups.delete(group);
242
+ }
243
+ }
244
+
245
+ /** Remove a bucket from every group it belongs to (used when it is dropped). */
246
+ private removeFromAllGroups(bucketKey: string, e: InternalEntry): void {
247
+ for (const group of e.groups.keys()) {
248
+ const members = this.groups.get(group);
249
+ if (members) {
250
+ members.delete(bucketKey);
251
+ if (members.size === 0) this.groups.delete(group);
252
+ }
253
+ }
254
+ e.groups.clear();
255
+ }
256
+
257
+ /**
258
+ * Refresh every currently-mounted bucket tagged with ANY of the given group
259
+ * names, with a plain GET (no params/body). Accepts a single name or an array
260
+ * of names. A bucket that belongs to more than one of the named groups is
261
+ * refreshed exactly once (members are unioned and deduped by bucket key), as
262
+ * are multiple reads of one bucket. Resolves when all refreshes settle; rejects
263
+ * with an `AggregateError` of the failures if any member fails — each failing
264
+ * member also records its error on its own snapshot.
265
+ */
266
+ async refreshGroups(groups: string | string[]): Promise<void> {
267
+ const names = typeof groups === "string" ? [groups] : groups;
268
+ // Union the member buckets across every named group, deduped by key, so a
269
+ // bucket tagged into two of the requested groups is fetched a single time.
270
+ const buckets = new Set<string>();
271
+ for (const name of names) {
272
+ const members = this.groups.get(name);
273
+ if (!members) continue;
274
+ for (const bucketKey of members) buckets.add(bucketKey);
275
+ }
276
+ if (buckets.size === 0) return;
277
+ const thunks: Array<() => Promise<void>> = [];
278
+ for (const bucketKey of buckets) {
279
+ const e = this.entries.get(bucketKey);
280
+ if (!e || e.listeners.size === 0 || !e.refetch) continue;
281
+ thunks.push(e.refetch);
282
+ }
283
+ if (thunks.length === 0) return;
284
+ const results = await Promise.allSettled(thunks.map((t) => t()));
285
+ const reasons = results
286
+ .filter((r): r is PromiseRejectedResult => r.status === "rejected")
287
+ .map((r) => r.reason);
288
+ if (reasons.length > 0) {
289
+ const label = names.map((n) => `"${n}"`).join(", ");
290
+ throw new AggregateError(
291
+ reasons,
292
+ `refreshGroups(${label}) had ${reasons.length} failure(s)`,
293
+ );
294
+ }
295
+ }
296
+
297
+ /**
298
+ * Schedule a deferred drop for an ad-hoc (never-sticky) bucket whose last
299
+ * subscriber just left. Deferred to a microtask so a StrictMode / transition
300
+ * remount that resubscribes in the same tick cancels it.
301
+ */
302
+ private maybeScheduleRefcountClear(
303
+ bucketKey: string,
304
+ e: InternalEntry,
305
+ ): void {
306
+ if (e.listeners.size > 0) return;
307
+ // Sticky buckets persist for remount; they reset via clearFamily().
308
+ if (e.sticky) return;
309
+ if (e.pendingClear) return;
310
+ e.pendingClear = true;
311
+ queueMicrotask(() => {
312
+ if (!e.pendingClear) return; // cancelled by a resubscribe
313
+ e.pendingClear = false;
314
+ if (e.listeners.size > 0) return; // resubscribed before the microtask ran
315
+ if (e.snapshot.isLoading) {
316
+ // Don't drop mid-flight; let the request commit, then drop.
317
+ e.clearWhenSettled = true;
318
+ return;
319
+ }
320
+ this.dropBucket(bucketKey);
321
+ });
322
+ }
323
+
324
+ /** Remove a bucket entry entirely and prune it from its family/group indexes. */
325
+ private dropBucket(bucketKey: string): void {
326
+ const e = this.entries.get(bucketKey);
327
+ if (!e) return;
328
+ this.removeFromAllGroups(bucketKey, e);
329
+ this.entries.delete(bucketKey);
330
+ const fam = this.families.get(e.loaderId);
331
+ if (fam) {
332
+ fam.delete(bucketKey);
333
+ if (fam.size === 0) this.families.delete(e.loaderId);
334
+ }
335
+ }
336
+
337
+ /** Drop an ephemeral bucket that settled with no subscribers left. */
338
+ private dropIfSettled(bucketKey: string, e: InternalEntry): void {
339
+ if (e.clearWhenSettled && e.listeners.size === 0) {
340
+ e.clearWhenSettled = false;
341
+ this.dropBucket(bucketKey);
342
+ }
343
+ }
344
+
345
+ /**
346
+ * Returns the current snapshot for `bucketKey`. Stable reference between
347
+ * mutations — subscribers rely on this to avoid spurious re-renders.
348
+ * Returns `EMPTY_SNAPSHOT` (a singleton) when the entry has never been
349
+ * mutated or has been cleared.
350
+ */
351
+ getSnapshot(bucketKey: string): LoaderEntry {
352
+ return this.entries.get(bucketKey)?.snapshot ?? EMPTY_SNAPSHOT;
353
+ }
354
+
355
+ /**
356
+ * Reserve a fresh request id for an upcoming `load()` call. The returned id
357
+ * is the new "latest"; any older in-flight requests will fail their gating
358
+ * check on `finishData` / `finishError` / `finishLoading` and be dropped.
359
+ *
360
+ * Callers should follow with `beginRequest(id, requestId)` to flip the
361
+ * loading flag on AND clear any leftover error from a previous attempt
362
+ * — the latter matters for `throwOnError: false` consumers, which would
363
+ * otherwise keep showing the stale error throughout the retry.
364
+ */
365
+ reserveRequestId(bucketKey: string): number {
366
+ const e = this.getOrCreate(bucketKey);
367
+ e.latestRequestId++;
368
+ return e.latestRequestId;
369
+ }
370
+
371
+ /**
372
+ * Mark the request as in-flight: `isLoading = true`, `error = null`.
373
+ * Combines the two operations so a retry doesn't render the previous
374
+ * error during the new request. Gated on `requestId === latestRequestId`
375
+ * for symmetry with the other mutators.
376
+ */
377
+ beginRequest(bucketKey: string, requestId: number): void {
378
+ const e = this.entries.get(bucketKey);
379
+ if (!e || requestId !== e.latestRequestId) return;
380
+ if (e.snapshot.isLoading && e.snapshot.error === null) return;
381
+ e.snapshot = Object.freeze({
382
+ value: e.snapshot.value,
383
+ hasValue: e.snapshot.hasValue,
384
+ error: null,
385
+ isLoading: true,
386
+ requestId,
387
+ });
388
+ this.notify(e);
389
+ }
390
+
391
+ /**
392
+ * Commit a successful result. No-op if `requestId` is not the latest
393
+ * (a newer `load()` was issued or `clear()` ran). Clearing `error` is
394
+ * intentional: a successful refetch should hide the previous failure.
395
+ */
396
+ finishData<T>(bucketKey: string, requestId: number, value: T): void {
397
+ const e = this.entries.get(bucketKey);
398
+ if (!e || requestId !== e.latestRequestId) return;
399
+ e.snapshot = Object.freeze({
400
+ value,
401
+ hasValue: true,
402
+ error: null,
403
+ isLoading: false,
404
+ requestId,
405
+ });
406
+ this.notify(e);
407
+ this.dropIfSettled(bucketKey, e);
408
+ }
409
+
410
+ /**
411
+ * Commit an error. Preserves the last good `value` so consumers can keep
412
+ * showing previous data while displaying the error if they choose. No-op
413
+ * if `requestId` is not the latest.
414
+ */
415
+ finishError(bucketKey: string, requestId: number, error: Error): void {
416
+ const e = this.entries.get(bucketKey);
417
+ if (!e || requestId !== e.latestRequestId) return;
418
+ e.snapshot = Object.freeze({
419
+ value: e.snapshot.value,
420
+ hasValue: e.snapshot.hasValue,
421
+ error,
422
+ isLoading: false,
423
+ requestId,
424
+ });
425
+ this.notify(e);
426
+ this.dropIfSettled(bucketKey, e);
427
+ }
428
+
429
+ /**
430
+ * Update loading flag. Gated on `requestId` to fix the race where an old
431
+ * load() finishes after a new one started — its `setLoading(false)` would
432
+ * otherwise hide the new request's spinner.
433
+ */
434
+ setLoading(bucketKey: string, requestId: number, isLoading: boolean): void {
435
+ const e = this.entries.get(bucketKey);
436
+ if (!e || requestId !== e.latestRequestId) return;
437
+ if (e.snapshot.isLoading === isLoading) return;
438
+ e.snapshot = Object.freeze({
439
+ ...e.snapshot,
440
+ isLoading,
441
+ });
442
+ this.notify(e);
443
+ }
444
+
445
+ /**
446
+ * Reset a single bucket entry. Bumps `latestRequestId` so any in-flight
447
+ * `load()` whose promise is still pending will fail its gate when it resolves
448
+ * and be dropped — prevents pre-navigation loads from clobbering the new
449
+ * route's context. The entry itself is kept (sticky-bucket semantics).
450
+ */
451
+ clear(bucketKey: string): void {
452
+ const e = this.entries.get(bucketKey);
453
+ if (!e) return;
454
+ e.latestRequestId++;
455
+ if (e.snapshot === EMPTY_SNAPSHOT) return;
456
+ e.snapshot = EMPTY_SNAPSHOT;
457
+ this.notify(e);
458
+ }
459
+
460
+ /**
461
+ * Reset every sticky bucket belonging to `loaderId`. Called on navigation /
462
+ * route-context change: all route-registered reads of the loader (keyed or
463
+ * not) drop back to seeding from fresh `loaderData`. Ephemeral buckets are
464
+ * intentionally left alone — they are governed by subscriber refcount, so a
465
+ * persistent keyed reader outside the outlet keeps its value across a
466
+ * navigation rather than blanking out.
467
+ */
468
+ clearFamily(loaderId: string): void {
469
+ const fam = this.families.get(loaderId);
470
+ if (!fam) return;
471
+ for (const bucketKey of fam) {
472
+ const e = this.entries.get(bucketKey);
473
+ if (!e || !e.sticky) continue;
474
+ this.clear(bucketKey);
475
+ }
476
+ }
477
+
478
+ private notify(e: InternalEntry): void {
479
+ for (const cb of e.listeners) cb();
480
+ }
481
+
482
+ /**
483
+ * Test-only escape hatch. Drops every entry. Production code should never
484
+ * call this; the store is process-scoped and lives for the tab's lifetime.
485
+ * @internal
486
+ */
487
+ reset(): void {
488
+ this.entries.clear();
489
+ this.families.clear();
490
+ this.groups.clear();
491
+ }
492
+ }
493
+
494
+ /**
495
+ * Module-level singleton. Each browser tab gets its own; SSR never mutates it.
496
+ * The hook falls through to `OutletContext.loaderData` during the server render.
497
+ */
498
+ export const loaderStore: LoaderStore = new LoaderStore();
499
+
500
+ export const EMPTY_LOADER_SNAPSHOT: LoaderEntry = EMPTY_SNAPSHOT;
package/src/loader.rsc.ts CHANGED
@@ -21,6 +21,7 @@ import {
21
21
  registerFetchableLoader,
22
22
  getFetchableLoader,
23
23
  } from "./server/fetchable-loader-store.js";
24
+ import { missingInjectedIdError } from "./missing-id-error.js";
24
25
 
25
26
  export { getFetchableLoader };
26
27
 
@@ -53,11 +54,7 @@ export function createLoader<T>(
53
54
  const loaderId = __injectedId || "";
54
55
 
55
56
  if (!loaderId && process.env.NODE_ENV === "development") {
56
- throw new Error(
57
- "[rsc-router] Loader is missing $$id. " +
58
- "Make sure the exposeInternalIds Vite plugin is enabled and " +
59
- "the loader is exported with: export const MyLoader = createLoader(...)",
60
- );
57
+ throw missingInjectedIdError("Loader", "createLoader");
61
58
  }
62
59
 
63
60
  // If not fetchable, store fn in registry (for SSR ctx.use() resolution)
package/src/loader.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * rsc-router/loader (client version)
2
+ * @rangojs/router/loader (client version)
3
3
  *
4
4
  * Client-only stub for createLoader. Returns a minimal loader definition
5
5
  * ({ __brand, $$id }) that can be passed to hooks like useLoader.
@@ -18,6 +18,7 @@ import type {
18
18
  LoaderDefinition,
19
19
  LoaderFn,
20
20
  } from "./types.js";
21
+ import { missingInjectedIdError } from "./missing-id-error.js";
21
22
 
22
23
  // Overload 1: With function only (not fetchable)
23
24
  export function createLoader<T>(
@@ -38,10 +39,6 @@ export function createLoader<T>(
38
39
 
39
40
  // Implementation - client stub that just returns the loader definition
40
41
  // The $$id parameter is injected by Vite plugin, not user-provided
41
- //
42
- // NOTE: For export-only loader files, the Vite plugin replaces the entire
43
- // file with object literals (bypassing this function). This function only
44
- // runs when loaders are in mixed files (not export-only).
45
42
  export function createLoader<T>(
46
43
  _fn: LoaderFn<T, Record<string, string | undefined>, any>,
47
44
  _fetchable?: true | FetchableLoaderOptions,
@@ -50,11 +47,7 @@ export function createLoader<T>(
50
47
  const loaderId = __injectedId || "";
51
48
 
52
49
  if (!loaderId && process.env.NODE_ENV === "development") {
53
- throw new Error(
54
- "[rsc-router] Loader is missing $$id. " +
55
- "Make sure the exposeInternalIds Vite plugin is enabled and " +
56
- "the loader is exported with: export const MyLoader = createLoader(...)",
57
- );
50
+ throw missingInjectedIdError("Loader", "createLoader");
58
51
  }
59
52
 
60
53
  return {