@rangojs/router 0.0.0-experimental.15 → 0.0.0-experimental.151

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 (1284) hide show
  1. package/AGENTS.md +13 -0
  2. package/README.md +308 -451
  3. package/dist/__internal.d.ts +83 -0
  4. package/dist/__internal.d.ts.map +1 -0
  5. package/dist/__internal.js +19 -0
  6. package/dist/__internal.js.map +1 -0
  7. package/dist/__mocks__/version.d.ts +7 -0
  8. package/dist/__mocks__/version.d.ts.map +1 -0
  9. package/dist/__mocks__/version.js +7 -0
  10. package/dist/__mocks__/version.js.map +1 -0
  11. package/dist/__tests__/client-href.test.d.ts +2 -0
  12. package/dist/__tests__/client-href.test.d.ts.map +1 -0
  13. package/dist/__tests__/client-href.test.js +74 -0
  14. package/dist/__tests__/client-href.test.js.map +1 -0
  15. package/dist/__tests__/component-utils.test.d.ts +2 -0
  16. package/dist/__tests__/component-utils.test.d.ts.map +1 -0
  17. package/dist/__tests__/component-utils.test.js +51 -0
  18. package/dist/__tests__/component-utils.test.js.map +1 -0
  19. package/dist/__tests__/event-controller.test.d.ts +2 -0
  20. package/dist/__tests__/event-controller.test.d.ts.map +1 -0
  21. package/dist/__tests__/event-controller.test.js +538 -0
  22. package/dist/__tests__/event-controller.test.js.map +1 -0
  23. package/dist/__tests__/helpers/route-tree.d.ts +118 -0
  24. package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
  25. package/dist/__tests__/helpers/route-tree.js +374 -0
  26. package/dist/__tests__/helpers/route-tree.js.map +1 -0
  27. package/dist/__tests__/match-result.test.d.ts +2 -0
  28. package/dist/__tests__/match-result.test.d.ts.map +1 -0
  29. package/dist/__tests__/match-result.test.js +154 -0
  30. package/dist/__tests__/match-result.test.js.map +1 -0
  31. package/dist/__tests__/navigation-store.test.d.ts +2 -0
  32. package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
  33. package/dist/__tests__/navigation-store.test.js +440 -0
  34. package/dist/__tests__/navigation-store.test.js.map +1 -0
  35. package/dist/__tests__/partial-update.test.d.ts +2 -0
  36. package/dist/__tests__/partial-update.test.d.ts.map +1 -0
  37. package/dist/__tests__/partial-update.test.js +1009 -0
  38. package/dist/__tests__/partial-update.test.js.map +1 -0
  39. package/dist/__tests__/reverse-types.test.d.ts +8 -0
  40. package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
  41. package/dist/__tests__/reverse-types.test.js +656 -0
  42. package/dist/__tests__/reverse-types.test.js.map +1 -0
  43. package/dist/__tests__/route-definition.test.d.ts +2 -0
  44. package/dist/__tests__/route-definition.test.d.ts.map +1 -0
  45. package/dist/__tests__/route-definition.test.js +55 -0
  46. package/dist/__tests__/route-definition.test.js.map +1 -0
  47. package/dist/__tests__/router-helpers.test.d.ts +2 -0
  48. package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
  49. package/dist/__tests__/router-helpers.test.js +377 -0
  50. package/dist/__tests__/router-helpers.test.js.map +1 -0
  51. package/dist/__tests__/router-integration-2.test.d.ts +2 -0
  52. package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
  53. package/dist/__tests__/router-integration-2.test.js +426 -0
  54. package/dist/__tests__/router-integration-2.test.js.map +1 -0
  55. package/dist/__tests__/router-integration.test.d.ts +2 -0
  56. package/dist/__tests__/router-integration.test.d.ts.map +1 -0
  57. package/dist/__tests__/router-integration.test.js +1051 -0
  58. package/dist/__tests__/router-integration.test.js.map +1 -0
  59. package/dist/__tests__/search-params.test.d.ts +5 -0
  60. package/dist/__tests__/search-params.test.d.ts.map +1 -0
  61. package/dist/__tests__/search-params.test.js +306 -0
  62. package/dist/__tests__/search-params.test.js.map +1 -0
  63. package/dist/__tests__/segment-system.test.d.ts +2 -0
  64. package/dist/__tests__/segment-system.test.d.ts.map +1 -0
  65. package/dist/__tests__/segment-system.test.js +627 -0
  66. package/dist/__tests__/segment-system.test.js.map +1 -0
  67. package/dist/__tests__/static-handler-types.test.d.ts +8 -0
  68. package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
  69. package/dist/__tests__/static-handler-types.test.js +63 -0
  70. package/dist/__tests__/static-handler-types.test.js.map +1 -0
  71. package/dist/__tests__/urls.test.d.ts +2 -0
  72. package/dist/__tests__/urls.test.d.ts.map +1 -0
  73. package/dist/__tests__/urls.test.js +421 -0
  74. package/dist/__tests__/urls.test.js.map +1 -0
  75. package/dist/__tests__/use-mount.test.d.ts +2 -0
  76. package/dist/__tests__/use-mount.test.d.ts.map +1 -0
  77. package/dist/__tests__/use-mount.test.js +35 -0
  78. package/dist/__tests__/use-mount.test.js.map +1 -0
  79. package/dist/bin/rango.d.ts +2 -0
  80. package/dist/bin/rango.d.ts.map +1 -0
  81. package/dist/bin/rango.js +1844 -237
  82. package/dist/bin/rango.js.map +1 -0
  83. package/dist/browser/event-controller.d.ts +191 -0
  84. package/dist/browser/event-controller.d.ts.map +1 -0
  85. package/dist/browser/event-controller.js +559 -0
  86. package/dist/browser/event-controller.js.map +1 -0
  87. package/dist/browser/index.d.ts +2 -0
  88. package/dist/browser/index.d.ts.map +1 -0
  89. package/dist/browser/index.js +14 -0
  90. package/dist/browser/index.js.map +1 -0
  91. package/dist/browser/link-interceptor.d.ts +38 -0
  92. package/dist/browser/link-interceptor.d.ts.map +1 -0
  93. package/dist/browser/link-interceptor.js +99 -0
  94. package/dist/browser/link-interceptor.js.map +1 -0
  95. package/dist/browser/logging.d.ts +10 -0
  96. package/dist/browser/logging.d.ts.map +1 -0
  97. package/dist/browser/logging.js +29 -0
  98. package/dist/browser/logging.js.map +1 -0
  99. package/dist/browser/lru-cache.d.ts +17 -0
  100. package/dist/browser/lru-cache.d.ts.map +1 -0
  101. package/dist/browser/lru-cache.js +50 -0
  102. package/dist/browser/lru-cache.js.map +1 -0
  103. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  104. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  105. package/dist/browser/merge-segment-loaders.js +102 -0
  106. package/dist/browser/merge-segment-loaders.js.map +1 -0
  107. package/dist/browser/navigation-bridge.d.ts +102 -0
  108. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  109. package/dist/browser/navigation-bridge.js +708 -0
  110. package/dist/browser/navigation-bridge.js.map +1 -0
  111. package/dist/browser/navigation-client.d.ts +25 -0
  112. package/dist/browser/navigation-client.d.ts.map +1 -0
  113. package/dist/browser/navigation-client.js +157 -0
  114. package/dist/browser/navigation-client.js.map +1 -0
  115. package/dist/browser/navigation-store.d.ts +101 -0
  116. package/dist/browser/navigation-store.d.ts.map +1 -0
  117. package/dist/browser/navigation-store.js +625 -0
  118. package/dist/browser/navigation-store.js.map +1 -0
  119. package/dist/browser/partial-update.d.ts +75 -0
  120. package/dist/browser/partial-update.d.ts.map +1 -0
  121. package/dist/browser/partial-update.js +426 -0
  122. package/dist/browser/partial-update.js.map +1 -0
  123. package/dist/browser/react/Link.d.ts +86 -0
  124. package/dist/browser/react/Link.d.ts.map +1 -0
  125. package/dist/browser/react/Link.js +128 -0
  126. package/dist/browser/react/Link.js.map +1 -0
  127. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  128. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  129. package/dist/browser/react/NavigationProvider.js +216 -0
  130. package/dist/browser/react/NavigationProvider.js.map +1 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  132. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  133. package/dist/browser/react/ScrollRestoration.js +57 -0
  134. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  135. package/dist/browser/react/context.d.ts +46 -0
  136. package/dist/browser/react/context.d.ts.map +1 -0
  137. package/dist/browser/react/context.js +10 -0
  138. package/dist/browser/react/context.js.map +1 -0
  139. package/dist/browser/react/index.d.ts +11 -0
  140. package/dist/browser/react/index.d.ts.map +1 -0
  141. package/dist/browser/react/index.js +22 -0
  142. package/dist/browser/react/index.js.map +1 -0
  143. package/dist/browser/react/location-state-shared.d.ts +63 -0
  144. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  145. package/dist/browser/react/location-state-shared.js +81 -0
  146. package/dist/browser/react/location-state-shared.js.map +1 -0
  147. package/dist/browser/react/location-state.d.ts +23 -0
  148. package/dist/browser/react/location-state.d.ts.map +1 -0
  149. package/dist/browser/react/location-state.js +29 -0
  150. package/dist/browser/react/location-state.js.map +1 -0
  151. package/dist/browser/react/mount-context.d.ts +24 -0
  152. package/dist/browser/react/mount-context.d.ts.map +1 -0
  153. package/dist/browser/react/mount-context.js +24 -0
  154. package/dist/browser/react/mount-context.js.map +1 -0
  155. package/dist/browser/react/use-action.d.ts +64 -0
  156. package/dist/browser/react/use-action.d.ts.map +1 -0
  157. package/dist/browser/react/use-action.js +134 -0
  158. package/dist/browser/react/use-action.js.map +1 -0
  159. package/dist/browser/react/use-client-cache.d.ts +41 -0
  160. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  161. package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -26
  162. package/dist/browser/react/use-client-cache.js.map +1 -0
  163. package/dist/browser/react/use-handle.d.ts +31 -0
  164. package/dist/browser/react/use-handle.d.ts.map +1 -0
  165. package/dist/browser/react/use-handle.js +144 -0
  166. package/dist/browser/react/use-handle.js.map +1 -0
  167. package/dist/browser/react/use-href.d.ts +33 -0
  168. package/dist/browser/react/use-href.d.ts.map +1 -0
  169. package/dist/browser/react/use-href.js +39 -0
  170. package/dist/browser/react/use-href.js.map +1 -0
  171. package/dist/browser/react/use-link-status.d.ts +37 -0
  172. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  173. package/dist/browser/react/use-link-status.js +99 -0
  174. package/dist/browser/react/use-link-status.js.map +1 -0
  175. package/dist/browser/react/use-mount.d.ts +25 -0
  176. package/dist/browser/react/use-mount.d.ts.map +1 -0
  177. package/dist/browser/react/use-mount.js +30 -0
  178. package/dist/browser/react/use-mount.js.map +1 -0
  179. package/dist/browser/react/use-navigation.d.ts +27 -0
  180. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  181. package/dist/browser/react/use-navigation.js +87 -0
  182. package/dist/browser/react/use-navigation.js.map +1 -0
  183. package/dist/browser/react/use-segments.d.ts +38 -0
  184. package/dist/browser/react/use-segments.d.ts.map +1 -0
  185. package/dist/browser/react/use-segments.js +130 -0
  186. package/dist/browser/react/use-segments.js.map +1 -0
  187. package/dist/browser/request-controller.d.ts +26 -0
  188. package/dist/browser/request-controller.d.ts.map +1 -0
  189. package/dist/browser/request-controller.js +147 -0
  190. package/dist/browser/request-controller.js.map +1 -0
  191. package/dist/browser/rsc-router.d.ts +129 -0
  192. package/dist/browser/rsc-router.d.ts.map +1 -0
  193. package/dist/browser/rsc-router.js +195 -0
  194. package/dist/browser/rsc-router.js.map +1 -0
  195. package/dist/browser/scroll-restoration.d.ts +93 -0
  196. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  197. package/dist/browser/scroll-restoration.js +321 -0
  198. package/dist/browser/scroll-restoration.js.map +1 -0
  199. package/dist/browser/segment-structure-assert.d.ts +17 -0
  200. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  201. package/dist/browser/segment-structure-assert.js +59 -0
  202. package/dist/browser/segment-structure-assert.js.map +1 -0
  203. package/dist/browser/server-action-bridge.d.ts +26 -0
  204. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  205. package/dist/browser/server-action-bridge.js +668 -0
  206. package/dist/browser/server-action-bridge.js.map +1 -0
  207. package/dist/browser/shallow.d.ts +12 -0
  208. package/dist/browser/shallow.d.ts.map +1 -0
  209. package/dist/browser/shallow.js +34 -0
  210. package/dist/browser/shallow.js.map +1 -0
  211. package/dist/browser/types.d.ts +369 -0
  212. package/dist/browser/types.d.ts.map +1 -0
  213. package/dist/browser/types.js +2 -0
  214. package/dist/browser/types.js.map +1 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  216. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  217. package/dist/build/__tests__/generate-cli.test.js +237 -0
  218. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  220. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  221. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  222. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  224. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  225. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  226. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  228. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  230. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  231. package/dist/build/generate-manifest.d.ts +81 -0
  232. package/dist/build/generate-manifest.d.ts.map +1 -0
  233. package/dist/build/generate-manifest.js +276 -0
  234. package/dist/build/generate-manifest.js.map +1 -0
  235. package/dist/build/generate-route-types.d.ts +115 -0
  236. package/dist/build/generate-route-types.d.ts.map +1 -0
  237. package/dist/build/generate-route-types.js +740 -0
  238. package/dist/build/generate-route-types.js.map +1 -0
  239. package/dist/build/index.d.ts +21 -0
  240. package/dist/build/index.d.ts.map +1 -0
  241. package/dist/build/index.js +21 -0
  242. package/dist/build/index.js.map +1 -0
  243. package/dist/build/route-trie.d.ts +71 -0
  244. package/dist/build/route-trie.d.ts.map +1 -0
  245. package/dist/build/route-trie.js +175 -0
  246. package/dist/build/route-trie.js.map +1 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  248. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  249. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  250. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  252. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  253. package/dist/cache/__tests__/document-cache.test.js +345 -0
  254. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  258. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  260. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  261. package/dist/cache/__tests__/memory-store.test.js +367 -0
  262. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  263. package/dist/cache/cache-scope.d.ts +102 -0
  264. package/dist/cache/cache-scope.d.ts.map +1 -0
  265. package/dist/cache/cache-scope.js +440 -0
  266. package/dist/cache/cache-scope.js.map +1 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  270. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  272. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  273. package/dist/cache/cf/cf-cache-store.js +242 -0
  274. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  275. package/dist/cache/cf/index.d.ts +14 -0
  276. package/dist/cache/cf/index.d.ts.map +1 -0
  277. package/dist/cache/cf/index.js +17 -0
  278. package/dist/cache/cf/index.js.map +1 -0
  279. package/dist/cache/document-cache.d.ts +64 -0
  280. package/dist/cache/document-cache.d.ts.map +1 -0
  281. package/dist/cache/document-cache.js +228 -0
  282. package/dist/cache/document-cache.js.map +1 -0
  283. package/dist/cache/index.d.ts +19 -0
  284. package/dist/cache/index.d.ts.map +1 -0
  285. package/dist/cache/index.js +21 -0
  286. package/dist/cache/index.js.map +1 -0
  287. package/dist/cache/memory-segment-store.d.ts +110 -0
  288. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  289. package/dist/cache/memory-segment-store.js +117 -0
  290. package/dist/cache/memory-segment-store.js.map +1 -0
  291. package/dist/cache/memory-store.d.ts +41 -0
  292. package/dist/cache/memory-store.d.ts.map +1 -0
  293. package/dist/cache/memory-store.js +191 -0
  294. package/dist/cache/memory-store.js.map +1 -0
  295. package/dist/cache/types.d.ts +317 -0
  296. package/dist/cache/types.d.ts.map +1 -0
  297. package/dist/cache/types.js +12 -0
  298. package/dist/cache/types.js.map +1 -0
  299. package/dist/client.d.ts +248 -0
  300. package/dist/client.d.ts.map +1 -0
  301. package/dist/client.js +367 -0
  302. package/dist/client.js.map +1 -0
  303. package/dist/client.rsc.d.ts +26 -0
  304. package/dist/client.rsc.d.ts.map +1 -0
  305. package/dist/client.rsc.js +46 -0
  306. package/dist/client.rsc.js.map +1 -0
  307. package/dist/component-utils.d.ts +36 -0
  308. package/dist/component-utils.d.ts.map +1 -0
  309. package/dist/component-utils.js +61 -0
  310. package/dist/component-utils.js.map +1 -0
  311. package/dist/components/DefaultDocument.d.ts +13 -0
  312. package/dist/components/DefaultDocument.d.ts.map +1 -0
  313. package/dist/components/DefaultDocument.js +15 -0
  314. package/dist/components/DefaultDocument.js.map +1 -0
  315. package/dist/debug.d.ts +58 -0
  316. package/dist/debug.d.ts.map +1 -0
  317. package/dist/debug.js +157 -0
  318. package/dist/debug.js.map +1 -0
  319. package/dist/default-error-boundary.d.ts +11 -0
  320. package/dist/default-error-boundary.d.ts.map +1 -0
  321. package/dist/default-error-boundary.js +45 -0
  322. package/dist/default-error-boundary.js.map +1 -0
  323. package/dist/deps/browser.d.ts +2 -0
  324. package/dist/deps/browser.d.ts.map +1 -0
  325. package/dist/deps/browser.js +3 -0
  326. package/dist/deps/browser.js.map +1 -0
  327. package/dist/deps/html-stream-client.d.ts +2 -0
  328. package/dist/deps/html-stream-client.d.ts.map +1 -0
  329. package/dist/deps/html-stream-client.js +3 -0
  330. package/dist/deps/html-stream-client.js.map +1 -0
  331. package/dist/deps/html-stream-server.d.ts +2 -0
  332. package/dist/deps/html-stream-server.d.ts.map +1 -0
  333. package/dist/deps/html-stream-server.js +3 -0
  334. package/dist/deps/html-stream-server.js.map +1 -0
  335. package/dist/deps/rsc.d.ts +2 -0
  336. package/dist/deps/rsc.d.ts.map +1 -0
  337. package/dist/deps/rsc.js +4 -0
  338. package/dist/deps/rsc.js.map +1 -0
  339. package/dist/deps/ssr.d.ts +2 -0
  340. package/dist/deps/ssr.d.ts.map +1 -0
  341. package/dist/deps/ssr.js +3 -0
  342. package/dist/deps/ssr.js.map +1 -0
  343. package/dist/errors.d.ts +174 -0
  344. package/dist/errors.d.ts.map +1 -0
  345. package/dist/errors.js +241 -0
  346. package/dist/errors.js.map +1 -0
  347. package/dist/handle.d.ts +78 -0
  348. package/dist/handle.d.ts.map +1 -0
  349. package/dist/handle.js +82 -0
  350. package/dist/handle.js.map +1 -0
  351. package/dist/handles/MetaTags.d.ts +14 -0
  352. package/dist/handles/MetaTags.d.ts.map +1 -0
  353. package/dist/handles/MetaTags.js +136 -0
  354. package/dist/handles/MetaTags.js.map +1 -0
  355. package/dist/handles/index.d.ts +6 -0
  356. package/dist/handles/index.d.ts.map +1 -0
  357. package/{src/handles/index.ts → dist/handles/index.js} +1 -1
  358. package/dist/handles/index.js.map +1 -0
  359. package/dist/handles/meta.d.ts +39 -0
  360. package/dist/handles/meta.d.ts.map +1 -0
  361. package/dist/handles/meta.js +202 -0
  362. package/dist/handles/meta.js.map +1 -0
  363. package/dist/host/__tests__/errors.test.d.ts +2 -0
  364. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  365. package/dist/host/__tests__/errors.test.js +76 -0
  366. package/dist/host/__tests__/errors.test.js.map +1 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  370. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  372. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  374. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  375. package/dist/host/__tests__/router.test.d.ts +2 -0
  376. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  377. package/dist/host/__tests__/router.test.js +241 -0
  378. package/dist/host/__tests__/router.test.js.map +1 -0
  379. package/dist/host/__tests__/testing.test.d.ts +2 -0
  380. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  381. package/dist/host/__tests__/testing.test.js +64 -0
  382. package/dist/host/__tests__/testing.test.js.map +1 -0
  383. package/dist/host/__tests__/utils.test.d.ts +2 -0
  384. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  385. package/dist/host/__tests__/utils.test.js +29 -0
  386. package/dist/host/__tests__/utils.test.js.map +1 -0
  387. package/dist/host/cookie-handler.d.ts +34 -0
  388. package/dist/host/cookie-handler.d.ts.map +1 -0
  389. package/dist/host/cookie-handler.js +124 -0
  390. package/dist/host/cookie-handler.js.map +1 -0
  391. package/dist/host/errors.d.ts +56 -0
  392. package/dist/host/errors.d.ts.map +1 -0
  393. package/dist/host/errors.js +79 -0
  394. package/dist/host/errors.js.map +1 -0
  395. package/dist/host/index.d.ts +29 -0
  396. package/dist/host/index.d.ts.map +1 -0
  397. package/dist/host/index.js +32 -0
  398. package/dist/host/index.js.map +1 -0
  399. package/dist/host/pattern-matcher.d.ts +36 -0
  400. package/dist/host/pattern-matcher.d.ts.map +1 -0
  401. package/dist/host/pattern-matcher.js +172 -0
  402. package/dist/host/pattern-matcher.js.map +1 -0
  403. package/dist/host/router.d.ts +26 -0
  404. package/dist/host/router.d.ts.map +1 -0
  405. package/dist/host/router.js +218 -0
  406. package/dist/host/router.js.map +1 -0
  407. package/dist/host/testing.d.ts +36 -0
  408. package/dist/host/testing.d.ts.map +1 -0
  409. package/dist/host/testing.js +55 -0
  410. package/dist/host/testing.js.map +1 -0
  411. package/dist/host/types.d.ts +115 -0
  412. package/dist/host/types.d.ts.map +1 -0
  413. package/dist/host/types.js +7 -0
  414. package/dist/host/types.js.map +1 -0
  415. package/dist/host/utils.d.ts +21 -0
  416. package/dist/host/utils.d.ts.map +1 -0
  417. package/dist/host/utils.js +23 -0
  418. package/dist/host/utils.js.map +1 -0
  419. package/dist/href-client.d.ts +131 -0
  420. package/dist/href-client.d.ts.map +1 -0
  421. package/dist/href-client.js +64 -0
  422. package/dist/href-client.js.map +1 -0
  423. package/{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/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -8
  448. package/dist/network-error-thrower.d.ts.map +1 -0
  449. package/dist/network-error-thrower.js +14 -0
  450. package/dist/network-error-thrower.js.map +1 -0
  451. package/dist/outlet-context.d.ts +13 -0
  452. package/dist/outlet-context.d.ts.map +1 -0
  453. package/dist/outlet-context.js +3 -0
  454. package/dist/outlet-context.js.map +1 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  456. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  457. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  458. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  459. package/dist/prerender/param-hash.d.ts +16 -0
  460. package/dist/prerender/param-hash.d.ts.map +1 -0
  461. package/dist/prerender/param-hash.js +36 -0
  462. package/dist/prerender/param-hash.js.map +1 -0
  463. package/dist/prerender/store.d.ts +38 -0
  464. package/dist/prerender/store.d.ts.map +1 -0
  465. package/dist/prerender/store.js +61 -0
  466. package/dist/prerender/store.js.map +1 -0
  467. package/dist/prerender.d.ts +66 -0
  468. package/dist/prerender.d.ts.map +1 -0
  469. package/dist/prerender.js +57 -0
  470. package/dist/prerender.js.map +1 -0
  471. package/dist/reverse.d.ts +196 -0
  472. package/dist/reverse.d.ts.map +1 -0
  473. package/dist/reverse.js +78 -0
  474. package/dist/reverse.js.map +1 -0
  475. package/dist/root-error-boundary.d.ts +33 -0
  476. package/dist/root-error-boundary.d.ts.map +1 -0
  477. package/dist/root-error-boundary.js +165 -0
  478. package/dist/root-error-boundary.js.map +1 -0
  479. package/dist/route-content-wrapper.d.ts +46 -0
  480. package/dist/route-content-wrapper.d.ts.map +1 -0
  481. package/dist/route-content-wrapper.js +77 -0
  482. package/dist/route-content-wrapper.js.map +1 -0
  483. package/dist/route-definition.d.ts +421 -0
  484. package/dist/route-definition.d.ts.map +1 -0
  485. package/dist/route-definition.js +868 -0
  486. package/dist/route-definition.js.map +1 -0
  487. package/dist/route-map-builder.d.ts +155 -0
  488. package/dist/route-map-builder.d.ts.map +1 -0
  489. package/dist/route-map-builder.js +237 -0
  490. package/dist/route-map-builder.js.map +1 -0
  491. package/dist/route-types.d.ts +165 -0
  492. package/dist/route-types.d.ts.map +1 -0
  493. package/dist/route-types.js +7 -0
  494. package/dist/route-types.js.map +1 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  496. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  497. package/dist/router/__tests__/handler-context.test.js +65 -0
  498. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  502. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  503. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  504. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  505. package/dist/router/__tests__/match-context.test.js +92 -0
  506. package/dist/router/__tests__/match-context.test.js.map +1 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  508. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  509. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  510. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  511. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  512. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  513. package/dist/router/__tests__/match-result.test.js +457 -0
  514. package/dist/router/__tests__/match-result.test.js.map +1 -0
  515. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  516. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  517. package/dist/router/__tests__/on-error.test.js +678 -0
  518. package/dist/router/__tests__/on-error.test.js.map +1 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  520. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  521. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  522. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  526. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  527. package/dist/router/error-handling.d.ts +77 -0
  528. package/dist/router/error-handling.d.ts.map +1 -0
  529. package/dist/router/error-handling.js +202 -0
  530. package/dist/router/error-handling.js.map +1 -0
  531. package/dist/router/handler-context.d.ts +20 -0
  532. package/dist/router/handler-context.d.ts.map +1 -0
  533. package/dist/router/handler-context.js +198 -0
  534. package/dist/router/handler-context.js.map +1 -0
  535. package/dist/router/intercept-resolution.d.ts +66 -0
  536. package/dist/router/intercept-resolution.d.ts.map +1 -0
  537. package/dist/router/intercept-resolution.js +246 -0
  538. package/dist/router/intercept-resolution.js.map +1 -0
  539. package/dist/router/loader-resolution.d.ts +64 -0
  540. package/dist/router/loader-resolution.d.ts.map +1 -0
  541. package/dist/router/loader-resolution.js +284 -0
  542. package/dist/router/loader-resolution.js.map +1 -0
  543. package/dist/router/logging.d.ts +15 -0
  544. package/dist/router/logging.d.ts.map +1 -0
  545. package/dist/router/logging.js +99 -0
  546. package/dist/router/logging.js.map +1 -0
  547. package/dist/router/manifest.d.ts +22 -0
  548. package/dist/router/manifest.d.ts.map +1 -0
  549. package/dist/router/manifest.js +181 -0
  550. package/dist/router/manifest.js.map +1 -0
  551. package/dist/router/match-api.d.ts +35 -0
  552. package/dist/router/match-api.d.ts.map +1 -0
  553. package/dist/router/match-api.js +406 -0
  554. package/dist/router/match-api.js.map +1 -0
  555. package/dist/router/match-context.d.ts +206 -0
  556. package/dist/router/match-context.d.ts.map +1 -0
  557. package/dist/router/match-context.js +17 -0
  558. package/dist/router/match-context.js.map +1 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  560. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  561. package/dist/router/match-middleware/background-revalidation.js +75 -0
  562. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  564. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  565. package/dist/router/match-middleware/cache-lookup.js +257 -0
  566. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  567. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  568. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  569. package/dist/router/match-middleware/cache-store.js +108 -0
  570. package/dist/router/match-middleware/cache-store.js.map +1 -0
  571. package/dist/router/match-middleware/index.d.ts +81 -0
  572. package/dist/router/match-middleware/index.d.ts.map +1 -0
  573. package/dist/router/match-middleware/index.js +80 -0
  574. package/dist/router/match-middleware/index.js.map +1 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  576. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  577. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  578. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  580. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  581. package/dist/router/match-middleware/segment-resolution.js +53 -0
  582. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  583. package/dist/router/match-pipelines.d.ts +147 -0
  584. package/dist/router/match-pipelines.d.ts.map +1 -0
  585. package/dist/router/match-pipelines.js +82 -0
  586. package/dist/router/match-pipelines.js.map +1 -0
  587. package/dist/router/match-result.d.ts +126 -0
  588. package/dist/router/match-result.d.ts.map +1 -0
  589. package/dist/router/match-result.js +93 -0
  590. package/dist/router/match-result.js.map +1 -0
  591. package/dist/router/metrics.d.ts +20 -0
  592. package/dist/router/metrics.d.ts.map +1 -0
  593. package/dist/router/metrics.js +47 -0
  594. package/dist/router/metrics.js.map +1 -0
  595. package/dist/router/middleware.d.ts +249 -0
  596. package/dist/router/middleware.d.ts.map +1 -0
  597. package/dist/router/middleware.js +434 -0
  598. package/dist/router/middleware.js.map +1 -0
  599. package/dist/router/middleware.test.d.ts +2 -0
  600. package/dist/router/middleware.test.d.ts.map +1 -0
  601. package/dist/router/middleware.test.js +816 -0
  602. package/dist/router/middleware.test.js.map +1 -0
  603. package/dist/router/pattern-matching.d.ts +149 -0
  604. package/dist/router/pattern-matching.d.ts.map +1 -0
  605. package/dist/router/pattern-matching.js +349 -0
  606. package/dist/router/pattern-matching.js.map +1 -0
  607. package/dist/router/revalidation.d.ts +44 -0
  608. package/dist/router/revalidation.d.ts.map +1 -0
  609. package/dist/router/revalidation.js +147 -0
  610. package/dist/router/revalidation.js.map +1 -0
  611. package/dist/router/router-context.d.ts +135 -0
  612. package/dist/router/router-context.d.ts.map +1 -0
  613. package/dist/router/router-context.js +36 -0
  614. package/dist/router/router-context.js.map +1 -0
  615. package/dist/router/segment-resolution.d.ts +127 -0
  616. package/dist/router/segment-resolution.d.ts.map +1 -0
  617. package/dist/router/segment-resolution.js +919 -0
  618. package/dist/router/segment-resolution.js.map +1 -0
  619. package/dist/router/trie-matching.d.ts +40 -0
  620. package/dist/router/trie-matching.d.ts.map +1 -0
  621. package/dist/router/trie-matching.js +127 -0
  622. package/dist/router/trie-matching.js.map +1 -0
  623. package/dist/router/types.d.ts +136 -0
  624. package/dist/router/types.d.ts.map +1 -0
  625. package/dist/router/types.js +7 -0
  626. package/dist/router/types.js.map +1 -0
  627. package/dist/router.d.ts +753 -0
  628. package/dist/router.d.ts.map +1 -0
  629. package/dist/router.gen.d.ts +6 -0
  630. package/dist/router.gen.d.ts.map +1 -0
  631. package/dist/router.gen.js +6 -0
  632. package/dist/router.gen.js.map +1 -0
  633. package/dist/router.js +1304 -0
  634. package/dist/router.js.map +1 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  636. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  637. package/dist/rsc/__tests__/helpers.test.js +140 -0
  638. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  639. package/dist/rsc/handler.d.ts +45 -0
  640. package/dist/rsc/handler.d.ts.map +1 -0
  641. package/dist/rsc/handler.js +1172 -0
  642. package/dist/rsc/handler.js.map +1 -0
  643. package/dist/rsc/helpers.d.ts +16 -0
  644. package/dist/rsc/helpers.d.ts.map +1 -0
  645. package/dist/rsc/helpers.js +55 -0
  646. package/dist/rsc/helpers.js.map +1 -0
  647. package/dist/rsc/index.d.ts +22 -0
  648. package/dist/rsc/index.d.ts.map +1 -0
  649. package/dist/rsc/index.js +23 -0
  650. package/dist/rsc/index.js.map +1 -0
  651. package/dist/rsc/nonce.d.ts +9 -0
  652. package/dist/rsc/nonce.d.ts.map +1 -0
  653. package/dist/rsc/nonce.js +18 -0
  654. package/dist/rsc/nonce.js.map +1 -0
  655. package/dist/rsc/types.d.ts +206 -0
  656. package/dist/rsc/types.d.ts.map +1 -0
  657. package/dist/rsc/types.js +8 -0
  658. package/dist/rsc/types.js.map +1 -0
  659. package/dist/search-params.d.ts +103 -0
  660. package/dist/search-params.d.ts.map +1 -0
  661. package/dist/search-params.js +74 -0
  662. package/dist/search-params.js.map +1 -0
  663. package/dist/segment-system.d.ts +75 -0
  664. package/dist/segment-system.d.ts.map +1 -0
  665. package/dist/segment-system.js +336 -0
  666. package/dist/segment-system.js.map +1 -0
  667. package/dist/server/context.d.ts +245 -0
  668. package/dist/server/context.d.ts.map +1 -0
  669. package/dist/server/context.js +197 -0
  670. package/dist/server/context.js.map +1 -0
  671. package/dist/server/fetchable-loader-store.d.ts +18 -0
  672. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  673. package/dist/server/fetchable-loader-store.js +18 -0
  674. package/dist/server/fetchable-loader-store.js.map +1 -0
  675. package/dist/server/handle-store.d.ts +85 -0
  676. package/dist/server/handle-store.d.ts.map +1 -0
  677. package/dist/server/handle-store.js +142 -0
  678. package/dist/server/handle-store.js.map +1 -0
  679. package/dist/server/loader-registry.d.ts +55 -0
  680. package/dist/server/loader-registry.d.ts.map +1 -0
  681. package/dist/server/loader-registry.js +132 -0
  682. package/dist/server/loader-registry.js.map +1 -0
  683. package/dist/server/request-context.d.ts +226 -0
  684. package/dist/server/request-context.d.ts.map +1 -0
  685. package/dist/server/request-context.js +290 -0
  686. package/dist/server/request-context.js.map +1 -0
  687. package/dist/server/root-layout.d.ts +4 -0
  688. package/dist/server/root-layout.d.ts.map +1 -0
  689. package/dist/server/root-layout.js +5 -0
  690. package/dist/server/root-layout.js.map +1 -0
  691. package/dist/server.d.ts +15 -0
  692. package/dist/server.d.ts.map +1 -0
  693. package/dist/server.js +20 -0
  694. package/dist/server.js.map +1 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  698. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  699. package/dist/ssr/index.d.ts +98 -0
  700. package/dist/ssr/index.d.ts.map +1 -0
  701. package/dist/ssr/index.js +158 -0
  702. package/dist/ssr/index.js.map +1 -0
  703. package/dist/static-handler.d.ts +50 -0
  704. package/dist/static-handler.d.ts.map +1 -0
  705. package/dist/static-handler.gen.d.ts +5 -0
  706. package/dist/static-handler.gen.d.ts.map +1 -0
  707. package/dist/static-handler.gen.js +5 -0
  708. package/dist/static-handler.gen.js.map +1 -0
  709. package/dist/static-handler.js +29 -0
  710. package/dist/static-handler.js.map +1 -0
  711. package/dist/testing/vitest.js +82 -0
  712. package/dist/theme/ThemeProvider.d.ts +20 -0
  713. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  714. package/dist/theme/ThemeProvider.js +240 -0
  715. package/dist/theme/ThemeProvider.js.map +1 -0
  716. package/dist/theme/ThemeScript.d.ts +48 -0
  717. package/dist/theme/ThemeScript.d.ts.map +1 -0
  718. package/dist/theme/ThemeScript.js +13 -0
  719. package/dist/theme/ThemeScript.js.map +1 -0
  720. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  721. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  722. package/dist/theme/__tests__/theme.test.js +103 -0
  723. package/dist/theme/__tests__/theme.test.js.map +1 -0
  724. package/dist/theme/constants.d.ts +29 -0
  725. package/dist/theme/constants.d.ts.map +1 -0
  726. package/dist/theme/constants.js +48 -0
  727. package/dist/theme/constants.js.map +1 -0
  728. package/dist/theme/index.d.ts +31 -0
  729. package/dist/theme/index.d.ts.map +1 -0
  730. package/dist/theme/index.js +36 -0
  731. package/dist/theme/index.js.map +1 -0
  732. package/dist/theme/theme-context.d.ts +40 -0
  733. package/dist/theme/theme-context.d.ts.map +1 -0
  734. package/dist/theme/theme-context.js +60 -0
  735. package/dist/theme/theme-context.js.map +1 -0
  736. package/dist/theme/theme-script.d.ts +27 -0
  737. package/dist/theme/theme-script.d.ts.map +1 -0
  738. package/dist/theme/theme-script.js +147 -0
  739. package/dist/theme/theme-script.js.map +1 -0
  740. package/dist/theme/types.d.ts +163 -0
  741. package/dist/theme/types.d.ts.map +1 -0
  742. package/dist/theme/types.js +11 -0
  743. package/dist/theme/types.js.map +1 -0
  744. package/dist/theme/use-theme.d.ts +12 -0
  745. package/dist/theme/use-theme.d.ts.map +1 -0
  746. package/dist/theme/use-theme.js +40 -0
  747. package/dist/theme/use-theme.js.map +1 -0
  748. package/dist/types.d.ts +1479 -0
  749. package/dist/types.d.ts.map +1 -0
  750. package/dist/types.js +10 -0
  751. package/dist/types.js.map +1 -0
  752. package/dist/urls.d.ts +441 -0
  753. package/dist/urls.d.ts.map +1 -0
  754. package/dist/urls.gen.d.ts +8 -0
  755. package/dist/urls.gen.d.ts.map +1 -0
  756. package/dist/urls.gen.js +8 -0
  757. package/dist/urls.gen.js.map +1 -0
  758. package/dist/urls.js +443 -0
  759. package/dist/urls.js.map +1 -0
  760. package/dist/use-loader.d.ts +127 -0
  761. package/dist/use-loader.d.ts.map +1 -0
  762. package/dist/use-loader.js +237 -0
  763. package/dist/use-loader.js.map +1 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  767. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  771. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  775. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  777. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  779. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  780. package/dist/vite/ast-handler-extract.d.ts +49 -0
  781. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  782. package/dist/vite/ast-handler-extract.js +249 -0
  783. package/dist/vite/ast-handler-extract.js.map +1 -0
  784. package/dist/vite/expose-action-id.d.ts +19 -0
  785. package/dist/vite/expose-action-id.d.ts.map +1 -0
  786. package/dist/vite/expose-action-id.js +250 -0
  787. package/dist/vite/expose-action-id.js.map +1 -0
  788. package/dist/vite/expose-id-utils.d.ts +69 -0
  789. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  790. package/dist/vite/expose-id-utils.js +289 -0
  791. package/dist/vite/expose-id-utils.js.map +1 -0
  792. package/dist/vite/expose-internal-ids.d.ts +22 -0
  793. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  794. package/dist/vite/expose-internal-ids.js +886 -0
  795. package/dist/vite/expose-internal-ids.js.map +1 -0
  796. package/dist/vite/index.d.ts +149 -0
  797. package/dist/vite/index.d.ts.map +1 -0
  798. package/dist/vite/index.js +7554 -2070
  799. package/dist/vite/index.js.bak +5448 -0
  800. package/dist/vite/index.js.map +1 -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} +12 -16
  809. package/dist/vite/virtual-entries.js.map +1 -0
  810. package/package.json +142 -61
  811. package/skills/api-client/SKILL.md +211 -0
  812. package/skills/breadcrumbs/SKILL.md +329 -0
  813. package/skills/bundle-analysis/SKILL.md +159 -0
  814. package/skills/cache-guide/SKILL.md +489 -0
  815. package/skills/caching/SKILL.md +413 -26
  816. package/skills/catalog.json +271 -0
  817. package/skills/comparison/SKILL.md +50 -0
  818. package/skills/comparison/agents/openai.yaml +4 -0
  819. package/skills/comparison/references/framework-comparison.md +837 -0
  820. package/skills/composability/SKILL.md +278 -0
  821. package/skills/css/SKILL.md +76 -0
  822. package/skills/debug-manifest/SKILL.md +16 -18
  823. package/skills/defer-hydration/SKILL.md +235 -0
  824. package/skills/document-cache/SKILL.md +96 -63
  825. package/skills/fonts/SKILL.md +7 -5
  826. package/skills/handler-use/SKILL.md +364 -0
  827. package/skills/hooks/SKILL.md +76 -436
  828. package/skills/hooks/data.md +273 -0
  829. package/skills/hooks/handle-and-actions.md +103 -0
  830. package/skills/hooks/navigation.md +110 -0
  831. package/skills/hooks/outlets.md +41 -0
  832. package/skills/hooks/state.md +228 -0
  833. package/skills/hooks/urls.md +135 -0
  834. package/skills/host-router/SKILL.md +320 -0
  835. package/skills/i18n/SKILL.md +276 -0
  836. package/skills/intercept/SKILL.md +215 -16
  837. package/skills/layout/SKILL.md +147 -7
  838. package/skills/links/SKILL.md +304 -25
  839. package/skills/loader/SKILL.md +629 -55
  840. package/skills/middleware/SKILL.md +251 -38
  841. package/skills/migrate-nextjs/SKILL.md +745 -0
  842. package/skills/migrate-react-router/SKILL.md +153 -0
  843. package/skills/migrate-react-router/cloudflare-workers.md +129 -0
  844. package/skills/migrate-react-router/component-migration.md +196 -0
  845. package/skills/migrate-react-router/data-and-actions.md +225 -0
  846. package/skills/migrate-react-router/route-mapping.md +271 -0
  847. package/skills/mime-routes/SKILL.md +60 -21
  848. package/skills/observability/SKILL.md +202 -0
  849. package/skills/parallel/SKILL.md +296 -4
  850. package/skills/ppr/SKILL.md +658 -0
  851. package/skills/prerender/SKILL.md +487 -52
  852. package/skills/rango/SKILL.md +324 -29
  853. package/skills/react-compiler/SKILL.md +168 -0
  854. package/skills/response-routes/SKILL.md +264 -122
  855. package/skills/route/SKILL.md +359 -22
  856. package/skills/router-setup/SKILL.md +247 -34
  857. package/skills/scripts/SKILL.md +179 -0
  858. package/skills/server-actions/SKILL.md +776 -0
  859. package/skills/shell-manifest/SKILL.md +185 -0
  860. package/skills/streams-and-websockets/SKILL.md +283 -0
  861. package/skills/tailwind/SKILL.md +28 -4
  862. package/skills/testing/SKILL.md +126 -222
  863. package/skills/testing/bindings.md +103 -0
  864. package/skills/testing/cache-prerender.md +127 -0
  865. package/skills/testing/client-components.md +124 -0
  866. package/skills/testing/e2e-parity.md +125 -0
  867. package/skills/testing/flight.md +91 -0
  868. package/skills/testing/handles.md +131 -0
  869. package/skills/testing/loader.md +128 -0
  870. package/skills/testing/middleware.md +99 -0
  871. package/skills/testing/render-handler.md +122 -0
  872. package/skills/testing/response-routes.md +95 -0
  873. package/skills/testing/reverse-and-types.md +85 -0
  874. package/skills/testing/server-actions.md +107 -0
  875. package/skills/testing/server-tree.md +128 -0
  876. package/skills/testing/setup.md +123 -0
  877. package/skills/theme/SKILL.md +10 -9
  878. package/skills/typesafety/SKILL.md +45 -496
  879. package/skills/typesafety/env-and-bindings.md +254 -0
  880. package/skills/typesafety/generated-files-and-cli.md +335 -0
  881. package/skills/typesafety/params-and-search.md +153 -0
  882. package/skills/typesafety/route-types.md +209 -0
  883. package/skills/use-cache/SKILL.md +383 -0
  884. package/skills/vercel/SKILL.md +128 -0
  885. package/skills/view-transitions/SKILL.md +337 -0
  886. package/src/__augment-tests__/augment.ts +81 -0
  887. package/src/__augment-tests__/augmented.check.ts +116 -0
  888. package/src/__internal.ts +77 -44
  889. package/src/bin/rango.ts +275 -29
  890. package/src/browser/action-coordinator.ts +114 -0
  891. package/src/browser/action-fence.ts +47 -0
  892. package/src/browser/app-shell.ts +39 -0
  893. package/src/browser/app-version.ts +14 -0
  894. package/src/browser/connection-warmup.ts +134 -0
  895. package/src/browser/cookie-name.ts +140 -0
  896. package/src/browser/event-controller.ts +348 -212
  897. package/src/browser/history-state.ts +101 -0
  898. package/src/browser/index.ts +3 -3
  899. package/src/browser/intercept-utils.ts +52 -0
  900. package/src/browser/invalidate-client-cache.ts +52 -0
  901. package/src/browser/link-interceptor.ts +24 -4
  902. package/src/browser/logging.ts +39 -0
  903. package/src/browser/merge-segment-loaders.ts +23 -13
  904. package/src/browser/navigation-bridge.ts +385 -576
  905. package/src/browser/navigation-client.ts +249 -75
  906. package/src/browser/navigation-store-handle.ts +38 -0
  907. package/src/browser/navigation-store.ts +230 -124
  908. package/src/browser/navigation-transaction.ts +247 -0
  909. package/src/browser/network-error-handler.ts +88 -0
  910. package/src/browser/partial-update.ts +432 -365
  911. package/src/browser/prefetch/cache.ts +381 -0
  912. package/src/browser/prefetch/fetch.ts +462 -0
  913. package/src/browser/prefetch/observer.ts +65 -0
  914. package/src/browser/prefetch/policy.ts +48 -0
  915. package/src/browser/prefetch/queue.ts +209 -0
  916. package/src/browser/prefetch/resource-ready.ts +77 -0
  917. package/src/browser/rango-state.ts +194 -0
  918. package/src/browser/react/Link.tsx +284 -67
  919. package/src/browser/react/NavigationProvider.tsx +267 -109
  920. package/src/browser/react/ScrollRestoration.tsx +10 -6
  921. package/src/browser/react/context.ts +11 -0
  922. package/src/browser/react/filter-segment-order.ts +70 -0
  923. package/src/browser/react/index.ts +0 -48
  924. package/src/browser/react/location-state-shared.ts +272 -60
  925. package/src/browser/react/location-state.ts +90 -20
  926. package/src/browser/react/mount-context.ts +6 -1
  927. package/src/browser/react/nonce-context.ts +23 -0
  928. package/src/browser/react/shallow-equal.ts +27 -0
  929. package/src/browser/react/use-action.ts +35 -66
  930. package/src/browser/react/use-handle.ts +39 -126
  931. package/src/browser/react/use-href.tsx +8 -1
  932. package/src/browser/react/use-link-status.ts +39 -13
  933. package/src/browser/react/use-navigation.ts +53 -69
  934. package/src/browser/react/use-params.ts +75 -0
  935. package/src/browser/react/use-pathname.ts +47 -0
  936. package/src/browser/react/use-reverse.ts +106 -0
  937. package/src/browser/react/use-router.ts +98 -0
  938. package/src/browser/react/use-search-params.ts +51 -0
  939. package/src/browser/react/use-segments.ts +72 -99
  940. package/src/browser/response-adapter.ts +164 -0
  941. package/src/browser/rsc-router.tsx +355 -73
  942. package/src/browser/scroll-restoration.ts +140 -50
  943. package/src/browser/segment-reconciler.ts +253 -0
  944. package/src/browser/segment-structure-assert.ts +17 -1
  945. package/src/browser/server-action-bridge.ts +668 -613
  946. package/src/browser/types.ts +235 -51
  947. package/src/browser/validate-redirect-origin.ts +56 -0
  948. package/src/build/collect-fallback-refs.ts +107 -0
  949. package/src/build/generate-manifest.ts +243 -183
  950. package/src/build/generate-route-types.ts +41 -848
  951. package/src/build/index.ts +12 -7
  952. package/src/build/prefix-tree-utils.ts +123 -0
  953. package/src/build/route-trie.ts +218 -80
  954. package/src/build/route-types/ast-helpers.ts +25 -0
  955. package/src/build/route-types/ast-route-extraction.ts +105 -0
  956. package/src/build/route-types/codegen.ts +113 -0
  957. package/src/build/route-types/include-resolution.ts +812 -0
  958. package/src/build/route-types/param-extraction.ts +51 -0
  959. package/src/build/route-types/per-module-writer.ts +144 -0
  960. package/src/build/route-types/router-processing.ts +695 -0
  961. package/src/build/route-types/scan-filter.ts +85 -0
  962. package/src/build/route-types/source-scan.ts +216 -0
  963. package/src/build/runtime-discovery.ts +223 -0
  964. package/src/cache/background-task.ts +34 -0
  965. package/src/cache/cache-error.ts +104 -0
  966. package/src/cache/cache-key-utils.ts +88 -0
  967. package/src/cache/cache-policy.ts +199 -0
  968. package/src/cache/cache-runtime.ts +695 -0
  969. package/src/cache/cache-scope.ts +324 -335
  970. package/src/cache/cache-tag.ts +149 -0
  971. package/src/cache/cf/cf-base64.ts +33 -0
  972. package/src/cache/cf/cf-cache-constants.ts +127 -0
  973. package/src/cache/cf/cf-cache-store.ts +2602 -156
  974. package/src/cache/cf/cf-cache-types.ts +349 -0
  975. package/src/cache/cf/cf-kv-utils.ts +46 -0
  976. package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
  977. package/src/cache/cf/index.ts +17 -17
  978. package/src/cache/document-cache.ts +226 -102
  979. package/src/cache/handle-capture.ts +81 -0
  980. package/src/cache/handle-snapshot.ts +132 -0
  981. package/src/cache/index.ts +24 -35
  982. package/src/cache/memory-segment-store.ts +446 -30
  983. package/src/cache/profile-registry.ts +88 -0
  984. package/src/cache/read-through-swr.ts +178 -0
  985. package/src/cache/segment-codec.ts +295 -0
  986. package/src/cache/shell-snapshot.ts +464 -0
  987. package/src/cache/tag-invalidation.ts +230 -0
  988. package/src/cache/taint.ts +153 -0
  989. package/src/cache/types.ts +283 -211
  990. package/src/cache/vercel/index.ts +11 -0
  991. package/src/cache/vercel/vercel-cache-store.ts +1201 -0
  992. package/src/client.rsc.tsx +43 -21
  993. package/src/client.tsx +131 -347
  994. package/src/cloudflare/index.ts +11 -0
  995. package/src/cloudflare/tracing.ts +108 -0
  996. package/src/component-utils.ts +23 -4
  997. package/src/components/DefaultDocument.tsx +13 -3
  998. package/src/context-var.ts +168 -0
  999. package/src/debug.ts +19 -9
  1000. package/src/decode-loader-results.ts +52 -0
  1001. package/src/defer.ts +185 -0
  1002. package/src/deps/ssr.ts +4 -2
  1003. package/src/encode-kv.ts +49 -0
  1004. package/src/errors.ts +106 -10
  1005. package/src/escape-script.ts +52 -0
  1006. package/src/handle.ts +110 -35
  1007. package/src/handles/MetaTags.tsx +83 -59
  1008. package/src/handles/Scripts.tsx +183 -0
  1009. package/src/handles/breadcrumbs.ts +93 -0
  1010. package/src/handles/deferred-resolution.ts +127 -0
  1011. package/src/handles/is-thenable.ts +18 -0
  1012. package/src/handles/meta.ts +44 -53
  1013. package/src/handles/script.ts +244 -0
  1014. package/src/host/cookie-handler.ts +20 -65
  1015. package/src/host/errors.ts +21 -30
  1016. package/src/host/index.ts +13 -9
  1017. package/src/host/pattern-matcher.ts +50 -79
  1018. package/src/host/router.ts +151 -121
  1019. package/src/host/testing.ts +45 -32
  1020. package/src/host/types.ts +52 -11
  1021. package/src/host/utils.ts +2 -2
  1022. package/src/href-client.ts +192 -57
  1023. package/src/index.rsc.ts +180 -35
  1024. package/src/index.ts +245 -73
  1025. package/src/internal-debug.ts +9 -2
  1026. package/src/loader-store.ts +500 -0
  1027. package/src/loader.rsc.ts +31 -99
  1028. package/src/loader.ts +30 -12
  1029. package/src/missing-id-error.ts +68 -0
  1030. package/src/outlet-context.ts +1 -1
  1031. package/src/outlet-provider.tsx +41 -0
  1032. package/src/prerender/build-shell-capture.ts +447 -0
  1033. package/src/prerender/param-hash.ts +16 -14
  1034. package/src/prerender/shell-manifest-key.ts +20 -0
  1035. package/src/prerender/store.ts +131 -22
  1036. package/src/prerender.ts +460 -26
  1037. package/src/redirect-origin.ts +114 -0
  1038. package/src/regex-escape.ts +8 -0
  1039. package/src/render-error-thrower.tsx +20 -0
  1040. package/src/response-utils.ts +62 -0
  1041. package/src/reverse.ts +198 -128
  1042. package/src/root-error-boundary.tsx +42 -48
  1043. package/src/route-content-wrapper.tsx +22 -77
  1044. package/src/route-definition/dsl-helpers.ts +1116 -0
  1045. package/src/route-definition/helper-factories.ts +88 -0
  1046. package/src/route-definition/helpers-types.ts +506 -0
  1047. package/src/route-definition/index.ts +54 -0
  1048. package/src/route-definition/redirect.ts +134 -0
  1049. package/src/route-definition/resolve-handler-use.ts +160 -0
  1050. package/src/route-definition/use-item-types.ts +29 -0
  1051. package/src/route-definition.ts +1 -1481
  1052. package/src/route-map-builder.ts +120 -145
  1053. package/src/route-name.ts +53 -0
  1054. package/src/route-types.ts +71 -45
  1055. package/src/router/basename.ts +14 -0
  1056. package/src/router/content-negotiation.ts +305 -0
  1057. package/src/router/debug-manifest.ts +72 -0
  1058. package/src/router/error-handling.ts +54 -27
  1059. package/src/router/find-match.ts +259 -0
  1060. package/src/router/handler-context.ts +385 -125
  1061. package/src/router/instrument.ts +355 -0
  1062. package/src/router/intercept-resolution.ts +88 -28
  1063. package/src/router/lazy-includes.ts +260 -0
  1064. package/src/router/loader-resolution.ts +449 -157
  1065. package/src/router/logging.ts +106 -6
  1066. package/src/router/manifest.ts +144 -62
  1067. package/src/router/match-api.ts +224 -256
  1068. package/src/router/match-context.ts +4 -24
  1069. package/src/router/match-handlers.ts +499 -0
  1070. package/src/router/match-middleware/background-revalidation.ts +117 -93
  1071. package/src/router/match-middleware/cache-lookup.ts +308 -150
  1072. package/src/router/match-middleware/cache-store.ts +123 -51
  1073. package/src/router/match-middleware/intercept-resolution.ts +44 -43
  1074. package/src/router/match-middleware/segment-resolution.ts +64 -22
  1075. package/src/router/match-pipelines.ts +11 -87
  1076. package/src/router/match-result.ts +143 -52
  1077. package/src/router/metrics.ts +235 -29
  1078. package/src/router/middleware-types.ts +110 -0
  1079. package/src/router/middleware.ts +526 -441
  1080. package/src/router/navigation-snapshot.ts +133 -0
  1081. package/src/router/params-util.ts +23 -0
  1082. package/src/router/parse-pattern.ts +115 -0
  1083. package/src/router/pattern-matching.ts +311 -142
  1084. package/src/router/prefetch-cache-ttl.ts +51 -0
  1085. package/src/router/prefetch-limits.ts +37 -0
  1086. package/src/router/prerender-match.ts +575 -0
  1087. package/src/router/preview-match.ts +102 -0
  1088. package/src/router/request-classification.ts +291 -0
  1089. package/src/router/revalidation.ts +203 -62
  1090. package/src/router/route-snapshot.ts +256 -0
  1091. package/src/router/router-context.ts +45 -48
  1092. package/src/router/router-interfaces.ts +564 -0
  1093. package/src/router/router-options.ts +784 -0
  1094. package/src/router/router-registry.ts +21 -0
  1095. package/src/router/segment-resolution/fresh.ts +812 -0
  1096. package/src/router/segment-resolution/helpers.ts +348 -0
  1097. package/src/router/segment-resolution/loader-cache.ts +315 -0
  1098. package/src/router/segment-resolution/loader-mask.ts +60 -0
  1099. package/src/router/segment-resolution/loader-snapshot.ts +259 -0
  1100. package/src/router/segment-resolution/mask-nested.ts +99 -0
  1101. package/src/router/segment-resolution/revalidation.ts +1340 -0
  1102. package/src/router/segment-resolution/static-store.ts +81 -0
  1103. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  1104. package/src/router/segment-resolution/view-transition-default.ts +56 -0
  1105. package/src/router/segment-resolution.ts +25 -1354
  1106. package/src/router/segment-wrappers.ts +292 -0
  1107. package/src/router/state-cookie-name.ts +33 -0
  1108. package/src/router/substitute-pattern-params.ts +75 -0
  1109. package/src/router/telemetry-otel.ts +259 -0
  1110. package/src/router/telemetry.ts +385 -0
  1111. package/src/router/timeout.ts +128 -0
  1112. package/src/router/tracing.ts +215 -0
  1113. package/src/router/trie-matching.ts +240 -61
  1114. package/src/router/types.ts +23 -70
  1115. package/src/router/url-params.ts +57 -0
  1116. package/src/router.ts +795 -2390
  1117. package/src/rsc/capture-queue.ts +67 -0
  1118. package/src/rsc/full-payload.ts +70 -0
  1119. package/src/rsc/handler-context.ts +46 -0
  1120. package/src/rsc/handler.ts +956 -1164
  1121. package/src/rsc/helpers.ts +736 -19
  1122. package/src/rsc/index.ts +2 -25
  1123. package/src/rsc/json-route-result.ts +38 -0
  1124. package/src/rsc/loader-fetch.ts +305 -0
  1125. package/src/rsc/manifest-init.ts +77 -0
  1126. package/src/rsc/nonce.ts +23 -0
  1127. package/src/rsc/origin-guard.ts +155 -0
  1128. package/src/rsc/progressive-enhancement.ts +541 -0
  1129. package/src/rsc/redirect-guard.ts +100 -0
  1130. package/src/rsc/response-cache-serve.ts +238 -0
  1131. package/src/rsc/response-error.ts +104 -0
  1132. package/src/rsc/response-route-handler.ts +257 -0
  1133. package/src/rsc/rsc-rendering.ts +856 -0
  1134. package/src/rsc/runtime-warnings.ts +55 -0
  1135. package/src/rsc/server-action.ts +525 -0
  1136. package/src/rsc/shell-build-manifest.ts +316 -0
  1137. package/src/rsc/shell-capture-constants.ts +27 -0
  1138. package/src/rsc/shell-capture.ts +1716 -0
  1139. package/src/rsc/shell-serve.ts +226 -0
  1140. package/src/rsc/ssr-setup.ts +176 -0
  1141. package/src/rsc/transition-gate.ts +89 -0
  1142. package/src/rsc/types.ts +95 -12
  1143. package/src/runtime-env.ts +18 -0
  1144. package/src/search-params.ts +99 -82
  1145. package/src/segment-content-promise.ts +67 -0
  1146. package/src/segment-fragments.ts +124 -0
  1147. package/src/segment-loader-promise.ts +167 -0
  1148. package/src/segment-system.tsx +464 -135
  1149. package/src/serialize.ts +243 -0
  1150. package/src/server/context.ts +640 -85
  1151. package/src/server/cookie-parse.ts +32 -0
  1152. package/src/server/cookie-store.ts +337 -0
  1153. package/src/server/fetchable-loader-store.ts +11 -6
  1154. package/src/server/handle-store.ts +123 -42
  1155. package/src/server/loader-registry.ts +51 -100
  1156. package/src/server/request-context.ts +1069 -152
  1157. package/src/server.ts +15 -8
  1158. package/src/ssr/index.tsx +661 -140
  1159. package/src/ssr/inject-rsc-eager.ts +167 -0
  1160. package/src/ssr/preinit-client-references.ts +106 -0
  1161. package/src/ssr/ssr-root.tsx +261 -0
  1162. package/src/static-handler.ts +45 -18
  1163. package/src/testing/cache-status.ts +162 -0
  1164. package/src/testing/collect-handle.ts +46 -0
  1165. package/src/testing/dispatch.ts +813 -0
  1166. package/src/testing/dom.entry.ts +22 -0
  1167. package/src/testing/e2e/fixture.ts +188 -0
  1168. package/src/testing/e2e/index.ts +128 -0
  1169. package/src/testing/e2e/matchers.ts +35 -0
  1170. package/src/testing/e2e/page-helpers.ts +272 -0
  1171. package/src/testing/e2e/parity.ts +387 -0
  1172. package/src/testing/e2e/server.ts +195 -0
  1173. package/src/testing/flight-matchers.ts +97 -0
  1174. package/src/testing/flight-normalize.ts +11 -0
  1175. package/src/testing/flight-runtime.d.ts +57 -0
  1176. package/src/testing/flight-tree.ts +682 -0
  1177. package/src/testing/flight.entry.ts +52 -0
  1178. package/src/testing/flight.ts +257 -0
  1179. package/src/testing/generated-routes.ts +199 -0
  1180. package/src/testing/index.ts +105 -0
  1181. package/src/testing/internal/context.ts +380 -0
  1182. package/src/testing/internal/flight-client-globals.ts +30 -0
  1183. package/src/testing/internal/seed-vars.ts +54 -0
  1184. package/src/testing/render-handler.ts +371 -0
  1185. package/src/testing/render-route.tsx +584 -0
  1186. package/src/testing/run-loader.ts +385 -0
  1187. package/src/testing/run-middleware.ts +219 -0
  1188. package/src/testing/run-transition-when.ts +164 -0
  1189. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  1190. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  1191. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  1192. package/src/testing/vitest-stubs/version.ts +5 -0
  1193. package/src/testing/vitest.ts +305 -0
  1194. package/src/theme/ThemeProvider.tsx +76 -98
  1195. package/src/theme/ThemeScript.tsx +12 -14
  1196. package/src/theme/constants.ts +57 -15
  1197. package/src/theme/index.ts +3 -20
  1198. package/src/theme/theme-context.ts +5 -35
  1199. package/src/theme/theme-script.ts +43 -39
  1200. package/src/theme/use-theme.ts +0 -3
  1201. package/src/types/boundaries.ts +123 -0
  1202. package/src/types/cache-types.ts +207 -0
  1203. package/src/types/error-types.ts +132 -0
  1204. package/src/types/global-namespace.ts +113 -0
  1205. package/src/types/handler-context.ts +850 -0
  1206. package/src/types/index.ts +81 -0
  1207. package/src/types/loader-types.ts +212 -0
  1208. package/src/types/request-scope.ts +112 -0
  1209. package/src/types/route-config.ts +138 -0
  1210. package/src/types/route-entry.ts +114 -0
  1211. package/src/types/segments.ts +271 -0
  1212. package/src/types.ts +1 -1795
  1213. package/src/urls/include-helper.ts +162 -0
  1214. package/src/urls/include-provider.ts +71 -0
  1215. package/src/urls/index.ts +44 -0
  1216. package/src/urls/path-helper-types.ts +418 -0
  1217. package/src/urls/path-helper.ts +280 -0
  1218. package/src/urls/pattern-types.ts +189 -0
  1219. package/src/urls/response-types.ts +109 -0
  1220. package/src/urls/type-extraction.ts +316 -0
  1221. package/src/urls/urls-function.ts +80 -0
  1222. package/src/urls.ts +1 -1352
  1223. package/src/use-loader.tsx +406 -141
  1224. package/src/vercel/index.ts +11 -0
  1225. package/src/vercel/tracing.ts +88 -0
  1226. package/src/vite/debug.ts +185 -0
  1227. package/src/vite/discovery/bundle-postprocess.ts +182 -0
  1228. package/src/vite/discovery/dev-prerender-cache.ts +117 -0
  1229. package/src/vite/discovery/discover-routers.ts +408 -0
  1230. package/src/vite/discovery/discovery-errors.ts +255 -0
  1231. package/src/vite/discovery/gate-state.ts +171 -0
  1232. package/src/vite/discovery/prerender-collection.ts +483 -0
  1233. package/src/vite/discovery/route-types-writer.ts +214 -0
  1234. package/src/vite/discovery/self-gen-tracking.ts +73 -0
  1235. package/src/vite/discovery/shell-prerender-phase.ts +397 -0
  1236. package/src/vite/discovery/state.ts +205 -0
  1237. package/src/vite/discovery/virtual-module-codegen.ts +293 -0
  1238. package/src/vite/index.ts +31 -2255
  1239. package/src/vite/inject-client-debug.ts +88 -0
  1240. package/src/vite/plugin-types.ts +336 -0
  1241. package/src/vite/plugins/cjs-to-esm.ts +90 -0
  1242. package/src/vite/plugins/client-ref-dedup.ts +120 -0
  1243. package/src/vite/plugins/client-ref-hashing.ts +118 -0
  1244. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1245. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1246. package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
  1247. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
  1248. package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +89 -79
  1249. package/src/vite/plugins/expose-ids/export-analysis.ts +363 -0
  1250. package/src/vite/plugins/expose-ids/handler-transform.ts +130 -0
  1251. package/src/vite/plugins/expose-ids/loader-transform.ts +64 -0
  1252. package/src/vite/plugins/expose-ids/router-transform.ts +199 -0
  1253. package/src/vite/plugins/expose-ids/types.ts +45 -0
  1254. package/src/vite/plugins/expose-internal-ids.ts +805 -0
  1255. package/src/vite/plugins/performance-tracks.ts +89 -0
  1256. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1257. package/src/vite/plugins/use-cache-transform.ts +313 -0
  1258. package/src/vite/plugins/vercel-output.ts +384 -0
  1259. package/src/vite/plugins/version-injector.ts +94 -0
  1260. package/src/vite/plugins/version-plugin.ts +271 -0
  1261. package/src/vite/plugins/virtual-entries.ts +267 -0
  1262. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  1263. package/src/vite/rango.ts +600 -0
  1264. package/src/vite/router-discovery.ts +2120 -0
  1265. package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +200 -37
  1266. package/src/vite/utils/banner.ts +36 -0
  1267. package/src/vite/utils/bundle-analysis.ts +132 -0
  1268. package/src/vite/utils/client-chunks.ts +184 -0
  1269. package/src/vite/utils/directive-prologue.ts +40 -0
  1270. package/src/vite/utils/forward-user-plugins.ts +171 -0
  1271. package/src/vite/utils/manifest-utils.ts +15 -0
  1272. package/src/vite/utils/package-resolution.ts +89 -0
  1273. package/src/vite/utils/prerender-utils.ts +268 -0
  1274. package/src/vite/utils/shared-utils.ts +271 -0
  1275. package/CLAUDE.md +0 -43
  1276. package/src/browser/lru-cache.ts +0 -69
  1277. package/src/browser/request-controller.ts +0 -164
  1278. package/src/browser/shallow.ts +0 -35
  1279. package/src/cache/memory-store.ts +0 -253
  1280. package/src/router.gen.ts +0 -6
  1281. package/src/static-handler.gen.ts +0 -5
  1282. package/src/urls.gen.ts +0 -8
  1283. package/src/vite/expose-internal-ids.ts +0 -1167
  1284. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
package/src/urls.ts CHANGED
@@ -1,1352 +1 @@
1
- /**
2
- * Django-inspired URL patterns for @rangojs/router
3
- *
4
- * This module provides `urls()` and `path()` for defining routes with
5
- * URL patterns visible at the definition site.
6
- *
7
- * @example
8
- * ```typescript
9
- * // urls/blog.ts
10
- * export const blogPatterns = urls(({ path, layout, loader }) => [
11
- * layout(BlogLayout, () => [
12
- * path("/", BlogIndex, { name: "index" }),
13
- * path("/:slug", BlogPost, { name: "post" }, () => [
14
- * loader(PostLoader),
15
- * ]),
16
- * ]),
17
- * ]);
18
- *
19
- * // urls/index.ts
20
- * export const urlpatterns = urls(({ path, layout, include }) => [
21
- * layout(RootLayout, () => [
22
- * path("/", HomePage, { name: "home" }),
23
- * include("/blog", blogPatterns, { name: "blog" }),
24
- * ]),
25
- * ]);
26
- * ```
27
- */
28
- import type { ReactNode } from "react";
29
- import type {
30
- DefaultEnv,
31
- ErrorBoundaryHandler,
32
- ExtractParams,
33
- Handler,
34
- HandlerContext,
35
- LoaderDefinition,
36
- MiddlewareFn,
37
- NotFoundBoundaryHandler,
38
- PartialCacheOptions,
39
- RouterEnv,
40
- ShouldRevalidateFn,
41
- TrailingSlashMode,
42
- } from "./types.js";
43
- import type { CookieOptions } from "./router/middleware.js";
44
- import type {
45
- AllUseItems,
46
- LayoutItem,
47
- TypedLayoutItem,
48
- RouteItem,
49
- TypedRouteItem,
50
- ParallelItem,
51
- InterceptItem,
52
- MiddlewareItem,
53
- RevalidateItem,
54
- LoaderItem,
55
- LoadingItem,
56
- ErrorBoundaryItem,
57
- NotFoundBoundaryItem,
58
- LayoutUseItem,
59
- RouteUseItem,
60
- ResponseRouteUseItem,
61
- ParallelUseItem,
62
- InterceptUseItem,
63
- LoaderUseItem,
64
- WhenItem,
65
- CacheItem,
66
- TypedCacheItem,
67
- IncludeItem,
68
- TypedIncludeItem,
69
- IncludeBrand,
70
- UrlPatternsBrand,
71
- } from "./route-types.js";
72
- import {
73
- getContext,
74
- runWithPrefixes,
75
- getUrlPrefix,
76
- getNamePrefix,
77
- type EntryData,
78
- type InterceptEntry,
79
- type InterceptWhenFn,
80
- } from "./server/context";
81
- import { invariant } from "./errors";
82
- import {
83
- isPrerenderHandler,
84
- type PrerenderHandlerDefinition,
85
- } from "./prerender.js";
86
- import {
87
- isStaticHandler,
88
- type StaticHandlerDefinition,
89
- } from "./static-handler.js";
90
- import type { SearchSchema } from "./search-params.js";
91
- import { registerSearchSchema } from "./route-map-builder.js";
92
-
93
- // ============================================================================
94
- // Response Route Symbol and Types
95
- // ============================================================================
96
-
97
- /**
98
- * Symbol marking a route as a response route (non-RSC).
99
- * Stored on PathOptions and UrlPatterns to signal the trie to short-circuit.
100
- */
101
- export const RESPONSE_TYPE: unique symbol = Symbol.for(
102
- "rangojs.responseType",
103
- ) as any;
104
-
105
- /**
106
- * Handler that must return Response (not ReactNode).
107
- * Used by path.image(), path.stream(), path.any() (binary/streaming data).
108
- */
109
- export type ResponseHandler<TParams = Record<string, string>, TEnv = any> = (
110
- ctx: ResponseHandlerContext<TParams, TEnv>,
111
- ) => Response | Promise<Response>;
112
-
113
- /**
114
- * JSON-serializable value type for auto-wrap support.
115
- */
116
- export type JsonValue =
117
- | string
118
- | number
119
- | boolean
120
- | null
121
- | JsonValue[]
122
- | { [key: string]: JsonValue };
123
-
124
- /**
125
- * Handler for JSON response routes.
126
- * Can return a plain JSON-serializable value (auto-wrapped) or Response (pass-through).
127
- */
128
- export type JsonResponseHandler<
129
- TParams = Record<string, string>,
130
- TEnv = any,
131
- > = (
132
- ctx: ResponseHandlerContext<TParams, TEnv>,
133
- ) => JsonValue | Response | Promise<JsonValue | Response>;
134
-
135
- /**
136
- * Handler for text-based response routes (text, html, xml).
137
- * Can return a string (auto-wrapped) or Response (pass-through).
138
- */
139
- export type TextResponseHandler<
140
- TParams = Record<string, string>,
141
- TEnv = any,
142
- > = (
143
- ctx: ResponseHandlerContext<TParams, TEnv>,
144
- ) => string | Response | Promise<string | Response>;
145
-
146
- /**
147
- * Lighter handler context for response routes.
148
- * No ctx.use() (no loaders). Supports setting response headers and cookies
149
- * without constructing a full Response object.
150
- */
151
- export interface ResponseHandlerContext<
152
- TParams = Record<string, string>,
153
- TEnv = any,
154
- > {
155
- request: Request;
156
- params: TParams;
157
- /** @internal Phantom property for params type invariance. Prevents mounting handlers on wrong routes. */
158
- readonly _paramCheck?: (params: TParams) => TParams;
159
- /** Platform bindings (DB, KV, secrets, etc.) extracted from RouterEnv. */
160
- env: TEnv extends RouterEnv<infer B, any> ? B : {};
161
- /** Query parameters from the URL (system params like `_rsc*` are filtered). */
162
- searchParams: URLSearchParams;
163
- /** The full URL object (with system params filtered). */
164
- url: URL;
165
- /** The pathname portion of the request URL. */
166
- pathname: string;
167
- reverse: (name: string, params?: Record<string, string>) => string;
168
- /** Read a variable set by middleware via ctx.set(key, value). */
169
- get: (key: string) => unknown;
170
- /** Set a response header. Merged into the auto-wrapped or pass-through Response. */
171
- header: (name: string, value: string) => void;
172
- /** Set a cookie on the response. */
173
- setCookie: (name: string, value: string, options?: CookieOptions) => void;
174
- }
175
-
176
-
177
- // ============================================================================
178
- // Types
179
- // ============================================================================
180
-
181
- /**
182
- * Sentinel type for unnamed routes.
183
- * Using a branded string instead of `never` prevents TypeScript from
184
- * widening array type inference when mixing named and unnamed routes.
185
- */
186
- export type UnnamedRoute = "$unnamed";
187
-
188
- /**
189
- * Options for path() function
190
- */
191
- export interface PathOptions<TName extends string = string, TSearch extends SearchSchema = {}> {
192
- /** Route name for href() lookups */
193
- name?: TName;
194
- /** Search param schema for typed query parameters */
195
- search?: TSearch;
196
- /** Trailing slash behavior: "never" (redirect /path/ to /path), "always" (redirect /path to /path/), "ignore" (match both) */
197
- trailingSlash?: TrailingSlashMode;
198
- /** Response type marker (set by path.json(), etc.) */
199
- [RESPONSE_TYPE]?: string;
200
- }
201
-
202
- /**
203
- * Internal representation of a URL pattern definition
204
- */
205
- export interface PathDefinition {
206
- pattern: string;
207
- name?: string;
208
- handler: ReactNode | Handler<any, any, any>;
209
- use?: RouteUseItem[];
210
- }
211
-
212
- /**
213
- * Result of urls() - contains the route definitions
214
- */
215
- export interface UrlPatterns<
216
- TEnv = any,
217
- TRoutes extends Record<string, any> = Record<string, string>,
218
- TResponses extends Record<string, unknown> = Record<string, unknown>,
219
- > {
220
- /** Internal: route definitions */
221
- readonly definitions: PathDefinition[];
222
- /** Internal: compiled handler function */
223
- readonly handler: () => AllUseItems[];
224
- /** Internal: trailing slash config per route name */
225
- readonly trailingSlash: Record<string, TrailingSlashMode>;
226
- /** Brand for type checking */
227
- readonly [UrlPatternsBrand]: void;
228
- /** Environment type brand (phantom) */
229
- readonly _env?: TEnv;
230
- /** Routes type brand (phantom) - carries route name -> pattern mapping */
231
- readonly _routes?: TRoutes;
232
- /** Responses type brand (phantom) - carries route name -> response data type mapping */
233
- readonly _responses?: TResponses;
234
- }
235
-
236
- /**
237
- * Options for include()
238
- */
239
- export interface IncludeOptions<TNamePrefix extends string = string> {
240
- /** Name prefix for all routes in this pattern set */
241
- name?: TNamePrefix;
242
- }
243
-
244
- // ============================================================================
245
- // Route Type Extraction Utilities
246
- // ============================================================================
247
-
248
- /**
249
- * Prefix route names with a given prefix (e.g., "blog" + "post" = "blog.post")
250
- *
251
- * Filters out plain `string` index signatures to prevent dynamically-generated
252
- * routes from poisoning the route map. When TypeScript encounters very large
253
- * route sets (5000+ routes via Array.from), it may give up computing specific
254
- * types and fall back to Record<string, string>. Without filtering, PrefixRoutes
255
- * would map `string` to `${prefix}.${string}`, creating an index signature that
256
- * accepts ANY prefixed name and defeats type-safe route checking.
257
- *
258
- * Uses `string extends K` (conservative filter):
259
- * - Drops `string` keys (TypeScript fallback) -> prevents `[x: `site.${string}`]`
260
- * - Keeps template literal patterns like `item${number}` from Array.from loops,
261
- * which are imprecise but still allow writing paths like `/shop/product/1`
262
- *
263
- * A more aggressive alternative (`{} extends Record<K, 1>`) would also drop
264
- * template literal patterns. We chose conservative because loop-generated routes
265
- * with `${number}` patterns still provide some value: they don't appear in
266
- * named-routes.gen.ts or IDE autocomplete, but they do let you manually write
267
- * valid paths without type errors.
268
- */
269
- type PrefixRoutes<
270
- TRoutes extends Record<string, any>,
271
- TPrefix extends string,
272
- > = TPrefix extends ""
273
- ? TRoutes
274
- : {
275
- [K in keyof TRoutes as K extends string
276
- ? string extends K
277
- ? never
278
- : `${TPrefix}.${K}`
279
- : never]: TRoutes[K];
280
- };
281
-
282
- /**
283
- * Prefix route patterns with a URL prefix (e.g., "/blog" + "/:slug" = "/blog/:slug")
284
- */
285
- type PrefixPatterns<
286
- TRoutes extends Record<string, any>,
287
- TUrlPrefix extends string,
288
- > = {
289
- [K in keyof TRoutes]: TRoutes[K] extends string
290
- ? `${TUrlPrefix}${TRoutes[K]}`
291
- : TRoutes[K] extends { readonly path: infer P extends string; readonly search: infer S }
292
- ? { readonly path: `${TUrlPrefix}${P}`; readonly search: S }
293
- : TRoutes[K];
294
- };
295
-
296
- /**
297
- * Depth counter for limiting recursion (max 40 levels)
298
- * Supports up to 40 sibling items at any level of a urls() call
299
- * Note: Higher values hit TypeScript's internal recursion limits
300
- */
301
- type Depth = [
302
- never,
303
- 0,
304
- 1,
305
- 2,
306
- 3,
307
- 4,
308
- 5,
309
- 6,
310
- 7,
311
- 8,
312
- 9,
313
- 10,
314
- 11,
315
- 12,
316
- 13,
317
- 14,
318
- 15,
319
- 16,
320
- 17,
321
- 18,
322
- 19,
323
- 20,
324
- 21,
325
- 22,
326
- 23,
327
- 24,
328
- 25,
329
- 26,
330
- 27,
331
- 28,
332
- 29,
333
- 30,
334
- 31,
335
- 32,
336
- 33,
337
- 34,
338
- 35,
339
- 36,
340
- 37,
341
- 38,
342
- 39,
343
- ];
344
-
345
- /**
346
- * Force TypeScript to eagerly evaluate a type.
347
- * This helps with interface extension by creating a "concrete" object type.
348
- */
349
- type Simplify<T> =
350
- T extends Record<string, string> ? { [K in keyof T]: T[K] } : T;
351
-
352
- /**
353
- * Convert a union type to an intersection type.
354
- * Used to combine route maps from multiple siblings without recursive tuple processing.
355
- */
356
- type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
357
- k: infer I,
358
- ) => void
359
- ? I
360
- : never;
361
-
362
- /**
363
- * Extract routes from a single item (path, include, layout, cache with children)
364
- * D is the current depth level for nested layouts/caches
365
- */
366
- type ExtractRoutesFromItem<T, D extends number = 40> = [D] extends [never]
367
- ? {} // Max depth reached, stop recursion
368
- : // TypedRouteItem: extract name -> pattern (exclude unnamed routes)
369
- // When search schema is non-empty, value becomes { path, search } object
370
- T extends TypedRouteItem<infer TName, infer TPattern, any, infer TSearch>
371
- ? TName extends string
372
- ? TName extends UnnamedRoute
373
- ? {} // Exclude unnamed routes from type map
374
- : {} extends TSearch
375
- ? { [K in TName]: TPattern }
376
- : { [K in TName]: { readonly path: TPattern; readonly search: TSearch } }
377
- : {}
378
- : // TypedIncludeItem: extract prefixed routes (both name and URL prefix)
379
- T extends TypedIncludeItem<
380
- infer TRoutes,
381
- infer TNamePrefix,
382
- infer TUrlPrefix
383
- >
384
- ? TNamePrefix extends string
385
- ? TUrlPrefix extends string
386
- ? PrefixRoutes<PrefixPatterns<TRoutes, TUrlPrefix>, TNamePrefix>
387
- : PrefixRoutes<TRoutes, TNamePrefix>
388
- : TUrlPrefix extends string
389
- ? PrefixPatterns<TRoutes, TUrlPrefix>
390
- : TRoutes
391
- : // TypedLayoutItem: extract child routes from phantom type
392
- T extends TypedLayoutItem<infer TChildRoutes>
393
- ? TChildRoutes
394
- : // TypedCacheItem: extract child routes from phantom type
395
- T extends TypedCacheItem<infer TChildRoutes>
396
- ? TChildRoutes
397
- : // Fallback (won't extract routes)
398
- {};
399
-
400
- /**
401
- * Extract routes from an array of items using mapped types.
402
- * Uses UnionToIntersection to combine routes without recursive tuple processing,
403
- * removing the sibling limit that was caused by TypeScript recursion limits.
404
- * D is passed to ExtractRoutesFromItem for nested depth tracking.
405
- */
406
- type ExtractRoutesFromItems<
407
- T extends readonly any[],
408
- D extends number = 40,
409
- > = T extends readonly any[]
410
- ? UnionToIntersection<
411
- { [K in keyof T]: ExtractRoutesFromItem<T[K], D> }[number]
412
- > extends infer R
413
- ? R extends Record<string, any>
414
- ? R
415
- : {}
416
- : {}
417
- : {};
418
-
419
- /**
420
- * Main utility: extract route map from urls() callback return type
421
- * Uses mapped types for sibling processing (no sibling limit).
422
- * Uses Simplify to force eager evaluation for interface extension compatibility.
423
- */
424
- export type ExtractRoutes<T extends readonly any[]> = ExtractRoutesFromItems<
425
- T,
426
- 40
427
- >;
428
-
429
- // ============================================================================
430
- // Response Type Extraction Utilities
431
- // ============================================================================
432
-
433
- /**
434
- * Prefix keys of a Record<string, unknown> with a dot-separated prefix.
435
- * Used for response type maps through include().
436
- * Same index signature filter as PrefixRoutes (see comment there).
437
- */
438
- type PrefixKeys<
439
- T extends Record<string, unknown>,
440
- TPrefix extends string,
441
- > = TPrefix extends ""
442
- ? T
443
- : {
444
- [K in keyof T as K extends string
445
- ? string extends K
446
- ? never
447
- : `${TPrefix}.${K}`
448
- : never]: T[K];
449
- };
450
-
451
- /**
452
- * Extract response data types from a single item.
453
- * Parallel to ExtractRoutesFromItem but extracts name -> TData mapping.
454
- */
455
- type ExtractResponsesFromItem<T, D extends number = 40> = [D] extends [never]
456
- ? {}
457
- : T extends TypedRouteItem<infer TName, any, infer TData>
458
- ? TName extends string
459
- ? TName extends UnnamedRoute
460
- ? {}
461
- : { [K in TName]: TData }
462
- : {}
463
- : T extends TypedIncludeItem<any, infer TNamePrefix, any, infer TResponses>
464
- ? TNamePrefix extends string
465
- ? TResponses extends Record<string, unknown>
466
- ? PrefixKeys<TResponses, TNamePrefix>
467
- : {}
468
- : TResponses extends Record<string, unknown>
469
- ? TResponses
470
- : {}
471
- : T extends TypedLayoutItem<any, infer TChildResponses>
472
- ? TChildResponses extends Record<string, unknown>
473
- ? TChildResponses
474
- : {}
475
- : T extends TypedCacheItem<any, infer TChildResponses>
476
- ? TChildResponses extends Record<string, unknown>
477
- ? TChildResponses
478
- : {}
479
- : {};
480
-
481
- /**
482
- * Extract responses from an array of items using mapped types.
483
- * Parallel to ExtractRoutesFromItems.
484
- */
485
- type ExtractResponsesFromItems<
486
- T extends readonly any[],
487
- D extends number = 40,
488
- > = T extends readonly any[]
489
- ? UnionToIntersection<
490
- { [K in keyof T]: ExtractResponsesFromItem<T[K], D> }[number]
491
- > extends infer R
492
- ? R extends Record<string, unknown>
493
- ? R
494
- : {}
495
- : {}
496
- : {};
497
-
498
- /**
499
- * Main utility: extract response data type map from urls() callback return type.
500
- * Parallel to ExtractRoutes.
501
- */
502
- export type ExtractResponses<T extends readonly any[]> =
503
- ExtractResponsesFromItems<T, 40>;
504
-
505
- // ============================================================================
506
- // Path Helpers Type
507
- // ============================================================================
508
-
509
- /**
510
- * Helpers provided by urls()
511
- */
512
- /**
513
- * Base path function signature for defining routes with URL patterns.
514
- */
515
- export type PathFn<TEnv> = <
516
- const TPattern extends string,
517
- const TName extends string = UnnamedRoute,
518
- const TSearch extends SearchSchema = {},
519
- TParams extends Record<string, any> = ExtractParams<TPattern>,
520
- >(
521
- pattern: TPattern,
522
- handler:
523
- | ReactNode
524
- | ((ctx: HandlerContext<TParams, TEnv, TSearch>) => ReactNode | Promise<ReactNode> | Response | Promise<Response>)
525
- | PrerenderHandlerDefinition<TParams>
526
- | StaticHandlerDefinition<TParams>,
527
- optionsOrUse?: PathOptions<TName, TSearch> | (() => RouteUseItem[]),
528
- use?: () => RouteUseItem[],
529
- // Generic handler bypass: when handler uses index-signature params
530
- // (e.g. Handler<Record<string, any>>), skip the biconditional.
531
- // `string extends keyof TParams` is true for index signatures,
532
- // false for concrete params ({id: string}) and empty ({}).
533
- ) => string extends keyof TParams
534
- ? TypedRouteItem<TName, TPattern, unknown, TSearch>
535
- : ExtractParams<TPattern> extends TParams
536
- ? TParams extends ExtractParams<TPattern>
537
- ? TypedRouteItem<TName, TPattern, unknown, TSearch>
538
- : { __error: `Handler params do not match pattern "${TPattern}"` }
539
- : { __error: `Handler params do not match pattern "${TPattern}"` };
540
-
541
- /**
542
- * Path function for response routes that must return Response (image, stream, any).
543
- * Handler must return Response, not ReactNode. Uses lighter ResponseHandlerContext.
544
- * Use items restricted to middleware() and cache() only.
545
- */
546
- export type ResponsePathFn<TEnv> = <
547
- const TPattern extends string,
548
- const TName extends string = UnnamedRoute,
549
- const TSearch extends SearchSchema = {},
550
- >(
551
- pattern: TPattern,
552
- handler: ResponseHandler<ExtractParams<TPattern>, TEnv>,
553
- optionsOrUse?: PathOptions<TName, TSearch> | (() => ResponseRouteUseItem[]),
554
- use?: () => ResponseRouteUseItem[],
555
- ) => TypedRouteItem<TName, TPattern, unknown, TSearch>;
556
-
557
- /**
558
- * Path function for JSON response routes (path.json()).
559
- * Handler can return plain JSON-serializable values or Response.
560
- * TData is inferred from the handler's return type (excluding Response/Promise wrappers).
561
- */
562
- export type JsonResponsePathFn<TEnv> = <
563
- const TPattern extends string,
564
- const TName extends string = UnnamedRoute,
565
- const TSearch extends SearchSchema = {},
566
- TData = unknown,
567
- >(
568
- pattern: TPattern,
569
- handler: (
570
- ctx: ResponseHandlerContext<ExtractParams<TPattern>, TEnv>,
571
- ) => TData | Response | Promise<TData | Response>,
572
- optionsOrUse?: PathOptions<TName, TSearch> | (() => ResponseRouteUseItem[]),
573
- use?: () => ResponseRouteUseItem[],
574
- ) => TypedRouteItem<TName, TPattern, TData, TSearch>;
575
-
576
- /**
577
- * Path function for text-based response routes (path.text(), path.html(), path.xml()).
578
- * Handler can return a string or Response. TData is always `string`.
579
- */
580
- export type TextResponsePathFn<TEnv> = <
581
- const TPattern extends string,
582
- const TName extends string = UnnamedRoute,
583
- const TSearch extends SearchSchema = {},
584
- >(
585
- pattern: TPattern,
586
- handler: TextResponseHandler<ExtractParams<TPattern>, TEnv>,
587
- optionsOrUse?: PathOptions<TName, TSearch> | (() => ResponseRouteUseItem[]),
588
- use?: () => ResponseRouteUseItem[],
589
- ) => TypedRouteItem<TName, TPattern, string, TSearch>;
590
-
591
- /**
592
- * Base include function signature.
593
- */
594
- export type IncludeFn<TEnv> = <
595
- TRoutes extends Record<string, any>,
596
- const TUrlPrefix extends string,
597
- const TNamePrefix extends string = never,
598
- TResponses extends Record<string, unknown> = Record<string, unknown>,
599
- >(
600
- prefix: TUrlPrefix,
601
- patterns: UrlPatterns<TEnv, TRoutes, TResponses>,
602
- options?: IncludeOptions<TNamePrefix>,
603
- ) => TypedIncludeItem<TRoutes, TNamePrefix, TUrlPrefix, TResponses>;
604
-
605
- export type PathHelpers<TEnv> = {
606
- /**
607
- * Define a route with URL pattern at definition site
608
- *
609
- * @example
610
- * ```typescript
611
- * // Pattern and component only
612
- * path("/about", AboutPage)
613
- *
614
- * // With options
615
- * path("/:slug", PostPage, { name: "post" })
616
- *
617
- * // With children (loaders, middleware, etc.)
618
- * path("/:slug", PostPage, { name: "post" }, () => [
619
- * loader(PostLoader),
620
- * ])
621
- * ```
622
- */
623
- path: PathFn<TEnv> & {
624
- json: JsonResponsePathFn<TEnv>;
625
- text: TextResponsePathFn<TEnv>;
626
- html: TextResponsePathFn<TEnv>;
627
- xml: TextResponsePathFn<TEnv>;
628
- md: TextResponsePathFn<TEnv>;
629
- image: ResponsePathFn<TEnv>;
630
- stream: ResponsePathFn<TEnv>;
631
- any: ResponsePathFn<TEnv>;
632
- };
633
-
634
- /**
635
- * Define a layout that wraps child routes
636
- */
637
- layout: {
638
- (component: ReactNode | Handler<any, any, TEnv> | StaticHandlerDefinition): TypedLayoutItem<{}, {}>;
639
- <const TChildren extends readonly LayoutUseItem[]>(
640
- component: ReactNode | Handler<any, any, TEnv> | StaticHandlerDefinition,
641
- use: () => TChildren,
642
- ): TypedLayoutItem<ExtractRoutes<TChildren>, ExtractResponses<TChildren>>;
643
- };
644
-
645
- /**
646
- * Include nested URL patterns with optional name prefix
647
- *
648
- * ```typescript
649
- * // Without name - routes keep local names
650
- * include("/blog", blogPatterns)
651
- *
652
- * // With name - routes are prefixed (e.g., "index" → "blog.index")
653
- * include("/blog", blogPatterns, { name: "blog" })
654
- * ```
655
- */
656
- include: IncludeFn<TEnv>;
657
-
658
- /**
659
- * Define parallel routes that render simultaneously in named slots
660
- */
661
- parallel: <
662
- TSlots extends Record<`@${string}`, Handler<any, any, TEnv> | ReactNode | StaticHandlerDefinition>,
663
- >(
664
- slots: TSlots,
665
- use?: () => ParallelUseItem[],
666
- ) => ParallelItem;
667
-
668
- /**
669
- * Define an intercepting route for soft navigation
670
- * Note: routeName must match a named path() in this urlpatterns
671
- */
672
- intercept: (
673
- slotName: `@${string}`,
674
- routeName: string,
675
- handler: ReactNode | Handler<any, any, TEnv>,
676
- use?: () => InterceptUseItem[],
677
- ) => InterceptItem;
678
-
679
- /**
680
- * Attach middleware to the current route/layout
681
- */
682
- middleware: (...fns: MiddlewareFn<TEnv>[]) => MiddlewareItem;
683
-
684
- /**
685
- * Control when a segment should revalidate during navigation
686
- */
687
- revalidate: (fn: ShouldRevalidateFn<any, TEnv>) => RevalidateItem;
688
-
689
- /**
690
- * Attach a data loader to the current route/layout
691
- */
692
- loader: <TData>(
693
- loaderDef: LoaderDefinition<TData>,
694
- use?: () => LoaderUseItem[],
695
- ) => LoaderItem;
696
-
697
- /**
698
- * Attach a loading component to the current route/layout
699
- */
700
- loading: (component: ReactNode, options?: { ssr?: boolean }) => LoadingItem;
701
-
702
- /**
703
- * Attach an error boundary to catch errors in this segment
704
- */
705
- errorBoundary: (
706
- fallback: ReactNode | ErrorBoundaryHandler,
707
- ) => ErrorBoundaryItem;
708
-
709
- /**
710
- * Attach a not-found boundary to handle notFound() calls
711
- */
712
- notFoundBoundary: (
713
- fallback: ReactNode | NotFoundBoundaryHandler,
714
- ) => NotFoundBoundaryItem;
715
-
716
- /**
717
- * Define a condition for when an intercept should activate
718
- */
719
- when: (fn: InterceptWhenFn) => WhenItem;
720
-
721
- /**
722
- * Define cache configuration for segments
723
- */
724
- cache: {
725
- (): TypedCacheItem<{}, {}>;
726
- <const TChildren extends readonly AllUseItems[]>(
727
- children: () => TChildren,
728
- ): TypedCacheItem<ExtractRoutes<TChildren>, ExtractResponses<TChildren>>;
729
- (options: PartialCacheOptions | false): TypedCacheItem<{}, {}>;
730
- <const TChildren extends readonly AllUseItems[]>(
731
- options: PartialCacheOptions | false,
732
- use: () => TChildren,
733
- ): TypedCacheItem<ExtractRoutes<TChildren>, ExtractResponses<TChildren>>;
734
- };
735
- };
736
-
737
- // ============================================================================
738
- // Helper Implementations
739
- // ============================================================================
740
-
741
- /**
742
- * Check if a value is a valid use item
743
- */
744
- const isValidUseItem = (item: any): item is AllUseItems | undefined | null => {
745
- return (
746
- typeof item === "undefined" ||
747
- item === null ||
748
- (item &&
749
- typeof item === "object" &&
750
- "type" in item &&
751
- [
752
- "layout",
753
- "route",
754
- "middleware",
755
- "revalidate",
756
- "parallel",
757
- "intercept",
758
- "loader",
759
- "loading",
760
- "errorBoundary",
761
- "notFoundBoundary",
762
- "when",
763
- "cache",
764
- "include",
765
- ].includes(item.type))
766
- );
767
- };
768
-
769
- /**
770
- * Apply URL prefix to a pattern
771
- * Handles edge cases like "/" patterns and double slashes
772
- */
773
- function applyUrlPrefix(prefix: string, pattern: string): string {
774
- if (!prefix) return pattern;
775
- if (pattern === "/") return prefix;
776
- if (prefix.endsWith("/") && pattern.startsWith("/")) {
777
- return prefix + pattern.slice(1);
778
- }
779
- return prefix + pattern;
780
- }
781
-
782
- /**
783
- * Apply name prefix to a route name
784
- */
785
- function applyNamePrefix(prefix: string | undefined, name: string): string {
786
- if (!prefix) return name;
787
- return `${prefix}.${name}`;
788
- }
789
-
790
- /**
791
- * Create path() helper
792
- *
793
- * The path() function is the key new feature - it combines URL pattern
794
- * with handler at the definition site.
795
- */
796
- /**
797
- * Resolve response type from path options (set by path.json(), path.text(), etc.)
798
- */
799
- function resolveResponseType(
800
- options: PathOptions | undefined,
801
- ): string | undefined {
802
- return options?.[RESPONSE_TYPE];
803
- }
804
-
805
- function createPathHelper<TEnv>(): PathFn<TEnv> {
806
- return ((
807
- pattern: string,
808
- handler: ReactNode | Handler<any, any, TEnv>,
809
- optionsOrUse?: PathOptions | (() => RouteUseItem[]),
810
- maybeUse?: () => RouteUseItem[],
811
- ): RouteItem => {
812
- const store = getContext();
813
- const ctx = store.getStore();
814
- if (!ctx) throw new Error("path() must be called inside urls()");
815
-
816
- invariant(
817
- !ctx.parent || ctx.parent.type !== "parallel",
818
- "path() cannot be used inside parallel()"
819
- );
820
-
821
- // Walk the parent chain to prevent path() nested under another path(),
822
- // even when separated by intermediate layouts (e.g. path(layout(path())))
823
- {
824
- let ancestor = ctx.parent;
825
- while (ancestor) {
826
- invariant(
827
- ancestor.type !== "route",
828
- "path() cannot be nested inside another path()"
829
- );
830
- ancestor = ancestor.parent;
831
- }
832
- }
833
-
834
- // Determine options and use based on argument types
835
- let options: PathOptions | undefined;
836
- let use: (() => RouteUseItem[]) | undefined;
837
-
838
- if (typeof optionsOrUse === "function") {
839
- // path(pattern, handler, use)
840
- use = optionsOrUse as () => RouteUseItem[];
841
- } else if (typeof optionsOrUse === "object") {
842
- // path(pattern, handler, options) or path(pattern, handler, options, use)
843
- options = optionsOrUse as PathOptions;
844
- use = maybeUse;
845
- }
846
-
847
- // Get prefixes from context (set by include())
848
- const urlPrefix = getUrlPrefix();
849
- const namePrefix = getNamePrefix();
850
-
851
- // Apply URL prefix to pattern
852
- const prefixedPattern = applyUrlPrefix(urlPrefix, pattern);
853
-
854
- // Generate route name - use provided name or generate from pattern
855
- const localName =
856
- options?.name || `$path_${pattern.replace(/[/:*?]/g, "_")}`;
857
- // Apply name prefix if set (from include())
858
- const routeName = applyNamePrefix(namePrefix, localName);
859
-
860
- const namespace = `${ctx.namespace}.${store.getNextIndex("route")}.${routeName}`;
861
-
862
- // Per-request pruning: skip registration for routes that won't be rendered.
863
- // forRoute is set by loadManifest() to the matched route name. During
864
- // evaluateLazyEntry() (route matching), forRoute is unset so all routes
865
- // register normally. We still increment counters to keep shortCodes stable
866
- // across different routes (needed for segment reconciliation on navigation).
867
- //
868
- // include() does not need its own forRoute pruning. include() creates lazy
869
- // entries that defer handler execution until route matching. When the lazy
870
- // handler eventually runs inside loadManifest(), this path() check already
871
- // covers all routes defined inside the include.
872
- if (ctx.forRoute && routeName !== ctx.forRoute) {
873
- store.getShortCode("route");
874
- return { type: "route" } as RouteItem;
875
- }
876
-
877
- // Ensure handler is always a function (wrap ReactNode or extract from prerender/static def)
878
- const wrappedHandler: Handler<any, any, TEnv> =
879
- typeof handler === "function"
880
- ? (handler as Handler<any, any, TEnv>)
881
- : isPrerenderHandler(handler)
882
- ? (handler.handler as Handler<any, any, TEnv>)
883
- : isStaticHandler(handler)
884
- ? (handler.handler as Handler<any, any, TEnv>)
885
- : () => handler;
886
-
887
- const entry = {
888
- id: namespace,
889
- shortCode: store.getShortCode("route"),
890
- type: "route" as const,
891
- parent: ctx.parent,
892
- handler: wrappedHandler,
893
- // Store the PREFIXED pattern for route matching
894
- pattern: prefixedPattern,
895
- loading: undefined,
896
- middleware: [],
897
- revalidate: [],
898
- errorBoundary: [],
899
- notFoundBoundary: [],
900
- layout: [],
901
- parallel: [],
902
- intercept: [],
903
- loader: [],
904
- ...(urlPrefix ? { mountPath: urlPrefix } : {}),
905
- ...(isPrerenderHandler(handler)
906
- ? {
907
- isPrerender: true as const,
908
- prerenderDef: handler as PrerenderHandlerDefinition,
909
- }
910
- : {}),
911
- ...(isStaticHandler(handler)
912
- ? { isStaticPrerender: true as const }
913
- : {}),
914
- ...(resolveResponseType(options)
915
- ? { responseType: resolveResponseType(options) }
916
- : {}),
917
- };
918
-
919
- // Check for duplicate route names (TypeScript should catch this, but runtime check too)
920
- invariant(
921
- ctx.manifest.get(routeName) === undefined,
922
- `Duplicate route name: ${routeName} at ${namespace}`,
923
- );
924
-
925
- // Register route entry with prefixed name
926
- ctx.manifest.set(routeName, entry);
927
-
928
- // Also store pattern in a separate map for URL generation
929
- if (ctx.patterns) {
930
- ctx.patterns.set(routeName, prefixedPattern);
931
- }
932
-
933
- // Store pattern grouped by URL prefix for separate entry creation
934
- if (ctx.patternsByPrefix) {
935
- const urlPrefix = getUrlPrefix() || "";
936
- if (!ctx.patternsByPrefix.has(urlPrefix)) {
937
- ctx.patternsByPrefix.set(urlPrefix, new Map());
938
- }
939
- ctx.patternsByPrefix.get(urlPrefix)!.set(routeName, prefixedPattern);
940
- }
941
-
942
- // Store trailing slash config if specified
943
- if (options?.trailingSlash && ctx.trailingSlash) {
944
- ctx.trailingSlash.set(routeName, options.trailingSlash);
945
- }
946
-
947
- // Store search schema if specified
948
- if (options?.search) {
949
- if (ctx.searchSchemas) {
950
- ctx.searchSchemas.set(routeName, options.search);
951
- }
952
- registerSearchSchema(routeName, options.search);
953
- }
954
-
955
- // Run use callback if provided
956
- if (use && typeof use === "function") {
957
- const result = store.run(namespace, entry, use);
958
- invariant(
959
- Array.isArray(result) && result.every((item) => isValidUseItem(item)),
960
- `path() use() callback must return an array of use items [${namespace}]`,
961
- );
962
- return { name: namespace, type: "route", uses: result } as RouteItem;
963
- }
964
-
965
- return { name: namespace, type: "route" } as RouteItem;
966
- }) as PathFn<TEnv>;
967
- }
968
-
969
- /**
970
- * Attach response type tag methods (.json, .text, .html, .xml, .md, .image, .stream, .any) to a path helper.
971
- * Each tag wraps the original path() call with the RESPONSE_TYPE option set.
972
- */
973
- function attachPathResponseTags<TEnv>(pathFn: PathFn<TEnv>): PathFn<TEnv> & {
974
- json: JsonResponsePathFn<TEnv>;
975
- text: TextResponsePathFn<TEnv>;
976
- html: TextResponsePathFn<TEnv>;
977
- xml: TextResponsePathFn<TEnv>;
978
- md: TextResponsePathFn<TEnv>;
979
- image: ResponsePathFn<TEnv>;
980
- stream: ResponsePathFn<TEnv>;
981
- any: ResponsePathFn<TEnv>;
982
- } {
983
- function createTagged(responseType: string): ResponsePathFn<TEnv> {
984
- return ((
985
- pattern: string,
986
- handler: any,
987
- optionsOrUse?: any,
988
- maybeUse?: any,
989
- ) => {
990
- let options: PathOptions;
991
- let use: (() => any[]) | undefined;
992
-
993
- if (typeof optionsOrUse === "function") {
994
- options = { [RESPONSE_TYPE]: responseType };
995
- use = optionsOrUse;
996
- } else {
997
- options = { ...optionsOrUse, [RESPONSE_TYPE]: responseType };
998
- use = maybeUse;
999
- }
1000
-
1001
- return pathFn(pattern, handler, options, use);
1002
- }) as ResponsePathFn<TEnv>;
1003
- }
1004
-
1005
- const extended = pathFn as any;
1006
- extended.json = createTagged("json");
1007
- extended.text = createTagged("text");
1008
- extended.html = createTagged("html");
1009
- extended.xml = createTagged("xml");
1010
- extended.md = createTagged("md");
1011
- extended.image = createTagged("image");
1012
- extended.stream = createTagged("stream");
1013
- extended.any = createTagged("any");
1014
- return extended;
1015
- }
1016
-
1017
- /**
1018
- * Process an IncludeItem by executing its nested patterns with prefixes
1019
- * This expands the include into actual route registrations
1020
- */
1021
- function processIncludeItem(item: IncludeItem): AllUseItems[] {
1022
- const { prefix, patterns, options } = item;
1023
- const namePrefix = options?.name;
1024
-
1025
- // Execute the nested patterns' handler with URL and name prefixes
1026
- // The urlPrefix being set tells nested urls() to skip RootLayout wrapping
1027
- return runWithPrefixes(prefix, namePrefix, () => {
1028
- // Call the nested patterns' handler - this registers routes with prefixed patterns/names
1029
- return (patterns as UrlPatterns).handler();
1030
- });
1031
- }
1032
-
1033
- /**
1034
- * Recursively process items, expanding any IncludeItems
1035
- * Returns items with IncludeItems expanded into actual route items
1036
- *
1037
- * Lazy includes are kept as-is (not expanded) for the router to handle later.
1038
- */
1039
- function processItems(items: readonly AllUseItems[]): AllUseItems[] {
1040
- const result: AllUseItems[] = [];
1041
-
1042
- for (const item of items) {
1043
- if (!item) continue;
1044
-
1045
- if (item.type === "include") {
1046
- const includeItem = item as IncludeItem & {
1047
- _expanded?: AllUseItems[];
1048
- lazy?: boolean;
1049
- };
1050
-
1051
- // Lazy includes are NOT expanded here - kept for router to handle
1052
- if (includeItem.lazy) {
1053
- result.push(item);
1054
- continue;
1055
- }
1056
-
1057
- // Eager includes are already expanded during include() call
1058
- if (includeItem._expanded) {
1059
- // Items were expanded immediately - just process them recursively
1060
- result.push(...processItems(includeItem._expanded));
1061
- } else {
1062
- // Fallback for legacy include items without _expanded
1063
- const expanded = processIncludeItem(item as IncludeItem);
1064
- result.push(...processItems(expanded));
1065
- }
1066
- } else if (item.type === "layout" && (item as any).uses) {
1067
- // Process nested items in layout
1068
- const layoutItem = item as any;
1069
- layoutItem.uses = processItems(layoutItem.uses);
1070
- result.push(layoutItem);
1071
- } else {
1072
- result.push(item);
1073
- }
1074
- }
1075
-
1076
- return result;
1077
- }
1078
-
1079
- /**
1080
- * Create include() helper for composing URL patterns
1081
- *
1082
- * By default, include() IMMEDIATELY expands the nested patterns. This ensures
1083
- * that routes from included patterns inherit the correct parent context
1084
- * (the layout they're included in).
1085
- *
1086
- * With `lazy: true`, patterns are NOT expanded at definition time. Instead,
1087
- * they're evaluated on first request that matches the prefix. This improves
1088
- * cold start time for apps with many routes.
1089
- */
1090
- function createIncludeHelper<TEnv>(): IncludeFn<TEnv> {
1091
- return (
1092
- prefix: string,
1093
- patterns: UrlPatterns<TEnv>,
1094
- options?: IncludeOptions,
1095
- ): IncludeItem => {
1096
- const store = getContext();
1097
- const ctx = store.getStore();
1098
- if (!ctx) throw new Error("include() must be called inside urls()");
1099
-
1100
- const namePrefix = options?.name;
1101
- const name = `$include_${prefix.replace(/[/:*?]/g, "_")}`;
1102
-
1103
- // Capture context for deferred evaluation
1104
- const capturedUrlPrefix = getUrlPrefix();
1105
- const capturedNamePrefix = getNamePrefix();
1106
- const capturedParent = ctx.parent;
1107
- const fullPrefix = capturedUrlPrefix
1108
- ? (capturedUrlPrefix.endsWith("/") && prefix.startsWith("/")
1109
- ? capturedUrlPrefix + prefix.slice(1)
1110
- : capturedUrlPrefix + prefix)
1111
- : prefix;
1112
- const fullNamePrefix = namePrefix
1113
- ? capturedNamePrefix
1114
- ? `${capturedNamePrefix}.${namePrefix}`
1115
- : namePrefix
1116
- : capturedNamePrefix;
1117
-
1118
- // Track this include for build-time manifest generation
1119
- if (ctx.trackedIncludes) {
1120
- ctx.trackedIncludes.push({
1121
- prefix,
1122
- fullPrefix,
1123
- namePrefix: fullNamePrefix,
1124
- patterns,
1125
- lazy: true,
1126
- });
1127
- }
1128
-
1129
- // Snapshot parent's counters so lazy manifest generation starts
1130
- // at the correct index, preventing shortCode collisions with
1131
- // sibling entries (e.g., BlogLayout and ArticlesLayout under NavLayout).
1132
- const capturedCounters = { ...ctx.counters };
1133
-
1134
- // Reserve a layout slot in the parent's counter so sibling lazy includes
1135
- // produce different shortCode indices for their root layout.
1136
- // Without this, consecutive include() calls capture identical counters
1137
- // and their first child layouts get the same shortCode (e.g., both M0L0L0),
1138
- // causing the client partial-update diff to see no changes on navigation.
1139
- if (capturedParent?.shortCode) {
1140
- const layoutCounterKey = `${capturedParent.shortCode}_layout`;
1141
- ctx.counters[layoutCounterKey] ??= 0;
1142
- ctx.counters[layoutCounterKey]++;
1143
- }
1144
-
1145
- // All includes are lazy - patterns are evaluated on first matching request
1146
- // This improves cold start time significantly for large route sets
1147
- return {
1148
- type: "include",
1149
- name,
1150
- prefix,
1151
- patterns,
1152
- options,
1153
- lazy: true,
1154
- _lazyContext: {
1155
- urlPrefix: capturedUrlPrefix,
1156
- namePrefix: fullNamePrefix,
1157
- parent: capturedParent,
1158
- counters: capturedCounters,
1159
- },
1160
- } as IncludeItem;
1161
- };
1162
- }
1163
-
1164
- // ============================================================================
1165
- // Re-use existing helpers from route-definition.ts
1166
- // ============================================================================
1167
-
1168
- // Import the helper creation functions from route-definition
1169
- import { createRouteHelpers } from "./route-definition.js";
1170
-
1171
- // ============================================================================
1172
- // urls() Main Entry Point
1173
- // ============================================================================
1174
-
1175
- /**
1176
- * Define URL patterns with Django-inspired syntax
1177
- *
1178
- * Replaces map() as the entry point for route definitions.
1179
- * URL patterns are now visible at the definition site via path().
1180
- *
1181
- * @example
1182
- * ```typescript
1183
- * export const blogPatterns = urls(({ path, layout, loader }) => [
1184
- * layout(BlogLayout, () => [
1185
- * path("/", BlogIndex, { name: "index" }),
1186
- * path("/:slug", BlogPost, { name: "post" }, () => [
1187
- * loader(PostLoader),
1188
- * ]),
1189
- * ]),
1190
- * ]);
1191
- * ```
1192
- */
1193
- export function urls<
1194
- TEnv = DefaultEnv,
1195
- const TItems extends readonly AllUseItems[] = readonly AllUseItems[],
1196
- >(
1197
- builder: (helpers: PathHelpers<TEnv>) => TItems,
1198
- ): UrlPatterns<TEnv, ExtractRoutes<TItems>, ExtractResponses<TItems>> {
1199
- // Collect path definitions during build
1200
- const definitions: PathDefinition[] = [];
1201
-
1202
- // Create the handler function that will be called by the router
1203
- const handler = () => {
1204
- invariant(
1205
- typeof builder === "function",
1206
- "urls() expects a builder function as its argument",
1207
- );
1208
-
1209
- // Get base helpers from the existing route-definition module
1210
- const baseHelpers = createRouteHelpers<any, TEnv>();
1211
-
1212
- // Create the path helper (with .json, .text, .html, .xml, .image, .stream, .any tags)
1213
- const pathHelper = attachPathResponseTags(createPathHelper<TEnv>());
1214
-
1215
- // Create the include helper
1216
- const includeHelper = createIncludeHelper<TEnv>();
1217
-
1218
- // Combine all helpers
1219
- // Note: layout and cache are cast to their typed versions - phantom types don't affect runtime
1220
- const helpers: PathHelpers<TEnv> = {
1221
- path: pathHelper as any,
1222
- include: includeHelper as any,
1223
- layout: baseHelpers.layout as PathHelpers<TEnv>["layout"],
1224
- parallel: baseHelpers.parallel as PathHelpers<TEnv>["parallel"],
1225
- intercept: baseHelpers.intercept as PathHelpers<TEnv>["intercept"],
1226
- middleware: baseHelpers.middleware,
1227
- revalidate: baseHelpers.revalidate,
1228
- loader: baseHelpers.loader,
1229
- loading: baseHelpers.loading,
1230
- errorBoundary: baseHelpers.errorBoundary,
1231
- notFoundBoundary: baseHelpers.notFoundBoundary,
1232
- when: baseHelpers.when,
1233
- cache: baseHelpers.cache as PathHelpers<TEnv>["cache"],
1234
- };
1235
-
1236
- // Execute builder directly - manifest.ts handles RootLayout wrapping
1237
- // for inline handlers (non-Promise results).
1238
- // For nested include() calls, routes inherit the outer RootLayout.
1239
- const builderResult = builder(helpers);
1240
- return processItems(builderResult);
1241
- };
1242
-
1243
- // trailingSlash config is populated when handler() runs
1244
- // We expose it via a getter that reads from the context after handler execution
1245
- return {
1246
- definitions,
1247
- handler,
1248
- get trailingSlash() {
1249
- // Get the trailingSlash map from the current context
1250
- // This will be populated after handler() is called
1251
- const store = getContext();
1252
- const ctx = store.context.getStore();
1253
- if (!ctx?.trailingSlash) {
1254
- return {};
1255
- }
1256
- return Object.fromEntries(ctx.trailingSlash);
1257
- },
1258
- } as UrlPatterns<TEnv, ExtractRoutes<TItems>, ExtractResponses<TItems>>;
1259
- }
1260
-
1261
-
1262
- // ============================================================================
1263
- // Type Utilities for path()
1264
- // ============================================================================
1265
-
1266
- /**
1267
- * Extract route names from a UrlPatterns result
1268
- * Used for type-safe href() generation
1269
- */
1270
- export type ExtractRouteNames<T extends UrlPatterns<any>> =
1271
- T extends UrlPatterns<infer _TEnv>
1272
- ? string // For now, will be refined with full implementation
1273
- : never;
1274
-
1275
- /**
1276
- * Extract params for a specific route name
1277
- */
1278
- export type ExtractPathParams<
1279
- T extends UrlPatterns<any>,
1280
- K extends string,
1281
- > = ExtractParams<string>; // Will be refined with pattern tracking
1282
-
1283
- // ============================================================================
1284
- // Response Envelope Types
1285
- // ============================================================================
1286
-
1287
- /**
1288
- * Error shape returned in the `{ error }` side of a JSON response envelope.
1289
- */
1290
- export interface ResponseError {
1291
- message: string;
1292
- code?: string;
1293
- type?: string;
1294
- stack?: string;
1295
- }
1296
-
1297
- /**
1298
- * Discriminated union envelope for JSON response routes.
1299
- * Consumers check `result.error` to discriminate between success and failure.
1300
- *
1301
- * @example
1302
- * ```typescript
1303
- * const result: ResponseEnvelope<Product> = await fetch(url).then(r => r.json());
1304
- * if (result.error) {
1305
- * console.log(result.error.message, result.error.code);
1306
- * return;
1307
- * }
1308
- * result.data.name // fully typed
1309
- * ```
1310
- */
1311
- export type ResponseEnvelope<T> =
1312
- | { data: T; error?: undefined }
1313
- | { data?: undefined; error: ResponseError };
1314
-
1315
- // ============================================================================
1316
- // Response Type Consumer Utilities
1317
- // ============================================================================
1318
-
1319
- /**
1320
- * Extract the response data type for a named route from a UrlPatterns instance.
1321
- * Wraps in ResponseEnvelope since JSON response routes return enveloped data.
1322
- *
1323
- * @example
1324
- * ```typescript
1325
- * const apiPatterns = urls(({ path }) => [
1326
- * path.json("/health", (ctx) => ({ status: "ok", timestamp: Date.now() }), { name: "health" }),
1327
- * ]);
1328
- *
1329
- * type HealthData = RouteResponse<typeof apiPatterns, "health">;
1330
- * // ResponseEnvelope<{ status: string; timestamp: number }>
1331
- * ```
1332
- */
1333
- export type RouteResponse<TPatterns, TName extends string> = TPatterns extends {
1334
- readonly _responses?: infer R;
1335
- }
1336
- ? TName extends keyof R
1337
- ? ResponseEnvelope<Exclude<R[TName], Response>>
1338
- : never
1339
- : never;
1340
-
1341
- // ============================================================================
1342
- // Exports
1343
- // ============================================================================
1344
-
1345
- export type {
1346
- AllUseItems,
1347
- IncludeItem,
1348
- TypedRouteItem,
1349
- TypedIncludeItem,
1350
- TypedLayoutItem,
1351
- TypedCacheItem,
1352
- } from "./route-types.js";
1
+ export * from "./urls/index.js";