@rangojs/router 0.0.0-experimental.19 → 0.0.0-experimental.190fb30d

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 (1254) hide show
  1. package/AGENTS.md +13 -0
  2. package/README.md +304 -708
  3. package/dist/__internal.d.ts +83 -0
  4. package/dist/__internal.d.ts.map +1 -0
  5. package/dist/__internal.js +19 -0
  6. package/dist/__internal.js.map +1 -0
  7. package/dist/__mocks__/version.d.ts +7 -0
  8. package/dist/__mocks__/version.d.ts.map +1 -0
  9. package/dist/__mocks__/version.js +7 -0
  10. package/dist/__mocks__/version.js.map +1 -0
  11. package/dist/__tests__/client-href.test.d.ts +2 -0
  12. package/dist/__tests__/client-href.test.d.ts.map +1 -0
  13. package/dist/__tests__/client-href.test.js +74 -0
  14. package/dist/__tests__/client-href.test.js.map +1 -0
  15. package/dist/__tests__/component-utils.test.d.ts +2 -0
  16. package/dist/__tests__/component-utils.test.d.ts.map +1 -0
  17. package/dist/__tests__/component-utils.test.js +51 -0
  18. package/dist/__tests__/component-utils.test.js.map +1 -0
  19. package/dist/__tests__/event-controller.test.d.ts +2 -0
  20. package/dist/__tests__/event-controller.test.d.ts.map +1 -0
  21. package/dist/__tests__/event-controller.test.js +538 -0
  22. package/dist/__tests__/event-controller.test.js.map +1 -0
  23. package/dist/__tests__/helpers/route-tree.d.ts +118 -0
  24. package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
  25. package/dist/__tests__/helpers/route-tree.js +374 -0
  26. package/dist/__tests__/helpers/route-tree.js.map +1 -0
  27. package/dist/__tests__/match-result.test.d.ts +2 -0
  28. package/dist/__tests__/match-result.test.d.ts.map +1 -0
  29. package/dist/__tests__/match-result.test.js +154 -0
  30. package/dist/__tests__/match-result.test.js.map +1 -0
  31. package/dist/__tests__/navigation-store.test.d.ts +2 -0
  32. package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
  33. package/dist/__tests__/navigation-store.test.js +440 -0
  34. package/dist/__tests__/navigation-store.test.js.map +1 -0
  35. package/dist/__tests__/partial-update.test.d.ts +2 -0
  36. package/dist/__tests__/partial-update.test.d.ts.map +1 -0
  37. package/dist/__tests__/partial-update.test.js +1009 -0
  38. package/dist/__tests__/partial-update.test.js.map +1 -0
  39. package/dist/__tests__/reverse-types.test.d.ts +8 -0
  40. package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
  41. package/dist/__tests__/reverse-types.test.js +656 -0
  42. package/dist/__tests__/reverse-types.test.js.map +1 -0
  43. package/dist/__tests__/route-definition.test.d.ts +2 -0
  44. package/dist/__tests__/route-definition.test.d.ts.map +1 -0
  45. package/dist/__tests__/route-definition.test.js +55 -0
  46. package/dist/__tests__/route-definition.test.js.map +1 -0
  47. package/dist/__tests__/router-helpers.test.d.ts +2 -0
  48. package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
  49. package/dist/__tests__/router-helpers.test.js +377 -0
  50. package/dist/__tests__/router-helpers.test.js.map +1 -0
  51. package/dist/__tests__/router-integration-2.test.d.ts +2 -0
  52. package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
  53. package/dist/__tests__/router-integration-2.test.js +426 -0
  54. package/dist/__tests__/router-integration-2.test.js.map +1 -0
  55. package/dist/__tests__/router-integration.test.d.ts +2 -0
  56. package/dist/__tests__/router-integration.test.d.ts.map +1 -0
  57. package/dist/__tests__/router-integration.test.js +1051 -0
  58. package/dist/__tests__/router-integration.test.js.map +1 -0
  59. package/dist/__tests__/search-params.test.d.ts +5 -0
  60. package/dist/__tests__/search-params.test.d.ts.map +1 -0
  61. package/dist/__tests__/search-params.test.js +306 -0
  62. package/dist/__tests__/search-params.test.js.map +1 -0
  63. package/dist/__tests__/segment-system.test.d.ts +2 -0
  64. package/dist/__tests__/segment-system.test.d.ts.map +1 -0
  65. package/dist/__tests__/segment-system.test.js +627 -0
  66. package/dist/__tests__/segment-system.test.js.map +1 -0
  67. package/dist/__tests__/static-handler-types.test.d.ts +8 -0
  68. package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
  69. package/dist/__tests__/static-handler-types.test.js +63 -0
  70. package/dist/__tests__/static-handler-types.test.js.map +1 -0
  71. package/dist/__tests__/urls.test.d.ts +2 -0
  72. package/dist/__tests__/urls.test.d.ts.map +1 -0
  73. package/dist/__tests__/urls.test.js +421 -0
  74. package/dist/__tests__/urls.test.js.map +1 -0
  75. package/dist/__tests__/use-mount.test.d.ts +2 -0
  76. package/dist/__tests__/use-mount.test.d.ts.map +1 -0
  77. package/dist/__tests__/use-mount.test.js +35 -0
  78. package/dist/__tests__/use-mount.test.js.map +1 -0
  79. package/dist/bin/rango.d.ts +2 -0
  80. package/dist/bin/rango.d.ts.map +1 -0
  81. package/dist/bin/rango.js +822 -182
  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/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -28
  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/{src/handles/index.ts → dist/handles/index.js} +1 -1
  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/dist/href-context.d.ts +29 -0
  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/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -10
  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/testing/vitest.js +82 -0
  712. package/dist/theme/ThemeProvider.d.ts +20 -0
  713. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  714. package/dist/theme/ThemeProvider.js +240 -0
  715. package/dist/theme/ThemeProvider.js.map +1 -0
  716. package/dist/theme/ThemeScript.d.ts +48 -0
  717. package/dist/theme/ThemeScript.d.ts.map +1 -0
  718. package/dist/theme/ThemeScript.js +13 -0
  719. package/dist/theme/ThemeScript.js.map +1 -0
  720. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  721. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  722. package/dist/theme/__tests__/theme.test.js +103 -0
  723. package/dist/theme/__tests__/theme.test.js.map +1 -0
  724. package/dist/theme/constants.d.ts +29 -0
  725. package/dist/theme/constants.d.ts.map +1 -0
  726. package/dist/theme/constants.js +48 -0
  727. package/dist/theme/constants.js.map +1 -0
  728. package/dist/theme/index.d.ts +31 -0
  729. package/dist/theme/index.d.ts.map +1 -0
  730. package/dist/theme/index.js +36 -0
  731. package/dist/theme/index.js.map +1 -0
  732. package/dist/theme/theme-context.d.ts +40 -0
  733. package/dist/theme/theme-context.d.ts.map +1 -0
  734. package/dist/theme/theme-context.js +60 -0
  735. package/dist/theme/theme-context.js.map +1 -0
  736. package/dist/theme/theme-script.d.ts +27 -0
  737. package/dist/theme/theme-script.d.ts.map +1 -0
  738. package/dist/theme/theme-script.js +147 -0
  739. package/dist/theme/theme-script.js.map +1 -0
  740. package/dist/theme/types.d.ts +163 -0
  741. package/dist/theme/types.d.ts.map +1 -0
  742. package/dist/theme/types.js +11 -0
  743. package/dist/theme/types.js.map +1 -0
  744. package/dist/theme/use-theme.d.ts +12 -0
  745. package/dist/theme/use-theme.d.ts.map +1 -0
  746. package/dist/theme/use-theme.js +40 -0
  747. package/dist/theme/use-theme.js.map +1 -0
  748. package/dist/types.d.ts +1479 -0
  749. package/dist/types.d.ts.map +1 -0
  750. package/dist/types.js +10 -0
  751. package/dist/types.js.map +1 -0
  752. package/dist/urls.d.ts +441 -0
  753. package/dist/urls.d.ts.map +1 -0
  754. package/dist/urls.gen.d.ts +8 -0
  755. package/dist/urls.gen.d.ts.map +1 -0
  756. package/dist/urls.gen.js +8 -0
  757. package/dist/urls.gen.js.map +1 -0
  758. package/dist/urls.js +443 -0
  759. package/dist/urls.js.map +1 -0
  760. package/dist/use-loader.d.ts +127 -0
  761. package/dist/use-loader.d.ts.map +1 -0
  762. package/dist/use-loader.js +237 -0
  763. package/dist/use-loader.js.map +1 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  767. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  771. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  775. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  777. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  779. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  780. package/dist/vite/ast-handler-extract.d.ts +49 -0
  781. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  782. package/dist/vite/ast-handler-extract.js +249 -0
  783. package/dist/vite/ast-handler-extract.js.map +1 -0
  784. package/dist/vite/expose-action-id.d.ts +19 -0
  785. package/dist/vite/expose-action-id.d.ts.map +1 -0
  786. package/dist/vite/expose-action-id.js +250 -0
  787. package/dist/vite/expose-action-id.js.map +1 -0
  788. package/dist/vite/expose-id-utils.d.ts +69 -0
  789. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  790. package/dist/vite/expose-id-utils.js +289 -0
  791. package/dist/vite/expose-id-utils.js.map +1 -0
  792. package/dist/vite/expose-internal-ids.d.ts +22 -0
  793. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  794. package/dist/vite/expose-internal-ids.js +886 -0
  795. package/dist/vite/expose-internal-ids.js.map +1 -0
  796. package/dist/vite/index.d.ts +149 -0
  797. package/dist/vite/index.d.ts.map +1 -0
  798. package/dist/vite/index.js +4644 -1433
  799. package/dist/vite/index.js.bak +5448 -0
  800. package/dist/vite/index.js.map +1 -0
  801. package/dist/vite/index.named-routes.gen.ts +103 -0
  802. package/dist/vite/package-resolution.d.ts +43 -0
  803. package/dist/vite/package-resolution.d.ts.map +1 -0
  804. package/dist/vite/package-resolution.js +112 -0
  805. package/dist/vite/package-resolution.js.map +1 -0
  806. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  807. package/dist/vite/virtual-entries.d.ts +25 -0
  808. package/dist/vite/virtual-entries.d.ts.map +1 -0
  809. package/dist/vite/virtual-entries.js +110 -0
  810. package/dist/vite/virtual-entries.js.map +1 -0
  811. package/package.json +87 -16
  812. package/skills/api-client/SKILL.md +211 -0
  813. package/skills/breadcrumbs/SKILL.md +329 -0
  814. package/skills/bundle-analysis/SKILL.md +159 -0
  815. package/skills/cache-guide/SKILL.md +251 -24
  816. package/skills/caching/SKILL.md +379 -21
  817. package/skills/catalog.json +271 -0
  818. package/skills/comparison/SKILL.md +50 -0
  819. package/skills/comparison/agents/openai.yaml +4 -0
  820. package/skills/comparison/references/framework-comparison.md +837 -0
  821. package/skills/composability/SKILL.md +110 -4
  822. package/skills/css/SKILL.md +76 -0
  823. package/skills/debug-manifest/SKILL.md +5 -3
  824. package/skills/defer-hydration/SKILL.md +235 -0
  825. package/skills/document-cache/SKILL.md +87 -56
  826. package/skills/fonts/SKILL.md +1 -1
  827. package/skills/handler-use/SKILL.md +364 -0
  828. package/skills/hooks/SKILL.md +76 -692
  829. package/skills/hooks/data.md +273 -0
  830. package/skills/hooks/handle-and-actions.md +103 -0
  831. package/skills/hooks/navigation.md +110 -0
  832. package/skills/hooks/outlets.md +41 -0
  833. package/skills/hooks/state.md +228 -0
  834. package/skills/hooks/urls.md +135 -0
  835. package/skills/host-router/SKILL.md +320 -0
  836. package/skills/i18n/SKILL.md +276 -0
  837. package/skills/intercept/SKILL.md +94 -18
  838. package/skills/layout/SKILL.md +62 -19
  839. package/skills/links/SKILL.md +249 -17
  840. package/skills/loader/SKILL.md +320 -32
  841. package/skills/middleware/SKILL.md +59 -16
  842. package/skills/migrate-nextjs/SKILL.md +745 -0
  843. package/skills/migrate-react-router/SKILL.md +153 -0
  844. package/skills/migrate-react-router/cloudflare-workers.md +129 -0
  845. package/skills/migrate-react-router/component-migration.md +196 -0
  846. package/skills/migrate-react-router/data-and-actions.md +225 -0
  847. package/skills/migrate-react-router/route-mapping.md +271 -0
  848. package/skills/mime-routes/SKILL.md +29 -2
  849. package/skills/observability/SKILL.md +202 -0
  850. package/skills/parallel/SKILL.md +225 -10
  851. package/skills/ppr/SKILL.md +618 -0
  852. package/skills/prerender/SKILL.md +180 -126
  853. package/skills/rango/SKILL.md +318 -25
  854. package/skills/react-compiler/SKILL.md +168 -0
  855. package/skills/response-routes/SKILL.md +138 -49
  856. package/skills/route/SKILL.md +175 -13
  857. package/skills/router-setup/SKILL.md +139 -14
  858. package/skills/scripts/SKILL.md +179 -0
  859. package/skills/server-actions/SKILL.md +776 -0
  860. package/skills/shell-manifest/SKILL.md +185 -0
  861. package/skills/streams-and-websockets/SKILL.md +283 -0
  862. package/skills/tailwind/SKILL.md +28 -4
  863. package/skills/testing/SKILL.md +126 -222
  864. package/skills/testing/bindings.md +103 -0
  865. package/skills/testing/cache-prerender.md +127 -0
  866. package/skills/testing/client-components.md +124 -0
  867. package/skills/testing/e2e-parity.md +125 -0
  868. package/skills/testing/flight.md +91 -0
  869. package/skills/testing/handles.md +131 -0
  870. package/skills/testing/loader.md +128 -0
  871. package/skills/testing/middleware.md +99 -0
  872. package/skills/testing/render-handler.md +122 -0
  873. package/skills/testing/response-routes.md +95 -0
  874. package/skills/testing/reverse-and-types.md +85 -0
  875. package/skills/testing/server-actions.md +107 -0
  876. package/skills/testing/server-tree.md +128 -0
  877. package/skills/testing/setup.md +123 -0
  878. package/skills/theme/SKILL.md +1 -1
  879. package/skills/typesafety/SKILL.md +45 -614
  880. package/skills/typesafety/env-and-bindings.md +254 -0
  881. package/skills/typesafety/generated-files-and-cli.md +335 -0
  882. package/skills/typesafety/params-and-search.md +153 -0
  883. package/skills/typesafety/route-types.md +209 -0
  884. package/skills/use-cache/SKILL.md +74 -15
  885. package/skills/vercel/SKILL.md +128 -0
  886. package/skills/view-transitions/SKILL.md +337 -0
  887. package/src/__augment-tests__/augment.ts +81 -0
  888. package/src/__augment-tests__/augmented.check.ts +116 -0
  889. package/src/__internal.ts +67 -40
  890. package/src/bin/rango.ts +18 -0
  891. package/src/browser/action-coordinator.ts +53 -36
  892. package/src/browser/action-fence.ts +47 -0
  893. package/src/browser/app-shell.ts +39 -0
  894. package/src/browser/app-version.ts +14 -0
  895. package/src/browser/connection-warmup.ts +134 -0
  896. package/src/browser/cookie-name.ts +140 -0
  897. package/src/browser/event-controller.ts +257 -158
  898. package/src/browser/history-state.ts +21 -0
  899. package/src/browser/index.ts +3 -3
  900. package/src/browser/invalidate-client-cache.ts +52 -0
  901. package/src/browser/link-interceptor.ts +4 -0
  902. package/src/browser/logging.ts +28 -0
  903. package/src/browser/merge-segment-loaders.ts +6 -4
  904. package/src/browser/navigation-bridge.ts +222 -38
  905. package/src/browser/navigation-client.ts +233 -58
  906. package/src/browser/navigation-store-handle.ts +38 -0
  907. package/src/browser/navigation-store.ts +203 -80
  908. package/src/browser/navigation-transaction.ts +18 -66
  909. package/src/browser/network-error-handler.ts +34 -7
  910. package/src/browser/partial-update.ts +242 -126
  911. package/src/browser/prefetch/cache.ts +344 -30
  912. package/src/browser/prefetch/fetch.ts +373 -48
  913. package/src/browser/prefetch/policy.ts +6 -0
  914. package/src/browser/prefetch/queue.ts +144 -23
  915. package/src/browser/prefetch/resource-ready.ts +77 -0
  916. package/src/browser/rango-state.ts +158 -76
  917. package/src/browser/react/Link.tsx +135 -18
  918. package/src/browser/react/NavigationProvider.tsx +240 -122
  919. package/src/browser/react/ScrollRestoration.tsx +10 -6
  920. package/src/browser/react/context.ts +7 -2
  921. package/src/browser/react/filter-segment-order.ts +66 -7
  922. package/src/browser/react/index.ts +0 -48
  923. package/src/browser/react/location-state-shared.ts +178 -8
  924. package/src/browser/react/location-state.ts +39 -14
  925. package/src/browser/react/use-action.ts +6 -15
  926. package/src/browser/react/use-handle.ts +23 -69
  927. package/src/browser/react/use-href.tsx +8 -1
  928. package/src/browser/react/use-link-status.ts +33 -8
  929. package/src/browser/react/use-navigation.ts +32 -7
  930. package/src/browser/react/use-params.ts +20 -10
  931. package/src/browser/react/use-reverse.ts +106 -0
  932. package/src/browser/react/use-router.ts +46 -11
  933. package/src/browser/react/use-search-params.ts +0 -5
  934. package/src/browser/react/use-segments.ts +11 -21
  935. package/src/browser/response-adapter.ts +99 -8
  936. package/src/browser/rsc-router.tsx +276 -75
  937. package/src/browser/scroll-restoration.ts +61 -47
  938. package/src/browser/segment-reconciler.ts +44 -7
  939. package/src/browser/segment-structure-assert.ts +2 -2
  940. package/src/browser/server-action-bridge.ts +631 -442
  941. package/src/browser/types.ts +160 -12
  942. package/src/browser/validate-redirect-origin.ts +43 -16
  943. package/src/build/collect-fallback-refs.ts +107 -0
  944. package/src/build/generate-manifest.ts +207 -158
  945. package/src/build/generate-route-types.ts +8 -1
  946. package/src/build/index.ts +11 -3
  947. package/src/build/prefix-tree-utils.ts +123 -0
  948. package/src/build/route-trie.ts +215 -42
  949. package/src/build/route-types/ast-route-extraction.ts +15 -8
  950. package/src/build/route-types/codegen.ts +16 -5
  951. package/src/build/route-types/include-resolution.ts +464 -63
  952. package/src/build/route-types/param-extraction.ts +6 -3
  953. package/src/build/route-types/per-module-writer.ts +22 -6
  954. package/src/build/route-types/router-processing.ts +442 -106
  955. package/src/build/route-types/scan-filter.ts +9 -2
  956. package/src/build/route-types/source-scan.ts +216 -0
  957. package/src/build/runtime-discovery.ts +13 -21
  958. package/src/cache/cache-error.ts +104 -0
  959. package/src/cache/cache-key-utils.ts +58 -13
  960. package/src/cache/cache-policy.ts +108 -34
  961. package/src/cache/cache-runtime.ts +454 -97
  962. package/src/cache/cache-scope.ts +235 -103
  963. package/src/cache/cache-tag.ts +149 -0
  964. package/src/cache/cf/cf-base64.ts +33 -0
  965. package/src/cache/cf/cf-cache-constants.ts +127 -0
  966. package/src/cache/cf/cf-cache-store.ts +2446 -170
  967. package/src/cache/cf/cf-cache-types.ts +349 -0
  968. package/src/cache/cf/cf-kv-utils.ts +46 -0
  969. package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
  970. package/src/cache/cf/index.ts +11 -17
  971. package/src/cache/document-cache.ts +144 -49
  972. package/src/cache/handle-snapshot.ts +70 -0
  973. package/src/cache/index.ts +24 -20
  974. package/src/cache/memory-segment-store.ts +243 -37
  975. package/src/cache/profile-registry.ts +46 -31
  976. package/src/cache/read-through-swr.ts +56 -12
  977. package/src/cache/segment-codec.ts +13 -21
  978. package/src/cache/shell-snapshot.ts +417 -0
  979. package/src/cache/tag-invalidation.ts +230 -0
  980. package/src/cache/taint.ts +55 -0
  981. package/src/cache/types.ts +194 -99
  982. package/src/cache/vercel/index.ts +11 -0
  983. package/src/cache/vercel/vercel-cache-store.ts +1132 -0
  984. package/src/client.rsc.tsx +42 -21
  985. package/src/client.tsx +117 -336
  986. package/src/cloudflare/index.ts +11 -0
  987. package/src/cloudflare/tracing.ts +108 -0
  988. package/src/component-utils.ts +19 -0
  989. package/src/components/DefaultDocument.tsx +8 -2
  990. package/src/context-var.ts +84 -2
  991. package/src/debug.ts +2 -2
  992. package/src/decode-loader-results.ts +52 -0
  993. package/src/defer.ts +185 -0
  994. package/src/deps/ssr.ts +0 -1
  995. package/src/encode-kv.ts +49 -0
  996. package/src/errors.ts +30 -4
  997. package/src/escape-script.ts +52 -0
  998. package/src/handle.ts +104 -34
  999. package/src/handles/MetaTags.tsx +24 -53
  1000. package/src/handles/Scripts.tsx +183 -0
  1001. package/src/handles/breadcrumbs.ts +93 -0
  1002. package/src/handles/deferred-resolution.ts +127 -0
  1003. package/src/handles/is-thenable.ts +18 -0
  1004. package/src/handles/meta.ts +14 -40
  1005. package/src/handles/script.ts +244 -0
  1006. package/src/host/cookie-handler.ts +9 -60
  1007. package/src/host/errors.ts +13 -22
  1008. package/src/host/index.ts +9 -5
  1009. package/src/host/pattern-matcher.ts +23 -52
  1010. package/src/host/router.ts +107 -99
  1011. package/src/host/testing.ts +40 -27
  1012. package/src/host/types.ts +37 -4
  1013. package/src/host/utils.ts +1 -1
  1014. package/src/href-client.ts +137 -22
  1015. package/src/index.rsc.ts +86 -30
  1016. package/src/index.ts +158 -68
  1017. package/src/internal-debug.ts +11 -10
  1018. package/src/loader-store.ts +500 -0
  1019. package/src/loader.rsc.ts +20 -13
  1020. package/src/loader.ts +12 -11
  1021. package/src/missing-id-error.ts +68 -0
  1022. package/src/outlet-context.ts +1 -1
  1023. package/src/outlet-provider.tsx +1 -5
  1024. package/src/prerender/param-hash.ts +16 -16
  1025. package/src/prerender/store.ts +63 -26
  1026. package/src/prerender.ts +215 -86
  1027. package/src/redirect-origin.ts +114 -0
  1028. package/src/regex-escape.ts +8 -0
  1029. package/src/render-error-thrower.tsx +20 -0
  1030. package/src/response-utils.ts +62 -0
  1031. package/src/reverse.ts +65 -15
  1032. package/src/root-error-boundary.tsx +1 -19
  1033. package/src/route-content-wrapper.tsx +19 -77
  1034. package/src/route-definition/dsl-helpers.ts +485 -303
  1035. package/src/route-definition/helper-factories.ts +28 -140
  1036. package/src/route-definition/helpers-types.ts +153 -77
  1037. package/src/route-definition/index.ts +4 -5
  1038. package/src/route-definition/redirect.ts +53 -12
  1039. package/src/route-definition/resolve-handler-use.ts +160 -0
  1040. package/src/route-definition/use-item-types.ts +29 -0
  1041. package/src/route-map-builder.ts +48 -21
  1042. package/src/route-types.ts +37 -46
  1043. package/src/router/basename.ts +14 -0
  1044. package/src/router/content-negotiation.ts +164 -17
  1045. package/src/router/error-handling.ts +45 -18
  1046. package/src/router/find-match.ts +130 -29
  1047. package/src/router/handler-context.ts +110 -39
  1048. package/src/router/instrument.ts +355 -0
  1049. package/src/router/intercept-resolution.ts +50 -24
  1050. package/src/router/lazy-includes.ts +89 -63
  1051. package/src/router/loader-resolution.ts +286 -56
  1052. package/src/router/logging.ts +5 -8
  1053. package/src/router/manifest.ts +105 -56
  1054. package/src/router/match-api.ts +179 -219
  1055. package/src/router/match-context.ts +0 -22
  1056. package/src/router/match-handlers.ts +211 -165
  1057. package/src/router/match-middleware/background-revalidation.ts +66 -22
  1058. package/src/router/match-middleware/cache-lookup.ts +214 -263
  1059. package/src/router/match-middleware/cache-store.ts +105 -50
  1060. package/src/router/match-middleware/intercept-resolution.ts +8 -28
  1061. package/src/router/match-middleware/segment-resolution.ts +52 -18
  1062. package/src/router/match-pipelines.ts +1 -42
  1063. package/src/router/match-result.ts +127 -52
  1064. package/src/router/metrics.ts +217 -26
  1065. package/src/router/middleware-types.ts +24 -110
  1066. package/src/router/middleware.ts +412 -199
  1067. package/src/router/navigation-snapshot.ts +133 -0
  1068. package/src/router/params-util.ts +23 -0
  1069. package/src/router/parse-pattern.ts +115 -0
  1070. package/src/router/pattern-matching.ts +183 -137
  1071. package/src/router/prefetch-cache-ttl.ts +51 -0
  1072. package/src/router/prefetch-limits.ts +37 -0
  1073. package/src/router/prerender-match.ts +207 -58
  1074. package/src/router/preview-match.ts +35 -103
  1075. package/src/router/request-classification.ts +291 -0
  1076. package/src/router/revalidation.ts +144 -74
  1077. package/src/router/route-snapshot.ts +256 -0
  1078. package/src/router/router-context.ts +11 -29
  1079. package/src/router/router-interfaces.ts +160 -36
  1080. package/src/router/router-options.ts +215 -23
  1081. package/src/router/router-registry.ts +2 -5
  1082. package/src/router/segment-resolution/fresh.ts +318 -77
  1083. package/src/router/segment-resolution/helpers.ts +116 -31
  1084. package/src/router/segment-resolution/loader-cache.ts +156 -39
  1085. package/src/router/segment-resolution/loader-mask.ts +67 -0
  1086. package/src/router/segment-resolution/loader-snapshot.ts +308 -0
  1087. package/src/router/segment-resolution/revalidation.ts +496 -391
  1088. package/src/router/segment-resolution/static-store.ts +19 -5
  1089. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  1090. package/src/router/segment-resolution/view-transition-default.ts +56 -0
  1091. package/src/router/segment-resolution.ts +5 -1
  1092. package/src/router/segment-wrappers.ts +8 -5
  1093. package/src/router/state-cookie-name.ts +33 -0
  1094. package/src/router/substitute-pattern-params.ts +75 -0
  1095. package/src/router/telemetry-otel.ts +160 -200
  1096. package/src/router/telemetry.ts +105 -20
  1097. package/src/router/timeout.ts +0 -20
  1098. package/src/router/tracing.ts +215 -0
  1099. package/src/router/trie-matching.ts +188 -58
  1100. package/src/router/types.ts +10 -63
  1101. package/src/router/url-params.ts +57 -0
  1102. package/src/router.ts +224 -65
  1103. package/src/rsc/full-payload.ts +70 -0
  1104. package/src/rsc/handler-context.ts +3 -2
  1105. package/src/rsc/handler.ts +726 -457
  1106. package/src/rsc/helpers.ts +168 -46
  1107. package/src/rsc/index.ts +2 -25
  1108. package/src/rsc/json-route-result.ts +38 -0
  1109. package/src/rsc/loader-fetch.ts +127 -31
  1110. package/src/rsc/manifest-init.ts +33 -42
  1111. package/src/rsc/nonce.ts +10 -1
  1112. package/src/rsc/origin-guard.ts +39 -25
  1113. package/src/rsc/progressive-enhancement.ts +159 -23
  1114. package/src/rsc/redirect-guard.ts +100 -0
  1115. package/src/rsc/response-cache-serve.ts +238 -0
  1116. package/src/rsc/response-error.ts +79 -12
  1117. package/src/rsc/response-route-handler.ts +99 -189
  1118. package/src/rsc/rsc-rendering.ts +516 -104
  1119. package/src/rsc/runtime-warnings.ts +23 -10
  1120. package/src/rsc/server-action.ts +293 -115
  1121. package/src/rsc/shell-capture.ts +1166 -0
  1122. package/src/rsc/shell-serve.ts +181 -0
  1123. package/src/rsc/ssr-setup.ts +144 -0
  1124. package/src/rsc/transition-gate.ts +89 -0
  1125. package/src/rsc/types.ts +64 -6
  1126. package/src/runtime-env.ts +18 -0
  1127. package/src/search-params.ts +49 -41
  1128. package/src/segment-content-promise.ts +67 -0
  1129. package/src/segment-loader-promise.ts +167 -0
  1130. package/src/segment-system.tsx +418 -131
  1131. package/src/serialize.ts +243 -0
  1132. package/src/server/context.ts +375 -63
  1133. package/src/server/cookie-parse.ts +32 -0
  1134. package/src/server/cookie-store.ts +152 -5
  1135. package/src/server/handle-store.ts +40 -38
  1136. package/src/server/loader-registry.ts +38 -46
  1137. package/src/server/request-context.ts +585 -178
  1138. package/src/server.ts +6 -0
  1139. package/src/ssr/index.tsx +467 -174
  1140. package/src/ssr/inject-rsc-eager.ts +167 -0
  1141. package/src/ssr/ssr-root.tsx +228 -0
  1142. package/src/static-handler.ts +27 -18
  1143. package/src/testing/cache-status.ts +162 -0
  1144. package/src/testing/collect-handle.ts +46 -0
  1145. package/src/testing/dispatch.ts +813 -0
  1146. package/src/testing/dom.entry.ts +22 -0
  1147. package/src/testing/e2e/fixture.ts +188 -0
  1148. package/src/testing/e2e/index.ts +128 -0
  1149. package/src/testing/e2e/matchers.ts +35 -0
  1150. package/src/testing/e2e/page-helpers.ts +272 -0
  1151. package/src/testing/e2e/parity.ts +387 -0
  1152. package/src/testing/e2e/server.ts +195 -0
  1153. package/src/testing/flight-matchers.ts +97 -0
  1154. package/src/testing/flight-normalize.ts +11 -0
  1155. package/src/testing/flight-runtime.d.ts +57 -0
  1156. package/src/testing/flight-tree.ts +682 -0
  1157. package/src/testing/flight.entry.ts +52 -0
  1158. package/src/testing/flight.ts +257 -0
  1159. package/src/testing/generated-routes.ts +199 -0
  1160. package/src/testing/index.ts +105 -0
  1161. package/src/testing/internal/context.ts +371 -0
  1162. package/src/testing/internal/flight-client-globals.ts +30 -0
  1163. package/src/testing/internal/seed-vars.ts +54 -0
  1164. package/src/testing/render-handler.ts +357 -0
  1165. package/src/testing/render-route.tsx +584 -0
  1166. package/src/testing/run-loader.ts +385 -0
  1167. package/src/testing/run-middleware.ts +205 -0
  1168. package/src/testing/run-transition-when.ts +164 -0
  1169. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  1170. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  1171. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  1172. package/src/testing/vitest-stubs/version.ts +5 -0
  1173. package/src/testing/vitest.ts +305 -0
  1174. package/src/theme/ThemeProvider.tsx +56 -84
  1175. package/src/theme/ThemeScript.tsx +7 -9
  1176. package/src/theme/constants.ts +52 -13
  1177. package/src/theme/index.ts +3 -19
  1178. package/src/theme/theme-context.ts +1 -5
  1179. package/src/theme/theme-script.ts +22 -21
  1180. package/src/theme/use-theme.ts +0 -3
  1181. package/src/types/boundaries.ts +0 -35
  1182. package/src/types/cache-types.ts +17 -8
  1183. package/src/types/error-types.ts +30 -90
  1184. package/src/types/global-namespace.ts +54 -41
  1185. package/src/types/handler-context.ts +237 -89
  1186. package/src/types/index.ts +3 -10
  1187. package/src/types/loader-types.ts +44 -15
  1188. package/src/types/request-scope.ts +112 -0
  1189. package/src/types/route-config.ts +23 -46
  1190. package/src/types/route-entry.ts +19 -7
  1191. package/src/types/segments.ts +137 -19
  1192. package/src/urls/include-helper.ts +40 -75
  1193. package/src/urls/include-provider.ts +71 -0
  1194. package/src/urls/index.ts +2 -11
  1195. package/src/urls/path-helper-types.ts +102 -23
  1196. package/src/urls/path-helper.ts +62 -111
  1197. package/src/urls/pattern-types.ts +84 -19
  1198. package/src/urls/response-types.ts +25 -22
  1199. package/src/urls/type-extraction.ts +98 -154
  1200. package/src/urls/urls-function.ts +1 -19
  1201. package/src/use-loader.tsx +346 -89
  1202. package/src/vercel/index.ts +11 -0
  1203. package/src/vercel/tracing.ts +88 -0
  1204. package/src/vite/debug.ts +185 -0
  1205. package/src/vite/discovery/bundle-postprocess.ts +64 -91
  1206. package/src/vite/discovery/dev-prerender-cache.ts +117 -0
  1207. package/src/vite/discovery/discover-routers.ts +147 -88
  1208. package/src/vite/discovery/discovery-errors.ts +255 -0
  1209. package/src/vite/discovery/gate-state.ts +171 -0
  1210. package/src/vite/discovery/prerender-collection.ts +247 -145
  1211. package/src/vite/discovery/route-types-writer.ts +40 -84
  1212. package/src/vite/discovery/self-gen-tracking.ts +27 -1
  1213. package/src/vite/discovery/state.ts +61 -13
  1214. package/src/vite/discovery/virtual-module-codegen.ts +14 -34
  1215. package/src/vite/index.ts +19 -3
  1216. package/src/vite/inject-client-debug.ts +88 -0
  1217. package/src/vite/plugin-types.ts +234 -62
  1218. package/src/vite/plugins/cjs-to-esm.ts +16 -19
  1219. package/src/vite/plugins/client-ref-dedup.ts +120 -0
  1220. package/src/vite/plugins/client-ref-hashing.ts +28 -15
  1221. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1222. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1223. package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
  1224. package/src/vite/plugins/expose-action-id.ts +49 -98
  1225. package/src/vite/plugins/expose-id-utils.ts +96 -51
  1226. package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
  1227. package/src/vite/plugins/expose-ids/handler-transform.ts +15 -64
  1228. package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
  1229. package/src/vite/plugins/expose-ids/router-transform.ts +118 -29
  1230. package/src/vite/plugins/expose-internal-ids.ts +553 -317
  1231. package/src/vite/plugins/performance-tracks.ts +89 -0
  1232. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1233. package/src/vite/plugins/use-cache-transform.ts +73 -83
  1234. package/src/vite/plugins/vercel-output.ts +384 -0
  1235. package/src/vite/plugins/version-injector.ts +40 -29
  1236. package/src/vite/plugins/version-plugin.ts +46 -37
  1237. package/src/vite/plugins/virtual-entries.ts +138 -27
  1238. package/src/vite/rango.ts +356 -295
  1239. package/src/vite/router-discovery.ts +1106 -166
  1240. package/src/vite/utils/ast-handler-extract.ts +26 -35
  1241. package/src/vite/utils/banner.ts +4 -4
  1242. package/src/vite/utils/bundle-analysis.ts +10 -15
  1243. package/src/vite/utils/client-chunks.ts +184 -0
  1244. package/src/vite/utils/directive-prologue.ts +40 -0
  1245. package/src/vite/utils/forward-user-plugins.ts +171 -0
  1246. package/src/vite/utils/manifest-utils.ts +4 -59
  1247. package/src/vite/utils/package-resolution.ts +20 -52
  1248. package/src/vite/utils/prerender-utils.ts +158 -38
  1249. package/src/vite/utils/shared-utils.ts +144 -44
  1250. package/CLAUDE.md +0 -5
  1251. package/src/browser/action-response-classifier.ts +0 -99
  1252. package/src/browser/shallow.ts +0 -40
  1253. package/src/route-definition/route-function.ts +0 -119
  1254. package/src/router/middleware-cookies.ts +0 -55
package/README.md CHANGED
@@ -1,54 +1,24 @@
1
- # @rangojs/router
1
+ # Rango
2
2
 
3
- Named-route RSC router with structural composability and type-safe partial rendering for Vite.
3
+ A code-first, type-safe React Server Components router. Django-inspired:
4
+ routes are expressed in one visible tree, URLs are built from names, and
5
+ everything past the core is opt-in.
4
6
 
5
- > **Experimental:** This package is under active development. APIs may change between releases. Install with `@experimental` tag.
7
+ > **Experimental:** This package is under active development. APIs may change
8
+ > between releases. Install with `@experimental` tag.
6
9
 
7
- ## Features
10
+ This page is a tour: it builds one small shop and meets the entire core API
11
+ along the way — about six primitives. Everything else is opt-in and linked at
12
+ the end. For the design rationale behind these APIs, read
13
+ [Why Rango](https://github.com/ivogt/vite-rsc/blob/main/packages/rangojs-router/docs/why-rango.md); this page shows how it feels, that page
14
+ argues why it's right.
8
15
 
9
- - **Named routes** — `reverse("blogPost", { slug })` for type-safe URL generation (Django-style)
10
- - **Structural composability** — Attach routes, loaders, middleware, handles, caching, prerendering, and static generation without hiding the route tree
11
- - **Composable URL patterns** — Django-style `urls()` DSL with `path`, `layout`, `include`
12
- - **Data loaders** — `createLoader()` with automatic streaming and Suspense integration
13
- - **Live data layer** — Pre-render or cache the UI shell while loaders stay live by default at request time
14
- - **Layouts & nesting** — Nested layouts with `<Outlet />` and parallel routes
15
- - **Segment-level caching** — `cache()` DSL with TTL/SWR and pluggable cache stores
16
- - **Middleware** — Route-level middleware with cookie and header access
17
- - **Pre-rendering** — `Prerender()` and `Static()` handlers for build-time rendering
18
- - **Theme support** — Light/dark mode with FOUC prevention and system detection
19
- - **Host routing** — Multi-app routing by domain/subdomain via `@rangojs/router/host`
20
- - **Response routes** — `path.json()`, `path.text()`, `path.xml()` for API endpoints
21
- - **Trailing slash control** — Per-route canonical URLs with `"never"`, `"always"`, or `"ignore"`
22
- - **CLI codegen** — `rango generate` for route type generation
23
-
24
- ## Design Docs
25
-
26
- - [Execution model](./docs/internal/execution-model.md)
27
- - [Semantic change checklist](./docs/internal/semantic-change-checklist.md)
28
- - [Stability roadmap](./docs/internal/stability-roadmap.md)
29
-
30
- ## Installation
31
-
32
- ```bash
33
- npm install @rangojs/router@experimental
34
- ```
35
-
36
- Peer dependencies:
37
-
38
- ```bash
39
- npm install react @vitejs/plugin-rsc
40
- ```
41
-
42
- For Cloudflare Workers:
16
+ ## Install
43
17
 
44
18
  ```bash
45
- npm install @cloudflare/vite-plugin
19
+ npm install @rangojs/router@experimental react @vitejs/plugin-rsc
46
20
  ```
47
21
 
48
- ## Quick Start
49
-
50
- ### Vite Config
51
-
52
22
  ```ts
53
23
  // vite.config.ts
54
24
  import react from "@vitejs/plugin-react";
@@ -60,805 +30,431 @@ export default defineConfig({
60
30
  });
61
31
  ```
62
32
 
63
- ### Router
33
+ The `cloudflare` preset targets Cloudflare Workers (add
34
+ `@cloudflare/vite-plugin`); the `vercel` preset emits a ready-to-deploy
35
+ `.vercel/output` (Build Output API) from a plain `vite build` — see the
36
+ [`/vercel` skill](./skills/vercel/SKILL.md); omit `preset` for the default
37
+ Node setup.
38
+
39
+ ## Using the skills with your coding agent
40
+
41
+ This package ships 43 agent skills in `node_modules/@rangojs/router/skills/` —
42
+ task-focused guides written for LLM coding agents. Start at
43
+ `skills/rango/SKILL.md` (the mental model + catalog); a machine-readable index
44
+ is at `skills/catalog.json`.
45
+
46
+ - **Claude Code**: point it at the skills (e.g. "read
47
+ node_modules/@rangojs/router/skills/rango/SKILL.md before routing work"), or
48
+ copy/symlink the directories you use into your project's `.claude/skills/`.
49
+ - **Other agents (Cursor, Codex CLI, Gemini CLI, ...)**: these harnesses
50
+ auto-discover skills from `.agents/skills/` in your project (or
51
+ `~/.agents/skills/`) — copy or symlink the skill directories you use from
52
+ `node_modules/@rangojs/router/skills/<name>` into `.agents/skills/<name>`.
53
+ The files are plain markdown; cross-references like `/loader` name sibling
54
+ skill directories.
55
+
56
+ ## 1. Pages
57
+
58
+ A router is a tree. `path()` places a page, `layout()` wraps children,
59
+ `{ name }` gives a route an identity:
64
60
 
65
61
  ```tsx
66
62
  // src/router.tsx
67
63
  import { createRouter, urls } from "@rangojs/router";
68
64
  import { Document } from "./document";
65
+ import { ShopLayout } from "./layouts/shop";
66
+ import { HomePage } from "./routes/home";
67
+ import { ProductPage } from "./routes/product";
69
68
 
70
- const blogPatterns = urls(({ path }) => [
71
- path("/", BlogIndexPage, { name: "index" }),
72
- path("/:slug", BlogPostPage, { name: "post" }),
73
- ]);
74
-
75
- const urlpatterns = urls(({ path, include }) => [
76
- path("/", HomePage, { name: "home" }),
77
- include("/blog", blogPatterns, { name: "blog" }),
69
+ const urlpatterns = urls(({ path, layout }) => [
70
+ layout(<ShopLayout />, () => [
71
+ path("/", HomePage, { name: "home" }),
72
+ path("/products/:slug", ProductPage, { name: "product" }),
73
+ ]),
78
74
  ]);
79
75
 
80
76
  export const router = createRouter({ document: Document }).routes(urlpatterns);
77
+ ```
81
78
 
82
- // Export typed reverse function for URL generation by route name
83
- export const reverse = router.reverse;
79
+ ```tsx
80
+ // src/layouts/shop.tsx
81
+ import { Outlet } from "@rangojs/router/client";
84
82
 
85
- // reverse("blog.post", { slug: "hello-world" }) -> "/blog/hello-world"
83
+ export function ShopLayout() {
84
+ return (
85
+ <div>
86
+ <nav>Shop</nav>
87
+ <main>
88
+ <Outlet /> {/* child routes render here */}
89
+ </main>
90
+ </div>
91
+ );
92
+ }
86
93
  ```
87
94
 
88
- ### Document
89
-
90
95
  ```tsx
91
96
  // src/document.tsx
92
97
  "use client";
93
98
 
94
99
  import type { ReactNode } from "react";
95
- import { MetaTags } from "@rangojs/router/client";
100
+ import { MetaTags, Scripts } from "@rangojs/router/client";
96
101
 
97
102
  export function Document({ children }: { children: ReactNode }) {
98
103
  return (
99
104
  <html lang="en">
100
105
  <head>
101
106
  <MetaTags />
107
+ <Scripts />
102
108
  </head>
103
- <body>{children}</body>
109
+ <body>
110
+ <Scripts position="body" />
111
+ {children}
112
+ </body>
104
113
  </html>
105
114
  );
106
115
  }
107
116
  ```
108
117
 
109
- ## Defining Routes
110
-
111
- Rango is a named-route router first.
112
-
113
- Paths define where a route lives. Names define how the app refers to it.
114
-
115
- It is also structurally composable.
116
-
117
- As an app grows, routes can pull in external handlers, loaders, middleware, handles, cache policy, intercepts, prerendering, and static generation while keeping the route tree visible at the composition site.
118
-
119
- ### Named Routes
120
-
121
- ```tsx
122
- import { urls } from "@rangojs/router";
123
-
124
- const urlpatterns = urls(({ path }) => [
125
- path("/", HomePage, { name: "home" }),
126
- path("/product/:slug", ProductPage, { name: "product" }),
127
- path("/search/:query?", SearchPage, { name: "search" }),
128
- path("/files/*", FilesPage, { name: "files" }),
129
- ]);
130
- ```
131
-
132
- Use `reverse()` as the default way to link to routes:
133
-
134
- ```tsx
135
- router.reverse("product", { slug: "widget" }); // "/product/widget"
136
- router.reverse("search", undefined, { q: "rsc" }); // "/search?q=rsc"
137
- ```
138
-
139
- ### Composable URL Modules
140
-
141
- Local route names compose cleanly with `include(..., { name })`:
142
-
143
- ```tsx
144
- import { urls } from "@rangojs/router";
145
-
146
- export const blogPatterns = urls(({ path }) => [
147
- path("/", BlogIndexPage, { name: "index" }),
148
- path("/:slug", BlogPostPage, { name: "post" }),
149
- ]);
150
-
151
- export const urlpatterns = urls(({ path, include }) => [
152
- path("/", HomePage, { name: "home" }),
153
- include("/blog", blogPatterns, { name: "blog" }),
154
- ]);
155
-
156
- router.reverse("blog.index"); // "/blog"
157
- router.reverse("blog.post", { slug: "hello-world" }); // "/blog/hello-world"
158
- ```
159
-
160
- This is the core composition model:
161
-
162
- - Paths stay local to the module that defines them
163
- - Names become stable references across the app
164
- - `include()` scales those names without forcing raw path-string coupling
165
-
166
- ### Structural Composability
167
-
168
- Rango avoids the usual tradeoff between modularity and visibility.
169
-
170
- You can extract route behavior into separate files or packages and still keep one readable route definition that shows the structure of the app.
171
-
172
- ```tsx
173
- import { urls } from "@rangojs/router";
174
- import { ProductPage } from "./routes/product";
175
- import { ProductLoader } from "./loaders/product";
176
- import { productMiddleware } from "./middleware/product";
177
- import { productRevalidate } from "./revalidation/product";
178
-
179
- const shopPatterns = urls(({ path, loader, middleware, revalidate, cache }) => [
180
- path("/product/:slug", ProductPage, { name: "product" }, () => [
181
- middleware(productMiddleware),
182
- loader(ProductLoader),
183
- revalidate(productRevalidate),
184
- cache({ ttl: 300 }),
185
- ]),
186
- ]);
187
- ```
188
-
189
- The route tree stays explicit even when behavior is modular.
190
-
191
- This applies to:
192
-
193
- - external route modules mounted with `include()`
194
- - imported loaders, middleware, and handles attached at the route site
195
- - prerendering and static generation attached without turning the route tree opaque
196
-
197
- ### Loaders As the Live Data Layer
198
-
199
- Rango separates app structure from app data.
200
-
201
- Routes, layouts, and pre-rendered segments can be static or cached, while
202
- loaders stay live by default and re-resolve at request time.
203
-
204
- This means you can pre-render or cache the shell of a page without freezing its
205
- data.
206
-
207
- - `cache()` caches route structure and rendered UI segments
208
- - `Prerender()` skips loaders at build time
209
- - `loader()` provides fresh request-time data
210
- - individual loaders can opt into caching explicitly when needed
211
-
212
- ```tsx
213
- import { urls, Prerender } from "@rangojs/router";
214
- import { ArticleLoader } from "./loaders/article";
215
-
216
- const docsPatterns = urls(({ path, loader }) => [
217
- path("/docs/:slug", Prerender(DocsArticle), { name: "docs.article" }, () => [
218
- loader(ArticleLoader), // fresh by default
219
- ]),
220
- ]);
221
- ```
222
-
223
- Pre-render the page, keep the data live.
224
-
225
- ### Typed Handlers
118
+ (The built-in `DefaultDocument` already wires all of this — a custom document
119
+ is optional.)
226
120
 
227
- Route handlers receive a typed context with params, search params, and `reverse()`:
121
+ A handler is a function of `ctx`. Typing it by route name gives typed params
122
+ — the Vite plugin generates the route map automatically, nothing to register:
228
123
 
229
124
  ```tsx
125
+ // src/routes/product.tsx
230
126
  import type { Handler } from "@rangojs/router";
231
127
 
232
128
  export const ProductPage: Handler<"product"> = (ctx) => {
233
- const { slug } = ctx.params; // typed from pattern
234
- const homeUrl = ctx.reverse("home"); // type-safe URL by route name
235
- return <h1>Product: {slug}</h1>;
129
+ return <h1>{ctx.params.slug}</h1>; // slug: string, from the pattern
236
130
  };
237
131
  ```
238
132
 
239
- ### Choosing a Handler Style
240
-
241
- All handler typing styles are supported, but they solve different problems:
242
-
243
- - `Handler<"product">` — default for named app routes
244
- - `Handler<".post", ScopedRouteMap<"blog">>` — best for reusable included modules
245
- - `Handler<"/blog/:slug">` — good for unnamed or local-only extracted handlers
246
- - `Handler<{ slug: string }>` — escape hatch for advanced or decoupled cases
247
-
248
- Example of a scoped local name inside a mounted module:
133
+ And because routes have names, URLs are built, never hand-written:
249
134
 
250
135
  ```tsx
251
- import type { Handler, ScopedRouteMap } from "@rangojs/router";
252
-
253
- type BlogRoutes = ScopedRouteMap<"blog">;
254
-
255
- export const BlogPostPage: Handler<".post", BlogRoutes> = (ctx) => {
256
- return <a href={ctx.reverse(".index")}>Back to blog</a>;
257
- };
136
+ const url = ctx.reverse("product", { slug: "espresso-cup" });
137
+ // "/products/espresso-cup" — name and params compile-time checked
258
138
  ```
259
139
 
260
- See [`../../docs/named-routes.md`](../../docs/named-routes.md) for the recommended mental model.
261
-
262
- ### Search Params
263
-
264
- Define a search schema on the route for type-safe search parameters:
265
-
266
- ```tsx
267
- const urlpatterns = urls(({ path }) => [
268
- path("/search", SearchPage, {
269
- name: "search",
270
- search: { q: "string", page: "number?", sort: "string?" },
271
- }),
272
- ]);
273
-
274
- // Handler receives typed search params via ctx.search
275
- const SearchPage: Handler<"search"> = (ctx) => {
276
- const { q, page, sort } = ctx.search;
277
- // q: string, page: number | undefined, sort: string | undefined
278
- };
279
- ```
280
-
281
- ### Trailing Slash Handling
282
-
283
- Trailing slash behavior is a current `path()` feature.
284
-
285
- Set it per route with `trailingSlash`:
140
+ Rename `/products/:slug` to `/shop/:slug` in the one place it's defined and
141
+ every link, redirect, and prefetch follows. In client components, `href()`
142
+ validates static paths against the registered patterns:
143
+ `<Link to={href("/")}>Home</Link>`.
286
144
 
287
- ```tsx
288
- const urlpatterns = urls(({ path }) => [
289
- path("/about", AboutPage, {
290
- name: "about",
291
- trailingSlash: "never",
292
- }),
293
- path("/docs/", DocsPage, {
294
- name: "docs",
295
- trailingSlash: "always",
296
- }),
297
- path("/webhook", WebhookHandler, {
298
- name: "webhook",
299
- trailingSlash: "ignore",
300
- }),
301
- ]);
302
- ```
303
-
304
- Modes:
305
-
306
- - `"never"` — canonical URL has no trailing slash, redirects `/about/` to `/about`
307
- - `"always"` — canonical URL has a trailing slash, redirects `/docs` to `/docs/`
308
- - `"ignore"` — matches both forms without redirect
309
-
310
- Default behavior when `trailingSlash` is omitted:
311
-
312
- - There is no separate global default mode
313
- - If the pattern is defined without a trailing slash, the canonical URL is the no-slash form
314
- - If the pattern is defined with a trailing slash, the canonical URL is the slash form
315
- - The router redirects to the canonical form based on the pattern you defined
316
-
317
- The recommended public API is the per-route `path(..., { trailingSlash })` option. Use `"ignore"` sparingly, especially on content pages, because `/x` and `/x/` are distinct URLs.
318
-
319
- ### Response Routes
320
-
321
- Define API endpoints that bypass the RSC pipeline:
322
-
323
- ```tsx
324
- const urlpatterns = urls(({ path }) => [
325
- path.json("/api/health", () => ({ status: "ok" }), { name: "health" }),
326
- path.text("/robots.txt", () => "User-agent: *\nAllow: /", { name: "robots" }),
327
- path.xml("/feed.xml", () => "<rss>...</rss>", { name: "feed" }),
328
- ]);
329
- ```
330
-
331
- Response types available: `path.json()`, `path.text()`, `path.html()`, `path.xml()`, `path.image()`, `path.stream()`, `path.any()`.
332
-
333
- ## Layouts & Nesting
334
-
335
- ### Layouts with Outlet
336
-
337
- ```tsx
338
- import { urls } from "@rangojs/router";
339
-
340
- const urlpatterns = urls(({ path, layout }) => [
341
- layout(<MainLayout />, () => [
342
- path("/", HomePage, { name: "home" }),
343
- path("/about", AboutPage, { name: "about" }),
344
- ]),
345
- ]);
346
- ```
347
-
348
- ```tsx
349
- "use client";
350
- import { Outlet } from "@rangojs/router/client";
351
-
352
- function MainLayout() {
353
- return (
354
- <div>
355
- <nav>...</nav>
356
- <Outlet />
357
- </div>
358
- );
359
- }
360
- ```
145
+ The tree is also lazy-first, which is the shape serverless cold starts want.
146
+ `include()` mounts a whole route module under a prefix — and with the async
147
+ form, `include("/shop", () => import("./shop"))`, the group is code-split:
148
+ its module doesn't load or run until a request matches it, a group nobody
149
+ visits never evaluates at all, and warm requests run zero route handlers.
150
+ Boot cost stays flat as the app grows — one module body at startup, not one
151
+ per group — while matching stays an `O(path length)` prefix trie, identical
152
+ in dev and production. None of this is assumed: the trie is benchmarked
153
+ in-repo against multi-thousand-route manifests, and the lazy guarantees are
154
+ pinned by run-count tests (see
155
+ [matching & lazy discovery](https://github.com/ivogt/vite-rsc/blob/main/packages/rangojs-router/docs/internal/matching-and-lazy-discovery.md)).
156
+ Grow the tree without watching the boot time.
361
157
 
362
- ### Loading Skeletons
158
+ That's a working site. Everything below adds to this app.
363
159
 
364
- ```tsx
365
- const urlpatterns = urls(({ path, loading }) => [
366
- path("/product/:slug", ProductPage, { name: "product" }, () => [
367
- loading(<ProductSkeleton />),
368
- ]),
369
- ]);
370
- ```
160
+ ## 2. Data
371
161
 
372
- ### Parallel Routes
162
+ The product page needs data. A handler is an async server component — fetch
163
+ where you render:
373
164
 
374
165
  ```tsx
375
- const urlpatterns = urls(({ path, layout, parallel, loader, loading }) => [
376
- layout(BlogLayout, () => [
377
- parallel({ "@sidebar": BlogSidebarHandler }, () => [
378
- loader(BlogSidebarLoader),
379
- loading(<SidebarSkeleton />),
380
- ]),
381
- path("/blog", BlogIndexPage, { name: "blog" }),
382
- path("/blog/:slug", BlogPostPage, { name: "blogPost" }),
383
- ]),
384
- ]);
166
+ // src/routes/product.tsx
167
+ export const ProductPage: Handler<"product"> = async (ctx) => {
168
+ const product = await db.products.find(ctx.params.slug);
169
+ ctx.use(Meta)({ title: product.name }); // metadata where the data is
170
+ return <ProductView product={product} />;
171
+ };
385
172
  ```
386
173
 
387
- ## Data Loaders
174
+ That's the default data path. React Router and Remix split data into a
175
+ loader beside the component because components couldn't fetch; RSC collapses
176
+ the split, and Rango doesn't reintroduce it. (That `ctx.use(Meta)` line is
177
+ also the whole metadata story: push tags where the data already is, layouts
178
+ set title templates, deeper segments override — no separate metadata export,
179
+ no second fetch.)
388
180
 
389
- ### Creating a Loader
181
+ Loaders enter when data needs a life of its own. First case: a **client
182
+ component** needs server data — the stock badge is interactive, but the
183
+ stock lives in the database:
390
184
 
391
185
  ```tsx
186
+ // src/loaders/stock.ts
392
187
  import { createLoader } from "@rangojs/router";
393
188
 
394
- export const BlogSidebarLoader = createLoader(async (ctx) => {
395
- const posts = await db.getRecentPosts();
396
- return { posts, loadedAt: new Date().toISOString() };
189
+ export const StockLoader = createLoader(async (ctx) => {
190
+ "use server";
191
+ return db.stockFor(ctx.params.slug);
397
192
  });
398
193
  ```
399
194
 
400
- ### Using in Server Components (Handlers)
401
-
402
195
  ```tsx
403
- import type { HandlerContext } from "@rangojs/router";
404
- import { BlogSidebarLoader } from "./loaders/blog";
405
-
406
- async function BlogSidebarHandler(ctx: HandlerContext) {
407
- const { posts } = await ctx.use(BlogSidebarLoader);
408
- return (
409
- <ul>
410
- {posts.map((p) => (
411
- <li key={p.slug}>{p.title}</li>
412
- ))}
413
- </ul>
414
- );
415
- }
196
+ path("/products/:slug", ProductPage, { name: "product" }, () => [
197
+ loader(StockLoader),
198
+ loading(<ProductSkeleton />),
199
+ ]),
416
200
  ```
417
201
 
418
- ### Using in Client Components
419
-
420
202
  ```tsx
203
+ // src/components/stock-badge.tsx
421
204
  "use client";
422
205
  import { useLoader } from "@rangojs/router/client";
423
- import { BlogSidebarLoader } from "./loaders/blog";
206
+ import { StockLoader } from "../loaders/stock";
424
207
 
425
- function BlogSidebar() {
426
- const { data } = useLoader(BlogSidebarLoader);
427
- return (
428
- <ul>
429
- {data.posts.map((p) => (
430
- <li key={p.slug}>{p.title}</li>
431
- ))}
432
- </ul>
433
- );
208
+ export function StockBadge() {
209
+ const { data } = useLoader(StockLoader);
210
+ return <span>{data.inStock ? "In stock" : "Sold out"}</span>;
434
211
  }
435
212
  ```
436
213
 
437
- ### Attaching Loaders to Routes
214
+ Loaders run in parallel with the handler and stream; `loading()` opts the
215
+ segment into skeleton-then-stream. Without it, document requests arrive
216
+ **ready** — the HTML ships with data in place; the skeleton is a per-segment
217
+ choice, not the first impression.
438
218
 
439
- ```tsx
440
- const urlpatterns = urls(({ path, loader }) => [
441
- path("/blog", BlogIndexPage, { name: "blog" }, () => [
442
- loader(BlogSidebarLoader),
443
- ]),
444
- ]);
445
- ```
446
-
447
- ## Navigation & Links
219
+ The rule of thumb: fetch in the **handler** when the data belongs to the
220
+ rendered page — it will be frozen with the shell if you cache it (step 4).
221
+ Put data in a **loader** when it must outlive the shell: shared with client
222
+ components, fresh on every hit even when the segment is cached, refetchable
223
+ from the client, or revalidated on its own after actions.
448
224
 
449
- ### Named Routes with `reverse()` (Server Components)
225
+ ## 3. Mutations
450
226
 
451
- In server components, use `reverse()` to generate URLs by route name:
227
+ Users add to cart. A server action is a plain `"use server"` function; the
228
+ form posts to it with standard React 19 hooks — and it works without
229
+ JavaScript:
452
230
 
453
231
  ```tsx
454
- import { Link } from "@rangojs/router/client";
455
- import { reverse } from "./router";
232
+ // src/actions/cart.ts
233
+ "use server";
456
234
 
457
- function BlogIndex() {
458
- return (
459
- <nav>
460
- <Link to={reverse("home")}>Home</Link>
461
- <Link to={reverse("blogPost", { slug: "my-post" })}>My Post</Link>
462
- <Link to={reverse("about")}>About</Link>
463
- </nav>
464
- );
235
+ export async function addToCart(productId: string) {
236
+ await db.cart.insert({ productId });
465
237
  }
466
238
  ```
467
239
 
468
- `reverse()` is type-safe — route names and required params are checked at compile time. Included routes use dotted names: `reverse("api.health")`.
469
-
470
- Handlers also have `ctx.reverse()` directly on the context:
471
-
472
- ```tsx
473
- const BlogPostPage: Handler<"blogPost"> = (ctx) => {
474
- const backUrl = ctx.reverse("blog");
475
- return <Link to={backUrl}>Back to blog</Link>;
476
- };
477
- ```
478
-
479
- ### `href()` for Path Validation (Client Components)
480
-
481
- In client components, use `href()` for compile-time path validation:
482
-
483
240
  ```tsx
241
+ // src/components/add-to-cart.tsx
484
242
  "use client";
485
- import { Link, href } from "@rangojs/router/client";
243
+ import { useActionState } from "react";
244
+ import { addToCart } from "../actions/cart";
486
245
 
487
- function Nav() {
246
+ export function AddToCart({ productId }: { productId: string }) {
247
+ const [, action, pending] = useActionState(() => addToCart(productId), null);
488
248
  return (
489
- <nav>
490
- <Link to={href("/")}>Home</Link>
491
- <Link to={href("/blog")} prefetch="hybrid">
492
- Blog
493
- </Link>
494
- <Link to={href("/about")}>About</Link>
495
- </nav>
249
+ <form action={action}>
250
+ <button disabled={pending}>{pending ? "Adding…" : "Add to cart"}</button>
251
+ </form>
496
252
  );
497
253
  }
498
254
  ```
499
255
 
500
- `href()` validates that the path matches a registered route pattern at compile time (e.g. `/blog/my-post` matches `/blog/:slug`).
501
-
502
- ### Navigation Hooks
256
+ After an action, route segments and loaders re-render by default so the UI
257
+ reflects the new state. `revalidate()` narrows that to the segments that
258
+ actually own the data — matched by action **reference**, so renames are
259
+ compile errors, not stale predicates:
503
260
 
504
261
  ```tsx
505
- "use client";
506
- import { useNavigation, useRouter } from "@rangojs/router/client";
262
+ import * as CartActions from "./actions/cart";
507
263
 
508
- function SearchForm() {
509
- const router = useRouter();
510
- const nav = useNavigation();
511
-
512
- function handleSubmit(query: string) {
513
- router.push(`/search?q=${encodeURIComponent(query)}`);
514
- }
515
-
516
- return <form onSubmit={...}>{nav.state !== "idle" && <Spinner />}</form>;
517
- }
518
- ```
519
-
520
- ### Scroll Restoration
521
-
522
- ```tsx
523
- "use client";
524
- import { ScrollRestoration } from "@rangojs/router/client";
525
-
526
- function Document({ children }) {
527
- return (
528
- <html>
529
- <body>
530
- {children}
531
- <ScrollRestoration />
532
- </body>
533
- </html>
534
- );
535
- }
536
- ```
537
-
538
- ## Includes (Composable Modules)
539
-
540
- Split URL patterns into composable modules with `include()`:
541
-
542
- ```tsx
543
- // src/api/urls.tsx
544
- import { urls } from "@rangojs/router";
545
-
546
- export const apiPatterns = urls(({ path }) => [
547
- path.json("/health", () => ({ status: "ok" }), { name: "health" }),
548
- path.json("/products", getProducts, { name: "products" }),
549
- ]);
550
-
551
- // src/urls.tsx
552
- import { urls } from "@rangojs/router";
553
- import { apiPatterns } from "./api/urls";
554
-
555
- export const urlpatterns = urls(({ path, include }) => [
556
- path("/", HomePage, { name: "home" }),
557
- include("/api", apiPatterns, { name: "api" }),
558
- // Mounts apiPatterns under /api: /api/health, /api/products
559
- ]);
264
+ path("/cart", CartPage, { name: "cart" }, () => [
265
+ loader(CartLoader, () => [
266
+ revalidate((ctx) => ctx.isAction(CartActions) || undefined),
267
+ ]),
268
+ ]),
560
269
  ```
561
270
 
562
- Included route names are prefixed with the include name: `reverse("api.health")`, `reverse("api.products")`.
563
-
564
- ### Include name scoping
565
-
566
- The `name` option controls how child route names appear globally:
567
-
568
- | Form | Child names | Generated types | Reverse resolution |
569
- | ---------------------------------- | ------------------- | ---------------------- | -------------------------------------------------------------------- |
570
- | `include("/x", p, { name: "ns" })` | `ns.child` | Exported as `ns.child` | `reverse("ns.child")` globally, `reverse(".child")` inside |
571
- | `include("/x", p, { name: "" })` | `child` (flattened) | Exported as-is | `reverse("child")` globally, `reverse(".child")` inside (root-scope) |
572
- | `include("/x", p)` | Private scope | Not exported | `reverse(".child")` inside only |
573
-
574
- Without a `name`, included routes are local to the mounted module. They still match requests and render normally, but their names are hidden from the generated route map and cannot be reversed globally. Use `{ name: "" }` to merge children into the parent namespace without adding a prefix.
575
-
576
- **`{ name: "" }` is flattening, not isolation.** Flattened routes behave as if defined inline at the include site — dot-local reverse (`.name`) can reach any sibling route at root scope, including routes from other `{ name: "" }` mounts. If you need module-level isolation, omit the `name` option or use a namespace.
577
-
578
- ## Middleware
271
+ Notice what you didn't write: no API endpoint, no fetch wrapper, and no
272
+ client-cache invalidation call. Actions invalidate the client-side caches
273
+ (history entries, prefetches, HTTP cache key) automatically — a no-op action
274
+ can opt out per invocation with `keepClientCache()`.
579
275
 
580
- ```tsx
581
- const urlpatterns = urls(({ path, middleware }) => [
582
- middleware(
583
- async (ctx, next) => {
584
- const start = Date.now();
585
- const response = await next();
586
- console.log(
587
- `${ctx.request.method} ${ctx.url.pathname} ${Date.now() - start}ms`,
588
- );
589
- return response;
590
- },
591
- () => [path("/dashboard", DashboardPage, { name: "dashboard" })],
592
- ),
593
- ]);
594
- ```
276
+ ## 4. Speed
595
277
 
596
- ## Caching
597
-
598
- ### Route-Level Caching
278
+ Production traffic. Wrap a segment in `cache()` and the rendered shell —
279
+ including everything the handler fetched — is stored, while every loader on
280
+ it keeps running fresh on each hit. This is where the handler-vs-loader
281
+ choice from step 2 pays off: handler data freezes with the shell, the
282
+ `StockLoader` stays live. Cached shell, live data, one line:
599
283
 
600
284
  ```tsx
601
- const urlpatterns = urls(({ path, cache }) => [
602
- cache({ ttl: 60, swr: 300 }, () => [
603
- path("/blog", BlogIndexPage, { name: "blog" }),
604
- path("/blog/:slug", BlogPostPage, { name: "blogPost" }),
285
+ const urlpatterns = urls(({ path, layout, loader, loading, cache }) => [
286
+ layout(<ShopLayout />, () => [
287
+ path("/", HomePage, { name: "home" }),
288
+ cache({ ttl: 600, swr: 3600, tags: ["products"] }, () => [
289
+ path("/products/:slug", ProductPage, { name: "product" }, () => [
290
+ loader(StockLoader), // never cached: re-runs on every hit
291
+ loading(<ProductSkeleton />),
292
+ ]),
293
+ ]),
605
294
  ]),
606
295
  ]);
607
296
  ```
608
297
 
609
- ### Cache Store Configuration
610
-
611
- ```tsx
612
- import { createRouter } from "@rangojs/router";
613
- import {
614
- CFCacheStore,
615
- createDocumentCacheMiddleware,
616
- } from "@rangojs/router/cache";
617
-
618
- export const router = createRouter({
619
- document: Document,
620
- cache: (env) => ({
621
- store: new CFCacheStore({
622
- defaults: { ttl: 60, swr: 300 },
623
- ctx: env.ctx,
624
- }),
625
- }),
626
- })
627
- .use(createDocumentCacheMiddleware())
628
- .routes(urlpatterns);
629
- ```
630
-
631
- Available cache stores:
632
-
633
- - `CFCacheStore` — Cloudflare edge cache (production)
634
- - `MemorySegmentCacheStore` — In-memory cache (development/testing)
635
-
636
- ## Pre-rendering
637
-
638
- Pre-rendering generates route segments at build time. The worker handles all requests — there are no static files served from assets.
639
-
640
- ### Static Segments
641
-
642
- Use `Static()` for segments rendered once at build time (no params). Works on `path()`, `layout()`, and `parallel()`:
298
+ Wire a store once on the router (`MemorySegmentCacheStore` for dev,
299
+ `CFCacheStore` for Cloudflare — see the [`/caching` skill](./skills/caching/SKILL.md)),
300
+ and bust by tag from the mutation that changes the data:
643
301
 
644
302
  ```tsx
645
- import { Static } from "@rangojs/router";
646
-
647
- export const AboutPage = Static(async () => {
648
- return <article>...</article>;
649
- });
303
+ // src/actions/products.ts
304
+ "use server";
305
+ import { updateTag } from "@rangojs/router";
650
306
 
651
- export const DocsNav = Static(async () => {
652
- const items = await readDocsNavItems();
653
- return (
654
- <nav>
655
- {items.map((i) => (
656
- <a key={i.slug} href={i.slug}>
657
- {i.title}
658
- </a>
659
- ))}
660
- </nav>
661
- );
662
- });
663
- ```
664
-
665
- ### Dynamic Routes with Prerender
666
-
667
- Use `Prerender()` for route-scoped pre-rendering. With params, provide `getParams` first, handler second:
668
-
669
- ```tsx
670
- import { Prerender } from "@rangojs/router";
671
-
672
- export const BlogPost = Prerender(
673
- async () => {
674
- const slugs = await getAllBlogSlugs();
675
- return slugs.map((slug) => ({ slug }));
676
- },
677
- async (ctx) => {
678
- const post = await getPost(ctx.params.slug);
679
- return <article>{post.content}</article>;
680
- },
681
- );
682
- ```
683
-
684
- ### Passthrough for Unknown Params
685
-
686
- ```tsx
687
- import { Prerender } from "@rangojs/router";
688
-
689
- export const ProductPage = Prerender(
690
- async () => {
691
- const featured = await db.getFeaturedProducts();
692
- return featured.map((p) => ({ id: p.id }));
693
- },
694
- async (ctx) => {
695
- const product = await db.getProduct(ctx.params.id);
696
- return <Product data={product} />;
697
- },
698
- { passthrough: true },
699
- );
700
- ```
701
-
702
- With `passthrough: true`, known params are served from the build-time cache and unknown params fall through to live rendering.
703
-
704
- Handlers can also skip individual param sets with `ctx.passthrough()`, deferring them to the live handler at runtime:
705
-
706
- ```tsx
707
- export const ProductPage = Prerender(
708
- async () => {
709
- const all = await db.getAllProducts();
710
- return all.map((p) => ({ id: p.id }));
711
- },
712
- async (ctx) => {
713
- const product = await db.getProduct(ctx.params.id);
714
- if (!product.published) return ctx.passthrough();
715
- return <Product data={product} />;
716
- },
717
- { passthrough: true },
718
- );
719
- ```
720
-
721
- ## Theme
722
-
723
- ### Router Configuration
724
-
725
- ```tsx
726
- export const router = createRouter({
727
- document: Document,
728
- theme: {
729
- defaultTheme: "light",
730
- themes: ["light", "dark", "system"],
731
- attribute: "class",
732
- enableSystem: true,
733
- },
734
- }).routes(urlpatterns);
735
- ```
736
-
737
- ### Theme Toggle
738
-
739
- ```tsx
740
- "use client";
741
- import { useTheme } from "@rangojs/router/theme";
742
-
743
- function ThemeToggle() {
744
- const { theme, setTheme, themes } = useTheme();
745
- return (
746
- <select value={theme} onChange={(e) => setTheme(e.target.value)}>
747
- {themes.map((t) => (
748
- <option key={t}>{t}</option>
749
- ))}
750
- </select>
751
- );
307
+ export async function renameProduct(id: string, name: string) {
308
+ await db.products.rename(id, name);
309
+ await updateTag("products"); // awaitable, read-your-own-writes
752
310
  }
753
311
  ```
754
312
 
755
- ## Host Routing
756
-
757
- Route requests to different apps based on domain/subdomain patterns using `@rangojs/router/host`:
313
+ Navigation speed is a `Link` prop away:
758
314
 
759
315
  ```tsx
760
- // worker.rsc.tsx
761
- import { createHostRouter } from "@rangojs/router/host";
762
-
763
- const hostRouter = createHostRouter();
764
-
765
- hostRouter.host(["*.localhost"]).map(() => import("./apps/admin/handler.js"));
766
- hostRouter.host(["localhost"]).map(() => import("./apps/site/handler.js"));
767
- hostRouter.fallback().map(() => import("./apps/site/handler.js"));
768
-
769
- export default {
770
- async fetch(request, env, ctx) {
771
- return hostRouter.match(request, { env, ctx });
772
- },
773
- };
316
+ <Link to={url} prefetch="viewport">
317
+ {product.name}
318
+ </Link>
774
319
  ```
775
320
 
776
- Each sub-app has its own `createRouter()` and `urls()`. The host router lazily imports the matched app's handler. Patterns are matched in registration order — register more specific patterns (subdomains) before catch-alls.
321
+ A fully-prefetched navigation commits a **finished page** — no skeleton, no
322
+ loading flash — and staying correct is the router's job: every action
323
+ invalidates the prefetch caches by default, so a prefetched page can't show
324
+ pre-mutation data.
777
325
 
778
- ## Meta Tags
326
+ To move the shell's cost to build time entirely, `Prerender()` bakes it while
327
+ loaders stay live at runtime — same mental model, earlier cache write. See
328
+ the [`/prerender` skill](./skills/prerender/SKILL.md).
779
329
 
780
- Accumulate meta tags across route segments using the built-in `Meta` handle:
330
+ ## 5. An API, when you need one
781
331
 
782
- ```tsx
783
- import { Meta } from "@rangojs/router";
784
- import type { HandlerContext } from "@rangojs/router";
785
-
786
- export function BlogPostPage(ctx: HandlerContext) {
787
- const meta = ctx.use(Meta);
788
- meta({ title: "My Blog Post" });
789
- meta({ name: "description", content: "A great blog post" });
790
- meta({ property: "og:title", content: "My Blog Post" });
791
-
792
- return <article>...</article>;
793
- }
794
- ```
332
+ Response routes live in the same tree — `path.json()`, `path.text()`,
333
+ `path.xml()`, `path.image()`, `path.stream()`:
795
334
 
796
- Render collected tags in the document with `<MetaTags />` from `@rangojs/router/client`.
797
-
798
- ## CLI: `rango generate`
799
-
800
- Route types are generated automatically by the Vite plugin. The CLI is a manual fallback for generating types outside the dev server (e.g. in CI or for IDE support before first `pnpm dev`):
801
-
802
- ```bash
803
- npx rango generate src/router.tsx
804
- npx rango generate src/ # recursive scan
805
- npx rango generate src/urls.tsx src/api/ # mix files and directories
335
+ ```tsx
336
+ path("/products/:slug", ProductPage, { name: "product" }),
337
+ path.json("/products/:slug", (ctx) => db.products.find(ctx.params.slug), {
338
+ name: "productJson",
339
+ }),
806
340
  ```
807
341
 
808
- Auto-detects file type:
809
-
810
- - Files with `createRouter` → `*.named-routes.gen.ts` with global route map
811
- - Files with `urls()` → `*.gen.ts` with per-module route names, params, and search types
812
-
813
- ## Type Safety
814
-
815
- The Vite plugin automatically generates a `router.named-routes.gen.ts` file that globally registers route names, patterns, and search schemas via `RSCRouter.GeneratedRouteMap`. This powers server-side named-route typing such as `Handler<"name">`, `ctx.reverse()`, `getRequestContext().reverse()`, and `RouteParams<"name">` without any manual route registration. The gen file is updated on dev server startup, HMR, and production builds.
342
+ Same URL: browsers get the page, API clients get JSON, negotiated by
343
+ `Accept` header in the route trie. Handlers return bare values; errors
344
+ serialize as RFC 9457 `application/problem+json`. The payload type is
345
+ inferred from the handler — no codegen:
816
346
 
817
- Use the generated map by default. Augment `RSCRouter.RegisteredRoutes` only when you need the richer `typeof router.routeMap` shape globally, especially for response-aware and path-based utilities.
347
+ ```ts
348
+ type Product = RouteResponse<typeof urlpatterns, "productJson">;
349
+ ```
350
+
351
+ See the [`/api-client` skill](./skills/api-client/SKILL.md) for a small typed
352
+ client over these endpoints.
353
+
354
+ ## Everything else, when you need it
355
+
356
+ That was the core: `path`/`layout`/`include`, names, loaders, actions +
357
+ `revalidate`, `cache`, response routes. The rest is opt-in — reach for it
358
+ when the requirement appears:
359
+
360
+ | I need to… | Skill |
361
+ | ----------------------------------------------- | -------------------------------------------------------------------------------------------- |
362
+ | guard or shape requests (auth, headers) | [`/middleware`](./skills/middleware/SKILL.md) |
363
+ | multi-column layouts, independent slots | [`/parallel`](./skills/parallel/SKILL.md) |
364
+ | open a route as a modal on soft navigation | [`/intercept`](./skills/intercept/SKILL.md) |
365
+ | compose route modules / sub-apps | [`/route`](./skills/route/SKILL.md), [`/composability`](./skills/composability/SKILL.md) |
366
+ | cache a single function or component | [`/use-cache`](./skills/use-cache/SKILL.md), [`/cache-guide`](./skills/cache-guide/SKILL.md) |
367
+ | feed live loaders from a cached shell | [`/shell-manifest`](./skills/shell-manifest/SKILL.md) |
368
+ | edge caching with Cache-Control | [`/document-cache`](./skills/document-cache/SKILL.md) |
369
+ | light/dark mode without FOUC | [`/theme`](./skills/theme/SKILL.md) |
370
+ | analytics / third-party scripts with CSP nonce | [`/scripts`](./skills/scripts/SKILL.md) |
371
+ | locale routing | [`/i18n`](./skills/i18n/SKILL.md) |
372
+ | SSE and WebSockets | [`/streams-and-websockets`](./skills/streams-and-websockets/SKILL.md) |
373
+ | multi-app routing by domain | [`/host-router`](./skills/host-router/SKILL.md) |
374
+ | animate navigations | [`/view-transitions`](./skills/view-transitions/SKILL.md) |
375
+ | test loaders, middleware, handlers, Flight | [`/testing`](./skills/testing/SKILL.md) |
376
+ | see where request time goes | [`/observability`](./skills/observability/SKILL.md) |
377
+ | deploy to Vercel (cache store, tracing, output) | [`/vercel`](./skills/vercel/SKILL.md) |
378
+ | compare Rango with Next.js / TanStack / Waku | [`/comparison`](./skills/comparison/SKILL.md) |
379
+
380
+ The [`/rango` skill](./skills/rango/SKILL.md) is the full catalog and the
381
+ mental model that ties it together.
382
+
383
+ ## Reference
384
+
385
+ ### Imports and subpaths
386
+
387
+ | Export | Description |
388
+ | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
389
+ | `@rangojs/router` | Server/RSC core and shared types: `createRouter`, `urls`, `createLoader`, `Handler`, `Prerender`, `Meta` |
390
+ | `@rangojs/router/client` | Client: `Link`, `Outlet`, `href`, `useNavigation`, `useLoader`, `MetaTags` |
391
+ | `@rangojs/router/cache` | Cache: `CFCacheStore`, `VercelCacheStore`, `MemorySegmentCacheStore`, `createDocumentCacheMiddleware` |
392
+ | `@rangojs/router/theme` | Theme: `useTheme`, `ThemeProvider`, `ThemeScript` |
393
+ | `@rangojs/router/host` | Host routing: `createHostRouter`, `defineHosts`, `isNoRouteMatchError` |
394
+ | `@rangojs/router/vercel` | Vercel: `createVercelTracing` (phase spans via `@vercel/otel`'s global tracer) |
395
+ | `@rangojs/router/vite` | Vite plugin: `rango()` |
396
+ | `@rangojs/router/testing` | Consumer testing primitives: `runLoader`, `runMiddleware`, `dispatch` (plus `/testing/dom`, `/testing/flight`, `/testing/e2e`) |
397
+ | `@rangojs/router/rsc` | Advanced server pipeline APIs: `createRSCHandler`, request-context access |
398
+ | `@rangojs/router/ssr` | Advanced SSR bridge APIs: `createSSRHandler` |
399
+
400
+ Use only subpaths that are explicitly exported; avoid deep imports.
401
+
402
+ The root entry is conditionally resolved: server-only APIs (`createRouter`,
403
+ `urls`, `redirect`, `Prerender`, `cookies`) run under the `react-server`
404
+ condition and throw guidance errors elsewhere. If you hit a root-entrypoint
405
+ stub error: hooks and components (`Link`, `Outlet`, `useLoader`, `MetaTags`)
406
+ live in `@rangojs/router/client`; cache APIs in `@rangojs/router/cache`;
407
+ host APIs in `@rangojs/router/host`.
408
+
409
+ ### Type safety
410
+
411
+ The Vite plugin generates `router.named-routes.gen.ts` automatically (on dev
412
+ startup, HMR, and builds), registering route names, params, and search
413
+ schemas globally via `Rango.GeneratedRouteMap`. That powers `Handler<"name">`,
414
+ `ctx.reverse()`, and `RouteParams<"name">` with no manual registration.
415
+
416
+ For response-aware and path-based utilities (`href()`, `Rango.Path`,
417
+ `RouteResponse`), augment `Rango.RegisteredRoutes` once:
818
418
 
819
- ```typescript
419
+ ```ts
820
420
  // router.tsx
821
421
  const router = createRouter<AppBindings>({}).routes(urlpatterns);
822
422
 
823
423
  declare global {
824
- namespace RSCRouter {
424
+ namespace Rango {
825
425
  interface Env extends AppEnv {}
826
- interface Vars extends AppVars {}
827
426
  interface RegisteredRoutes extends typeof router.routeMap {}
828
427
  }
829
428
  }
830
429
  ```
831
430
 
832
- Quick rule of thumb:
431
+ See the [`/typesafety` skill](./skills/typesafety/SKILL.md) for the full
432
+ surface breakdown.
833
433
 
834
- - `GeneratedRouteMap` (auto-generated) — use for server-side named-route typing: `Handler<"name">`, `ctx.reverse()`, `Prerender<"name">`
835
- - `typeof router.routeMap` — use when you need route entries with response metadata
836
- - `RegisteredRoutes` (manual augmentation) — use to expose `typeof router.routeMap` globally for `href()`, `PathResponse`, `ValidPaths`, and other path/response-aware utilities
434
+ ### CLI
837
435
 
838
- For extracted reusable loaders or middleware, prefer global dotted names on
839
- `ctx.reverse()` by default. If you want type-safe local names for a specific
840
- module, use `scopedReverse<typeof localPatterns>(ctx.reverse)` or
841
- `scopedReverse<routes>(ctx.reverse)` with a generated local route type.
436
+ Route types are generated by the Vite plugin; the CLI is the manual fallback
437
+ for CI or pre-first-run IDE support:
842
438
 
843
- ## Subpath Exports
439
+ ```bash
440
+ npx rango generate src/router.tsx # global named-route map
441
+ npx rango generate src/ # recursive scan
442
+ ```
844
443
 
845
- | Export | Description |
846
- | ------------------------ | --------------------------------------------------------------------------------- |
847
- | `@rangojs/router` | Core: `createRouter`, `urls`, `createLoader`, `Handler`, `Prerender`, `Meta` |
848
- | `@rangojs/router/client` | Client: `Link`, `Outlet`, `href`, `useNavigation`, `useLoader`, `MetaTags` |
849
- | `@rangojs/router/cache` | Cache: `CFCacheStore`, `MemorySegmentCacheStore`, `createDocumentCacheMiddleware` |
850
- | `@rangojs/router/theme` | Theme: `useTheme`, `ThemeProvider`, `ThemeScript` |
851
- | `@rangojs/router/host` | Host routing: `createHostRouter`, `defineHosts` |
852
- | `@rangojs/router/vite` | Vite plugin: `rango()` |
853
- | `@rangojs/router/server` | Server utilities |
854
- | `@rangojs/router/build` | Build utilities |
444
+ ### Examples
855
445
 
856
- ## Examples
446
+ - [`e2e/mini`](https://github.com/ivogt/vite-rsc/tree/main/packages/rangojs-router/e2e/mini) — single-file demo app
447
+ - [`cloudflare-basic`](https://github.com/ivogt/vite-rsc/tree/main/tests/cloudflare-basic) — Cloudflare Workers with caching, loaders, theme, and pre-rendering
448
+ - [`cloudflare-multi-router`](https://github.com/ivogt/vite-rsc/tree/main/examples/cloudflare-multi-router) — multi-app host routing
449
+ - [`vercel-basic`](https://github.com/ivogt/vite-rsc/tree/main/examples/vercel-basic) — Vercel deployment with `preset: "vercel"`, `VercelCacheStore`, and OTel tracing
450
+ - [`vercel-multi-router`](https://github.com/ivogt/vite-rsc/tree/main/examples/vercel-multi-router) — multi-app host routing on Vercel (single function, routed by Host header)
857
451
 
858
- See the `examples/` directory for full working applications:
452
+ ### Going deeper
859
453
 
860
- - [`cloudflare-basic`](../../examples/cloudflare-basic) — Cloudflare Workers with caching, loaders, theme, and pre-rendering
861
- - [`cloudflare-multi-router`](../../examples/cloudflare-multi-router) — Multi-app host routing
454
+ - [Why Rango](https://github.com/ivogt/vite-rsc/blob/main/packages/rangojs-router/docs/why-rango.md) — the design rationale, claim by claim
455
+ - [Framework comparison](./skills/comparison/references/framework-comparison.md) — Rango vs Next.js App Router, TanStack Start, and Waku, capability by capability
456
+ - [Docs index](https://github.com/ivogt/vite-rsc/blob/main/packages/rangojs-router/docs/README.md) — architecture, caching, prerender, testing
457
+ - [Execution model](https://github.com/ivogt/vite-rsc/blob/main/packages/rangojs-router/docs/internal/execution-model.md) — the runtime contract
862
458
 
863
459
  ## License
864
460