@rangojs/router 0.0.0-experimental.6 → 0.0.0-experimental.60

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 (1105) hide show
  1. package/AGENTS.md +9 -0
  2. package/README.md +889 -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 +1688 -0
  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 +4778 -770
  798. package/dist/vite/index.js.map +1 -0
  799. package/dist/vite/index.named-routes.gen.ts +103 -0
  800. package/dist/vite/package-resolution.d.ts +43 -0
  801. package/dist/vite/package-resolution.d.ts.map +1 -0
  802. package/dist/vite/package-resolution.js +112 -0
  803. package/dist/vite/package-resolution.js.map +1 -0
  804. package/dist/vite/virtual-entries.d.ts +25 -0
  805. package/dist/vite/virtual-entries.d.ts.map +1 -0
  806. package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +16 -18
  807. package/dist/vite/virtual-entries.js.map +1 -0
  808. package/package.json +78 -59
  809. package/skills/breadcrumbs/SKILL.md +250 -0
  810. package/skills/cache-guide/SKILL.md +294 -0
  811. package/skills/caching/SKILL.md +93 -23
  812. package/skills/composability/SKILL.md +172 -0
  813. package/skills/debug-manifest/SKILL.md +12 -8
  814. package/skills/document-cache/SKILL.md +18 -16
  815. package/skills/fonts/SKILL.md +167 -0
  816. package/skills/hooks/SKILL.md +334 -72
  817. package/skills/host-router/SKILL.md +218 -0
  818. package/skills/intercept/SKILL.md +131 -8
  819. package/skills/layout/SKILL.md +100 -3
  820. package/skills/links/SKILL.md +92 -31
  821. package/skills/loader/SKILL.md +404 -44
  822. package/skills/middleware/SKILL.md +173 -34
  823. package/skills/mime-routes/SKILL.md +128 -0
  824. package/skills/parallel/SKILL.md +204 -1
  825. package/skills/prerender/SKILL.md +643 -0
  826. package/skills/rango/SKILL.md +85 -16
  827. package/skills/response-routes/SKILL.md +411 -0
  828. package/skills/route/SKILL.md +257 -14
  829. package/skills/router-setup/SKILL.md +210 -32
  830. package/skills/tailwind/SKILL.md +129 -0
  831. package/skills/theme/SKILL.md +9 -8
  832. package/skills/typesafety/SKILL.md +328 -89
  833. package/skills/use-cache/SKILL.md +324 -0
  834. package/src/__internal.ts +102 -4
  835. package/src/bin/rango.ts +321 -0
  836. package/src/browser/action-coordinator.ts +97 -0
  837. package/src/browser/action-response-classifier.ts +99 -0
  838. package/src/browser/app-version.ts +14 -0
  839. package/src/browser/event-controller.ts +92 -64
  840. package/src/browser/history-state.ts +80 -0
  841. package/src/browser/intercept-utils.ts +52 -0
  842. package/src/browser/link-interceptor.ts +24 -4
  843. package/src/browser/logging.ts +55 -0
  844. package/src/browser/merge-segment-loaders.ts +20 -12
  845. package/src/browser/navigation-bridge.ts +296 -558
  846. package/src/browser/navigation-client.ts +179 -69
  847. package/src/browser/navigation-store.ts +73 -55
  848. package/src/browser/navigation-transaction.ts +297 -0
  849. package/src/browser/network-error-handler.ts +61 -0
  850. package/src/browser/partial-update.ts +328 -313
  851. package/src/browser/prefetch/cache.ts +206 -0
  852. package/src/browser/prefetch/fetch.ts +150 -0
  853. package/src/browser/prefetch/observer.ts +65 -0
  854. package/src/browser/prefetch/policy.ts +48 -0
  855. package/src/browser/prefetch/queue.ts +160 -0
  856. package/src/browser/prefetch/resource-ready.ts +77 -0
  857. package/src/browser/rango-state.ts +112 -0
  858. package/src/browser/react/Link.tsx +230 -74
  859. package/src/browser/react/NavigationProvider.tsx +87 -11
  860. package/src/browser/react/context.ts +11 -0
  861. package/src/browser/react/filter-segment-order.ts +11 -0
  862. package/src/browser/react/index.ts +12 -12
  863. package/src/browser/react/location-state-shared.ts +95 -53
  864. package/src/browser/react/location-state.ts +60 -15
  865. package/src/browser/react/mount-context.ts +6 -1
  866. package/src/browser/react/nonce-context.ts +23 -0
  867. package/src/browser/react/shallow-equal.ts +27 -0
  868. package/src/browser/react/use-action.ts +29 -51
  869. package/src/browser/react/use-client-cache.ts +5 -3
  870. package/src/browser/react/use-handle.ts +32 -79
  871. package/src/browser/react/use-href.tsx +2 -2
  872. package/src/browser/react/use-link-status.ts +6 -5
  873. package/src/browser/react/use-navigation.ts +22 -63
  874. package/src/browser/react/use-params.ts +65 -0
  875. package/src/browser/react/use-pathname.ts +47 -0
  876. package/src/browser/react/use-router.ts +76 -0
  877. package/src/browser/react/use-search-params.ts +56 -0
  878. package/src/browser/react/use-segments.ts +80 -97
  879. package/src/browser/response-adapter.ts +73 -0
  880. package/src/browser/rsc-router.tsx +214 -58
  881. package/src/browser/scroll-restoration.ts +127 -52
  882. package/src/browser/segment-reconciler.ts +221 -0
  883. package/src/browser/segment-structure-assert.ts +16 -0
  884. package/src/browser/server-action-bridge.ts +510 -603
  885. package/src/browser/shallow.ts +6 -1
  886. package/src/browser/types.ts +141 -48
  887. package/src/browser/validate-redirect-origin.ts +29 -0
  888. package/src/build/generate-manifest.ts +238 -24
  889. package/src/build/generate-route-types.ts +39 -0
  890. package/src/build/index.ts +13 -0
  891. package/src/build/route-trie.ts +265 -0
  892. package/src/build/route-types/ast-helpers.ts +25 -0
  893. package/src/build/route-types/ast-route-extraction.ts +98 -0
  894. package/src/build/route-types/codegen.ts +102 -0
  895. package/src/build/route-types/include-resolution.ts +418 -0
  896. package/src/build/route-types/param-extraction.ts +48 -0
  897. package/src/build/route-types/per-module-writer.ts +128 -0
  898. package/src/build/route-types/router-processing.ts +618 -0
  899. package/src/build/route-types/scan-filter.ts +78 -0
  900. package/src/build/runtime-discovery.ts +231 -0
  901. package/src/cache/background-task.ts +34 -0
  902. package/src/cache/cache-key-utils.ts +44 -0
  903. package/src/cache/cache-policy.ts +125 -0
  904. package/src/cache/cache-runtime.ts +342 -0
  905. package/src/cache/cache-scope.ts +167 -309
  906. package/src/cache/cf/cf-cache-store.ts +571 -17
  907. package/src/cache/cf/index.ts +13 -3
  908. package/src/cache/document-cache.ts +116 -77
  909. package/src/cache/handle-capture.ts +81 -0
  910. package/src/cache/handle-snapshot.ts +41 -0
  911. package/src/cache/index.ts +1 -15
  912. package/src/cache/memory-segment-store.ts +191 -13
  913. package/src/cache/profile-registry.ts +73 -0
  914. package/src/cache/read-through-swr.ts +134 -0
  915. package/src/cache/segment-codec.ts +256 -0
  916. package/src/cache/taint.ts +153 -0
  917. package/src/cache/types.ts +72 -122
  918. package/src/client.rsc.tsx +3 -1
  919. package/src/client.tsx +106 -126
  920. package/src/component-utils.ts +4 -4
  921. package/src/components/DefaultDocument.tsx +5 -1
  922. package/src/context-var.ts +156 -0
  923. package/src/debug.ts +19 -9
  924. package/src/errors.ts +108 -2
  925. package/src/handle.ts +15 -29
  926. package/src/handles/MetaTags.tsx +73 -20
  927. package/src/handles/breadcrumbs.ts +66 -0
  928. package/src/handles/index.ts +1 -0
  929. package/src/handles/meta.ts +30 -13
  930. package/src/host/cookie-handler.ts +165 -0
  931. package/src/host/errors.ts +97 -0
  932. package/src/host/index.ts +53 -0
  933. package/src/host/pattern-matcher.ts +214 -0
  934. package/src/host/router.ts +352 -0
  935. package/src/host/testing.ts +79 -0
  936. package/src/host/types.ts +146 -0
  937. package/src/host/utils.ts +25 -0
  938. package/src/href-client.ts +119 -29
  939. package/src/index.rsc.ts +153 -19
  940. package/src/index.ts +211 -30
  941. package/src/internal-debug.ts +11 -0
  942. package/src/loader.rsc.ts +26 -147
  943. package/src/loader.ts +27 -10
  944. package/src/network-error-thrower.tsx +3 -1
  945. package/src/outlet-provider.tsx +45 -0
  946. package/src/prerender/param-hash.ts +37 -0
  947. package/src/prerender/store.ts +185 -0
  948. package/src/prerender.ts +463 -0
  949. package/src/reverse.ts +349 -0
  950. package/src/root-error-boundary.tsx +41 -29
  951. package/src/route-content-wrapper.tsx +7 -4
  952. package/src/route-definition/dsl-helpers.ts +959 -0
  953. package/src/route-definition/helper-factories.ts +200 -0
  954. package/src/route-definition/helpers-types.ts +431 -0
  955. package/src/route-definition/index.ts +52 -0
  956. package/src/route-definition/redirect.ts +101 -0
  957. package/src/route-definition.ts +1 -1428
  958. package/src/route-map-builder.ts +217 -123
  959. package/src/route-name.ts +53 -0
  960. package/src/route-types.ts +59 -8
  961. package/src/router/content-negotiation.ts +116 -0
  962. package/src/router/debug-manifest.ts +72 -0
  963. package/src/router/error-handling.ts +9 -9
  964. package/src/router/find-match.ts +160 -0
  965. package/src/router/handler-context.ts +418 -86
  966. package/src/router/intercept-resolution.ts +402 -0
  967. package/src/router/lazy-includes.ts +237 -0
  968. package/src/router/loader-resolution.ts +224 -124
  969. package/src/router/logging.ts +251 -0
  970. package/src/router/manifest.ts +154 -35
  971. package/src/router/match-api.ts +620 -0
  972. package/src/router/match-context.ts +5 -3
  973. package/src/router/match-handlers.ts +440 -0
  974. package/src/router/match-middleware/background-revalidation.ts +108 -93
  975. package/src/router/match-middleware/cache-lookup.ts +443 -10
  976. package/src/router/match-middleware/cache-store.ts +98 -26
  977. package/src/router/match-middleware/intercept-resolution.ts +57 -17
  978. package/src/router/match-middleware/segment-resolution.ts +27 -6
  979. package/src/router/match-pipelines.ts +10 -45
  980. package/src/router/match-result.ts +55 -33
  981. package/src/router/metrics.ts +240 -15
  982. package/src/router/middleware-cookies.ts +55 -0
  983. package/src/router/middleware-types.ts +220 -0
  984. package/src/router/middleware.ts +324 -369
  985. package/src/router/pattern-matching.ts +211 -43
  986. package/src/router/prerender-match.ts +402 -0
  987. package/src/router/preview-match.ts +170 -0
  988. package/src/router/revalidation.ts +137 -38
  989. package/src/router/router-context.ts +41 -21
  990. package/src/router/router-interfaces.ts +473 -0
  991. package/src/router/router-options.ts +618 -0
  992. package/src/router/router-registry.ts +24 -0
  993. package/src/router/segment-resolution/fresh.ts +691 -0
  994. package/src/router/segment-resolution/helpers.ts +268 -0
  995. package/src/router/segment-resolution/loader-cache.ts +199 -0
  996. package/src/router/segment-resolution/revalidation.ts +1306 -0
  997. package/src/router/segment-resolution/static-store.ts +67 -0
  998. package/src/router/segment-resolution.ts +21 -0
  999. package/src/router/segment-wrappers.ts +291 -0
  1000. package/src/router/telemetry-otel.ts +299 -0
  1001. package/src/router/telemetry.ts +300 -0
  1002. package/src/router/timeout.ts +148 -0
  1003. package/src/router/trie-matching.ts +239 -0
  1004. package/src/router/types.ts +78 -3
  1005. package/src/router.ts +703 -4183
  1006. package/src/rsc/handler-context.ts +45 -0
  1007. package/src/rsc/handler.ts +775 -756
  1008. package/src/rsc/helpers.ts +140 -6
  1009. package/src/rsc/index.ts +0 -20
  1010. package/src/rsc/loader-fetch.ts +209 -0
  1011. package/src/rsc/manifest-init.ts +90 -0
  1012. package/src/rsc/nonce.ts +14 -0
  1013. package/src/rsc/origin-guard.ts +141 -0
  1014. package/src/rsc/progressive-enhancement.ts +383 -0
  1015. package/src/rsc/response-error.ts +37 -0
  1016. package/src/rsc/response-route-handler.ts +347 -0
  1017. package/src/rsc/rsc-rendering.ts +242 -0
  1018. package/src/rsc/runtime-warnings.ts +42 -0
  1019. package/src/rsc/server-action.ts +350 -0
  1020. package/src/rsc/ssr-setup.ts +128 -0
  1021. package/src/rsc/types.ts +45 -11
  1022. package/src/search-params.ts +230 -0
  1023. package/src/segment-system.tsx +166 -18
  1024. package/src/server/context.ts +302 -58
  1025. package/src/server/cookie-store.ts +190 -0
  1026. package/src/server/fetchable-loader-store.ts +37 -0
  1027. package/src/server/handle-store.ts +94 -15
  1028. package/src/server/loader-registry.ts +24 -64
  1029. package/src/server/request-context.ts +482 -78
  1030. package/src/server.ts +35 -128
  1031. package/src/ssr/index.tsx +103 -30
  1032. package/src/static-handler.ts +114 -0
  1033. package/src/theme/ThemeProvider.tsx +21 -15
  1034. package/src/theme/ThemeScript.tsx +5 -5
  1035. package/src/theme/constants.ts +5 -2
  1036. package/src/theme/index.ts +4 -14
  1037. package/src/theme/theme-context.ts +4 -30
  1038. package/src/theme/theme-script.ts +21 -18
  1039. package/src/types/boundaries.ts +158 -0
  1040. package/src/types/cache-types.ts +198 -0
  1041. package/src/types/error-types.ts +192 -0
  1042. package/src/types/global-namespace.ts +100 -0
  1043. package/src/types/handler-context.ts +781 -0
  1044. package/src/types/index.ts +88 -0
  1045. package/src/types/loader-types.ts +182 -0
  1046. package/src/types/route-config.ts +170 -0
  1047. package/src/types/route-entry.ts +109 -0
  1048. package/src/types/segments.ts +150 -0
  1049. package/src/types.ts +1 -1623
  1050. package/src/urls/include-helper.ts +197 -0
  1051. package/src/urls/index.ts +53 -0
  1052. package/src/urls/path-helper-types.ts +339 -0
  1053. package/src/urls/path-helper.ts +329 -0
  1054. package/src/urls/pattern-types.ts +107 -0
  1055. package/src/urls/response-types.ts +106 -0
  1056. package/src/urls/type-extraction.ts +372 -0
  1057. package/src/urls/urls-function.ts +98 -0
  1058. package/src/urls.ts +1 -802
  1059. package/src/use-loader.tsx +85 -77
  1060. package/src/vite/discovery/bundle-postprocess.ts +184 -0
  1061. package/src/vite/discovery/discover-routers.ts +348 -0
  1062. package/src/vite/discovery/prerender-collection.ts +385 -0
  1063. package/src/vite/discovery/route-types-writer.ts +258 -0
  1064. package/src/vite/discovery/self-gen-tracking.ts +47 -0
  1065. package/src/vite/discovery/state.ts +108 -0
  1066. package/src/vite/discovery/virtual-module-codegen.ts +203 -0
  1067. package/src/vite/index.ts +11 -782
  1068. package/src/vite/plugin-types.ts +48 -0
  1069. package/src/vite/plugins/cjs-to-esm.ts +93 -0
  1070. package/src/vite/plugins/client-ref-dedup.ts +115 -0
  1071. package/src/vite/plugins/client-ref-hashing.ts +105 -0
  1072. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -53
  1073. package/src/vite/plugins/expose-id-utils.ts +287 -0
  1074. package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
  1075. package/src/vite/plugins/expose-ids/handler-transform.ts +179 -0
  1076. package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
  1077. package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
  1078. package/src/vite/plugins/expose-ids/types.ts +45 -0
  1079. package/src/vite/plugins/expose-internal-ids.ts +569 -0
  1080. package/src/vite/plugins/performance-tracks.ts +88 -0
  1081. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1082. package/src/vite/plugins/use-cache-transform.ts +323 -0
  1083. package/src/vite/plugins/version-injector.ts +83 -0
  1084. package/src/vite/plugins/version-plugin.ts +266 -0
  1085. package/src/vite/plugins/virtual-entries.ts +123 -0
  1086. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  1087. package/src/vite/rango.ts +461 -0
  1088. package/src/vite/router-discovery.ts +777 -0
  1089. package/src/vite/utils/ast-handler-extract.ts +517 -0
  1090. package/src/vite/utils/banner.ts +36 -0
  1091. package/src/vite/utils/bundle-analysis.ts +137 -0
  1092. package/src/vite/utils/manifest-utils.ts +70 -0
  1093. package/src/vite/{package-resolution.ts → utils/package-resolution.ts} +25 -29
  1094. package/src/vite/utils/prerender-utils.ts +189 -0
  1095. package/src/vite/utils/shared-utils.ts +170 -0
  1096. package/CLAUDE.md +0 -43
  1097. package/src/browser/lru-cache.ts +0 -69
  1098. package/src/browser/request-controller.ts +0 -164
  1099. package/src/cache/memory-store.ts +0 -253
  1100. package/src/href.ts +0 -255
  1101. package/src/server/route-manifest-cache.ts +0 -173
  1102. package/src/vite/expose-handle-id.ts +0 -209
  1103. package/src/vite/expose-loader-id.ts +0 -426
  1104. package/src/vite/expose-location-state-id.ts +0 -177
  1105. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
package/src/types.ts CHANGED
@@ -1,1623 +1 @@
1
- import type { ReactNode } from "react";
2
- import type { AllUseItems } from "./route-types.js";
3
- import type { Handle } from "./handle.js";
4
- import type { MiddlewareFn } from "./router/middleware.js";
5
- import type { Theme } from "./theme/types.js";
6
- import type { ScopedHrefFunction } from "./href.js";
7
-
8
- // Re-export MiddlewareFn for internal/advanced use
9
- export type { MiddlewareFn } from "./router/middleware.js";
10
-
11
- /**
12
- * Props for the Document component that wraps the entire application.
13
- */
14
- export type DocumentProps = {
15
- children: ReactNode;
16
- };
17
-
18
- /**
19
- * Global namespace for module augmentation
20
- *
21
- * Users can augment this to provide type-safe context globally:
22
- *
23
- * @example
24
- * ```typescript
25
- * // In router.tsx or env.d.ts
26
- * declare global {
27
- * namespace RSCRouter {
28
- * interface Env extends RouterEnv<AppBindings, AppVariables> {}
29
- * }
30
- * }
31
- *
32
- * // Now all handlers have type-safe context without imports!
33
- * export default map<typeof shopRoutes>({
34
- * [middleware('*', 'auth')]: [
35
- * (ctx, next) => {
36
- * ctx.set('user', ...) // Type-safe!
37
- * }
38
- * ]
39
- * })
40
- * ```
41
- */
42
- declare global {
43
- namespace RSCRouter {
44
- // eslint-disable-next-line @typescript-eslint/no-empty-interface
45
- interface Env {
46
- // Empty by default - users augment with their RouterEnv
47
- }
48
-
49
- // eslint-disable-next-line @typescript-eslint/no-empty-interface
50
- interface RegisteredRoutes {
51
- // Empty by default - users augment with their merged route maps for type-safe href()
52
- }
53
- }
54
- }
55
-
56
- /**
57
- * Get registered routes or fallback to generic Record<string, string>
58
- * When RSCRouter.RegisteredRoutes is augmented, provides autocomplete for route names
59
- * When not augmented, allows any string (no autocomplete)
60
- */
61
- export type GetRegisteredRoutes = keyof RSCRouter.RegisteredRoutes extends never
62
- ? Record<string, string>
63
- : RSCRouter.RegisteredRoutes;
64
-
65
- /**
66
- * Default environment type - uses global augmentation if available, any otherwise
67
- */
68
- export type DefaultEnv = keyof RSCRouter.Env extends never ? any : RSCRouter.Env;
69
-
70
- /**
71
- * Router environment (Hono-inspired type-safe context)
72
- *
73
- * @template TBindings - Platform bindings (DB, KV, secrets, etc.)
74
- * @template TVariables - Middleware-injected variables (user, permissions, etc.)
75
- *
76
- * @example
77
- * ```typescript
78
- * interface AppBindings {
79
- * DB: D1Database;
80
- * KV: KVNamespace;
81
- * STRIPE_KEY: string;
82
- * }
83
- *
84
- * interface AppVariables {
85
- * user?: { id: string; name: string };
86
- * permissions?: string[];
87
- * }
88
- *
89
- * type AppEnv = RouterEnv<AppBindings, AppVariables>;
90
- * const router = createRouter<AppEnv>();
91
- * ```
92
- */
93
- export interface RouterEnv<TBindings = {}, TVariables = {}> {
94
- Bindings: TBindings;
95
- Variables: TVariables;
96
- }
97
-
98
- /**
99
- * Parse constraint values into a union type
100
- * "a|b|c" → "a" | "b" | "c"
101
- */
102
- type ParseConstraint<T extends string> =
103
- T extends `${infer First}|${infer Rest}`
104
- ? First | ParseConstraint<Rest>
105
- : T;
106
-
107
- /**
108
- * Extract param info from a param segment
109
- *
110
- * Handles:
111
- * - :param → { name: "param", optional: false, type: string }
112
- * - :param? → { name: "param", optional: true, type: string }
113
- * - :param(a|b) → { name: "param", optional: false, type: "a" | "b" }
114
- * - :param(a|b)? → { name: "param", optional: true, type: "a" | "b" }
115
- */
116
- type ExtractParamInfo<T extends string> =
117
- // Optional + constrained: :param(a|b)?
118
- T extends `${infer Name}(${infer Constraint})?`
119
- ? { name: Name; optional: true; type: ParseConstraint<Constraint> }
120
- // Constrained only: :param(a|b)
121
- : T extends `${infer Name}(${infer Constraint})`
122
- ? { name: Name; optional: false; type: ParseConstraint<Constraint> }
123
- // Optional only: :param?
124
- : T extends `${infer Name}?`
125
- ? { name: Name; optional: true; type: string }
126
- // Required: :param
127
- : { name: T; optional: false; type: string };
128
-
129
- /**
130
- * Build param object from info
131
- */
132
- type ParamFromInfo<Info> =
133
- Info extends { name: infer N extends string; optional: true; type: infer V }
134
- ? { [K in N]?: V }
135
- : Info extends { name: infer N extends string; optional: false; type: infer V }
136
- ? { [K in N]: V }
137
- : never;
138
-
139
- /**
140
- * Merge two param objects preserving optionality
141
- * Uses Pick to preserve the modifiers from source types
142
- */
143
- type MergeParams<A, B> = Pick<A, keyof A> & Pick<B, keyof B> extends infer O
144
- ? { [K in keyof O]: O[K] }
145
- : never;
146
-
147
- /**
148
- * Extract route params from a pattern with depth limit to prevent infinite recursion
149
- *
150
- * Supports:
151
- * - Required params: /:slug → { slug: string }
152
- * - Optional params: /:locale? → { locale?: string }
153
- * - Constrained params: /:locale(en|gb) → { locale: "en" | "gb" }
154
- * - Optional + constrained: /:locale(en|gb)? → { locale?: "en" | "gb" }
155
- *
156
- * @example
157
- * ExtractParams<"/products/:id"> // { id: string }
158
- * ExtractParams<"/:locale?/blog/:slug"> // { locale?: string; slug: string }
159
- * ExtractParams<"/:locale(en|gb)/blog"> // { locale: "en" | "gb" }
160
- * ExtractParams<"/:locale(en|gb)?/blog/:slug"> // { locale?: "en" | "gb"; slug: string }
161
- */
162
- export type ExtractParams<
163
- T extends string,
164
- Depth extends readonly unknown[] = []
165
- > = Depth['length'] extends 10
166
- ? { [key: string]: string | undefined } // Fallback to generic params if too deep
167
- // Match param with remaining path: :param.../rest
168
- : T extends `${infer _Start}:${infer Param}/${infer Rest}`
169
- ? MergeParams<
170
- ParamFromInfo<ExtractParamInfo<Param>>,
171
- ExtractParams<`/${Rest}`, readonly [...Depth, unknown]>
172
- >
173
- // Match param at end: :param...
174
- : T extends `${infer _Start}:${infer Param}`
175
- ? ParamFromInfo<ExtractParamInfo<Param>>
176
- : {};
177
-
178
- /**
179
- * Route definition - maps route names to patterns
180
- */
181
- /**
182
- * Trailing slash handling mode
183
- * - "never": Redirect URLs with trailing slash to without
184
- * - "always": Redirect URLs without trailing slash to with
185
- * - "ignore": Match both with and without trailing slash
186
- */
187
- export type TrailingSlashMode = "never" | "always" | "ignore";
188
-
189
- /**
190
- * Route configuration object (alternative to string path)
191
- */
192
- export type RouteConfig = {
193
- path: string;
194
- trailingSlash?: TrailingSlashMode;
195
- };
196
-
197
- /**
198
- * Route definition options (global defaults)
199
- */
200
- export type RouteDefinitionOptions = {
201
- trailingSlash?: TrailingSlashMode;
202
- };
203
-
204
- export type RouteDefinition = {
205
- [key: string]: string | RouteConfig | RouteDefinition;
206
- };
207
-
208
- /**
209
- * Recursively flatten nested routes with depth limit to prevent infinite recursion
210
- * Transforms: { products: { detail: "/product/:slug" } } => { "products.detail": "/product/:slug" }
211
- * Also handles RouteConfig objects: { api: { path: "/api" } } => { "api": "/api" }
212
- */
213
- type FlattenRoutes<
214
- T extends RouteDefinition,
215
- Prefix extends string = "",
216
- Depth extends readonly unknown[] = []
217
- > = Depth['length'] extends 5
218
- ? never
219
- : {
220
- [K in keyof T]: T[K] extends string
221
- ? Record<`${Prefix}${K & string}`, T[K]>
222
- : T[K] extends RouteConfig
223
- ? Record<`${Prefix}${K & string}`, T[K]['path']>
224
- : T[K] extends RouteDefinition
225
- ? FlattenRoutes<T[K], `${Prefix}${K & string}.`, readonly [...Depth, unknown]>
226
- : never;
227
- }[keyof T];
228
-
229
- /**
230
- * Union to intersection helper
231
- */
232
- type UnionToIntersection<U> = (
233
- U extends unknown ? (k: U) => void : never
234
- ) extends (k: infer I) => void
235
- ? I
236
- : never;
237
-
238
- /**
239
- * Resolved route map - flattened route definitions with full paths
240
- */
241
- export type ResolvedRouteMap<T extends RouteDefinition> = UnionToIntersection<FlattenRoutes<T>>;
242
-
243
- /**
244
- * Handler function that receives context and returns React content or a Response
245
- *
246
- * @template T - Params object OR path pattern string
247
- * @template TEnv - Environment type
248
- *
249
- * @example
250
- * ```typescript
251
- * // With explicit params object
252
- * const handler: Handler<{ id: string }> = (ctx) => {
253
- * ctx.params.id // string
254
- * }
255
- *
256
- * // With path pattern - params extracted automatically
257
- * const handler: Handler<"/product/:id"> = (ctx) => {
258
- * ctx.params.id // string
259
- * }
260
- * ```
261
- */
262
- export type Handler<T = {}, TEnv = DefaultEnv> = (
263
- ctx: HandlerContext<T extends string ? ExtractParams<T> : T, TEnv>
264
- ) => ReactNode | Promise<ReactNode> | Response | Promise<Response>;
265
-
266
- /**
267
- * Context passed to handlers (Hono-inspired type-safe context)
268
- *
269
- * Provides type-safe access to:
270
- * - Route params (from URL pattern)
271
- * - Request data (request, searchParams, pathname, url)
272
- * - Platform bindings (env.DB, env.KV, env.SECRETS)
273
- * - Middleware variables (var.user, var.permissions)
274
- * - Getter/setter for variables (get('user'), set('user', ...))
275
- *
276
- * **Note:** System parameters (query params starting with `_rsc`) are automatically
277
- * filtered from `url`, `searchParams`, and `request.url` for cleaner access.
278
- *
279
- * @example
280
- * ```typescript
281
- * const handler = (ctx: HandlerContext<{ slug: string }, AppEnv>) => {
282
- * ctx.params.slug // Route param (string)
283
- * ctx.env.DB // Binding (D1Database)
284
- * ctx.var.user // Variable (User | undefined)
285
- * ctx.get('user') // Alternative getter
286
- * ctx.set('user', {...}) // Setter
287
- * ctx.url // Clean URL (no _rsc* params)
288
- * ctx.searchParams // Clean params (no _rsc* params)
289
- * }
290
- * ```
291
- */
292
- export type HandlerContext<TParams = {}, TEnv = DefaultEnv> = {
293
- /**
294
- * Route parameters extracted from the URL pattern.
295
- * Type-safe when using Handler<"/path/:param"> or Handler<{ param: string }>.
296
- */
297
- params: TParams;
298
- /**
299
- * The incoming Request object.
300
- * System params (`_rsc*`) are filtered from the URL for cleaner access.
301
- */
302
- request: Request;
303
- /**
304
- * Query parameters from the URL (system params like `_rsc*` are filtered).
305
- * Use for user-facing query strings only.
306
- */
307
- searchParams: URLSearchParams;
308
- /**
309
- * The pathname portion of the request URL.
310
- */
311
- pathname: string;
312
- /**
313
- * The full URL object (with system params filtered).
314
- */
315
- url: URL;
316
- /**
317
- * Platform bindings (DB, KV, secrets, etc.) from RouterEnv.
318
- * Access resources like `ctx.env.DB`, `ctx.env.KV`.
319
- */
320
- env: TEnv extends RouterEnv<infer B, any> ? B : {};
321
- /**
322
- * Middleware-injected variables from RouterEnv.
323
- * Access values like `ctx.var.user`, `ctx.var.permissions`.
324
- */
325
- var: TEnv extends RouterEnv<any, infer V> ? V : {};
326
- /**
327
- * Type-safe getter for middleware variables.
328
- * Alternative to `ctx.var.key` with better autocomplete.
329
- *
330
- * @example
331
- * ```typescript
332
- * const user = ctx.get("user"); // Type-safe!
333
- * ```
334
- */
335
- get: TEnv extends RouterEnv<any, infer V>
336
- ? <K extends keyof V>(key: K) => V[K]
337
- : (key: string) => any;
338
- /**
339
- * Type-safe setter for middleware variables.
340
- * Use in middleware to pass data to handlers.
341
- *
342
- * @example
343
- * ```typescript
344
- * ctx.set("user", { id: "123", name: "John" }); // Type-safe!
345
- * ```
346
- */
347
- set: TEnv extends RouterEnv<any, infer V>
348
- ? <K extends keyof V>(key: K, value: V[K]) => void
349
- : (key: string, value: any) => void;
350
- /**
351
- * Stub response for setting headers/cookies.
352
- * Headers set here are merged into the final response.
353
- *
354
- * @example
355
- * ```typescript
356
- * route("product", (ctx) => {
357
- * ctx.res.headers.set("Cache-Control", "s-maxage=60");
358
- * return <ProductPage />;
359
- * });
360
- * ```
361
- */
362
- res: Response;
363
- /**
364
- * Shorthand for ctx.res.headers - response headers.
365
- * Headers set here are merged into the final response.
366
- *
367
- * @example
368
- * ```typescript
369
- * route("product", (ctx) => {
370
- * ctx.headers.set("Cache-Control", "s-maxage=60");
371
- * return <ProductPage />;
372
- * });
373
- * ```
374
- */
375
- headers: Headers;
376
- /**
377
- * Access loader data or push handle data.
378
- *
379
- * For loaders: Returns a promise that resolves to the loader data.
380
- * Loaders are executed in parallel and memoized per request.
381
- *
382
- * For handles: Returns a push function to add data for this segment.
383
- * Handle data accumulates across all matched route segments.
384
- * Push accepts: direct value, Promise, or async callback (executed immediately).
385
- *
386
- * @example
387
- * ```typescript
388
- * // Loader usage
389
- * route("cart", async (ctx) => {
390
- * const cart = await ctx.use(CartLoader);
391
- * return <CartPage cart={cart} />;
392
- * });
393
- *
394
- * // Handle usage - direct value
395
- * route("shop", (ctx) => {
396
- * const push = ctx.use(Breadcrumbs);
397
- * push({ label: "Shop", href: "/shop" });
398
- * return <ShopPage />;
399
- * });
400
- *
401
- * // Handle usage - Promise
402
- * route("product", (ctx) => {
403
- * const push = ctx.use(Breadcrumbs);
404
- * push(fetchProductBreadcrumb(ctx.params.id));
405
- * return <ProductPage />;
406
- * });
407
- *
408
- * // Handle usage - async callback (executed immediately)
409
- * route("product", (ctx) => {
410
- * const push = ctx.use(Breadcrumbs);
411
- * push(async () => {
412
- * const product = await db.getProduct(ctx.params.id);
413
- * return { label: product.name, href: `/product/${product.id}` };
414
- * });
415
- * return <ProductPage />;
416
- * });
417
- * ```
418
- */
419
- use: {
420
- <T, TLoaderParams = any>(loader: LoaderDefinition<T, TLoaderParams>): Promise<T>;
421
- <TData, TAccumulated = TData[]>(handle: Handle<TData, TAccumulated>): (
422
- data: TData | Promise<TData> | (() => Promise<TData>)
423
- ) => void;
424
- };
425
- /**
426
- * Current theme (from cookie or default).
427
- * Only available when theme is enabled in router config.
428
- *
429
- * @example
430
- * ```typescript
431
- * route("settings", (ctx) => {
432
- * const currentTheme = ctx.theme; // "light" | "dark" | "system" | undefined
433
- * return <SettingsPage theme={currentTheme} />;
434
- * });
435
- * ```
436
- */
437
- theme?: Theme;
438
- /**
439
- * Set the theme (only available when theme is enabled in router config).
440
- * Sets a cookie with the new theme value.
441
- *
442
- * @example
443
- * ```typescript
444
- * route("settings", async (ctx) => {
445
- * if (ctx.request.method === "POST") {
446
- * const formData = await ctx.request.formData();
447
- * const newTheme = formData.get("theme") as Theme;
448
- * ctx.setTheme?.(newTheme);
449
- * }
450
- * return <SettingsPage />;
451
- * });
452
- * ```
453
- */
454
- setTheme?: (theme: Theme) => void;
455
- /**
456
- * Generate URLs from route names.
457
- *
458
- * **Recommended: Use route names for type safety.**
459
- * Route names validate both the route exists and params are correct.
460
- * Path-based URLs (`/...`) are an escape hatch with no validation.
461
- *
462
- * @example
463
- * ```typescript
464
- * // RECOMMENDED: Use route names for type safety
465
- * ctx.href("shop.cart") // ✓ Validates route exists
466
- * ctx.href("blog.post", { slug: "hello" }) // ✓ Validates route + params
467
- *
468
- * // ESCAPE HATCH: Path-based URLs (no validation)
469
- * ctx.href("/about") // ⚠ No type checking
470
- * ```
471
- */
472
- href: ScopedHrefFunction<GetRegisteredRoutes>;
473
- };
474
-
475
- /**
476
- * Internal handler context with additional props for router internals.
477
- * Use `HandlerContext` for user-facing code.
478
- * @internal
479
- */
480
- export type InternalHandlerContext<TParams = {}, TEnv = DefaultEnv> = HandlerContext<TParams, TEnv> & {
481
- /** Raw request with all system parameters intact. */
482
- _originalRequest: Request;
483
- /** Current segment ID for handle data attribution. */
484
- _currentSegmentId?: string;
485
- };
486
-
487
- /**
488
- * Generic params type - flexible object with string keys
489
- * Users can narrow this by explicitly typing their params:
490
- *
491
- * @example
492
- * ```typescript
493
- * [revalidate('post')]: (({ currentParams, nextParams }: RevalidateParams<{ slug: string }>) => {
494
- * currentParams.slug // typed as string
495
- * return currentParams.slug !== nextParams.slug;
496
- * })
497
- * ```
498
- */
499
- export type GenericParams = { [key: string]: string | undefined };
500
-
501
- /**
502
- * Helper type for revalidation handler params
503
- * Allows inline type annotation for stricter param typing
504
- *
505
- * @example
506
- * ```typescript
507
- * [revalidate('post')]: (params: RevalidateParams<{ slug: string }>) => {
508
- * params.currentParams.slug // typed as string
509
- * return params.defaultShouldRevalidate;
510
- * }
511
- * ```
512
- */
513
- export type RevalidateParams<TParams = GenericParams, TEnv = any> = Parameters<ShouldRevalidateFn<TParams, TEnv>>[0];
514
-
515
- /**
516
- * Should revalidate function signature (inspired by React Router)
517
- *
518
- * Determines whether a route segment should re-render during partial navigation.
519
- * Multiple revalidation functions can be defined per route - they execute in order.
520
- *
521
- * **Return Types:**
522
- * - `boolean` - Hard decision: immediately returns this value (short-circuits)
523
- * - `{ defaultShouldRevalidate: boolean }` - Soft decision: updates suggestion for next revalidator
524
- *
525
- * **Execution Flow:**
526
- * 1. Start with built-in `defaultShouldRevalidate` (true if params changed)
527
- * 2. Execute global revalidators first, then route-specific
528
- * 3. Hard decision (boolean): stop immediately and use that value
529
- * 4. Soft decision (object): update suggestion and continue to next revalidator
530
- * 5. If all return soft decisions: use the final suggestion
531
- *
532
- * @param args.currentParams - Previous route params (generic by default, can be narrowed)
533
- * @param args.currentUrl - Previous URL
534
- * @param args.nextParams - Next route params (generic by default, can be narrowed)
535
- * @param args.nextUrl - Next URL
536
- * @param args.defaultShouldRevalidate - Current suggestion (updated by soft decisions)
537
- * @param args.context - App context (db, user, etc.)
538
- * @param args.actionResult - Result from action (future support)
539
- * @param args.formData - Form data from action (future support)
540
- * @param args.formMethod - HTTP method from action (future support)
541
- *
542
- * @returns Hard decision (boolean) or soft suggestion (object)
543
- *
544
- * @example
545
- * ```typescript
546
- * // Hard decision - definitive answer
547
- * [revalidate('post')]: ({ currentParams, nextParams }) => {
548
- * return currentParams.slug !== nextParams.slug; // boolean - short-circuits
549
- * }
550
- *
551
- * // Soft decision - allows downstream revalidators to override
552
- * [revalidate('*', 'global')]: ({ defaultShouldRevalidate }) => {
553
- * return { defaultShouldRevalidate: true }; // object - continues to next
554
- * }
555
- *
556
- * // Explicit typing for stricter params
557
- * [revalidate('post')]: ((params: RevalidateParams<{ slug: string }>) => {
558
- * return params.currentParams.slug !== params.nextParams.slug;
559
- * })
560
- * ```
561
- */
562
- export type ShouldRevalidateFn<TParams = GenericParams, TEnv = any> = (args: {
563
- currentParams: TParams;
564
- currentUrl: URL;
565
- nextParams: TParams;
566
- nextUrl: URL;
567
- defaultShouldRevalidate: boolean;
568
- context: HandlerContext<TParams, TEnv>;
569
- // Segment metadata (which segment is being evaluated):
570
- segmentType: 'layout' | 'route' | 'parallel';
571
- layoutName?: string; // Layout name (e.g., "root", "shop", "auth") - only for layouts
572
- slotName?: string; // Slot name (e.g., "@sidebar", "@modal") - only for parallels
573
- // Action context (populated when revalidation triggered by server action):
574
- actionId?: string; // Action identifier (e.g., "src/actions.ts#addToCart")
575
- actionUrl?: URL; // URL where action was executed
576
- actionResult?: any; // Return value from action execution
577
- formData?: FormData; // FormData from action request
578
- method?: string; // Request method: 'GET' for navigation, 'POST' for actions
579
- routeName?: string; // Route name where action was executed (e.g., "products.detail")
580
- // Stale cache revalidation (SWR pattern):
581
- stale?: boolean; // True if this is a stale cache revalidation request
582
- }) => boolean | { defaultShouldRevalidate: boolean };
583
-
584
- /**
585
- * Middleware function signature
586
- *
587
- * Middleware can either call `next()` to continue the pipeline,
588
- * or return a Response to short-circuit and skip remaining middleware + handler.
589
- *
590
- * **Short-Circuit Patterns:**
591
- * - `return redirect('/login')` - Soft redirect (SPA navigation)
592
- * - `return Response.redirect('/login', 302)` - Hard redirect (full page reload)
593
- * - `return new Response('Unauthorized', { status: 401 })` - Error response
594
- *
595
- * @param TParams - Route params (defaults to GenericParams, can be narrowed with satisfies)
596
- * @param TEnv - Environment type
597
- *
598
- * @example
599
- * ```typescript
600
- * [middleware('checkout.*', 'auth')]: [
601
- * (ctx, next) => {
602
- * if (!ctx.get('user')) {
603
- * return redirect('/login'); // Soft redirect - short-circuit
604
- * }
605
- * next(); // Continue pipeline
606
- * }
607
- * ]
608
- * ```
609
- */
610
- // MiddlewareFn is imported from "./router/middleware.js" and re-exported
611
-
612
- /**
613
- * Extract all route keys from a route definition (includes flattened nested routes)
614
- */
615
- export type RouteKeys<T extends RouteDefinition> = keyof ResolvedRouteMap<T> & string;
616
-
617
- /**
618
- * Valid layout value - component or handler function
619
- * Note: Arrays are not supported. Use separate layout() declarations with unique names instead.
620
- */
621
- type LayoutValue<TEnv = any> =
622
- | ReactNode
623
- | Handler<any, TEnv>;
624
-
625
- /**
626
- * Helper to extract params from a route key using the resolved (flattened) route map
627
- */
628
- export type ExtractRouteParams<T extends RouteDefinition, K extends string> =
629
- K extends keyof ResolvedRouteMap<T>
630
- ? ResolvedRouteMap<T>[K] extends string
631
- ? ExtractParams<ResolvedRouteMap<T>[K]>
632
- : GenericParams
633
- : GenericParams;
634
-
635
- /**
636
- * Handlers object that maps route names to handler functions with type-safe string patterns
637
- */
638
- export type HandlersForRouteMap<T extends RouteDefinition, TEnv = any> = {
639
- // Route handlers - type-safe params extracted from route patterns
640
- [K in RouteKeys<T>]?: Handler<ExtractRouteParams<T, K & string>, TEnv>;
641
- } & {
642
- // Layout patterns: $layout.{routeName}.{layoutName}
643
- [K in `$layout.${RouteKeys<T> | '*'}.${string}`]?: LayoutValue<TEnv>;
644
- } & {
645
- // Parallel route patterns: $parallel.{routeName}.{parallelName}
646
- [K in `$parallel.${RouteKeys<T>}.${string}`]?: Record<
647
- `@${string}`,
648
- Handler<
649
- K extends `$parallel.${infer RouteKey}.${string}`
650
- ? RouteKey extends RouteKeys<T>
651
- ? ExtractRouteParams<T, RouteKey & string>
652
- : GenericParams
653
- : GenericParams,
654
- TEnv
655
- >
656
- >;
657
- } & {
658
- // Global parallel routes (with '*') use GenericParams
659
- [K in `$parallel.${"*"}.${string}`]?: Record<`@${string}`, Handler<GenericParams, TEnv>>;
660
- } & {
661
- // Middleware patterns: $middleware.{routeName}.{middlewareName}
662
- [K in `$middleware.${RouteKeys<T> | '*'}.${string}`]?: MiddlewareFn<TEnv, GenericParams>[];
663
- } & {
664
- // Route revalidate patterns: $revalidate.route.{routeName}.{revalidateName}
665
- [K in `$revalidate.route.${RouteKeys<T> | '*'}.${string}`]?: ShouldRevalidateFn<GenericParams, TEnv>;
666
- } & {
667
- // Layout revalidate patterns: $revalidate.layout.{routeName}.{layoutName}.{revalidateName}
668
- [K in `$revalidate.layout.${RouteKeys<T> | '*'}.${string}.${string}`]?: ShouldRevalidateFn<GenericParams, TEnv>;
669
- } & {
670
- // Parallel revalidate patterns: $revalidate.parallel.{routeName}.{parallelName}.{slotName}.{revalidateName}
671
- [K in `$revalidate.parallel.${RouteKeys<T> | '*'}.${string}.${string}.${string}`]?: ShouldRevalidateFn<GenericParams, TEnv>;
672
- };
673
-
674
- /**
675
- * Error information passed to error boundary fallback components
676
- */
677
- export interface ErrorInfo {
678
- /** Error message (always available) */
679
- message: string;
680
- /** Error name/type (e.g., "RouteNotFoundError", "MiddlewareError") */
681
- name: string;
682
- /** Optional error code for programmatic handling */
683
- code?: string;
684
- /** Stack trace (only in development) */
685
- stack?: string;
686
- /** Original error cause if available */
687
- cause?: unknown;
688
- /** Segment ID where the error occurred */
689
- segmentId: string;
690
- /** Segment type where the error occurred */
691
- segmentType: "layout" | "route" | "parallel" | "loader" | "middleware" | "cache";
692
- }
693
-
694
- /**
695
- * Props passed to server-side error boundary fallback components
696
- *
697
- * Server error boundaries don't have a reset function since the error
698
- * occurred during server rendering. Users can navigate away or refresh.
699
- *
700
- * @example
701
- * ```typescript
702
- * function ProductErrorFallback({ error }: ErrorBoundaryFallbackProps) {
703
- * return (
704
- * <div>
705
- * <h2>Something went wrong loading the product</h2>
706
- * <p>{error.message}</p>
707
- * <a href="/">Go home</a>
708
- * </div>
709
- * );
710
- * }
711
- * ```
712
- */
713
- export interface ErrorBoundaryFallbackProps {
714
- /** Error information */
715
- error: ErrorInfo;
716
- }
717
-
718
- /**
719
- * Error boundary handler - receives error info and returns fallback UI
720
- */
721
- export type ErrorBoundaryHandler = (props: ErrorBoundaryFallbackProps) => ReactNode;
722
-
723
- /**
724
- * Props passed to client-side error boundary fallback components
725
- *
726
- * Client error boundaries have a reset function that clears the error state
727
- * and re-renders the children.
728
- *
729
- * @example
730
- * ```typescript
731
- * function ClientErrorFallback({ error, reset }: ClientErrorBoundaryFallbackProps) {
732
- * return (
733
- * <div>
734
- * <h2>Something went wrong</h2>
735
- * <p>{error.message}</p>
736
- * <button onClick={reset}>Try again</button>
737
- * </div>
738
- * );
739
- * }
740
- * ```
741
- */
742
- export interface ClientErrorBoundaryFallbackProps {
743
- /** Error information */
744
- error: ErrorInfo;
745
- /** Function to reset error state and retry rendering */
746
- reset: () => void;
747
- }
748
-
749
- /**
750
- * Wrapped loader data result for deferred resolution with error handling.
751
- * When loaders are deferred to client-side resolution, errors need to be
752
- * wrapped so the client can handle them appropriately.
753
- */
754
- export type LoaderDataResult<T = unknown> =
755
- | { __loaderResult: true; ok: true; data: T }
756
- | { __loaderResult: true; ok: false; error: ErrorInfo; fallback: ReactNode | null };
757
-
758
- /**
759
- * Type guard to check if a value is a wrapped loader result
760
- */
761
- export function isLoaderDataResult(value: unknown): value is LoaderDataResult {
762
- return (
763
- typeof value === "object" &&
764
- value !== null &&
765
- "__loaderResult" in value &&
766
- (value as any).__loaderResult === true
767
- );
768
- }
769
-
770
- /**
771
- * Not found information passed to notFound boundary fallback components
772
- */
773
- export interface NotFoundInfo {
774
- /** Not found message */
775
- message: string;
776
- /** Segment ID where notFound was thrown */
777
- segmentId: string;
778
- /** Segment type where notFound was thrown */
779
- segmentType: "layout" | "route" | "parallel" | "loader" | "middleware" | "cache";
780
- /** The pathname that triggered the not found */
781
- pathname?: string;
782
- }
783
-
784
- /**
785
- * Props passed to notFound boundary fallback components
786
- *
787
- * @example
788
- * ```typescript
789
- * function ProductNotFound({ notFound }: NotFoundBoundaryFallbackProps) {
790
- * return (
791
- * <div>
792
- * <h2>Product Not Found</h2>
793
- * <p>{notFound.message}</p>
794
- * <a href="/products">Browse all products</a>
795
- * </div>
796
- * );
797
- * }
798
- * ```
799
- */
800
- export interface NotFoundBoundaryFallbackProps {
801
- /** Not found information */
802
- notFound: NotFoundInfo;
803
- }
804
-
805
- /**
806
- * NotFound boundary handler - receives not found info and returns fallback UI
807
- */
808
- export type NotFoundBoundaryHandler = (props: NotFoundBoundaryFallbackProps) => ReactNode;
809
-
810
- /**
811
- * Resolved segment with component
812
- *
813
- * Segment types:
814
- * - layout: Wraps child content via <Outlet />
815
- * - route: The leaf content for a URL
816
- * - parallel: Named slots rendered via <ParallelOutlet name="@slot" />
817
- * - loader: Data segment (no visual rendering, carries loaderData)
818
- * - error: Error fallback segment (replaces failed segment with error UI)
819
- * - notFound: Not found fallback segment (replaces segment when data not found)
820
- *
821
- * @internal This type is an implementation detail and may change without notice.
822
- */
823
- export interface ResolvedSegment {
824
- id: string;
825
- namespace: string; // Optional namespace for segment (used for parallel groups)
826
- type: "layout" | "route" | "parallel" | "loader" | "error" | "notFound";
827
- index: number;
828
- component: ReactNode; // Component, handler promise, or resolved element
829
- loading?: ReactNode; // Loading component for this segment (shown during navigation)
830
- layout?: ReactNode; // Layout element to wrap content (used by intercept segments)
831
- params?: Record<string, string>;
832
- slot?: string; // For parallel segments: '@sidebar', '@modal', etc.
833
- belongsToRoute?: boolean; // True if segment belongs to the matched route (route itself + its children)
834
- layoutName?: string; // For layouts: the layout name identifier
835
- parallelName?: string; // For parallels: the parallel group name (used to match with revalidations)
836
- // Loader-specific fields
837
- loaderId?: string; // For loaders: the loader $$id identifier
838
- loaderData?: any; // For loaders: the resolved data from loader execution
839
- // Intercept loader fields (for streaming loader data in parallel segments)
840
- loaderDataPromise?: Promise<any[]> | any[]; // Loader data promise or resolved array
841
- loaderIds?: string[]; // IDs ($$id) of loaders for this segment
842
- // Error-specific fields
843
- error?: ErrorInfo; // For error segments: the error information
844
- // NotFound-specific fields
845
- notFoundInfo?: NotFoundInfo; // For notFound segments: the not found information
846
- // Mount path from include() scope, used for MountContext.Provider wrapping
847
- mountPath?: string;
848
- }
849
-
850
- /**
851
- * Segment metadata (without component)
852
- *
853
- * @internal This type is an implementation detail and may change without notice.
854
- */
855
- export interface SegmentMetadata {
856
- id: string;
857
- type: "layout" | "route" | "parallel" | "loader" | "error" | "notFound";
858
- index: number;
859
- params?: Record<string, string>;
860
- slot?: string;
861
- loaderId?: string;
862
- error?: ErrorInfo;
863
- notFoundInfo?: NotFoundInfo;
864
- }
865
-
866
- // Note: route symbols are now defined in route-definition.ts
867
- // as properties on the route() function
868
-
869
- /**
870
- * State of a named slot (e.g., @modal, @sidebar)
871
- * Used for intercepting routes where slots render alternative content
872
- *
873
- * @internal This type is an implementation detail and may change without notice.
874
- */
875
- export interface SlotState {
876
- /**
877
- * Whether the slot is currently active (has content to render)
878
- */
879
- active: boolean;
880
- /**
881
- * Segments for this slot when active
882
- */
883
- segments?: ResolvedSegment[];
884
- }
885
-
886
- /**
887
- * Props passed to the root layout component
888
- */
889
- export interface RootLayoutProps {
890
- children: ReactNode;
891
- }
892
-
893
- /**
894
- * Router match result
895
- *
896
- * @internal This type is an implementation detail and may change without notice.
897
- */
898
- export interface MatchResult {
899
- segments: ResolvedSegment[];
900
- matched: string[];
901
- diff: string[];
902
- /**
903
- * Merged route params from all matched segments
904
- * Available for use by the handler after route matching
905
- */
906
- params: Record<string, string>;
907
- /**
908
- * The matched route name (includes name prefix from include()).
909
- * Used by ctx.href() for local name resolution.
910
- */
911
- routeName?: string;
912
- /**
913
- * Server-Timing header value (only present when debugPerformance is enabled)
914
- * Can be added to response headers for DevTools integration
915
- */
916
- serverTiming?: string;
917
- /**
918
- * State of named slots for this route match
919
- * Key is slot name (e.g., "@modal"), value is slot state
920
- * Slots are used for intercepting routes during soft navigation
921
- */
922
- slots?: Record<string, SlotState>;
923
- /**
924
- * Redirect URL for trailing slash normalization.
925
- * When set, the RSC handler should return a 308 redirect to this URL
926
- * instead of rendering the page.
927
- */
928
- redirect?: string;
929
- /**
930
- * Route-level middleware collected from the matched entry tree.
931
- * These run with the same onion-style execution as app-level middleware,
932
- * wrapping the entire RSC response creation.
933
- */
934
- routeMiddleware?: Array<{
935
- handler: import("./router/middleware.js").MiddlewareFn;
936
- params: Record<string, string>;
937
- }>;
938
- }
939
-
940
- /**
941
- * Context captured for lazy include evaluation
942
- */
943
- export interface LazyIncludeContext {
944
- urlPrefix: string;
945
- namePrefix: string | undefined;
946
- parent: unknown; // EntryData - avoid circular import
947
- }
948
-
949
- /**
950
- * Internal route entry stored in router
951
- */
952
- export interface RouteEntry<TEnv = any> {
953
- prefix: string;
954
- /**
955
- * Pre-computed static prefix for fast short-circuit matching.
956
- * Extracted from prefix at registration time (everything before first param).
957
- *
958
- * Examples:
959
- * - "/api" → staticPrefix = "/api"
960
- * - "/site/:locale" → staticPrefix = "/site"
961
- * - "/:locale" → staticPrefix = "" (empty, can't optimize)
962
- *
963
- * At runtime: if staticPrefix && !pathname.startsWith(staticPrefix), skip entry.
964
- */
965
- staticPrefix: string;
966
- /**
967
- * Route patterns map. For lazy entries, this starts as empty and is
968
- * populated on first request.
969
- */
970
- routes: ResolvedRouteMap<any>;
971
- /**
972
- * Trailing slash config per route key
973
- * If not specified for a route, defaults to pattern-based detection
974
- */
975
- trailingSlash?: Record<string, TrailingSlashMode>;
976
- handler: () =>
977
- | Array<AllUseItems>
978
- | Promise<{ default: () => Array<AllUseItems> }>
979
- | Promise<() => Array<AllUseItems>>;
980
- mountIndex: number;
981
-
982
- // === Lazy evaluation fields ===
983
-
984
- /**
985
- * Whether this entry is lazily evaluated.
986
- * When true, routes are populated on first matching request.
987
- */
988
- lazy?: boolean;
989
-
990
- /**
991
- * For lazy entries: the UrlPatterns to evaluate
992
- */
993
- lazyPatterns?: unknown;
994
-
995
- /**
996
- * For lazy entries: captured context at definition time
997
- */
998
- lazyContext?: LazyIncludeContext;
999
-
1000
- /**
1001
- * For lazy entries: whether patterns have been evaluated
1002
- */
1003
- lazyEvaluated?: boolean;
1004
- }
1005
-
1006
-
1007
- /**
1008
- * Revalidation function with typed params
1009
- *
1010
- * @template T - Params object
1011
- * @template TEnv - Environment type
1012
- *
1013
- * @example
1014
- * ```typescript
1015
- * const revalidate: Revalidate<{ slug: string }> = ({ currentParams, nextParams }) => {
1016
- * return currentParams.slug !== nextParams.slug;
1017
- * }
1018
- * ```
1019
- */
1020
- export type Revalidate<T = GenericParams, TEnv = DefaultEnv> = ShouldRevalidateFn<T, TEnv>;
1021
-
1022
- /**
1023
- * Middleware function with typed params and environment
1024
- *
1025
- * @template TParams - Params object (defaults to generic)
1026
- * @template TEnv - Environment type (defaults to global RSCRouter.Env)
1027
- *
1028
- * Note: Middleware cannot directly use route names for params typing because
1029
- * middleware is defined during router setup, before RegisteredRoutes is populated.
1030
- * Use ExtractParams<"/path/:id"> for typed params from a path pattern.
1031
- *
1032
- * @example
1033
- * ```typescript
1034
- * // Basic middleware (uses global RSCRouter.Env via module augmentation)
1035
- * const middleware: Middleware = async (ctx, next) => {
1036
- * ctx.set("user", { id: "123" }); // Type-safe!
1037
- * await next();
1038
- * }
1039
- *
1040
- * // With explicit params (most common)
1041
- * const middleware: Middleware<{ id: string }> = async (ctx, next) => {
1042
- * console.log(ctx.params.id);
1043
- * await next();
1044
- * }
1045
- *
1046
- * // With params from path pattern
1047
- * const middleware: Middleware<ExtractParams<"/products/:id">> = async (ctx, next) => {
1048
- * console.log(ctx.params.id);
1049
- * await next();
1050
- * }
1051
- *
1052
- * // With both params and explicit env
1053
- * const middleware: Middleware<{ id: string }, AppEnv> = async (ctx, next) => {
1054
- * ctx.set("user", { id: ctx.params.id });
1055
- * await next();
1056
- * }
1057
- * ```
1058
- */
1059
- export type Middleware<TParams = GenericParams, TEnv = DefaultEnv> = MiddlewareFn<TEnv, TParams>;
1060
-
1061
-
1062
- // ============================================================================
1063
- // Cache Types
1064
- // ============================================================================
1065
-
1066
- /**
1067
- * Context passed to cache condition/key/tags functions.
1068
- *
1069
- * This is a subset of RequestContext that's guaranteed to be available
1070
- * during cache key generation (before middleware runs).
1071
- *
1072
- * Note: While the full RequestContext is passed, middleware-set variables
1073
- * (ctx.var, ctx.get()) may not be populated yet since cache lookup
1074
- * happens before middleware execution.
1075
- */
1076
- export type { RequestContext as CacheContext } from "./server/request-context.js";
1077
-
1078
- /**
1079
- * Cache configuration options for cache() DSL
1080
- *
1081
- * Controls how segments, layouts, and loaders are cached.
1082
- * Cache configuration inherits down the route tree unless overridden.
1083
- *
1084
- * @example
1085
- * ```typescript
1086
- * // Basic caching with TTL
1087
- * cache({ ttl: 60 }, () => [
1088
- * layout(<BlogLayout />),
1089
- * route("post/:slug"),
1090
- * ])
1091
- *
1092
- * // With stale-while-revalidate
1093
- * cache({ ttl: 60, swr: 300 }, () => [
1094
- * route("product/:id"),
1095
- * ])
1096
- *
1097
- * // Conditional caching
1098
- * cache({
1099
- * ttl: 300,
1100
- * condition: (ctx) => !ctx.request.headers.get('x-preview'),
1101
- * }, () => [...])
1102
- *
1103
- * // Custom cache key
1104
- * cache({
1105
- * ttl: 300,
1106
- * key: (ctx) => `product-${ctx.params.id}-${ctx.searchParams.get('variant')}`,
1107
- * }, () => [...])
1108
- *
1109
- * // With tags for invalidation
1110
- * cache({
1111
- * ttl: 300,
1112
- * tags: (ctx) => [`product:${ctx.params.id}`, 'products'],
1113
- * }, () => [...])
1114
- * ```
1115
- */
1116
- export interface CacheOptions<TEnv = unknown> {
1117
- /**
1118
- * Time-to-live in seconds.
1119
- * After this period, cached content is considered stale.
1120
- */
1121
- ttl: number;
1122
-
1123
- /**
1124
- * Stale-while-revalidate window in seconds (after TTL).
1125
- * During this window, stale content is served immediately while
1126
- * fresh content is fetched in the background via waitUntil.
1127
- *
1128
- * @example
1129
- * // TTL: 60s, SWR: 300s
1130
- * // 0-60s: FRESH (serve from cache)
1131
- * // 60-360s: STALE (serve from cache, revalidate in background)
1132
- * // 360s+: EXPIRED (cache miss, fetch fresh)
1133
- */
1134
- swr?: number;
1135
-
1136
- /**
1137
- * Override the cache store for this boundary.
1138
- * When specified, this boundary and its children use this store
1139
- * instead of the app-level store from handler config.
1140
- *
1141
- * Useful for:
1142
- * - Different backends per route section (memory vs KV vs Redis)
1143
- * - Loader-specific caching strategies
1144
- * - Hot data in fast cache, cold data in larger/slower cache
1145
- *
1146
- * @example
1147
- * ```typescript
1148
- * const kvStore = new CloudflareKVStore(env.CACHE_KV);
1149
- * const memoryStore = new MemorySegmentCacheStore({ defaults: { ttl: 10 } });
1150
- *
1151
- * // Fast memory cache for hot data
1152
- * cache({ store: memoryStore }, () => [
1153
- * route("dashboard"),
1154
- * ])
1155
- *
1156
- * // KV for larger, less frequently accessed data
1157
- * cache({ store: kvStore, ttl: 3600 }, () => [
1158
- * route("archive/:year"),
1159
- * ])
1160
- * ```
1161
- */
1162
- store?: import("./cache/types.js").SegmentCacheStore;
1163
-
1164
- /**
1165
- * Conditional cache read function.
1166
- * Return false to skip cache for this request (always fetch fresh).
1167
- *
1168
- * Has access to full RequestContext including env, request, params, cookies, etc.
1169
- * Note: Middleware-set variables (ctx.var) may not be populated yet.
1170
- *
1171
- * @example
1172
- * ```typescript
1173
- * condition: (ctx) => {
1174
- * // Skip cache for preview mode
1175
- * if (ctx.request.headers.get('x-preview')) return false;
1176
- * // Skip cache for authenticated users
1177
- * if (ctx.request.headers.has('authorization')) return false;
1178
- * return true;
1179
- * }
1180
- * ```
1181
- */
1182
- condition?: (ctx: import("./server/request-context.js").RequestContext<TEnv>) => boolean;
1183
-
1184
- /**
1185
- * Custom cache key function - FULL OVERRIDE.
1186
- * Bypasses default key generation AND store's keyGenerator.
1187
- *
1188
- * Has access to full RequestContext including env, request, params, cookies, etc.
1189
- * Note: Middleware-set variables (ctx.var) may not be populated yet.
1190
- *
1191
- * @example
1192
- * ```typescript
1193
- * // Include query params in cache key
1194
- * key: (ctx) => `product-${ctx.params.id}-${ctx.searchParams.get('variant')}`
1195
- *
1196
- * // Include env bindings
1197
- * key: (ctx) => `${ctx.env.REGION}:product:${ctx.params.id}`
1198
- *
1199
- * // Include cookies
1200
- * key: (ctx) => `${ctx.cookie('locale')}:${ctx.pathname}`
1201
- * ```
1202
- */
1203
- key?: (ctx: import("./server/request-context.js").RequestContext<TEnv>) => string | Promise<string>;
1204
-
1205
- /**
1206
- * Tags for cache invalidation.
1207
- * Can be a static array or a function that returns tags.
1208
- *
1209
- * @example
1210
- * ```typescript
1211
- * // Static tags
1212
- * tags: ['products', 'catalog']
1213
- *
1214
- * // Dynamic tags
1215
- * tags: (ctx) => [`product:${ctx.params.id}`, 'products']
1216
- * ```
1217
- */
1218
- tags?: string[] | ((ctx: import("./server/request-context.js").RequestContext<TEnv>) => string[]);
1219
- }
1220
-
1221
- /**
1222
- * Partial cache options for cache() DSL.
1223
- *
1224
- * When `ttl` is not specified, it will use the default from cache config.
1225
- * This allows cache() calls to inherit app-level defaults:
1226
- *
1227
- * @example
1228
- * ```typescript
1229
- * // App-level default (in handler config)
1230
- * cache: { store: myStore, defaults: { ttl: 60 } }
1231
- *
1232
- * // Route-level (inherits ttl from defaults)
1233
- * cache(() => [
1234
- * route("products"),
1235
- * ])
1236
- *
1237
- * // Override with explicit ttl
1238
- * cache({ ttl: 300 }, () => [...])
1239
- * ```
1240
- */
1241
- export type PartialCacheOptions<TEnv = unknown> = Partial<CacheOptions<TEnv>>;
1242
-
1243
- /**
1244
- * Cache entry configuration stored in EntryData.
1245
- * Represents the resolved cache config for a segment.
1246
- */
1247
- export interface EntryCacheConfig {
1248
- /** Cache options (false means caching disabled for this entry) - ttl is optional, uses defaults */
1249
- options: PartialCacheOptions | false;
1250
- }
1251
-
1252
- // ============================================================================
1253
- // Loader Types
1254
- // ============================================================================
1255
-
1256
- /**
1257
- * Context passed to loader functions during execution
1258
- *
1259
- * Loaders run after middleware but before handlers, so they have access
1260
- * to middleware-set variables via get().
1261
- *
1262
- * @template TParams - Route params type (e.g., { slug: string })
1263
- * @template TEnv - Environment type for bindings/variables
1264
- *
1265
- * @example
1266
- * ```typescript
1267
- * const CartLoader = createLoader(async (ctx) => {
1268
- * "use server";
1269
- * const user = ctx.get("user"); // From auth middleware
1270
- * return await db.cart.get(user.id);
1271
- * });
1272
- *
1273
- * // With typed params:
1274
- * const ProductLoader = createLoader<Product, { slug: string }>(async (ctx) => {
1275
- * "use server";
1276
- * const { slug } = ctx.params; // slug is typed as string
1277
- * return await db.products.findBySlug(slug);
1278
- * });
1279
- * ```
1280
- */
1281
- export type LoaderContext<TParams = Record<string, string | undefined>, TEnv = DefaultEnv, TBody = unknown> = {
1282
- params: TParams;
1283
- request: Request;
1284
- searchParams: URLSearchParams;
1285
- pathname: string;
1286
- url: URL;
1287
- env: TEnv extends RouterEnv<infer B, any> ? B : {};
1288
- var: TEnv extends RouterEnv<any, infer V> ? V : {};
1289
- get: TEnv extends RouterEnv<any, infer V>
1290
- ? <K extends keyof V>(key: K) => V[K]
1291
- : (key: string) => any;
1292
- /**
1293
- * Access another loader's data (returns promise since loaders run in parallel)
1294
- */
1295
- use: <T, TLoaderParams = any>(loader: LoaderDefinition<T, TLoaderParams>) => Promise<T>;
1296
- /**
1297
- * HTTP method (GET, POST, PUT, PATCH, DELETE)
1298
- * Available when loader is called via load({ method: "POST", ... })
1299
- */
1300
- method: string;
1301
- /**
1302
- * Request body for POST/PUT/PATCH/DELETE requests
1303
- * Available when loader is called via load({ method: "POST", body: {...} })
1304
- */
1305
- body: TBody | undefined;
1306
- /**
1307
- * Form data when loader is invoked via action (fetchable loaders)
1308
- * Available when loader is called via form submission
1309
- */
1310
- formData?: FormData;
1311
- };
1312
-
1313
- /**
1314
- * Loader function signature
1315
- *
1316
- * @template T - The return type of the loader
1317
- * @template TParams - Route params type (defaults to generic Record)
1318
- * @template TEnv - Environment type for bindings/variables
1319
- *
1320
- * @example
1321
- * ```typescript
1322
- * const myLoader: LoaderFn<{ items: Item[] }> = async (ctx) => {
1323
- * "use server";
1324
- * return { items: await db.items.list() };
1325
- * };
1326
- *
1327
- * // With typed params:
1328
- * const productLoader: LoaderFn<Product, { slug: string }> = async (ctx) => {
1329
- * "use server";
1330
- * const { slug } = ctx.params; // typed as string
1331
- * return await db.products.findBySlug(slug);
1332
- * };
1333
- * ```
1334
- */
1335
- export type LoaderFn<T, TParams = Record<string, string | undefined>, TEnv = DefaultEnv> = (
1336
- ctx: LoaderContext<TParams, TEnv>
1337
- ) => Promise<T> | T;
1338
-
1339
- /**
1340
- * Loader definition object
1341
- *
1342
- * Created via createLoader(). Contains the loader name and function.
1343
- * On client builds, the fn is stripped by the bundler (via "use server" directive).
1344
- *
1345
- * @template T - The return type of the loader
1346
- * @template TParams - Route params type (for type-safe params access)
1347
- *
1348
- * @example
1349
- * ```typescript
1350
- * // Definition (same file works on server and client)
1351
- * export const CartLoader = createLoader(async (ctx) => {
1352
- * "use server";
1353
- * return await db.cart.get(ctx.get("user").id);
1354
- * });
1355
- *
1356
- * // With typed params:
1357
- * export const ProductLoader = createLoader<Product, { slug: string }>(async (ctx) => {
1358
- * "use server";
1359
- * const { slug } = ctx.params; // slug is typed as string
1360
- * return await db.products.findBySlug(slug);
1361
- * });
1362
- *
1363
- * // Server usage
1364
- * const cart = ctx.use(CartLoader);
1365
- *
1366
- * // Client usage (fn is stripped, only name remains)
1367
- * const cart = useLoader(CartLoader);
1368
- * ```
1369
- */
1370
- /**
1371
- * Options for fetchable loaders
1372
- *
1373
- * Middleware uses the same MiddlewareFn signature as route/app middleware,
1374
- * enabling reuse of the same middleware functions everywhere.
1375
- */
1376
- export type FetchableLoaderOptions = {
1377
- fetchable?: true;
1378
- middleware?: MiddlewareFn[];
1379
- };
1380
-
1381
- /**
1382
- * Options for load() calls - type-safe union based on method
1383
- */
1384
- export type LoadOptions =
1385
- | {
1386
- method?: "GET";
1387
- params?: Record<string, string>;
1388
- }
1389
- | {
1390
- method: "POST" | "PUT" | "PATCH" | "DELETE";
1391
- params?: Record<string, string>;
1392
- body?: FormData | Record<string, any>;
1393
- };
1394
-
1395
- /**
1396
- * Context passed to loader action on server
1397
- */
1398
- export type LoaderActionContext = {
1399
- method: string;
1400
- params: Record<string, string>;
1401
- body?: FormData | Record<string, any>;
1402
- formData?: FormData;
1403
- };
1404
-
1405
- /**
1406
- * @deprecated Use MiddlewareFn instead for fetchable loader middleware.
1407
- * This type is kept for backwards compatibility but will be removed in a future version.
1408
- *
1409
- * Fetchable loaders now use the same middleware signature as routes,
1410
- * enabling middleware reuse across routes and loaders.
1411
- */
1412
- export type LoaderMiddlewareFn = (
1413
- ctx: LoaderActionContext,
1414
- next: () => Promise<void>
1415
- ) => Response | Promise<Response> | void | Promise<void>;
1416
-
1417
- /**
1418
- * Loader action function type - server action for form-based fetching
1419
- * This is a server action that can be passed to useActionState or form action prop.
1420
- *
1421
- * The signature (prevState, formData) is required for useActionState compatibility.
1422
- * When used with useActionState, React passes the previous state as the first argument.
1423
- */
1424
- export type LoaderAction<T> = (prevState: T | null, formData: FormData) => Promise<T>;
1425
-
1426
- export type LoaderDefinition<T = any, TParams = Record<string, string | undefined>> = {
1427
- __brand: "loader";
1428
- $$id: string; // Injected by Vite plugin (exposeLoaderId) - unique identifier
1429
- fn?: LoaderFn<T, TParams, any>; // Optional - stripped on client via "use server"
1430
- action?: LoaderAction<T>; // Optional - for fetchable loaders
1431
- toJSON?: () => { __brand: "loader"; $$id: string }; // RSC serialization
1432
- };
1433
-
1434
- // ============================================================================
1435
- // Error Handling Types
1436
- // ============================================================================
1437
-
1438
- /**
1439
- * Phase where the error occurred during request handling.
1440
- *
1441
- * Coverage notes:
1442
- * - "routing": Invoked when route matching fails (router.ts, rsc/handler.ts)
1443
- * - "manifest": Reserved for manifest loading errors (not currently invoked)
1444
- * - "middleware": Reserved for middleware execution errors (errors propagate to handler phase)
1445
- * - "loader": Invoked when loader execution fails (router.ts via wrapLoaderWithErrorHandling, rsc/handler.ts)
1446
- * - "handler": Invoked when route/layout handler execution fails (router.ts)
1447
- * - "rendering": Invoked during SSR rendering errors (ssr/index.tsx, separate callback)
1448
- * - "action": Invoked when server action execution fails (rsc/handler.ts, router.ts)
1449
- * - "revalidation": Invoked when revalidation fails (router.ts, conditional with action)
1450
- * - "unknown": Fallback for unclassified errors (not currently invoked)
1451
- */
1452
- export type ErrorPhase =
1453
- | "routing" // During route matching
1454
- | "manifest" // During manifest loading (reserved, not currently invoked)
1455
- | "middleware" // During middleware execution (errors propagate to handler phase)
1456
- | "loader" // During loader execution
1457
- | "handler" // During route/layout handler execution
1458
- | "rendering" // During RSC/SSR rendering (SSR handler uses separate callback)
1459
- | "action" // During server action execution
1460
- | "revalidation" // During revalidation evaluation
1461
- | "unknown"; // Fallback for unclassified errors
1462
-
1463
- /**
1464
- * Comprehensive context passed to onError callback
1465
- *
1466
- * Provides all available information about where and when an error occurred
1467
- * during request handling. The callback can use this for logging, monitoring,
1468
- * error tracking services, or custom error responses.
1469
- *
1470
- * @example
1471
- * ```typescript
1472
- * const router = createRouter<AppEnv>({
1473
- * onError: (context) => {
1474
- * // Log to error tracking service
1475
- * errorTracker.capture({
1476
- * error: context.error,
1477
- * phase: context.phase,
1478
- * url: context.request.url,
1479
- * route: context.routeKey,
1480
- * userId: context.env?.user?.id,
1481
- * });
1482
- *
1483
- * // Log to console with context
1484
- * console.error(`[${context.phase}] Error in ${context.routeKey}:`, {
1485
- * message: context.error.message,
1486
- * segment: context.segmentId,
1487
- * duration: context.duration,
1488
- * });
1489
- * },
1490
- * });
1491
- * ```
1492
- */
1493
- export interface OnErrorContext<TEnv = any> {
1494
- /**
1495
- * The error that occurred
1496
- */
1497
- error: Error;
1498
-
1499
- /**
1500
- * Phase where the error occurred
1501
- */
1502
- phase: ErrorPhase;
1503
-
1504
- /**
1505
- * The original request
1506
- */
1507
- request: Request;
1508
-
1509
- /**
1510
- * Parsed URL from the request
1511
- */
1512
- url: URL;
1513
-
1514
- /**
1515
- * Request pathname
1516
- */
1517
- pathname: string;
1518
-
1519
- /**
1520
- * HTTP method
1521
- */
1522
- method: string;
1523
-
1524
- /**
1525
- * Matched route key (if available)
1526
- * e.g., "shop.products.detail"
1527
- */
1528
- routeKey?: string;
1529
-
1530
- /**
1531
- * Route params (if available)
1532
- * e.g., { slug: "headphones" }
1533
- */
1534
- params?: Record<string, string>;
1535
-
1536
- /**
1537
- * Segment ID where error occurred (if available)
1538
- * e.g., "M1L0" for a layout, "M1R0" for a route
1539
- */
1540
- segmentId?: string;
1541
-
1542
- /**
1543
- * Segment type where error occurred (if available)
1544
- */
1545
- segmentType?: "layout" | "route" | "parallel" | "loader" | "middleware";
1546
-
1547
- /**
1548
- * Loader name (if error occurred in a loader)
1549
- */
1550
- loaderName?: string;
1551
-
1552
- /**
1553
- * Middleware name/id (if error occurred in middleware)
1554
- */
1555
- middlewareId?: string;
1556
-
1557
- /**
1558
- * Action ID (if error occurred during server action)
1559
- * e.g., "src/actions.ts#addToCart"
1560
- */
1561
- actionId?: string;
1562
-
1563
- /**
1564
- * Environment/bindings (platform context)
1565
- */
1566
- env?: TEnv;
1567
-
1568
- /**
1569
- * Duration from request start to error (milliseconds)
1570
- */
1571
- duration?: number;
1572
-
1573
- /**
1574
- * Whether this is a partial/navigation request
1575
- */
1576
- isPartial?: boolean;
1577
-
1578
- /**
1579
- * Whether an error boundary caught the error
1580
- * If true, the error was handled and a fallback UI was rendered
1581
- */
1582
- handledByBoundary?: boolean;
1583
-
1584
- /**
1585
- * Stack trace (if available)
1586
- */
1587
- stack?: string;
1588
-
1589
- /**
1590
- * Additional metadata specific to the error phase
1591
- */
1592
- metadata?: Record<string, unknown>;
1593
- }
1594
-
1595
- /**
1596
- * Callback function for error handling
1597
- *
1598
- * Called whenever an error occurs during request handling.
1599
- * The callback is for notification/logging purposes - it cannot
1600
- * modify the error handling flow (use errorBoundary for that).
1601
- *
1602
- * @param context - Comprehensive error context
1603
- *
1604
- * @example
1605
- * ```typescript
1606
- * const onError: OnErrorCallback = (context) => {
1607
- * // Send to error tracking service
1608
- * Sentry.captureException(context.error, {
1609
- * tags: {
1610
- * phase: context.phase,
1611
- * route: context.routeKey,
1612
- * },
1613
- * extra: {
1614
- * url: context.url.toString(),
1615
- * params: context.params,
1616
- * duration: context.duration,
1617
- * },
1618
- * });
1619
- * };
1620
- * ```
1621
- */
1622
- export type OnErrorCallback<TEnv = any> = (context: OnErrorContext<TEnv>) => void | Promise<void>;
1623
-
1
+ export * from "./types/index.js";