@rangojs/router 0.0.0-experimental.dfdb0387 → 0.0.0-experimental.e9c0b2f2

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