@rangojs/router 0.0.0-experimental.24 → 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 -51
  1063. package/src/router/metrics.ts +133 -58
  1064. package/src/router/middleware-types.ts +22 -120
  1065. package/src/router/middleware.ts +371 -252
  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 +217 -68
  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 +467 -122
  1118. package/src/rsc/runtime-warnings.ts +23 -10
  1119. package/src/rsc/server-action.ts +288 -129
  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 +571 -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,40 +14,29 @@ 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 } from "./metrics.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";
24
27
 
25
- // Re-export types and cookie utilities for backward compatibility
28
+ // Re-export types consumed through this module's path.
26
29
  export type {
27
30
  CookieOptions,
28
- CollectedMiddleware,
29
- MiddlewareCollectableEntry,
30
31
  MiddlewareContext,
31
32
  MiddlewareEntry,
32
33
  MiddlewareFn,
33
- ResponseHolder,
34
34
  } from "./middleware-types.js";
35
- export { parseCookies, serializeCookie } from "./middleware-cookies.js";
36
-
37
- // W5: Deduplicate by function reference so each distinct middleware warns once,
38
- // regardless of whether it is named or anonymous.
39
- let warnedRedirectMiddleware = new WeakSet<Function>();
40
-
41
- function warnCtxSetBeforeRedirect(handler: Function): void {
42
- if (warnedRedirectMiddleware.has(handler)) return;
43
- warnedRedirectMiddleware.add(handler);
44
- const label = handler.name || "(anonymous)";
45
- console.warn(
46
- `[rango] Route middleware "${label}" called ctx.set() then returned a ` +
47
- `redirect. Context variables are per-request and won't be available ` +
48
- `on the redirect target. Use cookies to persist state across ` +
49
- `redirects, or move ctx.set() to the target route's middleware.`,
50
- );
51
- }
52
35
 
53
36
  const MIDDLEWARE_METRIC_DEPTH = 1;
37
+ const POST_METRIC_MIN_DURATION_MS = 0.01;
54
38
 
55
- function getMiddlewareMetricBase<TEnv>(
39
+ function getMiddlewareMetricLabel<TEnv>(
56
40
  entry: MiddlewareEntry<TEnv>,
57
41
  ordinal: number,
58
42
  ): string {
@@ -60,29 +44,49 @@ function getMiddlewareMetricBase<TEnv>(
60
44
  const scope = entry.pattern ?? "*";
61
45
 
62
46
  if (handlerName) {
63
- return `${handlerName}@${scope}`;
47
+ return `middleware:${handlerName}@${scope}`;
64
48
  }
65
49
 
66
- return `${scope}#${ordinal + 1}`;
67
- }
68
-
69
- function getMiddlewareMetricLabel<TEnv>(
70
- entry: MiddlewareEntry<TEnv>,
71
- ordinal: number,
72
- ): string {
73
- return `middleware:${getMiddlewareMetricBase(entry, ordinal)}`;
74
- }
75
-
76
- /** Reset W5 deduplication state (for tests only). */
77
- export function _resetW5Warnings(): void {
78
- warnedRedirectMiddleware = new WeakSet();
50
+ return `middleware:${scope}#${ordinal + 1}`;
79
51
  }
80
52
 
81
53
  /**
82
- * Parse a route pattern into regex and param names
83
- * 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).
84
88
  */
85
- export function parsePattern(pattern: string): {
89
+ export function compileMiddlewarePattern(pattern: string): {
86
90
  regex: RegExp;
87
91
  paramNames: string[];
88
92
  } {
@@ -90,47 +94,63 @@ export function parsePattern(pattern: string): {
90
94
  return { regex: /^.*$/, paramNames: [] };
91
95
  }
92
96
 
97
+ const normalizedPattern = pattern.startsWith("/") ? pattern : `/${pattern}`;
98
+ const segments = parseRoutePattern(normalizedPattern);
93
99
  const paramNames: string[] = [];
94
100
  let regexStr = "^";
95
-
96
- const parts = pattern.split("/").filter(Boolean);
97
-
98
- for (let i = 0; i < parts.length; i++) {
99
- const part = parts[i];
100
-
101
- if (part === "*") {
102
- // Wildcard - match rest of path
103
- regexStr += "(?:/.*)?";
104
- } else if (part.startsWith(":")) {
105
- // Param
106
- const paramName = part.slice(1);
107
- paramNames.push(paramName);
108
- 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
+ }
109
135
  } else {
110
- // Literal
111
- regexStr += "/" + escapeRegex(part);
136
+ // Static literal
137
+ regexStr += "/" + escapeRegExp(segment.value);
112
138
  }
113
139
  }
114
140
 
115
- // If pattern doesn't end with *, match exact or with trailing segments
116
- if (!pattern.endsWith("*")) {
117
- regexStr += "/?$";
118
- } else {
119
- regexStr += "$";
120
- }
141
+ // Without a trailing `*`, match exactly with an optional trailing slash.
142
+ regexStr += hasTrailingWildcard ? "$" : "/?$";
121
143
 
122
144
  return { regex: new RegExp(regexStr), paramNames };
123
145
  }
124
146
 
125
147
  /**
126
- * Escape special regex characters
127
- */
128
- function escapeRegex(str: string): string {
129
- return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
130
- }
131
-
132
- /**
133
- * 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.
134
154
  */
135
155
  export function extractParams(
136
156
  pathname: string,
@@ -142,7 +162,7 @@ export function extractParams(
142
162
 
143
163
  const params: Record<string, string> = {};
144
164
  for (let i = 0; i < paramNames.length; i++) {
145
- params[paramNames[i]] = match[i + 1] || "";
165
+ params[paramNames[i]] = safeDecodeURIComponent(match[i + 1] || "");
146
166
  }
147
167
  return params;
148
168
  }
@@ -166,7 +186,15 @@ export function createMiddlewareContext<TEnv>(
166
186
  search?: Record<string, unknown>,
167
187
  ) => string,
168
188
  ): MiddlewareContext<TEnv> {
169
- 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));
170
198
 
171
199
  // Track the initial response to detect pre/post-next() phase.
172
200
  // Before next(): responseHolder.response === initialResponse (the stub).
@@ -182,13 +210,36 @@ export function createMiddlewareContext<TEnv>(
182
210
  // Cookie operations are handled by the standalone cookies() function which
183
211
  // delegates to the shared RequestContext internally.
184
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()`.
185
233
  return {
186
234
  request,
187
235
  url,
236
+ originalUrl: reqCtx?.originalUrl ?? new URL(request.url),
188
237
  pathname: url.pathname,
189
238
  searchParams: url.searchParams,
190
239
  env: env as MiddlewareContext<TEnv>["env"],
191
240
  params,
241
+ executionContext: reqCtx?.executionContext,
242
+ waitUntil: reqCtx ? reqCtx.waitUntil.bind(reqCtx) : fireAndForgetWaitUntil,
192
243
  // Getter: re-derives from request context on each access so that global
193
244
  // middleware sees the matched route name after await next().
194
245
  get routeName(): MiddlewareContext<TEnv>["routeName"] {
@@ -199,33 +250,16 @@ export function createMiddlewareContext<TEnv>(
199
250
  ) as MiddlewareContext<TEnv>["routeName"];
200
251
  },
201
252
 
202
- get res(): Response {
203
- // Before next(): return shared RequestContext stub so headers
204
- // set via ctx.header() are visible on ctx.res.
205
- if (isPreNext()) {
206
- const reqCtx = _getRequestContext();
207
- if (reqCtx) return reqCtx.res;
208
- }
209
- if (!responseHolder.response) {
210
- throw new Error(
211
- "ctx.res is not available - responseHolder was not initialized",
212
- );
213
- }
214
- return responseHolder.response;
215
- },
216
- set res(_: Response) {
217
- throw new Error(
218
- "ctx.res is read-only. Use ctx.header() to set response headers, or cookies() for cookie mutations.",
219
- );
253
+ get headers(): Headers {
254
+ return getResponse().headers;
220
255
  },
221
256
 
222
257
  get: ((keyOrVar: any) =>
223
258
  contextGet(variables, keyOrVar)) as MiddlewareContext<TEnv>["get"],
224
259
 
225
- set: ((keyOrVar: any, value: unknown) => {
226
- contextSet(variables, keyOrVar, value);
260
+ set: ((keyOrVar: any, value: unknown, options?: any) => {
261
+ contextSet(variables, keyOrVar, value, options);
227
262
  }) as MiddlewareContext<TEnv>["set"],
228
-
229
263
  header(name: string, value: string): void {
230
264
  // Before next(): delegate to shared RequestContext stub
231
265
  if (isPreNext()) {
@@ -244,11 +278,33 @@ export function createMiddlewareContext<TEnv>(
244
278
  responseHolder.response.headers.set(name, value);
245
279
  },
246
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
+
247
299
  reverse:
248
300
  reverse ??
249
- ((name: string) => {
301
+ ((
302
+ name: string,
303
+ _params?: Record<string, string>,
304
+ _search?: Record<string, unknown>,
305
+ ) => {
250
306
  throw new Error(
251
- `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.`,
252
308
  );
253
309
  }),
254
310
 
@@ -256,6 +312,10 @@ export function createMiddlewareContext<TEnv>(
256
312
  const reqCtx = _getRequestContext();
257
313
  if (reqCtx) {
258
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);
259
319
  }
260
320
  },
261
321
  };
@@ -281,9 +341,16 @@ export function matchMiddleware<TEnv>(
281
341
  continue;
282
342
  }
283
343
 
284
- // Check if pathname matches
285
- if (entry.regex.test(pathname)) {
286
- 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
+ }
287
354
  matches.push({ entry, params });
288
355
  }
289
356
  }
@@ -291,15 +358,97 @@ export function matchMiddleware<TEnv>(
291
358
  return matches;
292
359
  }
293
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
+
294
443
  /**
295
444
  * Execute middleware chain
296
445
  *
297
446
  * Features:
298
447
  * - `await next()` returns actual Response
299
- * - `ctx.res` available after `await next()` (like Hono's `c.res`)
300
- * - `ctx.header()` shorthand for setting headers
301
- * - Forgiving: if middleware doesn't return, uses `ctx.res`
302
- * - 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
303
452
  * - Error catching: try/catch around `next()` works
304
453
  */
305
454
  export async function executeMiddleware<TEnv>(
@@ -329,42 +478,16 @@ export async function executeMiddleware<TEnv>(
329
478
  // End of chain - call actual RSC handler
330
479
  const response = await finalHandler();
331
480
 
332
- // Merge headers set on stub into the real response.
333
- // Use append for Set-Cookie to preserve multiple cookies.
334
- const mergedHeaders = new Headers(response.headers);
335
- stubResponse.headers.forEach((value, name) => {
336
- if (name.toLowerCase() === "set-cookie") {
337
- mergedHeaders.append(name, value);
338
- } else {
339
- mergedHeaders.set(name, value);
340
- }
341
- });
342
- // Also merge shared RequestContext stub (cookies written via cookies().set()).
343
- // Dedup Set-Cookie: an inner executeMiddleware (route-level middleware)
344
- // may have already merged the same reqCtx cookies into the response.
345
- const reqCtx = _getRequestContext();
346
- if (reqCtx) {
347
- const stubCookies = reqCtx.res.headers.getSetCookie();
348
- if (stubCookies.length > 0) {
349
- const existing = new Set(mergedHeaders.getSetCookie());
350
- for (const cookie of stubCookies) {
351
- if (!existing.has(cookie)) {
352
- mergedHeaders.append("set-cookie", cookie);
353
- }
354
- }
355
- }
356
- reqCtx.res.headers.forEach((value, name) => {
357
- if (name !== "set-cookie" && !mergedHeaders.has(name)) {
358
- mergedHeaders.set(name, value);
359
- }
360
- });
481
+ if (isWebSocketUpgradeResponse(response)) {
482
+ responseHolder.response = response;
483
+ return response;
361
484
  }
362
485
 
363
- // Clone response with merged headers (mutable for post-next() modifications)
364
- responseHolder.response = new Response(response.body, {
365
- status: response.status,
366
- statusText: response.statusText,
367
- 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,
368
491
  });
369
492
 
370
493
  return responseHolder.response;
@@ -380,15 +503,15 @@ export async function executeMiddleware<TEnv>(
380
503
  responseHolder,
381
504
  reverse,
382
505
  );
383
- const metricsStore = _getRequestContext()?._metricsStore;
384
506
  const metricStart = performance.now();
507
+ const metricLabel = getMiddlewareMetricLabel(entry, middlewareOrdinal);
385
508
  let middlewareFinished = false;
386
509
  const finishMiddleware = () => {
387
510
  if (!middlewareFinished) {
388
511
  middlewareFinished = true;
389
512
  appendMetric(
390
- metricsStore,
391
- getMiddlewareMetricLabel(entry, middlewareOrdinal),
513
+ _getRequestContext()?._metricsStore,
514
+ `${metricLabel}:pre`,
392
515
  metricStart,
393
516
  performance.now() - metricStart,
394
517
  MIDDLEWARE_METRIC_DEPTH,
@@ -400,6 +523,7 @@ export async function executeMiddleware<TEnv>(
400
523
  // Guard against double-calling: a second call would re-enter the
401
524
  // downstream chain and overwrite responseHolder.response.
402
525
  let nextPromise: Promise<Response> | null = null;
526
+ let nextResolvedAt: number | undefined;
403
527
  const wrappedNext = (): Promise<Response> => {
404
528
  if (nextPromise) {
405
529
  throw new Error(
@@ -407,76 +531,80 @@ export async function executeMiddleware<TEnv>(
407
531
  );
408
532
  }
409
533
  finishMiddleware();
410
- nextPromise = next();
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
+ );
411
545
  return nextPromise;
412
546
  };
413
547
 
414
- // W5: track whether ctx.set() is called during this middleware
415
- let ctxSetCalled = false;
416
- if (process.env.NODE_ENV !== "production") {
417
- const originalSet = ctx.set;
418
- ctx.set = ((...args: any[]) => {
419
- ctxSetCalled = true;
420
- return (originalSet as Function).apply(ctx, args);
421
- }) as typeof ctx.set;
422
- }
423
-
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.
424
554
  let result: Response | void;
425
555
  try {
426
- result = await entry.handler(ctx, wrappedNext);
427
- } catch (error) {
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).
428
576
  finishMiddleware();
429
- throw error;
430
577
  }
431
- finishMiddleware();
578
+
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
+ }
432
593
 
433
594
  // Explicit return takes precedence (middleware short-circuit).
434
595
  // Merge stub headers (from ctx.header before this point) and
435
- // RequestContext stub headers (from ctx.setCookie) into the
596
+ // RequestContext stub headers (from cookies().set()) into the
436
597
  // returned Response so they are not lost.
437
598
  if (result instanceof Response) {
438
- // W5: warn if ctx.set() was called but middleware returned a redirect
439
- if (
440
- process.env.NODE_ENV !== "production" &&
441
- ctxSetCalled &&
442
- result.status >= 300 &&
443
- result.status < 400
444
- ) {
445
- warnCtxSetBeforeRedirect(entry.handler);
446
- }
447
-
448
- const mergedHeaders = new Headers(result.headers);
449
- stubResponse.headers.forEach((value, name) => {
450
- if (name.toLowerCase() === "set-cookie") {
451
- mergedHeaders.append(name, value);
452
- } else if (!mergedHeaders.has(name)) {
453
- mergedHeaders.set(name, value);
454
- }
455
- });
456
- // Also merge shared RequestContext stub (cookies written via setCookie).
457
- // Dedup Set-Cookie: an inner executeMiddleware (route-level middleware)
458
- // may have already merged the same reqCtx cookies into the response.
459
- const reqCtx = _getRequestContext();
460
- if (reqCtx) {
461
- const stubCookies = reqCtx.res.headers.getSetCookie();
462
- if (stubCookies.length > 0) {
463
- const existing = new Set(mergedHeaders.getSetCookie());
464
- for (const cookie of stubCookies) {
465
- if (!existing.has(cookie)) {
466
- mergedHeaders.append("set-cookie", cookie);
467
- }
468
- }
469
- }
470
- reqCtx.res.headers.forEach((value, name) => {
471
- if (name !== "set-cookie" && !mergedHeaders.has(name)) {
472
- mergedHeaders.set(name, value);
473
- }
474
- });
599
+ if (isWebSocketUpgradeResponse(result)) {
600
+ responseHolder.response = result;
601
+ return result;
475
602
  }
476
- const merged = new Response(result.body, {
477
- status: result.status,
478
- statusText: result.statusText,
479
- 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,
480
608
  });
481
609
  responseHolder.response = merged;
482
610
  return merged;
@@ -495,19 +623,6 @@ export async function executeMiddleware<TEnv>(
495
623
  // If middleware called next(), await it and return the response
496
624
  if (nextPromise) {
497
625
  await nextPromise;
498
-
499
- // W5: warn if ctx.set() was called but the downstream response is a redirect.
500
- // The ctx.set() values will be lost because the redirect navigates away.
501
- if (
502
- process.env.NODE_ENV !== "production" &&
503
- ctxSetCalled &&
504
- responseHolder.response &&
505
- responseHolder.response.status >= 300 &&
506
- responseHolder.response.status < 400
507
- ) {
508
- warnCtxSetBeforeRedirect(entry.handler);
509
- }
510
-
511
626
  return responseHolder.response!;
512
627
  }
513
628
 
@@ -534,23 +649,12 @@ export async function executeMiddleware<TEnv>(
534
649
  // last merge point (e.g. cookies().set() called after await next()).
535
650
  // The reqCtx stub may have already been partially merged during finalHandler
536
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.
537
655
  const reqCtx = _getRequestContext();
538
- if (reqCtx) {
539
- const stubCookies = reqCtx.res.headers.getSetCookie();
540
- if (stubCookies.length > 0) {
541
- const existingCookies = new Set(finalResponse.headers.getSetCookie());
542
- for (const cookie of stubCookies) {
543
- if (!existingCookies.has(cookie)) {
544
- finalResponse.headers.append("set-cookie", cookie);
545
- }
546
- }
547
- }
548
- // Fill in non-cookie headers that aren't already on the response
549
- reqCtx.res.headers.forEach((value, name) => {
550
- if (name !== "set-cookie" && !finalResponse.headers.has(name)) {
551
- finalResponse.headers.set(name, value);
552
- }
553
- });
656
+ if (reqCtx && !isWebSocketUpgradeResponse(finalResponse)) {
657
+ mergeReqCtxStub(finalResponse.headers, reqCtx);
554
658
  }
555
659
 
556
660
  return finalResponse;
@@ -561,7 +665,7 @@ export async function executeMiddleware<TEnv>(
561
665
  *
562
666
  * Intercepts use a shared stubResponse from the request context. This function:
563
667
  * - Runs middleware in sequence with a simple next() chain
564
- * - 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())
565
669
  * - Returns null if all middleware calls next() - headers set after next() remain on stubResponse
566
670
  *
567
671
  * @param middlewares - Array of middleware functions
@@ -599,6 +703,7 @@ export async function executeInterceptMiddleware<TEnv>(
599
703
  return stubResponse;
600
704
  }
601
705
 
706
+ const ordinal = index;
602
707
  const middleware = middlewares[index++];
603
708
  const ctx = createMiddlewareContext(
604
709
  request,
@@ -620,7 +725,30 @@ export async function executeInterceptMiddleware<TEnv>(
620
725
  return next();
621
726
  };
622
727
 
623
- 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
+ );
624
752
 
625
753
  if (result instanceof Response) {
626
754
  earlyResponse = result;
@@ -644,21 +772,13 @@ export async function executeInterceptMiddleware<TEnv>(
644
772
  });
645
773
 
646
774
  if (hasStubHeaders) {
647
- // Clone and merge headers from stub into early response.
648
- // Only fill in missing headers — the returned Response's explicit
649
- // headers take precedence, matching executeMiddleware behavior.
650
- const mergedHeaders = new Headers(response.headers);
651
- stubResponse.headers.forEach((value, name) => {
652
- if (name.toLowerCase() === "set-cookie") {
653
- mergedHeaders.append(name, value);
654
- } else if (!mergedHeaders.has(name)) {
655
- mergedHeaders.set(name, value);
656
- }
657
- });
658
- return new Response(response.body, {
659
- status: response.status,
660
- statusText: response.statusText,
661
- 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,
662
782
  });
663
783
  }
664
784
  return response;
@@ -699,7 +819,6 @@ export async function executeLoaderMiddleware<TEnv>(
699
819
  regex: null,
700
820
  paramNames: [],
701
821
  handler,
702
- mountPrefix: null,
703
822
  } as MiddlewareEntry<TEnv>,
704
823
  params,
705
824
  }));