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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1195) hide show
  1. package/AGENTS.md +9 -0
  2. package/README.md +1037 -4
  3. package/dist/__internal.d.ts +83 -0
  4. package/dist/__internal.d.ts.map +1 -0
  5. package/dist/__internal.js +19 -0
  6. package/dist/__internal.js.map +1 -0
  7. package/dist/__mocks__/version.d.ts +7 -0
  8. package/dist/__mocks__/version.d.ts.map +1 -0
  9. package/{src/__mocks__/version.ts → dist/__mocks__/version.js} +1 -0
  10. package/dist/__mocks__/version.js.map +1 -0
  11. package/dist/__tests__/client-href.test.d.ts +2 -0
  12. package/dist/__tests__/client-href.test.d.ts.map +1 -0
  13. package/dist/__tests__/client-href.test.js +74 -0
  14. package/dist/__tests__/client-href.test.js.map +1 -0
  15. package/dist/__tests__/component-utils.test.d.ts +2 -0
  16. package/dist/__tests__/component-utils.test.d.ts.map +1 -0
  17. package/dist/__tests__/component-utils.test.js +51 -0
  18. package/dist/__tests__/component-utils.test.js.map +1 -0
  19. package/dist/__tests__/event-controller.test.d.ts +2 -0
  20. package/dist/__tests__/event-controller.test.d.ts.map +1 -0
  21. package/dist/__tests__/event-controller.test.js +538 -0
  22. package/dist/__tests__/event-controller.test.js.map +1 -0
  23. package/dist/__tests__/helpers/route-tree.d.ts +118 -0
  24. package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
  25. package/dist/__tests__/helpers/route-tree.js +374 -0
  26. package/dist/__tests__/helpers/route-tree.js.map +1 -0
  27. package/dist/__tests__/match-result.test.d.ts +2 -0
  28. package/dist/__tests__/match-result.test.d.ts.map +1 -0
  29. package/dist/__tests__/match-result.test.js +154 -0
  30. package/dist/__tests__/match-result.test.js.map +1 -0
  31. package/dist/__tests__/navigation-store.test.d.ts +2 -0
  32. package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
  33. package/dist/__tests__/navigation-store.test.js +440 -0
  34. package/dist/__tests__/navigation-store.test.js.map +1 -0
  35. package/dist/__tests__/partial-update.test.d.ts +2 -0
  36. package/dist/__tests__/partial-update.test.d.ts.map +1 -0
  37. package/dist/__tests__/partial-update.test.js +1009 -0
  38. package/dist/__tests__/partial-update.test.js.map +1 -0
  39. package/dist/__tests__/reverse-types.test.d.ts +8 -0
  40. package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
  41. package/dist/__tests__/reverse-types.test.js +656 -0
  42. package/dist/__tests__/reverse-types.test.js.map +1 -0
  43. package/dist/__tests__/route-definition.test.d.ts +2 -0
  44. package/dist/__tests__/route-definition.test.d.ts.map +1 -0
  45. package/dist/__tests__/route-definition.test.js +55 -0
  46. package/dist/__tests__/route-definition.test.js.map +1 -0
  47. package/dist/__tests__/router-helpers.test.d.ts +2 -0
  48. package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
  49. package/dist/__tests__/router-helpers.test.js +377 -0
  50. package/dist/__tests__/router-helpers.test.js.map +1 -0
  51. package/dist/__tests__/router-integration-2.test.d.ts +2 -0
  52. package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
  53. package/dist/__tests__/router-integration-2.test.js +426 -0
  54. package/dist/__tests__/router-integration-2.test.js.map +1 -0
  55. package/dist/__tests__/router-integration.test.d.ts +2 -0
  56. package/dist/__tests__/router-integration.test.d.ts.map +1 -0
  57. package/dist/__tests__/router-integration.test.js +1051 -0
  58. package/dist/__tests__/router-integration.test.js.map +1 -0
  59. package/dist/__tests__/search-params.test.d.ts +5 -0
  60. package/dist/__tests__/search-params.test.d.ts.map +1 -0
  61. package/dist/__tests__/search-params.test.js +306 -0
  62. package/dist/__tests__/search-params.test.js.map +1 -0
  63. package/dist/__tests__/segment-system.test.d.ts +2 -0
  64. package/dist/__tests__/segment-system.test.d.ts.map +1 -0
  65. package/dist/__tests__/segment-system.test.js +627 -0
  66. package/dist/__tests__/segment-system.test.js.map +1 -0
  67. package/dist/__tests__/static-handler-types.test.d.ts +8 -0
  68. package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
  69. package/dist/__tests__/static-handler-types.test.js +63 -0
  70. package/dist/__tests__/static-handler-types.test.js.map +1 -0
  71. package/dist/__tests__/urls.test.d.ts +2 -0
  72. package/dist/__tests__/urls.test.d.ts.map +1 -0
  73. package/dist/__tests__/urls.test.js +421 -0
  74. package/dist/__tests__/urls.test.js.map +1 -0
  75. package/dist/__tests__/use-mount.test.d.ts +2 -0
  76. package/dist/__tests__/use-mount.test.d.ts.map +1 -0
  77. package/dist/__tests__/use-mount.test.js +35 -0
  78. package/dist/__tests__/use-mount.test.js.map +1 -0
  79. package/dist/bin/rango.d.ts +2 -0
  80. package/dist/bin/rango.d.ts.map +1 -0
  81. package/dist/bin/rango.js +1779 -0
  82. package/dist/bin/rango.js.map +1 -0
  83. package/dist/browser/event-controller.d.ts +191 -0
  84. package/dist/browser/event-controller.d.ts.map +1 -0
  85. package/dist/browser/event-controller.js +559 -0
  86. package/dist/browser/event-controller.js.map +1 -0
  87. package/dist/browser/index.d.ts +2 -0
  88. package/dist/browser/index.d.ts.map +1 -0
  89. package/dist/browser/index.js +14 -0
  90. package/dist/browser/index.js.map +1 -0
  91. package/dist/browser/link-interceptor.d.ts +38 -0
  92. package/dist/browser/link-interceptor.d.ts.map +1 -0
  93. package/dist/browser/link-interceptor.js +99 -0
  94. package/dist/browser/link-interceptor.js.map +1 -0
  95. package/dist/browser/logging.d.ts +10 -0
  96. package/dist/browser/logging.d.ts.map +1 -0
  97. package/dist/browser/logging.js +29 -0
  98. package/dist/browser/logging.js.map +1 -0
  99. package/dist/browser/lru-cache.d.ts +17 -0
  100. package/dist/browser/lru-cache.d.ts.map +1 -0
  101. package/dist/browser/lru-cache.js +50 -0
  102. package/dist/browser/lru-cache.js.map +1 -0
  103. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  104. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  105. package/dist/browser/merge-segment-loaders.js +102 -0
  106. package/dist/browser/merge-segment-loaders.js.map +1 -0
  107. package/dist/browser/navigation-bridge.d.ts +102 -0
  108. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  109. package/dist/browser/navigation-bridge.js +708 -0
  110. package/dist/browser/navigation-bridge.js.map +1 -0
  111. package/dist/browser/navigation-client.d.ts +25 -0
  112. package/dist/browser/navigation-client.d.ts.map +1 -0
  113. package/dist/browser/navigation-client.js +157 -0
  114. package/dist/browser/navigation-client.js.map +1 -0
  115. package/dist/browser/navigation-store.d.ts +101 -0
  116. package/dist/browser/navigation-store.d.ts.map +1 -0
  117. package/dist/browser/navigation-store.js +625 -0
  118. package/dist/browser/navigation-store.js.map +1 -0
  119. package/dist/browser/partial-update.d.ts +75 -0
  120. package/dist/browser/partial-update.d.ts.map +1 -0
  121. package/dist/browser/partial-update.js +426 -0
  122. package/dist/browser/partial-update.js.map +1 -0
  123. package/dist/browser/react/Link.d.ts +86 -0
  124. package/dist/browser/react/Link.d.ts.map +1 -0
  125. package/dist/browser/react/Link.js +128 -0
  126. package/dist/browser/react/Link.js.map +1 -0
  127. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  128. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  129. package/dist/browser/react/NavigationProvider.js +216 -0
  130. package/dist/browser/react/NavigationProvider.js.map +1 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  132. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  133. package/dist/browser/react/ScrollRestoration.js +57 -0
  134. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  135. package/dist/browser/react/context.d.ts +46 -0
  136. package/dist/browser/react/context.d.ts.map +1 -0
  137. package/dist/browser/react/context.js +10 -0
  138. package/dist/browser/react/context.js.map +1 -0
  139. package/dist/browser/react/index.d.ts +11 -0
  140. package/dist/browser/react/index.d.ts.map +1 -0
  141. package/dist/browser/react/index.js +22 -0
  142. package/dist/browser/react/index.js.map +1 -0
  143. package/dist/browser/react/location-state-shared.d.ts +63 -0
  144. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  145. package/dist/browser/react/location-state-shared.js +81 -0
  146. package/dist/browser/react/location-state-shared.js.map +1 -0
  147. package/dist/browser/react/location-state.d.ts +23 -0
  148. package/dist/browser/react/location-state.d.ts.map +1 -0
  149. package/dist/browser/react/location-state.js +29 -0
  150. package/dist/browser/react/location-state.js.map +1 -0
  151. package/dist/browser/react/mount-context.d.ts +24 -0
  152. package/dist/browser/react/mount-context.d.ts.map +1 -0
  153. package/dist/browser/react/mount-context.js +24 -0
  154. package/dist/browser/react/mount-context.js.map +1 -0
  155. package/dist/browser/react/use-action.d.ts +64 -0
  156. package/dist/browser/react/use-action.d.ts.map +1 -0
  157. package/dist/browser/react/use-action.js +134 -0
  158. package/dist/browser/react/use-action.js.map +1 -0
  159. package/dist/browser/react/use-client-cache.d.ts +41 -0
  160. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  161. package/dist/browser/react/use-client-cache.js +39 -0
  162. package/dist/browser/react/use-client-cache.js.map +1 -0
  163. package/dist/browser/react/use-handle.d.ts +31 -0
  164. package/dist/browser/react/use-handle.d.ts.map +1 -0
  165. package/dist/browser/react/use-handle.js +144 -0
  166. package/dist/browser/react/use-handle.js.map +1 -0
  167. package/dist/browser/react/use-href.d.ts +33 -0
  168. package/dist/browser/react/use-href.d.ts.map +1 -0
  169. package/dist/browser/react/use-href.js +39 -0
  170. package/dist/browser/react/use-href.js.map +1 -0
  171. package/dist/browser/react/use-link-status.d.ts +37 -0
  172. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  173. package/dist/browser/react/use-link-status.js +99 -0
  174. package/dist/browser/react/use-link-status.js.map +1 -0
  175. package/dist/browser/react/use-mount.d.ts +25 -0
  176. package/dist/browser/react/use-mount.d.ts.map +1 -0
  177. package/dist/browser/react/use-mount.js +30 -0
  178. package/dist/browser/react/use-mount.js.map +1 -0
  179. package/dist/browser/react/use-navigation.d.ts +27 -0
  180. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  181. package/dist/browser/react/use-navigation.js +87 -0
  182. package/dist/browser/react/use-navigation.js.map +1 -0
  183. package/dist/browser/react/use-segments.d.ts +38 -0
  184. package/dist/browser/react/use-segments.d.ts.map +1 -0
  185. package/dist/browser/react/use-segments.js +130 -0
  186. package/dist/browser/react/use-segments.js.map +1 -0
  187. package/dist/browser/request-controller.d.ts +26 -0
  188. package/dist/browser/request-controller.d.ts.map +1 -0
  189. package/dist/browser/request-controller.js +147 -0
  190. package/dist/browser/request-controller.js.map +1 -0
  191. package/dist/browser/rsc-router.d.ts +129 -0
  192. package/dist/browser/rsc-router.d.ts.map +1 -0
  193. package/dist/browser/rsc-router.js +195 -0
  194. package/dist/browser/rsc-router.js.map +1 -0
  195. package/dist/browser/scroll-restoration.d.ts +93 -0
  196. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  197. package/dist/browser/scroll-restoration.js +321 -0
  198. package/dist/browser/scroll-restoration.js.map +1 -0
  199. package/dist/browser/segment-structure-assert.d.ts +17 -0
  200. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  201. package/dist/browser/segment-structure-assert.js +59 -0
  202. package/dist/browser/segment-structure-assert.js.map +1 -0
  203. package/dist/browser/server-action-bridge.d.ts +26 -0
  204. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  205. package/dist/browser/server-action-bridge.js +668 -0
  206. package/dist/browser/server-action-bridge.js.map +1 -0
  207. package/dist/browser/shallow.d.ts +12 -0
  208. package/dist/browser/shallow.d.ts.map +1 -0
  209. package/dist/browser/shallow.js +34 -0
  210. package/dist/browser/shallow.js.map +1 -0
  211. package/dist/browser/types.d.ts +369 -0
  212. package/dist/browser/types.d.ts.map +1 -0
  213. package/dist/browser/types.js +2 -0
  214. package/dist/browser/types.js.map +1 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  216. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  217. package/dist/build/__tests__/generate-cli.test.js +237 -0
  218. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  220. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  221. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  222. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  224. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  225. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  226. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  228. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  230. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  231. package/dist/build/generate-manifest.d.ts +81 -0
  232. package/dist/build/generate-manifest.d.ts.map +1 -0
  233. package/dist/build/generate-manifest.js +276 -0
  234. package/dist/build/generate-manifest.js.map +1 -0
  235. package/dist/build/generate-route-types.d.ts +115 -0
  236. package/dist/build/generate-route-types.d.ts.map +1 -0
  237. package/dist/build/generate-route-types.js +740 -0
  238. package/dist/build/generate-route-types.js.map +1 -0
  239. package/dist/build/index.d.ts +21 -0
  240. package/dist/build/index.d.ts.map +1 -0
  241. package/dist/build/index.js +21 -0
  242. package/dist/build/index.js.map +1 -0
  243. package/dist/build/route-trie.d.ts +71 -0
  244. package/dist/build/route-trie.d.ts.map +1 -0
  245. package/dist/build/route-trie.js +175 -0
  246. package/dist/build/route-trie.js.map +1 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  248. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  249. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  250. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  252. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  253. package/dist/cache/__tests__/document-cache.test.js +345 -0
  254. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  258. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  260. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  261. package/dist/cache/__tests__/memory-store.test.js +367 -0
  262. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  263. package/dist/cache/cache-scope.d.ts +102 -0
  264. package/dist/cache/cache-scope.d.ts.map +1 -0
  265. package/dist/cache/cache-scope.js +440 -0
  266. package/dist/cache/cache-scope.js.map +1 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  270. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  272. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  273. package/dist/cache/cf/cf-cache-store.js +242 -0
  274. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  275. package/dist/cache/cf/index.d.ts +14 -0
  276. package/dist/cache/cf/index.d.ts.map +1 -0
  277. package/dist/cache/cf/index.js +17 -0
  278. package/dist/cache/cf/index.js.map +1 -0
  279. package/dist/cache/document-cache.d.ts +64 -0
  280. package/dist/cache/document-cache.d.ts.map +1 -0
  281. package/dist/cache/document-cache.js +228 -0
  282. package/dist/cache/document-cache.js.map +1 -0
  283. package/dist/cache/index.d.ts +19 -0
  284. package/dist/cache/index.d.ts.map +1 -0
  285. package/dist/cache/index.js +21 -0
  286. package/dist/cache/index.js.map +1 -0
  287. package/dist/cache/memory-segment-store.d.ts +110 -0
  288. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  289. package/dist/cache/memory-segment-store.js +117 -0
  290. package/dist/cache/memory-segment-store.js.map +1 -0
  291. package/dist/cache/memory-store.d.ts +41 -0
  292. package/dist/cache/memory-store.d.ts.map +1 -0
  293. package/dist/cache/memory-store.js +191 -0
  294. package/dist/cache/memory-store.js.map +1 -0
  295. package/dist/cache/types.d.ts +317 -0
  296. package/dist/cache/types.d.ts.map +1 -0
  297. package/dist/cache/types.js +12 -0
  298. package/dist/cache/types.js.map +1 -0
  299. package/dist/client.d.ts +248 -0
  300. package/dist/client.d.ts.map +1 -0
  301. package/dist/client.js +367 -0
  302. package/dist/client.js.map +1 -0
  303. package/dist/client.rsc.d.ts +26 -0
  304. package/dist/client.rsc.d.ts.map +1 -0
  305. package/dist/client.rsc.js +46 -0
  306. package/dist/client.rsc.js.map +1 -0
  307. package/dist/component-utils.d.ts +36 -0
  308. package/dist/component-utils.d.ts.map +1 -0
  309. package/dist/component-utils.js +61 -0
  310. package/dist/component-utils.js.map +1 -0
  311. package/dist/components/DefaultDocument.d.ts +13 -0
  312. package/dist/components/DefaultDocument.d.ts.map +1 -0
  313. package/dist/components/DefaultDocument.js +15 -0
  314. package/dist/components/DefaultDocument.js.map +1 -0
  315. package/dist/debug.d.ts +58 -0
  316. package/dist/debug.d.ts.map +1 -0
  317. package/dist/debug.js +157 -0
  318. package/dist/debug.js.map +1 -0
  319. package/dist/default-error-boundary.d.ts +11 -0
  320. package/dist/default-error-boundary.d.ts.map +1 -0
  321. package/dist/default-error-boundary.js +45 -0
  322. package/dist/default-error-boundary.js.map +1 -0
  323. package/dist/deps/browser.d.ts +2 -0
  324. package/dist/deps/browser.d.ts.map +1 -0
  325. package/dist/deps/browser.js +3 -0
  326. package/dist/deps/browser.js.map +1 -0
  327. package/dist/deps/html-stream-client.d.ts +2 -0
  328. package/dist/deps/html-stream-client.d.ts.map +1 -0
  329. package/dist/deps/html-stream-client.js +3 -0
  330. package/dist/deps/html-stream-client.js.map +1 -0
  331. package/dist/deps/html-stream-server.d.ts +2 -0
  332. package/dist/deps/html-stream-server.d.ts.map +1 -0
  333. package/dist/deps/html-stream-server.js +3 -0
  334. package/dist/deps/html-stream-server.js.map +1 -0
  335. package/dist/deps/rsc.d.ts +2 -0
  336. package/dist/deps/rsc.d.ts.map +1 -0
  337. package/dist/deps/rsc.js +4 -0
  338. package/dist/deps/rsc.js.map +1 -0
  339. package/dist/deps/ssr.d.ts +2 -0
  340. package/dist/deps/ssr.d.ts.map +1 -0
  341. package/dist/deps/ssr.js +3 -0
  342. package/dist/deps/ssr.js.map +1 -0
  343. package/dist/errors.d.ts +174 -0
  344. package/dist/errors.d.ts.map +1 -0
  345. package/dist/errors.js +241 -0
  346. package/dist/errors.js.map +1 -0
  347. package/dist/handle.d.ts +78 -0
  348. package/dist/handle.d.ts.map +1 -0
  349. package/dist/handle.js +82 -0
  350. package/dist/handle.js.map +1 -0
  351. package/dist/handles/MetaTags.d.ts +14 -0
  352. package/dist/handles/MetaTags.d.ts.map +1 -0
  353. package/dist/handles/MetaTags.js +136 -0
  354. package/dist/handles/MetaTags.js.map +1 -0
  355. package/dist/handles/index.d.ts +6 -0
  356. package/dist/handles/index.d.ts.map +1 -0
  357. package/dist/handles/index.js +6 -0
  358. package/dist/handles/index.js.map +1 -0
  359. package/dist/handles/meta.d.ts +39 -0
  360. package/dist/handles/meta.d.ts.map +1 -0
  361. package/dist/handles/meta.js +202 -0
  362. package/dist/handles/meta.js.map +1 -0
  363. package/dist/host/__tests__/errors.test.d.ts +2 -0
  364. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  365. package/dist/host/__tests__/errors.test.js +76 -0
  366. package/dist/host/__tests__/errors.test.js.map +1 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  370. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  372. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  374. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  375. package/dist/host/__tests__/router.test.d.ts +2 -0
  376. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  377. package/dist/host/__tests__/router.test.js +241 -0
  378. package/dist/host/__tests__/router.test.js.map +1 -0
  379. package/dist/host/__tests__/testing.test.d.ts +2 -0
  380. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  381. package/dist/host/__tests__/testing.test.js +64 -0
  382. package/dist/host/__tests__/testing.test.js.map +1 -0
  383. package/dist/host/__tests__/utils.test.d.ts +2 -0
  384. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  385. package/dist/host/__tests__/utils.test.js +29 -0
  386. package/dist/host/__tests__/utils.test.js.map +1 -0
  387. package/dist/host/cookie-handler.d.ts +34 -0
  388. package/dist/host/cookie-handler.d.ts.map +1 -0
  389. package/dist/host/cookie-handler.js +124 -0
  390. package/dist/host/cookie-handler.js.map +1 -0
  391. package/dist/host/errors.d.ts +56 -0
  392. package/dist/host/errors.d.ts.map +1 -0
  393. package/dist/host/errors.js +79 -0
  394. package/dist/host/errors.js.map +1 -0
  395. package/dist/host/index.d.ts +29 -0
  396. package/dist/host/index.d.ts.map +1 -0
  397. package/dist/host/index.js +32 -0
  398. package/dist/host/index.js.map +1 -0
  399. package/dist/host/pattern-matcher.d.ts +36 -0
  400. package/dist/host/pattern-matcher.d.ts.map +1 -0
  401. package/dist/host/pattern-matcher.js +172 -0
  402. package/dist/host/pattern-matcher.js.map +1 -0
  403. package/dist/host/router.d.ts +26 -0
  404. package/dist/host/router.d.ts.map +1 -0
  405. package/dist/host/router.js +218 -0
  406. package/dist/host/router.js.map +1 -0
  407. package/dist/host/testing.d.ts +36 -0
  408. package/dist/host/testing.d.ts.map +1 -0
  409. package/dist/host/testing.js +55 -0
  410. package/dist/host/testing.js.map +1 -0
  411. package/dist/host/types.d.ts +115 -0
  412. package/dist/host/types.d.ts.map +1 -0
  413. package/dist/host/types.js +7 -0
  414. package/dist/host/types.js.map +1 -0
  415. package/dist/host/utils.d.ts +21 -0
  416. package/dist/host/utils.d.ts.map +1 -0
  417. package/dist/host/utils.js +23 -0
  418. package/dist/host/utils.js.map +1 -0
  419. package/dist/href-client.d.ts +131 -0
  420. package/dist/href-client.d.ts.map +1 -0
  421. package/dist/href-client.js +64 -0
  422. package/dist/href-client.js.map +1 -0
  423. package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
  424. package/dist/href-context.d.ts.map +1 -0
  425. package/dist/href-context.js +21 -0
  426. package/dist/href-context.js.map +1 -0
  427. package/dist/index.d.ts +73 -0
  428. package/dist/index.d.ts.map +1 -0
  429. package/dist/index.js +91 -0
  430. package/dist/index.js.map +1 -0
  431. package/dist/index.rsc.d.ts +32 -0
  432. package/dist/index.rsc.d.ts.map +1 -0
  433. package/dist/index.rsc.js +40 -0
  434. package/dist/index.rsc.js.map +1 -0
  435. package/dist/internal-debug.d.ts +2 -0
  436. package/dist/internal-debug.d.ts.map +1 -0
  437. package/dist/internal-debug.js +5 -0
  438. package/dist/internal-debug.js.map +1 -0
  439. package/dist/loader.d.ts +14 -0
  440. package/dist/loader.d.ts.map +1 -0
  441. package/dist/loader.js +20 -0
  442. package/dist/loader.js.map +1 -0
  443. package/dist/loader.rsc.d.ts +19 -0
  444. package/dist/loader.rsc.d.ts.map +1 -0
  445. package/dist/loader.rsc.js +99 -0
  446. package/dist/loader.rsc.js.map +1 -0
  447. package/dist/network-error-thrower.d.ts +17 -0
  448. package/dist/network-error-thrower.d.ts.map +1 -0
  449. package/dist/network-error-thrower.js +14 -0
  450. package/dist/network-error-thrower.js.map +1 -0
  451. package/dist/outlet-context.d.ts +13 -0
  452. package/dist/outlet-context.d.ts.map +1 -0
  453. package/dist/outlet-context.js +3 -0
  454. package/dist/outlet-context.js.map +1 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  456. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  457. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  458. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  459. package/dist/prerender/param-hash.d.ts +16 -0
  460. package/dist/prerender/param-hash.d.ts.map +1 -0
  461. package/dist/prerender/param-hash.js +36 -0
  462. package/dist/prerender/param-hash.js.map +1 -0
  463. package/dist/prerender/store.d.ts +38 -0
  464. package/dist/prerender/store.d.ts.map +1 -0
  465. package/dist/prerender/store.js +61 -0
  466. package/dist/prerender/store.js.map +1 -0
  467. package/dist/prerender.d.ts +66 -0
  468. package/dist/prerender.d.ts.map +1 -0
  469. package/dist/prerender.js +57 -0
  470. package/dist/prerender.js.map +1 -0
  471. package/dist/reverse.d.ts +196 -0
  472. package/dist/reverse.d.ts.map +1 -0
  473. package/dist/reverse.js +78 -0
  474. package/dist/reverse.js.map +1 -0
  475. package/dist/root-error-boundary.d.ts +33 -0
  476. package/dist/root-error-boundary.d.ts.map +1 -0
  477. package/dist/root-error-boundary.js +165 -0
  478. package/dist/root-error-boundary.js.map +1 -0
  479. package/dist/route-content-wrapper.d.ts +46 -0
  480. package/dist/route-content-wrapper.d.ts.map +1 -0
  481. package/dist/route-content-wrapper.js +77 -0
  482. package/dist/route-content-wrapper.js.map +1 -0
  483. package/dist/route-definition.d.ts +421 -0
  484. package/dist/route-definition.d.ts.map +1 -0
  485. package/dist/route-definition.js +868 -0
  486. package/dist/route-definition.js.map +1 -0
  487. package/dist/route-map-builder.d.ts +155 -0
  488. package/dist/route-map-builder.d.ts.map +1 -0
  489. package/dist/route-map-builder.js +237 -0
  490. package/dist/route-map-builder.js.map +1 -0
  491. package/dist/route-types.d.ts +165 -0
  492. package/dist/route-types.d.ts.map +1 -0
  493. package/dist/route-types.js +7 -0
  494. package/dist/route-types.js.map +1 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  496. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  497. package/dist/router/__tests__/handler-context.test.js +65 -0
  498. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  502. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  503. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  504. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  505. package/dist/router/__tests__/match-context.test.js +92 -0
  506. package/dist/router/__tests__/match-context.test.js.map +1 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  508. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  509. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  510. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  511. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  512. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  513. package/dist/router/__tests__/match-result.test.js +457 -0
  514. package/dist/router/__tests__/match-result.test.js.map +1 -0
  515. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  516. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  517. package/dist/router/__tests__/on-error.test.js +678 -0
  518. package/dist/router/__tests__/on-error.test.js.map +1 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  520. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  521. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  522. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  526. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  527. package/dist/router/error-handling.d.ts +77 -0
  528. package/dist/router/error-handling.d.ts.map +1 -0
  529. package/dist/router/error-handling.js +202 -0
  530. package/dist/router/error-handling.js.map +1 -0
  531. package/dist/router/handler-context.d.ts +20 -0
  532. package/dist/router/handler-context.d.ts.map +1 -0
  533. package/dist/router/handler-context.js +198 -0
  534. package/dist/router/handler-context.js.map +1 -0
  535. package/dist/router/intercept-resolution.d.ts +66 -0
  536. package/dist/router/intercept-resolution.d.ts.map +1 -0
  537. package/dist/router/intercept-resolution.js +246 -0
  538. package/dist/router/intercept-resolution.js.map +1 -0
  539. package/dist/router/loader-resolution.d.ts +64 -0
  540. package/dist/router/loader-resolution.d.ts.map +1 -0
  541. package/dist/router/loader-resolution.js +284 -0
  542. package/dist/router/loader-resolution.js.map +1 -0
  543. package/dist/router/logging.d.ts +15 -0
  544. package/dist/router/logging.d.ts.map +1 -0
  545. package/dist/router/logging.js +99 -0
  546. package/dist/router/logging.js.map +1 -0
  547. package/dist/router/manifest.d.ts +22 -0
  548. package/dist/router/manifest.d.ts.map +1 -0
  549. package/dist/router/manifest.js +181 -0
  550. package/dist/router/manifest.js.map +1 -0
  551. package/dist/router/match-api.d.ts +35 -0
  552. package/dist/router/match-api.d.ts.map +1 -0
  553. package/dist/router/match-api.js +406 -0
  554. package/dist/router/match-api.js.map +1 -0
  555. package/dist/router/match-context.d.ts +206 -0
  556. package/dist/router/match-context.d.ts.map +1 -0
  557. package/dist/router/match-context.js +17 -0
  558. package/dist/router/match-context.js.map +1 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  560. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  561. package/dist/router/match-middleware/background-revalidation.js +75 -0
  562. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  564. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  565. package/dist/router/match-middleware/cache-lookup.js +257 -0
  566. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  567. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  568. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  569. package/dist/router/match-middleware/cache-store.js +108 -0
  570. package/dist/router/match-middleware/cache-store.js.map +1 -0
  571. package/dist/router/match-middleware/index.d.ts +81 -0
  572. package/dist/router/match-middleware/index.d.ts.map +1 -0
  573. package/dist/router/match-middleware/index.js +80 -0
  574. package/dist/router/match-middleware/index.js.map +1 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  576. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  577. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  578. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  580. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  581. package/dist/router/match-middleware/segment-resolution.js +53 -0
  582. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  583. package/dist/router/match-pipelines.d.ts +147 -0
  584. package/dist/router/match-pipelines.d.ts.map +1 -0
  585. package/dist/router/match-pipelines.js +82 -0
  586. package/dist/router/match-pipelines.js.map +1 -0
  587. package/dist/router/match-result.d.ts +126 -0
  588. package/dist/router/match-result.d.ts.map +1 -0
  589. package/dist/router/match-result.js +93 -0
  590. package/dist/router/match-result.js.map +1 -0
  591. package/dist/router/metrics.d.ts +20 -0
  592. package/dist/router/metrics.d.ts.map +1 -0
  593. package/dist/router/metrics.js +47 -0
  594. package/dist/router/metrics.js.map +1 -0
  595. package/dist/router/middleware.d.ts +249 -0
  596. package/dist/router/middleware.d.ts.map +1 -0
  597. package/dist/router/middleware.js +434 -0
  598. package/dist/router/middleware.js.map +1 -0
  599. package/dist/router/middleware.test.d.ts +2 -0
  600. package/dist/router/middleware.test.d.ts.map +1 -0
  601. package/dist/router/middleware.test.js +816 -0
  602. package/dist/router/middleware.test.js.map +1 -0
  603. package/dist/router/pattern-matching.d.ts +149 -0
  604. package/dist/router/pattern-matching.d.ts.map +1 -0
  605. package/dist/router/pattern-matching.js +349 -0
  606. package/dist/router/pattern-matching.js.map +1 -0
  607. package/dist/router/revalidation.d.ts +44 -0
  608. package/dist/router/revalidation.d.ts.map +1 -0
  609. package/dist/router/revalidation.js +147 -0
  610. package/dist/router/revalidation.js.map +1 -0
  611. package/dist/router/router-context.d.ts +135 -0
  612. package/dist/router/router-context.d.ts.map +1 -0
  613. package/dist/router/router-context.js +36 -0
  614. package/dist/router/router-context.js.map +1 -0
  615. package/dist/router/segment-resolution.d.ts +127 -0
  616. package/dist/router/segment-resolution.d.ts.map +1 -0
  617. package/dist/router/segment-resolution.js +919 -0
  618. package/dist/router/segment-resolution.js.map +1 -0
  619. package/dist/router/trie-matching.d.ts +40 -0
  620. package/dist/router/trie-matching.d.ts.map +1 -0
  621. package/dist/router/trie-matching.js +127 -0
  622. package/dist/router/trie-matching.js.map +1 -0
  623. package/dist/router/types.d.ts +136 -0
  624. package/dist/router/types.d.ts.map +1 -0
  625. package/dist/router/types.js +7 -0
  626. package/dist/router/types.js.map +1 -0
  627. package/dist/router.d.ts +753 -0
  628. package/dist/router.d.ts.map +1 -0
  629. package/dist/router.gen.d.ts +6 -0
  630. package/dist/router.gen.d.ts.map +1 -0
  631. package/dist/router.gen.js +6 -0
  632. package/dist/router.gen.js.map +1 -0
  633. package/dist/router.js +1304 -0
  634. package/dist/router.js.map +1 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  636. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  637. package/dist/rsc/__tests__/helpers.test.js +140 -0
  638. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  639. package/dist/rsc/handler.d.ts +45 -0
  640. package/dist/rsc/handler.d.ts.map +1 -0
  641. package/dist/rsc/handler.js +1172 -0
  642. package/dist/rsc/handler.js.map +1 -0
  643. package/dist/rsc/helpers.d.ts +16 -0
  644. package/dist/rsc/helpers.d.ts.map +1 -0
  645. package/dist/rsc/helpers.js +55 -0
  646. package/dist/rsc/helpers.js.map +1 -0
  647. package/dist/rsc/index.d.ts +22 -0
  648. package/dist/rsc/index.d.ts.map +1 -0
  649. package/dist/rsc/index.js +23 -0
  650. package/dist/rsc/index.js.map +1 -0
  651. package/dist/rsc/nonce.d.ts +9 -0
  652. package/dist/rsc/nonce.d.ts.map +1 -0
  653. package/dist/rsc/nonce.js +18 -0
  654. package/dist/rsc/nonce.js.map +1 -0
  655. package/dist/rsc/types.d.ts +206 -0
  656. package/dist/rsc/types.d.ts.map +1 -0
  657. package/dist/rsc/types.js +8 -0
  658. package/dist/rsc/types.js.map +1 -0
  659. package/dist/search-params.d.ts +103 -0
  660. package/dist/search-params.d.ts.map +1 -0
  661. package/dist/search-params.js +74 -0
  662. package/dist/search-params.js.map +1 -0
  663. package/dist/segment-system.d.ts +75 -0
  664. package/dist/segment-system.d.ts.map +1 -0
  665. package/dist/segment-system.js +336 -0
  666. package/dist/segment-system.js.map +1 -0
  667. package/dist/server/context.d.ts +245 -0
  668. package/dist/server/context.d.ts.map +1 -0
  669. package/dist/server/context.js +197 -0
  670. package/dist/server/context.js.map +1 -0
  671. package/dist/server/fetchable-loader-store.d.ts +18 -0
  672. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  673. package/dist/server/fetchable-loader-store.js +18 -0
  674. package/dist/server/fetchable-loader-store.js.map +1 -0
  675. package/dist/server/handle-store.d.ts +85 -0
  676. package/dist/server/handle-store.d.ts.map +1 -0
  677. package/dist/server/handle-store.js +142 -0
  678. package/dist/server/handle-store.js.map +1 -0
  679. package/dist/server/loader-registry.d.ts +55 -0
  680. package/dist/server/loader-registry.d.ts.map +1 -0
  681. package/dist/server/loader-registry.js +132 -0
  682. package/dist/server/loader-registry.js.map +1 -0
  683. package/dist/server/request-context.d.ts +226 -0
  684. package/dist/server/request-context.d.ts.map +1 -0
  685. package/dist/server/request-context.js +290 -0
  686. package/dist/server/request-context.js.map +1 -0
  687. package/dist/server/root-layout.d.ts +4 -0
  688. package/dist/server/root-layout.d.ts.map +1 -0
  689. package/dist/server/root-layout.js +5 -0
  690. package/dist/server/root-layout.js.map +1 -0
  691. package/dist/server.d.ts +15 -0
  692. package/dist/server.d.ts.map +1 -0
  693. package/dist/server.js +20 -0
  694. package/dist/server.js.map +1 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  698. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  699. package/dist/ssr/index.d.ts +98 -0
  700. package/dist/ssr/index.d.ts.map +1 -0
  701. package/dist/ssr/index.js +158 -0
  702. package/dist/ssr/index.js.map +1 -0
  703. package/dist/static-handler.d.ts +50 -0
  704. package/dist/static-handler.d.ts.map +1 -0
  705. package/dist/static-handler.gen.d.ts +5 -0
  706. package/dist/static-handler.gen.d.ts.map +1 -0
  707. package/dist/static-handler.gen.js +5 -0
  708. package/dist/static-handler.gen.js.map +1 -0
  709. package/dist/static-handler.js +29 -0
  710. package/dist/static-handler.js.map +1 -0
  711. package/dist/theme/ThemeProvider.d.ts +20 -0
  712. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  713. package/dist/theme/ThemeProvider.js +240 -0
  714. package/dist/theme/ThemeProvider.js.map +1 -0
  715. package/dist/theme/ThemeScript.d.ts +48 -0
  716. package/dist/theme/ThemeScript.d.ts.map +1 -0
  717. package/dist/theme/ThemeScript.js +13 -0
  718. package/dist/theme/ThemeScript.js.map +1 -0
  719. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  720. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  721. package/dist/theme/__tests__/theme.test.js +103 -0
  722. package/dist/theme/__tests__/theme.test.js.map +1 -0
  723. package/dist/theme/constants.d.ts +29 -0
  724. package/dist/theme/constants.d.ts.map +1 -0
  725. package/dist/theme/constants.js +48 -0
  726. package/dist/theme/constants.js.map +1 -0
  727. package/dist/theme/index.d.ts +31 -0
  728. package/dist/theme/index.d.ts.map +1 -0
  729. package/dist/theme/index.js +36 -0
  730. package/dist/theme/index.js.map +1 -0
  731. package/dist/theme/theme-context.d.ts +40 -0
  732. package/dist/theme/theme-context.d.ts.map +1 -0
  733. package/dist/theme/theme-context.js +60 -0
  734. package/dist/theme/theme-context.js.map +1 -0
  735. package/dist/theme/theme-script.d.ts +27 -0
  736. package/dist/theme/theme-script.d.ts.map +1 -0
  737. package/dist/theme/theme-script.js +147 -0
  738. package/dist/theme/theme-script.js.map +1 -0
  739. package/dist/theme/types.d.ts +163 -0
  740. package/dist/theme/types.d.ts.map +1 -0
  741. package/dist/theme/types.js +11 -0
  742. package/dist/theme/types.js.map +1 -0
  743. package/dist/theme/use-theme.d.ts +12 -0
  744. package/dist/theme/use-theme.d.ts.map +1 -0
  745. package/dist/theme/use-theme.js +40 -0
  746. package/dist/theme/use-theme.js.map +1 -0
  747. package/dist/types.d.ts +1479 -0
  748. package/dist/types.d.ts.map +1 -0
  749. package/dist/types.js +10 -0
  750. package/dist/types.js.map +1 -0
  751. package/dist/urls.d.ts +441 -0
  752. package/dist/urls.d.ts.map +1 -0
  753. package/dist/urls.gen.d.ts +8 -0
  754. package/dist/urls.gen.d.ts.map +1 -0
  755. package/dist/urls.gen.js +8 -0
  756. package/dist/urls.gen.js.map +1 -0
  757. package/dist/urls.js +443 -0
  758. package/dist/urls.js.map +1 -0
  759. package/dist/use-loader.d.ts +127 -0
  760. package/dist/use-loader.d.ts.map +1 -0
  761. package/dist/use-loader.js +237 -0
  762. package/dist/use-loader.js.map +1 -0
  763. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  767. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  771. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  775. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  777. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  779. package/dist/vite/ast-handler-extract.d.ts +49 -0
  780. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  781. package/dist/vite/ast-handler-extract.js +249 -0
  782. package/dist/vite/ast-handler-extract.js.map +1 -0
  783. package/dist/vite/expose-action-id.d.ts +19 -0
  784. package/dist/vite/expose-action-id.d.ts.map +1 -0
  785. package/dist/vite/expose-action-id.js +250 -0
  786. package/dist/vite/expose-action-id.js.map +1 -0
  787. package/dist/vite/expose-id-utils.d.ts +69 -0
  788. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  789. package/dist/vite/expose-id-utils.js +289 -0
  790. package/dist/vite/expose-id-utils.js.map +1 -0
  791. package/dist/vite/expose-internal-ids.d.ts +22 -0
  792. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  793. package/dist/vite/expose-internal-ids.js +886 -0
  794. package/dist/vite/expose-internal-ids.js.map +1 -0
  795. package/dist/vite/index.d.ts +149 -0
  796. package/dist/vite/index.d.ts.map +1 -0
  797. package/dist/vite/index.js +6440 -809
  798. package/dist/vite/index.js.bak +5448 -0
  799. package/dist/vite/index.js.map +1 -0
  800. package/dist/vite/index.named-routes.gen.ts +103 -0
  801. package/dist/vite/package-resolution.d.ts +43 -0
  802. package/dist/vite/package-resolution.d.ts.map +1 -0
  803. package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
  804. package/dist/vite/package-resolution.js.map +1 -0
  805. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  806. package/dist/vite/virtual-entries.d.ts +25 -0
  807. package/dist/vite/virtual-entries.d.ts.map +1 -0
  808. package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +18 -17
  809. package/dist/vite/virtual-entries.js.map +1 -0
  810. package/package.json +140 -57
  811. package/skills/breadcrumbs/SKILL.md +252 -0
  812. package/skills/bundle-analysis/SKILL.md +159 -0
  813. package/skills/cache-guide/SKILL.md +484 -0
  814. package/skills/caching/SKILL.md +276 -226
  815. package/skills/composability/SKILL.md +197 -0
  816. package/skills/debug-manifest/SKILL.md +112 -0
  817. package/skills/document-cache/SKILL.md +106 -53
  818. package/skills/fonts/SKILL.md +167 -0
  819. package/skills/handler-use/SKILL.md +364 -0
  820. package/skills/hooks/SKILL.md +621 -67
  821. package/skills/host-router/SKILL.md +243 -0
  822. package/skills/i18n/SKILL.md +276 -0
  823. package/skills/intercept/SKILL.md +265 -202
  824. package/skills/layout/SKILL.md +261 -146
  825. package/skills/links/SKILL.md +471 -0
  826. package/skills/loader/SKILL.md +701 -250
  827. package/skills/middleware/SKILL.md +254 -320
  828. package/skills/migrate-nextjs/SKILL.md +562 -0
  829. package/skills/migrate-react-router/SKILL.md +769 -0
  830. package/skills/mime-routes/SKILL.md +155 -0
  831. package/skills/observability/SKILL.md +137 -0
  832. package/skills/parallel/SKILL.md +399 -158
  833. package/skills/prerender/SKILL.md +666 -0
  834. package/skills/rango/SKILL.md +338 -0
  835. package/skills/react-compiler/SKILL.md +168 -0
  836. package/skills/response-routes/SKILL.md +468 -0
  837. package/skills/route/SKILL.md +417 -89
  838. package/skills/router-setup/SKILL.md +389 -268
  839. package/skills/server-actions/SKILL.md +751 -0
  840. package/skills/streams-and-websockets/SKILL.md +283 -0
  841. package/skills/tailwind/SKILL.md +129 -0
  842. package/skills/testing/SKILL.md +549 -0
  843. package/skills/theme/SKILL.md +36 -11
  844. package/skills/typesafety/SKILL.md +747 -174
  845. package/skills/use-cache/SKILL.md +353 -0
  846. package/skills/view-transitions/SKILL.md +294 -0
  847. package/src/__augment-tests__/augment.ts +81 -0
  848. package/src/__augment-tests__/augmented.check.ts +117 -0
  849. package/src/__internal.ts +273 -0
  850. package/src/bin/rango.ts +321 -0
  851. package/src/browser/action-coordinator.ts +114 -0
  852. package/src/browser/app-shell.ts +52 -0
  853. package/src/browser/app-version.ts +14 -0
  854. package/src/browser/event-controller.ts +172 -128
  855. package/src/browser/history-state.ts +101 -0
  856. package/src/browser/index.ts +3 -3
  857. package/src/browser/intercept-utils.ts +52 -0
  858. package/src/browser/link-interceptor.ts +24 -4
  859. package/src/browser/logging.ts +55 -0
  860. package/src/browser/merge-segment-loaders.ts +20 -12
  861. package/src/browser/navigation-bridge.ts +390 -557
  862. package/src/browser/navigation-client.ts +228 -70
  863. package/src/browser/navigation-store.ts +104 -63
  864. package/src/browser/navigation-transaction.ts +279 -0
  865. package/src/browser/network-error-handler.ts +61 -0
  866. package/src/browser/partial-update.ts +397 -303
  867. package/src/browser/prefetch/cache.ts +314 -0
  868. package/src/browser/prefetch/fetch.ts +282 -0
  869. package/src/browser/prefetch/observer.ts +65 -0
  870. package/src/browser/prefetch/policy.ts +48 -0
  871. package/src/browser/prefetch/queue.ts +191 -0
  872. package/src/browser/prefetch/resource-ready.ts +77 -0
  873. package/src/browser/rango-state.ts +152 -0
  874. package/src/browser/react/Link.tsx +258 -74
  875. package/src/browser/react/NavigationProvider.tsx +237 -49
  876. package/src/browser/react/context.ts +11 -0
  877. package/src/browser/react/filter-segment-order.ts +55 -0
  878. package/src/browser/react/index.ts +15 -12
  879. package/src/browser/react/location-state-shared.ts +269 -56
  880. package/src/browser/react/location-state.ts +90 -19
  881. package/src/browser/react/mount-context.ts +37 -0
  882. package/src/browser/react/nonce-context.ts +23 -0
  883. package/src/browser/react/shallow-equal.ts +27 -0
  884. package/src/browser/react/use-action.ts +29 -51
  885. package/src/browser/react/use-client-cache.ts +5 -3
  886. package/src/browser/react/use-handle.ts +41 -98
  887. package/src/browser/react/use-href.tsx +20 -188
  888. package/src/browser/react/use-link-status.ts +6 -5
  889. package/src/browser/react/use-mount.ts +31 -0
  890. package/src/browser/react/use-navigation.ts +49 -80
  891. package/src/browser/react/use-params.ts +77 -0
  892. package/src/browser/react/use-pathname.ts +47 -0
  893. package/src/browser/react/use-reverse.ts +106 -0
  894. package/src/browser/react/use-router.ts +96 -0
  895. package/src/browser/react/use-search-params.ts +56 -0
  896. package/src/browser/react/use-segments.ts +85 -99
  897. package/src/browser/response-adapter.ts +98 -0
  898. package/src/browser/rsc-router.tsx +273 -78
  899. package/src/browser/scroll-restoration.ts +132 -49
  900. package/src/browser/segment-reconciler.ts +243 -0
  901. package/src/browser/segment-structure-assert.ts +83 -0
  902. package/src/browser/server-action-bridge.ts +504 -589
  903. package/src/browser/shallow.ts +6 -1
  904. package/src/browser/types.ts +184 -58
  905. package/src/browser/validate-redirect-origin.ts +29 -0
  906. package/src/build/collect-fallback-refs.ts +107 -0
  907. package/src/build/generate-manifest.ts +463 -0
  908. package/src/build/generate-route-types.ts +41 -0
  909. package/src/build/index.ts +37 -0
  910. package/src/build/route-trie.ts +292 -0
  911. package/src/build/route-types/ast-helpers.ts +25 -0
  912. package/src/build/route-types/ast-route-extraction.ts +98 -0
  913. package/src/build/route-types/codegen.ts +102 -0
  914. package/src/build/route-types/include-resolution.ts +418 -0
  915. package/src/build/route-types/param-extraction.ts +48 -0
  916. package/src/build/route-types/per-module-writer.ts +131 -0
  917. package/src/build/route-types/router-processing.ts +659 -0
  918. package/src/build/route-types/scan-filter.ts +85 -0
  919. package/src/build/route-types/source-scan.ts +118 -0
  920. package/src/build/runtime-discovery.ts +220 -0
  921. package/src/cache/background-task.ts +34 -0
  922. package/src/cache/cache-key-utils.ts +44 -0
  923. package/src/cache/cache-policy.ts +125 -0
  924. package/src/cache/cache-runtime.ts +342 -0
  925. package/src/cache/cache-scope.ts +150 -306
  926. package/src/cache/cf/cf-cache-store.ts +619 -24
  927. package/src/cache/cf/index.ts +13 -3
  928. package/src/cache/document-cache.ts +116 -77
  929. package/src/cache/handle-capture.ts +81 -0
  930. package/src/cache/handle-snapshot.ts +41 -0
  931. package/src/cache/index.ts +1 -15
  932. package/src/cache/memory-segment-store.ts +191 -13
  933. package/src/cache/profile-registry.ts +73 -0
  934. package/src/cache/read-through-swr.ts +134 -0
  935. package/src/cache/segment-codec.ts +256 -0
  936. package/src/cache/taint.ts +153 -0
  937. package/src/cache/types.ts +76 -121
  938. package/src/client.rsc.tsx +15 -15
  939. package/src/client.tsx +145 -309
  940. package/src/component-utils.ts +4 -4
  941. package/src/components/DefaultDocument.tsx +6 -2
  942. package/src/context-var.ts +156 -0
  943. package/src/debug.ts +243 -0
  944. package/src/decode-loader-results.ts +36 -0
  945. package/src/errors.ts +138 -3
  946. package/src/handle.ts +90 -22
  947. package/src/handles/MetaTags.tsx +76 -23
  948. package/src/handles/breadcrumbs.ts +66 -0
  949. package/src/handles/index.ts +1 -0
  950. package/src/handles/meta.ts +32 -15
  951. package/src/host/cookie-handler.ts +165 -0
  952. package/src/host/errors.ts +97 -0
  953. package/src/host/index.ts +53 -0
  954. package/src/host/pattern-matcher.ts +214 -0
  955. package/src/host/router.ts +424 -0
  956. package/src/host/testing.ts +79 -0
  957. package/src/host/types.ts +175 -0
  958. package/src/host/utils.ts +25 -0
  959. package/src/href-client.ts +263 -49
  960. package/src/index.rsc.ts +190 -29
  961. package/src/index.ts +278 -38
  962. package/src/internal-debug.ts +11 -0
  963. package/src/loader-store.ts +500 -0
  964. package/src/loader.rsc.ts +24 -142
  965. package/src/loader.ts +21 -11
  966. package/src/missing-id-error.ts +68 -0
  967. package/src/network-error-thrower.tsx +3 -1
  968. package/src/outlet-context.ts +1 -1
  969. package/src/outlet-provider.tsx +45 -0
  970. package/src/prerender/param-hash.ts +37 -0
  971. package/src/prerender/store.ts +186 -0
  972. package/src/prerender.ts +524 -0
  973. package/src/response-utils.ts +37 -0
  974. package/src/reverse.ts +380 -0
  975. package/src/root-error-boundary.tsx +41 -29
  976. package/src/route-content-wrapper.tsx +15 -39
  977. package/src/route-definition/dsl-helpers.ts +1109 -0
  978. package/src/route-definition/helper-factories.ts +90 -0
  979. package/src/route-definition/helpers-types.ts +506 -0
  980. package/src/route-definition/index.ts +55 -0
  981. package/src/route-definition/redirect.ts +101 -0
  982. package/src/route-definition/resolve-handler-use.ts +155 -0
  983. package/src/route-definition/use-item-types.ts +32 -0
  984. package/src/route-definition.ts +1 -1371
  985. package/src/route-map-builder.ts +247 -112
  986. package/src/route-name.ts +53 -0
  987. package/src/route-types.ts +99 -42
  988. package/src/router/basename.ts +14 -0
  989. package/src/router/content-negotiation.ts +228 -0
  990. package/src/router/debug-manifest.ts +72 -0
  991. package/src/router/error-handling.ts +10 -10
  992. package/src/router/find-match.ts +160 -0
  993. package/src/router/handler-context.ts +420 -88
  994. package/src/router/intercept-resolution.ts +388 -0
  995. package/src/router/lazy-includes.ts +237 -0
  996. package/src/router/loader-resolution.ts +374 -128
  997. package/src/router/logging.ts +251 -0
  998. package/src/router/manifest.ts +187 -43
  999. package/src/router/match-api.ts +556 -0
  1000. package/src/router/match-context.ts +6 -4
  1001. package/src/router/match-handlers.ts +483 -0
  1002. package/src/router/match-middleware/background-revalidation.ts +108 -93
  1003. package/src/router/match-middleware/cache-lookup.ts +413 -10
  1004. package/src/router/match-middleware/cache-store.ts +99 -26
  1005. package/src/router/match-middleware/intercept-resolution.ts +57 -17
  1006. package/src/router/match-middleware/segment-resolution.ts +80 -6
  1007. package/src/router/match-pipelines.ts +10 -45
  1008. package/src/router/match-result.ts +156 -36
  1009. package/src/router/metrics.ts +241 -16
  1010. package/src/router/middleware-cookies.ts +55 -0
  1011. package/src/router/middleware-types.ts +209 -0
  1012. package/src/router/middleware.ts +359 -346
  1013. package/src/router/navigation-snapshot.ts +182 -0
  1014. package/src/router/pattern-matching.ts +416 -41
  1015. package/src/router/prerender-match.ts +502 -0
  1016. package/src/router/preview-match.ts +100 -0
  1017. package/src/router/request-classification.ts +286 -0
  1018. package/src/router/revalidation.ts +195 -40
  1019. package/src/router/route-snapshot.ts +245 -0
  1020. package/src/router/router-context.ts +45 -23
  1021. package/src/router/router-interfaces.ts +501 -0
  1022. package/src/router/router-options.ts +657 -0
  1023. package/src/router/router-registry.ts +21 -0
  1024. package/src/router/segment-resolution/fresh.ts +769 -0
  1025. package/src/router/segment-resolution/helpers.ts +268 -0
  1026. package/src/router/segment-resolution/loader-cache.ts +199 -0
  1027. package/src/router/segment-resolution/revalidation.ts +1420 -0
  1028. package/src/router/segment-resolution/static-store.ts +67 -0
  1029. package/src/router/segment-resolution/view-transition-default.ts +36 -0
  1030. package/src/router/segment-resolution.ts +21 -0
  1031. package/src/router/segment-wrappers.ts +291 -0
  1032. package/src/router/substitute-pattern-params.ts +56 -0
  1033. package/src/router/telemetry-otel.ts +299 -0
  1034. package/src/router/telemetry.ts +399 -0
  1035. package/src/router/timeout.ts +148 -0
  1036. package/src/router/trie-matching.ts +244 -0
  1037. package/src/router/types.ts +87 -4
  1038. package/src/router/url-params.ts +49 -0
  1039. package/src/router.ts +768 -3574
  1040. package/src/rsc/handler-context.ts +45 -0
  1041. package/src/rsc/handler.ts +894 -806
  1042. package/src/rsc/helpers.ts +201 -19
  1043. package/src/rsc/index.ts +5 -25
  1044. package/src/rsc/loader-fetch.ts +229 -0
  1045. package/src/rsc/manifest-init.ts +90 -0
  1046. package/src/rsc/nonce.ts +14 -0
  1047. package/src/rsc/origin-guard.ts +159 -0
  1048. package/src/rsc/progressive-enhancement.ts +395 -0
  1049. package/src/rsc/response-error.ts +37 -0
  1050. package/src/rsc/response-route-handler.ts +340 -0
  1051. package/src/rsc/rsc-rendering.ts +230 -0
  1052. package/src/rsc/runtime-warnings.ts +41 -0
  1053. package/src/rsc/server-action.ts +336 -0
  1054. package/src/rsc/ssr-setup.ts +144 -0
  1055. package/src/rsc/types.ts +54 -14
  1056. package/src/search-params.ts +230 -0
  1057. package/src/segment-content-promise.ts +67 -0
  1058. package/src/segment-loader-promise.ts +122 -0
  1059. package/src/segment-system.tsx +265 -115
  1060. package/src/serialize.ts +243 -0
  1061. package/src/server/context.ts +480 -90
  1062. package/src/server/cookie-store.ts +214 -0
  1063. package/src/server/fetchable-loader-store.ts +37 -0
  1064. package/src/server/handle-store.ts +117 -20
  1065. package/src/server/loader-registry.ts +24 -64
  1066. package/src/server/request-context.ts +613 -109
  1067. package/src/server.ts +36 -131
  1068. package/src/ssr/index.tsx +164 -25
  1069. package/src/static-handler.ts +126 -0
  1070. package/src/testing/cache-status.ts +166 -0
  1071. package/src/testing/collect-handle.ts +63 -0
  1072. package/src/testing/dispatch.ts +440 -0
  1073. package/src/testing/dom.entry.ts +22 -0
  1074. package/src/testing/e2e/fixture.ts +154 -0
  1075. package/src/testing/e2e/index.ts +149 -0
  1076. package/src/testing/e2e/matchers.ts +51 -0
  1077. package/src/testing/e2e/page-helpers.ts +272 -0
  1078. package/src/testing/e2e/parity.ts +306 -0
  1079. package/src/testing/e2e/server.ts +183 -0
  1080. package/src/testing/flight-matchers.ts +104 -0
  1081. package/src/testing/flight-runtime.d.ts +21 -0
  1082. package/src/testing/flight.entry.ts +22 -0
  1083. package/src/testing/flight.ts +182 -0
  1084. package/src/testing/generated-routes.ts +223 -0
  1085. package/src/testing/index.ts +98 -0
  1086. package/src/testing/internal/context.ts +151 -0
  1087. package/src/testing/render-route.tsx +536 -0
  1088. package/src/testing/run-loader.ts +296 -0
  1089. package/src/testing/run-middleware.ts +170 -0
  1090. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  1091. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  1092. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  1093. package/src/testing/vitest-stubs/version.ts +5 -0
  1094. package/src/testing/vitest.ts +112 -0
  1095. package/src/theme/ThemeProvider.tsx +21 -15
  1096. package/src/theme/ThemeScript.tsx +5 -5
  1097. package/src/theme/constants.ts +11 -4
  1098. package/src/theme/index.ts +4 -14
  1099. package/src/theme/theme-context.ts +5 -31
  1100. package/src/theme/theme-script.ts +21 -18
  1101. package/src/theme/types.ts +1 -1
  1102. package/src/types/boundaries.ts +158 -0
  1103. package/src/types/cache-types.ts +198 -0
  1104. package/src/types/error-types.ts +192 -0
  1105. package/src/types/global-namespace.ts +113 -0
  1106. package/src/types/handler-context.ts +809 -0
  1107. package/src/types/index.ts +89 -0
  1108. package/src/types/loader-types.ts +209 -0
  1109. package/src/types/request-scope.ts +126 -0
  1110. package/src/types/route-config.ts +170 -0
  1111. package/src/types/route-entry.ts +120 -0
  1112. package/src/types/segments.ts +184 -0
  1113. package/src/types.ts +1 -1561
  1114. package/src/urls/include-helper.ts +164 -0
  1115. package/src/urls/index.ts +50 -0
  1116. package/src/urls/path-helper-types.ts +380 -0
  1117. package/src/urls/path-helper.ts +329 -0
  1118. package/src/urls/pattern-types.ts +124 -0
  1119. package/src/urls/response-types.ts +109 -0
  1120. package/src/urls/type-extraction.ts +282 -0
  1121. package/src/urls/urls-function.ts +94 -0
  1122. package/src/urls.ts +1 -726
  1123. package/src/use-loader.tsx +559 -108
  1124. package/src/vite/debug.ts +185 -0
  1125. package/src/vite/discovery/bundle-postprocess.ts +181 -0
  1126. package/src/vite/discovery/discover-routers.ts +398 -0
  1127. package/src/vite/discovery/discovery-errors.ts +194 -0
  1128. package/src/vite/discovery/gate-state.ts +171 -0
  1129. package/src/vite/discovery/prerender-collection.ts +480 -0
  1130. package/src/vite/discovery/route-types-writer.ts +214 -0
  1131. package/src/vite/discovery/self-gen-tracking.ts +73 -0
  1132. package/src/vite/discovery/state.ts +150 -0
  1133. package/src/vite/discovery/virtual-module-codegen.ts +193 -0
  1134. package/src/vite/index.ts +20 -785
  1135. package/src/vite/plugin-types.ts +170 -0
  1136. package/src/vite/plugins/cjs-to-esm.ts +94 -0
  1137. package/src/vite/plugins/client-ref-dedup.ts +131 -0
  1138. package/src/vite/plugins/client-ref-hashing.ts +128 -0
  1139. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1140. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1141. package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
  1142. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +109 -66
  1143. package/src/vite/plugins/expose-id-utils.ts +303 -0
  1144. package/src/vite/plugins/expose-ids/export-analysis.ts +376 -0
  1145. package/src/vite/plugins/expose-ids/handler-transform.ts +156 -0
  1146. package/src/vite/plugins/expose-ids/loader-transform.ts +72 -0
  1147. package/src/vite/plugins/expose-ids/router-transform.ts +127 -0
  1148. package/src/vite/plugins/expose-ids/types.ts +45 -0
  1149. package/src/vite/plugins/expose-internal-ids.ts +796 -0
  1150. package/src/vite/plugins/performance-tracks.ts +92 -0
  1151. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1152. package/src/vite/plugins/use-cache-transform.ts +338 -0
  1153. package/src/vite/plugins/version-injector.ts +99 -0
  1154. package/src/vite/plugins/version-plugin.ts +323 -0
  1155. package/src/vite/plugins/virtual-entries.ts +123 -0
  1156. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  1157. package/src/vite/rango.ts +549 -0
  1158. package/src/vite/router-discovery.ts +1568 -0
  1159. package/src/vite/utils/ast-handler-extract.ts +517 -0
  1160. package/src/vite/utils/banner.ts +36 -0
  1161. package/src/vite/utils/bundle-analysis.ts +139 -0
  1162. package/src/vite/utils/client-chunks.ts +190 -0
  1163. package/src/vite/utils/forward-user-plugins.ts +193 -0
  1164. package/src/vite/utils/manifest-utils.ts +86 -0
  1165. package/src/vite/utils/package-resolution.ts +161 -0
  1166. package/src/vite/utils/prerender-utils.ts +222 -0
  1167. package/src/vite/utils/shared-utils.ts +251 -0
  1168. package/CLAUDE.md +0 -7
  1169. package/src/__tests__/component-utils.test.ts +0 -76
  1170. package/src/__tests__/route-definition.test.ts +0 -63
  1171. package/src/__tests__/urls.test.tsx +0 -436
  1172. package/src/browser/lru-cache.ts +0 -69
  1173. package/src/browser/request-controller.ts +0 -164
  1174. package/src/cache/__tests__/document-cache.test.ts +0 -522
  1175. package/src/cache/__tests__/memory-segment-store.test.ts +0 -487
  1176. package/src/cache/__tests__/memory-store.test.ts +0 -484
  1177. package/src/cache/cf/__tests__/cf-cache-store.test.ts +0 -428
  1178. package/src/cache/memory-store.ts +0 -253
  1179. package/src/href.ts +0 -177
  1180. package/src/route-utils.ts +0 -89
  1181. package/src/router/__tests__/match-context.test.ts +0 -104
  1182. package/src/router/__tests__/match-pipelines.test.ts +0 -537
  1183. package/src/router/__tests__/match-result.test.ts +0 -566
  1184. package/src/router/__tests__/on-error.test.ts +0 -935
  1185. package/src/router/__tests__/pattern-matching.test.ts +0 -577
  1186. package/src/router/middleware.test.ts +0 -1355
  1187. package/src/rsc/__tests__/helpers.test.ts +0 -175
  1188. package/src/server/__tests__/request-context.test.ts +0 -171
  1189. package/src/ssr/__tests__/ssr-handler.test.tsx +0 -188
  1190. package/src/theme/__tests__/theme.test.ts +0 -120
  1191. package/src/vite/__tests__/expose-loader-id.test.ts +0 -117
  1192. package/src/vite/expose-handle-id.ts +0 -209
  1193. package/src/vite/expose-loader-id.ts +0 -357
  1194. package/src/vite/expose-location-state-id.ts +0 -177
  1195. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
@@ -0,0 +1,549 @@
1
+ ---
2
+ name: testing
3
+ description: Test @rangojs/router apps — unit (loaders/middleware/reverse/components), integration (dispatch/Flight), and e2e (dev+prod parity, progressive enhancement)
4
+ argument-hint: [layer]
5
+ ---
6
+
7
+ # Testing @rangojs/router apps
8
+
9
+ Rango ships six consumer-facing testing entries, one per test runtime/dependency:
10
+ `@rangojs/router/testing` (unit + integration, under a Vite-driven Vitest
11
+ project), `@rangojs/router/testing/vitest` (the `rangoTestAliases` setup preset),
12
+ `@rangojs/router/testing/dom` (`renderRoute`, needs RTL + a DOM env),
13
+ `@rangojs/router/testing/e2e` (the Playwright harness),
14
+ `@rangojs/router/testing/flight` (real Flight, react-server condition only), and
15
+ `@rangojs/router/testing/flight-matchers` (the Flight matchers).
16
+ The hard problem in an RSC app is that the layer you reach for is dictated by
17
+ **what the behavior touches** — a pure predicate is a one-line vitest test; a
18
+ real async Server Component cannot be a plain node test at all. Pick the layer
19
+ **first**, then the primitive. Reaching one layer too high (e2e for a reverse
20
+ function) is slow; one too low (a node test for Flight) fails to compile or
21
+ silently asserts nothing.
22
+
23
+ For the prose guide with full setup and migration, see
24
+ [`docs/testing.md`](https://github.com/ivogt/vite-rsc/blob/main/packages/rangojs-router/docs/testing.md)
25
+ (the `docs/` directory is not shipped in the published package, so this is an
26
+ absolute link).
27
+
28
+ ## When to use
29
+
30
+ Use this skill when adding or changing tests for a Rango app: a loader,
31
+ middleware, a route map, a client component, a response route, cache/SWR
32
+ behavior, prerender, or a navigation/PE flow.
33
+
34
+ Two non-negotiable mandates (from the repo's `CLAUDE.md`, and they apply to
35
+ consumer apps too):
36
+
37
+ - **Every e2e covers BOTH dev and production.** A dev-only e2e is not
38
+ acceptable. Use `parityDescribe` — it generates the dev and production
39
+ describes from one body, so you cannot forget the prod half.
40
+ - **Progressive-enhancement parity** is a first-class assertion. A form-driven
41
+ flow must produce the same observable result with JS on and JS off. Use
42
+ `expectParity`.
43
+
44
+ ## The read-first shape
45
+
46
+ Four import roots, each matched to the dependency/runtime that can load it —
47
+ this split is forced by hard walls, not preference:
48
+
49
+ - `@rangojs/router/testing` — unit + integration primitives. Run these under a
50
+ **Vite-driven Vitest** project with the rango Vite plugin active (the router
51
+ internals import the `@rangojs/router:version` virtual module; without the
52
+ plugin, alias `@rangojs/router:version`). It references neither React,
53
+ `@testing-library/react`, Playwright, nor the RSC runtime — a unit suite
54
+ testing only loaders/middleware/`dispatch` pulls in none of them.
55
+ - `@rangojs/router/testing/dom` — `renderRoute` (the RTL component stub). Kept
56
+ separate so the unit barrel above stays free of React/RTL; it lazy-loads
57
+ `@testing-library/react` at call time and needs a DOM env (happy-dom/jsdom).
58
+ - `@rangojs/router/testing/e2e` — the Playwright harness. Kept separate so it
59
+ loads in a plain (non-Vite) Playwright runner; the unit barrel pulls in
60
+ router-manifest code that a Playwright loader cannot resolve. The helpers take
61
+ your `test`/`expect` as parameters, so this entry never imports
62
+ `@playwright/test` at runtime.
63
+ - `@rangojs/router/testing/flight` — real Flight rendering. Its serializer loads
64
+ only under the `react-server` node condition; pulling it elsewhere throws.
65
+
66
+ The single rule that drives everything:
67
+
68
+ > **If the behavior needs a real Flight render, it cannot be a plain vitest node
69
+ > test.** It is either `renderToFlightString` (under the react-server vitest
70
+ > project) or an e2e test. There is no middle ground in node.
71
+
72
+ ## Decision tree: behavior -> layer -> primitive
73
+
74
+ | The behavior is… | Layer | Primitive | Import root |
75
+ | --------------------------------------------------------------------------------------------------------- | ------------ | ---------------------------------------------------------------- | -------------------------------- |
76
+ | a pure function / `reverse` / a predicate (`revalidate`, `isAction`) | unit (node) | call it directly; `runMiddleware`/`runLoader` for ctx | `@rangojs/router/testing` |
77
+ | one loader's data logic | unit (node) | `runLoader` (pass the **raw fn**, not `createLoader`) | `@rangojs/router/testing` |
78
+ | one middleware's ordering / short-circuit / cookie+header merge | unit (node) | `runMiddleware` | `@rangojs/router/testing` |
79
+ | a CLIENT component reading router context (`useParams`/`useReverse`/`Outlet`/`useNavigation`/`useLoader`) | unit (DOM) | `renderRoute` (needs happy-dom/jsdom + `@testing-library/react`) | `@rangojs/router/testing/dom` |
80
+ | a redirect / status / headers / cookies / **response route** (json/text/html/xml/md), no Flight | integration | `dispatch` (router -> Response) | `@rangojs/router/testing` |
81
+ | a real async **Server Component** / Flight serialization shape | RSC unit | `renderToFlightString` + `toMatchFlight` | `@rangojs/router/testing/flight` |
82
+ | navigation, hydration, PE parity, view transitions, real SSR | e2e | `createRangoE2E` -> `parityDescribe`/`expectParity` | `@rangojs/router/testing/e2e` |
83
+ | cache hit/miss/stale, prerender (= a cache hit by design) | e2e + signal | `assertCacheStatus` / telemetry sink (gate on) | `@rangojs/router/testing` |
84
+ | generated route map drift vs runtime | unit (node) | `assertGeneratedRoutesMatch` | `@rangojs/router/testing` |
85
+
86
+ Cross-references: `/loader`, `/middleware`, `/server-actions`, `/caching`,
87
+ `/prerender`, `/typesafety`.
88
+
89
+ ## Unit recipes (vitest, node)
90
+
91
+ ### runMiddleware — ordering, short-circuit, cookie/header merge
92
+
93
+ Runs the chain through the router's **real** `executeMiddleware`, so
94
+ `next()`, return-Response short-circuit, throw-Response short-circuit,
95
+ double-next guards, and header/cookie merging behave exactly as in production.
96
+ `nextCalled` is `0` on short-circuit, `1` on pass-through. The returned `ctx` is
97
+ the underlying `RequestContext` — read `ctx.cookies()`, `ctx.get(...)`,
98
+ `ctx.res.headers`.
99
+
100
+ ```ts
101
+ import { describe, it, expect } from "vitest";
102
+ import { runMiddleware } from "@rangojs/router/testing";
103
+ import type { MiddlewareFn } from "@rangojs/router";
104
+
105
+ const requireUser: MiddlewareFn = async (ctx, next) => {
106
+ if (!ctx.get("user")) return new Response(null, { status: 401 });
107
+ return next();
108
+ };
109
+
110
+ it("passes through when the user is present", async () => {
111
+ const { response, nextCalled } = await runMiddleware(
112
+ requireUser,
113
+ "/dashboard",
114
+ {
115
+ vars: { user: { id: 1 } }, // object form; or [[key, value]] tuples (key may be a createVar())
116
+ },
117
+ );
118
+ expect(nextCalled).toBe(1);
119
+ expect(response.status).toBe(200);
120
+ });
121
+
122
+ it("short-circuits (return OR throw Response) when unauthenticated", async () => {
123
+ const { response, nextCalled } = await runMiddleware(
124
+ requireUser,
125
+ "/dashboard",
126
+ );
127
+ expect(nextCalled).toBe(0);
128
+ expect(response.status).toBe(401);
129
+ });
130
+ ```
131
+
132
+ Seed prior-middleware state with `vars` (string key or `createVar()` handle).
133
+ Model the downstream route with `next`. Enable `ctx.reverse(...)` by passing
134
+ `routeMap` (and `routeName` for scoped `.name` resolution). Pass an array to run
135
+ several in order. Cookies set via `cookies().set(...)` surface both on
136
+ `ctx.cookies()` and on the merged response `Set-Cookie`.
137
+
138
+ ### runLoader — one loader's data logic
139
+
140
+ Pass the **RAW loader function** `(ctx) => ...`, NOT a `createLoader(...)`
141
+ handle. `createLoader` relies on the Vite `$$id` injection for RSC
142
+ registration, which does not exist in a bare vitest process — calling it gives
143
+ you a handle with no `fn` to run. `runLoader` invokes your function directly
144
+ against a real `RequestContext`, so cookies, headers, `ctx.get`, and
145
+ `ctx.reverse` resolve.
146
+
147
+ ```ts
148
+ import { runLoader } from "@rangojs/router/testing";
149
+ import { createVar } from "@rangojs/router";
150
+
151
+ // CORRECT: test the function body directly.
152
+ async function productLoaderBody(ctx) {
153
+ return { id: ctx.params.id, region: ctx.env.REGION, user: ctx.get(User) };
154
+ }
155
+
156
+ it("reads params, env, and seeded vars", async () => {
157
+ const User = createVar<{ name: string }>();
158
+ const data = await runLoader(productLoaderBody, {
159
+ params: { id: "42" },
160
+ env: { REGION: "eu" },
161
+ vars: [[User, { name: "Ada" }]],
162
+ });
163
+ expect(data).toEqual({ id: "42", region: "eu", user: { name: "Ada" } });
164
+ });
165
+ ```
166
+
167
+ Options: `params` (also surfaced as `routeParams`), `search`, `env`, `vars`,
168
+ `method`/`body`/`formData`, `routeMap`/`routeName` (for `ctx.reverse`), and
169
+ `use` (a resolver for `ctx.use(OtherLoader)` composition — without it, `ctx.use`
170
+ runs the dependency's own `fn` if it carries one).
171
+
172
+ Two unit-only limitations to document in your test, not work around:
173
+
174
+ - `ctx.reverse(...)` **throws** unless you pass `routeMap`.
175
+ - `ctx.rendered()` **throws** (the DSL render barrier only exists in a full
176
+ match) and `ctx.isAction(...)` (the action-render context) is not available —
177
+ test those with `renderToFlightString` or e2e.
178
+
179
+ If your real loader source is `export const L = createLoader(async (ctx) => {...})`,
180
+ extract the inner async function so it is importable on its own, and register
181
+ the `createLoader` wrapper in `urls()`. Then `runLoader` tests the body and the
182
+ DSL/e2e tests cover registration.
183
+
184
+ ### renderRoute — a client component reading router context
185
+
186
+ RTL-style stub. Peer of React Router's `createRoutesStub` / Expo's
187
+ `renderRouter`. It mounts the router's real `NavigationProvider` plus a
188
+ synthetic segment tree so `useParams`, `useReverse`, `useNavigation`, `Outlet`,
189
+ `usePathname`, `useSearchParams`, and `useLoader`/`useFetchLoader` (reading
190
+ **seeded** data) resolve — no server, no Vite, no Flight round-trip. It is
191
+ `async` (lazy-loads `@testing-library/react`).
192
+
193
+ ```tsx
194
+ // @vitest-environment happy-dom
195
+ import { describe, it, expect, afterEach } from "vitest";
196
+ import { cleanup } from "@testing-library/react";
197
+ import { renderRoute } from "@rangojs/router/testing/dom";
198
+ import { Outlet, useParams, useReverse } from "@rangojs/router/client";
199
+
200
+ afterEach(cleanup);
201
+
202
+ function Layout() {
203
+ return (
204
+ <div>
205
+ <span data-testid="shell">shell</span>
206
+ <Outlet />
207
+ </div>
208
+ );
209
+ }
210
+ function Product() {
211
+ const { productId } = useParams<{ productId: string }>();
212
+ const reverse = useReverse({ product: "/products/:productId" });
213
+ return (
214
+ <a data-testid="link" href={reverse("product", { productId: "2" })}>
215
+ {productId}
216
+ </a>
217
+ );
218
+ }
219
+
220
+ it("resolves params + reverse + Outlet through the layout chain", async () => {
221
+ const { getByTestId, router } = await renderRoute(
222
+ [
223
+ { path: "/products", Component: Layout }, // layout (root)
224
+ { path: "/products/:productId", Component: Product }, // leaf (last)
225
+ ],
226
+ { initialUrl: "/products/1" },
227
+ );
228
+ expect(getByTestId("shell").textContent).toBe("shell");
229
+ expect(getByTestId("link").getAttribute("href")).toBe("/products/2");
230
+
231
+ await router.navigate("/products/2"); // client-only nav, re-resolves the same routes
232
+ expect(router.pathname()).toBe("/products/2");
233
+ });
234
+ ```
235
+
236
+ `RenderRouteSpec = { path, Component, layout?, loaderIds?, name? }`. The array
237
+ is the layout chain root-to-leaf; the **last** entry is the leaf route. Seed
238
+ loader reads with `options.loaderData` keyed by the loader's `$$id`; attach a
239
+ loader to a specific layout via that spec's `loaderIds`:
240
+
241
+ ```tsx
242
+ const CartLoader = {
243
+ __brand: "loader",
244
+ $$id: "loaders/cart#CartLoader",
245
+ } as any;
246
+ await renderRoute(
247
+ [
248
+ { path: "/shop", Component: CartLayout, loaderIds: [CartLoader.$$id] },
249
+ { path: "/shop/item", Component: Page },
250
+ ],
251
+ { initialUrl: "/shop/item", loaderData: { [CartLoader.$$id]: { count: 3 } } },
252
+ );
253
+ ```
254
+
255
+ FIDELITY CAVEAT — this is the **client tree only**. It does NOT catch
256
+ server/client boundary reference-identity remount bugs, real Flight
257
+ serialization errors, loader execution, middleware, or handler ordering. Those
258
+ are `renderToFlightString` / e2e territory. Loader data is seeded, never run.
259
+ Needs a DOM env (`// @vitest-environment happy-dom`, or jsdom) and the consumer
260
+ must install `@testing-library/react` (optional peer).
261
+
262
+ CATCH — streaming `use(promise)` Suspense content (e.g. an async breadcrumb
263
+ `content: Promise<ReactNode>`): a plain `Promise.resolve(node)` does NOT flush
264
+ its Suspense retry in RTL/happy-dom (renderRoute renders internally, not inside
265
+ an awaited `act`), so the DOM stays on the fallback. Assert the **pending**
266
+ fallback with a never-resolving `new Promise(() => {})`; for the **arrived**
267
+ state pass an already-settled promise so `use()` reads it synchronously:
268
+ `const p = Promise.resolve(node) as any; p.status = "fulfilled"; p.value = node;`.
269
+ The real pending→resolved transition is an e2e concern.
270
+
271
+ ### Type-level test: a reverse misuse should fail to compile
272
+
273
+ `reverse`/`href` are compile-time checked (`/typesafety`). Pin that contract
274
+ with `@ts-expect-error` — a _runtime_ test cannot.
275
+
276
+ ```ts
277
+ import { useReverse } from "@rangojs/router/client";
278
+ const reverse = useReverse({ product: "/products/:productId" });
279
+ reverse("product", { productId: "2" }); // ok
280
+ // @ts-expect-error missing required param
281
+ reverse("product", {});
282
+ // @ts-expect-error unknown route name
283
+ reverse("nope", {});
284
+ ```
285
+
286
+ ## Integration recipes
287
+
288
+ ### dispatch — request -> Response, without Flight
289
+
290
+ In-process matching + middleware, no RSC render. Covers `308` redirects
291
+ (trailing slash etc.) with `Location`, `404`, response routes
292
+ (json/text/html/xml/md with content negotiation), and **global + route-level
293
+ middleware** short-circuits with full `next()`/throw/header+cookie fidelity. It
294
+ reuses the router's own `previewMatch`, so middleware collection is the router's,
295
+ not a re-implementation. Hitting an RSC (component) route throws a clear
296
+ directive error.
297
+
298
+ SETUP CAVEAT (use the preset): `@rangojs/router` resolves to server-only STUBS
299
+ outside the `react-server` condition (urls/createRouter/cookies/getRequestContext
300
+ throw), and importing your router also pulls `@vitejs/plugin-rsc/rsc` (whose body
301
+ imports Vite virtuals). Vitest does not apply the `react-server` condition to
302
+ bare-package resolution. The preset `@rangojs/router/testing/vitest` handles all
303
+ of it — alias `@rangojs/router` to real impls + stub the virtuals — so no
304
+ per-file `vi.mock` is needed:
305
+
306
+ ```ts
307
+ // vitest.config.ts
308
+ import { defineConfig } from "vitest/config";
309
+ import { rangoTestAliases } from "@rangojs/router/testing/vitest";
310
+ export default defineConfig({
311
+ test: {
312
+ globals: true,
313
+ include: ["test/**/*.test.{ts,tsx}"],
314
+ environment: "node",
315
+ },
316
+ resolve: { alias: rangoTestAliases({ cloudflare: true }) },
317
+ });
318
+ ```
319
+
320
+ LIMITATION: the FULL router usually can't be imported in a bare test —
321
+ `Prerender()`/`createLoader()` need the plugin-injected `$$id` (real `Prerender()`
322
+ throws "missing $$id"). Build a router from a `Prerender`-free include (your API
323
+ routes); `dispatch` accepts the public router type with no cast:
324
+
325
+ ```ts
326
+ import { describe, it, expect } from "vitest";
327
+ import { dispatch } from "@rangojs/router/testing";
328
+ import { createRouter } from "@rangojs/router";
329
+ import { apiPatterns } from "../src/api/urls"; // path.json(...) routes only
330
+
331
+ const router = createRouter().routes(apiPatterns);
332
+
333
+ it("serializes a JSON response route (auto-wrapped under data)", async () => {
334
+ const res = await dispatch(router, "/health");
335
+ expect(res.status).toBe(200);
336
+ expect(await res.json()).toEqual({ data: { status: "ok" } });
337
+ });
338
+
339
+ it("maps a thrown RouterError to its status + typed JSON envelope", async () => {
340
+ const res = await dispatch(router, "/products/999");
341
+ expect(res.status).toBe(404);
342
+ expect((await res.json()).error.code).toBe("NOT_FOUND");
343
+ });
344
+ ```
345
+
346
+ ### renderToFlightString — real async Server Component
347
+
348
+ A REAL Flight render of an async Server Component, in plain node — but ONLY
349
+ under the `react-server` condition (see the next section for the vitest
350
+ project). The render runs inside a request context, so async components can call
351
+ `getRequestContext()`, read params, cookies, etc.
352
+
353
+ ```tsx
354
+ // flight.rsc-test.tsx (note the *.rsc-test suffix)
355
+ import { describe, it, expect } from "vitest";
356
+ import { renderToFlightString } from "@rangojs/router/testing/flight";
357
+ // Matchers are a SEPARATE subpath (they import vitest); renderToFlightString does not.
358
+ import { flightMatchers } from "@rangojs/router/testing/flight-matchers";
359
+
360
+ expect.extend(flightMatchers);
361
+
362
+ // Keep components PURE leaves: take data as props. Do NOT import a server API
363
+ // (getRequestContext, cookies) from the `@rangojs/router` barrel — under the
364
+ // react-server condition the bare specifier resolves to the throwing stub, so
365
+ // it cannot be flight-tested in a bare consumer project.
366
+ async function Greeting({ name }: { name: string }) {
367
+ await Promise.resolve();
368
+ return <div>Hello {name}!</div>;
369
+ }
370
+ async function ItemView({ id }: { id: string }) {
371
+ return <span>id={id}</span>;
372
+ }
373
+
374
+ it("renders text and props", async () => {
375
+ expect(await renderToFlightString(<Greeting name="Ada" />)).toMatchFlight(
376
+ "Ada",
377
+ );
378
+ expect(await renderToFlightString(<ItemView id="42" />)).toMatchFlight("42");
379
+ });
380
+
381
+ it("matches a normalized snapshot", async () => {
382
+ expect(
383
+ await renderToFlightString(<Greeting name="World" />),
384
+ ).toMatchFlightSnapshot();
385
+ });
386
+ ```
387
+
388
+ `toMatchFlight(substring)` asserts the normalized Flight string CONTAINS the
389
+ substring (containment, not equality — the row framing is an internal serializer
390
+ detail). `toMatchFlightSnapshot()` snapshots the normalized payload. SCOPE:
391
+ server-only / leaf trees — a client component emits an unresolved `I[...]` import
392
+ row against the empty client manifest (fine for snapshotting shape, not
393
+ hydratable). A true interactive, clickable DOM `renderServer` is a DEFERRED
394
+ follow-up: the react-server-vs-default condition wall requires a two-environment
395
+ setup. For interactive server-component behavior today, use e2e.
396
+
397
+ ## E2E recipes (Playwright)
398
+
399
+ Wire the harness once, passing your own Playwright `test`/`expect` (so
400
+ `@rangojs/router/testing/e2e` never imports `@playwright/test` at runtime — it is
401
+ an optional peer you install). Import the harness from the **`/e2e` entry** — the
402
+ unit barrel is not loadable in a plain Playwright runner:
403
+
404
+ ```ts
405
+ // e2e/helper.ts
406
+ import { test, expect } from "@playwright/test";
407
+ import { createRangoE2E } from "@rangojs/router/testing/e2e";
408
+
409
+ export const e2e = createRangoE2E({
410
+ test,
411
+ expect,
412
+ defaultRoot: new URL("..", import.meta.url).pathname, // your app root
413
+ });
414
+ export const { useFixture, parityDescribe, expectParity, rangoMatchers } = e2e;
415
+ ```
416
+
417
+ ### parityDescribe REPLACES hand-titling `(production)`
418
+
419
+ This is THE mechanism that satisfies the dev+prod mandate structurally. One
420
+ declaration registers a dev describe (`name`) AND a production describe
421
+ (`` `${name} (production)` ``) from one body — the `(production)` suffix is
422
+ generated, so the prod suite can never drift into the dev bucket. Use `f.url(...)`
423
+ for navigation.
424
+
425
+ ```ts
426
+ import { test, expect } from "@playwright/test";
427
+ import { parityDescribe, rangoMatchers } from "./helper";
428
+ // rangoMatchers ships the type augmentation, so `expect(page).toHaveRangoPathname`
429
+ // is typed after extend.
430
+ expect.extend(rangoMatchers);
431
+
432
+ parityDescribe("product navigation", (f) => {
433
+ test("navigates to a product and updates the pathname", async ({ page }) => {
434
+ await page.goto(f.url("/"));
435
+ await page.getByTestId("product-link").click();
436
+ await expect(page).toHaveRangoPathname("/products/1");
437
+ });
438
+ });
439
+ ```
440
+
441
+ The body runs verbatim against a dev server (`pnpm dev`) and a built+previewed
442
+ server (`pnpm build` + `pnpm preview`). `useFixture` handles spawn, dep-optimizer
443
+ warmup, cross-platform process-group kill, and teardown.
444
+
445
+ ### expectParity — JS path vs no-JS progressive enhancement
446
+
447
+ Runs one intent over the JS path and a fresh no-JS context, asserting the
448
+ observed testids, pathname, and cookies match. CONTRACT: PE parity only holds if
449
+ the submit target is a real `<form>` (no-JS does a native POST). Cookie
450
+ observation is `document.cookie` (non-HttpOnly only) in v1.
451
+
452
+ ```ts
453
+ parityDescribe("add to cart parity", (f) => {
454
+ test("JS and no-JS produce the same result", async ({ page }) => {
455
+ await page.goto(f.url("/products/1"));
456
+ await expectParity(
457
+ page,
458
+ { submit: { testId: "add-to-cart-form", data: { qty: "2" } } },
459
+ { observe: ["cart-count", "flash"] },
460
+ );
461
+ });
462
+ });
463
+ ```
464
+
465
+ `intent` is `{ navigate: string }` or `{ submit: { testId, data? } }`. Other
466
+ helpers from `createRangoE2E`: `waitForHydration`, `expectNoReload`,
467
+ `expectNoPageError`, `testId`, `waitForNavigation`, `goBack`/`goForward`,
468
+ `testNoJs` (a `test` with JS disabled). `rangoMatchers` ships
469
+ `toHaveRangoPathname` only — `toHaveSegments`/`toHaveParams` are a documented
470
+ future addition (they need a client-emitted signal that does not exist yet; do
471
+ not assume them).
472
+
473
+ ## Cache / SWR / prerender recipes
474
+
475
+ The `X-Rango-Cache` header is emitted **only** when the gate is on:
476
+ `createRouter({ debugCacheSignal: true })` or `process.env.RANGO_TEST_SIGNALS === "1"`.
477
+ Off by default — zero production surface. v1 status is COARSE (route-level, keyed
478
+ by the route key — the route NAME, e.g. `product.detail`, NOT the URL pattern),
479
+ not per-individual-segment. `assertCacheStatus` reads that header.
480
+
481
+ ```ts
482
+ // In a Playwright e2e, import cache-status helpers from the e2e entry (the
483
+ // `@rangojs/router/testing` barrel is Vitest-only — it pulls a build virtual).
484
+ import { assertCacheStatus } from "@rangojs/router/testing/e2e";
485
+
486
+ // e2e (the gate must be enabled on the app under test). The segment key is the
487
+ // route NAME the header carries, not the URL pattern ("/products/:id").
488
+ const res = await page.request.get(f.url("/products/1"));
489
+ assertCacheStatus(res, "product.detail", "miss");
490
+ const res2 = await page.request.get(f.url("/products/1"));
491
+ assertCacheStatus(res2, "product.detail", "hit");
492
+ ```
493
+
494
+ Statuses: `"hit" | "miss" | "stale" | "prerendered" | "passthrough"`.
495
+
496
+ Zero-prod-surface alternative — the telemetry sink (no header at all):
497
+
498
+ ```ts
499
+ import { createCacheSink, filterCacheDecisions } from "@rangojs/router/testing";
500
+ const { sink, events } = createCacheSink();
501
+ const router = createRouter({ telemetry: sink /* ... */ }).routes(urlpatterns);
502
+ // ...drive a request...
503
+ const decisions = filterCacheDecisions(events);
504
+ expect(decisions[0].segments?.[0].cacheStatus).toBe("hit");
505
+ ```
506
+
507
+ PRERENDER: a pre-rendered route is **indistinguishable from a cache hit by
508
+ design** — the worker handles every request and looks up a stored Flight payload
509
+ (see `/prerender`). The browser cannot tell. So you cannot assert "prerendered"
510
+ from the rendered DOM; assert it via the signal (`assertCacheStatus(res, seg,
511
+ "prerendered")`), and run prerender assertions in **production** mode (build-time
512
+ artifacts only exist after `pnpm build`).
513
+
514
+ ## Anti-patterns and gotchas
515
+
516
+ - **No dev-only e2e.** A `useFixture({ mode: "build" })` describe whose title
517
+ omits `(production)` silently lands in the dev bucket — prod coverage lost,
518
+ no error. Always use `parityDescribe`; never hand-title. `(prod)`,
519
+ `-build`, `-prod` do NOT count — the bucketing matches the literal
520
+ `(production)`.
521
+ - **Don't hand-mock the router provider** to test a client component — use
522
+ `renderRoute`, which mounts the real `NavigationProvider`.
523
+ - **Don't call `createLoader(...)` in a unit test** and try to invoke it.
524
+ Extract the body and pass it to `runLoader`.
525
+ - **`dispatch` needs the plugin-rsc mock** (or a Vite-RSC env). A bare import of
526
+ your router throws on Vite virtual modules otherwise.
527
+ - **`renderToFlightString` is not a node test.** It only runs under the
528
+ react-server vitest project; name files `*.rsc-test.{ts,tsx}` and run
529
+ `pnpm test:unit:rsc`. The main vitest project must NOT set the react-server
530
+ condition (it would flip React to the no-hooks server build and break every
531
+ `renderRoute`/client test).
532
+ - **Running an e2e subset:** add `--no-deps` — `--grep` does NOT filter
533
+ dependency projects, so grepping one production test otherwise pulls in the
534
+ whole dev suite. And `--grep` is a regex: a pasted title containing
535
+ `(production)` / `:locale?` / `[...]` mis-matches; grep a metacharacter-free
536
+ fragment.
537
+
538
+ ## Pre-push checklist (mirror CLAUDE.md)
539
+
540
+ Before pushing, run all of these and fix any failure:
541
+
542
+ 1. `pnpm run typecheck` (or `pnpm exec tsc --noEmit`)
543
+ 2. `pnpm run test:unit` (node + DOM vitest)
544
+ 3. `pnpm run test:unit:rsc` (the react-server Flight project)
545
+ 4. `pnpm run lint`
546
+ 5. `pnpm run format`
547
+
548
+ And: **every e2e has a production counterpart.** `parityDescribe` makes this
549
+ automatic — if you wrote a plain `test.describe` for a behavior, convert it.
@@ -11,28 +11,46 @@ Opt-in theme system with FOUC prevention.
11
11
  ## Enable
12
12
 
13
13
  ```typescript
14
+ import { createRouter } from "@rangojs/router";
15
+
14
16
  // Simple - all defaults
15
- const router = createRSCRouter<Env>({ theme: true });
17
+ const router = createRouter<Env>({
18
+ document: Document,
19
+ urls: urlpatterns,
20
+ theme: true,
21
+ });
16
22
 
17
23
  // Custom config
18
- const router = createRSCRouter<Env>({
24
+ const router = createRouter<Env>({
25
+ document: Document,
26
+ urls: urlpatterns,
19
27
  theme: {
20
- defaultTheme: "system", // "light" | "dark" | "system"
28
+ defaultTheme: "system", // "light" | "dark" | "system"
21
29
  themes: ["light", "dark"],
22
- attribute: "class", // or "data-theme"
30
+ attribute: "class", // or "data-theme"
23
31
  storageKey: "theme",
24
- }
32
+ },
25
33
  });
26
34
  ```
27
35
 
28
- ## Server (route handlers)
36
+ ## Server (in loaders/middleware)
29
37
 
30
38
  ```typescript
31
- route("settings", (ctx) => {
32
- const current = ctx.theme; // read from cookie
33
- ctx.setTheme("dark"); // set cookie
34
- return <Settings />;
39
+ import { createLoader } from "@rangojs/router";
40
+ import type { Middleware } from "@rangojs/router";
41
+
42
+ // In a loader
43
+ export const SettingsLoader = createLoader(async (ctx) => {
44
+ const currentTheme = ctx.theme; // read from cookie
45
+ return { theme: currentTheme };
35
46
  });
47
+
48
+ // In middleware
49
+ export const themeMiddleware: Middleware = async (ctx, next) => {
50
+ // Set theme based on user preference
51
+ ctx.setTheme("dark");
52
+ await next();
53
+ };
36
54
  ```
37
55
 
38
56
  ## Client
@@ -43,7 +61,14 @@ import { useTheme } from "@rangojs/router/theme";
43
61
 
44
62
  function ThemeToggle() {
45
63
  const { theme, setTheme, resolvedTheme, systemTheme, themes } = useTheme();
46
- return <button onClick={() => setTheme("dark")}>Dark</button>;
64
+
65
+ return (
66
+ <select value={theme} onChange={(e) => setTheme(e.target.value)}>
67
+ <option value="system">System</option>
68
+ <option value="light">Light</option>
69
+ <option value="dark">Dark</option>
70
+ </select>
71
+ );
47
72
  }
48
73
  ```
49
74