@rangojs/router 0.0.0-experimental.13 → 0.0.0-experimental.135c6902

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 (1098) hide show
  1. package/AGENTS.md +9 -0
  2. package/README.md +884 -4
  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 +1531 -212
  82. package/dist/bin/rango.js.map +1 -0
  83. package/dist/browser/event-controller.d.ts +191 -0
  84. package/dist/browser/event-controller.d.ts.map +1 -0
  85. package/dist/browser/event-controller.js +559 -0
  86. package/dist/browser/event-controller.js.map +1 -0
  87. package/dist/browser/index.d.ts +2 -0
  88. package/dist/browser/index.d.ts.map +1 -0
  89. package/dist/browser/index.js +14 -0
  90. package/dist/browser/index.js.map +1 -0
  91. package/dist/browser/link-interceptor.d.ts +38 -0
  92. package/dist/browser/link-interceptor.d.ts.map +1 -0
  93. package/dist/browser/link-interceptor.js +99 -0
  94. package/dist/browser/link-interceptor.js.map +1 -0
  95. package/dist/browser/logging.d.ts +10 -0
  96. package/dist/browser/logging.d.ts.map +1 -0
  97. package/dist/browser/logging.js +29 -0
  98. package/dist/browser/logging.js.map +1 -0
  99. package/dist/browser/lru-cache.d.ts +17 -0
  100. package/dist/browser/lru-cache.d.ts.map +1 -0
  101. package/dist/browser/lru-cache.js +50 -0
  102. package/dist/browser/lru-cache.js.map +1 -0
  103. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  104. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  105. package/dist/browser/merge-segment-loaders.js +102 -0
  106. package/dist/browser/merge-segment-loaders.js.map +1 -0
  107. package/dist/browser/navigation-bridge.d.ts +102 -0
  108. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  109. package/dist/browser/navigation-bridge.js +708 -0
  110. package/dist/browser/navigation-bridge.js.map +1 -0
  111. package/dist/browser/navigation-client.d.ts +25 -0
  112. package/dist/browser/navigation-client.d.ts.map +1 -0
  113. package/dist/browser/navigation-client.js +157 -0
  114. package/dist/browser/navigation-client.js.map +1 -0
  115. package/dist/browser/navigation-store.d.ts +101 -0
  116. package/dist/browser/navigation-store.d.ts.map +1 -0
  117. package/dist/browser/navigation-store.js +625 -0
  118. package/dist/browser/navigation-store.js.map +1 -0
  119. package/dist/browser/partial-update.d.ts +75 -0
  120. package/dist/browser/partial-update.d.ts.map +1 -0
  121. package/dist/browser/partial-update.js +426 -0
  122. package/dist/browser/partial-update.js.map +1 -0
  123. package/dist/browser/react/Link.d.ts +86 -0
  124. package/dist/browser/react/Link.d.ts.map +1 -0
  125. package/dist/browser/react/Link.js +128 -0
  126. package/dist/browser/react/Link.js.map +1 -0
  127. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  128. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  129. package/dist/browser/react/NavigationProvider.js +216 -0
  130. package/dist/browser/react/NavigationProvider.js.map +1 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  132. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  133. package/dist/browser/react/ScrollRestoration.js +57 -0
  134. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  135. package/dist/browser/react/context.d.ts +46 -0
  136. package/dist/browser/react/context.d.ts.map +1 -0
  137. package/dist/browser/react/context.js +10 -0
  138. package/dist/browser/react/context.js.map +1 -0
  139. package/dist/browser/react/index.d.ts +11 -0
  140. package/dist/browser/react/index.d.ts.map +1 -0
  141. package/dist/browser/react/index.js +22 -0
  142. package/dist/browser/react/index.js.map +1 -0
  143. package/dist/browser/react/location-state-shared.d.ts +63 -0
  144. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  145. package/dist/browser/react/location-state-shared.js +81 -0
  146. package/dist/browser/react/location-state-shared.js.map +1 -0
  147. package/dist/browser/react/location-state.d.ts +23 -0
  148. package/dist/browser/react/location-state.d.ts.map +1 -0
  149. package/dist/browser/react/location-state.js +29 -0
  150. package/dist/browser/react/location-state.js.map +1 -0
  151. package/dist/browser/react/mount-context.d.ts +24 -0
  152. package/dist/browser/react/mount-context.d.ts.map +1 -0
  153. package/dist/browser/react/mount-context.js +24 -0
  154. package/dist/browser/react/mount-context.js.map +1 -0
  155. package/dist/browser/react/use-action.d.ts +64 -0
  156. package/dist/browser/react/use-action.d.ts.map +1 -0
  157. package/dist/browser/react/use-action.js +134 -0
  158. package/dist/browser/react/use-action.js.map +1 -0
  159. package/dist/browser/react/use-client-cache.d.ts +41 -0
  160. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  161. package/dist/browser/react/use-client-cache.js +39 -0
  162. package/dist/browser/react/use-client-cache.js.map +1 -0
  163. package/dist/browser/react/use-handle.d.ts +31 -0
  164. package/dist/browser/react/use-handle.d.ts.map +1 -0
  165. package/dist/browser/react/use-handle.js +144 -0
  166. package/dist/browser/react/use-handle.js.map +1 -0
  167. package/dist/browser/react/use-href.d.ts +33 -0
  168. package/dist/browser/react/use-href.d.ts.map +1 -0
  169. package/dist/browser/react/use-href.js +39 -0
  170. package/dist/browser/react/use-href.js.map +1 -0
  171. package/dist/browser/react/use-link-status.d.ts +37 -0
  172. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  173. package/dist/browser/react/use-link-status.js +99 -0
  174. package/dist/browser/react/use-link-status.js.map +1 -0
  175. package/dist/browser/react/use-mount.d.ts +25 -0
  176. package/dist/browser/react/use-mount.d.ts.map +1 -0
  177. package/dist/browser/react/use-mount.js +30 -0
  178. package/dist/browser/react/use-mount.js.map +1 -0
  179. package/dist/browser/react/use-navigation.d.ts +27 -0
  180. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  181. package/dist/browser/react/use-navigation.js +87 -0
  182. package/dist/browser/react/use-navigation.js.map +1 -0
  183. package/dist/browser/react/use-segments.d.ts +38 -0
  184. package/dist/browser/react/use-segments.d.ts.map +1 -0
  185. package/dist/browser/react/use-segments.js +130 -0
  186. package/dist/browser/react/use-segments.js.map +1 -0
  187. package/dist/browser/request-controller.d.ts +26 -0
  188. package/dist/browser/request-controller.d.ts.map +1 -0
  189. package/dist/browser/request-controller.js +147 -0
  190. package/dist/browser/request-controller.js.map +1 -0
  191. package/dist/browser/rsc-router.d.ts +129 -0
  192. package/dist/browser/rsc-router.d.ts.map +1 -0
  193. package/dist/browser/rsc-router.js +195 -0
  194. package/dist/browser/rsc-router.js.map +1 -0
  195. package/dist/browser/scroll-restoration.d.ts +93 -0
  196. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  197. package/dist/browser/scroll-restoration.js +321 -0
  198. package/dist/browser/scroll-restoration.js.map +1 -0
  199. package/dist/browser/segment-structure-assert.d.ts +17 -0
  200. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  201. package/dist/browser/segment-structure-assert.js +59 -0
  202. package/dist/browser/segment-structure-assert.js.map +1 -0
  203. package/dist/browser/server-action-bridge.d.ts +26 -0
  204. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  205. package/dist/browser/server-action-bridge.js +668 -0
  206. package/dist/browser/server-action-bridge.js.map +1 -0
  207. package/dist/browser/shallow.d.ts +12 -0
  208. package/dist/browser/shallow.d.ts.map +1 -0
  209. package/dist/browser/shallow.js +34 -0
  210. package/dist/browser/shallow.js.map +1 -0
  211. package/dist/browser/types.d.ts +369 -0
  212. package/dist/browser/types.d.ts.map +1 -0
  213. package/dist/browser/types.js +2 -0
  214. package/dist/browser/types.js.map +1 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  216. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  217. package/dist/build/__tests__/generate-cli.test.js +237 -0
  218. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  220. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  221. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  222. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  224. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  225. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  226. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  228. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  230. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  231. package/dist/build/generate-manifest.d.ts +81 -0
  232. package/dist/build/generate-manifest.d.ts.map +1 -0
  233. package/dist/build/generate-manifest.js +276 -0
  234. package/dist/build/generate-manifest.js.map +1 -0
  235. package/dist/build/generate-route-types.d.ts +115 -0
  236. package/dist/build/generate-route-types.d.ts.map +1 -0
  237. package/dist/build/generate-route-types.js +740 -0
  238. package/dist/build/generate-route-types.js.map +1 -0
  239. package/dist/build/index.d.ts +21 -0
  240. package/dist/build/index.d.ts.map +1 -0
  241. package/dist/build/index.js +21 -0
  242. package/dist/build/index.js.map +1 -0
  243. package/dist/build/route-trie.d.ts +71 -0
  244. package/dist/build/route-trie.d.ts.map +1 -0
  245. package/dist/build/route-trie.js +175 -0
  246. package/dist/build/route-trie.js.map +1 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  248. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  249. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  250. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  252. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  253. package/dist/cache/__tests__/document-cache.test.js +345 -0
  254. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  258. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  260. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  261. package/dist/cache/__tests__/memory-store.test.js +367 -0
  262. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  263. package/dist/cache/cache-scope.d.ts +102 -0
  264. package/dist/cache/cache-scope.d.ts.map +1 -0
  265. package/dist/cache/cache-scope.js +440 -0
  266. package/dist/cache/cache-scope.js.map +1 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  270. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  272. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  273. package/dist/cache/cf/cf-cache-store.js +242 -0
  274. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  275. package/dist/cache/cf/index.d.ts +14 -0
  276. package/dist/cache/cf/index.d.ts.map +1 -0
  277. package/dist/cache/cf/index.js +17 -0
  278. package/dist/cache/cf/index.js.map +1 -0
  279. package/dist/cache/document-cache.d.ts +64 -0
  280. package/dist/cache/document-cache.d.ts.map +1 -0
  281. package/dist/cache/document-cache.js +228 -0
  282. package/dist/cache/document-cache.js.map +1 -0
  283. package/dist/cache/index.d.ts +19 -0
  284. package/dist/cache/index.d.ts.map +1 -0
  285. package/dist/cache/index.js +21 -0
  286. package/dist/cache/index.js.map +1 -0
  287. package/dist/cache/memory-segment-store.d.ts +110 -0
  288. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  289. package/dist/cache/memory-segment-store.js +117 -0
  290. package/dist/cache/memory-segment-store.js.map +1 -0
  291. package/dist/cache/memory-store.d.ts +41 -0
  292. package/dist/cache/memory-store.d.ts.map +1 -0
  293. package/dist/cache/memory-store.js +191 -0
  294. package/dist/cache/memory-store.js.map +1 -0
  295. package/dist/cache/types.d.ts +317 -0
  296. package/dist/cache/types.d.ts.map +1 -0
  297. package/dist/cache/types.js +12 -0
  298. package/dist/cache/types.js.map +1 -0
  299. package/dist/client.d.ts +248 -0
  300. package/dist/client.d.ts.map +1 -0
  301. package/dist/client.js +367 -0
  302. package/dist/client.js.map +1 -0
  303. package/dist/client.rsc.d.ts +26 -0
  304. package/dist/client.rsc.d.ts.map +1 -0
  305. package/dist/client.rsc.js +46 -0
  306. package/dist/client.rsc.js.map +1 -0
  307. package/dist/component-utils.d.ts +36 -0
  308. package/dist/component-utils.d.ts.map +1 -0
  309. package/dist/component-utils.js +61 -0
  310. package/dist/component-utils.js.map +1 -0
  311. package/dist/components/DefaultDocument.d.ts +13 -0
  312. package/dist/components/DefaultDocument.d.ts.map +1 -0
  313. package/dist/components/DefaultDocument.js +15 -0
  314. package/dist/components/DefaultDocument.js.map +1 -0
  315. package/dist/debug.d.ts +58 -0
  316. package/dist/debug.d.ts.map +1 -0
  317. package/dist/debug.js +157 -0
  318. package/dist/debug.js.map +1 -0
  319. package/dist/default-error-boundary.d.ts +11 -0
  320. package/dist/default-error-boundary.d.ts.map +1 -0
  321. package/dist/default-error-boundary.js +45 -0
  322. package/dist/default-error-boundary.js.map +1 -0
  323. package/dist/deps/browser.d.ts +2 -0
  324. package/dist/deps/browser.d.ts.map +1 -0
  325. package/dist/deps/browser.js +3 -0
  326. package/dist/deps/browser.js.map +1 -0
  327. package/dist/deps/html-stream-client.d.ts +2 -0
  328. package/dist/deps/html-stream-client.d.ts.map +1 -0
  329. package/dist/deps/html-stream-client.js +3 -0
  330. package/dist/deps/html-stream-client.js.map +1 -0
  331. package/dist/deps/html-stream-server.d.ts +2 -0
  332. package/dist/deps/html-stream-server.d.ts.map +1 -0
  333. package/dist/deps/html-stream-server.js +3 -0
  334. package/dist/deps/html-stream-server.js.map +1 -0
  335. package/dist/deps/rsc.d.ts +2 -0
  336. package/dist/deps/rsc.d.ts.map +1 -0
  337. package/dist/deps/rsc.js +4 -0
  338. package/dist/deps/rsc.js.map +1 -0
  339. package/dist/deps/ssr.d.ts +2 -0
  340. package/dist/deps/ssr.d.ts.map +1 -0
  341. package/dist/deps/ssr.js +3 -0
  342. package/dist/deps/ssr.js.map +1 -0
  343. package/dist/errors.d.ts +174 -0
  344. package/dist/errors.d.ts.map +1 -0
  345. package/dist/errors.js +241 -0
  346. package/dist/errors.js.map +1 -0
  347. package/dist/handle.d.ts +78 -0
  348. package/dist/handle.d.ts.map +1 -0
  349. package/dist/handle.js +82 -0
  350. package/dist/handle.js.map +1 -0
  351. package/dist/handles/MetaTags.d.ts +14 -0
  352. package/dist/handles/MetaTags.d.ts.map +1 -0
  353. package/dist/handles/MetaTags.js +136 -0
  354. package/dist/handles/MetaTags.js.map +1 -0
  355. package/dist/handles/index.d.ts +6 -0
  356. package/dist/handles/index.d.ts.map +1 -0
  357. package/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/{src/href-context.ts → dist/href-context.d.ts} +7 -11
  424. package/dist/href-context.d.ts.map +1 -0
  425. package/dist/href-context.js +21 -0
  426. package/dist/href-context.js.map +1 -0
  427. package/dist/index.d.ts +73 -0
  428. package/dist/index.d.ts.map +1 -0
  429. package/dist/index.js +91 -0
  430. package/dist/index.js.map +1 -0
  431. package/dist/index.rsc.d.ts +32 -0
  432. package/dist/index.rsc.d.ts.map +1 -0
  433. package/dist/index.rsc.js +40 -0
  434. package/dist/index.rsc.js.map +1 -0
  435. package/dist/internal-debug.d.ts +2 -0
  436. package/dist/internal-debug.d.ts.map +1 -0
  437. package/dist/internal-debug.js +5 -0
  438. package/dist/internal-debug.js.map +1 -0
  439. package/dist/loader.d.ts +14 -0
  440. package/dist/loader.d.ts.map +1 -0
  441. package/dist/loader.js +20 -0
  442. package/dist/loader.js.map +1 -0
  443. package/dist/loader.rsc.d.ts +19 -0
  444. package/dist/loader.rsc.d.ts.map +1 -0
  445. package/dist/loader.rsc.js +99 -0
  446. package/dist/loader.rsc.js.map +1 -0
  447. package/dist/network-error-thrower.d.ts +17 -0
  448. package/dist/network-error-thrower.d.ts.map +1 -0
  449. package/dist/network-error-thrower.js +14 -0
  450. package/dist/network-error-thrower.js.map +1 -0
  451. package/dist/outlet-context.d.ts +13 -0
  452. package/dist/outlet-context.d.ts.map +1 -0
  453. package/dist/outlet-context.js +3 -0
  454. package/dist/outlet-context.js.map +1 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  456. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  457. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  458. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  459. package/dist/prerender/param-hash.d.ts +16 -0
  460. package/dist/prerender/param-hash.d.ts.map +1 -0
  461. package/dist/prerender/param-hash.js +36 -0
  462. package/dist/prerender/param-hash.js.map +1 -0
  463. package/dist/prerender/store.d.ts +38 -0
  464. package/dist/prerender/store.d.ts.map +1 -0
  465. package/dist/prerender/store.js +61 -0
  466. package/dist/prerender/store.js.map +1 -0
  467. package/dist/prerender.d.ts +66 -0
  468. package/dist/prerender.d.ts.map +1 -0
  469. package/dist/prerender.js +57 -0
  470. package/dist/prerender.js.map +1 -0
  471. package/dist/reverse.d.ts +196 -0
  472. package/dist/reverse.d.ts.map +1 -0
  473. package/dist/reverse.js +78 -0
  474. package/dist/reverse.js.map +1 -0
  475. package/dist/root-error-boundary.d.ts +33 -0
  476. package/dist/root-error-boundary.d.ts.map +1 -0
  477. package/dist/root-error-boundary.js +165 -0
  478. package/dist/root-error-boundary.js.map +1 -0
  479. package/dist/route-content-wrapper.d.ts +46 -0
  480. package/dist/route-content-wrapper.d.ts.map +1 -0
  481. package/dist/route-content-wrapper.js +77 -0
  482. package/dist/route-content-wrapper.js.map +1 -0
  483. package/dist/route-definition.d.ts +421 -0
  484. package/dist/route-definition.d.ts.map +1 -0
  485. package/dist/route-definition.js +868 -0
  486. package/dist/route-definition.js.map +1 -0
  487. package/dist/route-map-builder.d.ts +155 -0
  488. package/dist/route-map-builder.d.ts.map +1 -0
  489. package/dist/route-map-builder.js +237 -0
  490. package/dist/route-map-builder.js.map +1 -0
  491. package/dist/route-types.d.ts +165 -0
  492. package/dist/route-types.d.ts.map +1 -0
  493. package/dist/route-types.js +7 -0
  494. package/dist/route-types.js.map +1 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  496. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  497. package/dist/router/__tests__/handler-context.test.js +65 -0
  498. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  502. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  503. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  504. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  505. package/dist/router/__tests__/match-context.test.js +92 -0
  506. package/dist/router/__tests__/match-context.test.js.map +1 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  508. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  509. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  510. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  511. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  512. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  513. package/dist/router/__tests__/match-result.test.js +457 -0
  514. package/dist/router/__tests__/match-result.test.js.map +1 -0
  515. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  516. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  517. package/dist/router/__tests__/on-error.test.js +678 -0
  518. package/dist/router/__tests__/on-error.test.js.map +1 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  520. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  521. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  522. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  526. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  527. package/dist/router/error-handling.d.ts +77 -0
  528. package/dist/router/error-handling.d.ts.map +1 -0
  529. package/dist/router/error-handling.js +202 -0
  530. package/dist/router/error-handling.js.map +1 -0
  531. package/dist/router/handler-context.d.ts +20 -0
  532. package/dist/router/handler-context.d.ts.map +1 -0
  533. package/dist/router/handler-context.js +198 -0
  534. package/dist/router/handler-context.js.map +1 -0
  535. package/dist/router/intercept-resolution.d.ts +66 -0
  536. package/dist/router/intercept-resolution.d.ts.map +1 -0
  537. package/dist/router/intercept-resolution.js +246 -0
  538. package/dist/router/intercept-resolution.js.map +1 -0
  539. package/dist/router/loader-resolution.d.ts +64 -0
  540. package/dist/router/loader-resolution.d.ts.map +1 -0
  541. package/dist/router/loader-resolution.js +284 -0
  542. package/dist/router/loader-resolution.js.map +1 -0
  543. package/dist/router/logging.d.ts +15 -0
  544. package/dist/router/logging.d.ts.map +1 -0
  545. package/dist/router/logging.js +99 -0
  546. package/dist/router/logging.js.map +1 -0
  547. package/dist/router/manifest.d.ts +22 -0
  548. package/dist/router/manifest.d.ts.map +1 -0
  549. package/dist/router/manifest.js +181 -0
  550. package/dist/router/manifest.js.map +1 -0
  551. package/dist/router/match-api.d.ts +35 -0
  552. package/dist/router/match-api.d.ts.map +1 -0
  553. package/dist/router/match-api.js +406 -0
  554. package/dist/router/match-api.js.map +1 -0
  555. package/dist/router/match-context.d.ts +206 -0
  556. package/dist/router/match-context.d.ts.map +1 -0
  557. package/dist/router/match-context.js +17 -0
  558. package/dist/router/match-context.js.map +1 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  560. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  561. package/dist/router/match-middleware/background-revalidation.js +75 -0
  562. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  564. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  565. package/dist/router/match-middleware/cache-lookup.js +257 -0
  566. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  567. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  568. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  569. package/dist/router/match-middleware/cache-store.js +108 -0
  570. package/dist/router/match-middleware/cache-store.js.map +1 -0
  571. package/dist/router/match-middleware/index.d.ts +81 -0
  572. package/dist/router/match-middleware/index.d.ts.map +1 -0
  573. package/dist/router/match-middleware/index.js +80 -0
  574. package/dist/router/match-middleware/index.js.map +1 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  576. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  577. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  578. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  580. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  581. package/dist/router/match-middleware/segment-resolution.js +53 -0
  582. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  583. package/dist/router/match-pipelines.d.ts +147 -0
  584. package/dist/router/match-pipelines.d.ts.map +1 -0
  585. package/dist/router/match-pipelines.js +82 -0
  586. package/dist/router/match-pipelines.js.map +1 -0
  587. package/dist/router/match-result.d.ts +126 -0
  588. package/dist/router/match-result.d.ts.map +1 -0
  589. package/dist/router/match-result.js +93 -0
  590. package/dist/router/match-result.js.map +1 -0
  591. package/dist/router/metrics.d.ts +20 -0
  592. package/dist/router/metrics.d.ts.map +1 -0
  593. package/dist/router/metrics.js +47 -0
  594. package/dist/router/metrics.js.map +1 -0
  595. package/dist/router/middleware.d.ts +249 -0
  596. package/dist/router/middleware.d.ts.map +1 -0
  597. package/dist/router/middleware.js +434 -0
  598. package/dist/router/middleware.js.map +1 -0
  599. package/dist/router/middleware.test.d.ts +2 -0
  600. package/dist/router/middleware.test.d.ts.map +1 -0
  601. package/dist/router/middleware.test.js +816 -0
  602. package/dist/router/middleware.test.js.map +1 -0
  603. package/dist/router/pattern-matching.d.ts +149 -0
  604. package/dist/router/pattern-matching.d.ts.map +1 -0
  605. package/dist/router/pattern-matching.js +349 -0
  606. package/dist/router/pattern-matching.js.map +1 -0
  607. package/dist/router/revalidation.d.ts +44 -0
  608. package/dist/router/revalidation.d.ts.map +1 -0
  609. package/dist/router/revalidation.js +147 -0
  610. package/dist/router/revalidation.js.map +1 -0
  611. package/dist/router/router-context.d.ts +135 -0
  612. package/dist/router/router-context.d.ts.map +1 -0
  613. package/dist/router/router-context.js +36 -0
  614. package/dist/router/router-context.js.map +1 -0
  615. package/dist/router/segment-resolution.d.ts +127 -0
  616. package/dist/router/segment-resolution.d.ts.map +1 -0
  617. package/dist/router/segment-resolution.js +919 -0
  618. package/dist/router/segment-resolution.js.map +1 -0
  619. package/dist/router/trie-matching.d.ts +40 -0
  620. package/dist/router/trie-matching.d.ts.map +1 -0
  621. package/dist/router/trie-matching.js +127 -0
  622. package/dist/router/trie-matching.js.map +1 -0
  623. package/dist/router/types.d.ts +136 -0
  624. package/dist/router/types.d.ts.map +1 -0
  625. package/dist/router/types.js +7 -0
  626. package/dist/router/types.js.map +1 -0
  627. package/dist/router.d.ts +753 -0
  628. package/dist/router.d.ts.map +1 -0
  629. package/dist/router.gen.d.ts +6 -0
  630. package/dist/router.gen.d.ts.map +1 -0
  631. package/dist/router.gen.js +6 -0
  632. package/dist/router.gen.js.map +1 -0
  633. package/dist/router.js +1304 -0
  634. package/dist/router.js.map +1 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  636. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  637. package/dist/rsc/__tests__/helpers.test.js +140 -0
  638. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  639. package/dist/rsc/handler.d.ts +45 -0
  640. package/dist/rsc/handler.d.ts.map +1 -0
  641. package/dist/rsc/handler.js +1172 -0
  642. package/dist/rsc/handler.js.map +1 -0
  643. package/dist/rsc/helpers.d.ts +16 -0
  644. package/dist/rsc/helpers.d.ts.map +1 -0
  645. package/dist/rsc/helpers.js +55 -0
  646. package/dist/rsc/helpers.js.map +1 -0
  647. package/dist/rsc/index.d.ts +22 -0
  648. package/dist/rsc/index.d.ts.map +1 -0
  649. package/dist/rsc/index.js +23 -0
  650. package/dist/rsc/index.js.map +1 -0
  651. package/dist/rsc/nonce.d.ts +9 -0
  652. package/dist/rsc/nonce.d.ts.map +1 -0
  653. package/dist/rsc/nonce.js +18 -0
  654. package/dist/rsc/nonce.js.map +1 -0
  655. package/dist/rsc/types.d.ts +206 -0
  656. package/dist/rsc/types.d.ts.map +1 -0
  657. package/dist/rsc/types.js +8 -0
  658. package/dist/rsc/types.js.map +1 -0
  659. package/dist/search-params.d.ts +103 -0
  660. package/dist/search-params.d.ts.map +1 -0
  661. package/dist/search-params.js +74 -0
  662. package/dist/search-params.js.map +1 -0
  663. package/dist/segment-system.d.ts +75 -0
  664. package/dist/segment-system.d.ts.map +1 -0
  665. package/dist/segment-system.js +336 -0
  666. package/dist/segment-system.js.map +1 -0
  667. package/dist/server/context.d.ts +245 -0
  668. package/dist/server/context.d.ts.map +1 -0
  669. package/dist/server/context.js +197 -0
  670. package/dist/server/context.js.map +1 -0
  671. package/dist/server/fetchable-loader-store.d.ts +18 -0
  672. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  673. package/dist/server/fetchable-loader-store.js +18 -0
  674. package/dist/server/fetchable-loader-store.js.map +1 -0
  675. package/dist/server/handle-store.d.ts +85 -0
  676. package/dist/server/handle-store.d.ts.map +1 -0
  677. package/dist/server/handle-store.js +142 -0
  678. package/dist/server/handle-store.js.map +1 -0
  679. package/dist/server/loader-registry.d.ts +55 -0
  680. package/dist/server/loader-registry.d.ts.map +1 -0
  681. package/dist/server/loader-registry.js +132 -0
  682. package/dist/server/loader-registry.js.map +1 -0
  683. package/dist/server/request-context.d.ts +226 -0
  684. package/dist/server/request-context.d.ts.map +1 -0
  685. package/dist/server/request-context.js +290 -0
  686. package/dist/server/request-context.js.map +1 -0
  687. package/dist/server/root-layout.d.ts +4 -0
  688. package/dist/server/root-layout.d.ts.map +1 -0
  689. package/dist/server/root-layout.js +5 -0
  690. package/dist/server/root-layout.js.map +1 -0
  691. package/dist/server.d.ts +15 -0
  692. package/dist/server.d.ts.map +1 -0
  693. package/dist/server.js +20 -0
  694. package/dist/server.js.map +1 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  698. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  699. package/dist/ssr/index.d.ts +98 -0
  700. package/dist/ssr/index.d.ts.map +1 -0
  701. package/dist/ssr/index.js +158 -0
  702. package/dist/ssr/index.js.map +1 -0
  703. package/dist/static-handler.d.ts +50 -0
  704. package/dist/static-handler.d.ts.map +1 -0
  705. package/dist/static-handler.gen.d.ts +5 -0
  706. package/dist/static-handler.gen.d.ts.map +1 -0
  707. package/dist/static-handler.gen.js +5 -0
  708. package/dist/static-handler.gen.js.map +1 -0
  709. package/dist/static-handler.js +29 -0
  710. package/dist/static-handler.js.map +1 -0
  711. package/dist/theme/ThemeProvider.d.ts +20 -0
  712. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  713. package/dist/theme/ThemeProvider.js +240 -0
  714. package/dist/theme/ThemeProvider.js.map +1 -0
  715. package/dist/theme/ThemeScript.d.ts +48 -0
  716. package/dist/theme/ThemeScript.d.ts.map +1 -0
  717. package/dist/theme/ThemeScript.js +13 -0
  718. package/dist/theme/ThemeScript.js.map +1 -0
  719. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  720. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  721. package/dist/theme/__tests__/theme.test.js +103 -0
  722. package/dist/theme/__tests__/theme.test.js.map +1 -0
  723. package/dist/theme/constants.d.ts +29 -0
  724. package/dist/theme/constants.d.ts.map +1 -0
  725. package/dist/theme/constants.js +48 -0
  726. package/dist/theme/constants.js.map +1 -0
  727. package/dist/theme/index.d.ts +31 -0
  728. package/dist/theme/index.d.ts.map +1 -0
  729. package/dist/theme/index.js +36 -0
  730. package/dist/theme/index.js.map +1 -0
  731. package/dist/theme/theme-context.d.ts +40 -0
  732. package/dist/theme/theme-context.d.ts.map +1 -0
  733. package/dist/theme/theme-context.js +60 -0
  734. package/dist/theme/theme-context.js.map +1 -0
  735. package/dist/theme/theme-script.d.ts +27 -0
  736. package/dist/theme/theme-script.d.ts.map +1 -0
  737. package/dist/theme/theme-script.js +147 -0
  738. package/dist/theme/theme-script.js.map +1 -0
  739. package/dist/theme/types.d.ts +163 -0
  740. package/dist/theme/types.d.ts.map +1 -0
  741. package/dist/theme/types.js +11 -0
  742. package/dist/theme/types.js.map +1 -0
  743. package/dist/theme/use-theme.d.ts +12 -0
  744. package/dist/theme/use-theme.d.ts.map +1 -0
  745. package/dist/theme/use-theme.js +40 -0
  746. package/dist/theme/use-theme.js.map +1 -0
  747. package/dist/types.d.ts +1479 -0
  748. package/dist/types.d.ts.map +1 -0
  749. package/dist/types.js +10 -0
  750. package/dist/types.js.map +1 -0
  751. package/dist/urls.d.ts +441 -0
  752. package/dist/urls.d.ts.map +1 -0
  753. package/dist/urls.gen.d.ts +8 -0
  754. package/dist/urls.gen.d.ts.map +1 -0
  755. package/dist/urls.gen.js +8 -0
  756. package/dist/urls.gen.js.map +1 -0
  757. package/dist/urls.js +443 -0
  758. package/dist/urls.js.map +1 -0
  759. package/dist/use-loader.d.ts +127 -0
  760. package/dist/use-loader.d.ts.map +1 -0
  761. package/dist/use-loader.js +237 -0
  762. package/dist/use-loader.js.map +1 -0
  763. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  767. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  771. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  775. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  777. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  779. package/dist/vite/ast-handler-extract.d.ts +49 -0
  780. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  781. package/dist/vite/ast-handler-extract.js +249 -0
  782. package/dist/vite/ast-handler-extract.js.map +1 -0
  783. package/dist/vite/expose-action-id.d.ts +19 -0
  784. package/dist/vite/expose-action-id.d.ts.map +1 -0
  785. package/dist/vite/expose-action-id.js +250 -0
  786. package/dist/vite/expose-action-id.js.map +1 -0
  787. package/dist/vite/expose-id-utils.d.ts +69 -0
  788. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  789. package/dist/vite/expose-id-utils.js +289 -0
  790. package/dist/vite/expose-id-utils.js.map +1 -0
  791. package/dist/vite/expose-internal-ids.d.ts +22 -0
  792. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  793. package/dist/vite/expose-internal-ids.js +886 -0
  794. package/dist/vite/expose-internal-ids.js.map +1 -0
  795. package/dist/vite/index.d.ts +149 -0
  796. package/dist/vite/index.d.ts.map +1 -0
  797. package/dist/vite/index.js +3995 -2489
  798. package/dist/vite/index.js.map +1 -0
  799. package/dist/vite/package-resolution.d.ts +43 -0
  800. package/dist/vite/package-resolution.d.ts.map +1 -0
  801. package/dist/vite/package-resolution.js +112 -0
  802. package/dist/vite/package-resolution.js.map +1 -0
  803. package/dist/vite/virtual-entries.d.ts +25 -0
  804. package/dist/vite/virtual-entries.d.ts.map +1 -0
  805. package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
  806. package/dist/vite/virtual-entries.js.map +1 -0
  807. package/package.json +57 -52
  808. package/skills/breadcrumbs/SKILL.md +250 -0
  809. package/skills/cache-guide/SKILL.md +262 -0
  810. package/skills/caching/SKILL.md +85 -23
  811. package/skills/composability/SKILL.md +172 -0
  812. package/skills/debug-manifest/SKILL.md +12 -8
  813. package/skills/document-cache/SKILL.md +18 -16
  814. package/skills/fonts/SKILL.md +6 -4
  815. package/skills/hooks/SKILL.md +328 -70
  816. package/skills/host-router/SKILL.md +218 -0
  817. package/skills/intercept/SKILL.md +131 -8
  818. package/skills/layout/SKILL.md +100 -3
  819. package/skills/links/SKILL.md +62 -15
  820. package/skills/loader/SKILL.md +368 -42
  821. package/skills/middleware/SKILL.md +171 -34
  822. package/skills/mime-routes/SKILL.md +14 -10
  823. package/skills/parallel/SKILL.md +137 -1
  824. package/skills/prerender/SKILL.md +366 -28
  825. package/skills/rango/SKILL.md +85 -21
  826. package/skills/response-routes/SKILL.md +136 -83
  827. package/skills/route/SKILL.md +195 -21
  828. package/skills/router-setup/SKILL.md +123 -30
  829. package/skills/theme/SKILL.md +9 -8
  830. package/skills/typesafety/SKILL.md +240 -102
  831. package/skills/use-cache/SKILL.md +324 -0
  832. package/src/__internal.ts +102 -4
  833. package/src/bin/rango.ts +312 -15
  834. package/src/browser/action-coordinator.ts +97 -0
  835. package/src/browser/action-response-classifier.ts +99 -0
  836. package/src/browser/event-controller.ts +92 -64
  837. package/src/browser/history-state.ts +80 -0
  838. package/src/browser/intercept-utils.ts +52 -0
  839. package/src/browser/link-interceptor.ts +24 -4
  840. package/src/browser/logging.ts +11 -0
  841. package/src/browser/merge-segment-loaders.ts +20 -12
  842. package/src/browser/navigation-bridge.ts +266 -558
  843. package/src/browser/navigation-client.ts +132 -75
  844. package/src/browser/navigation-store.ts +33 -50
  845. package/src/browser/navigation-transaction.ts +297 -0
  846. package/src/browser/network-error-handler.ts +61 -0
  847. package/src/browser/partial-update.ts +292 -309
  848. package/src/browser/prefetch/cache.ts +206 -0
  849. package/src/browser/prefetch/fetch.ts +144 -0
  850. package/src/browser/prefetch/observer.ts +65 -0
  851. package/src/browser/prefetch/policy.ts +48 -0
  852. package/src/browser/prefetch/queue.ts +128 -0
  853. package/src/browser/rango-state.ts +112 -0
  854. package/src/browser/react/Link.tsx +190 -70
  855. package/src/browser/react/NavigationProvider.tsx +78 -11
  856. package/src/browser/react/context.ts +6 -0
  857. package/src/browser/react/filter-segment-order.ts +11 -0
  858. package/src/browser/react/index.ts +12 -12
  859. package/src/browser/react/location-state-shared.ts +95 -53
  860. package/src/browser/react/location-state.ts +60 -15
  861. package/src/browser/react/mount-context.ts +6 -1
  862. package/src/browser/react/nonce-context.ts +23 -0
  863. package/src/browser/react/shallow-equal.ts +27 -0
  864. package/src/browser/react/use-action.ts +29 -51
  865. package/src/browser/react/use-client-cache.ts +5 -3
  866. package/src/browser/react/use-handle.ts +29 -70
  867. package/src/browser/react/use-link-status.ts +6 -5
  868. package/src/browser/react/use-navigation.ts +22 -63
  869. package/src/browser/react/use-params.ts +65 -0
  870. package/src/browser/react/use-pathname.ts +47 -0
  871. package/src/browser/react/use-router.ts +63 -0
  872. package/src/browser/react/use-search-params.ts +56 -0
  873. package/src/browser/react/use-segments.ts +80 -97
  874. package/src/browser/response-adapter.ts +73 -0
  875. package/src/browser/rsc-router.tsx +188 -57
  876. package/src/browser/scroll-restoration.ts +117 -44
  877. package/src/browser/segment-reconciler.ts +221 -0
  878. package/src/browser/segment-structure-assert.ts +16 -0
  879. package/src/browser/server-action-bridge.ts +488 -606
  880. package/src/browser/shallow.ts +6 -1
  881. package/src/browser/types.ts +116 -47
  882. package/src/browser/validate-redirect-origin.ts +29 -0
  883. package/src/build/generate-manifest.ts +63 -21
  884. package/src/build/generate-route-types.ts +36 -1038
  885. package/src/build/index.ts +2 -5
  886. package/src/build/route-trie.ts +38 -12
  887. package/src/build/route-types/ast-helpers.ts +25 -0
  888. package/src/build/route-types/ast-route-extraction.ts +98 -0
  889. package/src/build/route-types/codegen.ts +102 -0
  890. package/src/build/route-types/include-resolution.ts +411 -0
  891. package/src/build/route-types/param-extraction.ts +48 -0
  892. package/src/build/route-types/per-module-writer.ts +128 -0
  893. package/src/build/route-types/router-processing.ts +479 -0
  894. package/src/build/route-types/scan-filter.ts +78 -0
  895. package/src/build/runtime-discovery.ts +231 -0
  896. package/src/cache/background-task.ts +34 -0
  897. package/src/cache/cache-key-utils.ts +44 -0
  898. package/src/cache/cache-policy.ts +125 -0
  899. package/src/cache/cache-runtime.ts +338 -0
  900. package/src/cache/cache-scope.ts +122 -303
  901. package/src/cache/cf/cf-cache-store.ts +571 -17
  902. package/src/cache/cf/index.ts +13 -3
  903. package/src/cache/document-cache.ts +116 -77
  904. package/src/cache/handle-capture.ts +81 -0
  905. package/src/cache/handle-snapshot.ts +41 -0
  906. package/src/cache/index.ts +1 -15
  907. package/src/cache/memory-segment-store.ts +191 -13
  908. package/src/cache/profile-registry.ts +73 -0
  909. package/src/cache/read-through-swr.ts +134 -0
  910. package/src/cache/segment-codec.ts +256 -0
  911. package/src/cache/taint.ts +98 -0
  912. package/src/cache/types.ts +72 -122
  913. package/src/client.rsc.tsx +3 -1
  914. package/src/client.tsx +84 -126
  915. package/src/component-utils.ts +4 -4
  916. package/src/components/DefaultDocument.tsx +5 -1
  917. package/src/context-var.ts +86 -0
  918. package/src/debug.ts +19 -9
  919. package/src/errors.ts +77 -7
  920. package/src/handle.ts +12 -7
  921. package/src/handles/MetaTags.tsx +73 -20
  922. package/src/handles/breadcrumbs.ts +66 -0
  923. package/src/handles/index.ts +1 -0
  924. package/src/handles/meta.ts +30 -13
  925. package/src/host/cookie-handler.ts +21 -15
  926. package/src/host/errors.ts +8 -8
  927. package/src/host/index.ts +4 -7
  928. package/src/host/pattern-matcher.ts +27 -27
  929. package/src/host/router.ts +61 -39
  930. package/src/host/testing.ts +8 -8
  931. package/src/host/types.ts +15 -7
  932. package/src/host/utils.ts +1 -1
  933. package/src/href-client.ts +65 -45
  934. package/src/index.rsc.ts +104 -40
  935. package/src/index.ts +122 -67
  936. package/src/internal-debug.ts +9 -3
  937. package/src/loader.rsc.ts +18 -93
  938. package/src/loader.ts +26 -9
  939. package/src/network-error-thrower.tsx +3 -1
  940. package/src/outlet-provider.tsx +45 -0
  941. package/src/prerender/param-hash.ts +4 -2
  942. package/src/prerender/store.ts +121 -17
  943. package/src/prerender.ts +325 -20
  944. package/src/reverse.ts +144 -124
  945. package/src/root-error-boundary.tsx +41 -29
  946. package/src/route-content-wrapper.tsx +7 -4
  947. package/src/route-definition/dsl-helpers.ts +959 -0
  948. package/src/route-definition/helper-factories.ts +200 -0
  949. package/src/route-definition/helpers-types.ts +430 -0
  950. package/src/route-definition/index.ts +52 -0
  951. package/src/route-definition/redirect.ts +93 -0
  952. package/src/route-definition.ts +1 -1450
  953. package/src/route-map-builder.ts +87 -133
  954. package/src/route-name.ts +53 -0
  955. package/src/route-types.ts +41 -6
  956. package/src/router/content-negotiation.ts +116 -0
  957. package/src/router/debug-manifest.ts +72 -0
  958. package/src/router/error-handling.ts +9 -9
  959. package/src/router/find-match.ts +160 -0
  960. package/src/router/handler-context.ts +324 -116
  961. package/src/router/intercept-resolution.ts +11 -4
  962. package/src/router/lazy-includes.ts +237 -0
  963. package/src/router/loader-resolution.ts +179 -133
  964. package/src/router/logging.ts +112 -6
  965. package/src/router/manifest.ts +58 -19
  966. package/src/router/match-api.ts +89 -88
  967. package/src/router/match-context.ts +4 -2
  968. package/src/router/match-handlers.ts +440 -0
  969. package/src/router/match-middleware/background-revalidation.ts +84 -89
  970. package/src/router/match-middleware/cache-lookup.ts +261 -48
  971. package/src/router/match-middleware/cache-store.ts +54 -13
  972. package/src/router/match-middleware/intercept-resolution.ts +45 -22
  973. package/src/router/match-middleware/segment-resolution.ts +20 -9
  974. package/src/router/match-pipelines.ts +10 -45
  975. package/src/router/match-result.ts +34 -17
  976. package/src/router/metrics.ts +235 -15
  977. package/src/router/middleware-cookies.ts +55 -0
  978. package/src/router/middleware-types.ts +222 -0
  979. package/src/router/middleware.ts +327 -369
  980. package/src/router/pattern-matching.ts +169 -31
  981. package/src/router/prerender-match.ts +402 -0
  982. package/src/router/preview-match.ts +170 -0
  983. package/src/router/revalidation.ts +105 -14
  984. package/src/router/router-context.ts +40 -21
  985. package/src/router/router-interfaces.ts +452 -0
  986. package/src/router/router-options.ts +592 -0
  987. package/src/router/router-registry.ts +24 -0
  988. package/src/router/segment-resolution/fresh.ts +656 -0
  989. package/src/router/segment-resolution/helpers.ts +263 -0
  990. package/src/router/segment-resolution/loader-cache.ts +199 -0
  991. package/src/router/segment-resolution/revalidation.ts +1277 -0
  992. package/src/router/segment-resolution/static-store.ts +67 -0
  993. package/src/router/segment-resolution.ts +21 -1354
  994. package/src/router/segment-wrappers.ts +291 -0
  995. package/src/router/telemetry-otel.ts +299 -0
  996. package/src/router/telemetry.ts +300 -0
  997. package/src/router/timeout.ts +148 -0
  998. package/src/router/trie-matching.ts +96 -29
  999. package/src/router/types.ts +15 -9
  1000. package/src/router.ts +642 -2366
  1001. package/src/rsc/handler-context.ts +45 -0
  1002. package/src/rsc/handler.ts +646 -1027
  1003. package/src/rsc/helpers.ts +140 -6
  1004. package/src/rsc/index.ts +0 -20
  1005. package/src/rsc/loader-fetch.ts +209 -0
  1006. package/src/rsc/manifest-init.ts +86 -0
  1007. package/src/rsc/nonce.ts +14 -0
  1008. package/src/rsc/origin-guard.ts +141 -0
  1009. package/src/rsc/progressive-enhancement.ts +379 -0
  1010. package/src/rsc/response-error.ts +37 -0
  1011. package/src/rsc/response-route-handler.ts +347 -0
  1012. package/src/rsc/rsc-rendering.ts +237 -0
  1013. package/src/rsc/runtime-warnings.ts +42 -0
  1014. package/src/rsc/server-action.ts +348 -0
  1015. package/src/rsc/ssr-setup.ts +128 -0
  1016. package/src/rsc/types.ts +38 -11
  1017. package/src/search-params.ts +66 -54
  1018. package/src/segment-system.tsx +165 -17
  1019. package/src/server/context.ts +237 -54
  1020. package/src/server/cookie-store.ts +190 -0
  1021. package/src/server/fetchable-loader-store.ts +11 -6
  1022. package/src/server/handle-store.ts +94 -15
  1023. package/src/server/loader-registry.ts +15 -56
  1024. package/src/server/request-context.ts +438 -71
  1025. package/src/server.ts +26 -164
  1026. package/src/ssr/index.tsx +101 -31
  1027. package/src/static-handler.ts +22 -4
  1028. package/src/theme/ThemeProvider.tsx +21 -15
  1029. package/src/theme/ThemeScript.tsx +5 -5
  1030. package/src/theme/constants.ts +5 -2
  1031. package/src/theme/index.ts +4 -14
  1032. package/src/theme/theme-context.ts +4 -30
  1033. package/src/theme/theme-script.ts +21 -18
  1034. package/src/types/boundaries.ts +158 -0
  1035. package/src/types/cache-types.ts +198 -0
  1036. package/src/types/error-types.ts +192 -0
  1037. package/src/types/global-namespace.ts +100 -0
  1038. package/src/types/handler-context.ts +687 -0
  1039. package/src/types/index.ts +88 -0
  1040. package/src/types/loader-types.ts +183 -0
  1041. package/src/types/route-config.ts +170 -0
  1042. package/src/types/route-entry.ts +109 -0
  1043. package/src/types/segments.ts +150 -0
  1044. package/src/types.ts +1 -1795
  1045. package/src/urls/include-helper.ts +197 -0
  1046. package/src/urls/index.ts +53 -0
  1047. package/src/urls/path-helper-types.ts +339 -0
  1048. package/src/urls/path-helper.ts +329 -0
  1049. package/src/urls/pattern-types.ts +95 -0
  1050. package/src/urls/response-types.ts +106 -0
  1051. package/src/urls/type-extraction.ts +372 -0
  1052. package/src/urls/urls-function.ts +98 -0
  1053. package/src/urls.ts +1 -1323
  1054. package/src/use-loader.tsx +85 -77
  1055. package/src/vite/discovery/bundle-postprocess.ts +184 -0
  1056. package/src/vite/discovery/discover-routers.ts +344 -0
  1057. package/src/vite/discovery/prerender-collection.ts +385 -0
  1058. package/src/vite/discovery/route-types-writer.ts +258 -0
  1059. package/src/vite/discovery/self-gen-tracking.ts +47 -0
  1060. package/src/vite/discovery/state.ts +108 -0
  1061. package/src/vite/discovery/virtual-module-codegen.ts +203 -0
  1062. package/src/vite/index.ts +11 -2259
  1063. package/src/vite/plugin-types.ts +48 -0
  1064. package/src/vite/plugins/cjs-to-esm.ts +93 -0
  1065. package/src/vite/plugins/client-ref-dedup.ts +115 -0
  1066. package/src/vite/plugins/client-ref-hashing.ts +105 -0
  1067. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -47
  1068. package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +8 -43
  1069. package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
  1070. package/src/vite/plugins/expose-ids/handler-transform.ts +179 -0
  1071. package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
  1072. package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
  1073. package/src/vite/plugins/expose-ids/types.ts +45 -0
  1074. package/src/vite/plugins/expose-internal-ids.ts +569 -0
  1075. package/src/vite/plugins/refresh-cmd.ts +65 -0
  1076. package/src/vite/plugins/use-cache-transform.ts +323 -0
  1077. package/src/vite/plugins/version-injector.ts +83 -0
  1078. package/src/vite/plugins/version-plugin.ts +266 -0
  1079. package/src/vite/plugins/virtual-entries.ts +123 -0
  1080. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  1081. package/src/vite/rango.ts +445 -0
  1082. package/src/vite/router-discovery.ts +777 -0
  1083. package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +181 -9
  1084. package/src/vite/utils/banner.ts +36 -0
  1085. package/src/vite/utils/bundle-analysis.ts +137 -0
  1086. package/src/vite/utils/manifest-utils.ts +70 -0
  1087. package/src/vite/{package-resolution.ts → utils/package-resolution.ts} +25 -29
  1088. package/src/vite/utils/prerender-utils.ts +189 -0
  1089. package/src/vite/utils/shared-utils.ts +169 -0
  1090. package/CLAUDE.md +0 -43
  1091. package/src/browser/lru-cache.ts +0 -69
  1092. package/src/browser/request-controller.ts +0 -164
  1093. package/src/cache/memory-store.ts +0 -253
  1094. package/src/router.gen.ts +0 -6
  1095. package/src/static-handler.gen.ts +0 -5
  1096. package/src/urls.gen.ts +0 -8
  1097. package/src/vite/expose-internal-ids.ts +0 -1167
  1098. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
@@ -1,1450 +1 @@
1
- import type { ReactNode } from "react";
2
- import type {
3
- PartialCacheOptions,
4
- DefaultEnv,
5
- ErrorBoundaryHandler,
6
- ExtractRouteParams,
7
- Handler,
8
- HandlersForRouteMap,
9
- LoaderDefinition,
10
- LoaderFn,
11
- MiddlewareFn,
12
- NotFoundBoundaryHandler,
13
- ResolvedRouteMap,
14
- RouteConfig,
15
- RouteDefinition,
16
- RouteDefinitionOptions,
17
- ShouldRevalidateFn,
18
- TrailingSlashMode,
19
- } from "./types.js";
20
- import {
21
- getContext,
22
- getNamePrefix,
23
- getUrlPrefix,
24
- type EntryData,
25
- type InterceptEntry,
26
- type InterceptWhenFn,
27
- type InterceptSelectorContext,
28
- } from "./server/context";
29
- import { invariant } from "./errors";
30
- import { isStaticHandler } from "./static-handler.js";
31
- import RootLayout from "./server/root-layout";
32
- import type {
33
- AllUseItems,
34
- LayoutItem,
35
- RouteItem,
36
- ParallelItem,
37
- InterceptItem,
38
- MiddlewareItem,
39
- RevalidateItem,
40
- LoaderItem,
41
- LoadingItem,
42
- ErrorBoundaryItem,
43
- NotFoundBoundaryItem,
44
- LayoutUseItem,
45
- RouteUseItem,
46
- ParallelUseItem,
47
- InterceptUseItem,
48
- LoaderUseItem,
49
- WhenItem,
50
- CacheItem,
51
- } from "./route-types.js";
52
- // const __DEV__ = import.meta.MODE === "development";
53
-
54
- /**
55
- * Result of route() function with paths and trailing slash config
56
- */
57
- export interface RouteDefinitionResult<T extends RouteDefinition> {
58
- routes: ResolvedRouteMap<T>;
59
- trailingSlash: Record<string, TrailingSlashMode>;
60
- }
61
-
62
- /**
63
- * Check if a value is a RouteConfig object
64
- */
65
- function isRouteConfig(value: unknown): value is RouteConfig {
66
- return (
67
- typeof value === "object" &&
68
- value !== null &&
69
- "path" in value &&
70
- typeof (value as RouteConfig).path === "string"
71
- );
72
- }
73
-
74
- /**
75
- * Define routes with optional trailing slash configuration
76
- *
77
- * @example
78
- * ```typescript
79
- * // Simple string paths
80
- * const routes = route({
81
- * blog: "/blog",
82
- * post: "/blog/:id",
83
- * });
84
- *
85
- * // With trailing slash config
86
- * const routes = route({
87
- * blog: "/blog",
88
- * api: { path: "/api", trailingSlash: "ignore" },
89
- * }, { trailingSlash: "never" }); // global default
90
- * ```
91
- */
92
- export function route<const T extends RouteDefinition>(
93
- input: T,
94
- options?: RouteDefinitionOptions
95
- ): ResolvedRouteMap<T> & {
96
- __trailingSlash?: Record<string, TrailingSlashMode>;
97
- } {
98
- const trailingSlash: Record<string, TrailingSlashMode> = {};
99
- const routes = flattenRoutes(
100
- input as RouteDefinition,
101
- "",
102
- trailingSlash,
103
- options?.trailingSlash
104
- );
105
-
106
- // Attach trailing slash config as a non-enumerable property
107
- // This keeps backwards compatibility while passing the config through
108
- const result = routes as ResolvedRouteMap<T> & {
109
- __trailingSlash?: Record<string, TrailingSlashMode>;
110
- };
111
- if (Object.keys(trailingSlash).length > 0) {
112
- Object.defineProperty(result, "__trailingSlash", {
113
- value: trailingSlash,
114
- enumerable: false,
115
- writable: false,
116
- });
117
- }
118
-
119
- return result;
120
- }
121
-
122
- /**
123
- * Flatten nested route definitions
124
- */
125
- function flattenRoutes(
126
- routes: RouteDefinition,
127
- prefix: string,
128
- trailingSlashConfig: Record<string, TrailingSlashMode>,
129
- defaultTrailingSlash?: TrailingSlashMode
130
- ): Record<string, string> {
131
- const flattened: Record<string, string> = {};
132
-
133
- for (const [key, value] of Object.entries(routes)) {
134
- const fullKey = prefix + key;
135
-
136
- if (typeof value === "string") {
137
- // Direct route pattern - include prefix
138
- flattened[fullKey] = value;
139
- // Apply default trailing slash if set
140
- if (defaultTrailingSlash) {
141
- trailingSlashConfig[fullKey] = defaultTrailingSlash;
142
- }
143
- } else if (isRouteConfig(value)) {
144
- // Route config object with path and optional trailingSlash
145
- flattened[fullKey] = value.path;
146
- // Use route-specific config or fall back to default
147
- const mode = value.trailingSlash ?? defaultTrailingSlash;
148
- if (mode) {
149
- trailingSlashConfig[fullKey] = mode;
150
- }
151
- } else {
152
- // Nested routes - flatten recursively
153
- const nested = flattenRoutes(
154
- value,
155
- `${fullKey}.`,
156
- trailingSlashConfig,
157
- defaultTrailingSlash
158
- );
159
- Object.assign(flattened, nested);
160
- }
161
- }
162
-
163
- return flattened;
164
- }
165
-
166
- // Type definitions moved to route-types.ts to avoid bundling in client code
167
- // Re-export for backward compatibility within this module
168
- export type {
169
- AllUseItems,
170
- LayoutItem,
171
- RouteItem,
172
- ParallelItem,
173
- InterceptItem,
174
- MiddlewareItem,
175
- RevalidateItem,
176
- LoaderItem,
177
- ErrorBoundaryItem,
178
- NotFoundBoundaryItem,
179
- LayoutUseItem,
180
- RouteUseItem,
181
- ParallelUseItem,
182
- InterceptUseItem,
183
- WhenItem,
184
- CacheItem,
185
- } from "./route-types.js";
186
-
187
- // Re-export intercept selector types for use in handlers
188
- export type {
189
- InterceptSelectorContext,
190
- InterceptSegmentsState,
191
- InterceptWhenFn,
192
- } from "./server/context";
193
-
194
- /**
195
- * Route helpers provided by map()
196
- * These are the only typed helpers users interact with
197
- */
198
- export type RouteHelpers<T extends RouteDefinition, TEnv> = {
199
- /**
200
- * Define a route handler for a specific route pattern
201
- * ```typescript
202
- * route("products.detail", async (ctx) => {
203
- * const product = await getProduct(ctx.params.slug);
204
- * return <ProductPage product={product} />;
205
- * })
206
- *
207
- * // With nested use() for middleware, loaders, etc.
208
- * route("products.detail", ProductHandler, () => [
209
- * loader(ProductLoader),
210
- * loading(<ProductSkeleton />),
211
- * ])
212
- * ```
213
- * @param name - Route name matching a key from route definitions
214
- * @param handler - Async function that returns JSX for the route
215
- * @param use - Optional callback returning middleware, loaders, loading, etc.
216
- */
217
- route: <K extends keyof ResolvedRouteMap<T> & string>(
218
- name: K,
219
- handler: Handler<ExtractRouteParams<T, K & string>, {}, TEnv>,
220
- use?: () => RouteUseItem[]
221
- ) => RouteItem;
222
- /**
223
- * Define a layout that wraps child routes
224
- * ```typescript
225
- * layout(<RootLayout />, () => [
226
- * route("home", HomePage),
227
- * route("about", AboutPage),
228
- * ])
229
- *
230
- * // With dynamic layout handler
231
- * layout(async (ctx) => {
232
- * const user = ctx.get("user");
233
- * return <DashboardShell user={user} />;
234
- * }, () => [
235
- * middleware(authMiddleware),
236
- * route("dashboard", DashboardPage),
237
- * ])
238
- * ```
239
- * @param component - Static JSX or async handler for the layout
240
- * @param use - Callback returning child routes, middleware, loaders, etc.
241
- */
242
- layout: (
243
- component: ReactNode | Handler<any, any, TEnv>,
244
- use?: () => LayoutUseItem[]
245
- ) => LayoutItem;
246
- /**
247
- * Define parallel routes that render simultaneously in named slots
248
- * ```typescript
249
- * parallel({
250
- * "@sidebar": <Sidebar />,
251
- * "@main": async (ctx) => <MainContent data={ctx.use(DataLoader)} />,
252
- * })
253
- *
254
- * // With loaders and loading states
255
- * parallel({
256
- * "@analytics": AnalyticsPanel,
257
- * "@metrics": MetricsPanel,
258
- * }, () => [
259
- * loader(DashboardLoader),
260
- * loading(<DashboardSkeleton />),
261
- * ])
262
- * ```
263
- * @param slots - Object with slot names (prefixed with @) mapped to handlers
264
- * @param use - Optional callback for loaders, loading, revalidate, etc.
265
- */
266
- parallel: <
267
- TSlots extends Record<`@${string}`, Handler<any, any, TEnv> | ReactNode>,
268
- >(
269
- slots: TSlots,
270
- use?: () => ParallelUseItem[]
271
- ) => ParallelItem;
272
- /**
273
- * Define an intercepting route for soft navigation
274
- *
275
- * When soft-navigating to the target route from within the current layout,
276
- * the intercept handler renders in the named slot instead of the route's
277
- * default handler. Direct navigation uses the route's handler.
278
- *
279
- * ```typescript
280
- * // In a layout - intercept "card" route as modal
281
- * layout(<KanbanLayout />, () => [
282
- * intercept("@modal", "card", () => <CardModal />),
283
- * ])
284
- *
285
- * // With loaders and revalidation
286
- * intercept("@modal", "card", () => <CardModal />, () => [
287
- * loader(CardModalLoader),
288
- * revalidate(() => false),
289
- * ])
290
- * ```
291
- * @param slotName - Named slot (prefixed with @) where intercept renders
292
- * @param routeName - Route name to intercept
293
- * @param handler - Component or handler for intercepted render
294
- * @param use - Optional callback for loaders, middleware, revalidate, etc.
295
- */
296
- intercept: <K extends keyof ResolvedRouteMap<T> & string>(
297
- slotName: `@${string}`,
298
- routeName: K,
299
- handler: ReactNode | Handler<ExtractRouteParams<T, K>, {}, TEnv>,
300
- use?: () => InterceptUseItem[]
301
- ) => InterceptItem;
302
- /**
303
- * Attach middleware to the current route/layout
304
- * ```typescript
305
- * middleware(async (ctx, next) => {
306
- * const session = await getSession(ctx.request);
307
- * if (!session) return redirect("/login");
308
- * ctx.set("user", session.user);
309
- * next();
310
- * })
311
- *
312
- * // Chain multiple middleware
313
- * middleware(authMiddleware, loggingMiddleware, rateLimitMiddleware)
314
- * ```
315
- * @param fns - One or more middleware functions to execute in order
316
- */
317
- middleware: (...fns: MiddlewareFn<TEnv>[]) => MiddlewareItem;
318
- /**
319
- * Control when a segment should revalidate during navigation
320
- * ```typescript
321
- * // Revalidate when params change
322
- * revalidate(({ currentParams, nextParams }) =>
323
- * currentParams.slug !== nextParams.slug
324
- * )
325
- *
326
- * // Revalidate after specific actions (actionId format: "path/to/file.ts#exportName")
327
- * revalidate(({ actionId }) =>
328
- * actionId?.includes("Cart") ?? false
329
- * )
330
- *
331
- * // Soft decision (suggest but allow override)
332
- * revalidate(({ defaultShouldRevalidate }) =>
333
- * ({ defaultShouldRevalidate: true })
334
- * )
335
- * ```
336
- * @param fn - Function that returns boolean (hard) or { defaultShouldRevalidate } (soft)
337
- */
338
- revalidate: (fn: ShouldRevalidateFn<any, TEnv>) => RevalidateItem;
339
- /**
340
- * Attach a data loader to the current route/layout
341
- * ```typescript
342
- * loader(ProductLoader)
343
- *
344
- * // With loader-specific revalidation (match by file or export name)
345
- * loader(CartLoader, () => [
346
- * revalidate(({ actionId }) => actionId?.includes("Cart") ?? false),
347
- * ])
348
- *
349
- * // Access loader data in handlers via ctx.use()
350
- * route("products.detail", async (ctx) => {
351
- * const product = await ctx.use(ProductLoader);
352
- * return <ProductPage product={product} />;
353
- * })
354
- * ```
355
- * @param loaderDef - Loader created with createLoader()
356
- * @param use - Optional callback for loader-specific revalidation rules
357
- */
358
- loader: <TData>(
359
- loaderDef: LoaderDefinition<TData>,
360
- use?: () => LoaderUseItem[]
361
- ) => LoaderItem;
362
- /**
363
- * Attach a loading component to the current route/layout
364
- * ```typescript
365
- * // Show loading on all requests (including SSR)
366
- * loading(<Skeleton />)
367
- *
368
- * // Skip loading on SSR, only show on client navigation
369
- * loading(<Skeleton />, { ssr: false })
370
- * ```
371
- * @param component - The loading UI to show during navigation
372
- * @param options - Configuration options
373
- * @param options.ssr - If false, skip showing loading on document requests (SSR)
374
- */
375
- loading: (component: ReactNode, options?: { ssr?: boolean }) => LoadingItem;
376
- /**
377
- * Attach an error boundary to catch errors in this segment and children
378
- * ```typescript
379
- * errorBoundary(<ErrorFallback />)
380
- *
381
- * // With dynamic error handler
382
- * errorBoundary(({ error, reset }) => (
383
- * <div>
384
- * <h2>Something went wrong</h2>
385
- * <p>{error.message}</p>
386
- * <button onClick={reset}>Try again</button>
387
- * </div>
388
- * ))
389
- * ```
390
- * @param fallback - Static JSX or handler receiving error info and reset function
391
- */
392
- errorBoundary: (
393
- fallback: ReactNode | ErrorBoundaryHandler
394
- ) => ErrorBoundaryItem;
395
- /**
396
- * Attach a not-found boundary to handle notFound() calls in this segment
397
- * ```typescript
398
- * notFoundBoundary(<ProductNotFound />)
399
- *
400
- * // With dynamic handler
401
- * notFoundBoundary(({ notFound }) => (
402
- * <div>
403
- * <h2>{notFound.message}</h2>
404
- * <a href="/products">Browse all products</a>
405
- * </div>
406
- * ))
407
- * ```
408
- * @param fallback - Static JSX or handler receiving not-found info
409
- */
410
- notFoundBoundary: (
411
- fallback: ReactNode | NotFoundBoundaryHandler
412
- ) => NotFoundBoundaryItem;
413
- /**
414
- * Define a condition for when an intercept should activate
415
- *
416
- * Only valid inside intercept() use() callback. When multiple when() calls
417
- * are present, ALL must return true for the intercept to activate.
418
- * If no when() is defined, the intercept always activates on soft navigation.
419
- *
420
- * Context properties:
421
- * - `from` - Source URL (where user is navigating from)
422
- * - `to` - Destination URL (where user is navigating to)
423
- * - `params` - Matched route params
424
- * - `segments` - Client's current segments with `path` and `ids`
425
- *
426
- * ```typescript
427
- * // Only intercept when coming from the board page
428
- * intercept("@modal", "card", <CardModal />, () => [
429
- * when(({ from }) => from.pathname.startsWith("/board")),
430
- * loader(CardDetailLoader),
431
- * ])
432
- *
433
- * // Use segments to check current route context
434
- * intercept("@modal", "card", <CardModal />, () => [
435
- * when(({ segments }) => segments.path[0] === "kanban"),
436
- * ])
437
- *
438
- * // Multiple conditions (AND logic)
439
- * intercept("@modal", "card", <CardModal />, () => [
440
- * when(({ from }) => from.pathname.startsWith("/board")),
441
- * when(({ segments }) => segments.ids.includes("kanban-layout")),
442
- * ])
443
- * ```
444
- * @param fn - Selector function receiving navigation context, returns boolean
445
- */
446
- when: (fn: InterceptWhenFn) => WhenItem;
447
- /**
448
- * Define cache configuration for segments
449
- *
450
- * Creates a cache boundary that applies to all children unless overridden.
451
- * Cache config inherits down the route tree like middleware wrapping.
452
- *
453
- * When ttl is not specified, uses store defaults (explicit store first,
454
- * then app-level store). When store is not specified, uses app-level store.
455
- *
456
- * Note: Loaders are NOT cached by default. Use cache() inside loader()
457
- * to explicitly opt-in to loader caching.
458
- *
459
- * ```typescript
460
- * // Using app-level defaults (ttl inherited from store.defaults)
461
- * cache(() => [
462
- * layout(<BlogLayout />), // cached with default TTL
463
- * route("post/:slug"), // cached with default TTL
464
- * ])
465
- *
466
- * // Cache all segments with explicit 60s TTL
467
- * cache({ ttl: 60 }, () => [
468
- * layout(<BlogLayout />), // cached
469
- * route("post/:slug"), // cached
470
- * ])
471
- *
472
- * // With stale-while-revalidate
473
- * cache({ ttl: 60, swr: 300 }, () => [
474
- * route("product/:id"),
475
- * ])
476
- *
477
- * // Override for specific section
478
- * cache({ ttl: 60 }, () => [
479
- * layout(<RootLayout />),
480
- * cache({ ttl: 300 }, () => [
481
- * route("static-page"), // longer TTL
482
- * ]),
483
- * cache(false, () => [
484
- * route("admin"), // not cached
485
- * ]),
486
- * ])
487
- *
488
- * // Use different store for specific routes
489
- * cache({ store: kvStore, ttl: 3600 }, () => [
490
- * route("archive/:year"), // uses KV store
491
- * ])
492
- *
493
- * // Opt-in loader caching
494
- * route("product/:id", ProductHandler, () => [
495
- * loader(ProductLoader), // NOT cached (default)
496
- * loader(StaticMetadata, () => [
497
- * cache({ ttl: 3600 }), // cached for 1 hour
498
- * ]),
499
- * ])
500
- * ```
501
- * @param optionsOrChildren - Cache options, false to disable, or children callback
502
- * @param children - Optional callback returning child segments (when first arg is options)
503
- */
504
- cache: {
505
- (): CacheItem;
506
- (children: () => AllUseItems[]): CacheItem;
507
- (
508
- options: PartialCacheOptions | false,
509
- use?: () => AllUseItems[]
510
- ): CacheItem;
511
- };
512
- };
513
-
514
- /**
515
- * Check if an item contains routes (directly or inside nested structures like cache).
516
- * Used to determine if a layout or cache should be treated as an orphan.
517
- */
518
- const hasRoutesInItem = (item: AllUseItems): boolean => {
519
- if (item.type === "route") return true;
520
- if (item.type === "cache" && item.uses) {
521
- return item.uses.some((child) => hasRoutesInItem(child));
522
- }
523
- if (item.type === "layout" && item.uses) {
524
- return item.uses.some((child) => hasRoutesInItem(child));
525
- }
526
- return false;
527
- };
528
-
529
- const revalidate: RouteHelpers<any, any>["revalidate"] = (fn) => {
530
- const ctx = getContext().getStore();
531
- if (!ctx) throw new Error("revalidate() must be called inside map()");
532
-
533
- // Attach to last entry in stack
534
- const parent = ctx.parent;
535
- if (!parent || !("revalidate" in parent)) {
536
- invariant(false, "No parent entry available for revalidate()");
537
- }
538
- const name = `$${getContext().getNextIndex("revalidate")}`;
539
- parent.revalidate.push(fn);
540
- return { name, type: "revalidate" } as RevalidateItem;
541
- };
542
-
543
- /**
544
- * Error boundary helper - attaches an error fallback to the current entry
545
- *
546
- * When an error occurs during rendering of this segment or its children,
547
- * the fallback will be rendered instead. The fallback can be:
548
- * - A static ReactNode (e.g., <ErrorPage />)
549
- * - A handler function that receives error info and reset function
550
- *
551
- * Error boundaries catch errors from:
552
- * - Middleware execution
553
- * - Loader execution
554
- * - Handler/component rendering
555
- *
556
- * @example
557
- * ```typescript
558
- * layout(<ShopLayout />, () => [
559
- * errorBoundary(<ShopErrorFallback />),
560
- * route("products.detail", ProductDetail),
561
- * ])
562
- *
563
- * // Or with handler for dynamic error UI:
564
- * route("products.detail", ProductDetail, () => [
565
- * errorBoundary(({ error, reset }) => (
566
- * <div>
567
- * <h2>Product failed to load</h2>
568
- * <p>{error.message}</p>
569
- * <button onClick={reset}>Retry</button>
570
- * </div>
571
- * )),
572
- * ])
573
- * ```
574
- */
575
- const errorBoundary: RouteHelpers<any, any>["errorBoundary"] = (fallback) => {
576
- const ctx = getContext().getStore();
577
- if (!ctx) throw new Error("errorBoundary() must be called inside map()");
578
-
579
- // Attach to parent entry in stack
580
- const parent = ctx.parent;
581
- if (!parent || !("errorBoundary" in parent)) {
582
- invariant(false, "No parent entry available for errorBoundary()");
583
- }
584
- const name = `$${getContext().getNextIndex("errorBoundary")}`;
585
- parent.errorBoundary.push(fallback);
586
- return { name, type: "errorBoundary" } as ErrorBoundaryItem;
587
- };
588
-
589
- /**
590
- * NotFound boundary helper - attaches a not-found fallback to the current entry
591
- *
592
- * When a DataNotFoundError is thrown (via notFound()) during rendering of this
593
- * segment or its children, the fallback will be rendered instead. The fallback can be:
594
- * - A static ReactNode (e.g., <ProductNotFound />)
595
- * - A handler function that receives not found info
596
- *
597
- * NotFound boundaries catch DataNotFoundError from:
598
- * - Loader execution
599
- * - Handler/component rendering
600
- *
601
- * @example
602
- * ```typescript
603
- * layout(<ShopLayout />, () => [
604
- * notFoundBoundary(<ProductNotFound />),
605
- * route("products.detail", ProductDetail),
606
- * ])
607
- *
608
- * // Or with handler for dynamic not found UI:
609
- * route("products.detail", ProductDetail, () => [
610
- * notFoundBoundary(({ notFound }) => (
611
- * <div>
612
- * <h2>Product not found</h2>
613
- * <p>{notFound.message}</p>
614
- * <a href="/products">Browse all products</a>
615
- * </div>
616
- * )),
617
- * ])
618
- * ```
619
- */
620
- const notFoundBoundary: RouteHelpers<any, any>["notFoundBoundary"] = (
621
- fallback
622
- ) => {
623
- const ctx = getContext().getStore();
624
- if (!ctx) throw new Error("notFoundBoundary() must be called inside map()");
625
-
626
- // Attach to parent entry in stack
627
- const parent = ctx.parent;
628
- if (!parent || !("notFoundBoundary" in parent)) {
629
- invariant(false, "No parent entry available for notFoundBoundary()");
630
- }
631
- const name = `$${getContext().getNextIndex("notFoundBoundary")}`;
632
- parent.notFoundBoundary.push(fallback);
633
- return { name, type: "notFoundBoundary" } as NotFoundBoundaryItem;
634
- };
635
-
636
- /**
637
- * When helper - defines a condition for intercept activation
638
- *
639
- * Only valid inside intercept() use() callback. The when() function
640
- * is captured by the intercept and stored in its `when` array.
641
- * During soft navigation, all when() conditions must return true
642
- * for the intercept to activate.
643
- */
644
- const when: RouteHelpers<any, any>["when"] = (fn) => {
645
- const ctx = getContext().getStore();
646
- if (!ctx) throw new Error("when() must be called inside intercept()");
647
-
648
- // The when() function needs to be captured by the intercept's tempParent
649
- // which should have a `when` array. If not present, we're not inside intercept()
650
- const parent = ctx.parent as any;
651
- if (!parent || !("when" in parent)) {
652
- invariant(
653
- false,
654
- "when() can only be used inside intercept() use() callback"
655
- );
656
- }
657
-
658
- const name = `$${getContext().getNextIndex("when")}`;
659
- parent.when.push(fn);
660
- return { name, type: "when" } as WhenItem;
661
- };
662
-
663
- /**
664
- * Cache helper - defines caching configuration for segments
665
- *
666
- * Creates a cache boundary that applies to all children unless overridden.
667
- * When used without children, attaches cache config to the parent entry
668
- * (e.g., for loader-specific caching).
669
- *
670
- * Supports three call signatures:
671
- * - cache() - no args, uses app-level defaults (for loader caching)
672
- * - cache(() => [...]) - wraps children with app-level defaults
673
- * - cache({ ttl: 60 }, () => [...]) - with explicit options
674
- */
675
- const cache: RouteHelpers<any, any>["cache"] = (
676
- optionsOrChildren?: PartialCacheOptions | false | (() => AllUseItems[]),
677
- maybeChildren?: () => AllUseItems[]
678
- ) => {
679
- const store = getContext();
680
- const ctx = store.getStore();
681
- if (!ctx) throw new Error("cache() must be called inside map()");
682
-
683
- // Handle overloaded signature: cache(), cache(children), or cache(options, children)
684
- let options: PartialCacheOptions | false;
685
- let children: (() => AllUseItems[]) | undefined;
686
-
687
- if (optionsOrChildren === undefined) {
688
- // cache() - no args, use defaults
689
- options = {};
690
- children = undefined;
691
- } else if (typeof optionsOrChildren === "function") {
692
- // cache(() => [...]) - use empty options (will use defaults)
693
- options = {};
694
- children = optionsOrChildren;
695
- } else {
696
- // cache(options, children) - explicit options
697
- options = optionsOrChildren;
698
- children = maybeChildren;
699
- }
700
-
701
- const name = `$${store.getNextIndex("cache")}`;
702
- const cacheConfig = { options };
703
-
704
- // If no children, create an orphan cache entry (like orphan layouts)
705
- // This allows cache() to wrap subsequent siblings
706
- if (!children) {
707
- const parent = ctx.parent as any;
708
-
709
- // Check if we're inside a loader() use() callback - special case for loader caching
710
- if (parent && parent.type === "loader") {
711
- // Direct assignment to loader entry's cache field
712
- parent.cache = cacheConfig;
713
- return { name, type: "cache" } as CacheItem;
714
- }
715
-
716
- // Create orphan cache entry (like orphan layout)
717
- // Subsequent siblings in the same array will attach to this entry
718
- const namespace = `${ctx.namespace}.${store.getNextIndex("cache")}`;
719
- const cacheUrlPrefix = getUrlPrefix();
720
-
721
- const entry = {
722
- id: namespace,
723
- shortCode: store.getShortCode("cache"),
724
- type: "cache",
725
- parent: parent, // link to current parent for hierarchy
726
- cache: cacheConfig,
727
- handler: RootLayout,
728
- middleware: [],
729
- revalidate: [],
730
- errorBoundary: [],
731
- notFoundBoundary: [],
732
- layout: [],
733
- parallel: [],
734
- intercept: [],
735
- loader: [],
736
- ...(cacheUrlPrefix ? { mountPath: cacheUrlPrefix } : {}),
737
- } as EntryData;
738
-
739
- // Attach to parent's layout array (cache entries are structural like layouts)
740
- if (parent && "layout" in parent) {
741
- parent.layout.push(entry);
742
- }
743
-
744
- // Update context parent so subsequent siblings attach to this cache entry
745
- // This makes cache() act as sugar for cache(() => [...])
746
- ctx.parent = entry;
747
-
748
- return { name: namespace, type: "cache" } as CacheItem;
749
- }
750
-
751
- // With children: create a cache entry (like layout with caching semantics)
752
- const cacheNextIndex = store.getNextIndex("cache");
753
- const namespace = `${ctx.namespace}.${cacheNextIndex}`;
754
- const cacheShortCode = store.getShortCode("cache");
755
-
756
- const cacheUrlPrefix2 = getUrlPrefix();
757
-
758
- const entry = {
759
- id: namespace,
760
- shortCode: cacheShortCode,
761
- type: "cache",
762
- parent: ctx.parent,
763
- cache: cacheConfig,
764
- // Cache entries render like layouts (with Outlet as default handler)
765
- handler: RootLayout, // RootLayout just renders <Outlet />
766
- middleware: [],
767
- revalidate: [],
768
- errorBoundary: [],
769
- notFoundBoundary: [],
770
- layout: [],
771
- parallel: [],
772
- intercept: [],
773
- loader: [],
774
- ...(cacheUrlPrefix2 ? { mountPath: cacheUrlPrefix2 } : {}),
775
- } as EntryData;
776
-
777
- // Run children with cache entry as parent
778
- const result = store.run(namespace, entry, children);
779
-
780
- invariant(
781
- Array.isArray(result) && result.every((item) => isValidUseItem(item)),
782
- `cache() children callback must return an array of use items [${namespace}]`
783
- );
784
-
785
- // Check if this cache has routes (including nested caches/layouts)
786
- const hasRoutes =
787
- result &&
788
- Array.isArray(result) &&
789
- result.some((item) => hasRoutesInItem(item));
790
-
791
- if (!hasRoutes) {
792
- const parent = ctx.parent;
793
- if (parent && "layout" in parent) {
794
- // Attach to parent's layout array (cache entries are structural like layouts)
795
- entry.parent = null;
796
- parent.layout.push(entry);
797
- }
798
- }
799
-
800
- return { name: namespace, type: "cache", uses: result } as CacheItem;
801
- };
802
-
803
- const middleware: RouteHelpers<any, any>["middleware"] = (...fn) => {
804
- const ctx = getContext().getStore();
805
- if (!ctx) throw new Error("middleware() must be called inside map()");
806
-
807
- // Attach to last entry in stack
808
- const parent = ctx.parent;
809
- if (!parent || !("middleware" in parent)) {
810
- invariant(false, "No parent entry available for middleware()");
811
- }
812
- const name = `$${getContext().getNextIndex("middleware")}`;
813
- parent.middleware.push(...fn);
814
- return { name, type: "middleware" } as MiddlewareItem;
815
- };
816
-
817
- const parallel: RouteHelpers<any, any>["parallel"] = (slots, use) => {
818
- const store = getContext();
819
- const ctx = store.getStore();
820
- if (!ctx) throw new Error("parallel() must be called inside map()");
821
-
822
- if (!ctx.parent || !ctx.parent?.parallel) {
823
- invariant(false, "No parent entry available for parallel()");
824
- }
825
-
826
- const namespace = `${ctx.namespace}.$${store.getNextIndex("parallel")}`;
827
-
828
- // Unwrap any static handler definitions in parallel slots
829
- const unwrappedSlots: Record<string, any> = {};
830
- let hasStaticSlot = false;
831
- for (const [slotName, slotHandler] of Object.entries(slots as Record<string, any>)) {
832
- if (isStaticHandler(slotHandler)) {
833
- hasStaticSlot = true;
834
- unwrappedSlots[slotName] = slotHandler.handler;
835
- } else {
836
- unwrappedSlots[slotName] = slotHandler;
837
- }
838
- }
839
-
840
- // Create full EntryData for parallel with its own loaders/revalidate/loading
841
- const parallelUrlPrefix = getUrlPrefix();
842
- const entry = {
843
- id: namespace,
844
- shortCode: store.getShortCode("parallel"),
845
- type: "parallel",
846
- parent: null, // Parallels don't participate in parent chain traversal
847
- handler: unwrappedSlots,
848
- loading: undefined, // Allow loading() to attach loading state
849
- middleware: [],
850
- revalidate: [],
851
- errorBoundary: [],
852
- notFoundBoundary: [],
853
- layout: [],
854
- parallel: [],
855
- intercept: [],
856
- loader: [],
857
- ...(parallelUrlPrefix ? { mountPath: parallelUrlPrefix } : {}),
858
- ...(hasStaticSlot ? { isStaticPrerender: true as const } : {}),
859
- } satisfies EntryData;
860
-
861
- // Run use callback if provided to collect loaders, revalidate, loading
862
- if (use && typeof use === "function") {
863
- const result = store.run(namespace, entry, use);
864
- invariant(
865
- Array.isArray(result) && result.every((item) => isValidUseItem(item)),
866
- `parallel() use() callback must return an array of use items [${namespace}]`
867
- );
868
- }
869
-
870
- ctx.parent.parallel.push(entry);
871
- return { name: namespace, type: "parallel" } as ParallelItem;
872
- };
873
-
874
- /**
875
- * Intercept helper - defines an intercepting route for soft navigation
876
- */
877
- const intercept: RouteHelpers<any, any>["intercept"] = (
878
- slotName,
879
- routeName,
880
- handler,
881
- use
882
- ) => {
883
- const store = getContext();
884
- const ctx = store.getStore();
885
- if (!ctx) throw new Error("intercept() must be called inside map()");
886
-
887
- if (!ctx.parent || !ctx.parent?.intercept) {
888
- invariant(false, "No parent entry available for intercept()");
889
- }
890
-
891
- const namespace = `${ctx.namespace}.$${store.getNextIndex("intercept")}.${slotName}`;
892
-
893
- // Apply name prefix to routeName (from include())
894
- // This ensures intercepts match prefixed route keys
895
- const namePrefix = getNamePrefix();
896
- const prefixedRouteName = namePrefix ? `${namePrefix}.${routeName}` : routeName;
897
-
898
- // Create intercept entry with its own loaders/revalidate/middleware/when
899
- const entry: InterceptEntry = {
900
- slotName: slotName as `@${string}`,
901
- routeName: prefixedRouteName,
902
- handler,
903
- middleware: [],
904
- revalidate: [],
905
- errorBoundary: [],
906
- notFoundBoundary: [],
907
- loader: [],
908
- when: [], // Selector conditions for conditional interception
909
- };
910
-
911
- // Run use callback if provided to collect loaders, revalidate, middleware, etc.
912
- if (use && typeof use === "function") {
913
- // Create a temporary parent context for the use() callback
914
- // so that middleware, loader, revalidate attach to the intercept entry
915
- const originalParent = ctx.parent;
916
-
917
- // Capture layouts in a temporary array
918
- const capturedLayouts: EntryData[] = [];
919
-
920
- const tempParent = {
921
- ...originalParent,
922
- middleware: entry.middleware,
923
- revalidate: entry.revalidate,
924
- errorBoundary: entry.errorBoundary,
925
- notFoundBoundary: entry.notFoundBoundary,
926
- loader: entry.loader,
927
- layout: capturedLayouts, // Capture layout() calls
928
- when: entry.when, // Capture when() conditions
929
- // Use getter/setter to capture loading on the entry
930
- get loading() {
931
- return entry.loading;
932
- },
933
- set loading(value: ReactNode | false | undefined) {
934
- entry.loading = value;
935
- },
936
- };
937
- ctx.parent = tempParent as EntryData;
938
-
939
- const result = use();
940
-
941
- // Restore original parent
942
- ctx.parent = originalParent;
943
-
944
- // Extract layout from captured layouts (use first one if multiple)
945
- // Layout inside intercept should always be ReactNode or Handler, not Record slots
946
- if (capturedLayouts.length > 0 && capturedLayouts[0].type === "layout") {
947
- entry.layout = capturedLayouts[0].handler as
948
- | ReactNode
949
- | Handler<any, any, any>;
950
- }
951
-
952
- invariant(
953
- Array.isArray(result) && result.every((item) => isValidUseItem(item)),
954
- `intercept() use() callback must return an array of use items [${namespace}]`
955
- );
956
- }
957
-
958
- ctx.parent.intercept.push(entry);
959
- return { name: namespace, type: "intercept" } as InterceptItem;
960
- };
961
-
962
- /**
963
- * Loader helper - attaches a loader to the current entry
964
- */
965
- const loaderFn: RouteHelpers<any, any>["loader"] = (loaderDef, use) => {
966
- const store = getContext();
967
- const ctx = store.getStore();
968
- if (!ctx) throw new Error("loader() must be called inside map()");
969
-
970
- // Attach to last entry in stack
971
- if (!ctx.parent || !ctx.parent?.loader) {
972
- invariant(false, "No parent entry available for loader()");
973
- }
974
-
975
- const name = `${ctx.namespace}.$${store.getNextIndex("loader")}`;
976
-
977
- // Create loader entry with empty revalidate array
978
- const loaderEntry = {
979
- loader: loaderDef,
980
- revalidate: [] as ShouldRevalidateFn<any, any>[],
981
- };
982
-
983
- // If use() callback provided, run it to collect revalidation rules
984
- if (use && typeof use === "function") {
985
- // Temporarily set context for revalidate() calls to target this loader
986
- const originalParent = ctx.parent;
987
- // Create a temporary "parent" that has the revalidate array we want to populate
988
- const tempParent = {
989
- ...originalParent,
990
- revalidate: loaderEntry.revalidate,
991
- };
992
- ctx.parent = tempParent as EntryData;
993
-
994
- const result = use();
995
-
996
- // Restore original parent
997
- ctx.parent = originalParent;
998
-
999
- invariant(
1000
- Array.isArray(result) && result.every((item) => isValidUseItem(item)),
1001
- `loader() use() callback must return an array of use items [${name}]`
1002
- );
1003
- }
1004
-
1005
- ctx.parent.loader.push(loaderEntry);
1006
- return { name, type: "loader" } as LoaderItem;
1007
- };
1008
-
1009
- /**
1010
- * Loading helper - attaches a loading component to the current entry
1011
- * Loading components are static (no context) and shown during navigation
1012
- */
1013
- const loadingFn: RouteHelpers<any, any>["loading"] = (component, options) => {
1014
- const store = getContext();
1015
- const ctx = store.getStore();
1016
- if (!ctx) throw new Error("loading() must be called inside map()");
1017
-
1018
- const parent = ctx.parent;
1019
- if (!parent || !("loading" in parent)) {
1020
- invariant(false, "No parent entry available for loading()");
1021
- }
1022
-
1023
- // If ssr: false and we're in SSR, set loading to false
1024
- if (options?.ssr === false && ctx.isSSR) {
1025
- parent.loading = false;
1026
- } else {
1027
- parent.loading = component;
1028
- }
1029
-
1030
- const name = `$${store.getNextIndex("loading")}`;
1031
- return { name, type: "loading" } as LoadingItem;
1032
- };
1033
-
1034
- const routeFn: RouteHelpers<any, any>["route"] = (name, handler, use) => {
1035
- const store = getContext();
1036
- const ctx = store.getStore();
1037
- if (!ctx) throw new Error("route() must be called inside map()");
1038
-
1039
- const namespace = `${ctx.namespace}.${store.getNextIndex("route")}.${name}`;
1040
-
1041
- const entry = {
1042
- id: namespace,
1043
- shortCode: store.getShortCode("route"),
1044
- type: "route",
1045
- parent: ctx.parent,
1046
- handler,
1047
- loading: undefined, // Allow loading() to attach loading state
1048
- middleware: [],
1049
- revalidate: [],
1050
- errorBoundary: [],
1051
- notFoundBoundary: [],
1052
- layout: [],
1053
- parallel: [],
1054
- intercept: [],
1055
- loader: [],
1056
- } satisfies EntryData;
1057
-
1058
- /* We will throw if user is registring same route name twice */
1059
- invariant(
1060
- ctx.manifest.get(name) === undefined,
1061
- `Duplicate route name: ${name} at ${namespace}`
1062
- );
1063
- /* Register route entry */
1064
- ctx.manifest.set(name, entry);
1065
- /* Run use and attach handlers */
1066
- if (use && typeof use === "function") {
1067
- const result = store.run(namespace, entry, use);
1068
- invariant(
1069
- Array.isArray(result) && result.every((item) => isValidUseItem(item)),
1070
- `route() use() callback must return an array of use items [${namespace}]`
1071
- );
1072
- return { name: namespace, type: "route", uses: result } as RouteItem;
1073
- }
1074
-
1075
- /* typesafe item */
1076
- return { name: namespace, type: "route" } as RouteItem;
1077
- };
1078
-
1079
- const layout: RouteHelpers<any, any>["layout"] = (handler, use) => {
1080
- const store = getContext();
1081
- const ctx = store.getStore();
1082
- if (!ctx) throw new Error("layout() must be called inside map()");
1083
- const isRoot = !ctx.parent || ctx.parent === null;
1084
- const nextIndex = isRoot ? "$root" : store.getNextIndex("layout");
1085
- const namespace = `${ctx.namespace}.${nextIndex}`;
1086
- const shortCode = store.getShortCode("layout");
1087
-
1088
- // Unwrap static handler definition, extract the actual handler function
1089
- const isStatic = isStaticHandler(handler);
1090
- const unwrappedHandler = isStatic ? handler.handler : handler;
1091
-
1092
- const urlPrefix = getUrlPrefix();
1093
- const entry = {
1094
- id: namespace,
1095
- shortCode,
1096
- type: "layout",
1097
- parent: ctx.parent,
1098
- handler: unwrappedHandler,
1099
- loading: undefined, // Allow loading() to attach loading state
1100
- middleware: [],
1101
- revalidate: [],
1102
- errorBoundary: [],
1103
- notFoundBoundary: [],
1104
- parallel: [],
1105
- intercept: [],
1106
- layout: [],
1107
- loader: [],
1108
- ...(urlPrefix ? { mountPath: urlPrefix } : {}),
1109
- ...(isStatic ? { isStaticPrerender: true as const } : {}),
1110
- } satisfies EntryData;
1111
-
1112
- // Run use callback if provided
1113
- let result: AllUseItems[] | undefined;
1114
- if (use && typeof use === "function") {
1115
- result = store.run(namespace, entry, use);
1116
-
1117
- invariant(
1118
- Array.isArray(result) && result.every((item) => isValidUseItem(item)),
1119
- `layout() use() callback must return an array of use items [${namespace}]`
1120
- );
1121
- }
1122
-
1123
- // Check if this is an orphan layout (no routes in children, including nested caches)
1124
- const hasRoutes =
1125
- result &&
1126
- Array.isArray(result) &&
1127
- result.some((item) => hasRoutesInItem(item));
1128
-
1129
- if (!hasRoutes) {
1130
- const parent = ctx.parent;
1131
-
1132
- // Allow orphan layouts at root level if they're part of map() builder result
1133
- if (!parent || parent === null) {
1134
- if (!isRoot) {
1135
- invariant(
1136
- false,
1137
- `Orphan layout cannot be used at non-root level without parent [${namespace}]`
1138
- );
1139
- }
1140
- // Root-level orphan is allowed (e.g., sibling layouts in map() builder)
1141
- } else {
1142
- // Has parent - register as orphan layout
1143
- invariant(
1144
- parent.type === "route" ||
1145
- parent.type === "layout" ||
1146
- parent.type === "cache",
1147
- `Orphan layouts can only be defined inside route or layout > check [${namespace}]`
1148
- );
1149
-
1150
- // Clear parent pointer for orphan layouts to prevent duplicate processing
1151
- entry.parent = null;
1152
- parent.layout.push(entry);
1153
- }
1154
- }
1155
-
1156
- if (result) {
1157
- return { name: namespace, type: "layout", uses: result } as LayoutItem;
1158
- }
1159
- return {
1160
- name: namespace,
1161
- type: "layout",
1162
- } as LayoutItem;
1163
- };
1164
-
1165
- const isValidUseItem = (item: any): item is AllUseItems | undefined | null => {
1166
- return (
1167
- typeof item === "undefined" ||
1168
- item === null ||
1169
- (item &&
1170
- typeof item === "object" &&
1171
- "type" in item &&
1172
- [
1173
- "layout",
1174
- "route",
1175
- "middleware",
1176
- "revalidate",
1177
- "parallel",
1178
- "intercept",
1179
- "loader",
1180
- "loading",
1181
- "errorBoundary",
1182
- "notFoundBoundary",
1183
- "when",
1184
- "cache",
1185
- "include", // For urls() include() helper
1186
- ].includes(item.type))
1187
- );
1188
- };
1189
-
1190
- const isOrphanLayout = (item: AllUseItems): boolean => {
1191
- return (
1192
- item.type === "layout" &&
1193
- !item.uses?.some((child) => hasRoutesInItem(child))
1194
- );
1195
- };
1196
-
1197
- /*
1198
- * Create revalidate helper
1199
- */
1200
- const createRevalidateHelper = <TEnv>(): RouteHelpers<
1201
- any,
1202
- TEnv
1203
- >["revalidate"] => {
1204
- return revalidate as RouteHelpers<any, TEnv>["revalidate"];
1205
- };
1206
-
1207
- /**
1208
- * Create errorBoundary helper
1209
- */
1210
- const createErrorBoundaryHelper = <TEnv>(): RouteHelpers<
1211
- any,
1212
- TEnv
1213
- >["errorBoundary"] => {
1214
- return errorBoundary as RouteHelpers<any, TEnv>["errorBoundary"];
1215
- };
1216
-
1217
- /**
1218
- * Create notFoundBoundary helper
1219
- */
1220
- const createNotFoundBoundaryHelper = <TEnv>(): RouteHelpers<
1221
- any,
1222
- TEnv
1223
- >["notFoundBoundary"] => {
1224
- return notFoundBoundary as RouteHelpers<any, TEnv>["notFoundBoundary"];
1225
- };
1226
-
1227
- /**
1228
- * Create middleware helper
1229
- */
1230
- const createMiddlewareHelper = <TEnv>(): RouteHelpers<
1231
- any,
1232
- TEnv
1233
- >["middleware"] => {
1234
- return middleware as RouteHelpers<any, TEnv>["middleware"];
1235
- };
1236
-
1237
- /**
1238
- * Create parallel helper
1239
- */
1240
- const createParallelHelper = <TEnv>(): RouteHelpers<any, TEnv>["parallel"] => {
1241
- return parallel as RouteHelpers<any, TEnv>["parallel"];
1242
- };
1243
-
1244
- /**
1245
- * Create intercept helper
1246
- */
1247
- const createInterceptHelper = <
1248
- const T extends RouteDefinition,
1249
- TEnv,
1250
- >(): RouteHelpers<T, TEnv>["intercept"] => {
1251
- return intercept as RouteHelpers<T, TEnv>["intercept"];
1252
- };
1253
-
1254
- /**
1255
- * Create loader helper
1256
- */
1257
- const createLoaderHelper = <TEnv>(): RouteHelpers<any, TEnv>["loader"] => {
1258
- return loaderFn as RouteHelpers<any, TEnv>["loader"];
1259
- };
1260
-
1261
- /**
1262
- * Create loading helper
1263
- */
1264
- const createLoadingHelper = (): RouteHelpers<any, any>["loading"] => {
1265
- return loadingFn;
1266
- };
1267
-
1268
- /**
1269
- * Create route helper
1270
- */
1271
- const createRouteHelper = <
1272
- const T extends RouteDefinition,
1273
- TEnv,
1274
- >(): RouteHelpers<T, TEnv>["route"] => {
1275
- return routeFn as unknown as RouteHelpers<T, TEnv>["route"];
1276
- };
1277
-
1278
- /**
1279
- * Create layout helper
1280
- */
1281
- const createLayoutHelper = <TEnv>(): RouteHelpers<any, TEnv>["layout"] => {
1282
- return layout as RouteHelpers<any, TEnv>["layout"];
1283
- };
1284
-
1285
- /**
1286
- * Create when helper for intercept conditions
1287
- */
1288
- const createWhenHelper = (): RouteHelpers<any, any>["when"] => {
1289
- return when;
1290
- };
1291
-
1292
- /**
1293
- * Create cache helper for cache configuration
1294
- */
1295
- const createCacheHelper = (): RouteHelpers<any, any>["cache"] => {
1296
- return cache;
1297
- };
1298
-
1299
- /**
1300
- * Branded type for route handlers that carries the route type info.
1301
- * This enables type-safe verification that imported handlers match route definitions.
1302
- */
1303
- export interface RouteHandlers<T extends RouteDefinition> {
1304
- (): Array<AllUseItems>;
1305
- /** Brand to carry route type info for type checking */
1306
- readonly __routes: T;
1307
- }
1308
-
1309
- /**
1310
- * Type-safe handler definition helper
1311
- *
1312
- */
1313
- export function map<const T extends RouteDefinition, TEnv = DefaultEnv>(
1314
- builder: (helpers: RouteHelpers<T, TEnv>) => Array<AllUseItems>
1315
- ): RouteHandlers<T> {
1316
- const handler = () => {
1317
- // Check if it's a builder function (array-based API)
1318
- invariant(
1319
- typeof builder === "function",
1320
- "map() expects a builder function as its argument"
1321
- );
1322
- // Create helpers
1323
- const helpers: RouteHelpers<T, TEnv> = {
1324
- route: createRouteHelper<T, TEnv>(),
1325
- layout: createLayoutHelper<TEnv>(),
1326
- parallel: createParallelHelper<TEnv>(),
1327
- intercept: createInterceptHelper<T, TEnv>(),
1328
- middleware: createMiddlewareHelper<TEnv>(),
1329
- revalidate: createRevalidateHelper<TEnv>(),
1330
- loader: createLoaderHelper<TEnv>(),
1331
- loading: createLoadingHelper(),
1332
- errorBoundary: createErrorBoundaryHelper<TEnv>(),
1333
- notFoundBoundary: createNotFoundBoundaryHelper<TEnv>(),
1334
- when: createWhenHelper(),
1335
- cache: createCacheHelper(),
1336
- };
1337
-
1338
- return [layout(RootLayout, () => builder(helpers))].flat(3);
1339
- };
1340
- // Cast to RouteHandlers to carry the route type brand
1341
- return handler as RouteHandlers<T>;
1342
- }
1343
-
1344
- /**
1345
- * Create RouteHelpers for inline route definitions
1346
- * Used internally by router.map() for inline handler syntax
1347
- */
1348
- export function createRouteHelpers<
1349
- T extends RouteDefinition,
1350
- TEnv,
1351
- >(): RouteHelpers<T, TEnv> {
1352
- return {
1353
- route: createRouteHelper<T, TEnv>(),
1354
- layout: createLayoutHelper<TEnv>(),
1355
- parallel: createParallelHelper<TEnv>(),
1356
- intercept: createInterceptHelper<T, TEnv>(),
1357
- middleware: createMiddlewareHelper<TEnv>(),
1358
- revalidate: createRevalidateHelper<TEnv>(),
1359
- loader: createLoaderHelper<TEnv>(),
1360
- loading: createLoadingHelper(),
1361
- errorBoundary: createErrorBoundaryHelper<TEnv>(),
1362
- notFoundBoundary: createNotFoundBoundaryHelper<TEnv>(),
1363
- when: createWhenHelper(),
1364
- cache: createCacheHelper(),
1365
- };
1366
- }
1367
-
1368
- /**
1369
- * Create a loader definition
1370
- *
1371
- * Loaders are RSC-compatible data fetchers that:
1372
- * - Run after middleware, before handlers
1373
- * - Are scoped to where attached (layout/route subtree)
1374
- * - Revalidate independently from UI segments
1375
- * - Are memoized per request (multiple ctx.use() calls return same value)
1376
- *
1377
- * Use the `"use server"` directive inside the loader function to ensure
1378
- * the function is stripped from client bundles.
1379
- *
1380
- * Return type is automatically inferred from the callback.
1381
- *
1382
- * @param fn - Async function that fetches data (should contain "use server" directive)
1383
- * @param fetchable - Optional flag to make the loader fetchable via useFetchLoader
1384
- *
1385
- * @example
1386
- * ```typescript
1387
- * // loaders/cart.ts - return type inferred from callback
1388
- * export const CartLoader = createLoader(async (ctx) => {
1389
- * "use server";
1390
- * const user = ctx.get("user");
1391
- * return await db.cart.get(user.id); // Return type inferred!
1392
- * });
1393
- *
1394
- * // loaders/product.ts - return type inferred
1395
- * export const ProductLoader = createLoader(async (ctx) => {
1396
- * "use server";
1397
- * const { slug } = ctx.params;
1398
- * return await db.products.findBySlug(slug); // Return type inferred!
1399
- * });
1400
- *
1401
- * // Usage in handlers
1402
- * layout(<ShopLayout />, () => [
1403
- * loader(CartLoader),
1404
- * loader(CartLoader, () => [
1405
- * revalidate(({ actionId }) => actionId?.includes("Cart") ?? false),
1406
- * ]),
1407
- * ])
1408
- *
1409
- * // Server-side access
1410
- * route("cart", (ctx) => {
1411
- * const cart = ctx.use(CartLoader);
1412
- * return <CartPage cart={cart} />;
1413
- * });
1414
- *
1415
- * // Client-side access
1416
- * const cart = useLoader(CartLoader);
1417
- * ```
1418
- */
1419
- // Re-export createLoader from loader.rsc.ts for RSC/server context
1420
- export { createLoader } from "./loader.rsc.js";
1421
-
1422
- /**
1423
- * Create a soft redirect Response for middleware short-circuit
1424
- *
1425
- * Returns a Response that signals a client-side navigation to the target URL.
1426
- * Unlike Response.redirect() which causes a full page reload, this redirect
1427
- * is handled by the router for SPA-style navigation.
1428
- *
1429
- * @param url - The URL to redirect to
1430
- * @param status - HTTP status code (default: 302)
1431
- *
1432
- * @example
1433
- * ```typescript
1434
- * middleware((ctx, next) => {
1435
- * if (!ctx.get('user')) {
1436
- * return redirect('/login');
1437
- * }
1438
- * next();
1439
- * })
1440
- * ```
1441
- */
1442
- export function redirect(url: string, status: number = 302): Response {
1443
- return new Response(null, {
1444
- status,
1445
- headers: {
1446
- Location: url,
1447
- "X-RSC-Redirect": "soft",
1448
- },
1449
- });
1450
- }
1
+ export * from "./route-definition/index.js";