@rangojs/router 0.0.0-experimental.ea6d5eec → 0.0.0-experimental.ea9f40f2

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