@rangojs/router 0.0.0-experimental.13 → 0.0.0-experimental.131

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 (1214) hide show
  1. package/AGENTS.md +9 -0
  2. package/README.md +1040 -5
  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 +1712 -212
  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/dist/network-error-thrower.d.ts +17 -0
  448. package/dist/network-error-thrower.d.ts.map +1 -0
  449. package/dist/network-error-thrower.js +14 -0
  450. package/dist/network-error-thrower.js.map +1 -0
  451. package/dist/outlet-context.d.ts +13 -0
  452. package/dist/outlet-context.d.ts.map +1 -0
  453. package/dist/outlet-context.js +3 -0
  454. package/dist/outlet-context.js.map +1 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  456. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  457. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  458. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  459. package/dist/prerender/param-hash.d.ts +16 -0
  460. package/dist/prerender/param-hash.d.ts.map +1 -0
  461. package/dist/prerender/param-hash.js +36 -0
  462. package/dist/prerender/param-hash.js.map +1 -0
  463. package/dist/prerender/store.d.ts +38 -0
  464. package/dist/prerender/store.d.ts.map +1 -0
  465. package/dist/prerender/store.js +61 -0
  466. package/dist/prerender/store.js.map +1 -0
  467. package/dist/prerender.d.ts +66 -0
  468. package/dist/prerender.d.ts.map +1 -0
  469. package/dist/prerender.js +57 -0
  470. package/dist/prerender.js.map +1 -0
  471. package/dist/reverse.d.ts +196 -0
  472. package/dist/reverse.d.ts.map +1 -0
  473. package/dist/reverse.js +78 -0
  474. package/dist/reverse.js.map +1 -0
  475. package/dist/root-error-boundary.d.ts +33 -0
  476. package/dist/root-error-boundary.d.ts.map +1 -0
  477. package/dist/root-error-boundary.js +165 -0
  478. package/dist/root-error-boundary.js.map +1 -0
  479. package/dist/route-content-wrapper.d.ts +46 -0
  480. package/dist/route-content-wrapper.d.ts.map +1 -0
  481. package/dist/route-content-wrapper.js +77 -0
  482. package/dist/route-content-wrapper.js.map +1 -0
  483. package/dist/route-definition.d.ts +421 -0
  484. package/dist/route-definition.d.ts.map +1 -0
  485. package/dist/route-definition.js +868 -0
  486. package/dist/route-definition.js.map +1 -0
  487. package/dist/route-map-builder.d.ts +155 -0
  488. package/dist/route-map-builder.d.ts.map +1 -0
  489. package/dist/route-map-builder.js +237 -0
  490. package/dist/route-map-builder.js.map +1 -0
  491. package/dist/route-types.d.ts +165 -0
  492. package/dist/route-types.d.ts.map +1 -0
  493. package/dist/route-types.js +7 -0
  494. package/dist/route-types.js.map +1 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  496. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  497. package/dist/router/__tests__/handler-context.test.js +65 -0
  498. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  502. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  503. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  504. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  505. package/dist/router/__tests__/match-context.test.js +92 -0
  506. package/dist/router/__tests__/match-context.test.js.map +1 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  508. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  509. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  510. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  511. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  512. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  513. package/dist/router/__tests__/match-result.test.js +457 -0
  514. package/dist/router/__tests__/match-result.test.js.map +1 -0
  515. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  516. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  517. package/dist/router/__tests__/on-error.test.js +678 -0
  518. package/dist/router/__tests__/on-error.test.js.map +1 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  520. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  521. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  522. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  526. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  527. package/dist/router/error-handling.d.ts +77 -0
  528. package/dist/router/error-handling.d.ts.map +1 -0
  529. package/dist/router/error-handling.js +202 -0
  530. package/dist/router/error-handling.js.map +1 -0
  531. package/dist/router/handler-context.d.ts +20 -0
  532. package/dist/router/handler-context.d.ts.map +1 -0
  533. package/dist/router/handler-context.js +198 -0
  534. package/dist/router/handler-context.js.map +1 -0
  535. package/dist/router/intercept-resolution.d.ts +66 -0
  536. package/dist/router/intercept-resolution.d.ts.map +1 -0
  537. package/dist/router/intercept-resolution.js +246 -0
  538. package/dist/router/intercept-resolution.js.map +1 -0
  539. package/dist/router/loader-resolution.d.ts +64 -0
  540. package/dist/router/loader-resolution.d.ts.map +1 -0
  541. package/dist/router/loader-resolution.js +284 -0
  542. package/dist/router/loader-resolution.js.map +1 -0
  543. package/dist/router/logging.d.ts +15 -0
  544. package/dist/router/logging.d.ts.map +1 -0
  545. package/dist/router/logging.js +99 -0
  546. package/dist/router/logging.js.map +1 -0
  547. package/dist/router/manifest.d.ts +22 -0
  548. package/dist/router/manifest.d.ts.map +1 -0
  549. package/dist/router/manifest.js +181 -0
  550. package/dist/router/manifest.js.map +1 -0
  551. package/dist/router/match-api.d.ts +35 -0
  552. package/dist/router/match-api.d.ts.map +1 -0
  553. package/dist/router/match-api.js +406 -0
  554. package/dist/router/match-api.js.map +1 -0
  555. package/dist/router/match-context.d.ts +206 -0
  556. package/dist/router/match-context.d.ts.map +1 -0
  557. package/dist/router/match-context.js +17 -0
  558. package/dist/router/match-context.js.map +1 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  560. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  561. package/dist/router/match-middleware/background-revalidation.js +75 -0
  562. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  564. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  565. package/dist/router/match-middleware/cache-lookup.js +257 -0
  566. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  567. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  568. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  569. package/dist/router/match-middleware/cache-store.js +108 -0
  570. package/dist/router/match-middleware/cache-store.js.map +1 -0
  571. package/dist/router/match-middleware/index.d.ts +81 -0
  572. package/dist/router/match-middleware/index.d.ts.map +1 -0
  573. package/dist/router/match-middleware/index.js +80 -0
  574. package/dist/router/match-middleware/index.js.map +1 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  576. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  577. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  578. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  580. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  581. package/dist/router/match-middleware/segment-resolution.js +53 -0
  582. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  583. package/dist/router/match-pipelines.d.ts +147 -0
  584. package/dist/router/match-pipelines.d.ts.map +1 -0
  585. package/dist/router/match-pipelines.js +82 -0
  586. package/dist/router/match-pipelines.js.map +1 -0
  587. package/dist/router/match-result.d.ts +126 -0
  588. package/dist/router/match-result.d.ts.map +1 -0
  589. package/dist/router/match-result.js +93 -0
  590. package/dist/router/match-result.js.map +1 -0
  591. package/dist/router/metrics.d.ts +20 -0
  592. package/dist/router/metrics.d.ts.map +1 -0
  593. package/dist/router/metrics.js +47 -0
  594. package/dist/router/metrics.js.map +1 -0
  595. package/dist/router/middleware.d.ts +249 -0
  596. package/dist/router/middleware.d.ts.map +1 -0
  597. package/dist/router/middleware.js +434 -0
  598. package/dist/router/middleware.js.map +1 -0
  599. package/dist/router/middleware.test.d.ts +2 -0
  600. package/dist/router/middleware.test.d.ts.map +1 -0
  601. package/dist/router/middleware.test.js +816 -0
  602. package/dist/router/middleware.test.js.map +1 -0
  603. package/dist/router/pattern-matching.d.ts +149 -0
  604. package/dist/router/pattern-matching.d.ts.map +1 -0
  605. package/dist/router/pattern-matching.js +349 -0
  606. package/dist/router/pattern-matching.js.map +1 -0
  607. package/dist/router/revalidation.d.ts +44 -0
  608. package/dist/router/revalidation.d.ts.map +1 -0
  609. package/dist/router/revalidation.js +147 -0
  610. package/dist/router/revalidation.js.map +1 -0
  611. package/dist/router/router-context.d.ts +135 -0
  612. package/dist/router/router-context.d.ts.map +1 -0
  613. package/dist/router/router-context.js +36 -0
  614. package/dist/router/router-context.js.map +1 -0
  615. package/dist/router/segment-resolution.d.ts +127 -0
  616. package/dist/router/segment-resolution.d.ts.map +1 -0
  617. package/dist/router/segment-resolution.js +919 -0
  618. package/dist/router/segment-resolution.js.map +1 -0
  619. package/dist/router/trie-matching.d.ts +40 -0
  620. package/dist/router/trie-matching.d.ts.map +1 -0
  621. package/dist/router/trie-matching.js +127 -0
  622. package/dist/router/trie-matching.js.map +1 -0
  623. package/dist/router/types.d.ts +136 -0
  624. package/dist/router/types.d.ts.map +1 -0
  625. package/dist/router/types.js +7 -0
  626. package/dist/router/types.js.map +1 -0
  627. package/dist/router.d.ts +753 -0
  628. package/dist/router.d.ts.map +1 -0
  629. package/dist/router.gen.d.ts +6 -0
  630. package/dist/router.gen.d.ts.map +1 -0
  631. package/dist/router.gen.js +6 -0
  632. package/dist/router.gen.js.map +1 -0
  633. package/dist/router.js +1304 -0
  634. package/dist/router.js.map +1 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  636. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  637. package/dist/rsc/__tests__/helpers.test.js +140 -0
  638. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  639. package/dist/rsc/handler.d.ts +45 -0
  640. package/dist/rsc/handler.d.ts.map +1 -0
  641. package/dist/rsc/handler.js +1172 -0
  642. package/dist/rsc/handler.js.map +1 -0
  643. package/dist/rsc/helpers.d.ts +16 -0
  644. package/dist/rsc/helpers.d.ts.map +1 -0
  645. package/dist/rsc/helpers.js +55 -0
  646. package/dist/rsc/helpers.js.map +1 -0
  647. package/dist/rsc/index.d.ts +22 -0
  648. package/dist/rsc/index.d.ts.map +1 -0
  649. package/dist/rsc/index.js +23 -0
  650. package/dist/rsc/index.js.map +1 -0
  651. package/dist/rsc/nonce.d.ts +9 -0
  652. package/dist/rsc/nonce.d.ts.map +1 -0
  653. package/dist/rsc/nonce.js +18 -0
  654. package/dist/rsc/nonce.js.map +1 -0
  655. package/dist/rsc/types.d.ts +206 -0
  656. package/dist/rsc/types.d.ts.map +1 -0
  657. package/dist/rsc/types.js +8 -0
  658. package/dist/rsc/types.js.map +1 -0
  659. package/dist/search-params.d.ts +103 -0
  660. package/dist/search-params.d.ts.map +1 -0
  661. package/dist/search-params.js +74 -0
  662. package/dist/search-params.js.map +1 -0
  663. package/dist/segment-system.d.ts +75 -0
  664. package/dist/segment-system.d.ts.map +1 -0
  665. package/dist/segment-system.js +336 -0
  666. package/dist/segment-system.js.map +1 -0
  667. package/dist/server/context.d.ts +245 -0
  668. package/dist/server/context.d.ts.map +1 -0
  669. package/dist/server/context.js +197 -0
  670. package/dist/server/context.js.map +1 -0
  671. package/dist/server/fetchable-loader-store.d.ts +18 -0
  672. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  673. package/dist/server/fetchable-loader-store.js +18 -0
  674. package/dist/server/fetchable-loader-store.js.map +1 -0
  675. package/dist/server/handle-store.d.ts +85 -0
  676. package/dist/server/handle-store.d.ts.map +1 -0
  677. package/dist/server/handle-store.js +142 -0
  678. package/dist/server/handle-store.js.map +1 -0
  679. package/dist/server/loader-registry.d.ts +55 -0
  680. package/dist/server/loader-registry.d.ts.map +1 -0
  681. package/dist/server/loader-registry.js +132 -0
  682. package/dist/server/loader-registry.js.map +1 -0
  683. package/dist/server/request-context.d.ts +226 -0
  684. package/dist/server/request-context.d.ts.map +1 -0
  685. package/dist/server/request-context.js +290 -0
  686. package/dist/server/request-context.js.map +1 -0
  687. package/dist/server/root-layout.d.ts +4 -0
  688. package/dist/server/root-layout.d.ts.map +1 -0
  689. package/dist/server/root-layout.js +5 -0
  690. package/dist/server/root-layout.js.map +1 -0
  691. package/dist/server.d.ts +15 -0
  692. package/dist/server.d.ts.map +1 -0
  693. package/dist/server.js +20 -0
  694. package/dist/server.js.map +1 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  698. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  699. package/dist/ssr/index.d.ts +98 -0
  700. package/dist/ssr/index.d.ts.map +1 -0
  701. package/dist/ssr/index.js +158 -0
  702. package/dist/ssr/index.js.map +1 -0
  703. package/dist/static-handler.d.ts +50 -0
  704. package/dist/static-handler.d.ts.map +1 -0
  705. package/dist/static-handler.gen.d.ts +5 -0
  706. package/dist/static-handler.gen.d.ts.map +1 -0
  707. package/dist/static-handler.gen.js +5 -0
  708. package/dist/static-handler.gen.js.map +1 -0
  709. package/dist/static-handler.js +29 -0
  710. package/dist/static-handler.js.map +1 -0
  711. package/dist/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 +6263 -2733
  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 +123 -68
  811. package/skills/api-client/SKILL.md +211 -0
  812. package/skills/breadcrumbs/SKILL.md +312 -0
  813. package/skills/bundle-analysis/SKILL.md +159 -0
  814. package/skills/cache-guide/SKILL.md +486 -0
  815. package/skills/caching/SKILL.md +349 -24
  816. package/skills/composability/SKILL.md +197 -0
  817. package/skills/css/SKILL.md +76 -0
  818. package/skills/debug-manifest/SKILL.md +12 -8
  819. package/skills/document-cache/SKILL.md +87 -62
  820. package/skills/fonts/SKILL.md +6 -4
  821. package/skills/handler-use/SKILL.md +364 -0
  822. package/skills/hooks/SKILL.md +557 -79
  823. package/skills/host-router/SKILL.md +278 -0
  824. package/skills/i18n/SKILL.md +276 -0
  825. package/skills/intercept/SKILL.md +175 -8
  826. package/skills/layout/SKILL.md +128 -5
  827. package/skills/links/SKILL.md +304 -25
  828. package/skills/loader/SKILL.md +604 -54
  829. package/skills/middleware/SKILL.md +213 -37
  830. package/skills/migrate-nextjs/SKILL.md +584 -0
  831. package/skills/migrate-react-router/SKILL.md +769 -0
  832. package/skills/mime-routes/SKILL.md +41 -10
  833. package/skills/observability/SKILL.md +172 -0
  834. package/skills/parallel/SKILL.md +276 -3
  835. package/skills/prerender/SKILL.md +432 -52
  836. package/skills/rango/SKILL.md +313 -21
  837. package/skills/react-compiler/SKILL.md +168 -0
  838. package/skills/response-routes/SKILL.md +248 -120
  839. package/skills/route/SKILL.md +287 -21
  840. package/skills/router-setup/SKILL.md +231 -33
  841. package/skills/server-actions/SKILL.md +775 -0
  842. package/skills/streams-and-websockets/SKILL.md +283 -0
  843. package/skills/tailwind/SKILL.md +27 -3
  844. package/skills/testing/SKILL.md +129 -0
  845. package/skills/testing/bindings.md +89 -0
  846. package/skills/testing/cache-prerender.md +124 -0
  847. package/skills/testing/client-components.md +122 -0
  848. package/skills/testing/e2e-parity.md +125 -0
  849. package/skills/testing/flight.md +92 -0
  850. package/skills/testing/handles.md +129 -0
  851. package/skills/testing/loader.md +128 -0
  852. package/skills/testing/middleware.md +99 -0
  853. package/skills/testing/render-handler.md +121 -0
  854. package/skills/testing/response-routes.md +95 -0
  855. package/skills/testing/reverse-and-types.md +84 -0
  856. package/skills/testing/server-actions.md +107 -0
  857. package/skills/testing/server-tree.md +128 -0
  858. package/skills/testing/setup.md +120 -0
  859. package/skills/theme/SKILL.md +9 -8
  860. package/skills/typesafety/SKILL.md +547 -107
  861. package/skills/use-cache/SKILL.md +355 -0
  862. package/skills/view-transitions/SKILL.md +294 -0
  863. package/src/__augment-tests__/augment.ts +81 -0
  864. package/src/__augment-tests__/augmented.check.ts +116 -0
  865. package/src/__internal.ts +77 -44
  866. package/src/bin/rango.ts +312 -15
  867. package/src/browser/action-coordinator.ts +114 -0
  868. package/src/browser/action-fence.ts +47 -0
  869. package/src/browser/app-shell.ts +39 -0
  870. package/src/browser/app-version.ts +14 -0
  871. package/src/browser/cookie-name.ts +140 -0
  872. package/src/browser/event-controller.ts +162 -200
  873. package/src/browser/history-state.ts +101 -0
  874. package/src/browser/index.ts +3 -3
  875. package/src/browser/intercept-utils.ts +52 -0
  876. package/src/browser/invalidate-client-cache.ts +52 -0
  877. package/src/browser/link-interceptor.ts +24 -4
  878. package/src/browser/logging.ts +11 -0
  879. package/src/browser/merge-segment-loaders.ts +20 -12
  880. package/src/browser/navigation-bridge.ts +323 -563
  881. package/src/browser/navigation-client.ts +219 -75
  882. package/src/browser/navigation-store-handle.ts +38 -0
  883. package/src/browser/navigation-store.ts +104 -112
  884. package/src/browser/navigation-transaction.ts +247 -0
  885. package/src/browser/network-error-handler.ts +61 -0
  886. package/src/browser/partial-update.ts +328 -348
  887. package/src/browser/prefetch/cache.ts +324 -0
  888. package/src/browser/prefetch/fetch.ts +357 -0
  889. package/src/browser/prefetch/observer.ts +65 -0
  890. package/src/browser/prefetch/policy.ts +48 -0
  891. package/src/browser/prefetch/queue.ts +194 -0
  892. package/src/browser/prefetch/resource-ready.ts +77 -0
  893. package/src/browser/rango-state.ts +194 -0
  894. package/src/browser/react/Link.tsx +253 -71
  895. package/src/browser/react/NavigationProvider.tsx +155 -34
  896. package/src/browser/react/ScrollRestoration.tsx +10 -6
  897. package/src/browser/react/context.ts +11 -0
  898. package/src/browser/react/filter-segment-order.ts +53 -0
  899. package/src/browser/react/index.ts +0 -48
  900. package/src/browser/react/location-state-shared.ts +260 -60
  901. package/src/browser/react/location-state.ts +90 -20
  902. package/src/browser/react/mount-context.ts +6 -1
  903. package/src/browser/react/nonce-context.ts +23 -0
  904. package/src/browser/react/shallow-equal.ts +27 -0
  905. package/src/browser/react/use-action.ts +35 -66
  906. package/src/browser/react/use-handle.ts +39 -126
  907. package/src/browser/react/use-link-status.ts +6 -9
  908. package/src/browser/react/use-navigation.ts +44 -68
  909. package/src/browser/react/use-params.ts +75 -0
  910. package/src/browser/react/use-pathname.ts +47 -0
  911. package/src/browser/react/use-reverse.ts +106 -0
  912. package/src/browser/react/use-router.ts +98 -0
  913. package/src/browser/react/use-search-params.ts +51 -0
  914. package/src/browser/react/use-segments.ts +72 -99
  915. package/src/browser/response-adapter.ts +124 -0
  916. package/src/browser/rsc-router.tsx +290 -72
  917. package/src/browser/scroll-restoration.ts +132 -49
  918. package/src/browser/segment-reconciler.ts +243 -0
  919. package/src/browser/segment-structure-assert.ts +17 -1
  920. package/src/browser/server-action-bridge.ts +621 -613
  921. package/src/browser/types.ts +175 -50
  922. package/src/browser/validate-redirect-origin.ts +56 -0
  923. package/src/build/collect-fallback-refs.ts +107 -0
  924. package/src/build/generate-manifest.ts +123 -56
  925. package/src/build/generate-route-types.ts +41 -1038
  926. package/src/build/index.ts +9 -6
  927. package/src/build/prefix-tree-utils.ts +123 -0
  928. package/src/build/route-trie.ts +165 -34
  929. package/src/build/route-types/ast-helpers.ts +25 -0
  930. package/src/build/route-types/ast-route-extraction.ts +98 -0
  931. package/src/build/route-types/codegen.ts +113 -0
  932. package/src/build/route-types/include-resolution.ts +418 -0
  933. package/src/build/route-types/param-extraction.ts +51 -0
  934. package/src/build/route-types/per-module-writer.ts +131 -0
  935. package/src/build/route-types/router-processing.ts +651 -0
  936. package/src/build/route-types/scan-filter.ts +85 -0
  937. package/src/build/route-types/source-scan.ts +118 -0
  938. package/src/build/runtime-discovery.ts +220 -0
  939. package/src/cache/background-task.ts +34 -0
  940. package/src/cache/cache-error.ts +104 -0
  941. package/src/cache/cache-key-utils.ts +44 -0
  942. package/src/cache/cache-policy.ts +165 -0
  943. package/src/cache/cache-runtime.ts +444 -0
  944. package/src/cache/cache-scope.ts +231 -325
  945. package/src/cache/cache-tag.ts +98 -0
  946. package/src/cache/cf/cf-cache-store.ts +2644 -75
  947. package/src/cache/cf/index.ts +17 -17
  948. package/src/cache/document-cache.ts +172 -92
  949. package/src/cache/handle-capture.ts +81 -0
  950. package/src/cache/handle-snapshot.ts +104 -0
  951. package/src/cache/index.ts +11 -35
  952. package/src/cache/memory-segment-store.ts +307 -30
  953. package/src/cache/profile-registry.ts +49 -0
  954. package/src/cache/read-through-swr.ts +164 -0
  955. package/src/cache/segment-codec.ts +240 -0
  956. package/src/cache/tag-invalidation.ts +230 -0
  957. package/src/cache/taint.ts +153 -0
  958. package/src/cache/types.ts +94 -211
  959. package/src/client.rsc.tsx +8 -21
  960. package/src/client.tsx +123 -347
  961. package/src/cloudflare/index.ts +11 -0
  962. package/src/cloudflare/tracing.ts +109 -0
  963. package/src/component-utils.ts +23 -4
  964. package/src/components/DefaultDocument.tsx +5 -1
  965. package/src/context-var.ts +168 -0
  966. package/src/debug.ts +19 -9
  967. package/src/decode-loader-results.ts +36 -0
  968. package/src/defer.ts +196 -0
  969. package/src/deps/ssr.ts +0 -1
  970. package/src/errors.ts +106 -10
  971. package/src/handle.ts +76 -23
  972. package/src/handles/MetaTags.tsx +73 -34
  973. package/src/handles/breadcrumbs.ts +77 -0
  974. package/src/handles/meta.ts +30 -52
  975. package/src/host/cookie-handler.ts +21 -51
  976. package/src/host/errors.ts +8 -32
  977. package/src/host/index.ts +12 -9
  978. package/src/host/pattern-matcher.ts +34 -77
  979. package/src/host/router.ts +151 -121
  980. package/src/host/testing.ts +45 -32
  981. package/src/host/types.ts +52 -11
  982. package/src/host/utils.ts +2 -2
  983. package/src/href-client.ts +192 -57
  984. package/src/index.rsc.ts +174 -34
  985. package/src/index.ts +241 -73
  986. package/src/internal-debug.ts +8 -4
  987. package/src/loader-store.ts +500 -0
  988. package/src/loader.rsc.ts +31 -99
  989. package/src/loader.ts +30 -12
  990. package/src/missing-id-error.ts +68 -0
  991. package/src/network-error-thrower.tsx +4 -7
  992. package/src/outlet-context.ts +1 -1
  993. package/src/outlet-provider.tsx +41 -0
  994. package/src/prerender/param-hash.ts +14 -13
  995. package/src/prerender/store.ts +121 -21
  996. package/src/prerender.ts +445 -24
  997. package/src/redirect-origin.ts +100 -0
  998. package/src/response-utils.ts +37 -0
  999. package/src/reverse.ts +198 -128
  1000. package/src/root-error-boundary.tsx +42 -48
  1001. package/src/route-content-wrapper.tsx +10 -72
  1002. package/src/route-definition/dsl-helpers.ts +1116 -0
  1003. package/src/route-definition/helper-factories.ts +90 -0
  1004. package/src/route-definition/helpers-types.ts +506 -0
  1005. package/src/route-definition/index.ts +55 -0
  1006. package/src/route-definition/redirect.ts +135 -0
  1007. package/src/route-definition/resolve-handler-use.ts +161 -0
  1008. package/src/route-definition/use-item-types.ts +32 -0
  1009. package/src/route-definition.ts +1 -1450
  1010. package/src/route-map-builder.ts +82 -144
  1011. package/src/route-name.ts +53 -0
  1012. package/src/route-types.ts +72 -41
  1013. package/src/router/basename.ts +14 -0
  1014. package/src/router/content-negotiation.ts +215 -0
  1015. package/src/router/debug-manifest.ts +72 -0
  1016. package/src/router/error-handling.ts +22 -26
  1017. package/src/router/find-match.ts +181 -0
  1018. package/src/router/handler-context.ts +372 -125
  1019. package/src/router/instrument.ts +346 -0
  1020. package/src/router/intercept-resolution.ts +34 -27
  1021. package/src/router/lazy-includes.ts +200 -0
  1022. package/src/router/loader-resolution.ts +381 -147
  1023. package/src/router/logging.ts +106 -6
  1024. package/src/router/manifest.ts +88 -51
  1025. package/src/router/match-api.ts +162 -245
  1026. package/src/router/match-context.ts +4 -24
  1027. package/src/router/match-handlers.ts +440 -0
  1028. package/src/router/match-middleware/background-revalidation.ts +90 -89
  1029. package/src/router/match-middleware/cache-lookup.ts +297 -150
  1030. package/src/router/match-middleware/cache-store.ts +75 -33
  1031. package/src/router/match-middleware/intercept-resolution.ts +44 -43
  1032. package/src/router/match-middleware/segment-resolution.ts +64 -22
  1033. package/src/router/match-pipelines.ts +11 -87
  1034. package/src/router/match-result.ts +121 -50
  1035. package/src/router/metrics.ts +219 -28
  1036. package/src/router/middleware-types.ts +93 -0
  1037. package/src/router/middleware.ts +421 -413
  1038. package/src/router/navigation-snapshot.ts +131 -0
  1039. package/src/router/params-util.ts +23 -0
  1040. package/src/router/pattern-matching.ts +263 -79
  1041. package/src/router/prerender-match.ts +541 -0
  1042. package/src/router/preview-match.ts +100 -0
  1043. package/src/router/request-classification.ts +276 -0
  1044. package/src/router/revalidation.ts +143 -44
  1045. package/src/router/route-snapshot.ts +244 -0
  1046. package/src/router/router-context.ts +41 -47
  1047. package/src/router/router-interfaces.ts +525 -0
  1048. package/src/router/router-options.ts +726 -0
  1049. package/src/router/router-registry.ts +21 -0
  1050. package/src/router/segment-resolution/fresh.ts +747 -0
  1051. package/src/router/segment-resolution/helpers.ts +314 -0
  1052. package/src/router/segment-resolution/loader-cache.ts +207 -0
  1053. package/src/router/segment-resolution/revalidation.ts +1322 -0
  1054. package/src/router/segment-resolution/static-store.ts +81 -0
  1055. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  1056. package/src/router/segment-resolution/view-transition-default.ts +36 -0
  1057. package/src/router/segment-resolution.ts +24 -1354
  1058. package/src/router/segment-wrappers.ts +289 -0
  1059. package/src/router/state-cookie-name.ts +33 -0
  1060. package/src/router/substitute-pattern-params.ts +56 -0
  1061. package/src/router/telemetry-otel.ts +261 -0
  1062. package/src/router/telemetry.ts +377 -0
  1063. package/src/router/timeout.ts +128 -0
  1064. package/src/router/tracing.ts +206 -0
  1065. package/src/router/trie-matching.ts +172 -60
  1066. package/src/router/types.ts +23 -70
  1067. package/src/router/url-params.ts +44 -0
  1068. package/src/router.ts +748 -2376
  1069. package/src/rsc/handler-context.ts +46 -0
  1070. package/src/rsc/handler.ts +861 -1141
  1071. package/src/rsc/helpers.ts +269 -19
  1072. package/src/rsc/index.ts +1 -21
  1073. package/src/rsc/json-route-result.ts +38 -0
  1074. package/src/rsc/loader-fetch.ts +235 -0
  1075. package/src/rsc/manifest-init.ts +77 -0
  1076. package/src/rsc/nonce.ts +14 -0
  1077. package/src/rsc/origin-guard.ts +155 -0
  1078. package/src/rsc/progressive-enhancement.ts +413 -0
  1079. package/src/rsc/redirect-guard.ts +99 -0
  1080. package/src/rsc/response-error.ts +104 -0
  1081. package/src/rsc/response-route-handler.ts +374 -0
  1082. package/src/rsc/rsc-rendering.ts +261 -0
  1083. package/src/rsc/runtime-warnings.ts +55 -0
  1084. package/src/rsc/server-action.ts +376 -0
  1085. package/src/rsc/ssr-setup.ts +144 -0
  1086. package/src/rsc/types.ts +58 -12
  1087. package/src/runtime-env.ts +18 -0
  1088. package/src/search-params.ts +70 -74
  1089. package/src/segment-content-promise.ts +67 -0
  1090. package/src/segment-loader-promise.ts +134 -0
  1091. package/src/segment-system.tsx +292 -134
  1092. package/src/serialize.ts +243 -0
  1093. package/src/server/context.ts +439 -85
  1094. package/src/server/cookie-store.ts +265 -0
  1095. package/src/server/fetchable-loader-store.ts +11 -6
  1096. package/src/server/handle-store.ts +112 -31
  1097. package/src/server/loader-registry.ts +23 -82
  1098. package/src/server/request-context.ts +724 -143
  1099. package/src/server.ts +26 -164
  1100. package/src/ssr/index.tsx +113 -36
  1101. package/src/static-handler.ts +45 -18
  1102. package/src/testing/cache-status.ts +162 -0
  1103. package/src/testing/collect-handle.ts +40 -0
  1104. package/src/testing/dispatch.ts +618 -0
  1105. package/src/testing/dom.entry.ts +22 -0
  1106. package/src/testing/e2e/fixture.ts +188 -0
  1107. package/src/testing/e2e/index.ts +128 -0
  1108. package/src/testing/e2e/matchers.ts +35 -0
  1109. package/src/testing/e2e/page-helpers.ts +272 -0
  1110. package/src/testing/e2e/parity.ts +387 -0
  1111. package/src/testing/e2e/server.ts +195 -0
  1112. package/src/testing/flight-matchers.ts +97 -0
  1113. package/src/testing/flight-normalize.ts +11 -0
  1114. package/src/testing/flight-runtime.d.ts +57 -0
  1115. package/src/testing/flight-tree.ts +682 -0
  1116. package/src/testing/flight.entry.ts +52 -0
  1117. package/src/testing/flight.ts +232 -0
  1118. package/src/testing/generated-routes.ts +183 -0
  1119. package/src/testing/index.ts +99 -0
  1120. package/src/testing/internal/context.ts +348 -0
  1121. package/src/testing/internal/flight-client-globals.ts +30 -0
  1122. package/src/testing/internal/seed-vars.ts +54 -0
  1123. package/src/testing/render-handler.ts +330 -0
  1124. package/src/testing/render-route.tsx +566 -0
  1125. package/src/testing/run-loader.ts +378 -0
  1126. package/src/testing/run-middleware.ts +205 -0
  1127. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  1128. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  1129. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  1130. package/src/testing/vitest-stubs/version.ts +5 -0
  1131. package/src/testing/vitest.ts +305 -0
  1132. package/src/theme/ThemeProvider.tsx +21 -67
  1133. package/src/theme/ThemeScript.tsx +5 -11
  1134. package/src/theme/constants.ts +5 -14
  1135. package/src/theme/index.ts +3 -20
  1136. package/src/theme/theme-context.ts +5 -35
  1137. package/src/theme/theme-script.ts +21 -32
  1138. package/src/theme/use-theme.ts +0 -3
  1139. package/src/types/boundaries.ts +123 -0
  1140. package/src/types/cache-types.ts +207 -0
  1141. package/src/types/error-types.ts +132 -0
  1142. package/src/types/global-namespace.ts +113 -0
  1143. package/src/types/handler-context.ts +839 -0
  1144. package/src/types/index.ts +79 -0
  1145. package/src/types/loader-types.ts +212 -0
  1146. package/src/types/request-scope.ts +107 -0
  1147. package/src/types/route-config.ts +126 -0
  1148. package/src/types/route-entry.ts +114 -0
  1149. package/src/types/segments.ts +171 -0
  1150. package/src/types.ts +1 -1795
  1151. package/src/urls/include-helper.ts +160 -0
  1152. package/src/urls/index.ts +43 -0
  1153. package/src/urls/path-helper-types.ts +386 -0
  1154. package/src/urls/path-helper.ts +275 -0
  1155. package/src/urls/pattern-types.ts +124 -0
  1156. package/src/urls/response-types.ts +109 -0
  1157. package/src/urls/type-extraction.ts +291 -0
  1158. package/src/urls/urls-function.ts +81 -0
  1159. package/src/urls.ts +1 -1323
  1160. package/src/use-loader.tsx +406 -141
  1161. package/src/vite/debug.ts +185 -0
  1162. package/src/vite/discovery/bundle-postprocess.ts +182 -0
  1163. package/src/vite/discovery/discover-routers.ts +389 -0
  1164. package/src/vite/discovery/discovery-errors.ts +194 -0
  1165. package/src/vite/discovery/gate-state.ts +171 -0
  1166. package/src/vite/discovery/prerender-collection.ts +467 -0
  1167. package/src/vite/discovery/route-types-writer.ts +214 -0
  1168. package/src/vite/discovery/self-gen-tracking.ts +73 -0
  1169. package/src/vite/discovery/state.ts +161 -0
  1170. package/src/vite/discovery/virtual-module-codegen.ts +183 -0
  1171. package/src/vite/index.ts +17 -2259
  1172. package/src/vite/plugin-types.ts +221 -0
  1173. package/src/vite/plugins/cjs-to-esm.ts +83 -0
  1174. package/src/vite/plugins/client-ref-dedup.ts +120 -0
  1175. package/src/vite/plugins/client-ref-hashing.ts +118 -0
  1176. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1177. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1178. package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
  1179. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
  1180. package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +13 -87
  1181. package/src/vite/plugins/expose-ids/export-analysis.ts +338 -0
  1182. package/src/vite/plugins/expose-ids/handler-transform.ts +141 -0
  1183. package/src/vite/plugins/expose-ids/loader-transform.ts +57 -0
  1184. package/src/vite/plugins/expose-ids/router-transform.ts +124 -0
  1185. package/src/vite/plugins/expose-ids/types.ts +45 -0
  1186. package/src/vite/plugins/expose-internal-ids.ts +806 -0
  1187. package/src/vite/plugins/performance-tracks.ts +89 -0
  1188. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1189. package/src/vite/plugins/use-cache-transform.ts +313 -0
  1190. package/src/vite/plugins/version-injector.ts +79 -0
  1191. package/src/vite/plugins/version-plugin.ts +275 -0
  1192. package/src/vite/plugins/virtual-entries.ts +108 -0
  1193. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  1194. package/src/vite/rango.ts +444 -0
  1195. package/src/vite/router-discovery.ts +1581 -0
  1196. package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +193 -37
  1197. package/src/vite/utils/banner.ts +36 -0
  1198. package/src/vite/utils/bundle-analysis.ts +132 -0
  1199. package/src/vite/utils/client-chunks.ts +184 -0
  1200. package/src/vite/utils/forward-user-plugins.ts +171 -0
  1201. package/src/vite/utils/manifest-utils.ts +15 -0
  1202. package/src/vite/utils/package-resolution.ts +89 -0
  1203. package/src/vite/utils/prerender-utils.ts +223 -0
  1204. package/src/vite/utils/shared-utils.ts +219 -0
  1205. package/CLAUDE.md +0 -43
  1206. package/src/browser/lru-cache.ts +0 -69
  1207. package/src/browser/request-controller.ts +0 -164
  1208. package/src/browser/shallow.ts +0 -35
  1209. package/src/cache/memory-store.ts +0 -253
  1210. package/src/router.gen.ts +0 -6
  1211. package/src/static-handler.gen.ts +0 -5
  1212. package/src/urls.gen.ts +0 -8
  1213. package/src/vite/expose-internal-ids.ts +0 -1167
  1214. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
@@ -0,0 +1,1116 @@
1
+ import type { ReactNode } from "react";
2
+ import type {
3
+ PartialCacheOptions,
4
+ Handler,
5
+ LoaderDefinition,
6
+ MiddlewareFn,
7
+ ShouldRevalidateFn,
8
+ TransitionConfig,
9
+ } from "../types.js";
10
+ import {
11
+ getContext,
12
+ getNamePrefix,
13
+ getUrlPrefix,
14
+ requireDslContext,
15
+ type EntryData,
16
+ type EntryPropDatas,
17
+ type EntryPropSegments,
18
+ type HelperContext,
19
+ type InterceptEntry,
20
+ } from "../server/context";
21
+ import { invariant } from "../errors";
22
+ import { isCachedFunction } from "../cache/taint.js";
23
+ import { RangoContext } from "../server/context";
24
+ import { isStaticHandler } from "../static-handler.js";
25
+ import RootLayout from "../server/root-layout";
26
+ import type {
27
+ AllUseItems,
28
+ RouteItem,
29
+ ParallelItem,
30
+ InterceptItem,
31
+ MiddlewareItem,
32
+ RevalidateItem,
33
+ LoaderItem,
34
+ LoadingItem,
35
+ ErrorBoundaryItem,
36
+ NotFoundBoundaryItem,
37
+ LayoutItem,
38
+ WhenItem,
39
+ CacheItem,
40
+ TransitionItem,
41
+ UseItems,
42
+ } from "../route-types.js";
43
+ import type { RouteHelpers } from "./helpers-types.js";
44
+ import { resolveHandlerUse, mergeHandlerUse } from "./resolve-handler-use.js";
45
+ import { ALL_USE_ITEM_TYPES } from "./use-item-types.js";
46
+
47
+ /**
48
+ * Check if an item contains routes (directly or inside nested structures like cache).
49
+ * Used to determine if a layout or cache should be treated as an orphan.
50
+ */
51
+ const hasRoutesInItem = (item: AllUseItems): boolean => {
52
+ if (item.type === "route") return true;
53
+ // Lazy includes contain deferred routes — treat them as having routes
54
+ // to prevent the parent layout from being misclassified as orphan,
55
+ // which would clear its parent pointer and break the middleware chain.
56
+ if (item.type === "include") return true;
57
+ if (item.type === "cache" && item.uses) {
58
+ return item.uses.some((child) => hasRoutesInItem(child));
59
+ }
60
+ if (item.type === "layout" && item.uses) {
61
+ return item.uses.some((child) => hasRoutesInItem(child));
62
+ }
63
+ if (item.type === "middleware" && item.uses) {
64
+ return item.uses.some((child) => hasRoutesInItem(child));
65
+ }
66
+ return false;
67
+ };
68
+
69
+ /**
70
+ * Fresh empty collections shared by every from-scratch segment entry. Returns
71
+ * new arrays/objects per call so no two entries share mutable references.
72
+ * mountPath is intentionally NOT included here — each call site adds it from
73
+ * getUrlPrefix() where applicable: the route() and transition() helpers add
74
+ * none, while path() (which also builds a `type: "route"` entry) and the
75
+ * structural helpers (layout/cache/middleware/parallel) do.
76
+ */
77
+ const emptySegmentBase = (): EntryPropDatas &
78
+ EntryPropSegments & { loading: undefined } => ({
79
+ loading: undefined,
80
+ middleware: [],
81
+ revalidate: [],
82
+ errorBoundary: [],
83
+ notFoundBoundary: [],
84
+ layout: [],
85
+ parallel: {},
86
+ intercept: [],
87
+ loader: [],
88
+ });
89
+
90
+ /**
91
+ * Run a children/use callback as a nested scope, flatten the result, and assert
92
+ * every item is a valid use item. `kind` preserves the existing error wording
93
+ * ("use()" vs "children" callback).
94
+ */
95
+ function runAndValidateUseItems(
96
+ store: ReturnType<typeof getContext>,
97
+ namespace: string,
98
+ entry: EntryData,
99
+ cb: () => any,
100
+ label: string,
101
+ kind: "use" | "children",
102
+ ): AllUseItems[] {
103
+ const result = store.run(namespace, entry, cb)?.flat(3);
104
+ return validateUseItems(result, namespace, label, kind);
105
+ }
106
+
107
+ /** Assert an already-invoked, flattened callback result is a use-item array. */
108
+ function validateUseItems(
109
+ result: any,
110
+ namespace: string,
111
+ label: string,
112
+ kind: "use" | "children",
113
+ ): AllUseItems[] {
114
+ invariant(
115
+ Array.isArray(result) && result.every((item) => isValidUseItem(item)),
116
+ `${label}() ${kind === "use" ? "use()" : "children"} callback must return an array of use items [${namespace}]`,
117
+ );
118
+ return result as AllUseItems[];
119
+ }
120
+
121
+ /** True when a children/use result contains no routes (directly or nested). */
122
+ const isOrphan = (result: AllUseItems[]): boolean =>
123
+ !result.some((item) => item != null && hasRoutesInItem(item));
124
+
125
+ /**
126
+ * Register a routeless structural entry as an orphan sibling: clear its parent
127
+ * pointer so it leaves the middleware/parent-pointer chain (LOAD-BEARING — see
128
+ * docs/tree-structure.md) and push it onto the parent's layout[] so it renders
129
+ * as a wrapper. Used by cache()/middleware()/transition(); layout() runs extra
130
+ * validation and registers inline.
131
+ */
132
+ const attachOrphanSibling = (
133
+ parent: EntryData | null,
134
+ entry: EntryData,
135
+ ): void => {
136
+ entry.parent = null;
137
+ if (parent && "layout" in parent) parent.layout.push(entry);
138
+ };
139
+
140
+ /**
141
+ * Run `fn` with `ctx.parent` temporarily redirected to `temp` — a satellite
142
+ * entry that captures the attachments declared by a use() callback — restoring
143
+ * the original parent afterward, including on throw. loader()/intercept() each
144
+ * build their own tempParent shape (intercept keeps a loading get/set accessor
145
+ * and a captured-layouts array); this only centralizes the save/restore.
146
+ */
147
+ function withParent<T>(ctx: HelperContext, temp: EntryData, fn: () => T): T {
148
+ const original = ctx.parent;
149
+ ctx.parent = temp;
150
+ try {
151
+ return fn();
152
+ } finally {
153
+ ctx.parent = original;
154
+ }
155
+ }
156
+
157
+ const revalidate: RouteHelpers<any, any>["revalidate"] = (fn) => {
158
+ const { store, ctx } = requireDslContext(
159
+ "revalidate() must be called inside urls()",
160
+ );
161
+
162
+ // Attach to last entry in stack
163
+ const parent = ctx.parent;
164
+ if (!parent || !("revalidate" in parent)) {
165
+ invariant(false, "No parent entry available for revalidate()");
166
+ }
167
+ const name = `$${store.getNextIndex("revalidate")}`;
168
+ parent.revalidate.push(fn);
169
+ return { name, type: "revalidate" } as RevalidateItem;
170
+ };
171
+
172
+ /**
173
+ * Error boundary helper - attaches an error fallback to the current entry
174
+ *
175
+ * When an error occurs during rendering of this segment or its children,
176
+ * the fallback will be rendered instead. The fallback can be:
177
+ * - A static ReactNode (e.g., <ErrorPage />)
178
+ * - A handler function that receives error info and reset function
179
+ *
180
+ * Error boundaries catch errors from:
181
+ * - Middleware execution
182
+ * - Loader execution
183
+ * - Handler/component rendering
184
+ *
185
+ * @example
186
+ * ```typescript
187
+ * layout(<ShopLayout />, () => [
188
+ * errorBoundary(<ShopErrorFallback />),
189
+ * route("products.detail", ProductDetail),
190
+ * ])
191
+ *
192
+ * // Or with handler for dynamic error UI:
193
+ * route("products.detail", ProductDetail, () => [
194
+ * errorBoundary(({ error, reset }) => (
195
+ * <div>
196
+ * <h2>Product failed to load</h2>
197
+ * <p>{error.message}</p>
198
+ * <button onClick={reset}>Retry</button>
199
+ * </div>
200
+ * )),
201
+ * ])
202
+ * ```
203
+ */
204
+ const errorBoundary: RouteHelpers<any, any>["errorBoundary"] = (fallback) => {
205
+ const { store, ctx } = requireDslContext(
206
+ "errorBoundary() must be called inside urls()",
207
+ );
208
+
209
+ // Attach to parent entry in stack
210
+ const parent = ctx.parent;
211
+ if (!parent || !("errorBoundary" in parent)) {
212
+ invariant(false, "No parent entry available for errorBoundary()");
213
+ }
214
+ const name = `$${store.getNextIndex("errorBoundary")}`;
215
+ parent.errorBoundary.push(fallback);
216
+ return { name, type: "errorBoundary" } as ErrorBoundaryItem;
217
+ };
218
+
219
+ /**
220
+ * NotFound boundary helper - attaches a not-found fallback to the current entry
221
+ *
222
+ * When a DataNotFoundError is thrown (via notFound()) during rendering of this
223
+ * segment or its children, the fallback will be rendered instead. The fallback can be:
224
+ * - A static ReactNode (e.g., <ProductNotFound />)
225
+ * - A handler function that receives not found info
226
+ *
227
+ * NotFound boundaries catch DataNotFoundError from:
228
+ * - Loader execution
229
+ * - Handler/component rendering
230
+ *
231
+ * @example
232
+ * ```typescript
233
+ * layout(<ShopLayout />, () => [
234
+ * notFoundBoundary(<ProductNotFound />),
235
+ * route("products.detail", ProductDetail),
236
+ * ])
237
+ *
238
+ * // Or with handler for dynamic not found UI:
239
+ * route("products.detail", ProductDetail, () => [
240
+ * notFoundBoundary(({ notFound }) => (
241
+ * <div>
242
+ * <h2>Product not found</h2>
243
+ * <p>{notFound.message}</p>
244
+ * <a href="/products">Browse all products</a>
245
+ * </div>
246
+ * )),
247
+ * ])
248
+ * ```
249
+ */
250
+ const notFoundBoundary: RouteHelpers<any, any>["notFoundBoundary"] = (
251
+ fallback,
252
+ ) => {
253
+ const { store, ctx } = requireDslContext(
254
+ "notFoundBoundary() must be called inside urls()",
255
+ );
256
+
257
+ // Attach to parent entry in stack
258
+ const parent = ctx.parent;
259
+ if (!parent || !("notFoundBoundary" in parent)) {
260
+ invariant(false, "No parent entry available for notFoundBoundary()");
261
+ }
262
+ const name = `$${store.getNextIndex("notFoundBoundary")}`;
263
+ parent.notFoundBoundary.push(fallback);
264
+ return { name, type: "notFoundBoundary" } as NotFoundBoundaryItem;
265
+ };
266
+
267
+ /**
268
+ * When helper - defines a condition for intercept activation
269
+ *
270
+ * Only valid inside intercept() use() callback. The when() function
271
+ * is captured by the intercept and stored in its `when` array.
272
+ * During soft navigation, all when() conditions must return true
273
+ * for the intercept to activate.
274
+ */
275
+ const when: RouteHelpers<any, any>["when"] = (fn) => {
276
+ const { store, ctx } = requireDslContext(
277
+ "when() must be called inside intercept()",
278
+ );
279
+
280
+ // The when() function needs to be captured by the intercept's tempParent
281
+ // which should have a `when` array. If not present, we're not inside intercept()
282
+ const parent = ctx.parent as any;
283
+ if (!parent || !("when" in parent)) {
284
+ invariant(
285
+ false,
286
+ "when() can only be used inside intercept() use() callback",
287
+ );
288
+ }
289
+
290
+ const name = `$${store.getNextIndex("when")}`;
291
+ parent.when.push(fn);
292
+ return { name, type: "when" } as WhenItem;
293
+ };
294
+
295
+ /**
296
+ * Cache helper - defines caching configuration for segments
297
+ *
298
+ * Creates a cache boundary that applies to all children unless overridden.
299
+ * When used without children, attaches cache config to the parent entry
300
+ * (e.g., for loader-specific caching).
301
+ *
302
+ * Supports these call signatures:
303
+ * - cache() - no args, uses app-level defaults (for loader caching)
304
+ * - cache(() => [...]) - wraps children with app-level defaults
305
+ * - cache({ ttl: 60 }, () => [...]) - with explicit options
306
+ *
307
+ * Named cache profiles are applied via the `"use cache: <profile>"` directive,
308
+ * not a `cache("profileName")` form in the route tree.
309
+ */
310
+ const cache: RouteHelpers<any, any>["cache"] = (
311
+ optionsOrChildren?:
312
+ | PartialCacheOptions
313
+ | false
314
+ | (() => UseItems<AllUseItems>),
315
+ maybeChildren?: () => UseItems<AllUseItems>,
316
+ ) => {
317
+ const { store, ctx } = requireDslContext(
318
+ "cache() must be called inside urls()",
319
+ );
320
+
321
+ // Handle overloaded signature
322
+ let options: PartialCacheOptions | false;
323
+ let children: (() => UseItems<AllUseItems>) | undefined;
324
+
325
+ if (optionsOrChildren === undefined) {
326
+ // cache() - no args, use defaults
327
+ options = {};
328
+ children = undefined;
329
+ } else if (typeof optionsOrChildren === "function") {
330
+ // cache(() => [...]) - use empty options (will use defaults)
331
+ options = {};
332
+ children = optionsOrChildren;
333
+ } else {
334
+ // cache(options, children) - explicit options
335
+ options = optionsOrChildren;
336
+ children = maybeChildren;
337
+ }
338
+
339
+ // Allocate a single index for this cache() call (used in all paths)
340
+ const cacheIndex = store.getNextIndex("cache");
341
+ const name = `$${cacheIndex}`;
342
+ const cacheConfig = { options };
343
+
344
+ // If no children, create an orphan cache entry (like orphan layouts)
345
+ // This allows cache() to wrap subsequent siblings
346
+ if (!children) {
347
+ const parent = ctx.parent as any;
348
+
349
+ // Check if we're inside a loader() use() callback - special case for loader caching
350
+ if (parent && parent.type === "loader") {
351
+ // Direct assignment to loader entry's cache field
352
+ parent.cache = cacheConfig;
353
+ return { name, type: "cache" } as CacheItem;
354
+ }
355
+
356
+ // Create orphan cache entry (like orphan layout)
357
+ // Subsequent siblings in the same array will attach to this entry
358
+ const namespace = `${ctx.namespace}.${cacheIndex}`;
359
+ const urlPrefix = getUrlPrefix();
360
+
361
+ const entry = {
362
+ ...emptySegmentBase(),
363
+ id: namespace,
364
+ shortCode: store.getShortCode("cache"),
365
+ type: "cache",
366
+ parent: parent, // link to current parent for hierarchy
367
+ cache: cacheConfig,
368
+ handler: RootLayout,
369
+ ...(urlPrefix ? { mountPath: urlPrefix } : {}),
370
+ } satisfies EntryData;
371
+
372
+ // Attach to parent's layout array (cache entries are structural like layouts)
373
+ if (parent && "layout" in parent) {
374
+ parent.layout.push(entry);
375
+ }
376
+
377
+ // Update context parent so subsequent siblings attach to this cache entry
378
+ // This makes cache() act as sugar for cache(() => [...])
379
+ ctx.parent = entry;
380
+
381
+ return { name: namespace, type: "cache" } as CacheItem;
382
+ }
383
+
384
+ // Inside a loader() use() callback, only the direct form — cache()/cache(opts)
385
+ // — writes cache config to the loader entry. The wrapper form creates a
386
+ // structural cache boundary with its own children scope, which has no effect
387
+ // on the loader and would silently no-op.
388
+ invariant(
389
+ !(ctx.parent && (ctx.parent as any).type === "loader"),
390
+ "cache() wrapper form is not valid inside loader() use(). Use cache({...}) without children to configure the loader's cache.",
391
+ );
392
+
393
+ // With children: create a cache entry (like layout with caching semantics)
394
+ const namespace = `${ctx.namespace}.${cacheIndex}`;
395
+ const cacheShortCode = store.getShortCode("cache");
396
+
397
+ const urlPrefix = getUrlPrefix();
398
+
399
+ const entry = {
400
+ ...emptySegmentBase(),
401
+ id: namespace,
402
+ shortCode: cacheShortCode,
403
+ type: "cache",
404
+ parent: ctx.parent,
405
+ cache: cacheConfig,
406
+ // Cache entries render like layouts (with Outlet as default handler)
407
+ handler: RootLayout, // RootLayout just renders <Outlet />
408
+ ...(urlPrefix ? { mountPath: urlPrefix } : {}),
409
+ } satisfies EntryData;
410
+
411
+ // Run children with cache entry as parent
412
+ const result = runAndValidateUseItems(
413
+ store,
414
+ namespace,
415
+ entry,
416
+ children,
417
+ "cache",
418
+ "children",
419
+ );
420
+
421
+ // Cache entries are structural like layouts: with no routes inside, register
422
+ // as an orphan sibling.
423
+ if (isOrphan(result)) attachOrphanSibling(ctx.parent, entry);
424
+
425
+ return { name: namespace, type: "cache", uses: result } as CacheItem;
426
+ };
427
+
428
+ const middleware: RouteHelpers<any, any>["middleware"] = (...args: any[]) => {
429
+ // Four call forms:
430
+ // middleware(fn) — single fn, sibling
431
+ // middleware(fn, () => [...]) — single fn, wrapping
432
+ // middleware([fn1, fn2]) — array, sibling
433
+ // middleware([fn1, fn2], () => [...]) — array, wrapping
434
+ const isArray = Array.isArray(args[0]);
435
+
436
+ // Reject the removed variadic form before executing anything.
437
+ // middleware(fn1, fn2, fn3) — 3+ args, always wrong.
438
+ // middleware(fn1, fn2) where fn2 is a middleware fn (length >= 1), not a
439
+ // children callback (length === 0) — legacy two-fn form, reject early.
440
+ if (
441
+ args.length > 2 ||
442
+ (!isArray &&
443
+ args.length === 2 &&
444
+ typeof args[1] === "function" &&
445
+ args[1].length > 0)
446
+ ) {
447
+ throw new Error(
448
+ "middleware() no longer accepts variadic arguments. " +
449
+ "Use middleware([fn1, fn2, ...]) instead of middleware(fn1, fn2, ...).",
450
+ );
451
+ }
452
+
453
+ const fns: MiddlewareFn<any>[] = isArray ? args[0] : [args[0]];
454
+ const children: (() => any[]) | undefined =
455
+ typeof args[1] === "function" ? args[1] : undefined;
456
+
457
+ // Prevent "use cache" functions from being used as middleware.
458
+ for (const f of fns) {
459
+ if (isCachedFunction(f)) {
460
+ throw new Error(
461
+ `A "use cache" function cannot be used as middleware. ` +
462
+ `Cached functions return data and do not participate in the ` +
463
+ `middleware chain. Remove the "use cache" directive or use a ` +
464
+ `regular middleware function instead.`,
465
+ );
466
+ }
467
+ }
468
+
469
+ const { store, ctx } = requireDslContext(
470
+ "middleware() must be called inside urls()",
471
+ );
472
+
473
+ if (!children) {
474
+ // Sibling mode: attach to parent entry
475
+ const parent = ctx.parent;
476
+ if (!parent || !("middleware" in parent)) {
477
+ invariant(false, "No parent entry available for middleware()");
478
+ }
479
+ const name = `$${store.getNextIndex("middleware")}`;
480
+ parent.middleware.push(...fns);
481
+ return { name, type: "middleware" } as MiddlewareItem;
482
+ }
483
+
484
+ // Wrapping mode: create a transparent layout that carries the middleware
485
+ const mwIndex = store.getNextIndex("middleware");
486
+ const namespace = `${ctx.namespace}.${mwIndex}`;
487
+
488
+ const urlPrefix = getUrlPrefix();
489
+ const entry = {
490
+ ...emptySegmentBase(),
491
+ id: namespace,
492
+ shortCode: store.getShortCode("layout"),
493
+ type: "layout",
494
+ parent: ctx.parent,
495
+ handler: RootLayout,
496
+ middleware: [...fns],
497
+ ...(urlPrefix ? { mountPath: urlPrefix } : {}),
498
+ } satisfies EntryData;
499
+
500
+ // Run children callback. If the second arg was actually a middleware fn
501
+ // (old variadic form: middleware(mw1, mw2)), this will return a non-array
502
+ // and the invariant below gives a clear migration error.
503
+ const rawResult = store.run(namespace, entry, children);
504
+
505
+ invariant(
506
+ Array.isArray(rawResult),
507
+ "middleware(fn, children) expects the second argument to return an array of use items. " +
508
+ "To pass multiple middleware, use middleware([fn1, fn2]).",
509
+ );
510
+
511
+ const result = validateUseItems(
512
+ rawResult.flat(3),
513
+ namespace,
514
+ "middleware",
515
+ "children",
516
+ );
517
+
518
+ if (isOrphan(result)) attachOrphanSibling(ctx.parent, entry);
519
+
520
+ return {
521
+ name: namespace,
522
+ type: "middleware",
523
+ uses: result,
524
+ } as MiddlewareItem;
525
+ };
526
+
527
+ // Slot names become part of segment ids: a parallel/intercept slot is encoded
528
+ // as `${shortCode}.${slotName}`, and loader segments append `D${index}.${loaderId}`.
529
+ // A "." in the slot name collides with that separator -- loaderParentId
530
+ // (segment-system.tsx) strips from the FIRST `D<index>.`, so a name like
531
+ // "@D3.foo" is mis-cut to "@" and the loader's data is silently dropped. Reject
532
+ // the dot at definition time so the failure is loud, not a corrupted tree at
533
+ // runtime. (A bare "D" without a trailing dot -- e.g. "@Detail" -- is fine.)
534
+ function assertValidSlotName(slotName: string): void {
535
+ invariant(
536
+ !slotName.includes("."),
537
+ `Slot name "${slotName}" must not contain ".". The dot is a reserved ` +
538
+ `segment-id separator; a name like "@D3.foo" corrupts loader segment-id ` +
539
+ `parsing and silently drops the loader's data. Rename the slot.`,
540
+ );
541
+ }
542
+
543
+ const parallel: RouteHelpers<any, any>["parallel"] = (slots, use) => {
544
+ const { store, ctx } = requireDslContext(
545
+ "parallel() must be called inside urls()",
546
+ );
547
+
548
+ if (!ctx.parent || !ctx.parent?.parallel) {
549
+ invariant(false, "No parent entry available for parallel()");
550
+ }
551
+
552
+ invariant(
553
+ ctx.parent.type !== "parallel",
554
+ "parallel() cannot be nested inside another parallel()",
555
+ );
556
+
557
+ const slotNames = Object.keys(slots as Record<string, any>) as `@${string}`[];
558
+ for (const slotName of slotNames) assertValidSlotName(slotName);
559
+
560
+ const namespace = `${ctx.namespace}.$${store.getNextIndex("parallel")}`;
561
+
562
+ // Unwrap slot values. A slot value can be:
563
+ // - a Handler / ReactNode (legacy form)
564
+ // - a Static() definition (build-time only)
565
+ // - a slot descriptor `{ handler, use? }` for slot-local overrides
566
+ // The descriptor's `use` runs after the broadcast `use` for that slot,
567
+ // so single-assignment items like `loading()` placed there win without
568
+ // affecting siblings.
569
+ const unwrappedSlots: Record<string, any> = {};
570
+ const slotLocalUses: Record<string, (() => any[]) | undefined> = {};
571
+ let hasStaticSlot = false;
572
+ const staticSlotIds: Record<string, string> = {};
573
+ for (const [slotName, rawSlot] of Object.entries(
574
+ slots as Record<string, any>,
575
+ )) {
576
+ let slotHandler: any = rawSlot;
577
+ if (isSlotDescriptor(rawSlot)) {
578
+ slotHandler = rawSlot.handler;
579
+ slotLocalUses[slotName] = rawSlot.use;
580
+ }
581
+ if (isStaticHandler(slotHandler)) {
582
+ hasStaticSlot = true;
583
+ unwrappedSlots[slotName] = slotHandler.handler;
584
+ if (slotHandler.$$id) {
585
+ staticSlotIds[slotName] = slotHandler.$$id;
586
+ // Capture namespace prefix for build-time reverse() resolution
587
+ if (ctx.namePrefix) {
588
+ (slotHandler as any).$$routePrefix = ctx.namePrefix;
589
+ }
590
+ }
591
+ } else {
592
+ unwrappedSlots[slotName] = slotHandler;
593
+ }
594
+ }
595
+
596
+ // Create full EntryData for parallel with its own loaders/revalidate/loading
597
+ const parallelUrlPrefix = getUrlPrefix();
598
+ const entry = {
599
+ ...emptySegmentBase(),
600
+ id: namespace,
601
+ shortCode: store.getShortCode("parallel"),
602
+ type: "parallel",
603
+ parent: null, // Parallels don't participate in parent chain traversal
604
+ handler: unwrappedSlots,
605
+ ...(parallelUrlPrefix ? { mountPath: parallelUrlPrefix } : {}),
606
+ ...(hasStaticSlot
607
+ ? {
608
+ isStaticPrerender: true as const,
609
+ ...(Object.keys(staticSlotIds).length > 0
610
+ ? { staticHandlerIds: staticSlotIds }
611
+ : {}),
612
+ }
613
+ : {}),
614
+ } satisfies EntryData;
615
+
616
+ for (const slotName of slotNames) {
617
+ const slotEntry = {
618
+ ...entry,
619
+ handler: { [slotName]: unwrappedSlots[slotName]! },
620
+ middleware: [...entry.middleware],
621
+ revalidate: [...entry.revalidate],
622
+ errorBoundary: [...entry.errorBoundary],
623
+ notFoundBoundary: [...entry.notFoundBoundary],
624
+ layout: [...entry.layout],
625
+ parallel: { ...entry.parallel },
626
+ intercept: [...entry.intercept],
627
+ loader: [...entry.loader],
628
+ ...(entry.staticHandlerIds?.[slotName]
629
+ ? {
630
+ isStaticPrerender: true as const,
631
+ staticHandlerIds: { [slotName]: entry.staticHandlerIds[slotName]! },
632
+ }
633
+ : {
634
+ isStaticPrerender: undefined,
635
+ staticHandlerIds: undefined,
636
+ }),
637
+ } satisfies EntryData;
638
+
639
+ // Per-slot merge order (narrowest-scope-wins for single-assignment items
640
+ // like loading()):
641
+ // 1. handler.use — defaults baked into the handler
642
+ // 2. shared `use` — broadcast at the parallel() call site
643
+ // 3. slot-local `use` — per-slot override via `{ handler, use }` descriptor
644
+ // Items that accumulate (loader, middleware, revalidate, …) compose
645
+ // across all three layers regardless of order.
646
+ const rawSlot = (slots as Record<string, any>)[slotName];
647
+ const slotHandlerForUse = isSlotDescriptor(rawSlot)
648
+ ? rawSlot.handler
649
+ : rawSlot;
650
+ const slotHandlerUse = resolveHandlerUse(slotHandlerForUse);
651
+ const slotLocalUse = slotLocalUses[slotName];
652
+ const explicitUse = combineExplicitUses(use, slotLocalUse);
653
+ const slotMergedUse = mergeHandlerUse(
654
+ slotHandlerUse,
655
+ explicitUse,
656
+ "parallel",
657
+ );
658
+ if (slotMergedUse) {
659
+ runAndValidateUseItems(
660
+ store,
661
+ namespace,
662
+ slotEntry,
663
+ slotMergedUse,
664
+ "parallel",
665
+ "use",
666
+ );
667
+ }
668
+
669
+ ctx.parent.parallel[slotName] = slotEntry;
670
+ }
671
+ return { name: namespace, type: "parallel" } as ParallelItem;
672
+ };
673
+
674
+ function isSlotDescriptor(
675
+ value: unknown,
676
+ ): value is { handler: unknown; use?: () => any[] } {
677
+ return (
678
+ typeof value === "object" &&
679
+ value !== null &&
680
+ !("__brand" in value) &&
681
+ "handler" in value &&
682
+ typeof (value as any).handler !== "undefined"
683
+ );
684
+ }
685
+
686
+ function combineExplicitUses(
687
+ sharedUse: (() => any[]) | undefined,
688
+ slotLocalUse: (() => any[]) | undefined,
689
+ ): (() => any[]) | undefined {
690
+ if (!sharedUse && !slotLocalUse) return undefined;
691
+ if (!slotLocalUse) return sharedUse;
692
+ if (!sharedUse) return slotLocalUse;
693
+ return () => [...sharedUse(), ...slotLocalUse()];
694
+ }
695
+
696
+ /**
697
+ * Intercept helper - defines an intercepting route for soft navigation
698
+ */
699
+ const intercept = (
700
+ slotName: `@${string}`,
701
+ routeName: string,
702
+ handler: any,
703
+ use?: () => any[],
704
+ ) => {
705
+ const { store, ctx } = requireDslContext(
706
+ "intercept() must be called inside urls()",
707
+ );
708
+
709
+ if (!ctx.parent || !ctx.parent?.intercept) {
710
+ invariant(false, "No parent entry available for intercept()");
711
+ }
712
+
713
+ invariant(
714
+ ctx.parent.type !== "parallel",
715
+ "intercept() cannot be used inside parallel()",
716
+ );
717
+
718
+ assertValidSlotName(slotName);
719
+
720
+ const namespace = `${ctx.namespace}.$${store.getNextIndex("intercept")}.${slotName}`;
721
+
722
+ // Dot-prefixed = local (add include prefix), unprefixed = global (use as-is)
723
+ const isLocal = typeof routeName === "string" && routeName.startsWith(".");
724
+ const bareRouteName = isLocal ? routeName.slice(1) : routeName;
725
+ const namePrefix = getNamePrefix();
726
+ const prefixedRouteName =
727
+ isLocal && namePrefix ? `${namePrefix}.${bareRouteName}` : bareRouteName;
728
+
729
+ // Create intercept entry with its own loaders/revalidate/middleware/when
730
+ const entry: InterceptEntry = {
731
+ slotName: slotName as `@${string}`,
732
+ routeName: prefixedRouteName,
733
+ handler,
734
+ middleware: [],
735
+ revalidate: [],
736
+ errorBoundary: [],
737
+ notFoundBoundary: [],
738
+ loader: [],
739
+ when: [], // Selector conditions for conditional interception
740
+ };
741
+
742
+ // Merge handler.use defaults with explicit use
743
+ const handlerUseFn = resolveHandlerUse(handler);
744
+ const mergedUse = mergeHandlerUse(handlerUseFn, use, "intercept");
745
+
746
+ // Run merged use callback to collect loaders, revalidate, middleware, etc.
747
+ if (mergedUse) {
748
+ // Capture layout() calls into a temporary array
749
+ const capturedLayouts: EntryData[] = [];
750
+
751
+ // Temporary parent so middleware/loader/revalidate/when attach to the
752
+ // intercept entry; the loading get/set accessor mirrors writes onto `entry`.
753
+ const tempParent = {
754
+ ...ctx.parent,
755
+ middleware: entry.middleware,
756
+ revalidate: entry.revalidate,
757
+ errorBoundary: entry.errorBoundary,
758
+ notFoundBoundary: entry.notFoundBoundary,
759
+ loader: entry.loader,
760
+ layout: capturedLayouts, // Capture layout() calls
761
+ when: entry.when, // Capture when() conditions
762
+ get loading() {
763
+ return entry.loading;
764
+ },
765
+ set loading(value: ReactNode | false | undefined) {
766
+ entry.loading = value;
767
+ },
768
+ };
769
+
770
+ const result = withParent(ctx, tempParent as EntryData, () =>
771
+ mergedUse()?.flat(3),
772
+ );
773
+
774
+ // Extract layout from captured layouts (use first one if multiple)
775
+ // Layout inside intercept should always be ReactNode or Handler, not Record slots
776
+ if (capturedLayouts.length > 0 && capturedLayouts[0].type === "layout") {
777
+ entry.layout = capturedLayouts[0].handler as
778
+ | ReactNode
779
+ | Handler<any, any, any>;
780
+ }
781
+
782
+ validateUseItems(result, namespace, "intercept", "use");
783
+ }
784
+
785
+ ctx.parent.intercept.push(entry);
786
+ return { name: namespace, type: "intercept" } as InterceptItem;
787
+ };
788
+
789
+ /**
790
+ * Loader helper - attaches a loader to the current entry
791
+ */
792
+ const loader: RouteHelpers<any, any>["loader"] = (loaderDef, use) => {
793
+ const { store, ctx } = requireDslContext(
794
+ "loader() must be called inside urls()",
795
+ );
796
+
797
+ // Attach to last entry in stack
798
+ if (!ctx.parent || !ctx.parent?.loader) {
799
+ invariant(false, "No parent entry available for loader()");
800
+ }
801
+
802
+ const name = `${ctx.namespace}.$${store.getNextIndex("loader")}`;
803
+
804
+ // Create loader entry with empty revalidate array
805
+ const loaderEntry = {
806
+ loader: loaderDef,
807
+ revalidate: [] as ShouldRevalidateFn<any, any>[],
808
+ };
809
+
810
+ // Merge handler.use defaults (attached to the loader definition) with explicit use
811
+ const handlerUseFn = resolveHandlerUse(loaderDef);
812
+ const mergedUse = mergeHandlerUse(handlerUseFn, use, "loader");
813
+
814
+ // If any use callback is in effect, run it to collect revalidation rules and cache config
815
+ if (mergedUse) {
816
+ // Create a temporary "parent" with type "loader" so cache() can detect it.
817
+ // Save existing .cache to distinguish inherited config from newly set config.
818
+ const parentCache = (ctx.parent as any).cache;
819
+ const tempParent = {
820
+ ...ctx.parent,
821
+ type: "loader",
822
+ revalidate: loaderEntry.revalidate,
823
+ };
824
+
825
+ const result = withParent(ctx, tempParent as EntryData, () =>
826
+ mergedUse()?.flat(3),
827
+ );
828
+
829
+ // Copy cache config only if cache() was called during the use() callback.
830
+ // The spread may carry an inherited .cache from a parent cache() boundary —
831
+ // only copy if it was newly set.
832
+ if (
833
+ (tempParent as any).cache &&
834
+ (tempParent as any).cache !== parentCache
835
+ ) {
836
+ (loaderEntry as any).cache = (tempParent as any).cache;
837
+ }
838
+
839
+ validateUseItems(result, name, "loader", "use");
840
+ }
841
+
842
+ ctx.parent.loader.push(loaderEntry);
843
+ return { name, type: "loader" } as LoaderItem;
844
+ };
845
+
846
+ /**
847
+ * Loading helper - attaches a loading component to the current entry
848
+ * Loading components are static (no context) and shown during navigation
849
+ */
850
+ const loading: RouteHelpers<any, any>["loading"] = (component, options) => {
851
+ const { store, ctx } = requireDslContext(
852
+ "loading() must be called inside urls()",
853
+ );
854
+
855
+ const parent = ctx.parent;
856
+ if (!parent || !("loading" in parent)) {
857
+ invariant(false, "No parent entry available for loading()");
858
+ }
859
+
860
+ // Unwrap function form: loading(() => <Skeleton />) → loading(<Skeleton />)
861
+ const resolved =
862
+ typeof component === "function" ? (component as () => any)() : component;
863
+
864
+ // If ssr: false and we're in SSR, set loading to false
865
+ if (options?.ssr === false && ctx.isSSR) {
866
+ parent.loading = false;
867
+ } else {
868
+ parent.loading = resolved;
869
+ }
870
+
871
+ const name = `$${store.getNextIndex("loading")}`;
872
+ return { name, type: "loading" } as LoadingItem;
873
+ };
874
+
875
+ /**
876
+ * Transition helper - opts the entry (or a wrapped group of routes) into
877
+ * transition-driven navigation by attaching a TransitionConfig. This drives the
878
+ * commit through startTransition (content hold on all React versions) and, on
879
+ * experimental React, places a `<ViewTransition>` boundary unless
880
+ * `viewTransition: false`. See skills/view-transitions for the matrix.
881
+ */
882
+ const transition = (
883
+ configOrChildren?: TransitionConfig | (() => UseItems<AllUseItems>),
884
+ maybeChildren?: () => UseItems<AllUseItems>,
885
+ ): TransitionItem => {
886
+ // Resolve overloaded arguments:
887
+ // transition() -> config={}, children=undefined
888
+ // transition(config) -> config=config, children=undefined
889
+ // transition(children) -> config={}, children=children
890
+ // transition(config, children) -> config=config, children=children
891
+ const config: TransitionConfig =
892
+ typeof configOrChildren === "function" ? {} : (configOrChildren ?? {});
893
+ const children: (() => UseItems<AllUseItems>) | undefined =
894
+ typeof configOrChildren === "function" ? configOrChildren : maybeChildren;
895
+
896
+ const { store, ctx } = requireDslContext(
897
+ "transition() must be called inside urls()",
898
+ );
899
+
900
+ const name = `$${store.getNextIndex("transition")}`;
901
+
902
+ if (!children) {
903
+ // Position 1: child of path() — attach to parent entry
904
+ const parent = ctx.parent;
905
+ if (!parent || !("loading" in parent)) {
906
+ invariant(false, "No parent entry available for transition()");
907
+ }
908
+ parent.transition = config;
909
+ return { name, type: "transition" } as TransitionItem;
910
+ }
911
+
912
+ // Position 2: wrapper — create a transparent layout with transition config
913
+ const namespace = `${ctx.namespace}.${store.getNextIndex("transition")}`;
914
+ const entry = {
915
+ ...emptySegmentBase(),
916
+ id: namespace,
917
+ shortCode: store.getShortCode("layout"),
918
+ type: "layout",
919
+ parent: ctx.parent,
920
+ handler: RootLayout,
921
+ transition: config,
922
+ } satisfies EntryData;
923
+
924
+ const result = runAndValidateUseItems(
925
+ store,
926
+ namespace,
927
+ entry,
928
+ children,
929
+ "transition",
930
+ "children",
931
+ );
932
+
933
+ if (isOrphan(result)) attachOrphanSibling(ctx.parent, entry);
934
+
935
+ return { name: namespace, type: "transition" } as TransitionItem;
936
+ };
937
+
938
+ const route: RouteHelpers<any, any>["route"] = (name, handler, use) => {
939
+ const { store, ctx } = requireDslContext(
940
+ "route() must be called inside urls()",
941
+ );
942
+
943
+ const namespace = `${ctx.namespace}.${store.getNextIndex("route")}.${name}`;
944
+
945
+ const entry = {
946
+ ...emptySegmentBase(),
947
+ id: namespace,
948
+ shortCode: store.getShortCode("route"),
949
+ type: "route",
950
+ parent: ctx.parent,
951
+ handler: handler as unknown as Handler<any, any, any>,
952
+ } satisfies EntryData;
953
+
954
+ /* We will throw if user is registring same route name twice */
955
+ invariant(
956
+ ctx.manifest.get(name) === undefined,
957
+ `Duplicate route name: ${name} at ${namespace}`,
958
+ );
959
+ /* Register route entry */
960
+ ctx.manifest.set(name, entry);
961
+ /* Merge handler.use defaults with explicit use */
962
+ const handlerUseFn = resolveHandlerUse(handler);
963
+ const mergedUse = mergeHandlerUse(handlerUseFn, use, "route");
964
+ /* Run use and attach handlers */
965
+ if (mergedUse) {
966
+ const result = runAndValidateUseItems(
967
+ store,
968
+ namespace,
969
+ entry,
970
+ mergedUse,
971
+ "route",
972
+ "use",
973
+ );
974
+ return { name: namespace, type: "route", uses: result } as RouteItem;
975
+ }
976
+
977
+ /* typesafe item */
978
+ return { name: namespace, type: "route" } as RouteItem;
979
+ };
980
+
981
+ const layout: RouteHelpers<any, any>["layout"] = (handler, use) => {
982
+ const { store, ctx } = requireDslContext(
983
+ "layout() must be called inside urls()",
984
+ );
985
+
986
+ invariant(
987
+ !ctx.parent || ctx.parent.type !== "parallel",
988
+ "layout() cannot be used inside parallel()",
989
+ );
990
+
991
+ const isRoot = !ctx.parent || ctx.parent === null;
992
+ const nextIndex = isRoot ? "$root" : store.getNextIndex("layout");
993
+ const namespace = `${ctx.namespace}.${nextIndex}`;
994
+ const shortCode = store.getShortCode("layout");
995
+
996
+ // Unwrap static handler definition, extract the actual handler function
997
+ const isStatic = isStaticHandler(handler);
998
+ const unwrappedHandler = isStatic ? handler.handler : handler;
999
+
1000
+ const urlPrefix = getUrlPrefix();
1001
+ const entry = {
1002
+ ...emptySegmentBase(),
1003
+ id: namespace,
1004
+ shortCode,
1005
+ type: "layout",
1006
+ parent: ctx.parent,
1007
+ handler: unwrappedHandler,
1008
+ ...(urlPrefix ? { mountPath: urlPrefix } : {}),
1009
+ ...(isStatic
1010
+ ? {
1011
+ isStaticPrerender: true as const,
1012
+ ...(handler.$$id ? { staticHandlerId: handler.$$id } : {}),
1013
+ }
1014
+ : {}),
1015
+ } satisfies EntryData;
1016
+
1017
+ // Capture namespace prefix on static handler for build-time reverse() resolution
1018
+ if (isStatic && handler.$$id && ctx.namePrefix) {
1019
+ (handler as any).$$routePrefix = ctx.namePrefix;
1020
+ }
1021
+
1022
+ // Merge handler.use defaults with explicit use
1023
+ const handlerUseFn = resolveHandlerUse(handler);
1024
+ const mergedUse = mergeHandlerUse(handlerUseFn, use, "layout");
1025
+
1026
+ // Run merged use callback if present
1027
+ let result: AllUseItems[] | undefined;
1028
+ if (mergedUse) {
1029
+ result = runAndValidateUseItems(
1030
+ store,
1031
+ namespace,
1032
+ entry,
1033
+ mergedUse,
1034
+ "layout",
1035
+ "use",
1036
+ );
1037
+ }
1038
+
1039
+ // Check if this is an orphan layout (no routes in children, including nested caches)
1040
+ const hasRoutes =
1041
+ result &&
1042
+ Array.isArray(result) &&
1043
+ result.some((item) => hasRoutesInItem(item));
1044
+
1045
+ if (!hasRoutes) {
1046
+ // Orphan layouts must not contain other layouts as children.
1047
+ // If we're here, all child layouts are also orphan (if any had routes,
1048
+ // hasRoutesInItem would have returned true). Nested orphan chains are
1049
+ // confusing — use sibling orphan layouts instead.
1050
+ if (result) {
1051
+ invariant(
1052
+ !result.some((item) => item?.type === "layout"),
1053
+ `orphan layout cannot contain other layouts as children [${namespace}]`,
1054
+ );
1055
+ }
1056
+
1057
+ const parent = ctx.parent;
1058
+
1059
+ // Allow orphan layouts at root level if they're part of map() builder result
1060
+ if (!parent || parent === null) {
1061
+ if (!isRoot) {
1062
+ invariant(
1063
+ false,
1064
+ `Orphan layout cannot be used at non-root level without parent [${namespace}]`,
1065
+ );
1066
+ }
1067
+ // Root-level orphan is allowed (e.g., sibling layouts in map() builder)
1068
+ } else {
1069
+ // Has parent - register as orphan layout
1070
+ invariant(
1071
+ parent.type === "route" ||
1072
+ parent.type === "layout" ||
1073
+ parent.type === "cache",
1074
+ `Orphan layouts can only be defined inside route or layout > check [${namespace}]`,
1075
+ );
1076
+
1077
+ attachOrphanSibling(parent, entry);
1078
+ }
1079
+ }
1080
+
1081
+ if (result) {
1082
+ return { name: namespace, type: "layout", uses: result } as LayoutItem;
1083
+ }
1084
+ return {
1085
+ name: namespace,
1086
+ type: "layout",
1087
+ } as LayoutItem;
1088
+ };
1089
+
1090
+ const isValidUseItem = (item: any): item is AllUseItems | undefined | null =>
1091
+ item == null ||
1092
+ (typeof item === "object" &&
1093
+ "type" in item &&
1094
+ ALL_USE_ITEM_TYPES.has(item.type));
1095
+
1096
+ // DSL helpers exported for direct import from @rangojs/router and for
1097
+ // assembly into the RouteHelpers object in helper-factories.ts. The route-item
1098
+ // types are discriminated by their `type` literal, so the helpers carry no brand.
1099
+ export {
1100
+ layout,
1101
+ cache,
1102
+ middleware,
1103
+ revalidate,
1104
+ parallel,
1105
+ intercept,
1106
+ when,
1107
+ errorBoundary,
1108
+ notFoundBoundary,
1109
+ route,
1110
+ loader,
1111
+ loading,
1112
+ transition,
1113
+ isValidUseItem,
1114
+ emptySegmentBase,
1115
+ runAndValidateUseItems,
1116
+ };