@rangojs/router 0.0.0-experimental.23 → 0.0.0-experimental.24535dcb

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 (1250) hide show
  1. package/AGENTS.md +11 -3
  2. package/README.md +303 -740
  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 +730 -184
  82. package/dist/bin/rango.js.map +1 -0
  83. package/dist/browser/event-controller.d.ts +191 -0
  84. package/dist/browser/event-controller.d.ts.map +1 -0
  85. package/dist/browser/event-controller.js +559 -0
  86. package/dist/browser/event-controller.js.map +1 -0
  87. package/dist/browser/index.d.ts +2 -0
  88. package/dist/browser/index.d.ts.map +1 -0
  89. package/dist/browser/index.js +14 -0
  90. package/dist/browser/index.js.map +1 -0
  91. package/dist/browser/link-interceptor.d.ts +38 -0
  92. package/dist/browser/link-interceptor.d.ts.map +1 -0
  93. package/dist/browser/link-interceptor.js +99 -0
  94. package/dist/browser/link-interceptor.js.map +1 -0
  95. package/dist/browser/logging.d.ts +10 -0
  96. package/dist/browser/logging.d.ts.map +1 -0
  97. package/dist/browser/logging.js +29 -0
  98. package/dist/browser/logging.js.map +1 -0
  99. package/dist/browser/lru-cache.d.ts +17 -0
  100. package/dist/browser/lru-cache.d.ts.map +1 -0
  101. package/dist/browser/lru-cache.js +50 -0
  102. package/dist/browser/lru-cache.js.map +1 -0
  103. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  104. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  105. package/dist/browser/merge-segment-loaders.js +102 -0
  106. package/dist/browser/merge-segment-loaders.js.map +1 -0
  107. package/dist/browser/navigation-bridge.d.ts +102 -0
  108. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  109. package/dist/browser/navigation-bridge.js +708 -0
  110. package/dist/browser/navigation-bridge.js.map +1 -0
  111. package/dist/browser/navigation-client.d.ts +25 -0
  112. package/dist/browser/navigation-client.d.ts.map +1 -0
  113. package/dist/browser/navigation-client.js +157 -0
  114. package/dist/browser/navigation-client.js.map +1 -0
  115. package/dist/browser/navigation-store.d.ts +101 -0
  116. package/dist/browser/navigation-store.d.ts.map +1 -0
  117. package/dist/browser/navigation-store.js +625 -0
  118. package/dist/browser/navigation-store.js.map +1 -0
  119. package/dist/browser/partial-update.d.ts +75 -0
  120. package/dist/browser/partial-update.d.ts.map +1 -0
  121. package/dist/browser/partial-update.js +426 -0
  122. package/dist/browser/partial-update.js.map +1 -0
  123. package/dist/browser/react/Link.d.ts +86 -0
  124. package/dist/browser/react/Link.d.ts.map +1 -0
  125. package/dist/browser/react/Link.js +128 -0
  126. package/dist/browser/react/Link.js.map +1 -0
  127. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  128. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  129. package/dist/browser/react/NavigationProvider.js +216 -0
  130. package/dist/browser/react/NavigationProvider.js.map +1 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  132. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  133. package/dist/browser/react/ScrollRestoration.js +57 -0
  134. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  135. package/dist/browser/react/context.d.ts +46 -0
  136. package/dist/browser/react/context.d.ts.map +1 -0
  137. package/dist/browser/react/context.js +10 -0
  138. package/dist/browser/react/context.js.map +1 -0
  139. package/dist/browser/react/index.d.ts +11 -0
  140. package/dist/browser/react/index.d.ts.map +1 -0
  141. package/dist/browser/react/index.js +22 -0
  142. package/dist/browser/react/index.js.map +1 -0
  143. package/dist/browser/react/location-state-shared.d.ts +63 -0
  144. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  145. package/dist/browser/react/location-state-shared.js +81 -0
  146. package/dist/browser/react/location-state-shared.js.map +1 -0
  147. package/dist/browser/react/location-state.d.ts +23 -0
  148. package/dist/browser/react/location-state.d.ts.map +1 -0
  149. package/dist/browser/react/location-state.js +29 -0
  150. package/dist/browser/react/location-state.js.map +1 -0
  151. package/dist/browser/react/mount-context.d.ts +24 -0
  152. package/dist/browser/react/mount-context.d.ts.map +1 -0
  153. package/dist/browser/react/mount-context.js +24 -0
  154. package/dist/browser/react/mount-context.js.map +1 -0
  155. package/dist/browser/react/use-action.d.ts +64 -0
  156. package/dist/browser/react/use-action.d.ts.map +1 -0
  157. package/dist/browser/react/use-action.js +134 -0
  158. package/dist/browser/react/use-action.js.map +1 -0
  159. package/dist/browser/react/use-client-cache.d.ts +41 -0
  160. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  161. package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -28
  162. package/dist/browser/react/use-client-cache.js.map +1 -0
  163. package/dist/browser/react/use-handle.d.ts +31 -0
  164. package/dist/browser/react/use-handle.d.ts.map +1 -0
  165. package/dist/browser/react/use-handle.js +144 -0
  166. package/dist/browser/react/use-handle.js.map +1 -0
  167. package/dist/browser/react/use-href.d.ts +33 -0
  168. package/dist/browser/react/use-href.d.ts.map +1 -0
  169. package/dist/browser/react/use-href.js +39 -0
  170. package/dist/browser/react/use-href.js.map +1 -0
  171. package/dist/browser/react/use-link-status.d.ts +37 -0
  172. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  173. package/dist/browser/react/use-link-status.js +99 -0
  174. package/dist/browser/react/use-link-status.js.map +1 -0
  175. package/dist/browser/react/use-mount.d.ts +25 -0
  176. package/dist/browser/react/use-mount.d.ts.map +1 -0
  177. package/dist/browser/react/use-mount.js +30 -0
  178. package/dist/browser/react/use-mount.js.map +1 -0
  179. package/dist/browser/react/use-navigation.d.ts +27 -0
  180. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  181. package/dist/browser/react/use-navigation.js +87 -0
  182. package/dist/browser/react/use-navigation.js.map +1 -0
  183. package/dist/browser/react/use-segments.d.ts +38 -0
  184. package/dist/browser/react/use-segments.d.ts.map +1 -0
  185. package/dist/browser/react/use-segments.js +130 -0
  186. package/dist/browser/react/use-segments.js.map +1 -0
  187. package/dist/browser/request-controller.d.ts +26 -0
  188. package/dist/browser/request-controller.d.ts.map +1 -0
  189. package/dist/browser/request-controller.js +147 -0
  190. package/dist/browser/request-controller.js.map +1 -0
  191. package/dist/browser/rsc-router.d.ts +129 -0
  192. package/dist/browser/rsc-router.d.ts.map +1 -0
  193. package/dist/browser/rsc-router.js +195 -0
  194. package/dist/browser/rsc-router.js.map +1 -0
  195. package/dist/browser/scroll-restoration.d.ts +93 -0
  196. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  197. package/dist/browser/scroll-restoration.js +321 -0
  198. package/dist/browser/scroll-restoration.js.map +1 -0
  199. package/dist/browser/segment-structure-assert.d.ts +17 -0
  200. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  201. package/dist/browser/segment-structure-assert.js +59 -0
  202. package/dist/browser/segment-structure-assert.js.map +1 -0
  203. package/dist/browser/server-action-bridge.d.ts +26 -0
  204. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  205. package/dist/browser/server-action-bridge.js +668 -0
  206. package/dist/browser/server-action-bridge.js.map +1 -0
  207. package/dist/browser/shallow.d.ts +12 -0
  208. package/dist/browser/shallow.d.ts.map +1 -0
  209. package/dist/browser/shallow.js +34 -0
  210. package/dist/browser/shallow.js.map +1 -0
  211. package/dist/browser/types.d.ts +369 -0
  212. package/dist/browser/types.d.ts.map +1 -0
  213. package/dist/browser/types.js +2 -0
  214. package/dist/browser/types.js.map +1 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  216. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  217. package/dist/build/__tests__/generate-cli.test.js +237 -0
  218. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  220. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  221. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  222. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  224. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  225. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  226. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  228. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  230. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  231. package/dist/build/generate-manifest.d.ts +81 -0
  232. package/dist/build/generate-manifest.d.ts.map +1 -0
  233. package/dist/build/generate-manifest.js +276 -0
  234. package/dist/build/generate-manifest.js.map +1 -0
  235. package/dist/build/generate-route-types.d.ts +115 -0
  236. package/dist/build/generate-route-types.d.ts.map +1 -0
  237. package/dist/build/generate-route-types.js +740 -0
  238. package/dist/build/generate-route-types.js.map +1 -0
  239. package/dist/build/index.d.ts +21 -0
  240. package/dist/build/index.d.ts.map +1 -0
  241. package/dist/build/index.js +21 -0
  242. package/dist/build/index.js.map +1 -0
  243. package/dist/build/route-trie.d.ts +71 -0
  244. package/dist/build/route-trie.d.ts.map +1 -0
  245. package/dist/build/route-trie.js +175 -0
  246. package/dist/build/route-trie.js.map +1 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  248. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  249. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  250. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  252. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  253. package/dist/cache/__tests__/document-cache.test.js +345 -0
  254. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  258. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  260. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  261. package/dist/cache/__tests__/memory-store.test.js +367 -0
  262. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  263. package/dist/cache/cache-scope.d.ts +102 -0
  264. package/dist/cache/cache-scope.d.ts.map +1 -0
  265. package/dist/cache/cache-scope.js +440 -0
  266. package/dist/cache/cache-scope.js.map +1 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  270. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  272. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  273. package/dist/cache/cf/cf-cache-store.js +242 -0
  274. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  275. package/dist/cache/cf/index.d.ts +14 -0
  276. package/dist/cache/cf/index.d.ts.map +1 -0
  277. package/dist/cache/cf/index.js +17 -0
  278. package/dist/cache/cf/index.js.map +1 -0
  279. package/dist/cache/document-cache.d.ts +64 -0
  280. package/dist/cache/document-cache.d.ts.map +1 -0
  281. package/dist/cache/document-cache.js +228 -0
  282. package/dist/cache/document-cache.js.map +1 -0
  283. package/dist/cache/index.d.ts +19 -0
  284. package/dist/cache/index.d.ts.map +1 -0
  285. package/dist/cache/index.js +21 -0
  286. package/dist/cache/index.js.map +1 -0
  287. package/dist/cache/memory-segment-store.d.ts +110 -0
  288. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  289. package/dist/cache/memory-segment-store.js +117 -0
  290. package/dist/cache/memory-segment-store.js.map +1 -0
  291. package/dist/cache/memory-store.d.ts +41 -0
  292. package/dist/cache/memory-store.d.ts.map +1 -0
  293. package/dist/cache/memory-store.js +191 -0
  294. package/dist/cache/memory-store.js.map +1 -0
  295. package/dist/cache/types.d.ts +317 -0
  296. package/dist/cache/types.d.ts.map +1 -0
  297. package/dist/cache/types.js +12 -0
  298. package/dist/cache/types.js.map +1 -0
  299. package/dist/client.d.ts +248 -0
  300. package/dist/client.d.ts.map +1 -0
  301. package/dist/client.js +367 -0
  302. package/dist/client.js.map +1 -0
  303. package/dist/client.rsc.d.ts +26 -0
  304. package/dist/client.rsc.d.ts.map +1 -0
  305. package/dist/client.rsc.js +46 -0
  306. package/dist/client.rsc.js.map +1 -0
  307. package/dist/component-utils.d.ts +36 -0
  308. package/dist/component-utils.d.ts.map +1 -0
  309. package/dist/component-utils.js +61 -0
  310. package/dist/component-utils.js.map +1 -0
  311. package/dist/components/DefaultDocument.d.ts +13 -0
  312. package/dist/components/DefaultDocument.d.ts.map +1 -0
  313. package/dist/components/DefaultDocument.js +15 -0
  314. package/dist/components/DefaultDocument.js.map +1 -0
  315. package/dist/debug.d.ts +58 -0
  316. package/dist/debug.d.ts.map +1 -0
  317. package/dist/debug.js +157 -0
  318. package/dist/debug.js.map +1 -0
  319. package/dist/default-error-boundary.d.ts +11 -0
  320. package/dist/default-error-boundary.d.ts.map +1 -0
  321. package/dist/default-error-boundary.js +45 -0
  322. package/dist/default-error-boundary.js.map +1 -0
  323. package/dist/deps/browser.d.ts +2 -0
  324. package/dist/deps/browser.d.ts.map +1 -0
  325. package/dist/deps/browser.js +3 -0
  326. package/dist/deps/browser.js.map +1 -0
  327. package/dist/deps/html-stream-client.d.ts +2 -0
  328. package/dist/deps/html-stream-client.d.ts.map +1 -0
  329. package/dist/deps/html-stream-client.js +3 -0
  330. package/dist/deps/html-stream-client.js.map +1 -0
  331. package/dist/deps/html-stream-server.d.ts +2 -0
  332. package/dist/deps/html-stream-server.d.ts.map +1 -0
  333. package/dist/deps/html-stream-server.js +3 -0
  334. package/dist/deps/html-stream-server.js.map +1 -0
  335. package/dist/deps/rsc.d.ts +2 -0
  336. package/dist/deps/rsc.d.ts.map +1 -0
  337. package/dist/deps/rsc.js +4 -0
  338. package/dist/deps/rsc.js.map +1 -0
  339. package/dist/deps/ssr.d.ts +2 -0
  340. package/dist/deps/ssr.d.ts.map +1 -0
  341. package/dist/deps/ssr.js +3 -0
  342. package/dist/deps/ssr.js.map +1 -0
  343. package/dist/errors.d.ts +174 -0
  344. package/dist/errors.d.ts.map +1 -0
  345. package/dist/errors.js +241 -0
  346. package/dist/errors.js.map +1 -0
  347. package/dist/handle.d.ts +78 -0
  348. package/dist/handle.d.ts.map +1 -0
  349. package/dist/handle.js +82 -0
  350. package/dist/handle.js.map +1 -0
  351. package/dist/handles/MetaTags.d.ts +14 -0
  352. package/dist/handles/MetaTags.d.ts.map +1 -0
  353. package/dist/handles/MetaTags.js +136 -0
  354. package/dist/handles/MetaTags.js.map +1 -0
  355. package/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/dist/href-context.d.ts +29 -0
  424. package/dist/href-context.d.ts.map +1 -0
  425. package/dist/href-context.js +21 -0
  426. package/dist/href-context.js.map +1 -0
  427. package/dist/index.d.ts +73 -0
  428. package/dist/index.d.ts.map +1 -0
  429. package/dist/index.js +91 -0
  430. package/dist/index.js.map +1 -0
  431. package/dist/index.rsc.d.ts +32 -0
  432. package/dist/index.rsc.d.ts.map +1 -0
  433. package/dist/index.rsc.js +40 -0
  434. package/dist/index.rsc.js.map +1 -0
  435. package/dist/internal-debug.d.ts +2 -0
  436. package/dist/internal-debug.d.ts.map +1 -0
  437. package/dist/internal-debug.js +5 -0
  438. package/dist/internal-debug.js.map +1 -0
  439. package/dist/loader.d.ts +14 -0
  440. package/dist/loader.d.ts.map +1 -0
  441. package/dist/loader.js +20 -0
  442. package/dist/loader.js.map +1 -0
  443. package/dist/loader.rsc.d.ts +19 -0
  444. package/dist/loader.rsc.d.ts.map +1 -0
  445. package/dist/loader.rsc.js +99 -0
  446. package/dist/loader.rsc.js.map +1 -0
  447. package/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -10
  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 +4373 -1328
  799. package/dist/vite/index.js.bak +5448 -0
  800. package/dist/vite/index.js.map +1 -0
  801. package/dist/vite/index.named-routes.gen.ts +103 -0
  802. package/dist/vite/package-resolution.d.ts +43 -0
  803. package/dist/vite/package-resolution.d.ts.map +1 -0
  804. package/dist/vite/package-resolution.js +112 -0
  805. package/dist/vite/package-resolution.js.map +1 -0
  806. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  807. package/dist/vite/virtual-entries.d.ts +25 -0
  808. package/dist/vite/virtual-entries.d.ts.map +1 -0
  809. package/dist/vite/virtual-entries.js +110 -0
  810. package/dist/vite/virtual-entries.js.map +1 -0
  811. package/package.json +96 -24
  812. package/skills/api-client/SKILL.md +211 -0
  813. package/skills/breadcrumbs/SKILL.md +329 -0
  814. package/skills/bundle-analysis/SKILL.md +159 -0
  815. package/skills/cache-guide/SKILL.md +251 -24
  816. package/skills/caching/SKILL.md +375 -17
  817. package/skills/catalog.json +271 -0
  818. package/skills/comparison/SKILL.md +50 -0
  819. package/skills/comparison/agents/openai.yaml +4 -0
  820. package/skills/comparison/references/framework-comparison.md +837 -0
  821. package/skills/composability/SKILL.md +110 -4
  822. package/skills/css/SKILL.md +76 -0
  823. package/skills/debug-manifest/SKILL.md +5 -3
  824. package/skills/defer-hydration/SKILL.md +235 -0
  825. package/skills/document-cache/SKILL.md +87 -56
  826. package/skills/fonts/SKILL.md +1 -1
  827. package/skills/handler-use/SKILL.md +364 -0
  828. package/skills/hooks/SKILL.md +73 -690
  829. package/skills/hooks/data.md +273 -0
  830. package/skills/hooks/handle-and-actions.md +103 -0
  831. package/skills/hooks/navigation.md +110 -0
  832. package/skills/hooks/outlets.md +41 -0
  833. package/skills/hooks/state.md +228 -0
  834. package/skills/hooks/urls.md +135 -0
  835. package/skills/host-router/SKILL.md +129 -27
  836. package/skills/i18n/SKILL.md +276 -0
  837. package/skills/intercept/SKILL.md +94 -18
  838. package/skills/layout/SKILL.md +62 -19
  839. package/skills/links/SKILL.md +249 -17
  840. package/skills/loader/SKILL.md +319 -31
  841. package/skills/middleware/SKILL.md +59 -16
  842. package/skills/migrate-nextjs/SKILL.md +745 -0
  843. package/skills/migrate-react-router/SKILL.md +153 -0
  844. package/skills/migrate-react-router/cloudflare-workers.md +129 -0
  845. package/skills/migrate-react-router/component-migration.md +196 -0
  846. package/skills/migrate-react-router/data-and-actions.md +225 -0
  847. package/skills/migrate-react-router/route-mapping.md +271 -0
  848. package/skills/mime-routes/SKILL.md +29 -2
  849. package/skills/observability/SKILL.md +202 -0
  850. package/skills/parallel/SKILL.md +225 -10
  851. package/skills/ppr/SKILL.md +616 -0
  852. package/skills/prerender/SKILL.md +178 -124
  853. package/skills/rango/SKILL.md +318 -24
  854. package/skills/react-compiler/SKILL.md +168 -0
  855. package/skills/response-routes/SKILL.md +138 -49
  856. package/skills/route/SKILL.md +175 -13
  857. package/skills/router-setup/SKILL.md +137 -12
  858. package/skills/scripts/SKILL.md +179 -0
  859. package/skills/server-actions/SKILL.md +776 -0
  860. package/skills/shell-manifest/SKILL.md +185 -0
  861. package/skills/streams-and-websockets/SKILL.md +283 -0
  862. package/skills/tailwind/SKILL.md +28 -4
  863. package/skills/testing/SKILL.md +130 -0
  864. package/skills/testing/bindings.md +103 -0
  865. package/skills/testing/cache-prerender.md +127 -0
  866. package/skills/testing/client-components.md +124 -0
  867. package/skills/testing/e2e-parity.md +125 -0
  868. package/skills/testing/flight.md +91 -0
  869. package/skills/testing/handles.md +131 -0
  870. package/skills/testing/loader.md +128 -0
  871. package/skills/testing/middleware.md +99 -0
  872. package/skills/testing/render-handler.md +122 -0
  873. package/skills/testing/response-routes.md +95 -0
  874. package/skills/testing/reverse-and-types.md +85 -0
  875. package/skills/testing/server-actions.md +107 -0
  876. package/skills/testing/server-tree.md +128 -0
  877. package/skills/testing/setup.md +123 -0
  878. package/skills/theme/SKILL.md +1 -1
  879. package/skills/typesafety/SKILL.md +45 -614
  880. package/skills/typesafety/env-and-bindings.md +254 -0
  881. package/skills/typesafety/generated-files-and-cli.md +335 -0
  882. package/skills/typesafety/params-and-search.md +153 -0
  883. package/skills/typesafety/route-types.md +209 -0
  884. package/skills/use-cache/SKILL.md +74 -15
  885. package/skills/vercel/SKILL.md +128 -0
  886. package/skills/view-transitions/SKILL.md +337 -0
  887. package/src/__augment-tests__/augment.ts +81 -0
  888. package/src/__augment-tests__/augmented.check.ts +116 -0
  889. package/src/__internal.ts +67 -40
  890. package/src/browser/action-coordinator.ts +53 -36
  891. package/src/browser/action-fence.ts +47 -0
  892. package/src/browser/app-shell.ts +39 -0
  893. package/src/browser/app-version.ts +14 -0
  894. package/src/browser/connection-warmup.ts +134 -0
  895. package/src/browser/cookie-name.ts +140 -0
  896. package/src/browser/event-controller.ts +257 -158
  897. package/src/browser/history-state.ts +21 -0
  898. package/src/browser/index.ts +3 -3
  899. package/src/browser/invalidate-client-cache.ts +52 -0
  900. package/src/browser/link-interceptor.ts +4 -0
  901. package/src/browser/logging.ts +28 -0
  902. package/src/browser/merge-segment-loaders.ts +6 -4
  903. package/src/browser/navigation-bridge.ts +212 -34
  904. package/src/browser/navigation-client.ts +233 -58
  905. package/src/browser/navigation-store-handle.ts +38 -0
  906. package/src/browser/navigation-store.ts +203 -80
  907. package/src/browser/navigation-transaction.ts +18 -66
  908. package/src/browser/network-error-handler.ts +34 -7
  909. package/src/browser/partial-update.ts +242 -126
  910. package/src/browser/prefetch/cache.ts +344 -30
  911. package/src/browser/prefetch/fetch.ts +373 -48
  912. package/src/browser/prefetch/policy.ts +6 -0
  913. package/src/browser/prefetch/queue.ts +144 -23
  914. package/src/browser/prefetch/resource-ready.ts +77 -0
  915. package/src/browser/rango-state.ts +158 -76
  916. package/src/browser/react/Link.tsx +135 -18
  917. package/src/browser/react/NavigationProvider.tsx +240 -122
  918. package/src/browser/react/ScrollRestoration.tsx +10 -6
  919. package/src/browser/react/context.ts +7 -2
  920. package/src/browser/react/filter-segment-order.ts +66 -7
  921. package/src/browser/react/index.ts +0 -48
  922. package/src/browser/react/location-state-shared.ts +178 -8
  923. package/src/browser/react/location-state.ts +39 -14
  924. package/src/browser/react/use-action.ts +6 -15
  925. package/src/browser/react/use-handle.ts +23 -69
  926. package/src/browser/react/use-href.tsx +8 -1
  927. package/src/browser/react/use-link-status.ts +33 -8
  928. package/src/browser/react/use-navigation.ts +32 -7
  929. package/src/browser/react/use-params.ts +20 -10
  930. package/src/browser/react/use-reverse.ts +106 -0
  931. package/src/browser/react/use-router.ts +46 -11
  932. package/src/browser/react/use-search-params.ts +0 -5
  933. package/src/browser/react/use-segments.ts +11 -21
  934. package/src/browser/response-adapter.ts +99 -8
  935. package/src/browser/rsc-router.tsx +276 -76
  936. package/src/browser/scroll-restoration.ts +61 -47
  937. package/src/browser/segment-reconciler.ts +44 -7
  938. package/src/browser/segment-structure-assert.ts +2 -2
  939. package/src/browser/server-action-bridge.ts +244 -71
  940. package/src/browser/types.ts +160 -12
  941. package/src/browser/validate-redirect-origin.ts +43 -16
  942. package/src/build/collect-fallback-refs.ts +107 -0
  943. package/src/build/generate-manifest.ts +207 -158
  944. package/src/build/generate-route-types.ts +6 -1
  945. package/src/build/index.ts +11 -3
  946. package/src/build/prefix-tree-utils.ts +123 -0
  947. package/src/build/route-trie.ts +215 -42
  948. package/src/build/route-types/ast-route-extraction.ts +15 -8
  949. package/src/build/route-types/codegen.ts +16 -5
  950. package/src/build/route-types/include-resolution.ts +464 -63
  951. package/src/build/route-types/param-extraction.ts +6 -3
  952. package/src/build/route-types/per-module-writer.ts +22 -6
  953. package/src/build/route-types/router-processing.ts +336 -110
  954. package/src/build/route-types/scan-filter.ts +9 -2
  955. package/src/build/route-types/source-scan.ts +216 -0
  956. package/src/build/runtime-discovery.ts +13 -21
  957. package/src/cache/cache-error.ts +104 -0
  958. package/src/cache/cache-key-utils.ts +58 -13
  959. package/src/cache/cache-policy.ts +108 -34
  960. package/src/cache/cache-runtime.ts +436 -69
  961. package/src/cache/cache-scope.ts +235 -103
  962. package/src/cache/cache-tag.ts +149 -0
  963. package/src/cache/cf/cf-base64.ts +33 -0
  964. package/src/cache/cf/cf-cache-constants.ts +127 -0
  965. package/src/cache/cf/cf-cache-store.ts +2442 -170
  966. package/src/cache/cf/cf-cache-types.ts +349 -0
  967. package/src/cache/cf/cf-kv-utils.ts +46 -0
  968. package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
  969. package/src/cache/cf/index.ts +11 -17
  970. package/src/cache/document-cache.ts +144 -49
  971. package/src/cache/handle-snapshot.ts +70 -0
  972. package/src/cache/index.ts +24 -20
  973. package/src/cache/memory-segment-store.ts +243 -37
  974. package/src/cache/profile-registry.ts +46 -31
  975. package/src/cache/read-through-swr.ts +56 -12
  976. package/src/cache/segment-codec.ts +13 -21
  977. package/src/cache/shell-snapshot.ts +417 -0
  978. package/src/cache/tag-invalidation.ts +230 -0
  979. package/src/cache/taint.ts +55 -0
  980. package/src/cache/types.ts +180 -99
  981. package/src/cache/vercel/index.ts +11 -0
  982. package/src/cache/vercel/vercel-cache-store.ts +1127 -0
  983. package/src/client.rsc.tsx +42 -21
  984. package/src/client.tsx +117 -336
  985. package/src/cloudflare/index.ts +11 -0
  986. package/src/cloudflare/tracing.ts +108 -0
  987. package/src/component-utils.ts +19 -0
  988. package/src/components/DefaultDocument.tsx +8 -2
  989. package/src/context-var.ts +84 -2
  990. package/src/debug.ts +2 -2
  991. package/src/decode-loader-results.ts +52 -0
  992. package/src/defer.ts +185 -0
  993. package/src/deps/ssr.ts +0 -1
  994. package/src/encode-kv.ts +49 -0
  995. package/src/errors.ts +30 -4
  996. package/src/escape-script.ts +52 -0
  997. package/src/handle.ts +104 -34
  998. package/src/handles/MetaTags.tsx +24 -53
  999. package/src/handles/Scripts.tsx +183 -0
  1000. package/src/handles/breadcrumbs.ts +93 -0
  1001. package/src/handles/deferred-resolution.ts +127 -0
  1002. package/src/handles/is-thenable.ts +18 -0
  1003. package/src/handles/meta.ts +14 -40
  1004. package/src/handles/script.ts +244 -0
  1005. package/src/host/cookie-handler.ts +9 -60
  1006. package/src/host/errors.ts +13 -22
  1007. package/src/host/index.ts +9 -2
  1008. package/src/host/pattern-matcher.ts +23 -52
  1009. package/src/host/router.ts +107 -99
  1010. package/src/host/testing.ts +40 -27
  1011. package/src/host/types.ts +37 -4
  1012. package/src/host/utils.ts +1 -1
  1013. package/src/href-client.ts +137 -22
  1014. package/src/index.rsc.ts +84 -29
  1015. package/src/index.ts +134 -43
  1016. package/src/internal-debug.ts +11 -10
  1017. package/src/loader-store.ts +500 -0
  1018. package/src/loader.rsc.ts +20 -13
  1019. package/src/loader.ts +12 -11
  1020. package/src/missing-id-error.ts +68 -0
  1021. package/src/outlet-context.ts +1 -1
  1022. package/src/outlet-provider.tsx +1 -5
  1023. package/src/prerender/param-hash.ts +16 -16
  1024. package/src/prerender/store.ts +37 -41
  1025. package/src/prerender.ts +215 -86
  1026. package/src/redirect-origin.ts +114 -0
  1027. package/src/regex-escape.ts +8 -0
  1028. package/src/render-error-thrower.tsx +20 -0
  1029. package/src/response-utils.ts +62 -0
  1030. package/src/reverse.ts +65 -15
  1031. package/src/root-error-boundary.tsx +1 -19
  1032. package/src/route-content-wrapper.tsx +19 -77
  1033. package/src/route-definition/dsl-helpers.ts +485 -303
  1034. package/src/route-definition/helper-factories.ts +28 -140
  1035. package/src/route-definition/helpers-types.ts +153 -77
  1036. package/src/route-definition/index.ts +4 -2
  1037. package/src/route-definition/redirect.ts +53 -12
  1038. package/src/route-definition/resolve-handler-use.ts +160 -0
  1039. package/src/route-definition/use-item-types.ts +29 -0
  1040. package/src/route-map-builder.ts +48 -21
  1041. package/src/route-types.ts +37 -46
  1042. package/src/router/basename.ts +14 -0
  1043. package/src/router/content-negotiation.ts +164 -17
  1044. package/src/router/error-handling.ts +45 -18
  1045. package/src/router/find-match.ts +130 -29
  1046. package/src/router/handler-context.ts +110 -39
  1047. package/src/router/instrument.ts +355 -0
  1048. package/src/router/intercept-resolution.ts +50 -24
  1049. package/src/router/lazy-includes.ts +89 -63
  1050. package/src/router/loader-resolution.ts +286 -56
  1051. package/src/router/logging.ts +5 -8
  1052. package/src/router/manifest.ts +105 -56
  1053. package/src/router/match-api.ts +179 -219
  1054. package/src/router/match-context.ts +0 -22
  1055. package/src/router/match-handlers.ts +211 -165
  1056. package/src/router/match-middleware/background-revalidation.ts +66 -22
  1057. package/src/router/match-middleware/cache-lookup.ts +214 -263
  1058. package/src/router/match-middleware/cache-store.ts +105 -50
  1059. package/src/router/match-middleware/intercept-resolution.ts +8 -28
  1060. package/src/router/match-middleware/segment-resolution.ts +52 -18
  1061. package/src/router/match-pipelines.ts +1 -42
  1062. package/src/router/match-result.ts +127 -52
  1063. package/src/router/metrics.ts +158 -47
  1064. package/src/router/middleware-types.ts +22 -120
  1065. package/src/router/middleware.ts +398 -231
  1066. package/src/router/navigation-snapshot.ts +133 -0
  1067. package/src/router/params-util.ts +23 -0
  1068. package/src/router/parse-pattern.ts +115 -0
  1069. package/src/router/pattern-matching.ts +183 -137
  1070. package/src/router/prefetch-cache-ttl.ts +51 -0
  1071. package/src/router/prefetch-limits.ts +37 -0
  1072. package/src/router/prerender-match.ts +207 -58
  1073. package/src/router/preview-match.ts +35 -103
  1074. package/src/router/request-classification.ts +291 -0
  1075. package/src/router/revalidation.ts +144 -74
  1076. package/src/router/route-snapshot.ts +256 -0
  1077. package/src/router/router-context.ts +11 -29
  1078. package/src/router/router-interfaces.ts +160 -36
  1079. package/src/router/router-options.ts +214 -22
  1080. package/src/router/router-registry.ts +2 -5
  1081. package/src/router/segment-resolution/fresh.ts +301 -78
  1082. package/src/router/segment-resolution/helpers.ts +116 -31
  1083. package/src/router/segment-resolution/loader-cache.ts +140 -39
  1084. package/src/router/segment-resolution/loader-mask.ts +67 -0
  1085. package/src/router/segment-resolution/loader-snapshot.ts +251 -0
  1086. package/src/router/segment-resolution/revalidation.ts +478 -388
  1087. package/src/router/segment-resolution/static-store.ts +19 -5
  1088. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  1089. package/src/router/segment-resolution/view-transition-default.ts +56 -0
  1090. package/src/router/segment-resolution.ts +5 -1
  1091. package/src/router/segment-wrappers.ts +8 -5
  1092. package/src/router/state-cookie-name.ts +33 -0
  1093. package/src/router/substitute-pattern-params.ts +75 -0
  1094. package/src/router/telemetry-otel.ts +160 -200
  1095. package/src/router/telemetry.ts +105 -20
  1096. package/src/router/timeout.ts +0 -20
  1097. package/src/router/tracing.ts +215 -0
  1098. package/src/router/trie-matching.ts +188 -58
  1099. package/src/router/types.ts +10 -63
  1100. package/src/router/url-params.ts +57 -0
  1101. package/src/router.ts +222 -67
  1102. package/src/rsc/full-payload.ts +70 -0
  1103. package/src/rsc/handler-context.ts +3 -2
  1104. package/src/rsc/handler.ts +726 -457
  1105. package/src/rsc/helpers.ts +168 -46
  1106. package/src/rsc/index.ts +2 -5
  1107. package/src/rsc/json-route-result.ts +38 -0
  1108. package/src/rsc/loader-fetch.ts +127 -31
  1109. package/src/rsc/manifest-init.ts +33 -42
  1110. package/src/rsc/nonce.ts +10 -1
  1111. package/src/rsc/origin-guard.ts +39 -25
  1112. package/src/rsc/progressive-enhancement.ts +159 -23
  1113. package/src/rsc/redirect-guard.ts +100 -0
  1114. package/src/rsc/response-cache-serve.ts +238 -0
  1115. package/src/rsc/response-error.ts +79 -12
  1116. package/src/rsc/response-route-handler.ts +99 -189
  1117. package/src/rsc/rsc-rendering.ts +479 -104
  1118. package/src/rsc/runtime-warnings.ts +23 -10
  1119. package/src/rsc/server-action.ts +293 -115
  1120. package/src/rsc/shell-capture.ts +1158 -0
  1121. package/src/rsc/shell-serve.ts +150 -0
  1122. package/src/rsc/ssr-setup.ts +144 -0
  1123. package/src/rsc/transition-gate.ts +89 -0
  1124. package/src/rsc/types.ts +64 -6
  1125. package/src/runtime-env.ts +18 -0
  1126. package/src/search-params.ts +49 -41
  1127. package/src/segment-content-promise.ts +67 -0
  1128. package/src/segment-loader-promise.ts +167 -0
  1129. package/src/segment-system.tsx +418 -131
  1130. package/src/serialize.ts +243 -0
  1131. package/src/server/context.ts +367 -61
  1132. package/src/server/cookie-parse.ts +32 -0
  1133. package/src/server/cookie-store.ts +152 -5
  1134. package/src/server/handle-store.ts +40 -38
  1135. package/src/server/loader-registry.ts +38 -46
  1136. package/src/server/request-context.ts +576 -176
  1137. package/src/ssr/index.tsx +467 -174
  1138. package/src/ssr/inject-rsc-eager.ts +167 -0
  1139. package/src/ssr/ssr-root.tsx +228 -0
  1140. package/src/static-handler.ts +27 -18
  1141. package/src/testing/cache-status.ts +162 -0
  1142. package/src/testing/collect-handle.ts +46 -0
  1143. package/src/testing/dispatch.ts +813 -0
  1144. package/src/testing/dom.entry.ts +22 -0
  1145. package/src/testing/e2e/fixture.ts +188 -0
  1146. package/src/testing/e2e/index.ts +128 -0
  1147. package/src/testing/e2e/matchers.ts +35 -0
  1148. package/src/testing/e2e/page-helpers.ts +272 -0
  1149. package/src/testing/e2e/parity.ts +387 -0
  1150. package/src/testing/e2e/server.ts +195 -0
  1151. package/src/testing/flight-matchers.ts +97 -0
  1152. package/src/testing/flight-normalize.ts +11 -0
  1153. package/src/testing/flight-runtime.d.ts +57 -0
  1154. package/src/testing/flight-tree.ts +682 -0
  1155. package/src/testing/flight.entry.ts +52 -0
  1156. package/src/testing/flight.ts +257 -0
  1157. package/src/testing/generated-routes.ts +199 -0
  1158. package/src/testing/index.ts +105 -0
  1159. package/src/testing/internal/context.ts +371 -0
  1160. package/src/testing/internal/flight-client-globals.ts +30 -0
  1161. package/src/testing/internal/seed-vars.ts +54 -0
  1162. package/src/testing/render-handler.ts +357 -0
  1163. package/src/testing/render-route.tsx +584 -0
  1164. package/src/testing/run-loader.ts +385 -0
  1165. package/src/testing/run-middleware.ts +205 -0
  1166. package/src/testing/run-transition-when.ts +164 -0
  1167. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  1168. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  1169. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  1170. package/src/testing/vitest-stubs/version.ts +5 -0
  1171. package/src/testing/vitest.ts +305 -0
  1172. package/src/theme/ThemeProvider.tsx +56 -84
  1173. package/src/theme/ThemeScript.tsx +7 -9
  1174. package/src/theme/constants.ts +52 -13
  1175. package/src/theme/index.ts +0 -7
  1176. package/src/theme/theme-context.ts +1 -5
  1177. package/src/theme/theme-script.ts +22 -21
  1178. package/src/theme/use-theme.ts +0 -3
  1179. package/src/types/boundaries.ts +0 -35
  1180. package/src/types/cache-types.ts +17 -8
  1181. package/src/types/error-types.ts +30 -90
  1182. package/src/types/global-namespace.ts +54 -41
  1183. package/src/types/handler-context.ts +237 -89
  1184. package/src/types/index.ts +3 -10
  1185. package/src/types/loader-types.ts +44 -15
  1186. package/src/types/request-scope.ts +112 -0
  1187. package/src/types/route-config.ts +23 -46
  1188. package/src/types/route-entry.ts +19 -7
  1189. package/src/types/segments.ts +137 -19
  1190. package/src/urls/include-helper.ts +40 -75
  1191. package/src/urls/include-provider.ts +71 -0
  1192. package/src/urls/index.ts +2 -11
  1193. package/src/urls/path-helper-types.ts +102 -23
  1194. package/src/urls/path-helper.ts +62 -111
  1195. package/src/urls/pattern-types.ts +84 -19
  1196. package/src/urls/response-types.ts +25 -22
  1197. package/src/urls/type-extraction.ts +98 -154
  1198. package/src/urls/urls-function.ts +1 -19
  1199. package/src/use-loader.tsx +346 -89
  1200. package/src/vercel/index.ts +11 -0
  1201. package/src/vercel/tracing.ts +88 -0
  1202. package/src/vite/debug.ts +185 -0
  1203. package/src/vite/discovery/bundle-postprocess.ts +36 -38
  1204. package/src/vite/discovery/dev-prerender-cache.ts +117 -0
  1205. package/src/vite/discovery/discover-routers.ts +130 -85
  1206. package/src/vite/discovery/discovery-errors.ts +255 -0
  1207. package/src/vite/discovery/gate-state.ts +171 -0
  1208. package/src/vite/discovery/prerender-collection.ts +214 -132
  1209. package/src/vite/discovery/route-types-writer.ts +40 -84
  1210. package/src/vite/discovery/self-gen-tracking.ts +27 -1
  1211. package/src/vite/discovery/state.ts +57 -6
  1212. package/src/vite/discovery/virtual-module-codegen.ts +14 -34
  1213. package/src/vite/index.ts +19 -3
  1214. package/src/vite/inject-client-debug.ts +88 -0
  1215. package/src/vite/plugin-types.ts +234 -62
  1216. package/src/vite/plugins/cjs-to-esm.ts +16 -19
  1217. package/src/vite/plugins/client-ref-dedup.ts +16 -11
  1218. package/src/vite/plugins/client-ref-hashing.ts +28 -15
  1219. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1220. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1221. package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
  1222. package/src/vite/plugins/expose-action-id.ts +49 -98
  1223. package/src/vite/plugins/expose-id-utils.ts +96 -51
  1224. package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
  1225. package/src/vite/plugins/expose-ids/handler-transform.ts +15 -64
  1226. package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
  1227. package/src/vite/plugins/expose-ids/router-transform.ts +118 -29
  1228. package/src/vite/plugins/expose-internal-ids.ts +553 -317
  1229. package/src/vite/plugins/performance-tracks.ts +89 -0
  1230. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1231. package/src/vite/plugins/use-cache-transform.ts +73 -83
  1232. package/src/vite/plugins/vercel-output.ts +384 -0
  1233. package/src/vite/plugins/version-injector.ts +40 -29
  1234. package/src/vite/plugins/version-plugin.ts +46 -37
  1235. package/src/vite/plugins/virtual-entries.ts +138 -27
  1236. package/src/vite/rango.ts +353 -303
  1237. package/src/vite/router-discovery.ts +1090 -166
  1238. package/src/vite/utils/ast-handler-extract.ts +26 -35
  1239. package/src/vite/utils/banner.ts +4 -4
  1240. package/src/vite/utils/bundle-analysis.ts +10 -15
  1241. package/src/vite/utils/client-chunks.ts +184 -0
  1242. package/src/vite/utils/directive-prologue.ts +40 -0
  1243. package/src/vite/utils/forward-user-plugins.ts +171 -0
  1244. package/src/vite/utils/manifest-utils.ts +4 -59
  1245. package/src/vite/utils/package-resolution.ts +20 -52
  1246. package/src/vite/utils/prerender-utils.ts +98 -38
  1247. package/src/vite/utils/shared-utils.ts +144 -44
  1248. package/src/browser/action-response-classifier.ts +0 -99
  1249. package/src/browser/shallow.ts +0 -40
  1250. package/src/router/middleware-cookies.ts +0 -55
@@ -1,15 +1,10 @@
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
3
  import { contextGet, contextSet } from "../context-var.js";
4
+ import { escapeRegExp } from "../regex-escape.js";
5
+ import { parsePattern as parseRoutePattern } from "./pattern-matching.js";
6
+ import { safeDecodeURIComponent } from "./url-params.js";
7
+ import { fireAndForgetWaitUntil } from "../types/request-scope.js";
13
8
  import type {
14
9
  CollectedMiddleware,
15
10
  MiddlewareCollectableEntry,
@@ -19,46 +14,79 @@ import type {
19
14
  ResponseHolder,
20
15
  } from "./middleware-types.js";
21
16
  import { _getRequestContext } from "../server/request-context.js";
17
+ import {
18
+ EXTERNAL_REDIRECT_MARKER,
19
+ isExternalRedirect,
20
+ markExternalRedirect,
21
+ } from "../redirect-origin.js";
22
22
  import { isAutoGeneratedRouteName } from "../route-name.js";
23
+ import { appendMetric, createMetricsStore } from "./metrics.js";
24
+ import { observePhase, PHASES } from "./instrument.js";
25
+ import { stripInternalParams } from "./handler-context.js";
26
+ import { isWebSocketUpgradeResponse } from "../response-utils.js";
23
27
 
24
- // Re-export types and cookie utilities for backward compatibility
28
+ // Re-export types consumed through this module's path.
25
29
  export type {
26
30
  CookieOptions,
27
- CollectedMiddleware,
28
- MiddlewareCollectableEntry,
29
31
  MiddlewareContext,
30
32
  MiddlewareEntry,
31
33
  MiddlewareFn,
32
- ResponseHolder,
33
34
  } from "./middleware-types.js";
34
- export { parseCookies, serializeCookie } from "./middleware-cookies.js";
35
-
36
- // W5: Deduplicate by function reference so each distinct middleware warns once,
37
- // regardless of whether it is named or anonymous.
38
- let warnedRedirectMiddleware = new WeakSet<Function>();
39
-
40
- function warnCtxSetBeforeRedirect(handler: Function): void {
41
- if (warnedRedirectMiddleware.has(handler)) return;
42
- warnedRedirectMiddleware.add(handler);
43
- const label = handler.name || "(anonymous)";
44
- console.warn(
45
- `[rango] Route middleware "${label}" called ctx.set() then returned a ` +
46
- `redirect. Context variables are per-request and won't be available ` +
47
- `on the redirect target. Use cookies to persist state across ` +
48
- `redirects, or move ctx.set() to the target route's middleware.`,
49
- );
50
- }
51
35
 
52
- /** Reset W5 deduplication state (for tests only). */
53
- export function _resetW5Warnings(): void {
54
- warnedRedirectMiddleware = new WeakSet();
36
+ const MIDDLEWARE_METRIC_DEPTH = 1;
37
+ const POST_METRIC_MIN_DURATION_MS = 0.01;
38
+
39
+ function getMiddlewareMetricLabel<TEnv>(
40
+ entry: MiddlewareEntry<TEnv>,
41
+ ordinal: number,
42
+ ): string {
43
+ const handlerName = entry.handler.name?.trim();
44
+ const scope = entry.pattern ?? "*";
45
+
46
+ if (handlerName) {
47
+ return `middleware:${handlerName}@${scope}`;
48
+ }
49
+
50
+ return `middleware:${scope}#${ordinal + 1}`;
55
51
  }
56
52
 
57
53
  /**
58
- * Parse a route pattern into regex and param names
59
- * Supports: *, /path, /path/*, /path/:param, /path/:param/*
54
+ * Compile a middleware scope pattern to a regex + param names.
55
+ *
56
+ * Middleware scopes reuse the route pattern parser (`parsePattern` from
57
+ * pattern-matching.ts), so they support the same param forms as routes —
58
+ * optional (`:x?`), constrained (`:x(en|gb)`), and suffix (`:x.html`) — in
59
+ * addition to the trailing-`*` wildcard middleware relies on. Before this
60
+ * unification the middleware-side parser handled only static, bare `:param`,
61
+ * and trailing `*`, so e.g. `router.use("/:locale(en|gb)/*", mw)` silently
62
+ * named the param "locale(en|gb)" and never enforced the constraint.
63
+ *
64
+ * Middleware matching semantics deliberately differ from route matching, so we
65
+ * emit the regex here rather than route through `compilePattern`:
66
+ * - `*` alone matches every path (`/^.*$/`).
67
+ * - A trailing `*` segment is an OPTIONAL subtree match (`(?:/.*)?`): `/admin/*`
68
+ * matches `/admin`, `/admin/`, and `/admin/users`. It contributes no param
69
+ * name (unlike route wildcards, which capture `*`).
70
+ * - A NON-trailing `*` is also OPTIONAL (`(?:/.*)?`), matching zero-or-more
71
+ * intermediate segments: `/a/<star>/b` matches both `/a/b` and `/a/x/b`. This
72
+ * mirrors the pre-unification parser, which compiled every `*` part as
73
+ * optional regardless of position.
74
+ * - A pattern without a trailing `*` tolerates a trailing slash (`/?$`).
75
+ * - Constraints are baked into the regex as an alternation so `matchMiddleware`
76
+ * (a bare `regex.test`) enforces them without extra validation. Constraint
77
+ * values are matched against the raw (still URL-encoded) path segment, which
78
+ * matches the pre-unification middleware behavior (it never decoded for
79
+ * matching); the constraint string is regex-escaped so values like `en.gb`
80
+ * are treated literally.
81
+ *
82
+ * The route segment parser only recognizes `/`-prefixed segments, but the
83
+ * pre-unification middleware parser split on `/` and dropped empty parts, so a
84
+ * leading slash was irrelevant: `use("admin/*")` and `use("/admin/*")` scoped
85
+ * identically. Normalize a non-`*` pattern to have a leading slash before
86
+ * parsing so that behavior is preserved (without it, `parseRoutePattern("admin/*")`
87
+ * drops the static `admin` and the scope explodes to every path).
60
88
  */
61
- export function parsePattern(pattern: string): {
89
+ export function compileMiddlewarePattern(pattern: string): {
62
90
  regex: RegExp;
63
91
  paramNames: string[];
64
92
  } {
@@ -66,47 +94,63 @@ export function parsePattern(pattern: string): {
66
94
  return { regex: /^.*$/, paramNames: [] };
67
95
  }
68
96
 
97
+ const normalizedPattern = pattern.startsWith("/") ? pattern : `/${pattern}`;
98
+ const segments = parseRoutePattern(normalizedPattern);
69
99
  const paramNames: string[] = [];
70
100
  let regexStr = "^";
71
-
72
- const parts = pattern.split("/").filter(Boolean);
73
-
74
- for (let i = 0; i < parts.length; i++) {
75
- const part = parts[i];
76
-
77
- if (part === "*") {
78
- // Wildcard - match rest of path
79
- regexStr += "(?:/.*)?";
80
- } else if (part.startsWith(":")) {
81
- // Param
82
- const paramName = part.slice(1);
83
- paramNames.push(paramName);
84
- regexStr += "/([^/]+)";
101
+ let hasTrailingWildcard = false;
102
+
103
+ for (let i = 0; i < segments.length; i++) {
104
+ const segment = segments[i];
105
+
106
+ if (segment.type === "wildcard") {
107
+ if (segment.value === "*") {
108
+ // Bare `*`: optional subtree match, no capture (parity with the original
109
+ // middleware parser). A trailing `*` matches the subtree; a non-trailing
110
+ // `*` matches zero-or-more intermediate segments, so `/a/<star>/b` still
111
+ // matches `/a/b`.
112
+ regexStr += "(?:/.*)?";
113
+ } else {
114
+ // Named catch-all `:name+` / `:name*`: capture the remainder under the
115
+ // name so a scoping middleware sees `ctx.params.<name>`, and respect the
116
+ // one-or-more arity (`+` must not match the bare prefix), mirroring the
117
+ // route matcher instead of collapsing to the bare-`*` subtree.
118
+ paramNames.push(segment.value);
119
+ regexStr += segment.oneOrMore ? "/(.+)" : "(?:/(.*))?";
120
+ }
121
+ if (i === segments.length - 1) {
122
+ hasTrailingWildcard = true;
123
+ }
124
+ } else if (segment.type === "param") {
125
+ paramNames.push(segment.value);
126
+ const suffixPattern = segment.suffix ? escapeRegExp(segment.suffix) : "";
127
+ const valuePattern = segment.constraint
128
+ ? `(${segment.constraint.map(escapeRegExp).join("|")})`
129
+ : "([^/]+)";
130
+ if (segment.optional) {
131
+ regexStr += `(?:/${valuePattern}${suffixPattern})?`;
132
+ } else {
133
+ regexStr += `/${valuePattern}${suffixPattern}`;
134
+ }
85
135
  } else {
86
- // Literal
87
- regexStr += "/" + escapeRegex(part);
136
+ // Static literal
137
+ regexStr += "/" + escapeRegExp(segment.value);
88
138
  }
89
139
  }
90
140
 
91
- // If pattern doesn't end with *, match exact or with trailing segments
92
- if (!pattern.endsWith("*")) {
93
- regexStr += "/?$";
94
- } else {
95
- regexStr += "$";
96
- }
141
+ // Without a trailing `*`, match exactly with an optional trailing slash.
142
+ regexStr += hasTrailingWildcard ? "$" : "/?$";
97
143
 
98
144
  return { regex: new RegExp(regexStr), paramNames };
99
145
  }
100
146
 
101
147
  /**
102
- * Escape special regex characters
103
- */
104
- function escapeRegex(str: string): string {
105
- return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
106
- }
107
-
108
- /**
109
- * Extract params from a pathname using a pattern's regex and param names
148
+ * Extract params from a pathname using a pattern's regex and param names.
149
+ *
150
+ * Values are URL-decoded so apps see the raw string (e.g. "ivo@example.com")
151
+ * instead of the percent-encoded form ("ivo%40example.com"). This matches the
152
+ * contract assumed by ctx.reverse (which re-encodes) and aligns with
153
+ * Express/React Router/Fastify/Koa.
110
154
  */
111
155
  export function extractParams(
112
156
  pathname: string,
@@ -118,7 +162,7 @@ export function extractParams(
118
162
 
119
163
  const params: Record<string, string> = {};
120
164
  for (let i = 0; i < paramNames.length; i++) {
121
- params[paramNames[i]] = match[i + 1] || "";
165
+ params[paramNames[i]] = safeDecodeURIComponent(match[i + 1] || "");
122
166
  }
123
167
  return params;
124
168
  }
@@ -142,7 +186,15 @@ export function createMiddlewareContext<TEnv>(
142
186
  search?: Record<string, unknown>,
143
187
  ) => string,
144
188
  ): MiddlewareContext<TEnv> {
145
- const url = new URL(request.url);
189
+ // Reuse the request context's clean URL when available. Each middleware still
190
+ // gets its OWN URL clone (a middleware may mutate ctx.url / ctx.searchParams),
191
+ // but cloning the already-clean URL is cheaper than re-parsing + re-stripping
192
+ // request.url per middleware. Fall back to parsing when no ALS context.
193
+ const reqCtx = _getRequestContext();
194
+ const ctxUrl = reqCtx?.url;
195
+ const url = ctxUrl
196
+ ? new URL(ctxUrl)
197
+ : stripInternalParams(new URL(request.url));
146
198
 
147
199
  // Track the initial response to detect pre/post-next() phase.
148
200
  // Before next(): responseHolder.response === initialResponse (the stub).
@@ -158,13 +210,36 @@ export function createMiddlewareContext<TEnv>(
158
210
  // Cookie operations are handled by the standalone cookies() function which
159
211
  // delegates to the shared RequestContext internally.
160
212
  // The runtime implementation - types are enforced at call sites via MiddlewareContext<TEnv>
213
+ // Internal helper: resolve the current response (stub before next(), real after).
214
+ // Not exposed on the public MiddlewareContext type — use ctx.headers instead.
215
+ const getResponse = (): Response => {
216
+ if (isPreNext()) {
217
+ const reqCtx = _getRequestContext();
218
+ if (reqCtx) return reqCtx.res;
219
+ }
220
+ if (!responseHolder.response) {
221
+ throw new Error(
222
+ "Response is not available - responseHolder was not initialized",
223
+ );
224
+ }
225
+ return responseHolder.response;
226
+ };
227
+
228
+ // reqCtx captured once above: the request-scoped platform fields
229
+ // (originalUrl, executionContext, waitUntil) are immutable per request,
230
+ // so snapshotting beats re-reading ALS on every access. The lazy getters
231
+ // below (routeName, theme, setTheme) stay lazy because those can change
232
+ // during `await next()`.
161
233
  return {
162
234
  request,
163
235
  url,
236
+ originalUrl: reqCtx?.originalUrl ?? new URL(request.url),
164
237
  pathname: url.pathname,
165
238
  searchParams: url.searchParams,
166
239
  env: env as MiddlewareContext<TEnv>["env"],
167
240
  params,
241
+ executionContext: reqCtx?.executionContext,
242
+ waitUntil: reqCtx ? reqCtx.waitUntil.bind(reqCtx) : fireAndForgetWaitUntil,
168
243
  // Getter: re-derives from request context on each access so that global
169
244
  // middleware sees the matched route name after await next().
170
245
  get routeName(): MiddlewareContext<TEnv>["routeName"] {
@@ -175,33 +250,16 @@ export function createMiddlewareContext<TEnv>(
175
250
  ) as MiddlewareContext<TEnv>["routeName"];
176
251
  },
177
252
 
178
- get res(): Response {
179
- // Before next(): return shared RequestContext stub so headers
180
- // set via ctx.header() are visible on ctx.res.
181
- if (isPreNext()) {
182
- const reqCtx = _getRequestContext();
183
- if (reqCtx) return reqCtx.res;
184
- }
185
- if (!responseHolder.response) {
186
- throw new Error(
187
- "ctx.res is not available - responseHolder was not initialized",
188
- );
189
- }
190
- return responseHolder.response;
191
- },
192
- set res(_: Response) {
193
- throw new Error(
194
- "ctx.res is read-only. Use ctx.header() to set response headers, or cookies() for cookie mutations.",
195
- );
253
+ get headers(): Headers {
254
+ return getResponse().headers;
196
255
  },
197
256
 
198
257
  get: ((keyOrVar: any) =>
199
258
  contextGet(variables, keyOrVar)) as MiddlewareContext<TEnv>["get"],
200
259
 
201
- set: ((keyOrVar: any, value: unknown) => {
202
- contextSet(variables, keyOrVar, value);
260
+ set: ((keyOrVar: any, value: unknown, options?: any) => {
261
+ contextSet(variables, keyOrVar, value, options);
203
262
  }) as MiddlewareContext<TEnv>["set"],
204
-
205
263
  header(name: string, value: string): void {
206
264
  // Before next(): delegate to shared RequestContext stub
207
265
  if (isPreNext()) {
@@ -220,11 +278,33 @@ export function createMiddlewareContext<TEnv>(
220
278
  responseHolder.response.headers.set(name, value);
221
279
  },
222
280
 
281
+ get theme(): MiddlewareContext<TEnv>["theme"] {
282
+ return _getRequestContext()?.theme;
283
+ },
284
+
285
+ get setTheme(): MiddlewareContext<TEnv>["setTheme"] {
286
+ return _getRequestContext()?.setTheme;
287
+ },
288
+
289
+ setLocationState(entries) {
290
+ const reqCtx = _getRequestContext();
291
+ if (!reqCtx) {
292
+ throw new Error(
293
+ "setLocationState() is not available outside a request context",
294
+ );
295
+ }
296
+ reqCtx.setLocationState(entries);
297
+ },
298
+
223
299
  reverse:
224
300
  reverse ??
225
- ((name: string) => {
301
+ ((
302
+ name: string,
303
+ _params?: Record<string, string>,
304
+ _search?: Record<string, unknown>,
305
+ ) => {
226
306
  throw new Error(
227
- `ctx.reverse() is not available - route map was not provided to middleware context`,
307
+ `ctx.reverse(${JSON.stringify(name)}) is not available: no route map is bound to this middleware context.`,
228
308
  );
229
309
  }),
230
310
 
@@ -232,6 +312,10 @@ export function createMiddlewareContext<TEnv>(
232
312
  const reqCtx = _getRequestContext();
233
313
  if (reqCtx) {
234
314
  reqCtx._debugPerformance = true;
315
+ // Anchor to the true request entry (reqCtx._handlerStart) so phases that
316
+ // began before this opt-in report non-negative offsets; undefined falls
317
+ // back to performance.now() in createMetricsStore.
318
+ reqCtx._metricsStore ??= createMetricsStore(true, reqCtx._handlerStart);
235
319
  }
236
320
  },
237
321
  };
@@ -257,9 +341,16 @@ export function matchMiddleware<TEnv>(
257
341
  continue;
258
342
  }
259
343
 
260
- // Check if pathname matches
261
- if (entry.regex.test(pathname)) {
262
- const params = extractParams(pathname, entry.regex, entry.paramNames);
344
+ // Run the scope regex ONCE per entry. The old code ran test() then, on a
345
+ // hit, extractParams' match() — a second full pass over the same string for
346
+ // every matching entry on the per-request hot path. The regexes carry no
347
+ // `g` flag, so there is no lastIndex statefulness across this single match.
348
+ const m = pathname.match(entry.regex);
349
+ if (m) {
350
+ const params: Record<string, string> = {};
351
+ for (let i = 0; i < entry.paramNames.length; i++) {
352
+ params[entry.paramNames[i]] = safeDecodeURIComponent(m[i + 1] || "");
353
+ }
263
354
  matches.push({ entry, params });
264
355
  }
265
356
  }
@@ -267,15 +358,97 @@ export function matchMiddleware<TEnv>(
267
358
  return matches;
268
359
  }
269
360
 
361
+ // Set-Cookie is appended; for other headers stubOverridesNonCookie=true
362
+ // overwrites (chain ran to completion), false fills only missing slots (an
363
+ // explicit short-circuit Response's own headers win).
364
+ function mergeStubHeaders(
365
+ target: Headers,
366
+ stub: Headers,
367
+ stubOverridesNonCookie: boolean,
368
+ ): void {
369
+ stub.forEach((value, name) => {
370
+ // The reserved external-redirect marker is internal and never a trust
371
+ // signal; never copy a stub value (e.g. a stray ctx.header() call) onto a
372
+ // browser-facing response. The opt-in is the out-of-band brand.
373
+ if (name.toLowerCase() === EXTERNAL_REDIRECT_MARKER) return;
374
+ if (name.toLowerCase() === "set-cookie") {
375
+ target.append(name, value);
376
+ } else if (stubOverridesNonCookie || !target.has(name)) {
377
+ target.set(name, value);
378
+ }
379
+ });
380
+ }
381
+
382
+ // Set-Cookie is deduped so a nested inner executeMiddleware that already merged
383
+ // the same reqCtx cookies does not duplicate them; other headers fill if missing.
384
+ function mergeReqCtxStub(
385
+ target: Headers,
386
+ reqCtx: ReturnType<typeof _getRequestContext>,
387
+ ): void {
388
+ if (!reqCtx) return;
389
+ const stubCookies = reqCtx.res.headers.getSetCookie();
390
+ if (stubCookies.length > 0) {
391
+ const existing = new Set(target.getSetCookie());
392
+ for (const cookie of stubCookies) {
393
+ if (!existing.has(cookie)) {
394
+ target.append("set-cookie", cookie);
395
+ }
396
+ }
397
+ }
398
+ reqCtx.res.headers.forEach((value, name) => {
399
+ // Never propagate the reserved external-redirect marker (see mergeStubHeaders).
400
+ if (name.toLowerCase() === EXTERNAL_REDIRECT_MARKER) return;
401
+ if (name !== "set-cookie" && !target.has(name)) {
402
+ target.set(name, value);
403
+ }
404
+ });
405
+ }
406
+
407
+ // Clone `base` with stub headers merged into a fresh Headers (the clone keeps
408
+ // the body mutable for post-next() modifications). Set-Cookie is always
409
+ // appended; other headers obey stubOverridesNonCookie (see mergeStubHeaders).
410
+ // mergeReqCtx folds in RequestContext stub cookies/headers; the intercept
411
+ // short-circuit path passes false (its reqCtx headers are not merged here),
412
+ // which is the one deliberate divergence between the call sites.
413
+ function mergeResponse(
414
+ base: Response,
415
+ stub: Headers,
416
+ opts: { stubOverridesNonCookie: boolean; mergeReqCtx: boolean },
417
+ ): Response {
418
+ const mergedHeaders = new Headers(base.headers);
419
+ // The reserved external-redirect marker is never a trust signal and must never
420
+ // reach the browser. The guard strips it on 3xx redirects; strip it here too so
421
+ // a forged value cannot ride a non-3xx middleware response (which the 3xx-only
422
+ // guard would not touch) to the client. The opt-in is the out-of-band brand.
423
+ mergedHeaders.delete(EXTERNAL_REDIRECT_MARKER);
424
+ mergeStubHeaders(mergedHeaders, stub, opts.stubOverridesNonCookie);
425
+ if (opts.mergeReqCtx) {
426
+ mergeReqCtxStub(mergedHeaders, _getRequestContext());
427
+ }
428
+ const merged = new Response(base.body, {
429
+ status: base.status,
430
+ statusText: base.statusText,
431
+ headers: mergedHeaders,
432
+ });
433
+ // Transfer the out-of-band external-redirect brand across this rebuild: a
434
+ // middleware short-circuit `return redirect(url, { external: true })` reaches
435
+ // the open-redirect guard only after this merge, and the brand lives on the
436
+ // Response object, not in its headers.
437
+ if (isExternalRedirect(base)) {
438
+ markExternalRedirect(merged);
439
+ }
440
+ return merged;
441
+ }
442
+
270
443
  /**
271
444
  * Execute middleware chain
272
445
  *
273
446
  * Features:
274
447
  * - `await next()` returns actual Response
275
- * - `ctx.res` available after `await next()` (like Hono's `c.res`)
276
- * - `ctx.header()` shorthand for setting headers
277
- * - Forgiving: if middleware doesn't return, uses `ctx.res`
278
- * - Short-circuit: return Response to stop chain
448
+ * - `ctx.headers` available before and after `await next()`
449
+ * - `ctx.header()` shorthand for setting a single header
450
+ * - Forgiving: if middleware doesn't return, uses the downstream response
451
+ * - Short-circuit: return OR throw a Response to stop chain
279
452
  * - Error catching: try/catch around `next()` works
280
453
  */
281
454
  export async function executeMiddleware<TEnv>(
@@ -305,47 +478,22 @@ export async function executeMiddleware<TEnv>(
305
478
  // End of chain - call actual RSC handler
306
479
  const response = await finalHandler();
307
480
 
308
- // Merge headers set on stub into the real response.
309
- // Use append for Set-Cookie to preserve multiple cookies.
310
- const mergedHeaders = new Headers(response.headers);
311
- stubResponse.headers.forEach((value, name) => {
312
- if (name.toLowerCase() === "set-cookie") {
313
- mergedHeaders.append(name, value);
314
- } else {
315
- mergedHeaders.set(name, value);
316
- }
317
- });
318
- // Also merge shared RequestContext stub (cookies written via cookies().set()).
319
- // Dedup Set-Cookie: an inner executeMiddleware (route-level middleware)
320
- // may have already merged the same reqCtx cookies into the response.
321
- const reqCtx = _getRequestContext();
322
- if (reqCtx) {
323
- const stubCookies = reqCtx.res.headers.getSetCookie();
324
- if (stubCookies.length > 0) {
325
- const existing = new Set(mergedHeaders.getSetCookie());
326
- for (const cookie of stubCookies) {
327
- if (!existing.has(cookie)) {
328
- mergedHeaders.append("set-cookie", cookie);
329
- }
330
- }
331
- }
332
- reqCtx.res.headers.forEach((value, name) => {
333
- if (name !== "set-cookie" && !mergedHeaders.has(name)) {
334
- mergedHeaders.set(name, value);
335
- }
336
- });
481
+ if (isWebSocketUpgradeResponse(response)) {
482
+ responseHolder.response = response;
483
+ return response;
337
484
  }
338
485
 
339
- // Clone response with merged headers (mutable for post-next() modifications)
340
- responseHolder.response = new Response(response.body, {
341
- status: response.status,
342
- statusText: response.statusText,
343
- headers: mergedHeaders,
486
+ // Chain ran to completion: stub headers overwrite (stubOverridesNonCookie)
487
+ // and reqCtx stub headers are merged in.
488
+ responseHolder.response = mergeResponse(response, stubResponse.headers, {
489
+ stubOverridesNonCookie: true,
490
+ mergeReqCtx: true,
344
491
  });
345
492
 
346
493
  return responseHolder.response;
347
494
  }
348
495
 
496
+ const middlewareOrdinal = index;
349
497
  const { entry, params } = middlewares[index++];
350
498
  const ctx = createMiddlewareContext(
351
499
  request,
@@ -355,80 +503,108 @@ export async function executeMiddleware<TEnv>(
355
503
  responseHolder,
356
504
  reverse,
357
505
  );
506
+ const metricStart = performance.now();
507
+ const metricLabel = getMiddlewareMetricLabel(entry, middlewareOrdinal);
508
+ let middlewareFinished = false;
509
+ const finishMiddleware = () => {
510
+ if (!middlewareFinished) {
511
+ middlewareFinished = true;
512
+ appendMetric(
513
+ _getRequestContext()?._metricsStore,
514
+ `${metricLabel}:pre`,
515
+ metricStart,
516
+ performance.now() - metricStart,
517
+ MIDDLEWARE_METRIC_DEPTH,
518
+ );
519
+ }
520
+ };
358
521
 
359
522
  // Track if next() was called and capture its Promise.
360
523
  // Guard against double-calling: a second call would re-enter the
361
524
  // downstream chain and overwrite responseHolder.response.
362
525
  let nextPromise: Promise<Response> | null = null;
526
+ let nextResolvedAt: number | undefined;
363
527
  const wrappedNext = (): Promise<Response> => {
364
528
  if (nextPromise) {
365
529
  throw new Error(
366
530
  `[@rangojs/router] Middleware called next() more than once.`,
367
531
  );
368
532
  }
369
- nextPromise = next();
533
+ finishMiddleware();
534
+ const downstream = next();
535
+ nextPromise = downstream.then(
536
+ (res) => {
537
+ nextResolvedAt = performance.now();
538
+ return res;
539
+ },
540
+ (err) => {
541
+ nextResolvedAt = performance.now();
542
+ throw err;
543
+ },
544
+ );
370
545
  return nextPromise;
371
546
  };
372
547
 
373
- // W5: track whether ctx.set() is called during this middleware
374
- let ctxSetCalled = false;
375
- if (process.env.NODE_ENV !== "production") {
376
- const originalSet = ctx.set;
377
- ctx.set = ((...args: any[]) => {
378
- ctxSetCalled = true;
379
- return (originalSet as Function).apply(ctx, args);
380
- }) as typeof ctx.set;
548
+ // Wrap the middleware (including its downstream next() chain) in its span
549
+ // via the unified phase API. metric:false — the middleware's perf metric is
550
+ // its exclusive pre/post own-time, recorded directly above and below, finer
551
+ // than a single wrap. Spans nest by async context, so this onions
552
+ // middleware-over-middleware and the core handler underneath. Pass-through
553
+ // when neither surface is active.
554
+ let result: Response | void;
555
+ try {
556
+ result = await observePhase(PHASES.middleware(metricLabel), async () => {
557
+ try {
558
+ return await entry.handler(ctx, wrappedNext);
559
+ } catch (error) {
560
+ // Thrown Response is short-circuit control flow, not an error —
561
+ // absorb it INSIDE the span so the tracing runner settles the
562
+ // rango.middleware span as success, not STATUS_ERROR (every auth
563
+ // redirect would otherwise inflate trace error rates). Returning it
564
+ // routes through the `if (result instanceof Response)` branch below,
565
+ // so stub headers and request-context cookies merge identically to an
566
+ // explicit `return new Response(...)`. Segment handlers already follow
567
+ // this convention (segment-resolution/helpers.ts keeps result handling
568
+ // outside the span). Real errors propagate past the span.
569
+ if (error instanceof Response) return error;
570
+ throw error;
571
+ }
572
+ });
573
+ } finally {
574
+ // Settle the middleware own-time metric once on both the success and
575
+ // error paths (idempotent guard in finishMiddleware).
576
+ finishMiddleware();
381
577
  }
382
578
 
383
- const result = await entry.handler(ctx, wrappedNext);
579
+ // Record post-next() processing time when middleware did work after
580
+ // the downstream chain resolved (e.g. adding headers, logging).
581
+ if (nextResolvedAt !== undefined) {
582
+ const postDur = performance.now() - nextResolvedAt;
583
+ if (postDur > POST_METRIC_MIN_DURATION_MS) {
584
+ appendMetric(
585
+ _getRequestContext()?._metricsStore,
586
+ `${metricLabel}:post`,
587
+ nextResolvedAt,
588
+ postDur,
589
+ MIDDLEWARE_METRIC_DEPTH,
590
+ );
591
+ }
592
+ }
384
593
 
385
594
  // Explicit return takes precedence (middleware short-circuit).
386
595
  // Merge stub headers (from ctx.header before this point) and
387
- // RequestContext stub headers (from ctx.setCookie) into the
596
+ // RequestContext stub headers (from cookies().set()) into the
388
597
  // returned Response so they are not lost.
389
598
  if (result instanceof Response) {
390
- // W5: warn if ctx.set() was called but middleware returned a redirect
391
- if (
392
- process.env.NODE_ENV !== "production" &&
393
- ctxSetCalled &&
394
- result.status >= 300 &&
395
- result.status < 400
396
- ) {
397
- warnCtxSetBeforeRedirect(entry.handler);
599
+ if (isWebSocketUpgradeResponse(result)) {
600
+ responseHolder.response = result;
601
+ return result;
398
602
  }
399
-
400
- const mergedHeaders = new Headers(result.headers);
401
- stubResponse.headers.forEach((value, name) => {
402
- if (name.toLowerCase() === "set-cookie") {
403
- mergedHeaders.append(name, value);
404
- } else if (!mergedHeaders.has(name)) {
405
- mergedHeaders.set(name, value);
406
- }
407
- });
408
- // Also merge shared RequestContext stub (cookies written via setCookie).
409
- // Dedup Set-Cookie: an inner executeMiddleware (route-level middleware)
410
- // may have already merged the same reqCtx cookies into the response.
411
- const reqCtx = _getRequestContext();
412
- if (reqCtx) {
413
- const stubCookies = reqCtx.res.headers.getSetCookie();
414
- if (stubCookies.length > 0) {
415
- const existing = new Set(mergedHeaders.getSetCookie());
416
- for (const cookie of stubCookies) {
417
- if (!existing.has(cookie)) {
418
- mergedHeaders.append("set-cookie", cookie);
419
- }
420
- }
421
- }
422
- reqCtx.res.headers.forEach((value, name) => {
423
- if (name !== "set-cookie" && !mergedHeaders.has(name)) {
424
- mergedHeaders.set(name, value);
425
- }
426
- });
427
- }
428
- const merged = new Response(result.body, {
429
- status: result.status,
430
- statusText: result.statusText,
431
- headers: mergedHeaders,
603
+ // Explicit short-circuit: the returned Response's own headers win
604
+ // (stubOverridesNonCookie=false); reqCtx stub headers still merge in.
605
+ const merged = mergeResponse(result, stubResponse.headers, {
606
+ stubOverridesNonCookie: false,
607
+ mergeReqCtx: true,
432
608
  });
433
609
  responseHolder.response = merged;
434
610
  return merged;
@@ -447,19 +623,6 @@ export async function executeMiddleware<TEnv>(
447
623
  // If middleware called next(), await it and return the response
448
624
  if (nextPromise) {
449
625
  await nextPromise;
450
-
451
- // W5: warn if ctx.set() was called but the downstream response is a redirect.
452
- // The ctx.set() values will be lost because the redirect navigates away.
453
- if (
454
- process.env.NODE_ENV !== "production" &&
455
- ctxSetCalled &&
456
- responseHolder.response &&
457
- responseHolder.response.status >= 300 &&
458
- responseHolder.response.status < 400
459
- ) {
460
- warnCtxSetBeforeRedirect(entry.handler);
461
- }
462
-
463
626
  return responseHolder.response!;
464
627
  }
465
628
 
@@ -486,23 +649,12 @@ export async function executeMiddleware<TEnv>(
486
649
  // last merge point (e.g. cookies().set() called after await next()).
487
650
  // The reqCtx stub may have already been partially merged during finalHandler
488
651
  // or early-return paths; only append *new* Set-Cookie entries to avoid dupes.
652
+ //
653
+ // Skip for upgrade responses: upgrade headers are semantically immutable and
654
+ // set-cookie on an upgrade is not meaningful.
489
655
  const reqCtx = _getRequestContext();
490
- if (reqCtx) {
491
- const stubCookies = reqCtx.res.headers.getSetCookie();
492
- if (stubCookies.length > 0) {
493
- const existingCookies = new Set(finalResponse.headers.getSetCookie());
494
- for (const cookie of stubCookies) {
495
- if (!existingCookies.has(cookie)) {
496
- finalResponse.headers.append("set-cookie", cookie);
497
- }
498
- }
499
- }
500
- // Fill in non-cookie headers that aren't already on the response
501
- reqCtx.res.headers.forEach((value, name) => {
502
- if (name !== "set-cookie" && !finalResponse.headers.has(name)) {
503
- finalResponse.headers.set(name, value);
504
- }
505
- });
656
+ if (reqCtx && !isWebSocketUpgradeResponse(finalResponse)) {
657
+ mergeReqCtxStub(finalResponse.headers, reqCtx);
506
658
  }
507
659
 
508
660
  return finalResponse;
@@ -513,7 +665,7 @@ export async function executeMiddleware<TEnv>(
513
665
  *
514
666
  * Intercepts use a shared stubResponse from the request context. This function:
515
667
  * - Runs middleware in sequence with a simple next() chain
516
- * - Returns Response if any middleware short-circuits (returns Response or redirects BEFORE next())
668
+ * - Returns Response if any middleware short-circuits (returns OR throws a Response, or redirects, BEFORE next())
517
669
  * - Returns null if all middleware calls next() - headers set after next() remain on stubResponse
518
670
  *
519
671
  * @param middlewares - Array of middleware functions
@@ -551,6 +703,7 @@ export async function executeInterceptMiddleware<TEnv>(
551
703
  return stubResponse;
552
704
  }
553
705
 
706
+ const ordinal = index;
554
707
  const middleware = middlewares[index++];
555
708
  const ctx = createMiddlewareContext(
556
709
  request,
@@ -572,7 +725,30 @@ export async function executeInterceptMiddleware<TEnv>(
572
725
  return next();
573
726
  };
574
727
 
575
- const result = await middleware(ctx, guardedNext);
728
+ // Span-wrap each intercept middleware as rango.middleware (metric:false —
729
+ // intercept runs inside the render phase already metered by render:total, so
730
+ // it contributes a span but no separate perf metric). Bare MiddlewareFns
731
+ // have no pattern, so the label is scoped to "*" like a pattern-less entry.
732
+ const label = getMiddlewareMetricLabel(
733
+ { handler: middleware, pattern: null } as MiddlewareEntry<TEnv>,
734
+ ordinal,
735
+ );
736
+
737
+ const result: Response | void = await observePhase(
738
+ PHASES.middleware(label),
739
+ async () => {
740
+ try {
741
+ return await middleware(ctx, guardedNext);
742
+ } catch (error) {
743
+ // Thrown Response is short-circuit control flow, parity with the
744
+ // explicit-return path below. Absorb it INSIDE the span so the tracing
745
+ // runner settles rango.middleware as success, not STATUS_ERROR (same
746
+ // reasoning as executeMiddleware's main chain). Real errors propagate.
747
+ if (error instanceof Response) return error;
748
+ throw error;
749
+ }
750
+ },
751
+ );
576
752
 
577
753
  if (result instanceof Response) {
578
754
  earlyResponse = result;
@@ -596,21 +772,13 @@ export async function executeInterceptMiddleware<TEnv>(
596
772
  });
597
773
 
598
774
  if (hasStubHeaders) {
599
- // Clone and merge headers from stub into early response.
600
- // Only fill in missing headers — the returned Response's explicit
601
- // headers take precedence, matching executeMiddleware behavior.
602
- const mergedHeaders = new Headers(response.headers);
603
- stubResponse.headers.forEach((value, name) => {
604
- if (name.toLowerCase() === "set-cookie") {
605
- mergedHeaders.append(name, value);
606
- } else if (!mergedHeaders.has(name)) {
607
- mergedHeaders.set(name, value);
608
- }
609
- });
610
- return new Response(response.body, {
611
- status: response.status,
612
- statusText: response.statusText,
613
- headers: mergedHeaders,
775
+ // Only fill in missing headers — the returned Response's explicit headers
776
+ // take precedence (stubOverridesNonCookie=false), matching executeMiddleware.
777
+ // mergeReqCtx=false: the intercept path deliberately does NOT merge reqCtx
778
+ // stub headers here (pinned by intercept-middleware-headers.test.ts).
779
+ return mergeResponse(response, stubResponse.headers, {
780
+ stubOverridesNonCookie: false,
781
+ mergeReqCtx: false,
614
782
  });
615
783
  }
616
784
  return response;
@@ -651,7 +819,6 @@ export async function executeLoaderMiddleware<TEnv>(
651
819
  regex: null,
652
820
  paramNames: [],
653
821
  handler,
654
- mountPrefix: null,
655
822
  } as MiddlewareEntry<TEnv>,
656
823
  params,
657
824
  }));