@rangojs/router 0.0.0-experimental.debug-cache-fix → 0.0.0-experimental.df410dd5

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