@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
@@ -11,7 +11,15 @@
11
11
  */
12
12
 
13
13
  import { AsyncLocalStorage } from "node:async_hooks";
14
+ import { parseCookiesFromHeader } from "./cookie-parse.js";
15
+ import type { CacheErrorCategory } from "../cache/cache-error.js";
14
16
  import type { CookieOptions } from "../router/middleware.js";
17
+ import {
18
+ KEEP_CACHE_HEADER,
19
+ getRawCookieValue,
20
+ mintStateValue,
21
+ serializeStateCookie,
22
+ } from "../browser/cookie-name.js";
15
23
  import type { LoaderDefinition, LoaderContext } from "../types.js";
16
24
  import type { ScopedReverseFunction } from "../reverse.js";
17
25
  import type {
@@ -20,18 +28,46 @@ import type {
20
28
  DefaultRouteName,
21
29
  } from "../types/global-namespace.js";
22
30
  import type { Handle } from "../handle.js";
23
- import { type ContextVar, contextGet, contextSet } from "../context-var.js";
24
- import { createHandleStore, type HandleStore } from "./handle-store.js";
31
+ import {
32
+ type ContextVar,
33
+ contextGet,
34
+ contextSet,
35
+ isNonCacheable,
36
+ } from "../context-var.js";
37
+ import {
38
+ createHandleStore,
39
+ buildHandleSnapshot,
40
+ type HandleStore,
41
+ type HandleData,
42
+ } from "./handle-store.js";
25
43
  import { isHandle } from "../handle.js";
26
- import { track, type MetricsStore } from "./context.js";
44
+ import { withDefer } from "../defer.js";
45
+ import { type MetricsStore } from "./context.js";
46
+ import { observePhase, PHASES } from "../router/instrument.js";
27
47
  import { getFetchableLoader } from "./fetchable-loader-store.js";
28
48
  import type { SegmentCacheStore } from "../cache/types.js";
29
49
  import type { Theme, ResolvedThemeConfig } from "../theme/types.js";
30
- import { THEME_COOKIE } from "../theme/constants.js";
50
+ import type { ExecutionContext, RequestScope } from "../types/request-scope.js";
51
+ import type { TransitionWhenFn } from "../types/segments.js";
52
+ import type { ResolvedTracing } from "../router/tracing.js";
53
+ import {
54
+ THEME_COOKIE,
55
+ isValidTheme,
56
+ warnInvalidTheme,
57
+ } from "../theme/constants.js";
31
58
  import type { LocationStateEntry } from "../browser/react/location-state-shared.js";
32
59
  import { NOCACHE_SYMBOL, assertNotInsideCacheExec } from "../cache/taint.js";
33
- import { createReverseFunction } from "../router/handler-context.js";
34
- import { getGlobalRouteMap, isRouteRootScoped } from "../route-map-builder.js";
60
+ import { isInsideCacheScope } from "./context.js";
61
+ import {
62
+ createReverseFunction,
63
+ stripInternalParams,
64
+ } from "../router/handler-context.js";
65
+ import {
66
+ getGlobalRouteMap,
67
+ isRouteRootScoped,
68
+ getSearchSchema,
69
+ } from "../route-map-builder.js";
70
+ import { parseSearchParams } from "../search-params.js";
35
71
  import { invariant } from "../errors.js";
36
72
  import { isAutoGeneratedRouteName } from "../route-name.js";
37
73
 
@@ -44,19 +80,9 @@ import { isAutoGeneratedRouteName } from "../route-name.js";
44
80
  export interface RequestContext<
45
81
  TEnv = DefaultEnv,
46
82
  TParams = Record<string, string>,
47
- > {
48
- /** Platform bindings (Cloudflare env, etc.) */
49
- env: TEnv;
50
- /** Original HTTP request */
51
- request: Request;
52
- /** Parsed URL (system params like _rsc* are NOT filtered here) */
53
- url: URL;
54
- /** URL pathname */
55
- pathname: string;
56
- /** URL search params (system params like _rsc* are NOT filtered here) */
57
- searchParams: URLSearchParams;
58
- /** Variables set by middleware (same as ctx.var) */
59
- var: Record<string, any>;
83
+ > extends RequestScope<TEnv> {
84
+ /** @internal Shared variable backing store for ctx.get()/ctx.set(). */
85
+ _variables: Record<string, any>;
60
86
  /** Get a variable set by middleware */
61
87
  get: {
62
88
  <T>(contextVar: ContextVar<T>): T | undefined;
@@ -64,20 +90,19 @@ export interface RequestContext<
64
90
  };
65
91
  /** Set a variable (shared with middleware and handlers) */
66
92
  set: {
67
- <T>(contextVar: ContextVar<T>, value: T): void;
68
- <K extends string>(key: K, value: any): void;
93
+ <T>(
94
+ contextVar: ContextVar<T>,
95
+ value: T,
96
+ options?: { cache?: boolean },
97
+ ): void;
98
+ <K extends string>(key: K, value: any, options?: { cache?: boolean }): void;
69
99
  };
70
100
  /**
71
101
  * Route params (populated after route matching)
72
102
  * Initially empty, then set to matched params
73
103
  */
74
104
  params: TParams;
75
- /**
76
- * Stub response for setting headers/cookies (read-only).
77
- * Headers set here are merged into the final response.
78
- * Use header() or setStatus() to mutate response headers/status.
79
- * Use cookies().set()/cookies().delete() for cookie mutations.
80
- */
105
+ /** @internal Stub response for collecting headers/cookies. Use ctx.headers or ctx.header() instead. */
81
106
  readonly res: Response;
82
107
 
83
108
  /** @internal Get a cookie value (effective: request + response mutations). Use cookies().get() instead. */
@@ -95,6 +120,12 @@ export interface RequestContext<
95
120
  header(name: string, value: string): void;
96
121
  /** Set the response status code */
97
122
  setStatus(status: number): void;
123
+ /** @internal Set status bypassing cache-exec guard (for framework error handling) */
124
+ _setStatus(status: number): void;
125
+ /** @internal Rotate the rango state cookie (server seat of invalidateClientCache). */
126
+ _rotateStateCookie(): void;
127
+ /** @internal Set the keepClientCache() directive header on the response. */
128
+ _setKeepCacheDirective(): void;
98
129
 
99
130
  /**
100
131
  * Access loader data or push handle data.
@@ -130,29 +161,100 @@ export interface RequestContext<
130
161
  /** @internal Handle store for tracking handle data across segments */
131
162
  _handleStore: HandleStore;
132
163
 
164
+ /**
165
+ * @internal transition({ when }) predicates for segments matched this request,
166
+ * keyed by segment id. Collected during resolution (the function is stripped
167
+ * from the serialized segment config), then evaluated post-handler in
168
+ * rsc-rendering — outside any cache scope — to drop the transition of any
169
+ * segment whose predicate returns false.
170
+ */
171
+ _transitionWhen?: Array<{ id: string; when: TransitionWhenFn }>;
172
+
133
173
  /** @internal Cache store for segment caching (optional, used by CacheScope) */
134
174
  _cacheStore?: SegmentCacheStore;
135
175
 
176
+ /**
177
+ * @internal PPR shell-capture ACTIVE marker. True ONLY inside the background
178
+ * capture task's derived request context (built by shell-capture.ts). This is
179
+ * the switch every capture-specific behavior reads: loader masking
180
+ * (loader-mask.ts isShellCaptureActive / fresh.ts emitStreaming) and the
181
+ * cookies()/headers() capture guard (cookie-store.ts
182
+ * assertNotInsideShellCapture). The foreground render never sets it, so the
183
+ * served response is byte-identical to axis 1. The capture descriptor itself
184
+ * (key/ttl/swr/tags/store) is NOT threaded through the request context — the
185
+ * integrated PPR serve path (rsc/shell-serve.ts + rsc-rendering.ts) builds it
186
+ * locally and passes it to scheduleShellCapture directly.
187
+ */
188
+ _shellCaptureRun?: boolean;
189
+
190
+ /**
191
+ * @internal Bake-lane loader containers collected DURING a shell capture:
192
+ * segment-key -> the loader's (pre-wrap) result promise. Populated by
193
+ * resolveLoaderData for loaders on entries with no renderable loading() (the
194
+ * bake lane — they execute at capture instead of being masked; see
195
+ * docs/design/loader-container-bake.md). Drained by captureAndStoreShell
196
+ * after the shell quiesces: settled containers are promise-elided,
197
+ * Flight-serialized, and pinned into the snapshot's loader family; a
198
+ * REJECTED container refuses the capture (error UI must never bake into the
199
+ * shared shell). Own property of the capture's derived context only.
200
+ */
201
+ _shellCaptureLoaderRecords?: Map<string, Promise<unknown>>;
202
+
203
+ /**
204
+ * @internal Loader-family snapshot seed for a shell HIT's tail render:
205
+ * segment-key -> the capture's elided container (already Flight-deserialized
206
+ * by serveShellHit). resolveLoaderData overlays it onto the fresh run's
207
+ * container (recorded paths pinned, hole-marker paths keep the fresh nested
208
+ * promises) so the payload's baked bytes match the frozen prelude. Own
209
+ * property of the HIT tail's derived context only.
210
+ */
211
+ _shellLoaderSeed?: Map<string, unknown>;
212
+
213
+ /**
214
+ * @internal Set (to the offending fn name) by the cookies()/headers()
215
+ * capture guard when it throws DURING a capture render. Load-bearing for the
216
+ * bake lane: a guard throw inside an executing loader is swallowed by
217
+ * wrapLoaderPromise into per-loader error UI, which would otherwise bake
218
+ * silently into the shared shell — the capture checks this flag after the
219
+ * render and refuses instead. Deterministic, so the capture does not retry.
220
+ */
221
+ _shellCaptureGuardTripped?: string;
222
+
223
+ /**
224
+ * @internal The loader $$id whose BODY was executing when the capture guard
225
+ * tripped (read off the loader-body ALS scope at trip time), or undefined
226
+ * when the read came from handler/render code. Only used to make the
227
+ * once-per-key refusal warning name the real source — the old text
228
+ * hardcoded "a bake-lane loader", which misattributed handler-land reads
229
+ * and sent users debugging the wrong lane (issue #672, secondary).
230
+ */
231
+ _shellCaptureGuardTrippedLoaderId?: string;
232
+
233
+ /**
234
+ * @internal Handler-owned registry of explicit per-scope stores from
235
+ * cache({ store }). Created once per createRSCHandler() and threaded into
236
+ * every request context, so it accumulates every explicit store the handler
237
+ * resolves. updateTag()/revalidateTag() iterate this set plus _cacheStore to
238
+ * reach every store that may hold tagged entries. The app-level store is not
239
+ * added here (it is always reachable via _cacheStore).
240
+ */
241
+ _explicitTaggedStores?: Set<SegmentCacheStore>;
242
+
243
+ /**
244
+ * @internal Union of every cache tag resolved while producing this request's
245
+ * response (from cache({ tags }), runtime cacheTag(), and loader cache tags).
246
+ * Populated at the tag-resolution sites via recordRequestTags(). Read by the
247
+ * document cache middleware so a full-page entry is tagged with everything its
248
+ * content used and can therefore be invalidated by updateTag()/revalidateTag().
249
+ */
250
+ _requestTags: Set<string>;
251
+
136
252
  /** @internal Cache profiles for "use cache" profile resolution (per-router) */
137
253
  _cacheProfiles?: Record<
138
254
  string,
139
255
  import("../cache/profile-registry.js").CacheProfile
140
256
  >;
141
257
 
142
- /**
143
- * Schedule work to run after the response is sent.
144
- * On Cloudflare Workers, uses ctx.waitUntil().
145
- * On Node.js, runs as fire-and-forget.
146
- *
147
- * @example
148
- * ```typescript
149
- * ctx.waitUntil(async () => {
150
- * await cacheStore.set(key, data, ttl);
151
- * });
152
- * ```
153
- */
154
- waitUntil(fn: () => Promise<void>): void;
155
-
156
258
  /**
157
259
  * Register a callback to run when the response is created.
158
260
  * Callbacks are sync and receive the response. They can:
@@ -175,6 +277,19 @@ export interface RequestContext<
175
277
  /** @internal Registered onResponse callbacks */
176
278
  _onResponseCallbacks: Array<(response: Response) => Response>;
177
279
 
280
+ /**
281
+ * @internal Promises of the background tasks scheduled via this context's
282
+ * waitUntil (deferred cache writes, revalidations, consumer tasks). The PPR
283
+ * shell capture drains this list BEFORE its match/render as an ORDERING EDGE:
284
+ * every foreground deferred cache write is scheduled here before the capture
285
+ * task is, so settling the list first guarantees the capture's cache reads
286
+ * observe the foreground's generation instead of racing it (see
287
+ * shell-capture.ts). Tasks whose scheduling fn carries
288
+ * UNTRACKED_BACKGROUND_TASK are not tracked (the capture task itself —
289
+ * tracking it would make that drain await its own promise).
290
+ */
291
+ _pendingBackgroundTasks?: Array<Promise<unknown>>;
292
+
178
293
  /**
179
294
  * Current theme setting (only available when theme is enabled in router config)
180
295
  *
@@ -256,6 +371,92 @@ export interface RequestContext<
256
371
  /** @internal Previous route key (from the navigation source), used for revalidation */
257
372
  _prevRouteKey?: string;
258
373
 
374
+ /**
375
+ * @internal Navigation/action source data the transition({ when }) gate reads
376
+ * to build its ShouldRevalidateFn-shaped predicate context. currentUrl/Params
377
+ * come from the navigation snapshot (set at match time); action* are stashed
378
+ * at the action-bearing gate call sites. All undefined when there is no source
379
+ * (initial full load) or no action (plain navigation).
380
+ */
381
+ _gateCurrentUrl?: URL;
382
+ _gateCurrentParams?: Record<string, string>;
383
+ _gateActionId?: string;
384
+ _gateActionUrl?: URL;
385
+ _gateActionResult?: unknown;
386
+ _gateFormData?: FormData;
387
+
388
+ /**
389
+ * @internal True while the post-action revalidation render is running (set by
390
+ * revalidateAfterAction). The "use cache" runtime reads this to prefer
391
+ * freshness over a fast stale response during an action: a stale entry
392
+ * re-executes in the foreground (so the action response reflects the refreshed
393
+ * value) with only the store write deferred, instead of serving stale and
394
+ * revalidating in the background. A plain navigation (flag unset) keeps SWR.
395
+ */
396
+ _inActionRevalidation?: boolean;
397
+
398
+ /**
399
+ * @internal Render barrier for experimental `rendered()` API.
400
+ * Resolves when all non-loader segments have settled and handle data
401
+ * is available. Used by DSL loaders that call `ctx.rendered()`.
402
+ */
403
+ _renderBarrier: Promise<void>;
404
+
405
+ /**
406
+ * @internal Resolve the render barrier. Accepts resolved segments, filters
407
+ * out loaders, and captures non-loader segment IDs as the handle ordering.
408
+ * Called after segment resolution (fresh) or handle replay (cache/prerender).
409
+ */
410
+ _resolveRenderBarrier: (
411
+ segments: Array<{ type: string; id: string }>,
412
+ ) => void;
413
+
414
+ /**
415
+ * @internal Segment order at barrier resolution time, used by loader
416
+ * ctx.use(handle) to collect handle data in correct order.
417
+ */
418
+ _renderBarrierSegmentOrder?: string[];
419
+
420
+ /**
421
+ * @internal Set to true when the matched entry tree contains any `loading()`
422
+ * entries (streaming). On a streaming tree rendered() waits for the streaming
423
+ * handlers to settle (via handleStore.settled) before resolving, and the
424
+ * deadlock guard state is kept live until that wait completes.
425
+ */
426
+ _treeHasStreaming?: boolean;
427
+
428
+ /**
429
+ * @internal Loader IDs that have called rendered() and are waiting for the
430
+ * barrier. Used to detect deadlocks when a handler tries to await the same
431
+ * loader via ctx.use(Loader).
432
+ */
433
+ _renderBarrierWaiters?: Set<string>;
434
+
435
+ /**
436
+ * @internal Loader IDs that handlers have started awaiting via ctx.use().
437
+ * Used for bidirectional deadlock detection: if a loader later calls
438
+ * rendered() and a handler already awaits it, we can detect the deadlock.
439
+ */
440
+ _handlerLoaderDeps?: Set<string>;
441
+
442
+ /**
443
+ * @internal Cached HandleData snapshot built at barrier resolution time.
444
+ * Avoids rebuilding the snapshot on every loader ctx.use(handle) call.
445
+ */
446
+ _renderBarrierHandleSnapshot?: HandleData;
447
+
448
+ /**
449
+ * @internal The deadlock guard window is closed (no further handler-awaits-
450
+ * loader cycle is possible). For non-streaming trees this is set when the
451
+ * barrier resolves. For streaming trees the window stays open until
452
+ * handleStore.settled — rendered() keeps waiting past the barrier and a
453
+ * loading() handler can still resume and await a still-waiting loader — so it
454
+ * is set only after settled. The guard (loader-resolution `setupLoaderAccess`)
455
+ * reads this instead of `_renderBarrierSegmentOrder` so it does not go blind
456
+ * during the streaming settle wait.
457
+ */
458
+ _renderBarrierGuardClosed?: boolean;
459
+
259
460
  /** @internal Per-request error dedup set for onError reporting */
260
461
  _reportedErrors: WeakSet<object>;
261
462
 
@@ -263,15 +464,49 @@ export interface RequestContext<
263
464
  * @internal Report a non-fatal background error through the router's
264
465
  * onError callback. Wired by the RSC handler / router during request
265
466
  * creation. Cache-runtime and other subsystems call this to surface
266
- * errors without failing the response.
467
+ * errors without failing the response. `category` is surfaced to consumers as
468
+ * `metadata.category` on the onError context (phase `cache`).
267
469
  */
268
- _reportBackgroundError?: (error: unknown, category: string) => void;
470
+ _reportBackgroundError?: (
471
+ error: unknown,
472
+ category: CacheErrorCategory,
473
+ ) => void;
269
474
 
270
475
  /** @internal Per-request debug performance override (set via ctx.debugPerformance()) */
271
476
  _debugPerformance?: boolean;
272
477
 
273
478
  /** @internal Request-scoped performance metrics store */
274
479
  _metricsStore?: MetricsStore;
480
+
481
+ /**
482
+ * @internal True request entry timestamp (performance.now() at handler entry).
483
+ * Set once at request-context creation (rsc/handler.ts) so a metrics store
484
+ * created MID-request — ctx.debugPerformance() or the getMetricsStore wrapper —
485
+ * anchors its timeline to the real request start instead of the opt-in moment,
486
+ * keeping phases that began before the opt-in at their true (non-negative) offset.
487
+ */
488
+ _handlerStart?: number;
489
+
490
+ /** @internal Resolved platform phase-span tracing for this request (Cloudflare or OTel) */
491
+ _tracing?: ResolvedTracing;
492
+
493
+ /** @internal Router basename for this request (used by redirect()) */
494
+ _basename?: string;
495
+
496
+ /**
497
+ * @internal RouteSnapshot from classifyRequest, reused by match/matchPartial
498
+ * to avoid a second resolveRoute call. Cleared on HMR invalidation.
499
+ */
500
+ _classifiedRoute?: import("../router/route-snapshot.js").RouteSnapshot;
501
+
502
+ /**
503
+ * @internal Coarse route-level cache signal for the X-Rango-Cache debug
504
+ * header. Populated by match/matchPartial only when the debug cache signal
505
+ * gate is enabled (debugCacheSignal option or RANGO_TEST_SIGNALS=1). Read by
506
+ * the response-finalization path (createResponseWithMergedHeaders). Undefined
507
+ * when the gate is off, so no header is emitted.
508
+ */
509
+ _cacheSignal?: import("../router/telemetry.js").CacheSegmentSignal[];
275
510
  }
276
511
 
277
512
  /**
@@ -290,19 +525,59 @@ export type PublicRequestContext<
290
525
  | "setCookie"
291
526
  | "deleteCookie"
292
527
  | "_handleStore"
528
+ | "_transitionWhen"
293
529
  | "_cacheStore"
530
+ | "_shellCaptureRun"
531
+ | "_shellCaptureGuardTrippedLoaderId"
532
+ | "_explicitTaggedStores"
533
+ | "_requestTags"
294
534
  | "_cacheProfiles"
295
535
  | "_onResponseCallbacks"
296
536
  | "_themeConfig"
297
537
  | "_locationState"
298
538
  | "_routeName"
299
539
  | "_prevRouteKey"
540
+ | "_gateCurrentUrl"
541
+ | "_gateCurrentParams"
542
+ | "_gateActionId"
543
+ | "_gateActionUrl"
544
+ | "_gateActionResult"
545
+ | "_gateFormData"
546
+ | "_inActionRevalidation"
300
547
  | "_reportedErrors"
548
+ | "_renderBarrier"
549
+ | "_resolveRenderBarrier"
550
+ | "_renderBarrierSegmentOrder"
551
+ | "_treeHasStreaming"
552
+ | "_renderBarrierWaiters"
553
+ | "_handlerLoaderDeps"
554
+ | "_renderBarrierHandleSnapshot"
555
+ | "_renderBarrierGuardClosed"
301
556
  | "_reportBackgroundError"
302
557
  | "_debugPerformance"
303
558
  | "_metricsStore"
559
+ | "_handlerStart"
560
+ | "_basename"
561
+ | "_setStatus"
562
+ | "_rotateStateCookie"
563
+ | "_setKeepCacheDirective"
564
+ | "_variables"
565
+ | "_classifiedRoute"
566
+ | "_cacheSignal"
567
+ | "res"
304
568
  >;
305
569
 
570
+ /**
571
+ * Marker for a waitUntil-scheduled fn whose task promise must NOT enter
572
+ * _pendingBackgroundTasks. Used by the PPR shell capture for its own task:
573
+ * the capture's pre-render write barrier settles that list, so tracking the
574
+ * capture itself would make the drain wait on its own (still-running) promise.
575
+ * @internal
576
+ */
577
+ export const UNTRACKED_BACKGROUND_TASK: unique symbol = Symbol.for(
578
+ "rango.untrackedBackgroundTask",
579
+ );
580
+
306
581
  // AsyncLocalStorage instance for request context
307
582
  const requestContextStorage = new AsyncLocalStorage<RequestContext<any>>();
308
583
 
@@ -351,6 +626,7 @@ export function _getRequestContext<TEnv = DefaultEnv>():
351
626
  export function setRequestContextParams(
352
627
  params: Record<string, string>,
353
628
  routeName?: string,
629
+ routeMap?: Record<string, string>,
354
630
  ): void {
355
631
  const ctx = requestContextStorage.getStore();
356
632
  if (ctx) {
@@ -363,9 +639,13 @@ export function setRequestContextParams(
363
639
  : undefined
364
640
  ) as DefaultRouteName | undefined;
365
641
  }
366
- // Update reverse with scoped resolution now that route is known
642
+ // Update reverse with scoped resolution now that route is known. Production
643
+ // omits routeMap and uses the global map (routes are registered globally);
644
+ // the testing primitives (renderToFlightString/renderServerTree) pass a
645
+ // scoped routeMap so `ctx.reverse` is not order-dependent on whatever router
646
+ // registered last.
367
647
  ctx.reverse = createReverseFunction(
368
- getGlobalRouteMap(),
648
+ routeMap ?? getGlobalRouteMap(),
369
649
  routeName,
370
650
  params,
371
651
  routeName ? isRouteRootScoped(routeName) : undefined,
@@ -381,11 +661,17 @@ export function setRequestContextParams(
381
661
  */
382
662
  export function setRequestContextPrevRouteKey(
383
663
  prevRouteKey: string | undefined,
664
+ currentUrl?: URL,
665
+ currentParams?: Record<string, string>,
384
666
  ): void {
385
667
  const ctx = requestContextStorage.getStore();
386
- if (ctx && prevRouteKey !== undefined) {
387
- ctx._prevRouteKey = prevRouteKey;
388
- }
668
+ if (!ctx) return;
669
+ if (prevRouteKey !== undefined) ctx._prevRouteKey = prevRouteKey;
670
+ // Source URL/params for the transition({ when }) gate (effectiveFromUrl /
671
+ // effectiveFromMatch.params from the navigation snapshot). Same write point as
672
+ // _prevRouteKey, which doubles as fromRouteName.
673
+ if (currentUrl !== undefined) ctx._gateCurrentUrl = currentUrl;
674
+ if (currentParams !== undefined) ctx._gateCurrentParams = currentParams;
389
675
  }
390
676
 
391
677
  /**
@@ -399,23 +685,7 @@ export function getLocationState(): LocationStateEntry[] | undefined {
399
685
  return ctx?._locationState;
400
686
  }
401
687
 
402
- /**
403
- * Get the current request context, throwing if not available
404
- * @deprecated Use getRequestContext() directly — it now throws if outside context
405
- */
406
- export function requireRequestContext<
407
- TEnv = DefaultEnv,
408
- >(): RequestContext<TEnv> {
409
- return getRequestContext<TEnv>();
410
- }
411
-
412
- /**
413
- * Cloudflare Workers ExecutionContext (subset we need)
414
- */
415
- export interface ExecutionContext {
416
- waitUntil(promise: Promise<any>): void;
417
- passThroughOnException(): void;
418
- }
688
+ export type { ExecutionContext };
419
689
 
420
690
  /**
421
691
  * Options for creating a request context
@@ -429,6 +699,11 @@ export interface CreateRequestContextOptions<TEnv> {
429
699
  initialResponse?: Response;
430
700
  /** Optional cache store for segment caching (used by CacheScope) */
431
701
  cacheStore?: SegmentCacheStore;
702
+ /**
703
+ * Handler-owned registry of explicit per-scope stores for cross-store tag
704
+ * invalidation. Created once per handler, reused across requests.
705
+ */
706
+ explicitTaggedStores?: Set<SegmentCacheStore>;
432
707
  /** Optional cache profiles for "use cache" resolution (per-router) */
433
708
  cacheProfiles?: Record<
434
709
  string,
@@ -438,6 +713,10 @@ export interface CreateRequestContextOptions<TEnv> {
438
713
  executionContext?: ExecutionContext;
439
714
  /** Optional theme configuration (enables ctx.theme and ctx.setTheme) */
440
715
  themeConfig?: ResolvedThemeConfig | null;
716
+ /** Resolved rango state cookie name, for the server seat of invalidateClientCache(). */
717
+ stateCookieName?: string;
718
+ /** Build version, used as the prefix of a server-rotated rango state value. */
719
+ version?: string;
441
720
  }
442
721
 
443
722
  /**
@@ -458,15 +737,17 @@ export function createRequestContext<TEnv>(
458
737
  variables,
459
738
  initialResponse,
460
739
  cacheStore,
740
+ explicitTaggedStores,
461
741
  cacheProfiles,
462
742
  executionContext,
463
743
  themeConfig,
744
+ stateCookieName,
745
+ version: stateVersion,
464
746
  } = options;
465
747
  const cookieHeader = request.headers.get("Cookie");
748
+ let rangoStateRotated = false;
466
749
  let parsedCookies: Record<string, string> | null = null;
467
750
 
468
- // Create stub response for collecting headers/cookies.
469
- // All cookie/header mutations go here; cookie reads derive from it.
470
751
  let stubResponse = initialResponse
471
752
  ? new Response(null, {
472
753
  status: initialResponse.status,
@@ -475,11 +756,9 @@ export function createRequestContext<TEnv>(
475
756
  })
476
757
  : new Response(null, { status: 200 });
477
758
 
478
- // Create handle store and loader memoization for this request
479
759
  const handleStore = createHandleStore();
480
760
  const loaderPromises = new Map<string, Promise<any>>();
481
761
 
482
- // Lazy parse cookies from the original Cookie header
483
762
  const getParsedCookies = (): Record<string, string> => {
484
763
  if (!parsedCookies) {
485
764
  parsedCookies = parseCookiesFromHeader(cookieHeader);
@@ -487,7 +766,6 @@ export function createRequestContext<TEnv>(
487
766
  return parsedCookies;
488
767
  };
489
768
 
490
- // Cached response cookie mutations — invalidated on setCookie/deleteCookie/setTheme
491
769
  let responseCookieCache: Map<string, string | null> | null = null;
492
770
  const getResponseCookies = (): Map<string, string | null> => {
493
771
  if (!responseCookieCache) {
@@ -499,8 +777,17 @@ export function createRequestContext<TEnv>(
499
777
  responseCookieCache = null;
500
778
  };
501
779
 
502
- // Effective cookie read: response stub Set-Cookie wins, then original header.
503
- // The stub IS the source of truth for same-request mutations.
780
+ function assertNotInsideCacheScopeALS(methodName: string): void {
781
+ if (isInsideCacheScope()) {
782
+ throw new Error(
783
+ `ctx.${methodName}() cannot be called inside a cache() boundary. ` +
784
+ `On cache hit the handler is skipped, so this side effect would be lost. ` +
785
+ `Move ctx.${methodName}() to a middleware or layout outside the cache() scope.`,
786
+ );
787
+ }
788
+ }
789
+
790
+ // Response stub Set-Cookie wins, then original header (source of truth for mutations).
504
791
  const effectiveCookie = (name: string): string | undefined => {
505
792
  const mutations = getResponseCookies();
506
793
  if (mutations.has(name)) {
@@ -510,14 +797,11 @@ export function createRequestContext<TEnv>(
510
797
  return getParsedCookies()[name];
511
798
  };
512
799
 
513
- // Theme helpers (only used when themeConfig is provided)
514
800
  const getTheme = (): Theme | undefined => {
515
801
  if (!themeConfig) return undefined;
516
802
 
517
- // Use overlay-aware read so setTheme() in the same request is reflected
518
803
  const stored = effectiveCookie(themeConfig.storageKey);
519
804
  if (stored) {
520
- // Validate stored value
521
805
  if (stored === "system" && themeConfig.enableSystem) {
522
806
  return "system";
523
807
  }
@@ -531,15 +815,15 @@ export function createRequestContext<TEnv>(
531
815
  const setTheme = (theme: Theme): void => {
532
816
  if (!themeConfig) return;
533
817
 
534
- // Validate theme value
535
- if (theme !== "system" && !themeConfig.themes.includes(theme)) {
536
- console.warn(
537
- `[Theme] Invalid theme value: "${theme}". Valid values: system, ${themeConfig.themes.join(", ")}`,
538
- );
818
+ // Shared guard (isValidTheme): reject any value not in the configured theme
819
+ // set, AND reject "system" when system detection is off — a cookie of
820
+ // theme=system with enableSystem:false would re-apply a bogus class="system"
821
+ // on the next SSR.
822
+ if (!isValidTheme(theme, themeConfig)) {
823
+ warnInvalidTheme(theme, themeConfig);
539
824
  return;
540
825
  }
541
826
 
542
- // Write to stub — effectiveCookie() will pick it up on next read
543
827
  stubResponse.headers.append(
544
828
  "Set-Cookie",
545
829
  serializeCookieValue(themeConfig.storageKey, theme, {
@@ -551,19 +835,29 @@ export function createRequestContext<TEnv>(
551
835
  invalidateResponseCookieCache();
552
836
  };
553
837
 
554
- // Build the context object first (without use), then add use
838
+ const cleanUrl = stripInternalParams(url);
839
+
555
840
  const ctx: RequestContext<TEnv> = {
556
841
  env,
557
842
  request,
558
- url,
843
+ url: cleanUrl,
844
+ originalUrl: new URL(request.url),
559
845
  pathname: url.pathname,
560
- searchParams: url.searchParams,
561
- var: variables,
562
- get: ((keyOrVar: any) =>
563
- contextGet(variables, keyOrVar)) as RequestContext<TEnv>["get"],
564
- set: ((keyOrVar: any, value: any) => {
846
+ searchParams: cleanUrl.searchParams,
847
+ _variables: variables,
848
+ get: ((keyOrVar: any) => {
849
+ if (isNonCacheable(variables, keyOrVar) && isInsideCacheScope()) {
850
+ throw new Error(
851
+ `ctx.get() for a non-cacheable variable cannot be called inside a cache() boundary. ` +
852
+ `The variable was created with { cache: false } or set with { cache: false }, ` +
853
+ `and its value would be stale on cache hit. Move the read outside the cached scope.`,
854
+ );
855
+ }
856
+ return contextGet(variables, keyOrVar);
857
+ }) as RequestContext<TEnv>["get"],
858
+ set: ((keyOrVar: any, value: any, options?: any) => {
565
859
  assertNotInsideCacheExec(ctx, "set");
566
- contextSet(variables, keyOrVar, value);
860
+ contextSet(variables, keyOrVar, value, options);
567
861
  }) as RequestContext<TEnv>["set"],
568
862
  params: {} as Record<string, string>,
569
863
 
@@ -601,6 +895,7 @@ export function createRequestContext<TEnv>(
601
895
 
602
896
  setCookie(name: string, value: string, options?: CookieOptions): void {
603
897
  assertNotInsideCacheExec(ctx, "setCookie");
898
+ assertNotInsideCacheScopeALS("setCookie");
604
899
  stubResponse.headers.append(
605
900
  "Set-Cookie",
606
901
  serializeCookieValue(name, value, options),
@@ -613,6 +908,7 @@ export function createRequestContext<TEnv>(
613
908
  options?: Pick<CookieOptions, "domain" | "path">,
614
909
  ): void {
615
910
  assertNotInsideCacheExec(ctx, "deleteCookie");
911
+ assertNotInsideCacheScopeALS("deleteCookie");
616
912
  stubResponse.headers.append(
617
913
  "Set-Cookie",
618
914
  serializeCookieValue(name, "", { ...options, maxAge: 0 }),
@@ -622,48 +918,115 @@ export function createRequestContext<TEnv>(
622
918
 
623
919
  header(name: string, value: string): void {
624
920
  assertNotInsideCacheExec(ctx, "header");
921
+ assertNotInsideCacheScopeALS("header");
625
922
  stubResponse.headers.set(name, value);
626
923
  },
627
924
 
925
+ // Rotate the rango state cookie for the responding client (the server seat
926
+ // of invalidateClientCache). Writes ONE Set-Cookie per request with the
927
+ // value {version}:{timestamp}; the `:` stays raw (the cookie-name.ts
928
+ // serializer), not the URL-encoded form serializeCookieValue would produce.
929
+ // The timestamp is strictly greater than the client's current one (inbound
930
+ // X-Rango-State), so a same-millisecond server rotation still differs from
931
+ // the client value and the divergence observer fires.
932
+ _rotateStateCookie(): void {
933
+ if (rangoStateRotated) return;
934
+ rangoStateRotated = true;
935
+ if (!stateCookieName) return;
936
+ // The client's current value, for the monotonic guard: prefer the
937
+ // X-Rango-State header (router navigation/prefetch fetches send it), but
938
+ // fall back to the request's rango state cookie — action POSTs / plain
939
+ // app fetch()s carry no router header yet DO send the cookie. Without the
940
+ // fallback, prevTs stays 0 and a same-ms mint can equal the client value,
941
+ // leaving the divergence observer silent. `|| null` so an empty header
942
+ // ('' from proxy normalization) falls through instead of short-circuiting.
943
+ // getRawCookieValue reads the cookie undecoded (the wire value
944
+ // decodeStateValue decodes exactly once) AND is the same parser the client
945
+ // mirror uses, so both seats read the same jar entry.
946
+ const prevRaw =
947
+ (request.headers.get("x-rango-state") || null) ??
948
+ getRawCookieValue(cookieHeader, stateCookieName);
949
+ const value = mintStateValue(stateVersion ?? "0", prevRaw);
950
+ stubResponse.headers.append(
951
+ "Set-Cookie",
952
+ serializeStateCookie(stateCookieName, value, url.protocol === "https:"),
953
+ );
954
+ invalidateResponseCookieCache();
955
+ },
956
+
957
+ // Set the keepClientCache() directive header. The action bridge reads it on
958
+ // the response and suppresses its automatic invalidation. `.set` makes this
959
+ // idempotent (one header regardless of call count).
960
+ _setKeepCacheDirective(): void {
961
+ stubResponse.headers.set(KEEP_CACHE_HEADER, "1");
962
+ },
963
+
628
964
  setStatus(status: number): void {
629
965
  assertNotInsideCacheExec(ctx, "setStatus");
630
- // Response.status is read-only, so we must create a new Response.
631
- // Headers are passed by reference — no cookie cache invalidation needed.
966
+ assertNotInsideCacheScopeALS("setStatus");
967
+ stubResponse = new Response(null, {
968
+ status,
969
+ headers: stubResponse.headers,
970
+ });
971
+ },
972
+
973
+ _setStatus(status: number): void {
632
974
  stubResponse = new Response(null, {
633
975
  status,
634
976
  headers: stubResponse.headers,
635
977
  });
636
978
  },
637
979
 
638
- // Placeholder - will be replaced below
639
980
  use: null as any,
640
981
 
641
982
  method: request.method,
642
983
 
643
984
  _handleStore: handleStore,
985
+ _transitionWhen: [],
644
986
  _cacheStore: cacheStore,
987
+ _explicitTaggedStores: explicitTaggedStores,
988
+ _requestTags: new Set<string>(),
645
989
  _cacheProfiles: cacheProfiles,
646
990
 
647
991
  waitUntil(fn: () => Promise<void>): void {
992
+ // Wrap in Promise.resolve().then(fn) so a SYNCHRONOUS throw in a
993
+ // non-async callback becomes a rejected promise handed to the host's
994
+ // waitUntil (logged as a background failure), instead of escaping into
995
+ // the request flow. Mirrors fireAndForgetWaitUntil's deferral.
996
+ const task = Promise.resolve().then(fn);
997
+ // Track the task promise so the PPR shell capture can settle the
998
+ // foreground's deferred cache writes before its own match/render (the
999
+ // ordering edge; see _pendingBackgroundTasks). The capture task itself
1000
+ // opts out via the marker — the drain must never await its own promise.
1001
+ if (
1002
+ !(fn as { [UNTRACKED_BACKGROUND_TASK]?: boolean })[
1003
+ UNTRACKED_BACKGROUND_TASK
1004
+ ]
1005
+ ) {
1006
+ ctx._pendingBackgroundTasks?.push(task);
1007
+ }
648
1008
  if (executionContext?.waitUntil) {
649
- // Cloudflare Workers: use native waitUntil
650
- executionContext.waitUntil(fn());
1009
+ executionContext.waitUntil(task);
651
1010
  } else {
652
- // Node.js / dev: fire-and-forget with error logging
653
- fn().catch((err) =>
1011
+ // Node/dev fallback: fire-and-forget with error logging (the same
1012
+ // policy fireAndForgetWaitUntil applies).
1013
+ task.catch((err) =>
654
1014
  console.error("[waitUntil] Background task failed:", err),
655
1015
  );
656
1016
  }
657
1017
  },
658
1018
 
1019
+ executionContext,
1020
+
659
1021
  _onResponseCallbacks: [],
1022
+ _pendingBackgroundTasks: [],
660
1023
 
661
1024
  onResponse(callback: (response: Response) => Response): void {
662
1025
  assertNotInsideCacheExec(ctx, "onResponse");
1026
+ assertNotInsideCacheScopeALS("onResponse");
663
1027
  this._onResponseCallbacks.push(callback);
664
1028
  },
665
1029
 
666
- // Theme properties (only set when themeConfig is provided)
667
1030
  get theme() {
668
1031
  return themeConfig ? getTheme() : undefined;
669
1032
  },
@@ -686,36 +1049,90 @@ export function createRequestContext<TEnv>(
686
1049
 
687
1050
  _reportedErrors: new WeakSet<object>(),
688
1051
  _metricsStore: undefined,
1052
+ _handlerStart: undefined,
1053
+
1054
+ _renderBarrier: null as any,
1055
+ _resolveRenderBarrier: null as any,
1056
+ _renderBarrierSegmentOrder: undefined,
689
1057
 
690
1058
  reverse: createReverseFunction(getGlobalRouteMap(), undefined, {}),
691
1059
  };
692
1060
 
693
- // Now create use() with access to ctx
1061
+ // Lazy allocation: only create Promise when a loader calls rendered().
1062
+ let barrierResolved = false;
1063
+ let resolveBarrier: (() => void) | undefined;
1064
+ ctx._renderBarrier = null as any;
1065
+ ctx._resolveRenderBarrier = (
1066
+ segments: Array<{ type: string; id: string }>,
1067
+ ) => {
1068
+ if (barrierResolved) return;
1069
+ barrierResolved = true;
1070
+ const segOrder = segments
1071
+ .filter((s) => s.type !== "loader")
1072
+ .map((s) => s.id);
1073
+ ctx._renderBarrierSegmentOrder = segOrder;
1074
+
1075
+ const closeGuard = () => {
1076
+ ctx._renderBarrierWaiters = undefined;
1077
+ ctx._handlerLoaderDeps = undefined;
1078
+ ctx._renderBarrierGuardClosed = true;
1079
+ };
1080
+
1081
+ if (ctx._treeHasStreaming) {
1082
+ handleStore.settled.then(closeGuard);
1083
+ } else {
1084
+ ctx._renderBarrierHandleSnapshot = buildHandleSnapshot(
1085
+ handleStore,
1086
+ segOrder,
1087
+ );
1088
+ closeGuard();
1089
+ }
1090
+ if (resolveBarrier) resolveBarrier();
1091
+ };
1092
+ Object.defineProperty(ctx, "_renderBarrier", {
1093
+ get() {
1094
+ const p = barrierResolved
1095
+ ? Promise.resolve()
1096
+ : new Promise<void>((resolve) => {
1097
+ resolveBarrier = resolve;
1098
+ });
1099
+ Object.defineProperty(ctx, "_renderBarrier", {
1100
+ value: p,
1101
+ writable: false,
1102
+ configurable: false,
1103
+ });
1104
+ return p;
1105
+ },
1106
+ configurable: true,
1107
+ });
1108
+
694
1109
  ctx.use = createUseFunction({
695
1110
  handleStore,
696
1111
  loaderPromises,
697
1112
  getContext: () => ctx,
698
1113
  });
699
1114
 
700
- // Brand with taint symbol so "use cache" excludes ctx from cache keys
701
1115
  (ctx as any)[NOCACHE_SYMBOL] = true;
702
1116
  return ctx;
703
1117
  }
704
1118
 
705
- /**
706
- * Parse Set-Cookie headers from a response into effective cookie state.
707
- * Returns a map of cookie name -> value (string) or name -> null (deleted).
708
- * Last-write-wins: later Set-Cookie entries for the same name overwrite earlier ones.
709
- * Max-Age=0 is treated as a delete.
710
- */
711
- const MAX_AGE_ZERO_RE = /;\s*Max-Age\s*=\s*0/i;
1119
+ // Capture the Max-Age value so it can be parsed numerically. A leading zero
1120
+ // (Max-Age=05) is a non-zero lifetime, not a deletion; only a value that parses
1121
+ // to <= 0 marks a cookie for deletion. Pattern-matching a leading "0" misread
1122
+ // zero-prefixed values like 05 / 010 as deletions.
1123
+ const MAX_AGE_RE = /;\s*Max-Age\s*=\s*(-?\d+)/i;
1124
+
1125
+ function isCookieDeletion(header: string): boolean {
1126
+ const m = MAX_AGE_RE.exec(header);
1127
+ if (!m) return false;
1128
+ return Number(m[1]) <= 0;
1129
+ }
712
1130
 
713
1131
  function parseResponseCookies(response: Response): Map<string, string | null> {
714
1132
  const result = new Map<string, string | null>();
715
1133
  const setCookies = response.headers.getSetCookie();
716
1134
 
717
1135
  for (const header of setCookies) {
718
- // First segment before ';' is the name=value pair
719
1136
  const semiIdx = header.indexOf(";");
720
1137
  const pair = semiIdx === -1 ? header : header.substring(0, semiIdx);
721
1138
  const eqIdx = pair.indexOf("=");
@@ -727,49 +1144,22 @@ function parseResponseCookies(response: Response): Map<string, string | null> {
727
1144
  name = decodeURIComponent(pair.substring(0, eqIdx).trim());
728
1145
  value = decodeURIComponent(pair.substring(eqIdx + 1).trim());
729
1146
  } catch {
730
- // Malformed encoding — skip this entry
731
1147
  continue;
732
1148
  }
733
1149
 
734
- // Max-Age=0 means the cookie is being deleted
735
- const isDeleted = MAX_AGE_ZERO_RE.test(header);
1150
+ const isDeleted = isCookieDeletion(header);
736
1151
  result.set(name, isDeleted ? null : value);
737
1152
  }
738
1153
 
739
1154
  return result;
740
1155
  }
741
1156
 
742
- /**
743
- * Parse cookies from Cookie header
744
- */
745
- function parseCookiesFromHeader(
746
- cookieHeader: string | null,
747
- ): Record<string, string> {
748
- if (!cookieHeader) return {};
749
-
750
- const cookies: Record<string, string> = {};
751
- const pairs = cookieHeader.split(";");
752
-
753
- for (const pair of pairs) {
754
- const [name, ...rest] = pair.trim().split("=");
755
- if (name) {
756
- const raw = rest.join("=");
757
- try {
758
- cookies[name] = decodeURIComponent(raw);
759
- } catch {
760
- // Malformed percent-encoded value (e.g. %zz, %2) - fall back to raw value
761
- cookies[name] = raw;
762
- }
763
- }
764
- }
765
-
766
- return cookies;
767
- }
1157
+ // Re-exported for unit tests and the existing import path. The implementation
1158
+ // lives in the dependency-free ./cookie-parse leaf so consumers (e.g. the host
1159
+ // dispatcher) can share it without pulling this module's request-context graph.
1160
+ export { parseCookiesFromHeader };
768
1161
 
769
- /**
770
- * Serialize a cookie for Set-Cookie header
771
- */
772
- function serializeCookieValue(
1162
+ export function serializeCookieValue(
773
1163
  name: string,
774
1164
  value: string,
775
1165
  options: CookieOptions = {},
@@ -796,20 +1186,12 @@ export interface CreateUseFunctionOptions<TEnv> {
796
1186
  getContext: () => RequestContext<TEnv>;
797
1187
  }
798
1188
 
799
- /**
800
- * Create the use() function for loader and handle composition.
801
- *
802
- * This is the unified implementation used by both RequestContext and HandlerContext.
803
- * - For loaders: executes and memoizes loader functions
804
- * - For handles: returns a push function to add handle data
805
- */
806
1189
  export function createUseFunction<TEnv>(
807
1190
  options: CreateUseFunctionOptions<TEnv>,
808
1191
  ): RequestContext["use"] {
809
1192
  const { handleStore, loaderPromises, getContext } = options;
810
1193
 
811
1194
  return ((item: LoaderDefinition<any, any> | Handle<any, any>) => {
812
- // Handle case: return a push function
813
1195
  if (isHandle(item)) {
814
1196
  const handle = item;
815
1197
  const ctx = getContext();
@@ -822,30 +1204,24 @@ export function createUseFunction<TEnv>(
822
1204
  );
823
1205
  }
824
1206
 
825
- // Return a push function bound to this handle and segment
826
- return (
827
- dataOrFn: unknown | Promise<unknown> | (() => Promise<unknown>),
828
- ) => {
829
- // If it's a function, call it immediately to get the promise
830
- const valueOrPromise =
831
- typeof dataOrFn === "function"
832
- ? (dataOrFn as () => Promise<unknown>)()
833
- : dataOrFn;
834
-
835
- // Push directly - promises will be serialized by RSC and streamed
836
- handleStore.push(handle.$$id, segmentId, valueOrPromise);
837
- };
1207
+ return withDefer(
1208
+ (dataOrFn: unknown | Promise<unknown> | (() => Promise<unknown>)) => {
1209
+ const valueOrPromise =
1210
+ typeof dataOrFn === "function"
1211
+ ? (dataOrFn as () => Promise<unknown>)()
1212
+ : dataOrFn;
1213
+
1214
+ handleStore.push(handle.$$id, segmentId, valueOrPromise);
1215
+ },
1216
+ );
838
1217
  }
839
1218
 
840
- // Loader case
841
1219
  const loader = item as LoaderDefinition<any, any>;
842
1220
 
843
- // Return cached promise if already started
844
1221
  if (loaderPromises.has(loader.$$id)) {
845
1222
  return loaderPromises.get(loader.$$id);
846
1223
  }
847
1224
 
848
- // Get loader function - either from loader object or fetchable registry
849
1225
  let loaderFn = loader.fn;
850
1226
  if (!loaderFn) {
851
1227
  const fetchable = getFetchableLoader(loader.$$id);
@@ -862,24 +1238,36 @@ export function createUseFunction<TEnv>(
862
1238
 
863
1239
  const ctx = getContext();
864
1240
 
865
- // Create loader context with recursive use() support
1241
+ // Build the typed ctx.search the same way the render path
1242
+ // (createHandlerContext) and the fetchable-loader path (loader-fetch.ts) do:
1243
+ // parse the route's search schema over the cleaned searchParams. The base
1244
+ // RequestContext carries no `search` field, so reading `(ctx as any).search`
1245
+ // here always yielded {} — dropping typed search for action/dispatch loaders.
1246
+ const searchSchema = ctx._routeName
1247
+ ? getSearchSchema(ctx._routeName)
1248
+ : undefined;
1249
+ const loaderSearch = searchSchema
1250
+ ? parseSearchParams(ctx.searchParams, searchSchema)
1251
+ : {};
1252
+
866
1253
  const loaderCtx: LoaderContext<Record<string, string | undefined>, TEnv> = {
867
1254
  params: ctx.params,
868
1255
  routeParams: (ctx.params ?? {}) as Record<string, string>,
869
1256
  request: ctx.request,
870
1257
  searchParams: ctx.searchParams,
871
- search: (ctx as any).search ?? {},
1258
+ search: loaderSearch,
872
1259
  pathname: ctx.pathname,
873
1260
  url: ctx.url,
1261
+ originalUrl: ctx.originalUrl,
874
1262
  env: ctx.env as any,
875
- var: ctx.var as any,
1263
+ waitUntil: ctx.waitUntil.bind(ctx),
1264
+ executionContext: ctx.executionContext,
876
1265
  get: ctx.get as any,
877
- use: <TDep, TDepParams = any>(
1266
+ use: (<TDep, TDepParams = any>(
878
1267
  dep: LoaderDefinition<TDep, TDepParams>,
879
1268
  ): Promise<TDep> => {
880
- // Recursive call - will start dep loader if not already started
881
1269
  return ctx.use(dep);
882
- },
1270
+ }) as LoaderContext["use"],
883
1271
  method: "GET",
884
1272
  body: undefined,
885
1273
  reverse: createReverseFunction(
@@ -888,15 +1276,22 @@ export function createUseFunction<TEnv>(
888
1276
  ctx.params as Record<string, string>,
889
1277
  ctx._routeName ? isRouteRootScoped(ctx._routeName) : undefined,
890
1278
  ),
1279
+ rendered: () => {
1280
+ throw new Error(
1281
+ `ctx.rendered() is only available in DSL loaders (registered via loader() in urls()). ` +
1282
+ `It cannot be used from request-context loaders or server actions.`,
1283
+ );
1284
+ },
891
1285
  };
892
1286
 
893
- // Start loader execution with tracking
894
- const doneLoader = track(`loader:${loader.$$id}`, 2);
895
- const promise = Promise.resolve(loaderFn(loaderCtx)).finally(() => {
896
- doneLoader();
897
- });
1287
+ // Meter through the same unified phase API as the loader-resolution funnel
1288
+ // (observePhase), so a loader resolved via this base request-context ctx.use
1289
+ // co-emits the "loader:<id>" perf metric AND the "rango.loader" span — no
1290
+ // drift between the two ctx.use implementations.
1291
+ const promise = observePhase(PHASES.loader(loader.$$id), () =>
1292
+ Promise.resolve(loaderFn(loaderCtx)),
1293
+ );
898
1294
 
899
- // Memoize for subsequent calls
900
1295
  loaderPromises.set(loader.$$id, promise);
901
1296
 
902
1297
  return promise;