@rangojs/router 0.0.0-experimental.2 → 0.0.0-experimental.204030a9

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 (1195) hide show
  1. package/AGENTS.md +9 -0
  2. package/README.md +1037 -4
  3. package/dist/__internal.d.ts +83 -0
  4. package/dist/__internal.d.ts.map +1 -0
  5. package/dist/__internal.js +19 -0
  6. package/dist/__internal.js.map +1 -0
  7. package/dist/__mocks__/version.d.ts +7 -0
  8. package/dist/__mocks__/version.d.ts.map +1 -0
  9. package/{src/__mocks__/version.ts → dist/__mocks__/version.js} +1 -0
  10. package/dist/__mocks__/version.js.map +1 -0
  11. package/dist/__tests__/client-href.test.d.ts +2 -0
  12. package/dist/__tests__/client-href.test.d.ts.map +1 -0
  13. package/dist/__tests__/client-href.test.js +74 -0
  14. package/dist/__tests__/client-href.test.js.map +1 -0
  15. package/dist/__tests__/component-utils.test.d.ts +2 -0
  16. package/dist/__tests__/component-utils.test.d.ts.map +1 -0
  17. package/dist/__tests__/component-utils.test.js +51 -0
  18. package/dist/__tests__/component-utils.test.js.map +1 -0
  19. package/dist/__tests__/event-controller.test.d.ts +2 -0
  20. package/dist/__tests__/event-controller.test.d.ts.map +1 -0
  21. package/dist/__tests__/event-controller.test.js +538 -0
  22. package/dist/__tests__/event-controller.test.js.map +1 -0
  23. package/dist/__tests__/helpers/route-tree.d.ts +118 -0
  24. package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
  25. package/dist/__tests__/helpers/route-tree.js +374 -0
  26. package/dist/__tests__/helpers/route-tree.js.map +1 -0
  27. package/dist/__tests__/match-result.test.d.ts +2 -0
  28. package/dist/__tests__/match-result.test.d.ts.map +1 -0
  29. package/dist/__tests__/match-result.test.js +154 -0
  30. package/dist/__tests__/match-result.test.js.map +1 -0
  31. package/dist/__tests__/navigation-store.test.d.ts +2 -0
  32. package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
  33. package/dist/__tests__/navigation-store.test.js +440 -0
  34. package/dist/__tests__/navigation-store.test.js.map +1 -0
  35. package/dist/__tests__/partial-update.test.d.ts +2 -0
  36. package/dist/__tests__/partial-update.test.d.ts.map +1 -0
  37. package/dist/__tests__/partial-update.test.js +1009 -0
  38. package/dist/__tests__/partial-update.test.js.map +1 -0
  39. package/dist/__tests__/reverse-types.test.d.ts +8 -0
  40. package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
  41. package/dist/__tests__/reverse-types.test.js +656 -0
  42. package/dist/__tests__/reverse-types.test.js.map +1 -0
  43. package/dist/__tests__/route-definition.test.d.ts +2 -0
  44. package/dist/__tests__/route-definition.test.d.ts.map +1 -0
  45. package/dist/__tests__/route-definition.test.js +55 -0
  46. package/dist/__tests__/route-definition.test.js.map +1 -0
  47. package/dist/__tests__/router-helpers.test.d.ts +2 -0
  48. package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
  49. package/dist/__tests__/router-helpers.test.js +377 -0
  50. package/dist/__tests__/router-helpers.test.js.map +1 -0
  51. package/dist/__tests__/router-integration-2.test.d.ts +2 -0
  52. package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
  53. package/dist/__tests__/router-integration-2.test.js +426 -0
  54. package/dist/__tests__/router-integration-2.test.js.map +1 -0
  55. package/dist/__tests__/router-integration.test.d.ts +2 -0
  56. package/dist/__tests__/router-integration.test.d.ts.map +1 -0
  57. package/dist/__tests__/router-integration.test.js +1051 -0
  58. package/dist/__tests__/router-integration.test.js.map +1 -0
  59. package/dist/__tests__/search-params.test.d.ts +5 -0
  60. package/dist/__tests__/search-params.test.d.ts.map +1 -0
  61. package/dist/__tests__/search-params.test.js +306 -0
  62. package/dist/__tests__/search-params.test.js.map +1 -0
  63. package/dist/__tests__/segment-system.test.d.ts +2 -0
  64. package/dist/__tests__/segment-system.test.d.ts.map +1 -0
  65. package/dist/__tests__/segment-system.test.js +627 -0
  66. package/dist/__tests__/segment-system.test.js.map +1 -0
  67. package/dist/__tests__/static-handler-types.test.d.ts +8 -0
  68. package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
  69. package/dist/__tests__/static-handler-types.test.js +63 -0
  70. package/dist/__tests__/static-handler-types.test.js.map +1 -0
  71. package/dist/__tests__/urls.test.d.ts +2 -0
  72. package/dist/__tests__/urls.test.d.ts.map +1 -0
  73. package/dist/__tests__/urls.test.js +421 -0
  74. package/dist/__tests__/urls.test.js.map +1 -0
  75. package/dist/__tests__/use-mount.test.d.ts +2 -0
  76. package/dist/__tests__/use-mount.test.d.ts.map +1 -0
  77. package/dist/__tests__/use-mount.test.js +35 -0
  78. package/dist/__tests__/use-mount.test.js.map +1 -0
  79. package/dist/bin/rango.d.ts +2 -0
  80. package/dist/bin/rango.d.ts.map +1 -0
  81. package/dist/bin/rango.js +1779 -0
  82. package/dist/bin/rango.js.map +1 -0
  83. package/dist/browser/event-controller.d.ts +191 -0
  84. package/dist/browser/event-controller.d.ts.map +1 -0
  85. package/dist/browser/event-controller.js +559 -0
  86. package/dist/browser/event-controller.js.map +1 -0
  87. package/dist/browser/index.d.ts +2 -0
  88. package/dist/browser/index.d.ts.map +1 -0
  89. package/dist/browser/index.js +14 -0
  90. package/dist/browser/index.js.map +1 -0
  91. package/dist/browser/link-interceptor.d.ts +38 -0
  92. package/dist/browser/link-interceptor.d.ts.map +1 -0
  93. package/dist/browser/link-interceptor.js +99 -0
  94. package/dist/browser/link-interceptor.js.map +1 -0
  95. package/dist/browser/logging.d.ts +10 -0
  96. package/dist/browser/logging.d.ts.map +1 -0
  97. package/dist/browser/logging.js +29 -0
  98. package/dist/browser/logging.js.map +1 -0
  99. package/dist/browser/lru-cache.d.ts +17 -0
  100. package/dist/browser/lru-cache.d.ts.map +1 -0
  101. package/dist/browser/lru-cache.js +50 -0
  102. package/dist/browser/lru-cache.js.map +1 -0
  103. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  104. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  105. package/dist/browser/merge-segment-loaders.js +102 -0
  106. package/dist/browser/merge-segment-loaders.js.map +1 -0
  107. package/dist/browser/navigation-bridge.d.ts +102 -0
  108. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  109. package/dist/browser/navigation-bridge.js +708 -0
  110. package/dist/browser/navigation-bridge.js.map +1 -0
  111. package/dist/browser/navigation-client.d.ts +25 -0
  112. package/dist/browser/navigation-client.d.ts.map +1 -0
  113. package/dist/browser/navigation-client.js +157 -0
  114. package/dist/browser/navigation-client.js.map +1 -0
  115. package/dist/browser/navigation-store.d.ts +101 -0
  116. package/dist/browser/navigation-store.d.ts.map +1 -0
  117. package/dist/browser/navigation-store.js +625 -0
  118. package/dist/browser/navigation-store.js.map +1 -0
  119. package/dist/browser/partial-update.d.ts +75 -0
  120. package/dist/browser/partial-update.d.ts.map +1 -0
  121. package/dist/browser/partial-update.js +426 -0
  122. package/dist/browser/partial-update.js.map +1 -0
  123. package/dist/browser/react/Link.d.ts +86 -0
  124. package/dist/browser/react/Link.d.ts.map +1 -0
  125. package/dist/browser/react/Link.js +128 -0
  126. package/dist/browser/react/Link.js.map +1 -0
  127. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  128. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  129. package/dist/browser/react/NavigationProvider.js +216 -0
  130. package/dist/browser/react/NavigationProvider.js.map +1 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  132. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  133. package/dist/browser/react/ScrollRestoration.js +57 -0
  134. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  135. package/dist/browser/react/context.d.ts +46 -0
  136. package/dist/browser/react/context.d.ts.map +1 -0
  137. package/dist/browser/react/context.js +10 -0
  138. package/dist/browser/react/context.js.map +1 -0
  139. package/dist/browser/react/index.d.ts +11 -0
  140. package/dist/browser/react/index.d.ts.map +1 -0
  141. package/dist/browser/react/index.js +22 -0
  142. package/dist/browser/react/index.js.map +1 -0
  143. package/dist/browser/react/location-state-shared.d.ts +63 -0
  144. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  145. package/dist/browser/react/location-state-shared.js +81 -0
  146. package/dist/browser/react/location-state-shared.js.map +1 -0
  147. package/dist/browser/react/location-state.d.ts +23 -0
  148. package/dist/browser/react/location-state.d.ts.map +1 -0
  149. package/dist/browser/react/location-state.js +29 -0
  150. package/dist/browser/react/location-state.js.map +1 -0
  151. package/dist/browser/react/mount-context.d.ts +24 -0
  152. package/dist/browser/react/mount-context.d.ts.map +1 -0
  153. package/dist/browser/react/mount-context.js +24 -0
  154. package/dist/browser/react/mount-context.js.map +1 -0
  155. package/dist/browser/react/use-action.d.ts +64 -0
  156. package/dist/browser/react/use-action.d.ts.map +1 -0
  157. package/dist/browser/react/use-action.js +134 -0
  158. package/dist/browser/react/use-action.js.map +1 -0
  159. package/dist/browser/react/use-client-cache.d.ts +41 -0
  160. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  161. package/dist/browser/react/use-client-cache.js +39 -0
  162. package/dist/browser/react/use-client-cache.js.map +1 -0
  163. package/dist/browser/react/use-handle.d.ts +31 -0
  164. package/dist/browser/react/use-handle.d.ts.map +1 -0
  165. package/dist/browser/react/use-handle.js +144 -0
  166. package/dist/browser/react/use-handle.js.map +1 -0
  167. package/dist/browser/react/use-href.d.ts +33 -0
  168. package/dist/browser/react/use-href.d.ts.map +1 -0
  169. package/dist/browser/react/use-href.js +39 -0
  170. package/dist/browser/react/use-href.js.map +1 -0
  171. package/dist/browser/react/use-link-status.d.ts +37 -0
  172. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  173. package/dist/browser/react/use-link-status.js +99 -0
  174. package/dist/browser/react/use-link-status.js.map +1 -0
  175. package/dist/browser/react/use-mount.d.ts +25 -0
  176. package/dist/browser/react/use-mount.d.ts.map +1 -0
  177. package/dist/browser/react/use-mount.js +30 -0
  178. package/dist/browser/react/use-mount.js.map +1 -0
  179. package/dist/browser/react/use-navigation.d.ts +27 -0
  180. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  181. package/dist/browser/react/use-navigation.js +87 -0
  182. package/dist/browser/react/use-navigation.js.map +1 -0
  183. package/dist/browser/react/use-segments.d.ts +38 -0
  184. package/dist/browser/react/use-segments.d.ts.map +1 -0
  185. package/dist/browser/react/use-segments.js +130 -0
  186. package/dist/browser/react/use-segments.js.map +1 -0
  187. package/dist/browser/request-controller.d.ts +26 -0
  188. package/dist/browser/request-controller.d.ts.map +1 -0
  189. package/dist/browser/request-controller.js +147 -0
  190. package/dist/browser/request-controller.js.map +1 -0
  191. package/dist/browser/rsc-router.d.ts +129 -0
  192. package/dist/browser/rsc-router.d.ts.map +1 -0
  193. package/dist/browser/rsc-router.js +195 -0
  194. package/dist/browser/rsc-router.js.map +1 -0
  195. package/dist/browser/scroll-restoration.d.ts +93 -0
  196. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  197. package/dist/browser/scroll-restoration.js +321 -0
  198. package/dist/browser/scroll-restoration.js.map +1 -0
  199. package/dist/browser/segment-structure-assert.d.ts +17 -0
  200. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  201. package/dist/browser/segment-structure-assert.js +59 -0
  202. package/dist/browser/segment-structure-assert.js.map +1 -0
  203. package/dist/browser/server-action-bridge.d.ts +26 -0
  204. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  205. package/dist/browser/server-action-bridge.js +668 -0
  206. package/dist/browser/server-action-bridge.js.map +1 -0
  207. package/dist/browser/shallow.d.ts +12 -0
  208. package/dist/browser/shallow.d.ts.map +1 -0
  209. package/dist/browser/shallow.js +34 -0
  210. package/dist/browser/shallow.js.map +1 -0
  211. package/dist/browser/types.d.ts +369 -0
  212. package/dist/browser/types.d.ts.map +1 -0
  213. package/dist/browser/types.js +2 -0
  214. package/dist/browser/types.js.map +1 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  216. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  217. package/dist/build/__tests__/generate-cli.test.js +237 -0
  218. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  220. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  221. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  222. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  224. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  225. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  226. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  228. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  230. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  231. package/dist/build/generate-manifest.d.ts +81 -0
  232. package/dist/build/generate-manifest.d.ts.map +1 -0
  233. package/dist/build/generate-manifest.js +276 -0
  234. package/dist/build/generate-manifest.js.map +1 -0
  235. package/dist/build/generate-route-types.d.ts +115 -0
  236. package/dist/build/generate-route-types.d.ts.map +1 -0
  237. package/dist/build/generate-route-types.js +740 -0
  238. package/dist/build/generate-route-types.js.map +1 -0
  239. package/dist/build/index.d.ts +21 -0
  240. package/dist/build/index.d.ts.map +1 -0
  241. package/dist/build/index.js +21 -0
  242. package/dist/build/index.js.map +1 -0
  243. package/dist/build/route-trie.d.ts +71 -0
  244. package/dist/build/route-trie.d.ts.map +1 -0
  245. package/dist/build/route-trie.js +175 -0
  246. package/dist/build/route-trie.js.map +1 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  248. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  249. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  250. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  252. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  253. package/dist/cache/__tests__/document-cache.test.js +345 -0
  254. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  258. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  260. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  261. package/dist/cache/__tests__/memory-store.test.js +367 -0
  262. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  263. package/dist/cache/cache-scope.d.ts +102 -0
  264. package/dist/cache/cache-scope.d.ts.map +1 -0
  265. package/dist/cache/cache-scope.js +440 -0
  266. package/dist/cache/cache-scope.js.map +1 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  270. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  272. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  273. package/dist/cache/cf/cf-cache-store.js +242 -0
  274. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  275. package/dist/cache/cf/index.d.ts +14 -0
  276. package/dist/cache/cf/index.d.ts.map +1 -0
  277. package/dist/cache/cf/index.js +17 -0
  278. package/dist/cache/cf/index.js.map +1 -0
  279. package/dist/cache/document-cache.d.ts +64 -0
  280. package/dist/cache/document-cache.d.ts.map +1 -0
  281. package/dist/cache/document-cache.js +228 -0
  282. package/dist/cache/document-cache.js.map +1 -0
  283. package/dist/cache/index.d.ts +19 -0
  284. package/dist/cache/index.d.ts.map +1 -0
  285. package/dist/cache/index.js +21 -0
  286. package/dist/cache/index.js.map +1 -0
  287. package/dist/cache/memory-segment-store.d.ts +110 -0
  288. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  289. package/dist/cache/memory-segment-store.js +117 -0
  290. package/dist/cache/memory-segment-store.js.map +1 -0
  291. package/dist/cache/memory-store.d.ts +41 -0
  292. package/dist/cache/memory-store.d.ts.map +1 -0
  293. package/dist/cache/memory-store.js +191 -0
  294. package/dist/cache/memory-store.js.map +1 -0
  295. package/dist/cache/types.d.ts +317 -0
  296. package/dist/cache/types.d.ts.map +1 -0
  297. package/dist/cache/types.js +12 -0
  298. package/dist/cache/types.js.map +1 -0
  299. package/dist/client.d.ts +248 -0
  300. package/dist/client.d.ts.map +1 -0
  301. package/dist/client.js +367 -0
  302. package/dist/client.js.map +1 -0
  303. package/dist/client.rsc.d.ts +26 -0
  304. package/dist/client.rsc.d.ts.map +1 -0
  305. package/dist/client.rsc.js +46 -0
  306. package/dist/client.rsc.js.map +1 -0
  307. package/dist/component-utils.d.ts +36 -0
  308. package/dist/component-utils.d.ts.map +1 -0
  309. package/dist/component-utils.js +61 -0
  310. package/dist/component-utils.js.map +1 -0
  311. package/dist/components/DefaultDocument.d.ts +13 -0
  312. package/dist/components/DefaultDocument.d.ts.map +1 -0
  313. package/dist/components/DefaultDocument.js +15 -0
  314. package/dist/components/DefaultDocument.js.map +1 -0
  315. package/dist/debug.d.ts +58 -0
  316. package/dist/debug.d.ts.map +1 -0
  317. package/dist/debug.js +157 -0
  318. package/dist/debug.js.map +1 -0
  319. package/dist/default-error-boundary.d.ts +11 -0
  320. package/dist/default-error-boundary.d.ts.map +1 -0
  321. package/dist/default-error-boundary.js +45 -0
  322. package/dist/default-error-boundary.js.map +1 -0
  323. package/dist/deps/browser.d.ts +2 -0
  324. package/dist/deps/browser.d.ts.map +1 -0
  325. package/dist/deps/browser.js +3 -0
  326. package/dist/deps/browser.js.map +1 -0
  327. package/dist/deps/html-stream-client.d.ts +2 -0
  328. package/dist/deps/html-stream-client.d.ts.map +1 -0
  329. package/dist/deps/html-stream-client.js +3 -0
  330. package/dist/deps/html-stream-client.js.map +1 -0
  331. package/dist/deps/html-stream-server.d.ts +2 -0
  332. package/dist/deps/html-stream-server.d.ts.map +1 -0
  333. package/dist/deps/html-stream-server.js +3 -0
  334. package/dist/deps/html-stream-server.js.map +1 -0
  335. package/dist/deps/rsc.d.ts +2 -0
  336. package/dist/deps/rsc.d.ts.map +1 -0
  337. package/dist/deps/rsc.js +4 -0
  338. package/dist/deps/rsc.js.map +1 -0
  339. package/dist/deps/ssr.d.ts +2 -0
  340. package/dist/deps/ssr.d.ts.map +1 -0
  341. package/dist/deps/ssr.js +3 -0
  342. package/dist/deps/ssr.js.map +1 -0
  343. package/dist/errors.d.ts +174 -0
  344. package/dist/errors.d.ts.map +1 -0
  345. package/dist/errors.js +241 -0
  346. package/dist/errors.js.map +1 -0
  347. package/dist/handle.d.ts +78 -0
  348. package/dist/handle.d.ts.map +1 -0
  349. package/dist/handle.js +82 -0
  350. package/dist/handle.js.map +1 -0
  351. package/dist/handles/MetaTags.d.ts +14 -0
  352. package/dist/handles/MetaTags.d.ts.map +1 -0
  353. package/dist/handles/MetaTags.js +136 -0
  354. package/dist/handles/MetaTags.js.map +1 -0
  355. package/dist/handles/index.d.ts +6 -0
  356. package/dist/handles/index.d.ts.map +1 -0
  357. package/dist/handles/index.js +6 -0
  358. package/dist/handles/index.js.map +1 -0
  359. package/dist/handles/meta.d.ts +39 -0
  360. package/dist/handles/meta.d.ts.map +1 -0
  361. package/dist/handles/meta.js +202 -0
  362. package/dist/handles/meta.js.map +1 -0
  363. package/dist/host/__tests__/errors.test.d.ts +2 -0
  364. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  365. package/dist/host/__tests__/errors.test.js +76 -0
  366. package/dist/host/__tests__/errors.test.js.map +1 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  370. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  372. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  374. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  375. package/dist/host/__tests__/router.test.d.ts +2 -0
  376. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  377. package/dist/host/__tests__/router.test.js +241 -0
  378. package/dist/host/__tests__/router.test.js.map +1 -0
  379. package/dist/host/__tests__/testing.test.d.ts +2 -0
  380. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  381. package/dist/host/__tests__/testing.test.js +64 -0
  382. package/dist/host/__tests__/testing.test.js.map +1 -0
  383. package/dist/host/__tests__/utils.test.d.ts +2 -0
  384. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  385. package/dist/host/__tests__/utils.test.js +29 -0
  386. package/dist/host/__tests__/utils.test.js.map +1 -0
  387. package/dist/host/cookie-handler.d.ts +34 -0
  388. package/dist/host/cookie-handler.d.ts.map +1 -0
  389. package/dist/host/cookie-handler.js +124 -0
  390. package/dist/host/cookie-handler.js.map +1 -0
  391. package/dist/host/errors.d.ts +56 -0
  392. package/dist/host/errors.d.ts.map +1 -0
  393. package/dist/host/errors.js +79 -0
  394. package/dist/host/errors.js.map +1 -0
  395. package/dist/host/index.d.ts +29 -0
  396. package/dist/host/index.d.ts.map +1 -0
  397. package/dist/host/index.js +32 -0
  398. package/dist/host/index.js.map +1 -0
  399. package/dist/host/pattern-matcher.d.ts +36 -0
  400. package/dist/host/pattern-matcher.d.ts.map +1 -0
  401. package/dist/host/pattern-matcher.js +172 -0
  402. package/dist/host/pattern-matcher.js.map +1 -0
  403. package/dist/host/router.d.ts +26 -0
  404. package/dist/host/router.d.ts.map +1 -0
  405. package/dist/host/router.js +218 -0
  406. package/dist/host/router.js.map +1 -0
  407. package/dist/host/testing.d.ts +36 -0
  408. package/dist/host/testing.d.ts.map +1 -0
  409. package/dist/host/testing.js +55 -0
  410. package/dist/host/testing.js.map +1 -0
  411. package/dist/host/types.d.ts +115 -0
  412. package/dist/host/types.d.ts.map +1 -0
  413. package/dist/host/types.js +7 -0
  414. package/dist/host/types.js.map +1 -0
  415. package/dist/host/utils.d.ts +21 -0
  416. package/dist/host/utils.d.ts.map +1 -0
  417. package/dist/host/utils.js +23 -0
  418. package/dist/host/utils.js.map +1 -0
  419. package/dist/href-client.d.ts +131 -0
  420. package/dist/href-client.d.ts.map +1 -0
  421. package/dist/href-client.js +64 -0
  422. package/dist/href-client.js.map +1 -0
  423. package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
  424. package/dist/href-context.d.ts.map +1 -0
  425. package/dist/href-context.js +21 -0
  426. package/dist/href-context.js.map +1 -0
  427. package/dist/index.d.ts +73 -0
  428. package/dist/index.d.ts.map +1 -0
  429. package/dist/index.js +91 -0
  430. package/dist/index.js.map +1 -0
  431. package/dist/index.rsc.d.ts +32 -0
  432. package/dist/index.rsc.d.ts.map +1 -0
  433. package/dist/index.rsc.js +40 -0
  434. package/dist/index.rsc.js.map +1 -0
  435. package/dist/internal-debug.d.ts +2 -0
  436. package/dist/internal-debug.d.ts.map +1 -0
  437. package/dist/internal-debug.js +5 -0
  438. package/dist/internal-debug.js.map +1 -0
  439. package/dist/loader.d.ts +14 -0
  440. package/dist/loader.d.ts.map +1 -0
  441. package/dist/loader.js +20 -0
  442. package/dist/loader.js.map +1 -0
  443. package/dist/loader.rsc.d.ts +19 -0
  444. package/dist/loader.rsc.d.ts.map +1 -0
  445. package/dist/loader.rsc.js +99 -0
  446. package/dist/loader.rsc.js.map +1 -0
  447. package/dist/network-error-thrower.d.ts +17 -0
  448. package/dist/network-error-thrower.d.ts.map +1 -0
  449. package/dist/network-error-thrower.js +14 -0
  450. package/dist/network-error-thrower.js.map +1 -0
  451. package/dist/outlet-context.d.ts +13 -0
  452. package/dist/outlet-context.d.ts.map +1 -0
  453. package/dist/outlet-context.js +3 -0
  454. package/dist/outlet-context.js.map +1 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  456. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  457. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  458. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  459. package/dist/prerender/param-hash.d.ts +16 -0
  460. package/dist/prerender/param-hash.d.ts.map +1 -0
  461. package/dist/prerender/param-hash.js +36 -0
  462. package/dist/prerender/param-hash.js.map +1 -0
  463. package/dist/prerender/store.d.ts +38 -0
  464. package/dist/prerender/store.d.ts.map +1 -0
  465. package/dist/prerender/store.js +61 -0
  466. package/dist/prerender/store.js.map +1 -0
  467. package/dist/prerender.d.ts +66 -0
  468. package/dist/prerender.d.ts.map +1 -0
  469. package/dist/prerender.js +57 -0
  470. package/dist/prerender.js.map +1 -0
  471. package/dist/reverse.d.ts +196 -0
  472. package/dist/reverse.d.ts.map +1 -0
  473. package/dist/reverse.js +78 -0
  474. package/dist/reverse.js.map +1 -0
  475. package/dist/root-error-boundary.d.ts +33 -0
  476. package/dist/root-error-boundary.d.ts.map +1 -0
  477. package/dist/root-error-boundary.js +165 -0
  478. package/dist/root-error-boundary.js.map +1 -0
  479. package/dist/route-content-wrapper.d.ts +46 -0
  480. package/dist/route-content-wrapper.d.ts.map +1 -0
  481. package/dist/route-content-wrapper.js +77 -0
  482. package/dist/route-content-wrapper.js.map +1 -0
  483. package/dist/route-definition.d.ts +421 -0
  484. package/dist/route-definition.d.ts.map +1 -0
  485. package/dist/route-definition.js +868 -0
  486. package/dist/route-definition.js.map +1 -0
  487. package/dist/route-map-builder.d.ts +155 -0
  488. package/dist/route-map-builder.d.ts.map +1 -0
  489. package/dist/route-map-builder.js +237 -0
  490. package/dist/route-map-builder.js.map +1 -0
  491. package/dist/route-types.d.ts +165 -0
  492. package/dist/route-types.d.ts.map +1 -0
  493. package/dist/route-types.js +7 -0
  494. package/dist/route-types.js.map +1 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  496. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  497. package/dist/router/__tests__/handler-context.test.js +65 -0
  498. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  502. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  503. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  504. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  505. package/dist/router/__tests__/match-context.test.js +92 -0
  506. package/dist/router/__tests__/match-context.test.js.map +1 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  508. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  509. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  510. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  511. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  512. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  513. package/dist/router/__tests__/match-result.test.js +457 -0
  514. package/dist/router/__tests__/match-result.test.js.map +1 -0
  515. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  516. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  517. package/dist/router/__tests__/on-error.test.js +678 -0
  518. package/dist/router/__tests__/on-error.test.js.map +1 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  520. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  521. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  522. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  526. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  527. package/dist/router/error-handling.d.ts +77 -0
  528. package/dist/router/error-handling.d.ts.map +1 -0
  529. package/dist/router/error-handling.js +202 -0
  530. package/dist/router/error-handling.js.map +1 -0
  531. package/dist/router/handler-context.d.ts +20 -0
  532. package/dist/router/handler-context.d.ts.map +1 -0
  533. package/dist/router/handler-context.js +198 -0
  534. package/dist/router/handler-context.js.map +1 -0
  535. package/dist/router/intercept-resolution.d.ts +66 -0
  536. package/dist/router/intercept-resolution.d.ts.map +1 -0
  537. package/dist/router/intercept-resolution.js +246 -0
  538. package/dist/router/intercept-resolution.js.map +1 -0
  539. package/dist/router/loader-resolution.d.ts +64 -0
  540. package/dist/router/loader-resolution.d.ts.map +1 -0
  541. package/dist/router/loader-resolution.js +284 -0
  542. package/dist/router/loader-resolution.js.map +1 -0
  543. package/dist/router/logging.d.ts +15 -0
  544. package/dist/router/logging.d.ts.map +1 -0
  545. package/dist/router/logging.js +99 -0
  546. package/dist/router/logging.js.map +1 -0
  547. package/dist/router/manifest.d.ts +22 -0
  548. package/dist/router/manifest.d.ts.map +1 -0
  549. package/dist/router/manifest.js +181 -0
  550. package/dist/router/manifest.js.map +1 -0
  551. package/dist/router/match-api.d.ts +35 -0
  552. package/dist/router/match-api.d.ts.map +1 -0
  553. package/dist/router/match-api.js +406 -0
  554. package/dist/router/match-api.js.map +1 -0
  555. package/dist/router/match-context.d.ts +206 -0
  556. package/dist/router/match-context.d.ts.map +1 -0
  557. package/dist/router/match-context.js +17 -0
  558. package/dist/router/match-context.js.map +1 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  560. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  561. package/dist/router/match-middleware/background-revalidation.js +75 -0
  562. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  564. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  565. package/dist/router/match-middleware/cache-lookup.js +257 -0
  566. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  567. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  568. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  569. package/dist/router/match-middleware/cache-store.js +108 -0
  570. package/dist/router/match-middleware/cache-store.js.map +1 -0
  571. package/dist/router/match-middleware/index.d.ts +81 -0
  572. package/dist/router/match-middleware/index.d.ts.map +1 -0
  573. package/dist/router/match-middleware/index.js +80 -0
  574. package/dist/router/match-middleware/index.js.map +1 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  576. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  577. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  578. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  580. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  581. package/dist/router/match-middleware/segment-resolution.js +53 -0
  582. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  583. package/dist/router/match-pipelines.d.ts +147 -0
  584. package/dist/router/match-pipelines.d.ts.map +1 -0
  585. package/dist/router/match-pipelines.js +82 -0
  586. package/dist/router/match-pipelines.js.map +1 -0
  587. package/dist/router/match-result.d.ts +126 -0
  588. package/dist/router/match-result.d.ts.map +1 -0
  589. package/dist/router/match-result.js +93 -0
  590. package/dist/router/match-result.js.map +1 -0
  591. package/dist/router/metrics.d.ts +20 -0
  592. package/dist/router/metrics.d.ts.map +1 -0
  593. package/dist/router/metrics.js +47 -0
  594. package/dist/router/metrics.js.map +1 -0
  595. package/dist/router/middleware.d.ts +249 -0
  596. package/dist/router/middleware.d.ts.map +1 -0
  597. package/dist/router/middleware.js +434 -0
  598. package/dist/router/middleware.js.map +1 -0
  599. package/dist/router/middleware.test.d.ts +2 -0
  600. package/dist/router/middleware.test.d.ts.map +1 -0
  601. package/dist/router/middleware.test.js +816 -0
  602. package/dist/router/middleware.test.js.map +1 -0
  603. package/dist/router/pattern-matching.d.ts +149 -0
  604. package/dist/router/pattern-matching.d.ts.map +1 -0
  605. package/dist/router/pattern-matching.js +349 -0
  606. package/dist/router/pattern-matching.js.map +1 -0
  607. package/dist/router/revalidation.d.ts +44 -0
  608. package/dist/router/revalidation.d.ts.map +1 -0
  609. package/dist/router/revalidation.js +147 -0
  610. package/dist/router/revalidation.js.map +1 -0
  611. package/dist/router/router-context.d.ts +135 -0
  612. package/dist/router/router-context.d.ts.map +1 -0
  613. package/dist/router/router-context.js +36 -0
  614. package/dist/router/router-context.js.map +1 -0
  615. package/dist/router/segment-resolution.d.ts +127 -0
  616. package/dist/router/segment-resolution.d.ts.map +1 -0
  617. package/dist/router/segment-resolution.js +919 -0
  618. package/dist/router/segment-resolution.js.map +1 -0
  619. package/dist/router/trie-matching.d.ts +40 -0
  620. package/dist/router/trie-matching.d.ts.map +1 -0
  621. package/dist/router/trie-matching.js +127 -0
  622. package/dist/router/trie-matching.js.map +1 -0
  623. package/dist/router/types.d.ts +136 -0
  624. package/dist/router/types.d.ts.map +1 -0
  625. package/dist/router/types.js +7 -0
  626. package/dist/router/types.js.map +1 -0
  627. package/dist/router.d.ts +753 -0
  628. package/dist/router.d.ts.map +1 -0
  629. package/dist/router.gen.d.ts +6 -0
  630. package/dist/router.gen.d.ts.map +1 -0
  631. package/dist/router.gen.js +6 -0
  632. package/dist/router.gen.js.map +1 -0
  633. package/dist/router.js +1304 -0
  634. package/dist/router.js.map +1 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  636. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  637. package/dist/rsc/__tests__/helpers.test.js +140 -0
  638. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  639. package/dist/rsc/handler.d.ts +45 -0
  640. package/dist/rsc/handler.d.ts.map +1 -0
  641. package/dist/rsc/handler.js +1172 -0
  642. package/dist/rsc/handler.js.map +1 -0
  643. package/dist/rsc/helpers.d.ts +16 -0
  644. package/dist/rsc/helpers.d.ts.map +1 -0
  645. package/dist/rsc/helpers.js +55 -0
  646. package/dist/rsc/helpers.js.map +1 -0
  647. package/dist/rsc/index.d.ts +22 -0
  648. package/dist/rsc/index.d.ts.map +1 -0
  649. package/dist/rsc/index.js +23 -0
  650. package/dist/rsc/index.js.map +1 -0
  651. package/dist/rsc/nonce.d.ts +9 -0
  652. package/dist/rsc/nonce.d.ts.map +1 -0
  653. package/dist/rsc/nonce.js +18 -0
  654. package/dist/rsc/nonce.js.map +1 -0
  655. package/dist/rsc/types.d.ts +206 -0
  656. package/dist/rsc/types.d.ts.map +1 -0
  657. package/dist/rsc/types.js +8 -0
  658. package/dist/rsc/types.js.map +1 -0
  659. package/dist/search-params.d.ts +103 -0
  660. package/dist/search-params.d.ts.map +1 -0
  661. package/dist/search-params.js +74 -0
  662. package/dist/search-params.js.map +1 -0
  663. package/dist/segment-system.d.ts +75 -0
  664. package/dist/segment-system.d.ts.map +1 -0
  665. package/dist/segment-system.js +336 -0
  666. package/dist/segment-system.js.map +1 -0
  667. package/dist/server/context.d.ts +245 -0
  668. package/dist/server/context.d.ts.map +1 -0
  669. package/dist/server/context.js +197 -0
  670. package/dist/server/context.js.map +1 -0
  671. package/dist/server/fetchable-loader-store.d.ts +18 -0
  672. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  673. package/dist/server/fetchable-loader-store.js +18 -0
  674. package/dist/server/fetchable-loader-store.js.map +1 -0
  675. package/dist/server/handle-store.d.ts +85 -0
  676. package/dist/server/handle-store.d.ts.map +1 -0
  677. package/dist/server/handle-store.js +142 -0
  678. package/dist/server/handle-store.js.map +1 -0
  679. package/dist/server/loader-registry.d.ts +55 -0
  680. package/dist/server/loader-registry.d.ts.map +1 -0
  681. package/dist/server/loader-registry.js +132 -0
  682. package/dist/server/loader-registry.js.map +1 -0
  683. package/dist/server/request-context.d.ts +226 -0
  684. package/dist/server/request-context.d.ts.map +1 -0
  685. package/dist/server/request-context.js +290 -0
  686. package/dist/server/request-context.js.map +1 -0
  687. package/dist/server/root-layout.d.ts +4 -0
  688. package/dist/server/root-layout.d.ts.map +1 -0
  689. package/dist/server/root-layout.js +5 -0
  690. package/dist/server/root-layout.js.map +1 -0
  691. package/dist/server.d.ts +15 -0
  692. package/dist/server.d.ts.map +1 -0
  693. package/dist/server.js +20 -0
  694. package/dist/server.js.map +1 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  698. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  699. package/dist/ssr/index.d.ts +98 -0
  700. package/dist/ssr/index.d.ts.map +1 -0
  701. package/dist/ssr/index.js +158 -0
  702. package/dist/ssr/index.js.map +1 -0
  703. package/dist/static-handler.d.ts +50 -0
  704. package/dist/static-handler.d.ts.map +1 -0
  705. package/dist/static-handler.gen.d.ts +5 -0
  706. package/dist/static-handler.gen.d.ts.map +1 -0
  707. package/dist/static-handler.gen.js +5 -0
  708. package/dist/static-handler.gen.js.map +1 -0
  709. package/dist/static-handler.js +29 -0
  710. package/dist/static-handler.js.map +1 -0
  711. package/dist/theme/ThemeProvider.d.ts +20 -0
  712. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  713. package/dist/theme/ThemeProvider.js +240 -0
  714. package/dist/theme/ThemeProvider.js.map +1 -0
  715. package/dist/theme/ThemeScript.d.ts +48 -0
  716. package/dist/theme/ThemeScript.d.ts.map +1 -0
  717. package/dist/theme/ThemeScript.js +13 -0
  718. package/dist/theme/ThemeScript.js.map +1 -0
  719. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  720. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  721. package/dist/theme/__tests__/theme.test.js +103 -0
  722. package/dist/theme/__tests__/theme.test.js.map +1 -0
  723. package/dist/theme/constants.d.ts +29 -0
  724. package/dist/theme/constants.d.ts.map +1 -0
  725. package/dist/theme/constants.js +48 -0
  726. package/dist/theme/constants.js.map +1 -0
  727. package/dist/theme/index.d.ts +31 -0
  728. package/dist/theme/index.d.ts.map +1 -0
  729. package/dist/theme/index.js +36 -0
  730. package/dist/theme/index.js.map +1 -0
  731. package/dist/theme/theme-context.d.ts +40 -0
  732. package/dist/theme/theme-context.d.ts.map +1 -0
  733. package/dist/theme/theme-context.js +60 -0
  734. package/dist/theme/theme-context.js.map +1 -0
  735. package/dist/theme/theme-script.d.ts +27 -0
  736. package/dist/theme/theme-script.d.ts.map +1 -0
  737. package/dist/theme/theme-script.js +147 -0
  738. package/dist/theme/theme-script.js.map +1 -0
  739. package/dist/theme/types.d.ts +163 -0
  740. package/dist/theme/types.d.ts.map +1 -0
  741. package/dist/theme/types.js +11 -0
  742. package/dist/theme/types.js.map +1 -0
  743. package/dist/theme/use-theme.d.ts +12 -0
  744. package/dist/theme/use-theme.d.ts.map +1 -0
  745. package/dist/theme/use-theme.js +40 -0
  746. package/dist/theme/use-theme.js.map +1 -0
  747. package/dist/types.d.ts +1479 -0
  748. package/dist/types.d.ts.map +1 -0
  749. package/dist/types.js +10 -0
  750. package/dist/types.js.map +1 -0
  751. package/dist/urls.d.ts +441 -0
  752. package/dist/urls.d.ts.map +1 -0
  753. package/dist/urls.gen.d.ts +8 -0
  754. package/dist/urls.gen.d.ts.map +1 -0
  755. package/dist/urls.gen.js +8 -0
  756. package/dist/urls.gen.js.map +1 -0
  757. package/dist/urls.js +443 -0
  758. package/dist/urls.js.map +1 -0
  759. package/dist/use-loader.d.ts +127 -0
  760. package/dist/use-loader.d.ts.map +1 -0
  761. package/dist/use-loader.js +237 -0
  762. package/dist/use-loader.js.map +1 -0
  763. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  767. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  771. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  775. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  777. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  779. package/dist/vite/ast-handler-extract.d.ts +49 -0
  780. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  781. package/dist/vite/ast-handler-extract.js +249 -0
  782. package/dist/vite/ast-handler-extract.js.map +1 -0
  783. package/dist/vite/expose-action-id.d.ts +19 -0
  784. package/dist/vite/expose-action-id.d.ts.map +1 -0
  785. package/dist/vite/expose-action-id.js +250 -0
  786. package/dist/vite/expose-action-id.js.map +1 -0
  787. package/dist/vite/expose-id-utils.d.ts +69 -0
  788. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  789. package/dist/vite/expose-id-utils.js +289 -0
  790. package/dist/vite/expose-id-utils.js.map +1 -0
  791. package/dist/vite/expose-internal-ids.d.ts +22 -0
  792. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  793. package/dist/vite/expose-internal-ids.js +886 -0
  794. package/dist/vite/expose-internal-ids.js.map +1 -0
  795. package/dist/vite/index.d.ts +149 -0
  796. package/dist/vite/index.d.ts.map +1 -0
  797. package/dist/vite/index.js +6440 -809
  798. package/dist/vite/index.js.bak +5448 -0
  799. package/dist/vite/index.js.map +1 -0
  800. package/dist/vite/index.named-routes.gen.ts +103 -0
  801. package/dist/vite/package-resolution.d.ts +43 -0
  802. package/dist/vite/package-resolution.d.ts.map +1 -0
  803. package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
  804. package/dist/vite/package-resolution.js.map +1 -0
  805. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  806. package/dist/vite/virtual-entries.d.ts +25 -0
  807. package/dist/vite/virtual-entries.d.ts.map +1 -0
  808. package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +18 -17
  809. package/dist/vite/virtual-entries.js.map +1 -0
  810. package/package.json +140 -57
  811. package/skills/breadcrumbs/SKILL.md +252 -0
  812. package/skills/bundle-analysis/SKILL.md +159 -0
  813. package/skills/cache-guide/SKILL.md +484 -0
  814. package/skills/caching/SKILL.md +276 -226
  815. package/skills/composability/SKILL.md +197 -0
  816. package/skills/debug-manifest/SKILL.md +112 -0
  817. package/skills/document-cache/SKILL.md +106 -53
  818. package/skills/fonts/SKILL.md +167 -0
  819. package/skills/handler-use/SKILL.md +364 -0
  820. package/skills/hooks/SKILL.md +621 -67
  821. package/skills/host-router/SKILL.md +243 -0
  822. package/skills/i18n/SKILL.md +276 -0
  823. package/skills/intercept/SKILL.md +265 -202
  824. package/skills/layout/SKILL.md +261 -146
  825. package/skills/links/SKILL.md +471 -0
  826. package/skills/loader/SKILL.md +701 -250
  827. package/skills/middleware/SKILL.md +254 -320
  828. package/skills/migrate-nextjs/SKILL.md +562 -0
  829. package/skills/migrate-react-router/SKILL.md +769 -0
  830. package/skills/mime-routes/SKILL.md +155 -0
  831. package/skills/observability/SKILL.md +137 -0
  832. package/skills/parallel/SKILL.md +399 -158
  833. package/skills/prerender/SKILL.md +666 -0
  834. package/skills/rango/SKILL.md +338 -0
  835. package/skills/react-compiler/SKILL.md +168 -0
  836. package/skills/response-routes/SKILL.md +468 -0
  837. package/skills/route/SKILL.md +417 -89
  838. package/skills/router-setup/SKILL.md +389 -268
  839. package/skills/server-actions/SKILL.md +751 -0
  840. package/skills/streams-and-websockets/SKILL.md +283 -0
  841. package/skills/tailwind/SKILL.md +129 -0
  842. package/skills/testing/SKILL.md +549 -0
  843. package/skills/theme/SKILL.md +36 -11
  844. package/skills/typesafety/SKILL.md +747 -174
  845. package/skills/use-cache/SKILL.md +353 -0
  846. package/skills/view-transitions/SKILL.md +294 -0
  847. package/src/__augment-tests__/augment.ts +81 -0
  848. package/src/__augment-tests__/augmented.check.ts +117 -0
  849. package/src/__internal.ts +273 -0
  850. package/src/bin/rango.ts +321 -0
  851. package/src/browser/action-coordinator.ts +114 -0
  852. package/src/browser/app-shell.ts +52 -0
  853. package/src/browser/app-version.ts +14 -0
  854. package/src/browser/event-controller.ts +172 -128
  855. package/src/browser/history-state.ts +101 -0
  856. package/src/browser/index.ts +3 -3
  857. package/src/browser/intercept-utils.ts +52 -0
  858. package/src/browser/link-interceptor.ts +24 -4
  859. package/src/browser/logging.ts +55 -0
  860. package/src/browser/merge-segment-loaders.ts +20 -12
  861. package/src/browser/navigation-bridge.ts +390 -557
  862. package/src/browser/navigation-client.ts +228 -70
  863. package/src/browser/navigation-store.ts +104 -63
  864. package/src/browser/navigation-transaction.ts +279 -0
  865. package/src/browser/network-error-handler.ts +61 -0
  866. package/src/browser/partial-update.ts +397 -303
  867. package/src/browser/prefetch/cache.ts +314 -0
  868. package/src/browser/prefetch/fetch.ts +282 -0
  869. package/src/browser/prefetch/observer.ts +65 -0
  870. package/src/browser/prefetch/policy.ts +48 -0
  871. package/src/browser/prefetch/queue.ts +191 -0
  872. package/src/browser/prefetch/resource-ready.ts +77 -0
  873. package/src/browser/rango-state.ts +152 -0
  874. package/src/browser/react/Link.tsx +258 -74
  875. package/src/browser/react/NavigationProvider.tsx +237 -49
  876. package/src/browser/react/context.ts +11 -0
  877. package/src/browser/react/filter-segment-order.ts +55 -0
  878. package/src/browser/react/index.ts +15 -12
  879. package/src/browser/react/location-state-shared.ts +269 -56
  880. package/src/browser/react/location-state.ts +90 -19
  881. package/src/browser/react/mount-context.ts +37 -0
  882. package/src/browser/react/nonce-context.ts +23 -0
  883. package/src/browser/react/shallow-equal.ts +27 -0
  884. package/src/browser/react/use-action.ts +29 -51
  885. package/src/browser/react/use-client-cache.ts +5 -3
  886. package/src/browser/react/use-handle.ts +41 -98
  887. package/src/browser/react/use-href.tsx +20 -188
  888. package/src/browser/react/use-link-status.ts +6 -5
  889. package/src/browser/react/use-mount.ts +31 -0
  890. package/src/browser/react/use-navigation.ts +49 -80
  891. package/src/browser/react/use-params.ts +77 -0
  892. package/src/browser/react/use-pathname.ts +47 -0
  893. package/src/browser/react/use-reverse.ts +106 -0
  894. package/src/browser/react/use-router.ts +96 -0
  895. package/src/browser/react/use-search-params.ts +56 -0
  896. package/src/browser/react/use-segments.ts +85 -99
  897. package/src/browser/response-adapter.ts +98 -0
  898. package/src/browser/rsc-router.tsx +273 -78
  899. package/src/browser/scroll-restoration.ts +132 -49
  900. package/src/browser/segment-reconciler.ts +243 -0
  901. package/src/browser/segment-structure-assert.ts +83 -0
  902. package/src/browser/server-action-bridge.ts +504 -589
  903. package/src/browser/shallow.ts +6 -1
  904. package/src/browser/types.ts +184 -58
  905. package/src/browser/validate-redirect-origin.ts +29 -0
  906. package/src/build/collect-fallback-refs.ts +107 -0
  907. package/src/build/generate-manifest.ts +463 -0
  908. package/src/build/generate-route-types.ts +41 -0
  909. package/src/build/index.ts +37 -0
  910. package/src/build/route-trie.ts +292 -0
  911. package/src/build/route-types/ast-helpers.ts +25 -0
  912. package/src/build/route-types/ast-route-extraction.ts +98 -0
  913. package/src/build/route-types/codegen.ts +102 -0
  914. package/src/build/route-types/include-resolution.ts +418 -0
  915. package/src/build/route-types/param-extraction.ts +48 -0
  916. package/src/build/route-types/per-module-writer.ts +131 -0
  917. package/src/build/route-types/router-processing.ts +659 -0
  918. package/src/build/route-types/scan-filter.ts +85 -0
  919. package/src/build/route-types/source-scan.ts +118 -0
  920. package/src/build/runtime-discovery.ts +220 -0
  921. package/src/cache/background-task.ts +34 -0
  922. package/src/cache/cache-key-utils.ts +44 -0
  923. package/src/cache/cache-policy.ts +125 -0
  924. package/src/cache/cache-runtime.ts +342 -0
  925. package/src/cache/cache-scope.ts +150 -306
  926. package/src/cache/cf/cf-cache-store.ts +619 -24
  927. package/src/cache/cf/index.ts +13 -3
  928. package/src/cache/document-cache.ts +116 -77
  929. package/src/cache/handle-capture.ts +81 -0
  930. package/src/cache/handle-snapshot.ts +41 -0
  931. package/src/cache/index.ts +1 -15
  932. package/src/cache/memory-segment-store.ts +191 -13
  933. package/src/cache/profile-registry.ts +73 -0
  934. package/src/cache/read-through-swr.ts +134 -0
  935. package/src/cache/segment-codec.ts +256 -0
  936. package/src/cache/taint.ts +153 -0
  937. package/src/cache/types.ts +76 -121
  938. package/src/client.rsc.tsx +15 -15
  939. package/src/client.tsx +145 -309
  940. package/src/component-utils.ts +4 -4
  941. package/src/components/DefaultDocument.tsx +6 -2
  942. package/src/context-var.ts +156 -0
  943. package/src/debug.ts +243 -0
  944. package/src/decode-loader-results.ts +36 -0
  945. package/src/errors.ts +138 -3
  946. package/src/handle.ts +90 -22
  947. package/src/handles/MetaTags.tsx +76 -23
  948. package/src/handles/breadcrumbs.ts +66 -0
  949. package/src/handles/index.ts +1 -0
  950. package/src/handles/meta.ts +32 -15
  951. package/src/host/cookie-handler.ts +165 -0
  952. package/src/host/errors.ts +97 -0
  953. package/src/host/index.ts +53 -0
  954. package/src/host/pattern-matcher.ts +214 -0
  955. package/src/host/router.ts +424 -0
  956. package/src/host/testing.ts +79 -0
  957. package/src/host/types.ts +175 -0
  958. package/src/host/utils.ts +25 -0
  959. package/src/href-client.ts +263 -49
  960. package/src/index.rsc.ts +190 -29
  961. package/src/index.ts +278 -38
  962. package/src/internal-debug.ts +11 -0
  963. package/src/loader-store.ts +500 -0
  964. package/src/loader.rsc.ts +24 -142
  965. package/src/loader.ts +21 -11
  966. package/src/missing-id-error.ts +68 -0
  967. package/src/network-error-thrower.tsx +3 -1
  968. package/src/outlet-context.ts +1 -1
  969. package/src/outlet-provider.tsx +45 -0
  970. package/src/prerender/param-hash.ts +37 -0
  971. package/src/prerender/store.ts +186 -0
  972. package/src/prerender.ts +524 -0
  973. package/src/response-utils.ts +37 -0
  974. package/src/reverse.ts +380 -0
  975. package/src/root-error-boundary.tsx +41 -29
  976. package/src/route-content-wrapper.tsx +15 -39
  977. package/src/route-definition/dsl-helpers.ts +1109 -0
  978. package/src/route-definition/helper-factories.ts +90 -0
  979. package/src/route-definition/helpers-types.ts +506 -0
  980. package/src/route-definition/index.ts +55 -0
  981. package/src/route-definition/redirect.ts +101 -0
  982. package/src/route-definition/resolve-handler-use.ts +155 -0
  983. package/src/route-definition/use-item-types.ts +32 -0
  984. package/src/route-definition.ts +1 -1371
  985. package/src/route-map-builder.ts +247 -112
  986. package/src/route-name.ts +53 -0
  987. package/src/route-types.ts +99 -42
  988. package/src/router/basename.ts +14 -0
  989. package/src/router/content-negotiation.ts +228 -0
  990. package/src/router/debug-manifest.ts +72 -0
  991. package/src/router/error-handling.ts +10 -10
  992. package/src/router/find-match.ts +160 -0
  993. package/src/router/handler-context.ts +420 -88
  994. package/src/router/intercept-resolution.ts +388 -0
  995. package/src/router/lazy-includes.ts +237 -0
  996. package/src/router/loader-resolution.ts +374 -128
  997. package/src/router/logging.ts +251 -0
  998. package/src/router/manifest.ts +187 -43
  999. package/src/router/match-api.ts +556 -0
  1000. package/src/router/match-context.ts +6 -4
  1001. package/src/router/match-handlers.ts +483 -0
  1002. package/src/router/match-middleware/background-revalidation.ts +108 -93
  1003. package/src/router/match-middleware/cache-lookup.ts +413 -10
  1004. package/src/router/match-middleware/cache-store.ts +99 -26
  1005. package/src/router/match-middleware/intercept-resolution.ts +57 -17
  1006. package/src/router/match-middleware/segment-resolution.ts +80 -6
  1007. package/src/router/match-pipelines.ts +10 -45
  1008. package/src/router/match-result.ts +156 -36
  1009. package/src/router/metrics.ts +241 -16
  1010. package/src/router/middleware-cookies.ts +55 -0
  1011. package/src/router/middleware-types.ts +209 -0
  1012. package/src/router/middleware.ts +359 -346
  1013. package/src/router/navigation-snapshot.ts +182 -0
  1014. package/src/router/pattern-matching.ts +416 -41
  1015. package/src/router/prerender-match.ts +502 -0
  1016. package/src/router/preview-match.ts +100 -0
  1017. package/src/router/request-classification.ts +286 -0
  1018. package/src/router/revalidation.ts +195 -40
  1019. package/src/router/route-snapshot.ts +245 -0
  1020. package/src/router/router-context.ts +45 -23
  1021. package/src/router/router-interfaces.ts +501 -0
  1022. package/src/router/router-options.ts +657 -0
  1023. package/src/router/router-registry.ts +21 -0
  1024. package/src/router/segment-resolution/fresh.ts +769 -0
  1025. package/src/router/segment-resolution/helpers.ts +268 -0
  1026. package/src/router/segment-resolution/loader-cache.ts +199 -0
  1027. package/src/router/segment-resolution/revalidation.ts +1420 -0
  1028. package/src/router/segment-resolution/static-store.ts +67 -0
  1029. package/src/router/segment-resolution/view-transition-default.ts +36 -0
  1030. package/src/router/segment-resolution.ts +21 -0
  1031. package/src/router/segment-wrappers.ts +291 -0
  1032. package/src/router/substitute-pattern-params.ts +56 -0
  1033. package/src/router/telemetry-otel.ts +299 -0
  1034. package/src/router/telemetry.ts +399 -0
  1035. package/src/router/timeout.ts +148 -0
  1036. package/src/router/trie-matching.ts +244 -0
  1037. package/src/router/types.ts +87 -4
  1038. package/src/router/url-params.ts +49 -0
  1039. package/src/router.ts +768 -3574
  1040. package/src/rsc/handler-context.ts +45 -0
  1041. package/src/rsc/handler.ts +894 -806
  1042. package/src/rsc/helpers.ts +201 -19
  1043. package/src/rsc/index.ts +5 -25
  1044. package/src/rsc/loader-fetch.ts +229 -0
  1045. package/src/rsc/manifest-init.ts +90 -0
  1046. package/src/rsc/nonce.ts +14 -0
  1047. package/src/rsc/origin-guard.ts +159 -0
  1048. package/src/rsc/progressive-enhancement.ts +395 -0
  1049. package/src/rsc/response-error.ts +37 -0
  1050. package/src/rsc/response-route-handler.ts +340 -0
  1051. package/src/rsc/rsc-rendering.ts +230 -0
  1052. package/src/rsc/runtime-warnings.ts +41 -0
  1053. package/src/rsc/server-action.ts +336 -0
  1054. package/src/rsc/ssr-setup.ts +144 -0
  1055. package/src/rsc/types.ts +54 -14
  1056. package/src/search-params.ts +230 -0
  1057. package/src/segment-content-promise.ts +67 -0
  1058. package/src/segment-loader-promise.ts +122 -0
  1059. package/src/segment-system.tsx +265 -115
  1060. package/src/serialize.ts +243 -0
  1061. package/src/server/context.ts +480 -90
  1062. package/src/server/cookie-store.ts +214 -0
  1063. package/src/server/fetchable-loader-store.ts +37 -0
  1064. package/src/server/handle-store.ts +117 -20
  1065. package/src/server/loader-registry.ts +24 -64
  1066. package/src/server/request-context.ts +613 -109
  1067. package/src/server.ts +36 -131
  1068. package/src/ssr/index.tsx +164 -25
  1069. package/src/static-handler.ts +126 -0
  1070. package/src/testing/cache-status.ts +166 -0
  1071. package/src/testing/collect-handle.ts +63 -0
  1072. package/src/testing/dispatch.ts +440 -0
  1073. package/src/testing/dom.entry.ts +22 -0
  1074. package/src/testing/e2e/fixture.ts +154 -0
  1075. package/src/testing/e2e/index.ts +149 -0
  1076. package/src/testing/e2e/matchers.ts +51 -0
  1077. package/src/testing/e2e/page-helpers.ts +272 -0
  1078. package/src/testing/e2e/parity.ts +306 -0
  1079. package/src/testing/e2e/server.ts +183 -0
  1080. package/src/testing/flight-matchers.ts +104 -0
  1081. package/src/testing/flight-runtime.d.ts +21 -0
  1082. package/src/testing/flight.entry.ts +22 -0
  1083. package/src/testing/flight.ts +182 -0
  1084. package/src/testing/generated-routes.ts +223 -0
  1085. package/src/testing/index.ts +98 -0
  1086. package/src/testing/internal/context.ts +151 -0
  1087. package/src/testing/render-route.tsx +536 -0
  1088. package/src/testing/run-loader.ts +296 -0
  1089. package/src/testing/run-middleware.ts +170 -0
  1090. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  1091. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  1092. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  1093. package/src/testing/vitest-stubs/version.ts +5 -0
  1094. package/src/testing/vitest.ts +112 -0
  1095. package/src/theme/ThemeProvider.tsx +21 -15
  1096. package/src/theme/ThemeScript.tsx +5 -5
  1097. package/src/theme/constants.ts +11 -4
  1098. package/src/theme/index.ts +4 -14
  1099. package/src/theme/theme-context.ts +5 -31
  1100. package/src/theme/theme-script.ts +21 -18
  1101. package/src/theme/types.ts +1 -1
  1102. package/src/types/boundaries.ts +158 -0
  1103. package/src/types/cache-types.ts +198 -0
  1104. package/src/types/error-types.ts +192 -0
  1105. package/src/types/global-namespace.ts +113 -0
  1106. package/src/types/handler-context.ts +809 -0
  1107. package/src/types/index.ts +89 -0
  1108. package/src/types/loader-types.ts +209 -0
  1109. package/src/types/request-scope.ts +126 -0
  1110. package/src/types/route-config.ts +170 -0
  1111. package/src/types/route-entry.ts +120 -0
  1112. package/src/types/segments.ts +184 -0
  1113. package/src/types.ts +1 -1561
  1114. package/src/urls/include-helper.ts +164 -0
  1115. package/src/urls/index.ts +50 -0
  1116. package/src/urls/path-helper-types.ts +380 -0
  1117. package/src/urls/path-helper.ts +329 -0
  1118. package/src/urls/pattern-types.ts +124 -0
  1119. package/src/urls/response-types.ts +109 -0
  1120. package/src/urls/type-extraction.ts +282 -0
  1121. package/src/urls/urls-function.ts +94 -0
  1122. package/src/urls.ts +1 -726
  1123. package/src/use-loader.tsx +559 -108
  1124. package/src/vite/debug.ts +185 -0
  1125. package/src/vite/discovery/bundle-postprocess.ts +181 -0
  1126. package/src/vite/discovery/discover-routers.ts +398 -0
  1127. package/src/vite/discovery/discovery-errors.ts +194 -0
  1128. package/src/vite/discovery/gate-state.ts +171 -0
  1129. package/src/vite/discovery/prerender-collection.ts +480 -0
  1130. package/src/vite/discovery/route-types-writer.ts +214 -0
  1131. package/src/vite/discovery/self-gen-tracking.ts +73 -0
  1132. package/src/vite/discovery/state.ts +150 -0
  1133. package/src/vite/discovery/virtual-module-codegen.ts +193 -0
  1134. package/src/vite/index.ts +20 -785
  1135. package/src/vite/plugin-types.ts +170 -0
  1136. package/src/vite/plugins/cjs-to-esm.ts +94 -0
  1137. package/src/vite/plugins/client-ref-dedup.ts +131 -0
  1138. package/src/vite/plugins/client-ref-hashing.ts +128 -0
  1139. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1140. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1141. package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
  1142. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +109 -66
  1143. package/src/vite/plugins/expose-id-utils.ts +303 -0
  1144. package/src/vite/plugins/expose-ids/export-analysis.ts +376 -0
  1145. package/src/vite/plugins/expose-ids/handler-transform.ts +156 -0
  1146. package/src/vite/plugins/expose-ids/loader-transform.ts +72 -0
  1147. package/src/vite/plugins/expose-ids/router-transform.ts +127 -0
  1148. package/src/vite/plugins/expose-ids/types.ts +45 -0
  1149. package/src/vite/plugins/expose-internal-ids.ts +796 -0
  1150. package/src/vite/plugins/performance-tracks.ts +92 -0
  1151. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1152. package/src/vite/plugins/use-cache-transform.ts +338 -0
  1153. package/src/vite/plugins/version-injector.ts +99 -0
  1154. package/src/vite/plugins/version-plugin.ts +323 -0
  1155. package/src/vite/plugins/virtual-entries.ts +123 -0
  1156. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  1157. package/src/vite/rango.ts +549 -0
  1158. package/src/vite/router-discovery.ts +1568 -0
  1159. package/src/vite/utils/ast-handler-extract.ts +517 -0
  1160. package/src/vite/utils/banner.ts +36 -0
  1161. package/src/vite/utils/bundle-analysis.ts +139 -0
  1162. package/src/vite/utils/client-chunks.ts +190 -0
  1163. package/src/vite/utils/forward-user-plugins.ts +193 -0
  1164. package/src/vite/utils/manifest-utils.ts +86 -0
  1165. package/src/vite/utils/package-resolution.ts +161 -0
  1166. package/src/vite/utils/prerender-utils.ts +222 -0
  1167. package/src/vite/utils/shared-utils.ts +251 -0
  1168. package/CLAUDE.md +0 -7
  1169. package/src/__tests__/component-utils.test.ts +0 -76
  1170. package/src/__tests__/route-definition.test.ts +0 -63
  1171. package/src/__tests__/urls.test.tsx +0 -436
  1172. package/src/browser/lru-cache.ts +0 -69
  1173. package/src/browser/request-controller.ts +0 -164
  1174. package/src/cache/__tests__/document-cache.test.ts +0 -522
  1175. package/src/cache/__tests__/memory-segment-store.test.ts +0 -487
  1176. package/src/cache/__tests__/memory-store.test.ts +0 -484
  1177. package/src/cache/cf/__tests__/cf-cache-store.test.ts +0 -428
  1178. package/src/cache/memory-store.ts +0 -253
  1179. package/src/href.ts +0 -177
  1180. package/src/route-utils.ts +0 -89
  1181. package/src/router/__tests__/match-context.test.ts +0 -104
  1182. package/src/router/__tests__/match-pipelines.test.ts +0 -537
  1183. package/src/router/__tests__/match-result.test.ts +0 -566
  1184. package/src/router/__tests__/on-error.test.ts +0 -935
  1185. package/src/router/__tests__/pattern-matching.test.ts +0 -577
  1186. package/src/router/middleware.test.ts +0 -1355
  1187. package/src/rsc/__tests__/helpers.test.ts +0 -175
  1188. package/src/server/__tests__/request-context.test.ts +0 -171
  1189. package/src/ssr/__tests__/ssr-handler.test.tsx +0 -188
  1190. package/src/theme/__tests__/theme.test.ts +0 -120
  1191. package/src/vite/__tests__/expose-loader-id.test.ts +0 -117
  1192. package/src/vite/expose-handle-id.ts +0 -209
  1193. package/src/vite/expose-loader-id.ts +0 -357
  1194. package/src/vite/expose-location-state-id.ts +0 -177
  1195. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
@@ -1,365 +1,816 @@
1
1
  ---
2
2
  name: loader
3
3
  description: Define data loaders for fetching data in routes with createLoader
4
- argument-hint: [loader-name]
4
+ argument-hint: [loader]
5
5
  ---
6
6
 
7
- # Data Loaders
7
+ # Data Loaders with loader()
8
8
 
9
- Loaders fetch data for routes and make it available to handlers and client components.
9
+ Loaders fetch data on the server and stream it to the client. For mutations
10
+ (writes triggered by forms or buttons), use server actions instead — see
11
+ `/server-actions`. Loaders re-resolve after an action runs, so the typical
12
+ flow is _action mutates → loader re-reads → UI updates_.
10
13
 
11
14
  ## Creating a Loader
12
15
 
13
16
  ```typescript
14
- import { createLoader, notFound } from "rsc-router/server";
17
+ import { createLoader } from "@rangojs/router";
15
18
 
16
19
  export const ProductLoader = createLoader(async (ctx) => {
17
- const product = await db.products.findUnique({
18
- where: { slug: ctx.params.slug },
19
- });
20
+ "use server";
20
21
 
21
- if (!product) {
22
- throw notFound("Product not found");
23
- }
22
+ const product = await ctx.env.DB.prepare(
23
+ "SELECT * FROM products WHERE slug = ?",
24
+ )
25
+ .bind(ctx.params.slug)
26
+ .first();
24
27
 
25
- return product;
28
+ return { product };
26
29
  });
27
30
  ```
28
31
 
29
- ## Loader Context
32
+ ### Supported export patterns
30
33
 
31
- The loader receives a context with:
34
+ All of the following are equivalent and fully supported by the Vite transform:
32
35
 
33
36
  ```typescript
34
- export const MyLoader = createLoader(async (ctx) => {
35
- ctx.params; // Route parameters { id: string, slug: string }
36
- ctx.query; // Query string parameters
37
- ctx.url; // Full URL object
38
- ctx.pathname; // Current path
39
- ctx.method; // HTTP method
40
- ctx.request; // Raw Request object
41
-
42
- // Variables from middleware
43
- const user = ctx.get("user");
37
+ // Direct export (most common)
38
+ export const ProductLoader = createLoader(handler);
44
39
 
45
- // Use other loaders
46
- const related = await ctx.use(RelatedLoader);
40
+ // Separate declaration + named export
41
+ const ProductLoader = createLoader(handler);
42
+ export { ProductLoader };
47
43
 
48
- return { user, related };
49
- });
44
+ // Aliased export
45
+ const InternalLoader = createLoader(handler);
46
+ export { InternalLoader as ProductLoader };
47
+
48
+ // Aliased import
49
+ import { createLoader as cl } from "@rangojs/router";
50
+ export const ProductLoader = cl(handler);
50
51
  ```
51
52
 
52
- ## Registering Loaders on Routes
53
+ The `export const` form and the `const + export { }` form both work for
54
+ client stubs, ID injection, and loader manifest tracking.
55
+
56
+ ## Using Loaders in Routes
53
57
 
54
58
  ```typescript
55
- import { map } from "rsc-router/server";
56
- import { ProductLoader } from "../loaders/product";
57
-
58
- export default map<typeof routes>(({ route, loader, loading }) => [
59
- route("products.detail", async (ctx) => {
60
- const product = await ctx.use(ProductLoader);
61
- return <ProductPage product={product} />;
62
- }, () => [
59
+ import { urls } from "@rangojs/router";
60
+ import { ProductLoader } from "./loaders/product";
61
+
62
+ export const urlpatterns = urls(({ path, loader }) => [
63
+ path("/product/:slug", ProductPage, { name: "product" }, () => [
63
64
  loader(ProductLoader),
64
- loading(<ProductSkeleton />),
65
65
  ]),
66
66
  ]);
67
67
  ```
68
68
 
69
- ## Loader with Middleware
69
+ ## Consuming Loader Data
70
70
 
71
- Add middleware specific to a loader:
71
+ Register loaders with `loader()` in the DSL and consume them in client
72
+ components with `useLoader()`. This is the recommended pattern — it keeps
73
+ data fetching on the server and consumption on the client, with a clean
74
+ separation that works correctly with `cache()`.
72
75
 
73
76
  ```typescript
74
- export const UserProfileLoader = createLoader(
75
- async (ctx) => {
76
- const userId = ctx.get("validatedUserId");
77
- return db.users.findUnique({ where: { id: userId } });
78
- },
79
- {
80
- middleware: [
81
- async (ctx, next) => {
82
- const userId = ctx.params.id;
83
-
84
- // Validate user ID
85
- if (!isValidUUID(userId)) {
86
- throw new Error("Invalid user ID");
87
- }
88
-
89
- ctx.set("validatedUserId", userId);
90
- await next();
91
- },
92
- ],
93
- }
94
- );
95
- ```
77
+ "use client";
78
+ import { useLoader } from "@rangojs/router/client";
79
+ import { ProductLoader } from "./loaders/product";
96
80
 
97
- ## Using Loaders in Handlers
81
+ function ProductDetails() {
82
+ const { data } = useLoader(ProductLoader);
83
+ return <div>{data.product.description}</div>;
84
+ }
85
+ ```
98
86
 
99
87
  ```typescript
100
- route("products.detail", async (ctx) => {
101
- // Fetch loader data
102
- const product = await ctx.use(ProductLoader);
88
+ // Route definition — loader() registration required
89
+ path("/product/:slug", ProductPage, { name: "product" }, () => [
90
+ loader(ProductLoader),
91
+ ]);
92
+ ```
103
93
 
104
- // Multiple loaders
105
- const [product, reviews, related] = await Promise.all([
106
- ctx.use(ProductLoader),
107
- ctx.use(ReviewsLoader),
108
- ctx.use(RelatedProductsLoader),
109
- ]);
94
+ > **Client refresh `key` vs. server `cache({ key })` vs. `revalidate()`.** Three
95
+ > different "what refreshes" knobs that are easy to confuse:
96
+ >
97
+ > - `useLoader(Loader, { key })` / `useFetchLoader(Loader, { key })` — a
98
+ > **client** refresh identity. It groups which mounted reads of one loader
99
+ > refresh together when one calls `load()`. It never touches the server
100
+ > request. For refreshing **different** loaders together, tag them with
101
+ > `{ refreshGroup }` (one name or several) and call `useRefreshLoaders()(name)`
102
+ > (plain GET only). See the hooks skill ("Scoping refetch with a `key`" and
103
+ > "Refreshing multiple loaders together").
104
+ > - `cache({ key })` — a **server** cache identity (storage hit/miss/ttl/swr).
105
+ > - `revalidate()` — which **server** segments/loaders recompute during
106
+ > navigation and action refreshes.
107
+
108
+ DSL loaders are the **live data layer** — they resolve fresh on every
109
+ request, even when the route is inside a `cache()` boundary. The router
110
+ excludes them from the segment cache at storage time and re-resolves them
111
+ on retrieval. This means `cache()` gives you cached UI + fresh data by
112
+ default.
113
+
114
+ ### Cache safety
115
+
116
+ DSL loaders can safely read `createVar({ cache: false })` variables
117
+ because they are always resolved fresh. The read guard is bypassed for
118
+ loader functions — they never produce stale data.
119
+
120
+ ### ctx.use(Loader) — escape hatch
121
+
122
+ For cases where you need loader data in the server handler itself (e.g.,
123
+ to set ctx variables or make routing decisions), use `ctx.use(Loader)`:
110
124
 
111
- return (
112
- <ProductPage
113
- product={product}
114
- reviews={reviews}
115
- related={related}
116
- />
117
- );
118
- }, () => [
119
- loader(ProductLoader),
120
- loader(ReviewsLoader),
121
- loader(RelatedProductsLoader),
125
+ ```typescript
126
+ path("/product/:slug", async (ctx) => {
127
+ const { product } = await ctx.use(ProductLoader);
128
+ ctx.set(Product, product); // make available to children
129
+ return <ProductPage />;
130
+ }, { name: "product" }, () => [
131
+ loader(ProductLoader), // still register for client consumption
122
132
  ])
123
133
  ```
124
134
 
125
- ## Loader Revalidation
135
+ When you register with `loader()` in the DSL, `ctx.use()` returns the
136
+ same memoized result — loaders never run twice per request.
137
+
138
+ **Limitations of ctx.use(Loader):**
139
+
140
+ - The handler output depends on the loader data. If the route is inside
141
+ `cache()`, the handler is cached with the loader result baked in —
142
+ defeating the live data guarantee.
143
+ - Non-cacheable variable reads (`createVar({ cache: false })`) inside the
144
+ handler still throw, even if the data came from a loader.
145
+ - Prefer DSL `loader()` + client `useLoader()` for data that depends on
146
+ non-cacheable context variables.
147
+
148
+ **Never use `useLoader()` in server components** — it is a client-only API.
149
+
150
+ ### Summary
126
151
 
127
- Control when loaders refetch:
152
+ | Pattern | API | Cache-safe | Recommended |
153
+ | ---------------------- | ------------------- | ---------- | ----------- |
154
+ | DSL + client component | `useLoader(Loader)` | Yes | Yes |
155
+ | Handler escape hatch | `ctx.use(Loader)` | No | When needed |
156
+
157
+ ## Loader Context
158
+
159
+ Loaders receive the same context shape as route handlers.
160
+
161
+ ### Full field surface
162
+
163
+ | Field | Type | Notes |
164
+ | -------------- | ------------------------------ | --------------------------------------------------------------------------------------------------- |
165
+ | `params` | `TParams` | Merged route + explicit loader params; overridable by fetchable `load({ params })`. |
166
+ | `routeParams` | `Record<string, string>` | Server-trusted route params from URL pattern matching; cannot be overridden. |
167
+ | `request` | `Request` | The incoming `Request` (headers, method, body, `signal` for abort). |
168
+ | `url` | `URL` | Parsed request URL. |
169
+ | `pathname` | `string` | URL pathname (shortcut for `ctx.url.pathname`). |
170
+ | `searchParams` | `URLSearchParams` | Shortcut for `ctx.url.searchParams`. |
171
+ | `search` | `ResolveSearchSchema<TSearch>` | Typed query params when a search schema is declared on the route; `{}` otherwise. |
172
+ | `env` | `TEnv` | Plain bindings from `createRouter<TEnv>()` (DB, KV, secrets, etc.). |
173
+ | `get` | `(key \| ContextVar) => value` | Reads variables/context-vars set by middleware. |
174
+ | `use` | `(loader \| handle) => T` | Access another loader's data (Promise) or a handle's collected data (after `await ctx.rendered()`). |
175
+ | `rendered` | `() => Promise<void>` | **Experimental.** DSL loaders only — waits for non-loader segments before reading handle data. |
176
+ | `method` | `string` | HTTP method. `"GET"` for SSR loader runs; reflects real method for fetchable loaders. |
177
+ | `body` | `TBody \| undefined` | Parsed request body for fetchable POST/PUT/PATCH/DELETE calls. |
178
+ | `formData` | `FormData \| undefined` | Present when a fetchable loader is invoked via form submission. |
179
+ | `reverse` | `ScopedReverseFunction` | Generate type-checked URLs from route names (same scoped semantics as route handlers). |
180
+
181
+ ### Example
128
182
 
129
183
  ```typescript
130
- route("products.detail", ProductHandler, () => [
131
- loader(ProductLoader),
184
+ export const ProductLoader = createLoader(async (ctx) => {
185
+ "use server";
132
186
 
133
- // Revalidate when params change
134
- revalidate(({ currentParams, nextParams }) =>
135
- currentParams.slug !== nextParams.slug
136
- ),
187
+ // URL params (may include client-provided overrides for fetchable loaders)
188
+ const { slug } = ctx.params;
137
189
 
138
- // Revalidate on specific actions
139
- revalidate(({ actionId }) =>
140
- actionId?.includes("updateProduct") ?? false
141
- ),
142
- ])
190
+ // Server-trusted route params (from URL pattern matching, cannot be overridden)
191
+ const { slug: trustedSlug } = ctx.routeParams;
192
+
193
+ // Query params
194
+ const variant = ctx.url.searchParams.get("variant");
195
+
196
+ // Platform bindings (DB, KV, etc.) — plain bindings from createRouter<TEnv>()
197
+ const db = ctx.env.DB;
198
+
199
+ // Request headers
200
+ const auth = ctx.request.headers.get("Authorization");
201
+
202
+ // Variables set by middleware (from Rango.Vars augmentation)
203
+ const user = ctx.get("user");
204
+
205
+ // Type-checked URLs for payloads. `.name` resolves within the current
206
+ // include() scope; a bare `name` resolves globally. See /route and
207
+ // /typesafety for scope rules and route-name autocomplete.
208
+ const detailUrl = ctx.reverse(".detail", { slug });
209
+
210
+ return {
211
+ product: await fetchProduct(slug),
212
+ links: { self: detailUrl },
213
+ };
214
+ });
143
215
  ```
144
216
 
145
- ### Soft vs Hard Revalidation
217
+ See `/route` for the full handler-context contract (shared with loaders) and
218
+ `/typesafety` for route-name typing that powers `ctx.reverse` autocomplete.
219
+
220
+ ### params vs routeParams
221
+
222
+ - `ctx.params` — merged route params + explicit loader params. For fetchable
223
+ loaders called with `load(Loader, { params: { ... } })`, explicit params
224
+ override route-matched params.
225
+ - `ctx.routeParams` — server-trusted route params from URL pattern matching.
226
+ Cannot be overridden by client-provided params.
227
+
228
+ Use `ctx.routeParams` when you need trusted route identity for authorization
229
+ or resource scoping:
146
230
 
147
231
  ```typescript
148
- // Hard decision - stops evaluation
149
- revalidate(({ currentParams, nextParams }) => {
150
- return currentParams.id !== nextParams.id; // boolean
151
- });
232
+ export const OrderLoader = createLoader(async (ctx) => {
233
+ "use server";
152
234
 
153
- // Soft decision - continues to next revalidator
154
- revalidate(({ actionId, defaultShouldRevalidate }) => {
155
- if (actionId?.includes("cart")) {
156
- return true; // Hard: must revalidate
157
- }
158
- // Soft: defer to next revalidator
159
- return { defaultShouldRevalidate };
235
+ // Use routeParams for auth checks client cannot spoof the URL-matched ID
236
+ const { orderId } = ctx.routeParams;
237
+ const user = ctx.get("user");
238
+
239
+ const order = await db.orders.get(orderId);
240
+ if (order.userId !== user.id)
241
+ throw new Response("Forbidden", { status: 403 });
242
+
243
+ return { order };
160
244
  });
161
245
  ```
162
246
 
163
- ## Client-Side Loader Access
247
+ ## Loader with Children
164
248
 
165
- ### useLoader() - Strict access
249
+ Add caching or revalidation to specific loaders:
166
250
 
167
- ```tsx
168
- "use client";
169
- import { useLoader } from "rsc-router";
170
- import { ProductLoader } from "../loaders/product";
251
+ ```typescript
252
+ path("/product/:slug", ProductPage, { name: "product" }, () => [
253
+ // Cached loader
254
+ loader(ProductLoader, () => [cache({ ttl: 300 })]),
171
255
 
172
- function ProductPrice() {
173
- // Data guaranteed (throws if not in context)
174
- const { data } = useLoader(ProductLoader);
175
- return <span>${data.price}</span>;
176
- }
256
+ // Loader with revalidation control
257
+ loader(RelatedProductsLoader, () => [
258
+ revalidate(() => false), // Never revalidate
259
+ ]),
260
+
261
+ // Loader that revalidates after cart actions (defer otherwise — keeps the
262
+ // permissive loader defaults for navigation and other actions intact)
263
+ loader(CartLoader, () => [
264
+ revalidate(({ actionId }) => actionId?.includes("Cart") || undefined),
265
+ ]),
266
+ ]);
177
267
  ```
178
268
 
179
- ### useFetchLoader() - Flexible access
269
+ ### `revalidate()` return shapes
180
270
 
181
- ```tsx
182
- "use client";
183
- import { useFetchLoader } from "rsc-router";
184
- import { SearchLoader } from "../loaders/search";
271
+ > **Scope: `revalidate()` is a partial-render concern, not a cache concern.**
272
+ > It decides whether a segment (here, a loader) re-runs and streams to the
273
+ > client on a navigation or action — never whether a cached value is stale. The
274
+ > cache decides hit/miss/ttl/swr independently and never reads `revalidate()`.
275
+ > Caching a loader is a separate, opt-in step (`loader(Fn, () => [cache({...})])`).
276
+ > See `/cache-guide` → "Two axes" and `/rango` → "The shape of rango".
185
277
 
186
- function SearchResults() {
187
- const { data, load, isLoading } = useFetchLoader(SearchLoader);
278
+ A `revalidate(fn)` callback can return one of four shapes. The chain
279
+ processes revalidators in order; each call's return controls how the
280
+ chain continues:
188
281
 
189
- const handleSearch = async (query: string) => {
190
- await load({ params: { query } });
191
- };
282
+ ```typescript
283
+ // 1) Hard decision short-circuits the chain, used as the final answer.
284
+ revalidate(() => true);
285
+ revalidate(({ actionId }) => actionId?.includes("Cart") ?? false);
286
+
287
+ // 2) Soft decision — updates the running suggestion for downstream
288
+ // revalidators on the same segment, chain continues.
289
+ revalidate(({ defaultShouldRevalidate }) => ({
290
+ defaultShouldRevalidate: !defaultShouldRevalidate,
291
+ }));
292
+
293
+ // 3) Defer (no opinion) — leaves the running suggestion unchanged and
294
+ // continues to the next revalidator. Implicit return / null /
295
+ // undefined are all equivalent and consumer-friendly.
296
+ revalidate(({ actionId }) => {
297
+ if (actionId?.includes("Cart")) return true; // hard for this branch only
298
+ // implicit return — let downstream revalidators or the segment default decide
299
+ });
300
+ revalidate(() => undefined); // explicit defer
301
+ revalidate(() => null); // explicit defer
302
+ ```
192
303
 
193
- return (
194
- <div>
195
- <input onChange={(e) => handleSearch(e.target.value)} />
196
- {isLoading && <Spinner />}
197
- {data?.results.map(r => <Result key={r.id} {...r} />)}
198
- </div>
199
- );
200
- }
304
+ If every revalidator on a segment defers, the segment-type default
305
+ (e.g. params-changed for routes, `false` for parallels) is used.
306
+
307
+ #### `|| undefined` (defer) vs `?? false` (hard) — pick deliberately
308
+
309
+ A boolean return — including `false` — is a **hard** decision: it short-circuits
310
+ the chain and overrides the segment default. `undefined` **defers** to the
311
+ running suggestion / segment default. They are not interchangeable:
312
+
313
+ ```typescript
314
+ // Defer: "revalidate on match, otherwise let the default/downstream decide."
315
+ revalidate(({ actionId }) => actionId?.includes("Cart") || undefined);
316
+
317
+ // Hard: "revalidate ONLY on match, suppress everything else."
318
+ revalidate(({ actionId }) => actionId?.includes("Cart") ?? false);
201
319
  ```
202
320
 
203
- ## Async/Streaming Loaders
321
+ This matters most for loaders, whose defaults are permissive: a loader defaults
322
+ to revalidating on **any** action (`POST`) and on **param/search changes**
323
+ during navigation. So `?? false` on a loader silently suppresses both — the
324
+ loader will not refetch when you navigate to a different `:id`. Use
325
+ `|| undefined` when you want to _add_ a revalidation signal on top of the
326
+ sensible defaults, and reserve `?? false` for the rare case where you genuinely
327
+ want the loader to refetch on nothing but your matched action.
328
+
329
+ When **composing multiple revalidators** on one segment (see below), defer is
330
+ mandatory: the first hard `?? false` ends the chain and the later contracts
331
+ never run.
204
332
 
205
- Return promises for streaming:
333
+ #### Matching actions: `ctx.isAction()`
334
+
335
+ To revalidate after specific server actions, match them by **reference** with
336
+ `ctx.isAction()` rather than hand-written `actionId` substrings. A rename or
337
+ moved file then becomes a type error instead of silently failing to match:
206
338
 
207
339
  ```typescript
208
- export const RecommendationsLoader = createLoader(async (ctx) => {
209
- return {
210
- // Immediate data
211
- product: await db.products.findUnique({ where: { id: ctx.params.id } }),
340
+ import { addToCart, removeFromCart } from "../actions/cart";
341
+ import * as CartActions from "../actions/cart";
212
342
 
213
- // Streams while other content renders
214
- recommendations: db.recommendations.findAsync(ctx.params.id),
215
- };
216
- });
343
+ loader(CartLoader, () => [
344
+ revalidate((ctx) => ctx.isAction(addToCart) || undefined), // one action
345
+ ]);
346
+ revalidate((ctx) => ctx.isAction(addToCart, removeFromCart) || undefined); // several
347
+ revalidate((ctx) => ctx.isAction(CartActions) || undefined); // any action in the module
217
348
  ```
218
349
 
219
- ## Loader Caching
350
+ `isAction()` is a method on the revalidate predicate's **context argument** —
351
+ there is no standalone `isAction` import; you always reach it through the callback
352
+ parameter (`revalidate((ctx) => ctx.isAction(...))`). It returns a raw boolean, so
353
+ pair it with `|| undefined` for the usual "revalidate on match, else defer"
354
+ intent. It returns `false` on plain navigation and on non-matches, and resolves
355
+ the reference the same way the router derives `actionId` (`$id` in production,
356
+ `$$id` in dev), so it matches in both modes. The raw `actionId` string stays
357
+ available on the same context as an escape hatch.
358
+
359
+ ### Revalidation Contracts for Loader Dependencies
360
+
361
+ If a loader reads `ctx.get()` data produced by an outer handler/layout, share
362
+ the same named revalidation contract across producer and consumer segments.
220
363
 
221
364
  ```typescript
222
- route("products.detail", ProductHandler, () => [
223
- loader(ProductLoader, () => [
224
- // Cache this loader's results
225
- revalidate(({ currentParams, nextParams }) =>
226
- currentParams.slug !== nextParams.slug
227
- ),
365
+ // revalidation-contracts.ts
366
+ import * as AccountActions from "./actions/account";
367
+
368
+ // Match by reference with ctx.isAction() (rename-safe), and defer (|| undefined)
369
+ // so these contracts compose — a hard `false` would short-circuit the rest.
370
+ export const revalidateAccountScope = (ctx) =>
371
+ ctx.isAction(AccountActions) || undefined;
372
+
373
+ layout(AccountLayout, () => [
374
+ revalidate(revalidateAccountScope), // producer reruns
375
+ path("/account/orders", OrdersPage, { name: "account.orders" }, () => [
376
+ loader(OrdersLoader, () => [
377
+ revalidate(revalidateAccountScope), // consumer reruns
378
+ ]),
228
379
  ]),
229
- ])
380
+ ]);
381
+ ```
382
+
383
+ For segments that depend on multiple upstream domains, compose multiple
384
+ contracts on both sides.
385
+
386
+ To keep loader route trees concise, export helper wrappers:
387
+
388
+ ```typescript
389
+ import { revalidate } from "@rangojs/router";
390
+
391
+ export const revalidateAccount = () => [revalidate(revalidateAccountScope)];
392
+
393
+ layout(AccountLayout, () => [
394
+ revalidateAccount(),
395
+ path("/account/orders", OrdersPage, { name: "account.orders" }, () => [
396
+ loader(OrdersLoader, () => [revalidateAccount()]),
397
+ ]),
398
+ ]);
399
+ ```
400
+
401
+ ## Loaders: The Live Data Layer
402
+
403
+ Loaders are the live data layer of the router. They resolve fresh on every
404
+ request, even when the route's UI segments are served from cache. This is a
405
+ core design principle — route-level `cache()` caches rendered components but
406
+ never caches loader data. Loaders are excluded at storage time and re-resolved
407
+ on retrieval.
408
+
409
+ This means `cache()` gives you cached UI + fresh data by default. Pre-rendering
410
+ follows the same rule: at build time, loaders are skipped entirely (there is no
411
+ real request context), and at runtime the worker resolves them fresh against
412
+ the live database.
413
+
414
+ ### Parallel and streaming — latency overlaps first paint
415
+
416
+ Loaders do not block the page. As the render pass begins — the pass that route
417
+ middleware wraps, so loaders run right after middleware, not in a later
418
+ phase — every matched loader is kicked off **concurrently** (their promises start in the
419
+ same tick), and each result is **streamed** to the client as its own RSC Flight
420
+ chunk rather than awaited up front. Pair a loader with `loading()` (or a
421
+ client `<Suspense>`) and the shell paints immediately while the data streams in.
422
+
423
+ This is why **"cached UI still pays full data latency" is the wrong intuition**:
424
+ on a `cache()` hit the UI segments stream instantly from cache while the live
425
+ loaders resolve fresh **in parallel** — data latency _overlaps_ first paint
426
+ instead of being added on top of it. (Without a `loading()` / `<Suspense>`
427
+ boundary a parallel loader blocks its parent, so add one to keep the overlap.)
428
+
429
+ If you come from a framework where the loader is a blocking step that runs
430
+ before the response is built, this is the shift to internalize: here the
431
+ response starts streaming first and loader data fills in.
432
+
433
+ ### See it: `debugPerformance`
434
+
435
+ Turn on the per-request performance timeline early — it is the fastest way to
436
+ confirm loaders overlap rather than serialize, and to find the real bottleneck
437
+ locally instead of guessing:
438
+
439
+ ```typescript
440
+ const router = createRouter({ document: Document, debugPerformance: true });
441
+ ```
442
+
443
+ Or enable it per-request from middleware (e.g. only when `?debug` is present) by
444
+ calling `ctx.debugPerformance()` **before** `await next()`. Each HTML request
445
+ then prints a shared-axis waterfall (and emits a `Server-Timing` header):
446
+
447
+ ```
448
+ [RSC Perf] GET /product/widget (24.53ms)
449
+ start dur span timeline
450
+ 0.08ms 3.20ms route-matching |#####...................................|
451
+ 3.40ms 8.70ms ssr-render-html |.....##############.....................|
452
+ 3.42ms 11.90ms loader:…#ProductLoader |.....###################................|
453
+ 3.45ms 11.40ms loader:…#ReviewsLoader |.....##################.................|
454
+ 0.00ms 24.53ms handler:total |########################################|
455
+ ```
456
+
457
+ How to read it:
458
+
459
+ - **Humans:** scan the `#` bars on the shared axis. Bars that start at the same
460
+ offset and run side by side are executing **in parallel** — loaders should
461
+ overlap `ssr-render-html` / `render:total`, not sit alone to the right of
462
+ everything. A lone `loader:*` bar past the render bar is serialized latency to
463
+ chase. `handler:total` is the whole request; `render:total` is the render pass.
464
+ - **LLMs / programmatic:** read each row as `{ start, dur, label }`. A loader
465
+ overlaps paint when its `[start, start+dur]` interval intersects
466
+ `render:total` / `ssr-render-html`. Flag a regression when a `loader:*`
467
+ interval is **disjoint from and starts after** `render:total`, or when its
468
+ `dur` approaches `handler:total` — that loader is on the critical path instead
469
+ of overlapping it. Two `loader:*` rows with near-equal `start` confirm
470
+ parallel execution.
471
+
472
+ ### Opting a Loader into Caching
473
+
474
+ To cache a specific loader's data, attach a `cache()` child:
230
475
 
231
- // Or use cache boundaries
232
- cache({ ttl: 60, swr: 300 }, () => [
476
+ ```typescript
477
+ loader(ProductLoader, () => [cache({ ttl: 300 })]),
478
+ ```
479
+
480
+ The loader's data is cached independently from the route's segment cache,
481
+ using the same `SegmentCacheStore` (app-level or per-loader override).
482
+
483
+ Values are serialized through RSC Flight, so loaders can return ReactNode,
484
+ Promises, null, and any RSC-serializable type — all round-trip correctly
485
+ through the cache.
486
+
487
+ ### Cache Key
488
+
489
+ The default cache key is `loader:{loaderId}:{pathname}:{sortedParams}`.
490
+ This can be customized at two levels:
491
+
492
+ ```typescript
493
+ // Full override — key function replaces the default entirely
494
+ loader(ProductLoader, () => [
495
+ cache({
496
+ ttl: 300,
497
+ key: (ctx) => `product:${ctx.params.slug}:${cookies().get("locale")?.value ?? "en"}`,
498
+ }),
499
+ ]),
500
+
501
+ // Store-level keyGenerator — modifies the default key (e.g., adds a region prefix)
502
+ // Set in the store configuration, applies to all entries in that store
503
+ ```
504
+
505
+ Resolution priority (same as route-level `cache()`):
506
+
507
+ 1. `key(ctx)` from cache options — full override
508
+ 2. `store.keyGenerator(ctx, defaultKey)` — store-level modification
509
+ 3. Default key — `loader:{id}:{pathname}:{params}`
510
+
511
+ If a custom key function throws, it falls back to the default key silently
512
+ (logged to console.error).
513
+
514
+ ### Tags for Invalidation
515
+
516
+ ```typescript
517
+ // Static tags
518
+ loader(ProductLoader, () => [
519
+ cache({ ttl: 300, tags: ["products", "catalog"] }),
520
+ ]),
521
+
522
+ // Dynamic tags
523
+ loader(ProductLoader, () => [
524
+ cache({
525
+ ttl: 300,
526
+ tags: (ctx) => [`product:${ctx.params.slug}`, "products"],
527
+ }),
528
+ ]),
529
+ ```
530
+
531
+ ### Stale-While-Revalidate
532
+
533
+ ```typescript
534
+ loader(ProductLoader, () => [
535
+ cache({ ttl: 60, swr: 300 }),
536
+ ]),
537
+ ```
538
+
539
+ During the SWR window (60-360s), stale data is returned immediately while
540
+ fresh data is fetched in the background via `waitUntil`. After the SWR window
541
+ expires (360s+), the entry is treated as a cache miss.
542
+
543
+ ### Conditional Caching
544
+
545
+ Skip the cache at runtime based on request properties:
546
+
547
+ ```typescript
548
+ loader(ProductLoader, () => [
549
+ cache({
550
+ ttl: 300,
551
+ condition: (ctx) => !ctx.request.headers.has("authorization"),
552
+ }),
553
+ ]),
554
+ ```
555
+
556
+ When `condition` returns false, the loader runs fresh and the cache is bypassed
557
+ entirely (no read, no write).
558
+
559
+ ### Per-Loader Store Override
560
+
561
+ ```typescript
562
+ const hotStore = new MemorySegmentCacheStore({ defaults: { ttl: 10 } });
563
+
564
+ loader(PricingLoader, () => [
565
+ cache({ store: hotStore }),
566
+ ]),
567
+ ```
568
+
569
+ Without an explicit store, the loader uses the app-level store from the
570
+ handler config (`cache.store`).
571
+
572
+ ## Multiple Loaders
573
+
574
+ Routes can have multiple loaders that run in parallel:
575
+
576
+ ```typescript
577
+ path("/product/:slug", ProductPage, { name: "product" }, () => [
233
578
  loader(ProductLoader),
234
- route("products.detail", ProductHandler),
579
+ loader(RelatedProductsLoader),
580
+ loader(ReviewsLoader),
581
+ ]);
582
+ ```
583
+
584
+ ## Layout Loaders
585
+
586
+ Loaders on layouts are shared by all child routes:
587
+
588
+ ```typescript
589
+ layout(<ShopLayout />, () => [
590
+ // These loaders are available to all shop routes
591
+ loader(CartLoader),
592
+ loader(CategoriesLoader),
593
+
594
+ path("/shop", ShopIndex, { name: "index" }),
595
+ path("/shop/product/:slug", ProductPage, { name: "product" }),
235
596
  ])
236
597
  ```
237
598
 
238
- ## Loader Error Handling
599
+ ## Passing Loaders as Props
600
+
601
+ Loaders can be passed as props from server to client components. RSC serialization
602
+ uses `toJSON()` to send only `{ __brand, $$id }` — the loader function is stripped.
239
603
 
240
604
  ```typescript
241
- export const ProductLoader = createLoader(async (ctx) => {
242
- try {
243
- const product = await db.products.findUnique({
244
- where: { slug: ctx.params.slug },
245
- });
246
-
247
- if (!product) {
248
- throw notFound("Product not found");
249
- }
250
-
251
- return product;
252
- } catch (error) {
253
- if (error instanceof DatabaseError) {
254
- throw new Error("Failed to load product");
255
- }
256
- throw error;
257
- }
258
- });
605
+ // Server component (route handler)
606
+ import { SlowLoader } from "../loaders";
259
607
 
260
- // Handle in route
261
- route("products.detail", ProductHandler, () => [
262
- loader(ProductLoader),
263
- errorBoundary(({ error, reset }) => (
264
- <div>
265
- <p>Error loading product: {error.message}</p>
266
- <button onClick={reset}>Retry</button>
267
- </div>
268
- )),
608
+ path("/dashboard", () => <DashboardContent loader={SlowLoader} />, { name: "dashboard" }, () => [
609
+ loader(SlowLoader),
610
+ loading(<DashboardSkeleton />),
269
611
  ])
612
+
613
+ // Client component — use typeof for type-safe props
614
+ "use client";
615
+ import { useLoader } from "@rangojs/router/client";
616
+ import type { SlowLoader } from "../loaders";
617
+
618
+ function DashboardContent({ loader }: { loader: typeof SlowLoader }) {
619
+ const { data } = useLoader(loader);
620
+ return <div>{data.message}</div>;
621
+ }
270
622
  ```
271
623
 
272
- ## Parallel Slot Loaders
624
+ Use `typeof MyLoader` for the prop type — it infers the full generic automatically.
625
+
626
+ ## Streaming with Suspense
627
+
628
+ Loaders stream data. Use Suspense for loading states:
273
629
 
274
630
  ```typescript
275
- parallel(
276
- {
277
- "@sidebar": async (ctx) => {
278
- const categories = await ctx.use(CategoriesLoader);
279
- return <CategorySidebar categories={categories} />;
280
- },
281
- },
282
- () => [
283
- loader(CategoriesLoader),
284
- loading(<SidebarSkeleton />),
285
- revalidate(({ actionId }) => actionId?.includes("category") ?? false),
286
- ]
287
- )
631
+ // In route definition
632
+ path("/product/:slug", ProductPage, { name: "product" }, () => [
633
+ loader(ProductLoader),
634
+ loading(<ProductSkeleton />), // Shows while loader streams
635
+ ])
636
+
637
+ // Or in component
638
+ function ProductPage() {
639
+ return (
640
+ <Suspense fallback={<ProductSkeleton />}>
641
+ <ProductDetails />
642
+ </Suspense>
643
+ );
644
+ }
288
645
  ```
289
646
 
290
- ## Loader Composition
647
+ ## Fetchable Loaders
648
+
649
+ By default, loaders only run during SSR and navigation. Pass `true` as the second
650
+ argument to `createLoader` to make a loader **fetchable** — callable from the client
651
+ via `useFetchLoader()` and `load()`:
291
652
 
292
653
  ```typescript
293
- // Base loader
294
- export const UserLoader = createLoader(async (ctx) => {
295
- return db.users.findUnique({ where: { id: ctx.get("userId") } });
296
- });
654
+ import { createLoader } from "@rangojs/router";
297
655
 
298
- // Composed loader
299
- export const UserWithOrdersLoader = createLoader(async (ctx) => {
300
- const user = await ctx.use(UserLoader);
301
- const orders = await db.orders.findMany({
302
- where: { userId: user.id },
303
- });
656
+ export const SearchLoader = createLoader(async (ctx) => {
657
+ "use server";
304
658
 
305
- return { user, orders };
306
- });
659
+ const query = ctx.params.query ?? "";
660
+ const results = await ctx.env.DB.prepare(
661
+ "SELECT * FROM products WHERE name LIKE ?",
662
+ )
663
+ .bind(`%${query}%`)
664
+ .all();
665
+
666
+ return { results: results.results ?? [] };
667
+ }, true); // true = fetchable
307
668
  ```
308
669
 
309
- ## Loader Type Safety
670
+ ### Fetchable Loader with Middleware
671
+
672
+ Pass an options object instead of `true` to attach per-loader middleware.
673
+ This middleware runs only on `_rsc_loader` fetch requests (client-side
674
+ `load()` / `useFetchLoader()` calls), not during SSR `ctx.use()` execution:
310
675
 
311
676
  ```typescript
312
- // Loader type is inferred
313
- export const ProductLoader = createLoader(async (ctx) => {
314
- return { id: "1", name: "Widget", price: 99 };
315
- });
677
+ import { createLoader } from "@rangojs/router";
678
+ import { authMiddleware } from "../middleware/auth";
679
+ import { rateLimitMiddleware } from "../middleware/rate-limit";
316
680
 
317
- // In handler - type is { id: string; name: string; price: number }
318
- const product = await ctx.use(ProductLoader);
681
+ export const ProtectedLoader = createLoader(
682
+ async (ctx) => {
683
+ "use server";
319
684
 
320
- // In client - same type
321
- const { data } = useLoader(ProductLoader);
322
- // data: { id: string; name: string; price: number }
685
+ const user = ctx.get("user");
686
+ return { orders: await db.orders.list(user.id) };
687
+ },
688
+ { middleware: [authMiddleware, rateLimitMiddleware] },
689
+ );
323
690
  ```
324
691
 
325
- ## Common Patterns
692
+ The middleware uses the same `MiddlewareFn` signature as route/app middleware,
693
+ so you can reuse existing middleware functions directly.
694
+
695
+ Fetchable loaders support both GET and POST (PUT, PATCH, DELETE) from the client.
696
+ The `load()` function auto-detects the body type:
326
697
 
327
- ### List with pagination
698
+ - **JSON body** (`body: { ... }`) — sent as `application/json`, available as `ctx.body`
699
+ - **FormData body** (`body: formData`) — sent as `multipart/form-data`, available as `ctx.formData`
700
+
701
+ ### Mutation Context
702
+
703
+ When a fetchable loader receives a POST/PUT/PATCH/DELETE request, the context
704
+ includes additional fields depending on the body type:
328
705
 
329
706
  ```typescript
330
- export const ProductListLoader = createLoader(async (ctx) => {
331
- const page = parseInt(ctx.query.page ?? "1");
332
- const limit = 20;
333
-
334
- const [products, total] = await Promise.all([
335
- db.products.findMany({
336
- skip: (page - 1) * limit,
337
- take: limit,
338
- }),
339
- db.products.count(),
340
- ]);
707
+ export const MutationLoader = createLoader(async (ctx) => {
708
+ "use server";
341
709
 
342
- return {
343
- products,
344
- pagination: {
345
- page,
346
- totalPages: Math.ceil(total / limit),
347
- total,
348
- },
349
- };
350
- });
710
+ // JSON body — available as ctx.body (parsed object)
711
+ const data = ctx.body as { name: string; email: string };
712
+
713
+ // FormData body — available as ctx.formData
714
+ const file = ctx.formData?.get("file") as File | null;
715
+ const name = ctx.formData?.get("name") as string | null;
716
+
717
+ // Route params are always available
718
+ const { slug } = ctx.params;
719
+
720
+ return { success: true };
721
+ }, true);
351
722
  ```
352
723
 
353
- ### Conditional loading
724
+ ### File Upload Example
354
725
 
355
726
  ```typescript
356
- export const AdminDataLoader = createLoader(async (ctx) => {
357
- const user = ctx.get("user");
727
+ // loaders/upload.ts
728
+ import { createLoader } from "@rangojs/router";
729
+
730
+ export const FileUploadLoader = createLoader(async (ctx) => {
731
+ "use server";
358
732
 
359
- if (!user || user.role !== "admin") {
360
- return null;
733
+ const file = ctx.formData?.get("file") as File | null;
734
+ if (file && file.size > 0) {
735
+ // Save to R2, D1, etc.
736
+ await ctx.env.BUCKET.put(file.name, file.stream());
737
+ return { uploaded: { name: file.name, size: file.size, type: file.type } };
361
738
  }
739
+ return { uploaded: null };
740
+ }, true);
741
+ ```
742
+
743
+ Client usage — see `/hooks useFetchLoader` for the full client-side pattern.
744
+
745
+ > **Refetch sharing**: when the loader is registered on the route via
746
+ > `loader()`, a plain `load()` call (no `params`, no `body`) broadcasts
747
+ > the new value to every component reading the same loader id —
748
+ > `useLoader` reads in layouts, pages, and parallel slots all converge.
749
+ > Calls with `params` or a non-GET method stay local to the call site.
750
+ > See `/hooks` → "Shared refetch behavior" for the full contract.
751
+
752
+ ## Complete Example
753
+
754
+ ```typescript
755
+ // loaders/shop.ts
756
+ import { createLoader } from "@rangojs/router";
757
+
758
+ export const ProductLoader = createLoader(async (ctx) => {
759
+ "use server";
362
760
 
363
- return db.adminStats.get();
761
+ const product = await ctx.env.DB
762
+ .prepare("SELECT * FROM products WHERE slug = ?")
763
+ .bind(ctx.params.slug)
764
+ .first();
765
+
766
+ if (!product) {
767
+ notFound("Product not found");
768
+ }
769
+
770
+ return { product };
364
771
  });
772
+
773
+ export const CartLoader = createLoader(async (ctx) => {
774
+ "use server";
775
+
776
+ const user = ctx.get("user");
777
+ if (!user) return { cart: null };
778
+
779
+ const cart = await ctx.env.KV.get(`cart:${user.id}`, "json");
780
+ return { cart };
781
+ });
782
+
783
+ // urls.tsx — register loaders in the DSL
784
+ export const urlpatterns = urls(({ path, layout, loader, loading, cache, revalidate }) => [
785
+ layout(<ShopLayout />, () => [
786
+ loader(CartLoader, () => [
787
+ revalidate(({ actionId }) => actionId?.includes("Cart") || undefined),
788
+ ]),
789
+
790
+ path("/shop/product/:slug", ProductPage, { name: "product" }, () => [
791
+ loader(ProductLoader, () => [cache({ ttl: 60 })]),
792
+ loading(<ProductSkeleton />),
793
+ ]),
794
+ ]),
795
+ ]);
796
+
797
+ // components/ProductDetails.tsx — consume in client component
798
+ "use client";
799
+ import { useLoader } from "@rangojs/router/client";
800
+ import { ProductLoader, CartLoader } from "./loaders/shop";
801
+
802
+ function ProductDetails() {
803
+ const { data: { product } } = useLoader(ProductLoader);
804
+ const { data: { cart } } = useLoader(CartLoader);
805
+
806
+ return (
807
+ <div>
808
+ <h1>{product.name}</h1>
809
+ <AddToCartButton
810
+ productId={product.id}
811
+ inCart={cart?.items.includes(product.id)}
812
+ />
813
+ </div>
814
+ );
815
+ }
365
816
  ```