@rangojs/router 0.0.0-experimental.13 → 0.0.0-experimental.130

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 (1214) hide show
  1. package/AGENTS.md +9 -0
  2. package/README.md +1040 -5
  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 +1712 -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/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -26
  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/{src/handles/index.ts → dist/handles/index.js} +1 -1
  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/testing/vitest.js +82 -0
  712. package/dist/theme/ThemeProvider.d.ts +20 -0
  713. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  714. package/dist/theme/ThemeProvider.js +240 -0
  715. package/dist/theme/ThemeProvider.js.map +1 -0
  716. package/dist/theme/ThemeScript.d.ts +48 -0
  717. package/dist/theme/ThemeScript.d.ts.map +1 -0
  718. package/dist/theme/ThemeScript.js +13 -0
  719. package/dist/theme/ThemeScript.js.map +1 -0
  720. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  721. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  722. package/dist/theme/__tests__/theme.test.js +103 -0
  723. package/dist/theme/__tests__/theme.test.js.map +1 -0
  724. package/dist/theme/constants.d.ts +29 -0
  725. package/dist/theme/constants.d.ts.map +1 -0
  726. package/dist/theme/constants.js +48 -0
  727. package/dist/theme/constants.js.map +1 -0
  728. package/dist/theme/index.d.ts +31 -0
  729. package/dist/theme/index.d.ts.map +1 -0
  730. package/dist/theme/index.js +36 -0
  731. package/dist/theme/index.js.map +1 -0
  732. package/dist/theme/theme-context.d.ts +40 -0
  733. package/dist/theme/theme-context.d.ts.map +1 -0
  734. package/dist/theme/theme-context.js +60 -0
  735. package/dist/theme/theme-context.js.map +1 -0
  736. package/dist/theme/theme-script.d.ts +27 -0
  737. package/dist/theme/theme-script.d.ts.map +1 -0
  738. package/dist/theme/theme-script.js +147 -0
  739. package/dist/theme/theme-script.js.map +1 -0
  740. package/dist/theme/types.d.ts +163 -0
  741. package/dist/theme/types.d.ts.map +1 -0
  742. package/dist/theme/types.js +11 -0
  743. package/dist/theme/types.js.map +1 -0
  744. package/dist/theme/use-theme.d.ts +12 -0
  745. package/dist/theme/use-theme.d.ts.map +1 -0
  746. package/dist/theme/use-theme.js +40 -0
  747. package/dist/theme/use-theme.js.map +1 -0
  748. package/dist/types.d.ts +1479 -0
  749. package/dist/types.d.ts.map +1 -0
  750. package/dist/types.js +10 -0
  751. package/dist/types.js.map +1 -0
  752. package/dist/urls.d.ts +441 -0
  753. package/dist/urls.d.ts.map +1 -0
  754. package/dist/urls.gen.d.ts +8 -0
  755. package/dist/urls.gen.d.ts.map +1 -0
  756. package/dist/urls.gen.js +8 -0
  757. package/dist/urls.gen.js.map +1 -0
  758. package/dist/urls.js +443 -0
  759. package/dist/urls.js.map +1 -0
  760. package/dist/use-loader.d.ts +127 -0
  761. package/dist/use-loader.d.ts.map +1 -0
  762. package/dist/use-loader.js +237 -0
  763. package/dist/use-loader.js.map +1 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  767. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  771. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  775. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  777. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  779. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  780. package/dist/vite/ast-handler-extract.d.ts +49 -0
  781. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  782. package/dist/vite/ast-handler-extract.js +249 -0
  783. package/dist/vite/ast-handler-extract.js.map +1 -0
  784. package/dist/vite/expose-action-id.d.ts +19 -0
  785. package/dist/vite/expose-action-id.d.ts.map +1 -0
  786. package/dist/vite/expose-action-id.js +250 -0
  787. package/dist/vite/expose-action-id.js.map +1 -0
  788. package/dist/vite/expose-id-utils.d.ts +69 -0
  789. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  790. package/dist/vite/expose-id-utils.js +289 -0
  791. package/dist/vite/expose-id-utils.js.map +1 -0
  792. package/dist/vite/expose-internal-ids.d.ts +22 -0
  793. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  794. package/dist/vite/expose-internal-ids.js +886 -0
  795. package/dist/vite/expose-internal-ids.js.map +1 -0
  796. package/dist/vite/index.d.ts +149 -0
  797. package/dist/vite/index.d.ts.map +1 -0
  798. package/dist/vite/index.js +6263 -2733
  799. package/dist/vite/index.js.bak +5448 -0
  800. package/dist/vite/index.js.map +1 -0
  801. package/dist/vite/package-resolution.d.ts +43 -0
  802. package/dist/vite/package-resolution.d.ts.map +1 -0
  803. package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
  804. package/dist/vite/package-resolution.js.map +1 -0
  805. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  806. package/dist/vite/virtual-entries.d.ts +25 -0
  807. package/dist/vite/virtual-entries.d.ts.map +1 -0
  808. package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
  809. package/dist/vite/virtual-entries.js.map +1 -0
  810. package/package.json +123 -68
  811. package/skills/api-client/SKILL.md +211 -0
  812. package/skills/breadcrumbs/SKILL.md +312 -0
  813. package/skills/bundle-analysis/SKILL.md +159 -0
  814. package/skills/cache-guide/SKILL.md +486 -0
  815. package/skills/caching/SKILL.md +349 -24
  816. package/skills/composability/SKILL.md +197 -0
  817. package/skills/css/SKILL.md +76 -0
  818. package/skills/debug-manifest/SKILL.md +12 -8
  819. package/skills/document-cache/SKILL.md +87 -62
  820. package/skills/fonts/SKILL.md +6 -4
  821. package/skills/handler-use/SKILL.md +364 -0
  822. package/skills/hooks/SKILL.md +557 -79
  823. package/skills/host-router/SKILL.md +278 -0
  824. package/skills/i18n/SKILL.md +276 -0
  825. package/skills/intercept/SKILL.md +175 -8
  826. package/skills/layout/SKILL.md +128 -5
  827. package/skills/links/SKILL.md +304 -25
  828. package/skills/loader/SKILL.md +604 -54
  829. package/skills/middleware/SKILL.md +213 -37
  830. package/skills/migrate-nextjs/SKILL.md +584 -0
  831. package/skills/migrate-react-router/SKILL.md +769 -0
  832. package/skills/mime-routes/SKILL.md +41 -10
  833. package/skills/observability/SKILL.md +172 -0
  834. package/skills/parallel/SKILL.md +276 -3
  835. package/skills/prerender/SKILL.md +432 -52
  836. package/skills/rango/SKILL.md +313 -21
  837. package/skills/react-compiler/SKILL.md +168 -0
  838. package/skills/response-routes/SKILL.md +248 -120
  839. package/skills/route/SKILL.md +287 -21
  840. package/skills/router-setup/SKILL.md +231 -33
  841. package/skills/server-actions/SKILL.md +775 -0
  842. package/skills/streams-and-websockets/SKILL.md +283 -0
  843. package/skills/tailwind/SKILL.md +27 -3
  844. package/skills/testing/SKILL.md +129 -0
  845. package/skills/testing/bindings.md +89 -0
  846. package/skills/testing/cache-prerender.md +124 -0
  847. package/skills/testing/client-components.md +122 -0
  848. package/skills/testing/e2e-parity.md +125 -0
  849. package/skills/testing/flight.md +92 -0
  850. package/skills/testing/handles.md +129 -0
  851. package/skills/testing/loader.md +128 -0
  852. package/skills/testing/middleware.md +99 -0
  853. package/skills/testing/render-handler.md +121 -0
  854. package/skills/testing/response-routes.md +95 -0
  855. package/skills/testing/reverse-and-types.md +84 -0
  856. package/skills/testing/server-actions.md +107 -0
  857. package/skills/testing/server-tree.md +128 -0
  858. package/skills/testing/setup.md +120 -0
  859. package/skills/theme/SKILL.md +9 -8
  860. package/skills/typesafety/SKILL.md +547 -107
  861. package/skills/use-cache/SKILL.md +355 -0
  862. package/skills/view-transitions/SKILL.md +294 -0
  863. package/src/__augment-tests__/augment.ts +81 -0
  864. package/src/__augment-tests__/augmented.check.ts +116 -0
  865. package/src/__internal.ts +77 -44
  866. package/src/bin/rango.ts +312 -15
  867. package/src/browser/action-coordinator.ts +114 -0
  868. package/src/browser/action-fence.ts +47 -0
  869. package/src/browser/app-shell.ts +39 -0
  870. package/src/browser/app-version.ts +14 -0
  871. package/src/browser/cookie-name.ts +140 -0
  872. package/src/browser/event-controller.ts +162 -200
  873. package/src/browser/history-state.ts +101 -0
  874. package/src/browser/index.ts +3 -3
  875. package/src/browser/intercept-utils.ts +52 -0
  876. package/src/browser/invalidate-client-cache.ts +52 -0
  877. package/src/browser/link-interceptor.ts +24 -4
  878. package/src/browser/logging.ts +11 -0
  879. package/src/browser/merge-segment-loaders.ts +20 -12
  880. package/src/browser/navigation-bridge.ts +323 -563
  881. package/src/browser/navigation-client.ts +219 -75
  882. package/src/browser/navigation-store-handle.ts +38 -0
  883. package/src/browser/navigation-store.ts +104 -112
  884. package/src/browser/navigation-transaction.ts +247 -0
  885. package/src/browser/network-error-handler.ts +61 -0
  886. package/src/browser/partial-update.ts +328 -348
  887. package/src/browser/prefetch/cache.ts +324 -0
  888. package/src/browser/prefetch/fetch.ts +357 -0
  889. package/src/browser/prefetch/observer.ts +65 -0
  890. package/src/browser/prefetch/policy.ts +48 -0
  891. package/src/browser/prefetch/queue.ts +194 -0
  892. package/src/browser/prefetch/resource-ready.ts +77 -0
  893. package/src/browser/rango-state.ts +194 -0
  894. package/src/browser/react/Link.tsx +253 -71
  895. package/src/browser/react/NavigationProvider.tsx +155 -34
  896. package/src/browser/react/ScrollRestoration.tsx +10 -6
  897. package/src/browser/react/context.ts +11 -0
  898. package/src/browser/react/filter-segment-order.ts +53 -0
  899. package/src/browser/react/index.ts +0 -48
  900. package/src/browser/react/location-state-shared.ts +260 -60
  901. package/src/browser/react/location-state.ts +90 -20
  902. package/src/browser/react/mount-context.ts +6 -1
  903. package/src/browser/react/nonce-context.ts +23 -0
  904. package/src/browser/react/shallow-equal.ts +27 -0
  905. package/src/browser/react/use-action.ts +35 -66
  906. package/src/browser/react/use-handle.ts +39 -126
  907. package/src/browser/react/use-link-status.ts +6 -9
  908. package/src/browser/react/use-navigation.ts +44 -68
  909. package/src/browser/react/use-params.ts +75 -0
  910. package/src/browser/react/use-pathname.ts +47 -0
  911. package/src/browser/react/use-reverse.ts +106 -0
  912. package/src/browser/react/use-router.ts +98 -0
  913. package/src/browser/react/use-search-params.ts +51 -0
  914. package/src/browser/react/use-segments.ts +72 -99
  915. package/src/browser/response-adapter.ts +124 -0
  916. package/src/browser/rsc-router.tsx +290 -72
  917. package/src/browser/scroll-restoration.ts +132 -49
  918. package/src/browser/segment-reconciler.ts +243 -0
  919. package/src/browser/segment-structure-assert.ts +17 -1
  920. package/src/browser/server-action-bridge.ts +621 -613
  921. package/src/browser/types.ts +175 -50
  922. package/src/browser/validate-redirect-origin.ts +56 -0
  923. package/src/build/collect-fallback-refs.ts +107 -0
  924. package/src/build/generate-manifest.ts +123 -56
  925. package/src/build/generate-route-types.ts +41 -1038
  926. package/src/build/index.ts +9 -6
  927. package/src/build/prefix-tree-utils.ts +123 -0
  928. package/src/build/route-trie.ts +165 -34
  929. package/src/build/route-types/ast-helpers.ts +25 -0
  930. package/src/build/route-types/ast-route-extraction.ts +98 -0
  931. package/src/build/route-types/codegen.ts +113 -0
  932. package/src/build/route-types/include-resolution.ts +418 -0
  933. package/src/build/route-types/param-extraction.ts +51 -0
  934. package/src/build/route-types/per-module-writer.ts +131 -0
  935. package/src/build/route-types/router-processing.ts +651 -0
  936. package/src/build/route-types/scan-filter.ts +85 -0
  937. package/src/build/route-types/source-scan.ts +118 -0
  938. package/src/build/runtime-discovery.ts +220 -0
  939. package/src/cache/background-task.ts +34 -0
  940. package/src/cache/cache-error.ts +104 -0
  941. package/src/cache/cache-key-utils.ts +44 -0
  942. package/src/cache/cache-policy.ts +165 -0
  943. package/src/cache/cache-runtime.ts +444 -0
  944. package/src/cache/cache-scope.ts +231 -325
  945. package/src/cache/cache-tag.ts +98 -0
  946. package/src/cache/cf/cf-cache-store.ts +2644 -75
  947. package/src/cache/cf/index.ts +17 -17
  948. package/src/cache/document-cache.ts +172 -92
  949. package/src/cache/handle-capture.ts +81 -0
  950. package/src/cache/handle-snapshot.ts +104 -0
  951. package/src/cache/index.ts +11 -35
  952. package/src/cache/memory-segment-store.ts +307 -30
  953. package/src/cache/profile-registry.ts +49 -0
  954. package/src/cache/read-through-swr.ts +164 -0
  955. package/src/cache/segment-codec.ts +240 -0
  956. package/src/cache/tag-invalidation.ts +230 -0
  957. package/src/cache/taint.ts +153 -0
  958. package/src/cache/types.ts +94 -211
  959. package/src/client.rsc.tsx +8 -21
  960. package/src/client.tsx +123 -347
  961. package/src/cloudflare/index.ts +11 -0
  962. package/src/cloudflare/tracing.ts +109 -0
  963. package/src/component-utils.ts +23 -4
  964. package/src/components/DefaultDocument.tsx +5 -1
  965. package/src/context-var.ts +168 -0
  966. package/src/debug.ts +19 -9
  967. package/src/decode-loader-results.ts +36 -0
  968. package/src/defer.ts +196 -0
  969. package/src/deps/ssr.ts +0 -1
  970. package/src/errors.ts +106 -10
  971. package/src/handle.ts +76 -23
  972. package/src/handles/MetaTags.tsx +73 -34
  973. package/src/handles/breadcrumbs.ts +77 -0
  974. package/src/handles/meta.ts +30 -52
  975. package/src/host/cookie-handler.ts +21 -51
  976. package/src/host/errors.ts +8 -32
  977. package/src/host/index.ts +12 -9
  978. package/src/host/pattern-matcher.ts +34 -77
  979. package/src/host/router.ts +151 -121
  980. package/src/host/testing.ts +45 -32
  981. package/src/host/types.ts +52 -11
  982. package/src/host/utils.ts +2 -2
  983. package/src/href-client.ts +192 -57
  984. package/src/index.rsc.ts +174 -34
  985. package/src/index.ts +241 -73
  986. package/src/internal-debug.ts +8 -4
  987. package/src/loader-store.ts +500 -0
  988. package/src/loader.rsc.ts +31 -99
  989. package/src/loader.ts +30 -12
  990. package/src/missing-id-error.ts +68 -0
  991. package/src/network-error-thrower.tsx +4 -7
  992. package/src/outlet-context.ts +1 -1
  993. package/src/outlet-provider.tsx +41 -0
  994. package/src/prerender/param-hash.ts +14 -13
  995. package/src/prerender/store.ts +121 -21
  996. package/src/prerender.ts +445 -24
  997. package/src/redirect-origin.ts +100 -0
  998. package/src/response-utils.ts +37 -0
  999. package/src/reverse.ts +198 -128
  1000. package/src/root-error-boundary.tsx +42 -48
  1001. package/src/route-content-wrapper.tsx +10 -72
  1002. package/src/route-definition/dsl-helpers.ts +1116 -0
  1003. package/src/route-definition/helper-factories.ts +90 -0
  1004. package/src/route-definition/helpers-types.ts +506 -0
  1005. package/src/route-definition/index.ts +55 -0
  1006. package/src/route-definition/redirect.ts +135 -0
  1007. package/src/route-definition/resolve-handler-use.ts +161 -0
  1008. package/src/route-definition/use-item-types.ts +32 -0
  1009. package/src/route-definition.ts +1 -1450
  1010. package/src/route-map-builder.ts +82 -144
  1011. package/src/route-name.ts +53 -0
  1012. package/src/route-types.ts +72 -41
  1013. package/src/router/basename.ts +14 -0
  1014. package/src/router/content-negotiation.ts +215 -0
  1015. package/src/router/debug-manifest.ts +72 -0
  1016. package/src/router/error-handling.ts +22 -26
  1017. package/src/router/find-match.ts +181 -0
  1018. package/src/router/handler-context.ts +372 -125
  1019. package/src/router/instrument.ts +308 -0
  1020. package/src/router/intercept-resolution.ts +34 -27
  1021. package/src/router/lazy-includes.ts +200 -0
  1022. package/src/router/loader-resolution.ts +381 -147
  1023. package/src/router/logging.ts +106 -6
  1024. package/src/router/manifest.ts +88 -51
  1025. package/src/router/match-api.ts +162 -245
  1026. package/src/router/match-context.ts +4 -24
  1027. package/src/router/match-handlers.ts +440 -0
  1028. package/src/router/match-middleware/background-revalidation.ts +90 -89
  1029. package/src/router/match-middleware/cache-lookup.ts +297 -150
  1030. package/src/router/match-middleware/cache-store.ts +75 -33
  1031. package/src/router/match-middleware/intercept-resolution.ts +44 -43
  1032. package/src/router/match-middleware/segment-resolution.ts +64 -22
  1033. package/src/router/match-pipelines.ts +11 -87
  1034. package/src/router/match-result.ts +121 -50
  1035. package/src/router/metrics.ts +219 -28
  1036. package/src/router/middleware-types.ts +93 -0
  1037. package/src/router/middleware.ts +421 -413
  1038. package/src/router/navigation-snapshot.ts +131 -0
  1039. package/src/router/params-util.ts +23 -0
  1040. package/src/router/pattern-matching.ts +263 -79
  1041. package/src/router/prerender-match.ts +541 -0
  1042. package/src/router/preview-match.ts +100 -0
  1043. package/src/router/request-classification.ts +276 -0
  1044. package/src/router/revalidation.ts +143 -44
  1045. package/src/router/route-snapshot.ts +244 -0
  1046. package/src/router/router-context.ts +41 -47
  1047. package/src/router/router-interfaces.ts +525 -0
  1048. package/src/router/router-options.ts +726 -0
  1049. package/src/router/router-registry.ts +21 -0
  1050. package/src/router/segment-resolution/fresh.ts +748 -0
  1051. package/src/router/segment-resolution/helpers.ts +313 -0
  1052. package/src/router/segment-resolution/loader-cache.ts +207 -0
  1053. package/src/router/segment-resolution/revalidation.ts +1322 -0
  1054. package/src/router/segment-resolution/static-store.ts +81 -0
  1055. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  1056. package/src/router/segment-resolution/view-transition-default.ts +36 -0
  1057. package/src/router/segment-resolution.ts +24 -1354
  1058. package/src/router/segment-wrappers.ts +289 -0
  1059. package/src/router/state-cookie-name.ts +33 -0
  1060. package/src/router/substitute-pattern-params.ts +56 -0
  1061. package/src/router/telemetry-otel.ts +261 -0
  1062. package/src/router/telemetry.ts +377 -0
  1063. package/src/router/timeout.ts +128 -0
  1064. package/src/router/tracing.ts +206 -0
  1065. package/src/router/trie-matching.ts +172 -60
  1066. package/src/router/types.ts +23 -70
  1067. package/src/router/url-params.ts +44 -0
  1068. package/src/router.ts +748 -2376
  1069. package/src/rsc/handler-context.ts +46 -0
  1070. package/src/rsc/handler.ts +861 -1141
  1071. package/src/rsc/helpers.ts +269 -19
  1072. package/src/rsc/index.ts +1 -21
  1073. package/src/rsc/json-route-result.ts +38 -0
  1074. package/src/rsc/loader-fetch.ts +235 -0
  1075. package/src/rsc/manifest-init.ts +77 -0
  1076. package/src/rsc/nonce.ts +14 -0
  1077. package/src/rsc/origin-guard.ts +155 -0
  1078. package/src/rsc/progressive-enhancement.ts +413 -0
  1079. package/src/rsc/redirect-guard.ts +99 -0
  1080. package/src/rsc/response-error.ts +104 -0
  1081. package/src/rsc/response-route-handler.ts +374 -0
  1082. package/src/rsc/rsc-rendering.ts +261 -0
  1083. package/src/rsc/runtime-warnings.ts +55 -0
  1084. package/src/rsc/server-action.ts +376 -0
  1085. package/src/rsc/ssr-setup.ts +144 -0
  1086. package/src/rsc/types.ts +58 -12
  1087. package/src/runtime-env.ts +18 -0
  1088. package/src/search-params.ts +70 -74
  1089. package/src/segment-content-promise.ts +67 -0
  1090. package/src/segment-loader-promise.ts +134 -0
  1091. package/src/segment-system.tsx +292 -134
  1092. package/src/serialize.ts +243 -0
  1093. package/src/server/context.ts +439 -85
  1094. package/src/server/cookie-store.ts +265 -0
  1095. package/src/server/fetchable-loader-store.ts +11 -6
  1096. package/src/server/handle-store.ts +112 -31
  1097. package/src/server/loader-registry.ts +23 -82
  1098. package/src/server/request-context.ts +724 -143
  1099. package/src/server.ts +26 -164
  1100. package/src/ssr/index.tsx +113 -36
  1101. package/src/static-handler.ts +45 -18
  1102. package/src/testing/cache-status.ts +162 -0
  1103. package/src/testing/collect-handle.ts +40 -0
  1104. package/src/testing/dispatch.ts +618 -0
  1105. package/src/testing/dom.entry.ts +22 -0
  1106. package/src/testing/e2e/fixture.ts +188 -0
  1107. package/src/testing/e2e/index.ts +128 -0
  1108. package/src/testing/e2e/matchers.ts +35 -0
  1109. package/src/testing/e2e/page-helpers.ts +272 -0
  1110. package/src/testing/e2e/parity.ts +387 -0
  1111. package/src/testing/e2e/server.ts +195 -0
  1112. package/src/testing/flight-matchers.ts +97 -0
  1113. package/src/testing/flight-normalize.ts +11 -0
  1114. package/src/testing/flight-runtime.d.ts +57 -0
  1115. package/src/testing/flight-tree.ts +682 -0
  1116. package/src/testing/flight.entry.ts +52 -0
  1117. package/src/testing/flight.ts +232 -0
  1118. package/src/testing/generated-routes.ts +183 -0
  1119. package/src/testing/index.ts +99 -0
  1120. package/src/testing/internal/context.ts +348 -0
  1121. package/src/testing/internal/flight-client-globals.ts +30 -0
  1122. package/src/testing/internal/seed-vars.ts +54 -0
  1123. package/src/testing/render-handler.ts +330 -0
  1124. package/src/testing/render-route.tsx +566 -0
  1125. package/src/testing/run-loader.ts +378 -0
  1126. package/src/testing/run-middleware.ts +205 -0
  1127. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  1128. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  1129. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  1130. package/src/testing/vitest-stubs/version.ts +5 -0
  1131. package/src/testing/vitest.ts +305 -0
  1132. package/src/theme/ThemeProvider.tsx +21 -67
  1133. package/src/theme/ThemeScript.tsx +5 -11
  1134. package/src/theme/constants.ts +5 -14
  1135. package/src/theme/index.ts +3 -20
  1136. package/src/theme/theme-context.ts +5 -35
  1137. package/src/theme/theme-script.ts +21 -32
  1138. package/src/theme/use-theme.ts +0 -3
  1139. package/src/types/boundaries.ts +123 -0
  1140. package/src/types/cache-types.ts +207 -0
  1141. package/src/types/error-types.ts +132 -0
  1142. package/src/types/global-namespace.ts +113 -0
  1143. package/src/types/handler-context.ts +839 -0
  1144. package/src/types/index.ts +79 -0
  1145. package/src/types/loader-types.ts +212 -0
  1146. package/src/types/request-scope.ts +107 -0
  1147. package/src/types/route-config.ts +126 -0
  1148. package/src/types/route-entry.ts +114 -0
  1149. package/src/types/segments.ts +171 -0
  1150. package/src/types.ts +1 -1795
  1151. package/src/urls/include-helper.ts +160 -0
  1152. package/src/urls/index.ts +43 -0
  1153. package/src/urls/path-helper-types.ts +386 -0
  1154. package/src/urls/path-helper.ts +275 -0
  1155. package/src/urls/pattern-types.ts +124 -0
  1156. package/src/urls/response-types.ts +109 -0
  1157. package/src/urls/type-extraction.ts +291 -0
  1158. package/src/urls/urls-function.ts +81 -0
  1159. package/src/urls.ts +1 -1323
  1160. package/src/use-loader.tsx +406 -141
  1161. package/src/vite/debug.ts +185 -0
  1162. package/src/vite/discovery/bundle-postprocess.ts +182 -0
  1163. package/src/vite/discovery/discover-routers.ts +389 -0
  1164. package/src/vite/discovery/discovery-errors.ts +194 -0
  1165. package/src/vite/discovery/gate-state.ts +171 -0
  1166. package/src/vite/discovery/prerender-collection.ts +467 -0
  1167. package/src/vite/discovery/route-types-writer.ts +214 -0
  1168. package/src/vite/discovery/self-gen-tracking.ts +73 -0
  1169. package/src/vite/discovery/state.ts +161 -0
  1170. package/src/vite/discovery/virtual-module-codegen.ts +183 -0
  1171. package/src/vite/index.ts +17 -2259
  1172. package/src/vite/plugin-types.ts +221 -0
  1173. package/src/vite/plugins/cjs-to-esm.ts +83 -0
  1174. package/src/vite/plugins/client-ref-dedup.ts +120 -0
  1175. package/src/vite/plugins/client-ref-hashing.ts +118 -0
  1176. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1177. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1178. package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
  1179. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
  1180. package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +13 -87
  1181. package/src/vite/plugins/expose-ids/export-analysis.ts +338 -0
  1182. package/src/vite/plugins/expose-ids/handler-transform.ts +141 -0
  1183. package/src/vite/plugins/expose-ids/loader-transform.ts +57 -0
  1184. package/src/vite/plugins/expose-ids/router-transform.ts +124 -0
  1185. package/src/vite/plugins/expose-ids/types.ts +45 -0
  1186. package/src/vite/plugins/expose-internal-ids.ts +806 -0
  1187. package/src/vite/plugins/performance-tracks.ts +89 -0
  1188. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1189. package/src/vite/plugins/use-cache-transform.ts +313 -0
  1190. package/src/vite/plugins/version-injector.ts +79 -0
  1191. package/src/vite/plugins/version-plugin.ts +275 -0
  1192. package/src/vite/plugins/virtual-entries.ts +108 -0
  1193. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  1194. package/src/vite/rango.ts +444 -0
  1195. package/src/vite/router-discovery.ts +1581 -0
  1196. package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +193 -37
  1197. package/src/vite/utils/banner.ts +36 -0
  1198. package/src/vite/utils/bundle-analysis.ts +132 -0
  1199. package/src/vite/utils/client-chunks.ts +184 -0
  1200. package/src/vite/utils/forward-user-plugins.ts +171 -0
  1201. package/src/vite/utils/manifest-utils.ts +15 -0
  1202. package/src/vite/utils/package-resolution.ts +89 -0
  1203. package/src/vite/utils/prerender-utils.ts +223 -0
  1204. package/src/vite/utils/shared-utils.ts +219 -0
  1205. package/CLAUDE.md +0 -43
  1206. package/src/browser/lru-cache.ts +0 -69
  1207. package/src/browser/request-controller.ts +0 -164
  1208. package/src/browser/shallow.ts +0 -35
  1209. package/src/cache/memory-store.ts +0 -253
  1210. package/src/router.gen.ts +0 -6
  1211. package/src/static-handler.gen.ts +0 -5
  1212. package/src/urls.gen.ts +0 -8
  1213. package/src/vite/expose-internal-ids.ts +0 -1167
  1214. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
@@ -1,183 +1,53 @@
1
1
  /// <reference types="vite/types/importMeta.d.ts" />
2
- /**
3
- * Middleware Execution
4
- *
5
- * True middleware that wraps the entire RSC handler.
6
- * - `await next()` returns actual Response
7
- * - Can modify response headers
8
- * - Can catch errors from RSC rendering
9
- * - Forgiving API: if middleware doesn't return, original response is used
10
- */
11
2
 
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;
38
-
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
- }
51
-
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;
131
- }
132
-
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[];
3
+ import { contextGet, contextSet } from "../context-var.js";
4
+ import { safeDecodeURIComponent } from "./url-params.js";
5
+ import { fireAndForgetWaitUntil } from "../types/request-scope.js";
6
+ import type {
7
+ CollectedMiddleware,
8
+ MiddlewareCollectableEntry,
9
+ MiddlewareContext,
10
+ MiddlewareEntry,
11
+ MiddlewareFn,
12
+ ResponseHolder,
13
+ } from "./middleware-types.js";
14
+ import { _getRequestContext } from "../server/request-context.js";
15
+ import {
16
+ EXTERNAL_REDIRECT_MARKER,
17
+ isExternalRedirect,
18
+ markExternalRedirect,
19
+ } from "../redirect-origin.js";
20
+ import { isAutoGeneratedRouteName } from "../route-name.js";
21
+ import { appendMetric, createMetricsStore } from "./metrics.js";
22
+ import { observePhase, PHASES } from "./instrument.js";
23
+ import { stripInternalParams } from "./handler-context.js";
24
+ import { isWebSocketUpgradeResponse } from "../response-utils.js";
25
+
26
+ // Re-export types consumed through this module's path.
27
+ export type {
28
+ CookieOptions,
29
+ MiddlewareContext,
30
+ MiddlewareEntry,
31
+ MiddlewareFn,
32
+ } from "./middleware-types.js";
33
+
34
+ const MIDDLEWARE_METRIC_DEPTH = 1;
35
+ const POST_METRIC_MIN_DURATION_MS = 0.01;
36
+
37
+ function getMiddlewareMetricLabel<TEnv>(
38
+ entry: MiddlewareEntry<TEnv>,
39
+ ordinal: number,
40
+ ): string {
41
+ const handlerName = entry.handler.name?.trim();
42
+ const scope = entry.pattern ?? "*";
169
43
 
170
- /** The middleware function */
171
- handler: MiddlewareFn<TEnv>;
44
+ if (handlerName) {
45
+ return `middleware:${handlerName}@${scope}`;
46
+ }
172
47
 
173
- /** Mount prefix this middleware is scoped to (null = global) */
174
- mountPrefix: string | null;
48
+ return `middleware:${scope}#${ordinal + 1}`;
175
49
  }
176
50
 
177
- /**
178
- * Parse a route pattern into regex and param names
179
- * Supports: *, /path, /path/*, /path/:param, /path/:param/*
180
- */
181
51
  export function parsePattern(pattern: string): {
182
52
  regex: RegExp;
183
53
  paramNames: string[];
@@ -226,168 +96,168 @@ function escapeRegex(str: string): string {
226
96
  }
227
97
 
228
98
  /**
229
- * Extract params from a pathname using a pattern's regex and param names
99
+ * Extract params from a pathname using a pattern's regex and param names.
100
+ *
101
+ * Values are URL-decoded so apps see the raw string (e.g. "ivo@example.com")
102
+ * instead of the percent-encoded form ("ivo%40example.com"). This matches the
103
+ * contract assumed by ctx.reverse (which re-encodes) and aligns with
104
+ * Express/React Router/Fastify/Koa.
230
105
  */
231
106
  export function extractParams(
232
107
  pathname: string,
233
108
  regex: RegExp,
234
- paramNames: string[]
109
+ paramNames: string[],
235
110
  ): Record<string, string> {
236
111
  const match = pathname.match(regex);
237
112
  if (!match) return {};
238
113
 
239
114
  const params: Record<string, string> = {};
240
115
  for (let i = 0; i < paramNames.length; i++) {
241
- params[paramNames[i]] = match[i + 1] || "";
116
+ params[paramNames[i]] = safeDecodeURIComponent(match[i + 1] || "");
242
117
  }
243
118
  return params;
244
119
  }
245
120
 
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
121
  /**
296
122
  * Create middleware context
297
123
  *
298
124
  * Note: The implementation uses runtime values while the interface provides
299
125
  * compile-time type safety. The env/get/set types are resolved at call sites
300
- * via conditional types based on TEnv extending RouterEnv.
126
+ * via conditional types based on TEnv from createRouter<TBindings>().
301
127
  */
302
128
  export function createMiddlewareContext<TEnv>(
303
129
  request: Request,
304
130
  env: TEnv,
305
131
  params: Record<string, string>,
306
132
  variables: Record<string, unknown>,
307
- responseHolder: ResponseHolder
133
+ responseHolder: ResponseHolder,
134
+ reverse?: (
135
+ name: string,
136
+ params?: Record<string, string>,
137
+ search?: Record<string, unknown>,
138
+ ) => string,
308
139
  ): 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
-
140
+ const url = stripInternalParams(new URL(request.url));
141
+
142
+ // Track the initial response to detect pre/post-next() phase.
143
+ // Before next(): responseHolder.response === initialResponse (the stub).
144
+ // After next(): responseHolder.response is the real downstream response.
145
+ const initialResponse = responseHolder.response;
146
+ const isPreNext = () => responseHolder.response === initialResponse;
147
+
148
+ // Delegation strategy for RequestContext (reqCtx):
149
+ // - res getter: before next() returns shared reqCtx stub; after next() returns
150
+ // the real downstream response.
151
+ // - header(): before next() delegates to reqCtx; after next() writes to the
152
+ // real downstream response.
153
+ // Cookie operations are handled by the standalone cookies() function which
154
+ // delegates to the shared RequestContext internally.
313
155
  // The runtime implementation - types are enforced at call sites via MiddlewareContext<TEnv>
156
+ // Internal helper: resolve the current response (stub before next(), real after).
157
+ // Not exposed on the public MiddlewareContext type — use ctx.headers instead.
158
+ const getResponse = (): Response => {
159
+ if (isPreNext()) {
160
+ const reqCtx = _getRequestContext();
161
+ if (reqCtx) return reqCtx.res;
162
+ }
163
+ if (!responseHolder.response) {
164
+ throw new Error(
165
+ "Response is not available - responseHolder was not initialized",
166
+ );
167
+ }
168
+ return responseHolder.response;
169
+ };
170
+
171
+ // Capture reqCtx once: the request-scoped platform fields
172
+ // (originalUrl, executionContext, waitUntil) are immutable per request,
173
+ // so snapshotting beats re-reading ALS on every access. The lazy getters
174
+ // below (routeName, theme, setTheme) stay lazy because those can change
175
+ // during `await next()`.
176
+ const reqCtx = _getRequestContext();
314
177
  return {
315
178
  request,
316
179
  url,
180
+ originalUrl: reqCtx?.originalUrl ?? new URL(request.url),
317
181
  pathname: url.pathname,
318
182
  searchParams: url.searchParams,
319
183
  env: env as MiddlewareContext<TEnv>["env"],
320
184
  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;
185
+ executionContext: reqCtx?.executionContext,
186
+ waitUntil: reqCtx ? reqCtx.waitUntil.bind(reqCtx) : fireAndForgetWaitUntil,
187
+ // Getter: re-derives from request context on each access so that global
188
+ // middleware sees the matched route name after await next().
189
+ get routeName(): MiddlewareContext<TEnv>["routeName"] {
190
+ const reqCtx = _getRequestContext();
191
+ const raw = reqCtx?._routeName;
192
+ return (
193
+ raw && !isAutoGeneratedRouteName(raw) ? raw : undefined
194
+ ) as MiddlewareContext<TEnv>["routeName"];
330
195
  },
331
196
 
332
- // res setter - allows middleware to replace the response
333
- set res(response: Response) {
334
- responseHolder.response = response;
197
+ get headers(): Headers {
198
+ return getResponse().headers;
335
199
  },
336
200
 
337
- cookie(name: string): string | undefined {
338
- if (!parsedCookies) {
339
- parsedCookies = parseCookies(cookieHeader);
340
- }
341
- return parsedCookies[name];
342
- },
201
+ get: ((keyOrVar: any) =>
202
+ contextGet(variables, keyOrVar)) as MiddlewareContext<TEnv>["get"],
343
203
 
344
- cookies(): Record<string, string> {
345
- if (!parsedCookies) {
346
- parsedCookies = parseCookies(cookieHeader);
204
+ set: ((keyOrVar: any, value: unknown, options?: any) => {
205
+ contextSet(variables, keyOrVar, value, options);
206
+ }) as MiddlewareContext<TEnv>["set"],
207
+ header(name: string, value: string): void {
208
+ // Before next(): delegate to shared RequestContext stub
209
+ if (isPreNext()) {
210
+ const reqCtx = _getRequestContext();
211
+ if (reqCtx) {
212
+ reqCtx.header(name, value);
213
+ return;
214
+ }
347
215
  }
348
- return { ...parsedCookies };
349
- },
350
-
351
- setCookie(name: string, value: string, options?: CookieOptions): void {
216
+ // After next() or standalone: write to current response
352
217
  if (!responseHolder.response) {
353
218
  throw new Error(
354
- "ctx.setCookie() is not available - responseHolder was not initialized"
219
+ "ctx.header() is not available - responseHolder was not initialized",
355
220
  );
356
221
  }
357
- responseHolder.response.headers.append(
358
- "Set-Cookie",
359
- serializeCookie(name, value, options)
360
- );
222
+ responseHolder.response.headers.set(name, value);
361
223
  },
362
224
 
363
- deleteCookie(
364
- name: string,
365
- options?: Pick<CookieOptions, "domain" | "path">
366
- ): void {
367
- if (!responseHolder.response) {
225
+ get theme(): MiddlewareContext<TEnv>["theme"] {
226
+ return _getRequestContext()?.theme;
227
+ },
228
+
229
+ get setTheme(): MiddlewareContext<TEnv>["setTheme"] {
230
+ return _getRequestContext()?.setTheme;
231
+ },
232
+
233
+ setLocationState(entries) {
234
+ const reqCtx = _getRequestContext();
235
+ if (!reqCtx) {
368
236
  throw new Error(
369
- "ctx.deleteCookie() is not available - responseHolder was not initialized"
237
+ "setLocationState() is not available outside a request context",
370
238
  );
371
239
  }
372
- responseHolder.response.headers.append(
373
- "Set-Cookie",
374
- serializeCookie(name, "", { ...options, maxAge: 0 })
375
- );
240
+ reqCtx.setLocationState(entries);
376
241
  },
377
242
 
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) {
243
+ reverse:
244
+ reverse ??
245
+ ((
246
+ name: string,
247
+ _params?: Record<string, string>,
248
+ _search?: Record<string, unknown>,
249
+ ) => {
386
250
  throw new Error(
387
- "ctx.header() is not available - responseHolder was not initialized"
251
+ `ctx.reverse(${JSON.stringify(name)}) is not available: no route map is bound to this middleware context.`,
388
252
  );
253
+ }),
254
+
255
+ debugPerformance(): void {
256
+ const reqCtx = _getRequestContext();
257
+ if (reqCtx) {
258
+ reqCtx._debugPerformance = true;
259
+ reqCtx._metricsStore ??= createMetricsStore(true);
389
260
  }
390
- responseHolder.response.headers.set(name, value);
391
261
  },
392
262
  };
393
263
  }
@@ -398,7 +268,7 @@ export function createMiddlewareContext<TEnv>(
398
268
  */
399
269
  export function matchMiddleware<TEnv>(
400
270
  pathname: string,
401
- entries: MiddlewareEntry<TEnv>[]
271
+ entries: MiddlewareEntry<TEnv>[],
402
272
  ): Array<{ entry: MiddlewareEntry<TEnv>; params: Record<string, string> }> {
403
273
  const matches: Array<{
404
274
  entry: MiddlewareEntry<TEnv>;
@@ -422,15 +292,97 @@ export function matchMiddleware<TEnv>(
422
292
  return matches;
423
293
  }
424
294
 
295
+ // Set-Cookie is appended; for other headers stubOverridesNonCookie=true
296
+ // overwrites (chain ran to completion), false fills only missing slots (an
297
+ // explicit short-circuit Response's own headers win).
298
+ function mergeStubHeaders(
299
+ target: Headers,
300
+ stub: Headers,
301
+ stubOverridesNonCookie: boolean,
302
+ ): void {
303
+ stub.forEach((value, name) => {
304
+ // The reserved external-redirect marker is internal and never a trust
305
+ // signal; never copy a stub value (e.g. a stray ctx.header() call) onto a
306
+ // browser-facing response. The opt-in is the out-of-band brand.
307
+ if (name.toLowerCase() === EXTERNAL_REDIRECT_MARKER) return;
308
+ if (name.toLowerCase() === "set-cookie") {
309
+ target.append(name, value);
310
+ } else if (stubOverridesNonCookie || !target.has(name)) {
311
+ target.set(name, value);
312
+ }
313
+ });
314
+ }
315
+
316
+ // Set-Cookie is deduped so a nested inner executeMiddleware that already merged
317
+ // the same reqCtx cookies does not duplicate them; other headers fill if missing.
318
+ function mergeReqCtxStub(
319
+ target: Headers,
320
+ reqCtx: ReturnType<typeof _getRequestContext>,
321
+ ): void {
322
+ if (!reqCtx) return;
323
+ const stubCookies = reqCtx.res.headers.getSetCookie();
324
+ if (stubCookies.length > 0) {
325
+ const existing = new Set(target.getSetCookie());
326
+ for (const cookie of stubCookies) {
327
+ if (!existing.has(cookie)) {
328
+ target.append("set-cookie", cookie);
329
+ }
330
+ }
331
+ }
332
+ reqCtx.res.headers.forEach((value, name) => {
333
+ // Never propagate the reserved external-redirect marker (see mergeStubHeaders).
334
+ if (name.toLowerCase() === EXTERNAL_REDIRECT_MARKER) return;
335
+ if (name !== "set-cookie" && !target.has(name)) {
336
+ target.set(name, value);
337
+ }
338
+ });
339
+ }
340
+
341
+ // Clone `base` with stub headers merged into a fresh Headers (the clone keeps
342
+ // the body mutable for post-next() modifications). Set-Cookie is always
343
+ // appended; other headers obey stubOverridesNonCookie (see mergeStubHeaders).
344
+ // mergeReqCtx folds in RequestContext stub cookies/headers; the intercept
345
+ // short-circuit path passes false (its reqCtx headers are not merged here),
346
+ // which is the one deliberate divergence between the call sites.
347
+ function mergeResponse(
348
+ base: Response,
349
+ stub: Headers,
350
+ opts: { stubOverridesNonCookie: boolean; mergeReqCtx: boolean },
351
+ ): Response {
352
+ const mergedHeaders = new Headers(base.headers);
353
+ // The reserved external-redirect marker is never a trust signal and must never
354
+ // reach the browser. The guard strips it on 3xx redirects; strip it here too so
355
+ // a forged value cannot ride a non-3xx middleware response (which the 3xx-only
356
+ // guard would not touch) to the client. The opt-in is the out-of-band brand.
357
+ mergedHeaders.delete(EXTERNAL_REDIRECT_MARKER);
358
+ mergeStubHeaders(mergedHeaders, stub, opts.stubOverridesNonCookie);
359
+ if (opts.mergeReqCtx) {
360
+ mergeReqCtxStub(mergedHeaders, _getRequestContext());
361
+ }
362
+ const merged = new Response(base.body, {
363
+ status: base.status,
364
+ statusText: base.statusText,
365
+ headers: mergedHeaders,
366
+ });
367
+ // Transfer the out-of-band external-redirect brand across this rebuild: a
368
+ // middleware short-circuit `return redirect(url, { external: true })` reaches
369
+ // the open-redirect guard only after this merge, and the brand lives on the
370
+ // Response object, not in its headers.
371
+ if (isExternalRedirect(base)) {
372
+ markExternalRedirect(merged);
373
+ }
374
+ return merged;
375
+ }
376
+
425
377
  /**
426
378
  * Execute middleware chain
427
379
  *
428
380
  * Features:
429
381
  * - `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`
433
- * - Short-circuit: return Response to stop chain
382
+ * - `ctx.headers` available before and after `await next()`
383
+ * - `ctx.header()` shorthand for setting a single header
384
+ * - Forgiving: if middleware doesn't return, uses the downstream response
385
+ * - Short-circuit: return OR throw a Response to stop chain
434
386
  * - Error catching: try/catch around `next()` works
435
387
  */
436
388
  export async function executeMiddleware<TEnv>(
@@ -441,7 +393,12 @@ export async function executeMiddleware<TEnv>(
441
393
  request: Request,
442
394
  env: TEnv,
443
395
  variables: Record<string, any>,
444
- finalHandler: () => Promise<Response>
396
+ finalHandler: () => Promise<Response>,
397
+ reverse?: (
398
+ name: string,
399
+ params?: Record<string, string>,
400
+ search?: Record<string, unknown>,
401
+ ) => string,
445
402
  ): Promise<Response> {
446
403
  let index = 0;
447
404
 
@@ -455,50 +412,130 @@ export async function executeMiddleware<TEnv>(
455
412
  // End of chain - call actual RSC handler
456
413
  const response = await finalHandler();
457
414
 
458
- // Merge headers set on stub into the real response
459
- // Use append for Set-Cookie to preserve multiple cookies
460
- const mergedHeaders = new Headers(response.headers);
461
- stubResponse.headers.forEach((value, name) => {
462
- if (name.toLowerCase() === "set-cookie") {
463
- mergedHeaders.append(name, value);
464
- } else {
465
- mergedHeaders.set(name, value);
466
- }
467
- });
415
+ if (isWebSocketUpgradeResponse(response)) {
416
+ responseHolder.response = response;
417
+ return response;
418
+ }
468
419
 
469
- // Clone response with merged headers (mutable for post-next() modifications)
470
- responseHolder.response = new Response(response.body, {
471
- status: response.status,
472
- statusText: response.statusText,
473
- headers: mergedHeaders,
420
+ // Chain ran to completion: stub headers overwrite (stubOverridesNonCookie)
421
+ // and reqCtx stub headers are merged in.
422
+ responseHolder.response = mergeResponse(response, stubResponse.headers, {
423
+ stubOverridesNonCookie: true,
424
+ mergeReqCtx: true,
474
425
  });
475
426
 
476
427
  return responseHolder.response;
477
428
  }
478
429
 
430
+ const middlewareOrdinal = index;
479
431
  const { entry, params } = middlewares[index++];
480
432
  const ctx = createMiddlewareContext(
481
433
  request,
482
434
  env,
483
435
  params,
484
436
  variables,
485
- responseHolder
437
+ responseHolder,
438
+ reverse,
486
439
  );
440
+ const metricStart = performance.now();
441
+ const metricLabel = getMiddlewareMetricLabel(entry, middlewareOrdinal);
442
+ let middlewareFinished = false;
443
+ const finishMiddleware = () => {
444
+ if (!middlewareFinished) {
445
+ middlewareFinished = true;
446
+ appendMetric(
447
+ _getRequestContext()?._metricsStore,
448
+ `${metricLabel}:pre`,
449
+ metricStart,
450
+ performance.now() - metricStart,
451
+ MIDDLEWARE_METRIC_DEPTH,
452
+ );
453
+ }
454
+ };
487
455
 
488
- // Track if next() was called and capture its Promise
489
- // This handles the case where middleware calls next() synchronously without await
456
+ // Track if next() was called and capture its Promise.
457
+ // Guard against double-calling: a second call would re-enter the
458
+ // downstream chain and overwrite responseHolder.response.
490
459
  let nextPromise: Promise<Response> | null = null;
460
+ let nextResolvedAt: number | undefined;
491
461
  const wrappedNext = (): Promise<Response> => {
492
- nextPromise = next();
462
+ if (nextPromise) {
463
+ throw new Error(
464
+ `[@rangojs/router] Middleware called next() more than once.`,
465
+ );
466
+ }
467
+ finishMiddleware();
468
+ const downstream = next();
469
+ nextPromise = downstream.then(
470
+ (res) => {
471
+ nextResolvedAt = performance.now();
472
+ return res;
473
+ },
474
+ (err) => {
475
+ nextResolvedAt = performance.now();
476
+ throw err;
477
+ },
478
+ );
493
479
  return nextPromise;
494
480
  };
495
481
 
496
- const result = await entry.handler(ctx, wrappedNext);
482
+ // Wrap the middleware (including its downstream next() chain) in its span
483
+ // via the unified phase API. metric:false — the middleware's perf metric is
484
+ // its exclusive pre/post own-time, recorded directly above and below, finer
485
+ // than a single wrap. Spans nest by async context, so this onions
486
+ // middleware-over-middleware and the core handler underneath. Pass-through
487
+ // when neither surface is active.
488
+ let result: Response | void;
489
+ try {
490
+ result = await observePhase(PHASES.middleware(metricLabel), () =>
491
+ entry.handler(ctx, wrappedNext),
492
+ );
493
+ } catch (error) {
494
+ // Thrown Response is short-circuit control flow, not an error.
495
+ // Fall through to the `if (result instanceof Response)` branch below
496
+ // so stub headers and request-context cookies merge as they do for
497
+ // an explicit `return new Response(...)`. Real errors propagate.
498
+ if (error instanceof Response) {
499
+ result = error;
500
+ } else {
501
+ finishMiddleware();
502
+ throw error;
503
+ }
504
+ }
505
+ finishMiddleware();
506
+
507
+ // Record post-next() processing time when middleware did work after
508
+ // the downstream chain resolved (e.g. adding headers, logging).
509
+ if (nextResolvedAt !== undefined) {
510
+ const postDur = performance.now() - nextResolvedAt;
511
+ if (postDur > POST_METRIC_MIN_DURATION_MS) {
512
+ appendMetric(
513
+ _getRequestContext()?._metricsStore,
514
+ `${metricLabel}:post`,
515
+ nextResolvedAt,
516
+ postDur,
517
+ MIDDLEWARE_METRIC_DEPTH,
518
+ );
519
+ }
520
+ }
497
521
 
498
- // Explicit return takes precedence
522
+ // Explicit return takes precedence (middleware short-circuit).
523
+ // Merge stub headers (from ctx.header before this point) and
524
+ // RequestContext stub headers (from cookies().set()) into the
525
+ // returned Response so they are not lost.
499
526
  if (result instanceof Response) {
500
- responseHolder.response = result;
501
- return result;
527
+ if (isWebSocketUpgradeResponse(result)) {
528
+ responseHolder.response = result;
529
+ return result;
530
+ }
531
+ // Explicit short-circuit: the returned Response's own headers win
532
+ // (stubOverridesNonCookie=false); reqCtx stub headers still merge in.
533
+ const merged = mergeResponse(result, stubResponse.headers, {
534
+ stubOverridesNonCookie: false,
535
+ mergeReqCtx: true,
536
+ });
537
+ responseHolder.response = merged;
538
+ return merged;
502
539
  }
503
540
 
504
541
  // Warn about unexpected return values (non-Response, non-undefined)
@@ -507,7 +544,7 @@ export async function executeMiddleware<TEnv>(
507
544
  const fnName = entry.handler.name || "(anonymous)";
508
545
  console.warn(
509
546
  `[Middleware] "${fnName}" returned ${typeof result} instead of Response or undefined. ` +
510
- `This return value will be ignored. Did you mean to return a Response?`
547
+ `This return value will be ignored. Did you mean to return a Response?`,
511
548
  );
512
549
  }
513
550
 
@@ -524,7 +561,7 @@ export async function executeMiddleware<TEnv>(
524
561
  `Middleware must call next() or return a Response. ` +
525
562
  `Function: ${fnName}, Pattern: ${entry.pattern ?? "(all)"}
526
563
  Source: ${import.meta.env.DEV ? entry.handler.toString().slice(0, 200) : "(source hidden in production)"}`,
527
- { cause: { url: request.url, fn: entry.handler } }
564
+ { cause: { url: request.url, fn: entry.handler } },
528
565
  );
529
566
  };
530
567
 
@@ -536,64 +573,19 @@ export async function executeMiddleware<TEnv>(
536
573
  throw new Error("No response generated by middleware chain");
537
574
  }
538
575
 
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;
576
+ // Final re-merge: capture any RequestContext stub headers added after the
577
+ // last merge point (e.g. cookies().set() called after await next()).
578
+ // The reqCtx stub may have already been partially merged during finalHandler
579
+ // or early-return paths; only append *new* Set-Cookie entries to avoid dupes.
580
+ //
581
+ // Skip for upgrade responses: upgrade headers are semantically immutable and
582
+ // set-cookie on an upgrade is not meaningful.
583
+ const reqCtx = _getRequestContext();
584
+ if (reqCtx && !isWebSocketUpgradeResponse(finalResponse)) {
585
+ mergeReqCtxStub(finalResponse.headers, reqCtx);
561
586
  }
562
587
 
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
- );
590
- }
591
-
592
- return stubResponse;
593
- };
594
-
595
- await next();
596
- // Headers/cookies set on stubResponse will be merged by the caller
588
+ return finalResponse;
597
589
  }
598
590
 
599
591
  /**
@@ -601,7 +593,7 @@ export async function executeServerActionMiddleware<TEnv>(
601
593
  *
602
594
  * Intercepts use a shared stubResponse from the request context. This function:
603
595
  * - Runs middleware in sequence with a simple next() chain
604
- * - Returns Response if any middleware short-circuits (returns Response or redirects BEFORE next())
596
+ * - Returns Response if any middleware short-circuits (returns OR throws a Response, or redirects, BEFORE next())
605
597
  * - Returns null if all middleware calls next() - headers set after next() remain on stubResponse
606
598
  *
607
599
  * @param middlewares - Array of middleware functions
@@ -617,7 +609,12 @@ export async function executeInterceptMiddleware<TEnv>(
617
609
  env: TEnv,
618
610
  params: Record<string, string>,
619
611
  variables: Record<string, any>,
620
- stubResponse: Response
612
+ stubResponse: Response,
613
+ reverse?: (
614
+ name: string,
615
+ params?: Record<string, string>,
616
+ search?: Record<string, unknown>,
617
+ ) => string,
621
618
  ): Promise<Response | null> {
622
619
  if (middlewares.length === 0) {
623
620
  return null;
@@ -634,28 +631,57 @@ export async function executeInterceptMiddleware<TEnv>(
634
631
  return stubResponse;
635
632
  }
636
633
 
634
+ const ordinal = index;
637
635
  const middleware = middlewares[index++];
638
636
  const ctx = createMiddlewareContext(
639
637
  request,
640
638
  env,
641
639
  params,
642
640
  variables,
643
- responseHolder
641
+ responseHolder,
642
+ reverse,
644
643
  );
645
644
 
646
- const result = await middleware(ctx, next);
645
+ let nextCalled = false;
646
+ const guardedNext = (): Promise<Response> => {
647
+ if (nextCalled) {
648
+ throw new Error(
649
+ `[@rangojs/router] Intercept middleware called next() more than once.`,
650
+ );
651
+ }
652
+ nextCalled = true;
653
+ return next();
654
+ };
655
+
656
+ // Span-wrap each intercept middleware as rango.middleware (metric:false —
657
+ // intercept runs inside the render phase already metered by render:total, so
658
+ // it contributes a span but no separate perf metric). Bare MiddlewareFns
659
+ // have no pattern, so the label is scoped to "*" like a pattern-less entry.
660
+ const label = getMiddlewareMetricLabel(
661
+ { handler: middleware, pattern: null } as MiddlewareEntry<TEnv>,
662
+ ordinal,
663
+ );
664
+
665
+ let result: Response | void;
666
+ try {
667
+ result = await observePhase(PHASES.middleware(label), () =>
668
+ middleware(ctx, guardedNext),
669
+ );
670
+ } catch (error) {
671
+ // Thrown Response is short-circuit control flow, parity with the
672
+ // explicit-return path below. Real errors propagate.
673
+ if (error instanceof Response) {
674
+ result = error;
675
+ } else {
676
+ throw error;
677
+ }
678
+ }
647
679
 
648
680
  if (result instanceof Response) {
649
681
  earlyResponse = result;
650
682
  return result;
651
683
  }
652
684
 
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
685
  return stubResponse;
660
686
  };
661
687
 
@@ -673,19 +699,13 @@ export async function executeInterceptMiddleware<TEnv>(
673
699
  });
674
700
 
675
701
  if (hasStubHeaders) {
676
- // Clone and merge headers from stub into early response
677
- const mergedHeaders = new Headers(response.headers);
678
- stubResponse.headers.forEach((value, name) => {
679
- if (name.toLowerCase() === "set-cookie") {
680
- mergedHeaders.append(name, value);
681
- } else {
682
- mergedHeaders.set(name, value);
683
- }
684
- });
685
- return new Response(response.body, {
686
- status: response.status,
687
- statusText: response.statusText,
688
- headers: mergedHeaders,
702
+ // Only fill in missing headers the returned Response's explicit headers
703
+ // take precedence (stubOverridesNonCookie=false), matching executeMiddleware.
704
+ // mergeReqCtx=false: the intercept path deliberately does NOT merge reqCtx
705
+ // stub headers here (pinned by intercept-middleware-headers.test.ts).
706
+ return mergeResponse(response, stubResponse.headers, {
707
+ stubOverridesNonCookie: false,
708
+ mergeReqCtx: false,
689
709
  });
690
710
  }
691
711
  return response;
@@ -708,7 +728,12 @@ export async function executeLoaderMiddleware<TEnv>(
708
728
  env: TEnv,
709
729
  params: Record<string, string>,
710
730
  variables: Record<string, any>,
711
- finalHandler: () => Promise<Response>
731
+ finalHandler: () => Promise<Response>,
732
+ reverse?: (
733
+ name: string,
734
+ params?: Record<string, string>,
735
+ search?: Record<string, unknown>,
736
+ ) => string,
712
737
  ): Promise<Response> {
713
738
  if (middlewares.length === 0) {
714
739
  return finalHandler();
@@ -721,7 +746,6 @@ export async function executeLoaderMiddleware<TEnv>(
721
746
  regex: null,
722
747
  paramNames: [],
723
748
  handler,
724
- mountPrefix: null,
725
749
  } as MiddlewareEntry<TEnv>,
726
750
  params,
727
751
  }));
@@ -731,27 +755,11 @@ export async function executeLoaderMiddleware<TEnv>(
731
755
  request,
732
756
  env,
733
757
  variables,
734
- finalHandler
758
+ finalHandler,
759
+ reverse,
735
760
  );
736
761
  }
737
762
 
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
763
  /**
756
764
  * Collect route-level middleware from an entry tree
757
765
  *
@@ -764,7 +772,7 @@ export interface CollectedMiddleware {
764
772
  */
765
773
  export function collectRouteMiddleware(
766
774
  entries: Iterable<MiddlewareCollectableEntry>,
767
- params: Record<string, string>
775
+ params: Record<string, string>,
768
776
  ): CollectedMiddleware[] {
769
777
  const result: CollectedMiddleware[] = [];
770
778