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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1098) hide show
  1. package/AGENTS.md +9 -0
  2. package/README.md +884 -4
  3. package/dist/__internal.d.ts +83 -0
  4. package/dist/__internal.d.ts.map +1 -0
  5. package/dist/__internal.js +19 -0
  6. package/dist/__internal.js.map +1 -0
  7. package/dist/__mocks__/version.d.ts +7 -0
  8. package/dist/__mocks__/version.d.ts.map +1 -0
  9. package/dist/__mocks__/version.js +7 -0
  10. package/dist/__mocks__/version.js.map +1 -0
  11. package/dist/__tests__/client-href.test.d.ts +2 -0
  12. package/dist/__tests__/client-href.test.d.ts.map +1 -0
  13. package/dist/__tests__/client-href.test.js +74 -0
  14. package/dist/__tests__/client-href.test.js.map +1 -0
  15. package/dist/__tests__/component-utils.test.d.ts +2 -0
  16. package/dist/__tests__/component-utils.test.d.ts.map +1 -0
  17. package/dist/__tests__/component-utils.test.js +51 -0
  18. package/dist/__tests__/component-utils.test.js.map +1 -0
  19. package/dist/__tests__/event-controller.test.d.ts +2 -0
  20. package/dist/__tests__/event-controller.test.d.ts.map +1 -0
  21. package/dist/__tests__/event-controller.test.js +538 -0
  22. package/dist/__tests__/event-controller.test.js.map +1 -0
  23. package/dist/__tests__/helpers/route-tree.d.ts +118 -0
  24. package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
  25. package/dist/__tests__/helpers/route-tree.js +374 -0
  26. package/dist/__tests__/helpers/route-tree.js.map +1 -0
  27. package/dist/__tests__/match-result.test.d.ts +2 -0
  28. package/dist/__tests__/match-result.test.d.ts.map +1 -0
  29. package/dist/__tests__/match-result.test.js +154 -0
  30. package/dist/__tests__/match-result.test.js.map +1 -0
  31. package/dist/__tests__/navigation-store.test.d.ts +2 -0
  32. package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
  33. package/dist/__tests__/navigation-store.test.js +440 -0
  34. package/dist/__tests__/navigation-store.test.js.map +1 -0
  35. package/dist/__tests__/partial-update.test.d.ts +2 -0
  36. package/dist/__tests__/partial-update.test.d.ts.map +1 -0
  37. package/dist/__tests__/partial-update.test.js +1009 -0
  38. package/dist/__tests__/partial-update.test.js.map +1 -0
  39. package/dist/__tests__/reverse-types.test.d.ts +8 -0
  40. package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
  41. package/dist/__tests__/reverse-types.test.js +656 -0
  42. package/dist/__tests__/reverse-types.test.js.map +1 -0
  43. package/dist/__tests__/route-definition.test.d.ts +2 -0
  44. package/dist/__tests__/route-definition.test.d.ts.map +1 -0
  45. package/dist/__tests__/route-definition.test.js +55 -0
  46. package/dist/__tests__/route-definition.test.js.map +1 -0
  47. package/dist/__tests__/router-helpers.test.d.ts +2 -0
  48. package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
  49. package/dist/__tests__/router-helpers.test.js +377 -0
  50. package/dist/__tests__/router-helpers.test.js.map +1 -0
  51. package/dist/__tests__/router-integration-2.test.d.ts +2 -0
  52. package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
  53. package/dist/__tests__/router-integration-2.test.js +426 -0
  54. package/dist/__tests__/router-integration-2.test.js.map +1 -0
  55. package/dist/__tests__/router-integration.test.d.ts +2 -0
  56. package/dist/__tests__/router-integration.test.d.ts.map +1 -0
  57. package/dist/__tests__/router-integration.test.js +1051 -0
  58. package/dist/__tests__/router-integration.test.js.map +1 -0
  59. package/dist/__tests__/search-params.test.d.ts +5 -0
  60. package/dist/__tests__/search-params.test.d.ts.map +1 -0
  61. package/dist/__tests__/search-params.test.js +306 -0
  62. package/dist/__tests__/search-params.test.js.map +1 -0
  63. package/dist/__tests__/segment-system.test.d.ts +2 -0
  64. package/dist/__tests__/segment-system.test.d.ts.map +1 -0
  65. package/dist/__tests__/segment-system.test.js +627 -0
  66. package/dist/__tests__/segment-system.test.js.map +1 -0
  67. package/dist/__tests__/static-handler-types.test.d.ts +8 -0
  68. package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
  69. package/dist/__tests__/static-handler-types.test.js +63 -0
  70. package/dist/__tests__/static-handler-types.test.js.map +1 -0
  71. package/dist/__tests__/urls.test.d.ts +2 -0
  72. package/dist/__tests__/urls.test.d.ts.map +1 -0
  73. package/dist/__tests__/urls.test.js +421 -0
  74. package/dist/__tests__/urls.test.js.map +1 -0
  75. package/dist/__tests__/use-mount.test.d.ts +2 -0
  76. package/dist/__tests__/use-mount.test.d.ts.map +1 -0
  77. package/dist/__tests__/use-mount.test.js +35 -0
  78. package/dist/__tests__/use-mount.test.js.map +1 -0
  79. package/dist/bin/rango.d.ts +2 -0
  80. package/dist/bin/rango.d.ts.map +1 -0
  81. package/dist/bin/rango.js +1531 -212
  82. package/dist/bin/rango.js.map +1 -0
  83. package/dist/browser/event-controller.d.ts +191 -0
  84. package/dist/browser/event-controller.d.ts.map +1 -0
  85. package/dist/browser/event-controller.js +559 -0
  86. package/dist/browser/event-controller.js.map +1 -0
  87. package/dist/browser/index.d.ts +2 -0
  88. package/dist/browser/index.d.ts.map +1 -0
  89. package/dist/browser/index.js +14 -0
  90. package/dist/browser/index.js.map +1 -0
  91. package/dist/browser/link-interceptor.d.ts +38 -0
  92. package/dist/browser/link-interceptor.d.ts.map +1 -0
  93. package/dist/browser/link-interceptor.js +99 -0
  94. package/dist/browser/link-interceptor.js.map +1 -0
  95. package/dist/browser/logging.d.ts +10 -0
  96. package/dist/browser/logging.d.ts.map +1 -0
  97. package/dist/browser/logging.js +29 -0
  98. package/dist/browser/logging.js.map +1 -0
  99. package/dist/browser/lru-cache.d.ts +17 -0
  100. package/dist/browser/lru-cache.d.ts.map +1 -0
  101. package/dist/browser/lru-cache.js +50 -0
  102. package/dist/browser/lru-cache.js.map +1 -0
  103. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  104. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  105. package/dist/browser/merge-segment-loaders.js +102 -0
  106. package/dist/browser/merge-segment-loaders.js.map +1 -0
  107. package/dist/browser/navigation-bridge.d.ts +102 -0
  108. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  109. package/dist/browser/navigation-bridge.js +708 -0
  110. package/dist/browser/navigation-bridge.js.map +1 -0
  111. package/dist/browser/navigation-client.d.ts +25 -0
  112. package/dist/browser/navigation-client.d.ts.map +1 -0
  113. package/dist/browser/navigation-client.js +157 -0
  114. package/dist/browser/navigation-client.js.map +1 -0
  115. package/dist/browser/navigation-store.d.ts +101 -0
  116. package/dist/browser/navigation-store.d.ts.map +1 -0
  117. package/dist/browser/navigation-store.js +625 -0
  118. package/dist/browser/navigation-store.js.map +1 -0
  119. package/dist/browser/partial-update.d.ts +75 -0
  120. package/dist/browser/partial-update.d.ts.map +1 -0
  121. package/dist/browser/partial-update.js +426 -0
  122. package/dist/browser/partial-update.js.map +1 -0
  123. package/dist/browser/react/Link.d.ts +86 -0
  124. package/dist/browser/react/Link.d.ts.map +1 -0
  125. package/dist/browser/react/Link.js +128 -0
  126. package/dist/browser/react/Link.js.map +1 -0
  127. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  128. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  129. package/dist/browser/react/NavigationProvider.js +216 -0
  130. package/dist/browser/react/NavigationProvider.js.map +1 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  132. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  133. package/dist/browser/react/ScrollRestoration.js +57 -0
  134. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  135. package/dist/browser/react/context.d.ts +46 -0
  136. package/dist/browser/react/context.d.ts.map +1 -0
  137. package/dist/browser/react/context.js +10 -0
  138. package/dist/browser/react/context.js.map +1 -0
  139. package/dist/browser/react/index.d.ts +11 -0
  140. package/dist/browser/react/index.d.ts.map +1 -0
  141. package/dist/browser/react/index.js +22 -0
  142. package/dist/browser/react/index.js.map +1 -0
  143. package/dist/browser/react/location-state-shared.d.ts +63 -0
  144. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  145. package/dist/browser/react/location-state-shared.js +81 -0
  146. package/dist/browser/react/location-state-shared.js.map +1 -0
  147. package/dist/browser/react/location-state.d.ts +23 -0
  148. package/dist/browser/react/location-state.d.ts.map +1 -0
  149. package/dist/browser/react/location-state.js +29 -0
  150. package/dist/browser/react/location-state.js.map +1 -0
  151. package/dist/browser/react/mount-context.d.ts +24 -0
  152. package/dist/browser/react/mount-context.d.ts.map +1 -0
  153. package/dist/browser/react/mount-context.js +24 -0
  154. package/dist/browser/react/mount-context.js.map +1 -0
  155. package/dist/browser/react/use-action.d.ts +64 -0
  156. package/dist/browser/react/use-action.d.ts.map +1 -0
  157. package/dist/browser/react/use-action.js +134 -0
  158. package/dist/browser/react/use-action.js.map +1 -0
  159. package/dist/browser/react/use-client-cache.d.ts +41 -0
  160. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  161. package/dist/browser/react/use-client-cache.js +39 -0
  162. package/dist/browser/react/use-client-cache.js.map +1 -0
  163. package/dist/browser/react/use-handle.d.ts +31 -0
  164. package/dist/browser/react/use-handle.d.ts.map +1 -0
  165. package/dist/browser/react/use-handle.js +144 -0
  166. package/dist/browser/react/use-handle.js.map +1 -0
  167. package/dist/browser/react/use-href.d.ts +33 -0
  168. package/dist/browser/react/use-href.d.ts.map +1 -0
  169. package/dist/browser/react/use-href.js +39 -0
  170. package/dist/browser/react/use-href.js.map +1 -0
  171. package/dist/browser/react/use-link-status.d.ts +37 -0
  172. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  173. package/dist/browser/react/use-link-status.js +99 -0
  174. package/dist/browser/react/use-link-status.js.map +1 -0
  175. package/dist/browser/react/use-mount.d.ts +25 -0
  176. package/dist/browser/react/use-mount.d.ts.map +1 -0
  177. package/dist/browser/react/use-mount.js +30 -0
  178. package/dist/browser/react/use-mount.js.map +1 -0
  179. package/dist/browser/react/use-navigation.d.ts +27 -0
  180. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  181. package/dist/browser/react/use-navigation.js +87 -0
  182. package/dist/browser/react/use-navigation.js.map +1 -0
  183. package/dist/browser/react/use-segments.d.ts +38 -0
  184. package/dist/browser/react/use-segments.d.ts.map +1 -0
  185. package/dist/browser/react/use-segments.js +130 -0
  186. package/dist/browser/react/use-segments.js.map +1 -0
  187. package/dist/browser/request-controller.d.ts +26 -0
  188. package/dist/browser/request-controller.d.ts.map +1 -0
  189. package/dist/browser/request-controller.js +147 -0
  190. package/dist/browser/request-controller.js.map +1 -0
  191. package/dist/browser/rsc-router.d.ts +129 -0
  192. package/dist/browser/rsc-router.d.ts.map +1 -0
  193. package/dist/browser/rsc-router.js +195 -0
  194. package/dist/browser/rsc-router.js.map +1 -0
  195. package/dist/browser/scroll-restoration.d.ts +93 -0
  196. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  197. package/dist/browser/scroll-restoration.js +321 -0
  198. package/dist/browser/scroll-restoration.js.map +1 -0
  199. package/dist/browser/segment-structure-assert.d.ts +17 -0
  200. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  201. package/dist/browser/segment-structure-assert.js +59 -0
  202. package/dist/browser/segment-structure-assert.js.map +1 -0
  203. package/dist/browser/server-action-bridge.d.ts +26 -0
  204. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  205. package/dist/browser/server-action-bridge.js +668 -0
  206. package/dist/browser/server-action-bridge.js.map +1 -0
  207. package/dist/browser/shallow.d.ts +12 -0
  208. package/dist/browser/shallow.d.ts.map +1 -0
  209. package/dist/browser/shallow.js +34 -0
  210. package/dist/browser/shallow.js.map +1 -0
  211. package/dist/browser/types.d.ts +369 -0
  212. package/dist/browser/types.d.ts.map +1 -0
  213. package/dist/browser/types.js +2 -0
  214. package/dist/browser/types.js.map +1 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  216. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  217. package/dist/build/__tests__/generate-cli.test.js +237 -0
  218. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  220. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  221. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  222. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  224. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  225. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  226. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  228. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  230. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  231. package/dist/build/generate-manifest.d.ts +81 -0
  232. package/dist/build/generate-manifest.d.ts.map +1 -0
  233. package/dist/build/generate-manifest.js +276 -0
  234. package/dist/build/generate-manifest.js.map +1 -0
  235. package/dist/build/generate-route-types.d.ts +115 -0
  236. package/dist/build/generate-route-types.d.ts.map +1 -0
  237. package/dist/build/generate-route-types.js +740 -0
  238. package/dist/build/generate-route-types.js.map +1 -0
  239. package/dist/build/index.d.ts +21 -0
  240. package/dist/build/index.d.ts.map +1 -0
  241. package/dist/build/index.js +21 -0
  242. package/dist/build/index.js.map +1 -0
  243. package/dist/build/route-trie.d.ts +71 -0
  244. package/dist/build/route-trie.d.ts.map +1 -0
  245. package/dist/build/route-trie.js +175 -0
  246. package/dist/build/route-trie.js.map +1 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  248. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  249. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  250. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  252. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  253. package/dist/cache/__tests__/document-cache.test.js +345 -0
  254. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  258. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  260. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  261. package/dist/cache/__tests__/memory-store.test.js +367 -0
  262. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  263. package/dist/cache/cache-scope.d.ts +102 -0
  264. package/dist/cache/cache-scope.d.ts.map +1 -0
  265. package/dist/cache/cache-scope.js +440 -0
  266. package/dist/cache/cache-scope.js.map +1 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  270. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  272. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  273. package/dist/cache/cf/cf-cache-store.js +242 -0
  274. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  275. package/dist/cache/cf/index.d.ts +14 -0
  276. package/dist/cache/cf/index.d.ts.map +1 -0
  277. package/dist/cache/cf/index.js +17 -0
  278. package/dist/cache/cf/index.js.map +1 -0
  279. package/dist/cache/document-cache.d.ts +64 -0
  280. package/dist/cache/document-cache.d.ts.map +1 -0
  281. package/dist/cache/document-cache.js +228 -0
  282. package/dist/cache/document-cache.js.map +1 -0
  283. package/dist/cache/index.d.ts +19 -0
  284. package/dist/cache/index.d.ts.map +1 -0
  285. package/dist/cache/index.js +21 -0
  286. package/dist/cache/index.js.map +1 -0
  287. package/dist/cache/memory-segment-store.d.ts +110 -0
  288. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  289. package/dist/cache/memory-segment-store.js +117 -0
  290. package/dist/cache/memory-segment-store.js.map +1 -0
  291. package/dist/cache/memory-store.d.ts +41 -0
  292. package/dist/cache/memory-store.d.ts.map +1 -0
  293. package/dist/cache/memory-store.js +191 -0
  294. package/dist/cache/memory-store.js.map +1 -0
  295. package/dist/cache/types.d.ts +317 -0
  296. package/dist/cache/types.d.ts.map +1 -0
  297. package/dist/cache/types.js +12 -0
  298. package/dist/cache/types.js.map +1 -0
  299. package/dist/client.d.ts +248 -0
  300. package/dist/client.d.ts.map +1 -0
  301. package/dist/client.js +367 -0
  302. package/dist/client.js.map +1 -0
  303. package/dist/client.rsc.d.ts +26 -0
  304. package/dist/client.rsc.d.ts.map +1 -0
  305. package/dist/client.rsc.js +46 -0
  306. package/dist/client.rsc.js.map +1 -0
  307. package/dist/component-utils.d.ts +36 -0
  308. package/dist/component-utils.d.ts.map +1 -0
  309. package/dist/component-utils.js +61 -0
  310. package/dist/component-utils.js.map +1 -0
  311. package/dist/components/DefaultDocument.d.ts +13 -0
  312. package/dist/components/DefaultDocument.d.ts.map +1 -0
  313. package/dist/components/DefaultDocument.js +15 -0
  314. package/dist/components/DefaultDocument.js.map +1 -0
  315. package/dist/debug.d.ts +58 -0
  316. package/dist/debug.d.ts.map +1 -0
  317. package/dist/debug.js +157 -0
  318. package/dist/debug.js.map +1 -0
  319. package/dist/default-error-boundary.d.ts +11 -0
  320. package/dist/default-error-boundary.d.ts.map +1 -0
  321. package/dist/default-error-boundary.js +45 -0
  322. package/dist/default-error-boundary.js.map +1 -0
  323. package/dist/deps/browser.d.ts +2 -0
  324. package/dist/deps/browser.d.ts.map +1 -0
  325. package/dist/deps/browser.js +3 -0
  326. package/dist/deps/browser.js.map +1 -0
  327. package/dist/deps/html-stream-client.d.ts +2 -0
  328. package/dist/deps/html-stream-client.d.ts.map +1 -0
  329. package/dist/deps/html-stream-client.js +3 -0
  330. package/dist/deps/html-stream-client.js.map +1 -0
  331. package/dist/deps/html-stream-server.d.ts +2 -0
  332. package/dist/deps/html-stream-server.d.ts.map +1 -0
  333. package/dist/deps/html-stream-server.js +3 -0
  334. package/dist/deps/html-stream-server.js.map +1 -0
  335. package/dist/deps/rsc.d.ts +2 -0
  336. package/dist/deps/rsc.d.ts.map +1 -0
  337. package/dist/deps/rsc.js +4 -0
  338. package/dist/deps/rsc.js.map +1 -0
  339. package/dist/deps/ssr.d.ts +2 -0
  340. package/dist/deps/ssr.d.ts.map +1 -0
  341. package/dist/deps/ssr.js +3 -0
  342. package/dist/deps/ssr.js.map +1 -0
  343. package/dist/errors.d.ts +174 -0
  344. package/dist/errors.d.ts.map +1 -0
  345. package/dist/errors.js +241 -0
  346. package/dist/errors.js.map +1 -0
  347. package/dist/handle.d.ts +78 -0
  348. package/dist/handle.d.ts.map +1 -0
  349. package/dist/handle.js +82 -0
  350. package/dist/handle.js.map +1 -0
  351. package/dist/handles/MetaTags.d.ts +14 -0
  352. package/dist/handles/MetaTags.d.ts.map +1 -0
  353. package/dist/handles/MetaTags.js +136 -0
  354. package/dist/handles/MetaTags.js.map +1 -0
  355. package/dist/handles/index.d.ts +6 -0
  356. package/dist/handles/index.d.ts.map +1 -0
  357. package/dist/handles/index.js +6 -0
  358. package/dist/handles/index.js.map +1 -0
  359. package/dist/handles/meta.d.ts +39 -0
  360. package/dist/handles/meta.d.ts.map +1 -0
  361. package/dist/handles/meta.js +202 -0
  362. package/dist/handles/meta.js.map +1 -0
  363. package/dist/host/__tests__/errors.test.d.ts +2 -0
  364. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  365. package/dist/host/__tests__/errors.test.js +76 -0
  366. package/dist/host/__tests__/errors.test.js.map +1 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  370. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  372. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  374. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  375. package/dist/host/__tests__/router.test.d.ts +2 -0
  376. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  377. package/dist/host/__tests__/router.test.js +241 -0
  378. package/dist/host/__tests__/router.test.js.map +1 -0
  379. package/dist/host/__tests__/testing.test.d.ts +2 -0
  380. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  381. package/dist/host/__tests__/testing.test.js +64 -0
  382. package/dist/host/__tests__/testing.test.js.map +1 -0
  383. package/dist/host/__tests__/utils.test.d.ts +2 -0
  384. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  385. package/dist/host/__tests__/utils.test.js +29 -0
  386. package/dist/host/__tests__/utils.test.js.map +1 -0
  387. package/dist/host/cookie-handler.d.ts +34 -0
  388. package/dist/host/cookie-handler.d.ts.map +1 -0
  389. package/dist/host/cookie-handler.js +124 -0
  390. package/dist/host/cookie-handler.js.map +1 -0
  391. package/dist/host/errors.d.ts +56 -0
  392. package/dist/host/errors.d.ts.map +1 -0
  393. package/dist/host/errors.js +79 -0
  394. package/dist/host/errors.js.map +1 -0
  395. package/dist/host/index.d.ts +29 -0
  396. package/dist/host/index.d.ts.map +1 -0
  397. package/dist/host/index.js +32 -0
  398. package/dist/host/index.js.map +1 -0
  399. package/dist/host/pattern-matcher.d.ts +36 -0
  400. package/dist/host/pattern-matcher.d.ts.map +1 -0
  401. package/dist/host/pattern-matcher.js +172 -0
  402. package/dist/host/pattern-matcher.js.map +1 -0
  403. package/dist/host/router.d.ts +26 -0
  404. package/dist/host/router.d.ts.map +1 -0
  405. package/dist/host/router.js +218 -0
  406. package/dist/host/router.js.map +1 -0
  407. package/dist/host/testing.d.ts +36 -0
  408. package/dist/host/testing.d.ts.map +1 -0
  409. package/dist/host/testing.js +55 -0
  410. package/dist/host/testing.js.map +1 -0
  411. package/dist/host/types.d.ts +115 -0
  412. package/dist/host/types.d.ts.map +1 -0
  413. package/dist/host/types.js +7 -0
  414. package/dist/host/types.js.map +1 -0
  415. package/dist/host/utils.d.ts +21 -0
  416. package/dist/host/utils.d.ts.map +1 -0
  417. package/dist/host/utils.js +23 -0
  418. package/dist/host/utils.js.map +1 -0
  419. package/dist/href-client.d.ts +131 -0
  420. package/dist/href-client.d.ts.map +1 -0
  421. package/dist/href-client.js +64 -0
  422. package/dist/href-client.js.map +1 -0
  423. package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
  424. package/dist/href-context.d.ts.map +1 -0
  425. package/dist/href-context.js +21 -0
  426. package/dist/href-context.js.map +1 -0
  427. package/dist/index.d.ts +73 -0
  428. package/dist/index.d.ts.map +1 -0
  429. package/dist/index.js +91 -0
  430. package/dist/index.js.map +1 -0
  431. package/dist/index.rsc.d.ts +32 -0
  432. package/dist/index.rsc.d.ts.map +1 -0
  433. package/dist/index.rsc.js +40 -0
  434. package/dist/index.rsc.js.map +1 -0
  435. package/dist/internal-debug.d.ts +2 -0
  436. package/dist/internal-debug.d.ts.map +1 -0
  437. package/dist/internal-debug.js +5 -0
  438. package/dist/internal-debug.js.map +1 -0
  439. package/dist/loader.d.ts +14 -0
  440. package/dist/loader.d.ts.map +1 -0
  441. package/dist/loader.js +20 -0
  442. package/dist/loader.js.map +1 -0
  443. package/dist/loader.rsc.d.ts +19 -0
  444. package/dist/loader.rsc.d.ts.map +1 -0
  445. package/dist/loader.rsc.js +99 -0
  446. package/dist/loader.rsc.js.map +1 -0
  447. package/dist/network-error-thrower.d.ts +17 -0
  448. package/dist/network-error-thrower.d.ts.map +1 -0
  449. package/dist/network-error-thrower.js +14 -0
  450. package/dist/network-error-thrower.js.map +1 -0
  451. package/dist/outlet-context.d.ts +13 -0
  452. package/dist/outlet-context.d.ts.map +1 -0
  453. package/dist/outlet-context.js +3 -0
  454. package/dist/outlet-context.js.map +1 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  456. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  457. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  458. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  459. package/dist/prerender/param-hash.d.ts +16 -0
  460. package/dist/prerender/param-hash.d.ts.map +1 -0
  461. package/dist/prerender/param-hash.js +36 -0
  462. package/dist/prerender/param-hash.js.map +1 -0
  463. package/dist/prerender/store.d.ts +38 -0
  464. package/dist/prerender/store.d.ts.map +1 -0
  465. package/dist/prerender/store.js +61 -0
  466. package/dist/prerender/store.js.map +1 -0
  467. package/dist/prerender.d.ts +66 -0
  468. package/dist/prerender.d.ts.map +1 -0
  469. package/dist/prerender.js +57 -0
  470. package/dist/prerender.js.map +1 -0
  471. package/dist/reverse.d.ts +196 -0
  472. package/dist/reverse.d.ts.map +1 -0
  473. package/dist/reverse.js +78 -0
  474. package/dist/reverse.js.map +1 -0
  475. package/dist/root-error-boundary.d.ts +33 -0
  476. package/dist/root-error-boundary.d.ts.map +1 -0
  477. package/dist/root-error-boundary.js +165 -0
  478. package/dist/root-error-boundary.js.map +1 -0
  479. package/dist/route-content-wrapper.d.ts +46 -0
  480. package/dist/route-content-wrapper.d.ts.map +1 -0
  481. package/dist/route-content-wrapper.js +77 -0
  482. package/dist/route-content-wrapper.js.map +1 -0
  483. package/dist/route-definition.d.ts +421 -0
  484. package/dist/route-definition.d.ts.map +1 -0
  485. package/dist/route-definition.js +868 -0
  486. package/dist/route-definition.js.map +1 -0
  487. package/dist/route-map-builder.d.ts +155 -0
  488. package/dist/route-map-builder.d.ts.map +1 -0
  489. package/dist/route-map-builder.js +237 -0
  490. package/dist/route-map-builder.js.map +1 -0
  491. package/dist/route-types.d.ts +165 -0
  492. package/dist/route-types.d.ts.map +1 -0
  493. package/dist/route-types.js +7 -0
  494. package/dist/route-types.js.map +1 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  496. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  497. package/dist/router/__tests__/handler-context.test.js +65 -0
  498. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  502. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  503. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  504. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  505. package/dist/router/__tests__/match-context.test.js +92 -0
  506. package/dist/router/__tests__/match-context.test.js.map +1 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  508. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  509. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  510. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  511. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  512. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  513. package/dist/router/__tests__/match-result.test.js +457 -0
  514. package/dist/router/__tests__/match-result.test.js.map +1 -0
  515. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  516. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  517. package/dist/router/__tests__/on-error.test.js +678 -0
  518. package/dist/router/__tests__/on-error.test.js.map +1 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  520. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  521. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  522. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  526. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  527. package/dist/router/error-handling.d.ts +77 -0
  528. package/dist/router/error-handling.d.ts.map +1 -0
  529. package/dist/router/error-handling.js +202 -0
  530. package/dist/router/error-handling.js.map +1 -0
  531. package/dist/router/handler-context.d.ts +20 -0
  532. package/dist/router/handler-context.d.ts.map +1 -0
  533. package/dist/router/handler-context.js +198 -0
  534. package/dist/router/handler-context.js.map +1 -0
  535. package/dist/router/intercept-resolution.d.ts +66 -0
  536. package/dist/router/intercept-resolution.d.ts.map +1 -0
  537. package/dist/router/intercept-resolution.js +246 -0
  538. package/dist/router/intercept-resolution.js.map +1 -0
  539. package/dist/router/loader-resolution.d.ts +64 -0
  540. package/dist/router/loader-resolution.d.ts.map +1 -0
  541. package/dist/router/loader-resolution.js +284 -0
  542. package/dist/router/loader-resolution.js.map +1 -0
  543. package/dist/router/logging.d.ts +15 -0
  544. package/dist/router/logging.d.ts.map +1 -0
  545. package/dist/router/logging.js +99 -0
  546. package/dist/router/logging.js.map +1 -0
  547. package/dist/router/manifest.d.ts +22 -0
  548. package/dist/router/manifest.d.ts.map +1 -0
  549. package/dist/router/manifest.js +181 -0
  550. package/dist/router/manifest.js.map +1 -0
  551. package/dist/router/match-api.d.ts +35 -0
  552. package/dist/router/match-api.d.ts.map +1 -0
  553. package/dist/router/match-api.js +406 -0
  554. package/dist/router/match-api.js.map +1 -0
  555. package/dist/router/match-context.d.ts +206 -0
  556. package/dist/router/match-context.d.ts.map +1 -0
  557. package/dist/router/match-context.js +17 -0
  558. package/dist/router/match-context.js.map +1 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  560. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  561. package/dist/router/match-middleware/background-revalidation.js +75 -0
  562. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  564. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  565. package/dist/router/match-middleware/cache-lookup.js +257 -0
  566. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  567. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  568. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  569. package/dist/router/match-middleware/cache-store.js +108 -0
  570. package/dist/router/match-middleware/cache-store.js.map +1 -0
  571. package/dist/router/match-middleware/index.d.ts +81 -0
  572. package/dist/router/match-middleware/index.d.ts.map +1 -0
  573. package/dist/router/match-middleware/index.js +80 -0
  574. package/dist/router/match-middleware/index.js.map +1 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  576. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  577. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  578. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  580. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  581. package/dist/router/match-middleware/segment-resolution.js +53 -0
  582. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  583. package/dist/router/match-pipelines.d.ts +147 -0
  584. package/dist/router/match-pipelines.d.ts.map +1 -0
  585. package/dist/router/match-pipelines.js +82 -0
  586. package/dist/router/match-pipelines.js.map +1 -0
  587. package/dist/router/match-result.d.ts +126 -0
  588. package/dist/router/match-result.d.ts.map +1 -0
  589. package/dist/router/match-result.js +93 -0
  590. package/dist/router/match-result.js.map +1 -0
  591. package/dist/router/metrics.d.ts +20 -0
  592. package/dist/router/metrics.d.ts.map +1 -0
  593. package/dist/router/metrics.js +47 -0
  594. package/dist/router/metrics.js.map +1 -0
  595. package/dist/router/middleware.d.ts +249 -0
  596. package/dist/router/middleware.d.ts.map +1 -0
  597. package/dist/router/middleware.js +434 -0
  598. package/dist/router/middleware.js.map +1 -0
  599. package/dist/router/middleware.test.d.ts +2 -0
  600. package/dist/router/middleware.test.d.ts.map +1 -0
  601. package/dist/router/middleware.test.js +816 -0
  602. package/dist/router/middleware.test.js.map +1 -0
  603. package/dist/router/pattern-matching.d.ts +149 -0
  604. package/dist/router/pattern-matching.d.ts.map +1 -0
  605. package/dist/router/pattern-matching.js +349 -0
  606. package/dist/router/pattern-matching.js.map +1 -0
  607. package/dist/router/revalidation.d.ts +44 -0
  608. package/dist/router/revalidation.d.ts.map +1 -0
  609. package/dist/router/revalidation.js +147 -0
  610. package/dist/router/revalidation.js.map +1 -0
  611. package/dist/router/router-context.d.ts +135 -0
  612. package/dist/router/router-context.d.ts.map +1 -0
  613. package/dist/router/router-context.js +36 -0
  614. package/dist/router/router-context.js.map +1 -0
  615. package/dist/router/segment-resolution.d.ts +127 -0
  616. package/dist/router/segment-resolution.d.ts.map +1 -0
  617. package/dist/router/segment-resolution.js +919 -0
  618. package/dist/router/segment-resolution.js.map +1 -0
  619. package/dist/router/trie-matching.d.ts +40 -0
  620. package/dist/router/trie-matching.d.ts.map +1 -0
  621. package/dist/router/trie-matching.js +127 -0
  622. package/dist/router/trie-matching.js.map +1 -0
  623. package/dist/router/types.d.ts +136 -0
  624. package/dist/router/types.d.ts.map +1 -0
  625. package/dist/router/types.js +7 -0
  626. package/dist/router/types.js.map +1 -0
  627. package/dist/router.d.ts +753 -0
  628. package/dist/router.d.ts.map +1 -0
  629. package/dist/router.gen.d.ts +6 -0
  630. package/dist/router.gen.d.ts.map +1 -0
  631. package/dist/router.gen.js +6 -0
  632. package/dist/router.gen.js.map +1 -0
  633. package/dist/router.js +1304 -0
  634. package/dist/router.js.map +1 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  636. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  637. package/dist/rsc/__tests__/helpers.test.js +140 -0
  638. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  639. package/dist/rsc/handler.d.ts +45 -0
  640. package/dist/rsc/handler.d.ts.map +1 -0
  641. package/dist/rsc/handler.js +1172 -0
  642. package/dist/rsc/handler.js.map +1 -0
  643. package/dist/rsc/helpers.d.ts +16 -0
  644. package/dist/rsc/helpers.d.ts.map +1 -0
  645. package/dist/rsc/helpers.js +55 -0
  646. package/dist/rsc/helpers.js.map +1 -0
  647. package/dist/rsc/index.d.ts +22 -0
  648. package/dist/rsc/index.d.ts.map +1 -0
  649. package/dist/rsc/index.js +23 -0
  650. package/dist/rsc/index.js.map +1 -0
  651. package/dist/rsc/nonce.d.ts +9 -0
  652. package/dist/rsc/nonce.d.ts.map +1 -0
  653. package/dist/rsc/nonce.js +18 -0
  654. package/dist/rsc/nonce.js.map +1 -0
  655. package/dist/rsc/types.d.ts +206 -0
  656. package/dist/rsc/types.d.ts.map +1 -0
  657. package/dist/rsc/types.js +8 -0
  658. package/dist/rsc/types.js.map +1 -0
  659. package/dist/search-params.d.ts +103 -0
  660. package/dist/search-params.d.ts.map +1 -0
  661. package/dist/search-params.js +74 -0
  662. package/dist/search-params.js.map +1 -0
  663. package/dist/segment-system.d.ts +75 -0
  664. package/dist/segment-system.d.ts.map +1 -0
  665. package/dist/segment-system.js +336 -0
  666. package/dist/segment-system.js.map +1 -0
  667. package/dist/server/context.d.ts +245 -0
  668. package/dist/server/context.d.ts.map +1 -0
  669. package/dist/server/context.js +197 -0
  670. package/dist/server/context.js.map +1 -0
  671. package/dist/server/fetchable-loader-store.d.ts +18 -0
  672. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  673. package/dist/server/fetchable-loader-store.js +18 -0
  674. package/dist/server/fetchable-loader-store.js.map +1 -0
  675. package/dist/server/handle-store.d.ts +85 -0
  676. package/dist/server/handle-store.d.ts.map +1 -0
  677. package/dist/server/handle-store.js +142 -0
  678. package/dist/server/handle-store.js.map +1 -0
  679. package/dist/server/loader-registry.d.ts +55 -0
  680. package/dist/server/loader-registry.d.ts.map +1 -0
  681. package/dist/server/loader-registry.js +132 -0
  682. package/dist/server/loader-registry.js.map +1 -0
  683. package/dist/server/request-context.d.ts +226 -0
  684. package/dist/server/request-context.d.ts.map +1 -0
  685. package/dist/server/request-context.js +290 -0
  686. package/dist/server/request-context.js.map +1 -0
  687. package/dist/server/root-layout.d.ts +4 -0
  688. package/dist/server/root-layout.d.ts.map +1 -0
  689. package/dist/server/root-layout.js +5 -0
  690. package/dist/server/root-layout.js.map +1 -0
  691. package/dist/server.d.ts +15 -0
  692. package/dist/server.d.ts.map +1 -0
  693. package/dist/server.js +20 -0
  694. package/dist/server.js.map +1 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  698. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  699. package/dist/ssr/index.d.ts +98 -0
  700. package/dist/ssr/index.d.ts.map +1 -0
  701. package/dist/ssr/index.js +158 -0
  702. package/dist/ssr/index.js.map +1 -0
  703. package/dist/static-handler.d.ts +50 -0
  704. package/dist/static-handler.d.ts.map +1 -0
  705. package/dist/static-handler.gen.d.ts +5 -0
  706. package/dist/static-handler.gen.d.ts.map +1 -0
  707. package/dist/static-handler.gen.js +5 -0
  708. package/dist/static-handler.gen.js.map +1 -0
  709. package/dist/static-handler.js +29 -0
  710. package/dist/static-handler.js.map +1 -0
  711. package/dist/theme/ThemeProvider.d.ts +20 -0
  712. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  713. package/dist/theme/ThemeProvider.js +240 -0
  714. package/dist/theme/ThemeProvider.js.map +1 -0
  715. package/dist/theme/ThemeScript.d.ts +48 -0
  716. package/dist/theme/ThemeScript.d.ts.map +1 -0
  717. package/dist/theme/ThemeScript.js +13 -0
  718. package/dist/theme/ThemeScript.js.map +1 -0
  719. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  720. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  721. package/dist/theme/__tests__/theme.test.js +103 -0
  722. package/dist/theme/__tests__/theme.test.js.map +1 -0
  723. package/dist/theme/constants.d.ts +29 -0
  724. package/dist/theme/constants.d.ts.map +1 -0
  725. package/dist/theme/constants.js +48 -0
  726. package/dist/theme/constants.js.map +1 -0
  727. package/dist/theme/index.d.ts +31 -0
  728. package/dist/theme/index.d.ts.map +1 -0
  729. package/dist/theme/index.js +36 -0
  730. package/dist/theme/index.js.map +1 -0
  731. package/dist/theme/theme-context.d.ts +40 -0
  732. package/dist/theme/theme-context.d.ts.map +1 -0
  733. package/dist/theme/theme-context.js +60 -0
  734. package/dist/theme/theme-context.js.map +1 -0
  735. package/dist/theme/theme-script.d.ts +27 -0
  736. package/dist/theme/theme-script.d.ts.map +1 -0
  737. package/dist/theme/theme-script.js +147 -0
  738. package/dist/theme/theme-script.js.map +1 -0
  739. package/dist/theme/types.d.ts +163 -0
  740. package/dist/theme/types.d.ts.map +1 -0
  741. package/dist/theme/types.js +11 -0
  742. package/dist/theme/types.js.map +1 -0
  743. package/dist/theme/use-theme.d.ts +12 -0
  744. package/dist/theme/use-theme.d.ts.map +1 -0
  745. package/dist/theme/use-theme.js +40 -0
  746. package/dist/theme/use-theme.js.map +1 -0
  747. package/dist/types.d.ts +1479 -0
  748. package/dist/types.d.ts.map +1 -0
  749. package/dist/types.js +10 -0
  750. package/dist/types.js.map +1 -0
  751. package/dist/urls.d.ts +441 -0
  752. package/dist/urls.d.ts.map +1 -0
  753. package/dist/urls.gen.d.ts +8 -0
  754. package/dist/urls.gen.d.ts.map +1 -0
  755. package/dist/urls.gen.js +8 -0
  756. package/dist/urls.gen.js.map +1 -0
  757. package/dist/urls.js +443 -0
  758. package/dist/urls.js.map +1 -0
  759. package/dist/use-loader.d.ts +127 -0
  760. package/dist/use-loader.d.ts.map +1 -0
  761. package/dist/use-loader.js +237 -0
  762. package/dist/use-loader.js.map +1 -0
  763. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  767. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  771. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  775. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  777. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  779. package/dist/vite/ast-handler-extract.d.ts +49 -0
  780. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  781. package/dist/vite/ast-handler-extract.js +249 -0
  782. package/dist/vite/ast-handler-extract.js.map +1 -0
  783. package/dist/vite/expose-action-id.d.ts +19 -0
  784. package/dist/vite/expose-action-id.d.ts.map +1 -0
  785. package/dist/vite/expose-action-id.js +250 -0
  786. package/dist/vite/expose-action-id.js.map +1 -0
  787. package/dist/vite/expose-id-utils.d.ts +69 -0
  788. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  789. package/dist/vite/expose-id-utils.js +289 -0
  790. package/dist/vite/expose-id-utils.js.map +1 -0
  791. package/dist/vite/expose-internal-ids.d.ts +22 -0
  792. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  793. package/dist/vite/expose-internal-ids.js +886 -0
  794. package/dist/vite/expose-internal-ids.js.map +1 -0
  795. package/dist/vite/index.d.ts +149 -0
  796. package/dist/vite/index.d.ts.map +1 -0
  797. package/dist/vite/index.js +3995 -2489
  798. package/dist/vite/index.js.map +1 -0
  799. package/dist/vite/package-resolution.d.ts +43 -0
  800. package/dist/vite/package-resolution.d.ts.map +1 -0
  801. package/dist/vite/package-resolution.js +112 -0
  802. package/dist/vite/package-resolution.js.map +1 -0
  803. package/dist/vite/virtual-entries.d.ts +25 -0
  804. package/dist/vite/virtual-entries.d.ts.map +1 -0
  805. package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
  806. package/dist/vite/virtual-entries.js.map +1 -0
  807. package/package.json +57 -52
  808. package/skills/breadcrumbs/SKILL.md +250 -0
  809. package/skills/cache-guide/SKILL.md +262 -0
  810. package/skills/caching/SKILL.md +85 -23
  811. package/skills/composability/SKILL.md +172 -0
  812. package/skills/debug-manifest/SKILL.md +12 -8
  813. package/skills/document-cache/SKILL.md +18 -16
  814. package/skills/fonts/SKILL.md +6 -4
  815. package/skills/hooks/SKILL.md +328 -70
  816. package/skills/host-router/SKILL.md +218 -0
  817. package/skills/intercept/SKILL.md +131 -8
  818. package/skills/layout/SKILL.md +100 -3
  819. package/skills/links/SKILL.md +62 -15
  820. package/skills/loader/SKILL.md +368 -42
  821. package/skills/middleware/SKILL.md +171 -34
  822. package/skills/mime-routes/SKILL.md +14 -10
  823. package/skills/parallel/SKILL.md +137 -1
  824. package/skills/prerender/SKILL.md +366 -28
  825. package/skills/rango/SKILL.md +85 -21
  826. package/skills/response-routes/SKILL.md +136 -83
  827. package/skills/route/SKILL.md +195 -21
  828. package/skills/router-setup/SKILL.md +123 -30
  829. package/skills/theme/SKILL.md +9 -8
  830. package/skills/typesafety/SKILL.md +240 -102
  831. package/skills/use-cache/SKILL.md +324 -0
  832. package/src/__internal.ts +102 -4
  833. package/src/bin/rango.ts +312 -15
  834. package/src/browser/action-coordinator.ts +97 -0
  835. package/src/browser/action-response-classifier.ts +99 -0
  836. package/src/browser/event-controller.ts +92 -64
  837. package/src/browser/history-state.ts +80 -0
  838. package/src/browser/intercept-utils.ts +52 -0
  839. package/src/browser/link-interceptor.ts +24 -4
  840. package/src/browser/logging.ts +11 -0
  841. package/src/browser/merge-segment-loaders.ts +20 -12
  842. package/src/browser/navigation-bridge.ts +266 -558
  843. package/src/browser/navigation-client.ts +132 -75
  844. package/src/browser/navigation-store.ts +33 -50
  845. package/src/browser/navigation-transaction.ts +297 -0
  846. package/src/browser/network-error-handler.ts +61 -0
  847. package/src/browser/partial-update.ts +292 -309
  848. package/src/browser/prefetch/cache.ts +206 -0
  849. package/src/browser/prefetch/fetch.ts +144 -0
  850. package/src/browser/prefetch/observer.ts +65 -0
  851. package/src/browser/prefetch/policy.ts +48 -0
  852. package/src/browser/prefetch/queue.ts +128 -0
  853. package/src/browser/rango-state.ts +112 -0
  854. package/src/browser/react/Link.tsx +190 -70
  855. package/src/browser/react/NavigationProvider.tsx +78 -11
  856. package/src/browser/react/context.ts +6 -0
  857. package/src/browser/react/filter-segment-order.ts +11 -0
  858. package/src/browser/react/index.ts +12 -12
  859. package/src/browser/react/location-state-shared.ts +95 -53
  860. package/src/browser/react/location-state.ts +60 -15
  861. package/src/browser/react/mount-context.ts +6 -1
  862. package/src/browser/react/nonce-context.ts +23 -0
  863. package/src/browser/react/shallow-equal.ts +27 -0
  864. package/src/browser/react/use-action.ts +29 -51
  865. package/src/browser/react/use-client-cache.ts +5 -3
  866. package/src/browser/react/use-handle.ts +29 -70
  867. package/src/browser/react/use-link-status.ts +6 -5
  868. package/src/browser/react/use-navigation.ts +22 -63
  869. package/src/browser/react/use-params.ts +65 -0
  870. package/src/browser/react/use-pathname.ts +47 -0
  871. package/src/browser/react/use-router.ts +63 -0
  872. package/src/browser/react/use-search-params.ts +56 -0
  873. package/src/browser/react/use-segments.ts +80 -97
  874. package/src/browser/response-adapter.ts +73 -0
  875. package/src/browser/rsc-router.tsx +188 -57
  876. package/src/browser/scroll-restoration.ts +117 -44
  877. package/src/browser/segment-reconciler.ts +221 -0
  878. package/src/browser/segment-structure-assert.ts +16 -0
  879. package/src/browser/server-action-bridge.ts +488 -606
  880. package/src/browser/shallow.ts +6 -1
  881. package/src/browser/types.ts +116 -47
  882. package/src/browser/validate-redirect-origin.ts +29 -0
  883. package/src/build/generate-manifest.ts +63 -21
  884. package/src/build/generate-route-types.ts +36 -1038
  885. package/src/build/index.ts +2 -5
  886. package/src/build/route-trie.ts +38 -12
  887. package/src/build/route-types/ast-helpers.ts +25 -0
  888. package/src/build/route-types/ast-route-extraction.ts +98 -0
  889. package/src/build/route-types/codegen.ts +102 -0
  890. package/src/build/route-types/include-resolution.ts +411 -0
  891. package/src/build/route-types/param-extraction.ts +48 -0
  892. package/src/build/route-types/per-module-writer.ts +128 -0
  893. package/src/build/route-types/router-processing.ts +479 -0
  894. package/src/build/route-types/scan-filter.ts +78 -0
  895. package/src/build/runtime-discovery.ts +231 -0
  896. package/src/cache/background-task.ts +34 -0
  897. package/src/cache/cache-key-utils.ts +44 -0
  898. package/src/cache/cache-policy.ts +125 -0
  899. package/src/cache/cache-runtime.ts +338 -0
  900. package/src/cache/cache-scope.ts +122 -303
  901. package/src/cache/cf/cf-cache-store.ts +571 -17
  902. package/src/cache/cf/index.ts +13 -3
  903. package/src/cache/document-cache.ts +116 -77
  904. package/src/cache/handle-capture.ts +81 -0
  905. package/src/cache/handle-snapshot.ts +41 -0
  906. package/src/cache/index.ts +1 -15
  907. package/src/cache/memory-segment-store.ts +191 -13
  908. package/src/cache/profile-registry.ts +73 -0
  909. package/src/cache/read-through-swr.ts +134 -0
  910. package/src/cache/segment-codec.ts +256 -0
  911. package/src/cache/taint.ts +98 -0
  912. package/src/cache/types.ts +72 -122
  913. package/src/client.rsc.tsx +3 -1
  914. package/src/client.tsx +84 -126
  915. package/src/component-utils.ts +4 -4
  916. package/src/components/DefaultDocument.tsx +5 -1
  917. package/src/context-var.ts +86 -0
  918. package/src/debug.ts +19 -9
  919. package/src/errors.ts +77 -7
  920. package/src/handle.ts +12 -7
  921. package/src/handles/MetaTags.tsx +73 -20
  922. package/src/handles/breadcrumbs.ts +66 -0
  923. package/src/handles/index.ts +1 -0
  924. package/src/handles/meta.ts +30 -13
  925. package/src/host/cookie-handler.ts +21 -15
  926. package/src/host/errors.ts +8 -8
  927. package/src/host/index.ts +4 -7
  928. package/src/host/pattern-matcher.ts +27 -27
  929. package/src/host/router.ts +61 -39
  930. package/src/host/testing.ts +8 -8
  931. package/src/host/types.ts +15 -7
  932. package/src/host/utils.ts +1 -1
  933. package/src/href-client.ts +65 -45
  934. package/src/index.rsc.ts +104 -40
  935. package/src/index.ts +122 -67
  936. package/src/internal-debug.ts +9 -3
  937. package/src/loader.rsc.ts +18 -93
  938. package/src/loader.ts +26 -9
  939. package/src/network-error-thrower.tsx +3 -1
  940. package/src/outlet-provider.tsx +45 -0
  941. package/src/prerender/param-hash.ts +4 -2
  942. package/src/prerender/store.ts +121 -17
  943. package/src/prerender.ts +325 -20
  944. package/src/reverse.ts +144 -124
  945. package/src/root-error-boundary.tsx +41 -29
  946. package/src/route-content-wrapper.tsx +7 -4
  947. package/src/route-definition/dsl-helpers.ts +959 -0
  948. package/src/route-definition/helper-factories.ts +200 -0
  949. package/src/route-definition/helpers-types.ts +430 -0
  950. package/src/route-definition/index.ts +52 -0
  951. package/src/route-definition/redirect.ts +93 -0
  952. package/src/route-definition.ts +1 -1450
  953. package/src/route-map-builder.ts +87 -133
  954. package/src/route-name.ts +53 -0
  955. package/src/route-types.ts +41 -6
  956. package/src/router/content-negotiation.ts +116 -0
  957. package/src/router/debug-manifest.ts +72 -0
  958. package/src/router/error-handling.ts +9 -9
  959. package/src/router/find-match.ts +160 -0
  960. package/src/router/handler-context.ts +324 -116
  961. package/src/router/intercept-resolution.ts +11 -4
  962. package/src/router/lazy-includes.ts +237 -0
  963. package/src/router/loader-resolution.ts +179 -133
  964. package/src/router/logging.ts +112 -6
  965. package/src/router/manifest.ts +58 -19
  966. package/src/router/match-api.ts +89 -88
  967. package/src/router/match-context.ts +4 -2
  968. package/src/router/match-handlers.ts +440 -0
  969. package/src/router/match-middleware/background-revalidation.ts +84 -89
  970. package/src/router/match-middleware/cache-lookup.ts +261 -48
  971. package/src/router/match-middleware/cache-store.ts +54 -13
  972. package/src/router/match-middleware/intercept-resolution.ts +45 -22
  973. package/src/router/match-middleware/segment-resolution.ts +20 -9
  974. package/src/router/match-pipelines.ts +10 -45
  975. package/src/router/match-result.ts +34 -17
  976. package/src/router/metrics.ts +235 -15
  977. package/src/router/middleware-cookies.ts +55 -0
  978. package/src/router/middleware-types.ts +222 -0
  979. package/src/router/middleware.ts +327 -369
  980. package/src/router/pattern-matching.ts +169 -31
  981. package/src/router/prerender-match.ts +402 -0
  982. package/src/router/preview-match.ts +170 -0
  983. package/src/router/revalidation.ts +105 -14
  984. package/src/router/router-context.ts +40 -21
  985. package/src/router/router-interfaces.ts +452 -0
  986. package/src/router/router-options.ts +592 -0
  987. package/src/router/router-registry.ts +24 -0
  988. package/src/router/segment-resolution/fresh.ts +656 -0
  989. package/src/router/segment-resolution/helpers.ts +263 -0
  990. package/src/router/segment-resolution/loader-cache.ts +199 -0
  991. package/src/router/segment-resolution/revalidation.ts +1277 -0
  992. package/src/router/segment-resolution/static-store.ts +67 -0
  993. package/src/router/segment-resolution.ts +21 -1354
  994. package/src/router/segment-wrappers.ts +291 -0
  995. package/src/router/telemetry-otel.ts +299 -0
  996. package/src/router/telemetry.ts +300 -0
  997. package/src/router/timeout.ts +148 -0
  998. package/src/router/trie-matching.ts +96 -29
  999. package/src/router/types.ts +15 -9
  1000. package/src/router.ts +642 -2366
  1001. package/src/rsc/handler-context.ts +45 -0
  1002. package/src/rsc/handler.ts +646 -1027
  1003. package/src/rsc/helpers.ts +140 -6
  1004. package/src/rsc/index.ts +0 -20
  1005. package/src/rsc/loader-fetch.ts +209 -0
  1006. package/src/rsc/manifest-init.ts +86 -0
  1007. package/src/rsc/nonce.ts +14 -0
  1008. package/src/rsc/origin-guard.ts +141 -0
  1009. package/src/rsc/progressive-enhancement.ts +379 -0
  1010. package/src/rsc/response-error.ts +37 -0
  1011. package/src/rsc/response-route-handler.ts +347 -0
  1012. package/src/rsc/rsc-rendering.ts +237 -0
  1013. package/src/rsc/runtime-warnings.ts +42 -0
  1014. package/src/rsc/server-action.ts +348 -0
  1015. package/src/rsc/ssr-setup.ts +128 -0
  1016. package/src/rsc/types.ts +38 -11
  1017. package/src/search-params.ts +66 -54
  1018. package/src/segment-system.tsx +165 -17
  1019. package/src/server/context.ts +237 -54
  1020. package/src/server/cookie-store.ts +190 -0
  1021. package/src/server/fetchable-loader-store.ts +11 -6
  1022. package/src/server/handle-store.ts +94 -15
  1023. package/src/server/loader-registry.ts +15 -56
  1024. package/src/server/request-context.ts +438 -71
  1025. package/src/server.ts +26 -164
  1026. package/src/ssr/index.tsx +101 -31
  1027. package/src/static-handler.ts +22 -4
  1028. package/src/theme/ThemeProvider.tsx +21 -15
  1029. package/src/theme/ThemeScript.tsx +5 -5
  1030. package/src/theme/constants.ts +5 -2
  1031. package/src/theme/index.ts +4 -14
  1032. package/src/theme/theme-context.ts +4 -30
  1033. package/src/theme/theme-script.ts +21 -18
  1034. package/src/types/boundaries.ts +158 -0
  1035. package/src/types/cache-types.ts +198 -0
  1036. package/src/types/error-types.ts +192 -0
  1037. package/src/types/global-namespace.ts +100 -0
  1038. package/src/types/handler-context.ts +687 -0
  1039. package/src/types/index.ts +88 -0
  1040. package/src/types/loader-types.ts +183 -0
  1041. package/src/types/route-config.ts +170 -0
  1042. package/src/types/route-entry.ts +109 -0
  1043. package/src/types/segments.ts +150 -0
  1044. package/src/types.ts +1 -1795
  1045. package/src/urls/include-helper.ts +197 -0
  1046. package/src/urls/index.ts +53 -0
  1047. package/src/urls/path-helper-types.ts +339 -0
  1048. package/src/urls/path-helper.ts +329 -0
  1049. package/src/urls/pattern-types.ts +95 -0
  1050. package/src/urls/response-types.ts +106 -0
  1051. package/src/urls/type-extraction.ts +372 -0
  1052. package/src/urls/urls-function.ts +98 -0
  1053. package/src/urls.ts +1 -1323
  1054. package/src/use-loader.tsx +85 -77
  1055. package/src/vite/discovery/bundle-postprocess.ts +184 -0
  1056. package/src/vite/discovery/discover-routers.ts +344 -0
  1057. package/src/vite/discovery/prerender-collection.ts +385 -0
  1058. package/src/vite/discovery/route-types-writer.ts +258 -0
  1059. package/src/vite/discovery/self-gen-tracking.ts +47 -0
  1060. package/src/vite/discovery/state.ts +108 -0
  1061. package/src/vite/discovery/virtual-module-codegen.ts +203 -0
  1062. package/src/vite/index.ts +11 -2259
  1063. package/src/vite/plugin-types.ts +48 -0
  1064. package/src/vite/plugins/cjs-to-esm.ts +93 -0
  1065. package/src/vite/plugins/client-ref-dedup.ts +115 -0
  1066. package/src/vite/plugins/client-ref-hashing.ts +105 -0
  1067. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -47
  1068. package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +8 -43
  1069. package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
  1070. package/src/vite/plugins/expose-ids/handler-transform.ts +179 -0
  1071. package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
  1072. package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
  1073. package/src/vite/plugins/expose-ids/types.ts +45 -0
  1074. package/src/vite/plugins/expose-internal-ids.ts +569 -0
  1075. package/src/vite/plugins/refresh-cmd.ts +65 -0
  1076. package/src/vite/plugins/use-cache-transform.ts +323 -0
  1077. package/src/vite/plugins/version-injector.ts +83 -0
  1078. package/src/vite/plugins/version-plugin.ts +266 -0
  1079. package/src/vite/plugins/virtual-entries.ts +123 -0
  1080. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  1081. package/src/vite/rango.ts +445 -0
  1082. package/src/vite/router-discovery.ts +777 -0
  1083. package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +181 -9
  1084. package/src/vite/utils/banner.ts +36 -0
  1085. package/src/vite/utils/bundle-analysis.ts +137 -0
  1086. package/src/vite/utils/manifest-utils.ts +70 -0
  1087. package/src/vite/{package-resolution.ts → utils/package-resolution.ts} +25 -29
  1088. package/src/vite/utils/prerender-utils.ts +189 -0
  1089. package/src/vite/utils/shared-utils.ts +169 -0
  1090. package/CLAUDE.md +0 -43
  1091. package/src/browser/lru-cache.ts +0 -69
  1092. package/src/browser/request-controller.ts +0 -164
  1093. package/src/cache/memory-store.ts +0 -253
  1094. package/src/router.gen.ts +0 -6
  1095. package/src/static-handler.gen.ts +0 -5
  1096. package/src/urls.gen.ts +0 -8
  1097. package/src/vite/expose-internal-ids.ts +0 -1167
  1098. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
@@ -9,169 +9,55 @@
9
9
  * - Forgiving API: if middleware doesn't return, original response is used
10
10
  */
11
11
 
12
- import type { RouterEnv } from "../types.js";
13
-
14
- /**
15
- * Helper type to extract Variables from RouterEnv
16
- * Uses 0 extends 1 & TEnv to detect `any` type and fall back to Record<string, unknown>
17
- */
18
- type ExtractVariables<TEnv> = 0 extends 1 & TEnv
19
- ? Record<string, unknown> // TEnv is any
20
- : TEnv extends RouterEnv<unknown, infer V>
21
- ? V
22
- : Record<string, unknown>;
23
-
24
- /**
25
- * Get variable function type
26
- */
27
- type GetVariableFn<TEnv> = <K extends keyof ExtractVariables<TEnv>>(
28
- key: K
29
- ) => ExtractVariables<TEnv>[K];
30
-
31
- /**
32
- * Set variable function type
33
- */
34
- type SetVariableFn<TEnv> = <K extends keyof ExtractVariables<TEnv>>(
35
- key: K,
36
- value: ExtractVariables<TEnv>[K]
37
- ) => void;
12
+ import { contextGet, contextSet } from "../context-var.js";
13
+ import type {
14
+ CollectedMiddleware,
15
+ MiddlewareCollectableEntry,
16
+ MiddlewareContext,
17
+ MiddlewareEntry,
18
+ MiddlewareFn,
19
+ ResponseHolder,
20
+ } from "./middleware-types.js";
21
+ import { _getRequestContext } from "../server/request-context.js";
22
+ import { isAutoGeneratedRouteName } from "../route-name.js";
23
+ import { appendMetric, createMetricsStore } from "./metrics.js";
24
+ import { stripInternalParams } from "./handler-context.js";
25
+
26
+ // Re-export types and cookie utilities for backward compatibility
27
+ export type {
28
+ CookieOptions,
29
+ CollectedMiddleware,
30
+ MiddlewareCollectableEntry,
31
+ MiddlewareContext,
32
+ MiddlewareEntry,
33
+ MiddlewareFn,
34
+ ResponseHolder,
35
+ } from "./middleware-types.js";
36
+ export { parseCookies, serializeCookie } from "./middleware-cookies.js";
37
+
38
+ const MIDDLEWARE_METRIC_DEPTH = 1;
39
+ /** Ignore post-next() durations below this threshold (measurement noise). */
40
+ const POST_METRIC_MIN_DURATION_MS = 0.01;
41
+
42
+ function getMiddlewareMetricBase<TEnv>(
43
+ entry: MiddlewareEntry<TEnv>,
44
+ ordinal: number,
45
+ ): string {
46
+ const handlerName = entry.handler.name?.trim();
47
+ const scope = entry.pattern ?? "*";
38
48
 
39
- /**
40
- * Cookie options for setting cookies
41
- */
42
- export interface CookieOptions {
43
- domain?: string;
44
- path?: string;
45
- maxAge?: number;
46
- expires?: Date;
47
- httpOnly?: boolean;
48
- secure?: boolean;
49
- sameSite?: "strict" | "lax" | "none";
50
- }
49
+ if (handlerName) {
50
+ return `${handlerName}@${scope}`;
51
+ }
51
52
 
52
- /**
53
- * Context passed to middleware
54
- *
55
- * @template TEnv - Environment type (bindings, variables) - defaults to any for internal flexibility
56
- * @template TParams - URL params type (typed for route middleware, Record<string, string> for global middleware)
57
- */
58
- export interface MiddlewareContext<
59
- TEnv = any,
60
- TParams = Record<string, string>,
61
- > {
62
- /** Original request */
63
- request: Request;
64
-
65
- /** Parsed URL */
66
- url: URL;
67
-
68
- /** URL pathname */
69
- pathname: string;
70
-
71
- /** URL search params */
72
- searchParams: URLSearchParams;
73
-
74
- /** Platform bindings (Cloudflare, etc.) */
75
- env: TEnv extends RouterEnv<infer B, unknown> ? B : {};
76
-
77
- /** URL params extracted from route/middleware pattern */
78
- params: TParams;
79
-
80
- /**
81
- * Response object - available immediately via stub, real response after `await next()`
82
- *
83
- * Headers set before `next()` are merged into the final response.
84
- * Can be used to modify headers directly like Hono's `c.res`.
85
- *
86
- * @example
87
- * ```typescript
88
- * middleware(async (ctx, next) => {
89
- * // Set headers BEFORE next() - will be merged into final response
90
- * ctx.res.headers.set('X-Request-Id', generateId());
91
- *
92
- * await next();
93
- *
94
- * // Set headers AFTER next() - applied directly
95
- * ctx.res.headers.set('X-Custom', 'value');
96
- * // No return needed!
97
- * });
98
- * ```
99
- */
100
- res: Response;
101
-
102
- /** Get a cookie value */
103
- cookie(name: string): string | undefined;
104
-
105
- /** Get all cookies as object */
106
- cookies(): Record<string, string>;
107
-
108
- /** Set a cookie on the response */
109
- setCookie(name: string, value: string, options?: CookieOptions): void;
110
-
111
- /** Delete a cookie */
112
- deleteCookie(
113
- name: string,
114
- options?: Pick<CookieOptions, "domain" | "path">
115
- ): void;
116
-
117
- /** Get a context variable (shared with route handlers) */
118
- get: GetVariableFn<TEnv>;
119
-
120
- /** Set a context variable (shared with route handlers) */
121
- set: SetVariableFn<TEnv>;
122
-
123
- /**
124
- * Set a response header - can be called before or after `next()`
125
- *
126
- * When called before `next()`, headers are queued and merged into the final response.
127
- * When called after `next()`, headers are set directly on the response.
128
- * Shorthand for `ctx.res.headers.set()`.
129
- */
130
- header(name: string, value: string): void;
53
+ return `${scope}#${ordinal + 1}`;
131
54
  }
132
55
 
133
- /**
134
- * Middleware function signature
135
- *
136
- * @template TEnv - Environment type - defaults to any for internal flexibility
137
- * @template TParams - URL params type (typed for route middleware)
138
- *
139
- * When using middleware with global augmentation (RSCRouter.Env), explicitly
140
- * annotate your middleware functions, or the types will be inferred from context:
141
- *
142
- * @example
143
- * ```typescript
144
- * // With explicit annotation (recommended for reusable middleware)
145
- * const authMiddleware: MiddlewareFn<AppEnv> = async (ctx, next) => {...}
146
- *
147
- * // Types inferred from router.use() call
148
- * router.use((ctx, next) => {...}) // ctx is typed from router's TEnv
149
- * ```
150
- */
151
- export type MiddlewareFn<TEnv = any, TParams = Record<string, string>> = (
152
- ctx: MiddlewareContext<TEnv, TParams>,
153
- next: () => Promise<Response>
154
- ) => Response | void | Promise<Response | void>;
155
-
156
- /**
157
- * Stored middleware entry with pattern matching info
158
- * @internal - uses any for internal flexibility
159
- */
160
- export interface MiddlewareEntry<TEnv = any> {
161
- /** Original pattern string */
162
- pattern: string | null;
163
-
164
- /** Compiled regex for matching */
165
- regex: RegExp | null;
166
-
167
- /** Param names extracted from pattern */
168
- paramNames: string[];
169
-
170
- /** The middleware function */
171
- handler: MiddlewareFn<TEnv>;
172
-
173
- /** Mount prefix this middleware is scoped to (null = global) */
174
- mountPrefix: string | null;
56
+ function getMiddlewareMetricLabel<TEnv>(
57
+ entry: MiddlewareEntry<TEnv>,
58
+ ordinal: number,
59
+ ): string {
60
+ return `middleware:${getMiddlewareMetricBase(entry, ordinal)}`;
175
61
  }
176
62
 
177
63
  /**
@@ -231,7 +117,7 @@ function escapeRegex(str: string): string {
231
117
  export function extractParams(
232
118
  pathname: string,
233
119
  regex: RegExp,
234
- paramNames: string[]
120
+ paramNames: string[],
235
121
  ): Record<string, string> {
236
122
  const match = pathname.match(regex);
237
123
  if (!match) return {};
@@ -243,151 +129,137 @@ export function extractParams(
243
129
  return params;
244
130
  }
245
131
 
246
- /**
247
- * Parse cookies from Cookie header
248
- */
249
- export function parseCookies(
250
- cookieHeader: string | null
251
- ): Record<string, string> {
252
- if (!cookieHeader) return {};
253
-
254
- const cookies: Record<string, string> = {};
255
- const pairs = cookieHeader.split(";");
256
-
257
- for (const pair of pairs) {
258
- const [name, ...rest] = pair.trim().split("=");
259
- if (name) {
260
- cookies[name] = decodeURIComponent(rest.join("="));
261
- }
262
- }
263
-
264
- return cookies;
265
- }
266
-
267
- /**
268
- * Serialize a cookie for Set-Cookie header
269
- */
270
- export function serializeCookie(
271
- name: string,
272
- value: string,
273
- options: CookieOptions = {}
274
- ): string {
275
- let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
276
-
277
- if (options.domain) cookie += `; Domain=${options.domain}`;
278
- if (options.path) cookie += `; Path=${options.path}`;
279
- if (options.maxAge !== undefined) cookie += `; Max-Age=${options.maxAge}`;
280
- if (options.expires) cookie += `; Expires=${options.expires.toUTCString()}`;
281
- if (options.httpOnly) cookie += "; HttpOnly";
282
- if (options.secure) cookie += "; Secure";
283
- if (options.sameSite) cookie += `; SameSite=${options.sameSite}`;
284
-
285
- return cookie;
286
- }
287
-
288
- /**
289
- * Mutable response holder - allows ctx.res to be updated after next() is called
290
- */
291
- export interface ResponseHolder {
292
- response: Response | null;
293
- }
294
-
295
132
  /**
296
133
  * Create middleware context
297
134
  *
298
135
  * Note: The implementation uses runtime values while the interface provides
299
136
  * compile-time type safety. The env/get/set types are resolved at call sites
300
- * via conditional types based on TEnv extending RouterEnv.
137
+ * via conditional types based on TEnv from createRouter<TBindings>().
301
138
  */
302
139
  export function createMiddlewareContext<TEnv>(
303
140
  request: Request,
304
141
  env: TEnv,
305
142
  params: Record<string, string>,
306
143
  variables: Record<string, unknown>,
307
- responseHolder: ResponseHolder
144
+ responseHolder: ResponseHolder,
145
+ reverse?: (
146
+ name: string,
147
+ params?: Record<string, string>,
148
+ search?: Record<string, unknown>,
149
+ ) => string,
308
150
  ): MiddlewareContext<TEnv> {
309
- const url = new URL(request.url);
310
- const cookieHeader = request.headers.get("Cookie");
311
- let parsedCookies: Record<string, string> | null = null;
312
-
151
+ const url = stripInternalParams(new URL(request.url));
152
+
153
+ // Track the initial response to detect pre/post-next() phase.
154
+ // Before next(): responseHolder.response === initialResponse (the stub).
155
+ // After next(): responseHolder.response is the real downstream response.
156
+ const initialResponse = responseHolder.response;
157
+ const isPreNext = () => responseHolder.response === initialResponse;
158
+
159
+ // Delegation strategy for RequestContext (reqCtx):
160
+ // - res getter: before next() returns shared reqCtx stub; after next() returns
161
+ // the real downstream response.
162
+ // - header(): before next() delegates to reqCtx; after next() writes to the
163
+ // real downstream response.
164
+ // Cookie operations are handled by the standalone cookies() function which
165
+ // delegates to the shared RequestContext internally.
313
166
  // The runtime implementation - types are enforced at call sites via MiddlewareContext<TEnv>
167
+ // Internal helper: resolve the current response (stub before next(), real after).
168
+ // Not exposed on the public MiddlewareContext type — use ctx.headers instead.
169
+ const getResponse = (): Response => {
170
+ if (isPreNext()) {
171
+ const reqCtx = _getRequestContext();
172
+ if (reqCtx) return reqCtx.res;
173
+ }
174
+ if (!responseHolder.response) {
175
+ throw new Error(
176
+ "Response is not available - responseHolder was not initialized",
177
+ );
178
+ }
179
+ return responseHolder.response;
180
+ };
181
+
314
182
  return {
315
183
  request,
316
184
  url,
185
+ originalUrl: new URL(request.url),
317
186
  pathname: url.pathname,
318
187
  searchParams: url.searchParams,
319
188
  env: env as MiddlewareContext<TEnv>["env"],
320
189
  params,
321
-
322
- // res getter - returns the stub or real response (always available)
323
- get res(): Response {
324
- if (!responseHolder.response) {
325
- throw new Error(
326
- "ctx.res is not available - responseHolder was not initialized"
327
- );
328
- }
329
- return responseHolder.response;
190
+ // Getter: re-derives from request context on each access so that global
191
+ // middleware sees the matched route name after await next().
192
+ get routeName(): MiddlewareContext<TEnv>["routeName"] {
193
+ const reqCtx = _getRequestContext();
194
+ const raw = reqCtx?._routeName;
195
+ return (
196
+ raw && !isAutoGeneratedRouteName(raw) ? raw : undefined
197
+ ) as MiddlewareContext<TEnv>["routeName"];
330
198
  },
331
199
 
332
- // res setter - allows middleware to replace the response
333
- set res(response: Response) {
334
- responseHolder.response = response;
200
+ get headers(): Headers {
201
+ return getResponse().headers;
335
202
  },
336
203
 
337
- cookie(name: string): string | undefined {
338
- if (!parsedCookies) {
339
- parsedCookies = parseCookies(cookieHeader);
340
- }
341
- return parsedCookies[name];
342
- },
204
+ get: ((keyOrVar: any) =>
205
+ contextGet(variables, keyOrVar)) as MiddlewareContext<TEnv>["get"],
343
206
 
344
- cookies(): Record<string, string> {
345
- if (!parsedCookies) {
346
- parsedCookies = parseCookies(cookieHeader);
347
- }
348
- return { ...parsedCookies };
349
- },
207
+ set: ((keyOrVar: any, value: unknown) => {
208
+ contextSet(variables, keyOrVar, value);
209
+ }) as MiddlewareContext<TEnv>["set"],
210
+
211
+ var: variables as MiddlewareContext<TEnv>["var"],
350
212
 
351
- setCookie(name: string, value: string, options?: CookieOptions): void {
213
+ header(name: string, value: string): void {
214
+ // Before next(): delegate to shared RequestContext stub
215
+ if (isPreNext()) {
216
+ const reqCtx = _getRequestContext();
217
+ if (reqCtx) {
218
+ reqCtx.header(name, value);
219
+ return;
220
+ }
221
+ }
222
+ // After next() or standalone: write to current response
352
223
  if (!responseHolder.response) {
353
224
  throw new Error(
354
- "ctx.setCookie() is not available - responseHolder was not initialized"
225
+ "ctx.header() is not available - responseHolder was not initialized",
355
226
  );
356
227
  }
357
- responseHolder.response.headers.append(
358
- "Set-Cookie",
359
- serializeCookie(name, value, options)
360
- );
228
+ responseHolder.response.headers.set(name, value);
361
229
  },
362
230
 
363
- deleteCookie(
364
- name: string,
365
- options?: Pick<CookieOptions, "domain" | "path">
366
- ): void {
367
- if (!responseHolder.response) {
231
+ get theme(): MiddlewareContext<TEnv>["theme"] {
232
+ return _getRequestContext()?.theme;
233
+ },
234
+
235
+ get setTheme(): MiddlewareContext<TEnv>["setTheme"] {
236
+ return _getRequestContext()?.setTheme;
237
+ },
238
+
239
+ setLocationState(entries) {
240
+ const reqCtx = _getRequestContext();
241
+ if (!reqCtx) {
368
242
  throw new Error(
369
- "ctx.deleteCookie() is not available - responseHolder was not initialized"
243
+ "setLocationState() is not available outside a request context",
370
244
  );
371
245
  }
372
- responseHolder.response.headers.append(
373
- "Set-Cookie",
374
- serializeCookie(name, "", { ...options, maxAge: 0 })
375
- );
246
+ reqCtx.setLocationState(entries);
376
247
  },
377
248
 
378
- get: ((key: string) => variables[key]) as MiddlewareContext<TEnv>["get"],
379
-
380
- set: ((key: string, value: unknown) => {
381
- variables[key] = value;
382
- }) as MiddlewareContext<TEnv>["set"],
383
-
384
- header(name: string, value: string): void {
385
- if (!responseHolder.response) {
249
+ reverse:
250
+ reverse ??
251
+ ((name: string) => {
386
252
  throw new Error(
387
- "ctx.header() is not available - responseHolder was not initialized"
253
+ `ctx.reverse() is not available - route map was not provided to middleware context`,
388
254
  );
255
+ }),
256
+
257
+ debugPerformance(): void {
258
+ const reqCtx = _getRequestContext();
259
+ if (reqCtx) {
260
+ reqCtx._debugPerformance = true;
261
+ reqCtx._metricsStore ??= createMetricsStore(true);
389
262
  }
390
- responseHolder.response.headers.set(name, value);
391
263
  },
392
264
  };
393
265
  }
@@ -398,7 +270,7 @@ export function createMiddlewareContext<TEnv>(
398
270
  */
399
271
  export function matchMiddleware<TEnv>(
400
272
  pathname: string,
401
- entries: MiddlewareEntry<TEnv>[]
273
+ entries: MiddlewareEntry<TEnv>[],
402
274
  ): Array<{ entry: MiddlewareEntry<TEnv>; params: Record<string, string> }> {
403
275
  const matches: Array<{
404
276
  entry: MiddlewareEntry<TEnv>;
@@ -427,9 +299,9 @@ export function matchMiddleware<TEnv>(
427
299
  *
428
300
  * Features:
429
301
  * - `await next()` returns actual Response
430
- * - `ctx.res` available after `await next()` (like Hono's `c.res`)
431
- * - `ctx.header()` shorthand for setting headers
432
- * - Forgiving: if middleware doesn't return, uses `ctx.res`
302
+ * - `ctx.headers` available before and after `await next()`
303
+ * - `ctx.header()` shorthand for setting a single header
304
+ * - Forgiving: if middleware doesn't return, uses the downstream response
433
305
  * - Short-circuit: return Response to stop chain
434
306
  * - Error catching: try/catch around `next()` works
435
307
  */
@@ -441,7 +313,12 @@ export async function executeMiddleware<TEnv>(
441
313
  request: Request,
442
314
  env: TEnv,
443
315
  variables: Record<string, any>,
444
- finalHandler: () => Promise<Response>
316
+ finalHandler: () => Promise<Response>,
317
+ reverse?: (
318
+ name: string,
319
+ params?: Record<string, string>,
320
+ search?: Record<string, unknown>,
321
+ ) => string,
445
322
  ): Promise<Response> {
446
323
  let index = 0;
447
324
 
@@ -455,8 +332,8 @@ export async function executeMiddleware<TEnv>(
455
332
  // End of chain - call actual RSC handler
456
333
  const response = await finalHandler();
457
334
 
458
- // Merge headers set on stub into the real response
459
- // Use append for Set-Cookie to preserve multiple cookies
335
+ // Merge headers set on stub into the real response.
336
+ // Use append for Set-Cookie to preserve multiple cookies.
460
337
  const mergedHeaders = new Headers(response.headers);
461
338
  stubResponse.headers.forEach((value, name) => {
462
339
  if (name.toLowerCase() === "set-cookie") {
@@ -465,6 +342,26 @@ export async function executeMiddleware<TEnv>(
465
342
  mergedHeaders.set(name, value);
466
343
  }
467
344
  });
345
+ // Also merge shared RequestContext stub (cookies written via cookies().set()).
346
+ // Dedup Set-Cookie: an inner executeMiddleware (route-level middleware)
347
+ // may have already merged the same reqCtx cookies into the response.
348
+ const reqCtx = _getRequestContext();
349
+ if (reqCtx) {
350
+ const stubCookies = reqCtx.res.headers.getSetCookie();
351
+ if (stubCookies.length > 0) {
352
+ const existing = new Set(mergedHeaders.getSetCookie());
353
+ for (const cookie of stubCookies) {
354
+ if (!existing.has(cookie)) {
355
+ mergedHeaders.append("set-cookie", cookie);
356
+ }
357
+ }
358
+ }
359
+ reqCtx.res.headers.forEach((value, name) => {
360
+ if (name !== "set-cookie" && !mergedHeaders.has(name)) {
361
+ mergedHeaders.set(name, value);
362
+ }
363
+ });
364
+ }
468
365
 
469
366
  // Clone response with merged headers (mutable for post-next() modifications)
470
367
  responseHolder.response = new Response(response.body, {
@@ -476,29 +373,122 @@ export async function executeMiddleware<TEnv>(
476
373
  return responseHolder.response;
477
374
  }
478
375
 
376
+ const middlewareOrdinal = index;
479
377
  const { entry, params } = middlewares[index++];
480
378
  const ctx = createMiddlewareContext(
481
379
  request,
482
380
  env,
483
381
  params,
484
382
  variables,
485
- responseHolder
383
+ responseHolder,
384
+ reverse,
486
385
  );
386
+ const metricStart = performance.now();
387
+ const metricLabel = getMiddlewareMetricLabel(entry, middlewareOrdinal);
388
+ let middlewareFinished = false;
389
+ const finishMiddleware = () => {
390
+ if (!middlewareFinished) {
391
+ middlewareFinished = true;
392
+ appendMetric(
393
+ _getRequestContext()?._metricsStore,
394
+ `${metricLabel}:pre`,
395
+ metricStart,
396
+ performance.now() - metricStart,
397
+ MIDDLEWARE_METRIC_DEPTH,
398
+ );
399
+ }
400
+ };
487
401
 
488
- // Track if next() was called and capture its Promise
489
- // This handles the case where middleware calls next() synchronously without await
402
+ // Track if next() was called and capture its Promise.
403
+ // Guard against double-calling: a second call would re-enter the
404
+ // downstream chain and overwrite responseHolder.response.
490
405
  let nextPromise: Promise<Response> | null = null;
406
+ let nextResolvedAt: number | undefined;
491
407
  const wrappedNext = (): Promise<Response> => {
492
- nextPromise = next();
408
+ if (nextPromise) {
409
+ throw new Error(
410
+ `[@rangojs/router] Middleware called next() more than once.`,
411
+ );
412
+ }
413
+ finishMiddleware();
414
+ const downstream = next();
415
+ nextPromise = downstream.then(
416
+ (res) => {
417
+ nextResolvedAt = performance.now();
418
+ return res;
419
+ },
420
+ (err) => {
421
+ nextResolvedAt = performance.now();
422
+ throw err;
423
+ },
424
+ );
493
425
  return nextPromise;
494
426
  };
495
427
 
496
- const result = await entry.handler(ctx, wrappedNext);
428
+ let result: Response | void;
429
+ try {
430
+ result = await entry.handler(ctx, wrappedNext);
431
+ } catch (error) {
432
+ finishMiddleware();
433
+ throw error;
434
+ }
435
+ finishMiddleware();
436
+
437
+ // Record post-next() processing time when middleware did work after
438
+ // the downstream chain resolved (e.g. adding headers, logging).
439
+ if (nextResolvedAt !== undefined) {
440
+ const postDur = performance.now() - nextResolvedAt;
441
+ if (postDur > POST_METRIC_MIN_DURATION_MS) {
442
+ appendMetric(
443
+ _getRequestContext()?._metricsStore,
444
+ `${metricLabel}:post`,
445
+ nextResolvedAt,
446
+ postDur,
447
+ MIDDLEWARE_METRIC_DEPTH,
448
+ );
449
+ }
450
+ }
497
451
 
498
- // Explicit return takes precedence
452
+ // Explicit return takes precedence (middleware short-circuit).
453
+ // Merge stub headers (from ctx.header before this point) and
454
+ // RequestContext stub headers (from ctx.setCookie) into the
455
+ // returned Response so they are not lost.
499
456
  if (result instanceof Response) {
500
- responseHolder.response = result;
501
- return result;
457
+ const mergedHeaders = new Headers(result.headers);
458
+ stubResponse.headers.forEach((value, name) => {
459
+ if (name.toLowerCase() === "set-cookie") {
460
+ mergedHeaders.append(name, value);
461
+ } else if (!mergedHeaders.has(name)) {
462
+ mergedHeaders.set(name, value);
463
+ }
464
+ });
465
+ // Also merge shared RequestContext stub (cookies written via setCookie).
466
+ // Dedup Set-Cookie: an inner executeMiddleware (route-level middleware)
467
+ // may have already merged the same reqCtx cookies into the response.
468
+ const reqCtx = _getRequestContext();
469
+ if (reqCtx) {
470
+ const stubCookies = reqCtx.res.headers.getSetCookie();
471
+ if (stubCookies.length > 0) {
472
+ const existing = new Set(mergedHeaders.getSetCookie());
473
+ for (const cookie of stubCookies) {
474
+ if (!existing.has(cookie)) {
475
+ mergedHeaders.append("set-cookie", cookie);
476
+ }
477
+ }
478
+ }
479
+ reqCtx.res.headers.forEach((value, name) => {
480
+ if (name !== "set-cookie" && !mergedHeaders.has(name)) {
481
+ mergedHeaders.set(name, value);
482
+ }
483
+ });
484
+ }
485
+ const merged = new Response(result.body, {
486
+ status: result.status,
487
+ statusText: result.statusText,
488
+ headers: mergedHeaders,
489
+ });
490
+ responseHolder.response = merged;
491
+ return merged;
502
492
  }
503
493
 
504
494
  // Warn about unexpected return values (non-Response, non-undefined)
@@ -507,7 +497,7 @@ export async function executeMiddleware<TEnv>(
507
497
  const fnName = entry.handler.name || "(anonymous)";
508
498
  console.warn(
509
499
  `[Middleware] "${fnName}" returned ${typeof result} instead of Response or undefined. ` +
510
- `This return value will be ignored. Did you mean to return a Response?`
500
+ `This return value will be ignored. Did you mean to return a Response?`,
511
501
  );
512
502
  }
513
503
 
@@ -524,7 +514,7 @@ export async function executeMiddleware<TEnv>(
524
514
  `Middleware must call next() or return a Response. ` +
525
515
  `Function: ${fnName}, Pattern: ${entry.pattern ?? "(all)"}
526
516
  Source: ${import.meta.env.DEV ? entry.handler.toString().slice(0, 200) : "(source hidden in production)"}`,
527
- { cause: { url: request.url, fn: entry.handler } }
517
+ { cause: { url: request.url, fn: entry.handler } },
528
518
  );
529
519
  };
530
520
 
@@ -536,64 +526,30 @@ export async function executeMiddleware<TEnv>(
536
526
  throw new Error("No response generated by middleware chain");
537
527
  }
538
528
 
539
- return finalResponse;
540
- }
541
-
542
- /**
543
- * Execute middleware for server actions
544
- *
545
- * Server actions can't return Response directly, but headers/cookies set
546
- * on ctx.res (from getRequestContext().res) will be merged into the final response.
547
- *
548
- * - Runs middleware for auth checks, variable setting, headers, cookies
549
- * - Throws if middleware returns Response (can't short-circuit server action)
550
- */
551
- export async function executeServerActionMiddleware<TEnv>(
552
- middlewares: MiddlewareFn<TEnv>[],
553
- request: Request,
554
- env: TEnv,
555
- params: Record<string, string>,
556
- variables: Record<string, any>,
557
- stubResponse: Response
558
- ): Promise<void> {
559
- if (middlewares.length === 0) {
560
- return;
561
- }
562
-
563
- let index = 0;
564
- const responseHolder: ResponseHolder = { response: stubResponse };
565
-
566
- const next = async (): Promise<Response> => {
567
- if (index >= middlewares.length) {
568
- return stubResponse;
569
- }
570
-
571
- const middleware = middlewares[index++];
572
- const ctx = createMiddlewareContext(
573
- request,
574
- env,
575
- params,
576
- variables,
577
- responseHolder
578
- );
579
-
580
- const result = await middleware(ctx, next);
581
-
582
- // If middleware returned a Response, throw an error
583
- // Server actions can't short-circuit with a Response
584
- if (result instanceof Response) {
585
- throw new Error(
586
- `Loader middleware returned a Response (status: ${result.status}). ` +
587
- `Server actions cannot return Response. ` +
588
- `Use GET-based loader fetching for redirects, or throw an error instead.`
589
- );
529
+ // Final re-merge: capture any RequestContext stub headers added after the
530
+ // last merge point (e.g. cookies().set() called after await next()).
531
+ // The reqCtx stub may have already been partially merged during finalHandler
532
+ // or early-return paths; only append *new* Set-Cookie entries to avoid dupes.
533
+ const reqCtx = _getRequestContext();
534
+ if (reqCtx) {
535
+ const stubCookies = reqCtx.res.headers.getSetCookie();
536
+ if (stubCookies.length > 0) {
537
+ const existingCookies = new Set(finalResponse.headers.getSetCookie());
538
+ for (const cookie of stubCookies) {
539
+ if (!existingCookies.has(cookie)) {
540
+ finalResponse.headers.append("set-cookie", cookie);
541
+ }
542
+ }
590
543
  }
544
+ // Fill in non-cookie headers that aren't already on the response
545
+ reqCtx.res.headers.forEach((value, name) => {
546
+ if (name !== "set-cookie" && !finalResponse.headers.has(name)) {
547
+ finalResponse.headers.set(name, value);
548
+ }
549
+ });
550
+ }
591
551
 
592
- return stubResponse;
593
- };
594
-
595
- await next();
596
- // Headers/cookies set on stubResponse will be merged by the caller
552
+ return finalResponse;
597
553
  }
598
554
 
599
555
  /**
@@ -617,7 +573,12 @@ export async function executeInterceptMiddleware<TEnv>(
617
573
  env: TEnv,
618
574
  params: Record<string, string>,
619
575
  variables: Record<string, any>,
620
- stubResponse: Response
576
+ stubResponse: Response,
577
+ reverse?: (
578
+ name: string,
579
+ params?: Record<string, string>,
580
+ search?: Record<string, unknown>,
581
+ ) => string,
621
582
  ): Promise<Response | null> {
622
583
  if (middlewares.length === 0) {
623
584
  return null;
@@ -640,22 +601,28 @@ export async function executeInterceptMiddleware<TEnv>(
640
601
  env,
641
602
  params,
642
603
  variables,
643
- responseHolder
604
+ responseHolder,
605
+ reverse,
644
606
  );
645
607
 
646
- const result = await middleware(ctx, next);
608
+ let nextCalled = false;
609
+ const guardedNext = (): Promise<Response> => {
610
+ if (nextCalled) {
611
+ throw new Error(
612
+ `[@rangojs/router] Intercept middleware called next() more than once.`,
613
+ );
614
+ }
615
+ nextCalled = true;
616
+ return next();
617
+ };
618
+
619
+ const result = await middleware(ctx, guardedNext);
647
620
 
648
621
  if (result instanceof Response) {
649
622
  earlyResponse = result;
650
623
  return result;
651
624
  }
652
625
 
653
- // Check if middleware replaced ctx.res with a different response
654
- if (responseHolder.response && responseHolder.response !== stubResponse) {
655
- earlyResponse = responseHolder.response;
656
- return earlyResponse;
657
- }
658
-
659
626
  return stubResponse;
660
627
  };
661
628
 
@@ -673,12 +640,14 @@ export async function executeInterceptMiddleware<TEnv>(
673
640
  });
674
641
 
675
642
  if (hasStubHeaders) {
676
- // Clone and merge headers from stub into early response
643
+ // Clone and merge headers from stub into early response.
644
+ // Only fill in missing headers — the returned Response's explicit
645
+ // headers take precedence, matching executeMiddleware behavior.
677
646
  const mergedHeaders = new Headers(response.headers);
678
647
  stubResponse.headers.forEach((value, name) => {
679
648
  if (name.toLowerCase() === "set-cookie") {
680
649
  mergedHeaders.append(name, value);
681
- } else {
650
+ } else if (!mergedHeaders.has(name)) {
682
651
  mergedHeaders.set(name, value);
683
652
  }
684
653
  });
@@ -708,7 +677,12 @@ export async function executeLoaderMiddleware<TEnv>(
708
677
  env: TEnv,
709
678
  params: Record<string, string>,
710
679
  variables: Record<string, any>,
711
- finalHandler: () => Promise<Response>
680
+ finalHandler: () => Promise<Response>,
681
+ reverse?: (
682
+ name: string,
683
+ params?: Record<string, string>,
684
+ search?: Record<string, unknown>,
685
+ ) => string,
712
686
  ): Promise<Response> {
713
687
  if (middlewares.length === 0) {
714
688
  return finalHandler();
@@ -731,27 +705,11 @@ export async function executeLoaderMiddleware<TEnv>(
731
705
  request,
732
706
  env,
733
707
  variables,
734
- finalHandler
708
+ finalHandler,
709
+ reverse,
735
710
  );
736
711
  }
737
712
 
738
- /**
739
- * Entry type for middleware collection
740
- * Matches the shape of EntryData used in router.ts
741
- */
742
- export interface MiddlewareCollectableEntry {
743
- middleware?: MiddlewareFn<any, any>[];
744
- layout?: MiddlewareCollectableEntry[];
745
- }
746
-
747
- /**
748
- * Collected route middleware with params
749
- */
750
- export interface CollectedMiddleware {
751
- handler: MiddlewareFn<any, any>;
752
- params: Record<string, string>;
753
- }
754
-
755
713
  /**
756
714
  * Collect route-level middleware from an entry tree
757
715
  *
@@ -764,7 +722,7 @@ export interface CollectedMiddleware {
764
722
  */
765
723
  export function collectRouteMiddleware(
766
724
  entries: Iterable<MiddlewareCollectableEntry>,
767
- params: Record<string, string>
725
+ params: Record<string, string>,
768
726
  ): CollectedMiddleware[] {
769
727
  const result: CollectedMiddleware[] = [];
770
728