@rangojs/router 0.0.0-experimental.12 → 0.0.0-experimental.120

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 (1150) hide show
  1. package/AGENTS.md +9 -0
  2. package/README.md +1037 -4
  3. package/dist/__internal.d.ts +83 -0
  4. package/dist/__internal.d.ts.map +1 -0
  5. package/dist/__internal.js +19 -0
  6. package/dist/__internal.js.map +1 -0
  7. package/dist/__mocks__/version.d.ts +7 -0
  8. package/dist/__mocks__/version.d.ts.map +1 -0
  9. package/dist/__mocks__/version.js +7 -0
  10. package/dist/__mocks__/version.js.map +1 -0
  11. package/dist/__tests__/client-href.test.d.ts +2 -0
  12. package/dist/__tests__/client-href.test.d.ts.map +1 -0
  13. package/dist/__tests__/client-href.test.js +74 -0
  14. package/dist/__tests__/client-href.test.js.map +1 -0
  15. package/dist/__tests__/component-utils.test.d.ts +2 -0
  16. package/dist/__tests__/component-utils.test.d.ts.map +1 -0
  17. package/dist/__tests__/component-utils.test.js +51 -0
  18. package/dist/__tests__/component-utils.test.js.map +1 -0
  19. package/dist/__tests__/event-controller.test.d.ts +2 -0
  20. package/dist/__tests__/event-controller.test.d.ts.map +1 -0
  21. package/dist/__tests__/event-controller.test.js +538 -0
  22. package/dist/__tests__/event-controller.test.js.map +1 -0
  23. package/dist/__tests__/helpers/route-tree.d.ts +118 -0
  24. package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
  25. package/dist/__tests__/helpers/route-tree.js +374 -0
  26. package/dist/__tests__/helpers/route-tree.js.map +1 -0
  27. package/dist/__tests__/match-result.test.d.ts +2 -0
  28. package/dist/__tests__/match-result.test.d.ts.map +1 -0
  29. package/dist/__tests__/match-result.test.js +154 -0
  30. package/dist/__tests__/match-result.test.js.map +1 -0
  31. package/dist/__tests__/navigation-store.test.d.ts +2 -0
  32. package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
  33. package/dist/__tests__/navigation-store.test.js +440 -0
  34. package/dist/__tests__/navigation-store.test.js.map +1 -0
  35. package/dist/__tests__/partial-update.test.d.ts +2 -0
  36. package/dist/__tests__/partial-update.test.d.ts.map +1 -0
  37. package/dist/__tests__/partial-update.test.js +1009 -0
  38. package/dist/__tests__/partial-update.test.js.map +1 -0
  39. package/dist/__tests__/reverse-types.test.d.ts +8 -0
  40. package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
  41. package/dist/__tests__/reverse-types.test.js +656 -0
  42. package/dist/__tests__/reverse-types.test.js.map +1 -0
  43. package/dist/__tests__/route-definition.test.d.ts +2 -0
  44. package/dist/__tests__/route-definition.test.d.ts.map +1 -0
  45. package/dist/__tests__/route-definition.test.js +55 -0
  46. package/dist/__tests__/route-definition.test.js.map +1 -0
  47. package/dist/__tests__/router-helpers.test.d.ts +2 -0
  48. package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
  49. package/dist/__tests__/router-helpers.test.js +377 -0
  50. package/dist/__tests__/router-helpers.test.js.map +1 -0
  51. package/dist/__tests__/router-integration-2.test.d.ts +2 -0
  52. package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
  53. package/dist/__tests__/router-integration-2.test.js +426 -0
  54. package/dist/__tests__/router-integration-2.test.js.map +1 -0
  55. package/dist/__tests__/router-integration.test.d.ts +2 -0
  56. package/dist/__tests__/router-integration.test.d.ts.map +1 -0
  57. package/dist/__tests__/router-integration.test.js +1051 -0
  58. package/dist/__tests__/router-integration.test.js.map +1 -0
  59. package/dist/__tests__/search-params.test.d.ts +5 -0
  60. package/dist/__tests__/search-params.test.d.ts.map +1 -0
  61. package/dist/__tests__/search-params.test.js +306 -0
  62. package/dist/__tests__/search-params.test.js.map +1 -0
  63. package/dist/__tests__/segment-system.test.d.ts +2 -0
  64. package/dist/__tests__/segment-system.test.d.ts.map +1 -0
  65. package/dist/__tests__/segment-system.test.js +627 -0
  66. package/dist/__tests__/segment-system.test.js.map +1 -0
  67. package/dist/__tests__/static-handler-types.test.d.ts +8 -0
  68. package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
  69. package/dist/__tests__/static-handler-types.test.js +63 -0
  70. package/dist/__tests__/static-handler-types.test.js.map +1 -0
  71. package/dist/__tests__/urls.test.d.ts +2 -0
  72. package/dist/__tests__/urls.test.d.ts.map +1 -0
  73. package/dist/__tests__/urls.test.js +421 -0
  74. package/dist/__tests__/urls.test.js.map +1 -0
  75. package/dist/__tests__/use-mount.test.d.ts +2 -0
  76. package/dist/__tests__/use-mount.test.d.ts.map +1 -0
  77. package/dist/__tests__/use-mount.test.js +35 -0
  78. package/dist/__tests__/use-mount.test.js.map +1 -0
  79. package/dist/bin/rango.d.ts +2 -0
  80. package/dist/bin/rango.d.ts.map +1 -0
  81. package/dist/bin/rango.js +1704 -212
  82. package/dist/bin/rango.js.map +1 -0
  83. package/dist/browser/event-controller.d.ts +191 -0
  84. package/dist/browser/event-controller.d.ts.map +1 -0
  85. package/dist/browser/event-controller.js +559 -0
  86. package/dist/browser/event-controller.js.map +1 -0
  87. package/dist/browser/index.d.ts +2 -0
  88. package/dist/browser/index.d.ts.map +1 -0
  89. package/dist/browser/index.js +14 -0
  90. package/dist/browser/index.js.map +1 -0
  91. package/dist/browser/link-interceptor.d.ts +38 -0
  92. package/dist/browser/link-interceptor.d.ts.map +1 -0
  93. package/dist/browser/link-interceptor.js +99 -0
  94. package/dist/browser/link-interceptor.js.map +1 -0
  95. package/dist/browser/logging.d.ts +10 -0
  96. package/dist/browser/logging.d.ts.map +1 -0
  97. package/dist/browser/logging.js +29 -0
  98. package/dist/browser/logging.js.map +1 -0
  99. package/dist/browser/lru-cache.d.ts +17 -0
  100. package/dist/browser/lru-cache.d.ts.map +1 -0
  101. package/dist/browser/lru-cache.js +50 -0
  102. package/dist/browser/lru-cache.js.map +1 -0
  103. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  104. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  105. package/dist/browser/merge-segment-loaders.js +102 -0
  106. package/dist/browser/merge-segment-loaders.js.map +1 -0
  107. package/dist/browser/navigation-bridge.d.ts +102 -0
  108. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  109. package/dist/browser/navigation-bridge.js +708 -0
  110. package/dist/browser/navigation-bridge.js.map +1 -0
  111. package/dist/browser/navigation-client.d.ts +25 -0
  112. package/dist/browser/navigation-client.d.ts.map +1 -0
  113. package/dist/browser/navigation-client.js +157 -0
  114. package/dist/browser/navigation-client.js.map +1 -0
  115. package/dist/browser/navigation-store.d.ts +101 -0
  116. package/dist/browser/navigation-store.d.ts.map +1 -0
  117. package/dist/browser/navigation-store.js +625 -0
  118. package/dist/browser/navigation-store.js.map +1 -0
  119. package/dist/browser/partial-update.d.ts +75 -0
  120. package/dist/browser/partial-update.d.ts.map +1 -0
  121. package/dist/browser/partial-update.js +426 -0
  122. package/dist/browser/partial-update.js.map +1 -0
  123. package/dist/browser/react/Link.d.ts +86 -0
  124. package/dist/browser/react/Link.d.ts.map +1 -0
  125. package/dist/browser/react/Link.js +128 -0
  126. package/dist/browser/react/Link.js.map +1 -0
  127. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  128. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  129. package/dist/browser/react/NavigationProvider.js +216 -0
  130. package/dist/browser/react/NavigationProvider.js.map +1 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  132. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  133. package/dist/browser/react/ScrollRestoration.js +57 -0
  134. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  135. package/dist/browser/react/context.d.ts +46 -0
  136. package/dist/browser/react/context.d.ts.map +1 -0
  137. package/dist/browser/react/context.js +10 -0
  138. package/dist/browser/react/context.js.map +1 -0
  139. package/dist/browser/react/index.d.ts +11 -0
  140. package/dist/browser/react/index.d.ts.map +1 -0
  141. package/dist/browser/react/index.js +22 -0
  142. package/dist/browser/react/index.js.map +1 -0
  143. package/dist/browser/react/location-state-shared.d.ts +63 -0
  144. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  145. package/dist/browser/react/location-state-shared.js +81 -0
  146. package/dist/browser/react/location-state-shared.js.map +1 -0
  147. package/dist/browser/react/location-state.d.ts +23 -0
  148. package/dist/browser/react/location-state.d.ts.map +1 -0
  149. package/dist/browser/react/location-state.js +29 -0
  150. package/dist/browser/react/location-state.js.map +1 -0
  151. package/dist/browser/react/mount-context.d.ts +24 -0
  152. package/dist/browser/react/mount-context.d.ts.map +1 -0
  153. package/dist/browser/react/mount-context.js +24 -0
  154. package/dist/browser/react/mount-context.js.map +1 -0
  155. package/dist/browser/react/use-action.d.ts +64 -0
  156. package/dist/browser/react/use-action.d.ts.map +1 -0
  157. package/dist/browser/react/use-action.js +134 -0
  158. package/dist/browser/react/use-action.js.map +1 -0
  159. package/dist/browser/react/use-client-cache.d.ts +41 -0
  160. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  161. package/dist/browser/react/use-client-cache.js +39 -0
  162. package/dist/browser/react/use-client-cache.js.map +1 -0
  163. package/dist/browser/react/use-handle.d.ts +31 -0
  164. package/dist/browser/react/use-handle.d.ts.map +1 -0
  165. package/dist/browser/react/use-handle.js +144 -0
  166. package/dist/browser/react/use-handle.js.map +1 -0
  167. package/dist/browser/react/use-href.d.ts +33 -0
  168. package/dist/browser/react/use-href.d.ts.map +1 -0
  169. package/dist/browser/react/use-href.js +39 -0
  170. package/dist/browser/react/use-href.js.map +1 -0
  171. package/dist/browser/react/use-link-status.d.ts +37 -0
  172. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  173. package/dist/browser/react/use-link-status.js +99 -0
  174. package/dist/browser/react/use-link-status.js.map +1 -0
  175. package/dist/browser/react/use-mount.d.ts +25 -0
  176. package/dist/browser/react/use-mount.d.ts.map +1 -0
  177. package/dist/browser/react/use-mount.js +30 -0
  178. package/dist/browser/react/use-mount.js.map +1 -0
  179. package/dist/browser/react/use-navigation.d.ts +27 -0
  180. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  181. package/dist/browser/react/use-navigation.js +87 -0
  182. package/dist/browser/react/use-navigation.js.map +1 -0
  183. package/dist/browser/react/use-segments.d.ts +38 -0
  184. package/dist/browser/react/use-segments.d.ts.map +1 -0
  185. package/dist/browser/react/use-segments.js +130 -0
  186. package/dist/browser/react/use-segments.js.map +1 -0
  187. package/dist/browser/request-controller.d.ts +26 -0
  188. package/dist/browser/request-controller.d.ts.map +1 -0
  189. package/dist/browser/request-controller.js +147 -0
  190. package/dist/browser/request-controller.js.map +1 -0
  191. package/dist/browser/rsc-router.d.ts +129 -0
  192. package/dist/browser/rsc-router.d.ts.map +1 -0
  193. package/dist/browser/rsc-router.js +195 -0
  194. package/dist/browser/rsc-router.js.map +1 -0
  195. package/dist/browser/scroll-restoration.d.ts +93 -0
  196. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  197. package/dist/browser/scroll-restoration.js +321 -0
  198. package/dist/browser/scroll-restoration.js.map +1 -0
  199. package/dist/browser/segment-structure-assert.d.ts +17 -0
  200. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  201. package/dist/browser/segment-structure-assert.js +59 -0
  202. package/dist/browser/segment-structure-assert.js.map +1 -0
  203. package/dist/browser/server-action-bridge.d.ts +26 -0
  204. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  205. package/dist/browser/server-action-bridge.js +668 -0
  206. package/dist/browser/server-action-bridge.js.map +1 -0
  207. package/dist/browser/shallow.d.ts +12 -0
  208. package/dist/browser/shallow.d.ts.map +1 -0
  209. package/dist/browser/shallow.js +34 -0
  210. package/dist/browser/shallow.js.map +1 -0
  211. package/dist/browser/types.d.ts +369 -0
  212. package/dist/browser/types.d.ts.map +1 -0
  213. package/dist/browser/types.js +2 -0
  214. package/dist/browser/types.js.map +1 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  216. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  217. package/dist/build/__tests__/generate-cli.test.js +237 -0
  218. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  220. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  221. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  222. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  224. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  225. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  226. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  228. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  230. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  231. package/dist/build/generate-manifest.d.ts +81 -0
  232. package/dist/build/generate-manifest.d.ts.map +1 -0
  233. package/dist/build/generate-manifest.js +276 -0
  234. package/dist/build/generate-manifest.js.map +1 -0
  235. package/dist/build/generate-route-types.d.ts +115 -0
  236. package/dist/build/generate-route-types.d.ts.map +1 -0
  237. package/dist/build/generate-route-types.js +740 -0
  238. package/dist/build/generate-route-types.js.map +1 -0
  239. package/dist/build/index.d.ts +21 -0
  240. package/dist/build/index.d.ts.map +1 -0
  241. package/dist/build/index.js +21 -0
  242. package/dist/build/index.js.map +1 -0
  243. package/dist/build/route-trie.d.ts +71 -0
  244. package/dist/build/route-trie.d.ts.map +1 -0
  245. package/dist/build/route-trie.js +175 -0
  246. package/dist/build/route-trie.js.map +1 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  248. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  249. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  250. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  252. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  253. package/dist/cache/__tests__/document-cache.test.js +345 -0
  254. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  258. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  260. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  261. package/dist/cache/__tests__/memory-store.test.js +367 -0
  262. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  263. package/dist/cache/cache-scope.d.ts +102 -0
  264. package/dist/cache/cache-scope.d.ts.map +1 -0
  265. package/dist/cache/cache-scope.js +440 -0
  266. package/dist/cache/cache-scope.js.map +1 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  270. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  272. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  273. package/dist/cache/cf/cf-cache-store.js +242 -0
  274. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  275. package/dist/cache/cf/index.d.ts +14 -0
  276. package/dist/cache/cf/index.d.ts.map +1 -0
  277. package/dist/cache/cf/index.js +17 -0
  278. package/dist/cache/cf/index.js.map +1 -0
  279. package/dist/cache/document-cache.d.ts +64 -0
  280. package/dist/cache/document-cache.d.ts.map +1 -0
  281. package/dist/cache/document-cache.js +228 -0
  282. package/dist/cache/document-cache.js.map +1 -0
  283. package/dist/cache/index.d.ts +19 -0
  284. package/dist/cache/index.d.ts.map +1 -0
  285. package/dist/cache/index.js +21 -0
  286. package/dist/cache/index.js.map +1 -0
  287. package/dist/cache/memory-segment-store.d.ts +110 -0
  288. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  289. package/dist/cache/memory-segment-store.js +117 -0
  290. package/dist/cache/memory-segment-store.js.map +1 -0
  291. package/dist/cache/memory-store.d.ts +41 -0
  292. package/dist/cache/memory-store.d.ts.map +1 -0
  293. package/dist/cache/memory-store.js +191 -0
  294. package/dist/cache/memory-store.js.map +1 -0
  295. package/dist/cache/types.d.ts +317 -0
  296. package/dist/cache/types.d.ts.map +1 -0
  297. package/dist/cache/types.js +12 -0
  298. package/dist/cache/types.js.map +1 -0
  299. package/dist/client.d.ts +248 -0
  300. package/dist/client.d.ts.map +1 -0
  301. package/dist/client.js +367 -0
  302. package/dist/client.js.map +1 -0
  303. package/dist/client.rsc.d.ts +26 -0
  304. package/dist/client.rsc.d.ts.map +1 -0
  305. package/dist/client.rsc.js +46 -0
  306. package/dist/client.rsc.js.map +1 -0
  307. package/dist/component-utils.d.ts +36 -0
  308. package/dist/component-utils.d.ts.map +1 -0
  309. package/dist/component-utils.js +61 -0
  310. package/dist/component-utils.js.map +1 -0
  311. package/dist/components/DefaultDocument.d.ts +13 -0
  312. package/dist/components/DefaultDocument.d.ts.map +1 -0
  313. package/dist/components/DefaultDocument.js +15 -0
  314. package/dist/components/DefaultDocument.js.map +1 -0
  315. package/dist/debug.d.ts +58 -0
  316. package/dist/debug.d.ts.map +1 -0
  317. package/dist/debug.js +157 -0
  318. package/dist/debug.js.map +1 -0
  319. package/dist/default-error-boundary.d.ts +11 -0
  320. package/dist/default-error-boundary.d.ts.map +1 -0
  321. package/dist/default-error-boundary.js +45 -0
  322. package/dist/default-error-boundary.js.map +1 -0
  323. package/dist/deps/browser.d.ts +2 -0
  324. package/dist/deps/browser.d.ts.map +1 -0
  325. package/dist/deps/browser.js +3 -0
  326. package/dist/deps/browser.js.map +1 -0
  327. package/dist/deps/html-stream-client.d.ts +2 -0
  328. package/dist/deps/html-stream-client.d.ts.map +1 -0
  329. package/dist/deps/html-stream-client.js +3 -0
  330. package/dist/deps/html-stream-client.js.map +1 -0
  331. package/dist/deps/html-stream-server.d.ts +2 -0
  332. package/dist/deps/html-stream-server.d.ts.map +1 -0
  333. package/dist/deps/html-stream-server.js +3 -0
  334. package/dist/deps/html-stream-server.js.map +1 -0
  335. package/dist/deps/rsc.d.ts +2 -0
  336. package/dist/deps/rsc.d.ts.map +1 -0
  337. package/dist/deps/rsc.js +4 -0
  338. package/dist/deps/rsc.js.map +1 -0
  339. package/dist/deps/ssr.d.ts +2 -0
  340. package/dist/deps/ssr.d.ts.map +1 -0
  341. package/dist/deps/ssr.js +3 -0
  342. package/dist/deps/ssr.js.map +1 -0
  343. package/dist/errors.d.ts +174 -0
  344. package/dist/errors.d.ts.map +1 -0
  345. package/dist/errors.js +241 -0
  346. package/dist/errors.js.map +1 -0
  347. package/dist/handle.d.ts +78 -0
  348. package/dist/handle.d.ts.map +1 -0
  349. package/dist/handle.js +82 -0
  350. package/dist/handle.js.map +1 -0
  351. package/dist/handles/MetaTags.d.ts +14 -0
  352. package/dist/handles/MetaTags.d.ts.map +1 -0
  353. package/dist/handles/MetaTags.js +136 -0
  354. package/dist/handles/MetaTags.js.map +1 -0
  355. package/dist/handles/index.d.ts +6 -0
  356. package/dist/handles/index.d.ts.map +1 -0
  357. package/dist/handles/index.js +6 -0
  358. package/dist/handles/index.js.map +1 -0
  359. package/dist/handles/meta.d.ts +39 -0
  360. package/dist/handles/meta.d.ts.map +1 -0
  361. package/dist/handles/meta.js +202 -0
  362. package/dist/handles/meta.js.map +1 -0
  363. package/dist/host/__tests__/errors.test.d.ts +2 -0
  364. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  365. package/dist/host/__tests__/errors.test.js +76 -0
  366. package/dist/host/__tests__/errors.test.js.map +1 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  370. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  372. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  374. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  375. package/dist/host/__tests__/router.test.d.ts +2 -0
  376. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  377. package/dist/host/__tests__/router.test.js +241 -0
  378. package/dist/host/__tests__/router.test.js.map +1 -0
  379. package/dist/host/__tests__/testing.test.d.ts +2 -0
  380. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  381. package/dist/host/__tests__/testing.test.js +64 -0
  382. package/dist/host/__tests__/testing.test.js.map +1 -0
  383. package/dist/host/__tests__/utils.test.d.ts +2 -0
  384. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  385. package/dist/host/__tests__/utils.test.js +29 -0
  386. package/dist/host/__tests__/utils.test.js.map +1 -0
  387. package/dist/host/cookie-handler.d.ts +34 -0
  388. package/dist/host/cookie-handler.d.ts.map +1 -0
  389. package/dist/host/cookie-handler.js +124 -0
  390. package/dist/host/cookie-handler.js.map +1 -0
  391. package/dist/host/errors.d.ts +56 -0
  392. package/dist/host/errors.d.ts.map +1 -0
  393. package/dist/host/errors.js +79 -0
  394. package/dist/host/errors.js.map +1 -0
  395. package/dist/host/index.d.ts +29 -0
  396. package/dist/host/index.d.ts.map +1 -0
  397. package/dist/host/index.js +32 -0
  398. package/dist/host/index.js.map +1 -0
  399. package/dist/host/pattern-matcher.d.ts +36 -0
  400. package/dist/host/pattern-matcher.d.ts.map +1 -0
  401. package/dist/host/pattern-matcher.js +172 -0
  402. package/dist/host/pattern-matcher.js.map +1 -0
  403. package/dist/host/router.d.ts +26 -0
  404. package/dist/host/router.d.ts.map +1 -0
  405. package/dist/host/router.js +218 -0
  406. package/dist/host/router.js.map +1 -0
  407. package/dist/host/testing.d.ts +36 -0
  408. package/dist/host/testing.d.ts.map +1 -0
  409. package/dist/host/testing.js +55 -0
  410. package/dist/host/testing.js.map +1 -0
  411. package/dist/host/types.d.ts +115 -0
  412. package/dist/host/types.d.ts.map +1 -0
  413. package/dist/host/types.js +7 -0
  414. package/dist/host/types.js.map +1 -0
  415. package/dist/host/utils.d.ts +21 -0
  416. package/dist/host/utils.d.ts.map +1 -0
  417. package/dist/host/utils.js +23 -0
  418. package/dist/host/utils.js.map +1 -0
  419. package/dist/href-client.d.ts +131 -0
  420. package/dist/href-client.d.ts.map +1 -0
  421. package/dist/href-client.js +64 -0
  422. package/dist/href-client.js.map +1 -0
  423. package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
  424. package/dist/href-context.d.ts.map +1 -0
  425. package/dist/href-context.js +21 -0
  426. package/dist/href-context.js.map +1 -0
  427. package/dist/index.d.ts +73 -0
  428. package/dist/index.d.ts.map +1 -0
  429. package/dist/index.js +91 -0
  430. package/dist/index.js.map +1 -0
  431. package/dist/index.rsc.d.ts +32 -0
  432. package/dist/index.rsc.d.ts.map +1 -0
  433. package/dist/index.rsc.js +40 -0
  434. package/dist/index.rsc.js.map +1 -0
  435. package/dist/internal-debug.d.ts +2 -0
  436. package/dist/internal-debug.d.ts.map +1 -0
  437. package/dist/internal-debug.js +5 -0
  438. package/dist/internal-debug.js.map +1 -0
  439. package/dist/loader.d.ts +14 -0
  440. package/dist/loader.d.ts.map +1 -0
  441. package/dist/loader.js +20 -0
  442. package/dist/loader.js.map +1 -0
  443. package/dist/loader.rsc.d.ts +19 -0
  444. package/dist/loader.rsc.d.ts.map +1 -0
  445. package/dist/loader.rsc.js +99 -0
  446. package/dist/loader.rsc.js.map +1 -0
  447. package/dist/network-error-thrower.d.ts +17 -0
  448. package/dist/network-error-thrower.d.ts.map +1 -0
  449. package/dist/network-error-thrower.js +14 -0
  450. package/dist/network-error-thrower.js.map +1 -0
  451. package/dist/outlet-context.d.ts +13 -0
  452. package/dist/outlet-context.d.ts.map +1 -0
  453. package/dist/outlet-context.js +3 -0
  454. package/dist/outlet-context.js.map +1 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  456. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  457. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  458. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  459. package/dist/prerender/param-hash.d.ts +16 -0
  460. package/dist/prerender/param-hash.d.ts.map +1 -0
  461. package/dist/prerender/param-hash.js +36 -0
  462. package/dist/prerender/param-hash.js.map +1 -0
  463. package/dist/prerender/store.d.ts +38 -0
  464. package/dist/prerender/store.d.ts.map +1 -0
  465. package/dist/prerender/store.js +61 -0
  466. package/dist/prerender/store.js.map +1 -0
  467. package/dist/prerender.d.ts +66 -0
  468. package/dist/prerender.d.ts.map +1 -0
  469. package/dist/prerender.js +57 -0
  470. package/dist/prerender.js.map +1 -0
  471. package/dist/reverse.d.ts +196 -0
  472. package/dist/reverse.d.ts.map +1 -0
  473. package/dist/reverse.js +78 -0
  474. package/dist/reverse.js.map +1 -0
  475. package/dist/root-error-boundary.d.ts +33 -0
  476. package/dist/root-error-boundary.d.ts.map +1 -0
  477. package/dist/root-error-boundary.js +165 -0
  478. package/dist/root-error-boundary.js.map +1 -0
  479. package/dist/route-content-wrapper.d.ts +46 -0
  480. package/dist/route-content-wrapper.d.ts.map +1 -0
  481. package/dist/route-content-wrapper.js +77 -0
  482. package/dist/route-content-wrapper.js.map +1 -0
  483. package/dist/route-definition.d.ts +421 -0
  484. package/dist/route-definition.d.ts.map +1 -0
  485. package/dist/route-definition.js +868 -0
  486. package/dist/route-definition.js.map +1 -0
  487. package/dist/route-map-builder.d.ts +155 -0
  488. package/dist/route-map-builder.d.ts.map +1 -0
  489. package/dist/route-map-builder.js +237 -0
  490. package/dist/route-map-builder.js.map +1 -0
  491. package/dist/route-types.d.ts +165 -0
  492. package/dist/route-types.d.ts.map +1 -0
  493. package/dist/route-types.js +7 -0
  494. package/dist/route-types.js.map +1 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  496. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  497. package/dist/router/__tests__/handler-context.test.js +65 -0
  498. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  502. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  503. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  504. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  505. package/dist/router/__tests__/match-context.test.js +92 -0
  506. package/dist/router/__tests__/match-context.test.js.map +1 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  508. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  509. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  510. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  511. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  512. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  513. package/dist/router/__tests__/match-result.test.js +457 -0
  514. package/dist/router/__tests__/match-result.test.js.map +1 -0
  515. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  516. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  517. package/dist/router/__tests__/on-error.test.js +678 -0
  518. package/dist/router/__tests__/on-error.test.js.map +1 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  520. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  521. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  522. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  526. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  527. package/dist/router/error-handling.d.ts +77 -0
  528. package/dist/router/error-handling.d.ts.map +1 -0
  529. package/dist/router/error-handling.js +202 -0
  530. package/dist/router/error-handling.js.map +1 -0
  531. package/dist/router/handler-context.d.ts +20 -0
  532. package/dist/router/handler-context.d.ts.map +1 -0
  533. package/dist/router/handler-context.js +198 -0
  534. package/dist/router/handler-context.js.map +1 -0
  535. package/dist/router/intercept-resolution.d.ts +66 -0
  536. package/dist/router/intercept-resolution.d.ts.map +1 -0
  537. package/dist/router/intercept-resolution.js +246 -0
  538. package/dist/router/intercept-resolution.js.map +1 -0
  539. package/dist/router/loader-resolution.d.ts +64 -0
  540. package/dist/router/loader-resolution.d.ts.map +1 -0
  541. package/dist/router/loader-resolution.js +284 -0
  542. package/dist/router/loader-resolution.js.map +1 -0
  543. package/dist/router/logging.d.ts +15 -0
  544. package/dist/router/logging.d.ts.map +1 -0
  545. package/dist/router/logging.js +99 -0
  546. package/dist/router/logging.js.map +1 -0
  547. package/dist/router/manifest.d.ts +22 -0
  548. package/dist/router/manifest.d.ts.map +1 -0
  549. package/dist/router/manifest.js +181 -0
  550. package/dist/router/manifest.js.map +1 -0
  551. package/dist/router/match-api.d.ts +35 -0
  552. package/dist/router/match-api.d.ts.map +1 -0
  553. package/dist/router/match-api.js +406 -0
  554. package/dist/router/match-api.js.map +1 -0
  555. package/dist/router/match-context.d.ts +206 -0
  556. package/dist/router/match-context.d.ts.map +1 -0
  557. package/dist/router/match-context.js +17 -0
  558. package/dist/router/match-context.js.map +1 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  560. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  561. package/dist/router/match-middleware/background-revalidation.js +75 -0
  562. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  564. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  565. package/dist/router/match-middleware/cache-lookup.js +257 -0
  566. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  567. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  568. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  569. package/dist/router/match-middleware/cache-store.js +108 -0
  570. package/dist/router/match-middleware/cache-store.js.map +1 -0
  571. package/dist/router/match-middleware/index.d.ts +81 -0
  572. package/dist/router/match-middleware/index.d.ts.map +1 -0
  573. package/dist/router/match-middleware/index.js +80 -0
  574. package/dist/router/match-middleware/index.js.map +1 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  576. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  577. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  578. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  580. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  581. package/dist/router/match-middleware/segment-resolution.js +53 -0
  582. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  583. package/dist/router/match-pipelines.d.ts +147 -0
  584. package/dist/router/match-pipelines.d.ts.map +1 -0
  585. package/dist/router/match-pipelines.js +82 -0
  586. package/dist/router/match-pipelines.js.map +1 -0
  587. package/dist/router/match-result.d.ts +126 -0
  588. package/dist/router/match-result.d.ts.map +1 -0
  589. package/dist/router/match-result.js +93 -0
  590. package/dist/router/match-result.js.map +1 -0
  591. package/dist/router/metrics.d.ts +20 -0
  592. package/dist/router/metrics.d.ts.map +1 -0
  593. package/dist/router/metrics.js +47 -0
  594. package/dist/router/metrics.js.map +1 -0
  595. package/dist/router/middleware.d.ts +249 -0
  596. package/dist/router/middleware.d.ts.map +1 -0
  597. package/dist/router/middleware.js +434 -0
  598. package/dist/router/middleware.js.map +1 -0
  599. package/dist/router/middleware.test.d.ts +2 -0
  600. package/dist/router/middleware.test.d.ts.map +1 -0
  601. package/dist/router/middleware.test.js +816 -0
  602. package/dist/router/middleware.test.js.map +1 -0
  603. package/dist/router/pattern-matching.d.ts +149 -0
  604. package/dist/router/pattern-matching.d.ts.map +1 -0
  605. package/dist/router/pattern-matching.js +349 -0
  606. package/dist/router/pattern-matching.js.map +1 -0
  607. package/dist/router/revalidation.d.ts +44 -0
  608. package/dist/router/revalidation.d.ts.map +1 -0
  609. package/dist/router/revalidation.js +147 -0
  610. package/dist/router/revalidation.js.map +1 -0
  611. package/dist/router/router-context.d.ts +135 -0
  612. package/dist/router/router-context.d.ts.map +1 -0
  613. package/dist/router/router-context.js +36 -0
  614. package/dist/router/router-context.js.map +1 -0
  615. package/dist/router/segment-resolution.d.ts +127 -0
  616. package/dist/router/segment-resolution.d.ts.map +1 -0
  617. package/dist/router/segment-resolution.js +919 -0
  618. package/dist/router/segment-resolution.js.map +1 -0
  619. package/dist/router/trie-matching.d.ts +40 -0
  620. package/dist/router/trie-matching.d.ts.map +1 -0
  621. package/dist/router/trie-matching.js +127 -0
  622. package/dist/router/trie-matching.js.map +1 -0
  623. package/dist/router/types.d.ts +136 -0
  624. package/dist/router/types.d.ts.map +1 -0
  625. package/dist/router/types.js +7 -0
  626. package/dist/router/types.js.map +1 -0
  627. package/dist/router.d.ts +753 -0
  628. package/dist/router.d.ts.map +1 -0
  629. package/dist/router.gen.d.ts +6 -0
  630. package/dist/router.gen.d.ts.map +1 -0
  631. package/dist/router.gen.js +6 -0
  632. package/dist/router.gen.js.map +1 -0
  633. package/dist/router.js +1304 -0
  634. package/dist/router.js.map +1 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  636. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  637. package/dist/rsc/__tests__/helpers.test.js +140 -0
  638. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  639. package/dist/rsc/handler.d.ts +45 -0
  640. package/dist/rsc/handler.d.ts.map +1 -0
  641. package/dist/rsc/handler.js +1172 -0
  642. package/dist/rsc/handler.js.map +1 -0
  643. package/dist/rsc/helpers.d.ts +16 -0
  644. package/dist/rsc/helpers.d.ts.map +1 -0
  645. package/dist/rsc/helpers.js +55 -0
  646. package/dist/rsc/helpers.js.map +1 -0
  647. package/dist/rsc/index.d.ts +22 -0
  648. package/dist/rsc/index.d.ts.map +1 -0
  649. package/dist/rsc/index.js +23 -0
  650. package/dist/rsc/index.js.map +1 -0
  651. package/dist/rsc/nonce.d.ts +9 -0
  652. package/dist/rsc/nonce.d.ts.map +1 -0
  653. package/dist/rsc/nonce.js +18 -0
  654. package/dist/rsc/nonce.js.map +1 -0
  655. package/dist/rsc/types.d.ts +206 -0
  656. package/dist/rsc/types.d.ts.map +1 -0
  657. package/dist/rsc/types.js +8 -0
  658. package/dist/rsc/types.js.map +1 -0
  659. package/dist/search-params.d.ts +103 -0
  660. package/dist/search-params.d.ts.map +1 -0
  661. package/dist/search-params.js +74 -0
  662. package/dist/search-params.js.map +1 -0
  663. package/dist/segment-system.d.ts +75 -0
  664. package/dist/segment-system.d.ts.map +1 -0
  665. package/dist/segment-system.js +336 -0
  666. package/dist/segment-system.js.map +1 -0
  667. package/dist/server/context.d.ts +245 -0
  668. package/dist/server/context.d.ts.map +1 -0
  669. package/dist/server/context.js +197 -0
  670. package/dist/server/context.js.map +1 -0
  671. package/dist/server/fetchable-loader-store.d.ts +18 -0
  672. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  673. package/dist/server/fetchable-loader-store.js +18 -0
  674. package/dist/server/fetchable-loader-store.js.map +1 -0
  675. package/dist/server/handle-store.d.ts +85 -0
  676. package/dist/server/handle-store.d.ts.map +1 -0
  677. package/dist/server/handle-store.js +142 -0
  678. package/dist/server/handle-store.js.map +1 -0
  679. package/dist/server/loader-registry.d.ts +55 -0
  680. package/dist/server/loader-registry.d.ts.map +1 -0
  681. package/dist/server/loader-registry.js +132 -0
  682. package/dist/server/loader-registry.js.map +1 -0
  683. package/dist/server/request-context.d.ts +226 -0
  684. package/dist/server/request-context.d.ts.map +1 -0
  685. package/dist/server/request-context.js +290 -0
  686. package/dist/server/request-context.js.map +1 -0
  687. package/dist/server/root-layout.d.ts +4 -0
  688. package/dist/server/root-layout.d.ts.map +1 -0
  689. package/dist/server/root-layout.js +5 -0
  690. package/dist/server/root-layout.js.map +1 -0
  691. package/dist/server.d.ts +15 -0
  692. package/dist/server.d.ts.map +1 -0
  693. package/dist/server.js +20 -0
  694. package/dist/server.js.map +1 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  698. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  699. package/dist/ssr/index.d.ts +98 -0
  700. package/dist/ssr/index.d.ts.map +1 -0
  701. package/dist/ssr/index.js +158 -0
  702. package/dist/ssr/index.js.map +1 -0
  703. package/dist/static-handler.d.ts +50 -0
  704. package/dist/static-handler.d.ts.map +1 -0
  705. package/dist/static-handler.gen.d.ts +5 -0
  706. package/dist/static-handler.gen.d.ts.map +1 -0
  707. package/dist/static-handler.gen.js +5 -0
  708. package/dist/static-handler.gen.js.map +1 -0
  709. package/dist/static-handler.js +29 -0
  710. package/dist/static-handler.js.map +1 -0
  711. package/dist/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 +5994 -2763
  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/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
  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/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
  810. package/dist/vite/virtual-entries.js.map +1 -0
  811. package/package.json +64 -54
  812. package/skills/api-client/SKILL.md +211 -0
  813. package/skills/breadcrumbs/SKILL.md +252 -0
  814. package/skills/bundle-analysis/SKILL.md +159 -0
  815. package/skills/cache-guide/SKILL.md +484 -0
  816. package/skills/caching/SKILL.md +202 -24
  817. package/skills/composability/SKILL.md +197 -0
  818. package/skills/css/SKILL.md +76 -0
  819. package/skills/debug-manifest/SKILL.md +12 -8
  820. package/skills/document-cache/SKILL.md +87 -62
  821. package/skills/fonts/SKILL.md +6 -4
  822. package/skills/handler-use/SKILL.md +364 -0
  823. package/skills/hooks/SKILL.md +537 -70
  824. package/skills/host-router/SKILL.md +264 -0
  825. package/skills/i18n/SKILL.md +276 -0
  826. package/skills/intercept/SKILL.md +173 -8
  827. package/skills/layout/SKILL.md +123 -5
  828. package/skills/links/SKILL.md +304 -25
  829. package/skills/loader/SKILL.md +600 -54
  830. package/skills/middleware/SKILL.md +211 -37
  831. package/skills/migrate-nextjs/SKILL.md +562 -0
  832. package/skills/migrate-react-router/SKILL.md +769 -0
  833. package/skills/mime-routes/SKILL.md +41 -10
  834. package/skills/observability/SKILL.md +137 -0
  835. package/skills/parallel/SKILL.md +271 -3
  836. package/skills/prerender/SKILL.md +413 -52
  837. package/skills/rango/SKILL.md +301 -21
  838. package/skills/react-compiler/SKILL.md +168 -0
  839. package/skills/response-routes/SKILL.md +248 -120
  840. package/skills/route/SKILL.md +279 -21
  841. package/skills/router-setup/SKILL.md +211 -33
  842. package/skills/server-actions/SKILL.md +751 -0
  843. package/skills/streams-and-websockets/SKILL.md +283 -0
  844. package/skills/tailwind/SKILL.md +27 -3
  845. package/skills/theme/SKILL.md +9 -8
  846. package/skills/typesafety/SKILL.md +547 -107
  847. package/skills/use-cache/SKILL.md +353 -0
  848. package/skills/view-transitions/SKILL.md +294 -0
  849. package/src/__augment-tests__/augment.ts +81 -0
  850. package/src/__augment-tests__/augmented.check.ts +116 -0
  851. package/src/__internal.ts +102 -4
  852. package/src/bin/rango.ts +312 -15
  853. package/src/browser/action-coordinator.ts +114 -0
  854. package/src/browser/app-shell.ts +39 -0
  855. package/src/browser/app-version.ts +14 -0
  856. package/src/browser/event-controller.ts +172 -128
  857. package/src/browser/history-state.ts +101 -0
  858. package/src/browser/index.ts +3 -3
  859. package/src/browser/intercept-utils.ts +52 -0
  860. package/src/browser/link-interceptor.ts +24 -4
  861. package/src/browser/logging.ts +11 -0
  862. package/src/browser/merge-segment-loaders.ts +20 -12
  863. package/src/browser/navigation-bridge.ts +309 -562
  864. package/src/browser/navigation-client.ts +206 -75
  865. package/src/browser/navigation-store.ts +80 -63
  866. package/src/browser/navigation-transaction.ts +279 -0
  867. package/src/browser/network-error-handler.ts +61 -0
  868. package/src/browser/partial-update.ts +355 -314
  869. package/src/browser/prefetch/cache.ts +363 -0
  870. package/src/browser/prefetch/fetch.ts +350 -0
  871. package/src/browser/prefetch/observer.ts +65 -0
  872. package/src/browser/prefetch/policy.ts +48 -0
  873. package/src/browser/prefetch/queue.ts +191 -0
  874. package/src/browser/prefetch/resource-ready.ts +77 -0
  875. package/src/browser/rango-state.ts +136 -0
  876. package/src/browser/react/Link.tsx +255 -71
  877. package/src/browser/react/NavigationProvider.tsx +153 -33
  878. package/src/browser/react/context.ts +11 -0
  879. package/src/browser/react/filter-segment-order.ts +55 -0
  880. package/src/browser/react/index.ts +15 -12
  881. package/src/browser/react/location-state-shared.ts +269 -56
  882. package/src/browser/react/location-state.ts +90 -19
  883. package/src/browser/react/mount-context.ts +6 -1
  884. package/src/browser/react/nonce-context.ts +23 -0
  885. package/src/browser/react/shallow-equal.ts +27 -0
  886. package/src/browser/react/use-action.ts +29 -51
  887. package/src/browser/react/use-client-cache.ts +5 -3
  888. package/src/browser/react/use-handle.ts +41 -123
  889. package/src/browser/react/use-link-status.ts +6 -5
  890. package/src/browser/react/use-navigation.ts +44 -65
  891. package/src/browser/react/use-params.ts +77 -0
  892. package/src/browser/react/use-pathname.ts +47 -0
  893. package/src/browser/react/use-reverse.ts +106 -0
  894. package/src/browser/react/use-router.ts +97 -0
  895. package/src/browser/react/use-search-params.ts +56 -0
  896. package/src/browser/react/use-segments.ts +85 -99
  897. package/src/browser/response-adapter.ts +124 -0
  898. package/src/browser/rsc-router.tsx +275 -72
  899. package/src/browser/scroll-restoration.ts +132 -49
  900. package/src/browser/segment-reconciler.ts +243 -0
  901. package/src/browser/segment-structure-assert.ts +17 -1
  902. package/src/browser/server-action-bridge.ts +508 -610
  903. package/src/browser/shallow.ts +6 -1
  904. package/src/browser/types.ts +149 -48
  905. package/src/browser/validate-redirect-origin.ts +29 -0
  906. package/src/build/collect-fallback-refs.ts +107 -0
  907. package/src/build/generate-manifest.ts +123 -56
  908. package/src/build/generate-route-types.ts +41 -1029
  909. package/src/build/index.ts +4 -0
  910. package/src/build/prefix-tree-utils.ts +123 -0
  911. package/src/build/route-trie.ts +127 -31
  912. package/src/build/route-types/ast-helpers.ts +25 -0
  913. package/src/build/route-types/ast-route-extraction.ts +98 -0
  914. package/src/build/route-types/codegen.ts +102 -0
  915. package/src/build/route-types/include-resolution.ts +418 -0
  916. package/src/build/route-types/param-extraction.ts +48 -0
  917. package/src/build/route-types/per-module-writer.ts +131 -0
  918. package/src/build/route-types/router-processing.ts +659 -0
  919. package/src/build/route-types/scan-filter.ts +85 -0
  920. package/src/build/route-types/source-scan.ts +118 -0
  921. package/src/build/runtime-discovery.ts +220 -0
  922. package/src/cache/background-task.ts +34 -0
  923. package/src/cache/cache-key-utils.ts +44 -0
  924. package/src/cache/cache-policy.ts +125 -0
  925. package/src/cache/cache-runtime.ts +354 -0
  926. package/src/cache/cache-scope.ts +170 -308
  927. package/src/cache/cf/cf-cache-store.ts +696 -30
  928. package/src/cache/cf/index.ts +13 -3
  929. package/src/cache/document-cache.ts +116 -77
  930. package/src/cache/handle-capture.ts +81 -0
  931. package/src/cache/handle-snapshot.ts +144 -0
  932. package/src/cache/index.ts +1 -15
  933. package/src/cache/memory-segment-store.ts +192 -13
  934. package/src/cache/profile-registry.ts +73 -0
  935. package/src/cache/read-through-swr.ts +134 -0
  936. package/src/cache/segment-codec.ts +256 -0
  937. package/src/cache/taint.ts +153 -0
  938. package/src/cache/types.ts +78 -124
  939. package/src/client.rsc.tsx +6 -1
  940. package/src/client.tsx +117 -322
  941. package/src/component-utils.ts +4 -4
  942. package/src/components/DefaultDocument.tsx +5 -1
  943. package/src/context-var.ts +156 -0
  944. package/src/debug.ts +19 -9
  945. package/src/decode-loader-results.ts +36 -0
  946. package/src/errors.ts +106 -10
  947. package/src/handle.ts +54 -11
  948. package/src/handles/MetaTags.tsx +73 -20
  949. package/src/handles/breadcrumbs.ts +66 -0
  950. package/src/handles/index.ts +1 -0
  951. package/src/handles/meta.ts +30 -13
  952. package/src/host/cookie-handler.ts +21 -15
  953. package/src/host/errors.ts +8 -8
  954. package/src/host/index.ts +6 -9
  955. package/src/host/pattern-matcher.ts +27 -27
  956. package/src/host/router.ts +176 -82
  957. package/src/host/testing.ts +8 -8
  958. package/src/host/types.ts +46 -9
  959. package/src/host/utils.ts +2 -2
  960. package/src/href-client.ts +196 -57
  961. package/src/index.rsc.ts +112 -42
  962. package/src/index.ts +178 -74
  963. package/src/internal-debug.ts +9 -3
  964. package/src/loader-store.ts +500 -0
  965. package/src/loader.rsc.ts +15 -93
  966. package/src/loader.ts +20 -10
  967. package/src/missing-id-error.ts +68 -0
  968. package/src/network-error-thrower.tsx +3 -1
  969. package/src/outlet-context.ts +1 -1
  970. package/src/outlet-provider.tsx +45 -0
  971. package/src/prerender/param-hash.ts +4 -2
  972. package/src/prerender/store.ts +125 -18
  973. package/src/prerender.ts +389 -23
  974. package/src/response-utils.ts +37 -0
  975. package/src/reverse.ts +198 -128
  976. package/src/root-error-boundary.tsx +41 -29
  977. package/src/route-content-wrapper.tsx +13 -32
  978. package/src/route-definition/dsl-helpers.ts +1109 -0
  979. package/src/route-definition/helper-factories.ts +90 -0
  980. package/src/route-definition/helpers-types.ts +506 -0
  981. package/src/route-definition/index.ts +55 -0
  982. package/src/route-definition/redirect.ts +101 -0
  983. package/src/route-definition/resolve-handler-use.ts +155 -0
  984. package/src/route-definition/use-item-types.ts +32 -0
  985. package/src/route-definition.ts +1 -1450
  986. package/src/route-map-builder.ts +87 -133
  987. package/src/route-name.ts +53 -0
  988. package/src/route-types.ts +72 -41
  989. package/src/router/content-negotiation.ts +228 -0
  990. package/src/router/debug-manifest.ts +72 -0
  991. package/src/router/error-handling.ts +10 -10
  992. package/src/router/find-match.ts +208 -0
  993. package/src/router/handler-context.ts +372 -125
  994. package/src/router/intercept-resolution.ts +24 -26
  995. package/src/router/lazy-includes.ts +256 -0
  996. package/src/router/loader-resolution.ts +367 -140
  997. package/src/router/logging.ts +112 -6
  998. package/src/router/manifest.ts +89 -28
  999. package/src/router/match-api.ts +175 -238
  1000. package/src/router/match-context.ts +4 -2
  1001. package/src/router/match-handlers.ts +441 -0
  1002. package/src/router/match-middleware/background-revalidation.ts +97 -89
  1003. package/src/router/match-middleware/cache-lookup.ts +289 -54
  1004. package/src/router/match-middleware/cache-store.ts +78 -17
  1005. package/src/router/match-middleware/intercept-resolution.ts +45 -22
  1006. package/src/router/match-middleware/segment-resolution.ts +73 -9
  1007. package/src/router/match-pipelines.ts +10 -45
  1008. package/src/router/match-result.ts +146 -24
  1009. package/src/router/metrics.ts +241 -16
  1010. package/src/router/middleware-cookies.ts +55 -0
  1011. package/src/router/middleware-types.ts +209 -0
  1012. package/src/router/middleware.ts +354 -384
  1013. package/src/router/navigation-snapshot.ts +182 -0
  1014. package/src/router/pattern-matching.ts +279 -44
  1015. package/src/router/prerender-match.ts +527 -0
  1016. package/src/router/preview-match.ts +100 -0
  1017. package/src/router/request-classification.ts +313 -0
  1018. package/src/router/revalidation.ts +163 -16
  1019. package/src/router/route-snapshot.ts +245 -0
  1020. package/src/router/router-context.ts +41 -21
  1021. package/src/router/router-interfaces.ts +500 -0
  1022. package/src/router/router-options.ts +642 -0
  1023. package/src/router/router-registry.ts +21 -0
  1024. package/src/router/segment-resolution/fresh.ts +769 -0
  1025. package/src/router/segment-resolution/helpers.ts +268 -0
  1026. package/src/router/segment-resolution/loader-cache.ts +199 -0
  1027. package/src/router/segment-resolution/revalidation.ts +1420 -0
  1028. package/src/router/segment-resolution/static-store.ts +81 -0
  1029. package/src/router/segment-resolution/view-transition-default.ts +36 -0
  1030. package/src/router/segment-resolution.ts +21 -1354
  1031. package/src/router/segment-wrappers.ts +291 -0
  1032. package/src/router/substitute-pattern-params.ts +56 -0
  1033. package/src/router/telemetry-otel.ts +299 -0
  1034. package/src/router/telemetry.ts +300 -0
  1035. package/src/router/timeout.ts +148 -0
  1036. package/src/router/trie-matching.ts +133 -42
  1037. package/src/router/types.ts +24 -9
  1038. package/src/router/url-params.ts +49 -0
  1039. package/src/router.ts +710 -2373
  1040. package/src/rsc/handler-context.ts +45 -0
  1041. package/src/rsc/handler.ts +821 -1128
  1042. package/src/rsc/helpers.ts +182 -19
  1043. package/src/rsc/index.ts +1 -21
  1044. package/src/rsc/loader-fetch.ts +229 -0
  1045. package/src/rsc/manifest-init.ts +77 -0
  1046. package/src/rsc/nonce.ts +14 -0
  1047. package/src/rsc/origin-guard.ts +161 -0
  1048. package/src/rsc/progressive-enhancement.ts +395 -0
  1049. package/src/rsc/response-error.ts +104 -0
  1050. package/src/rsc/response-route-handler.ts +362 -0
  1051. package/src/rsc/rsc-rendering.ts +240 -0
  1052. package/src/rsc/runtime-warnings.ts +41 -0
  1053. package/src/rsc/server-action.ts +350 -0
  1054. package/src/rsc/ssr-setup.ts +144 -0
  1055. package/src/rsc/types.ts +52 -11
  1056. package/src/search-params.ts +70 -58
  1057. package/src/segment-content-promise.ts +67 -0
  1058. package/src/segment-loader-promise.ts +122 -0
  1059. package/src/segment-system.tsx +237 -73
  1060. package/src/serialize.ts +243 -0
  1061. package/src/server/context.ts +439 -85
  1062. package/src/server/cookie-store.ts +214 -0
  1063. package/src/server/fetchable-loader-store.ts +11 -6
  1064. package/src/server/handle-store.ts +113 -15
  1065. package/src/server/loader-registry.ts +24 -64
  1066. package/src/server/request-context.ts +640 -107
  1067. package/src/server.ts +26 -164
  1068. package/src/ssr/index.tsx +107 -30
  1069. package/src/static-handler.ts +39 -9
  1070. package/src/theme/ThemeProvider.tsx +21 -15
  1071. package/src/theme/ThemeScript.tsx +5 -5
  1072. package/src/theme/constants.ts +5 -2
  1073. package/src/theme/index.ts +4 -14
  1074. package/src/theme/theme-context.ts +4 -30
  1075. package/src/theme/theme-script.ts +21 -18
  1076. package/src/types/boundaries.ts +158 -0
  1077. package/src/types/cache-types.ts +198 -0
  1078. package/src/types/error-types.ts +192 -0
  1079. package/src/types/global-namespace.ts +113 -0
  1080. package/src/types/handler-context.ts +809 -0
  1081. package/src/types/index.ts +89 -0
  1082. package/src/types/loader-types.ts +212 -0
  1083. package/src/types/request-scope.ts +126 -0
  1084. package/src/types/route-config.ts +170 -0
  1085. package/src/types/route-entry.ts +120 -0
  1086. package/src/types/segments.ts +184 -0
  1087. package/src/types.ts +1 -1795
  1088. package/src/urls/include-helper.ts +164 -0
  1089. package/src/urls/index.ts +49 -0
  1090. package/src/urls/path-helper-types.ts +386 -0
  1091. package/src/urls/path-helper.ts +329 -0
  1092. package/src/urls/pattern-types.ts +124 -0
  1093. package/src/urls/response-types.ts +109 -0
  1094. package/src/urls/type-extraction.ts +291 -0
  1095. package/src/urls/urls-function.ts +94 -0
  1096. package/src/urls.ts +1 -1323
  1097. package/src/use-loader.tsx +559 -108
  1098. package/src/vite/debug.ts +185 -0
  1099. package/src/vite/discovery/bundle-postprocess.ts +181 -0
  1100. package/src/vite/discovery/discover-routers.ts +379 -0
  1101. package/src/vite/discovery/discovery-errors.ts +194 -0
  1102. package/src/vite/discovery/gate-state.ts +171 -0
  1103. package/src/vite/discovery/prerender-collection.ts +480 -0
  1104. package/src/vite/discovery/route-types-writer.ts +214 -0
  1105. package/src/vite/discovery/self-gen-tracking.ts +73 -0
  1106. package/src/vite/discovery/state.ts +150 -0
  1107. package/src/vite/discovery/virtual-module-codegen.ts +193 -0
  1108. package/src/vite/index.ts +17 -2261
  1109. package/src/vite/plugin-types.ts +170 -0
  1110. package/src/vite/plugins/cjs-to-esm.ts +94 -0
  1111. package/src/vite/plugins/client-ref-dedup.ts +131 -0
  1112. package/src/vite/plugins/client-ref-hashing.ts +128 -0
  1113. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1114. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1115. package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
  1116. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +109 -60
  1117. package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +32 -51
  1118. package/src/vite/plugins/expose-ids/export-analysis.ts +376 -0
  1119. package/src/vite/plugins/expose-ids/handler-transform.ts +156 -0
  1120. package/src/vite/plugins/expose-ids/loader-transform.ts +72 -0
  1121. package/src/vite/plugins/expose-ids/router-transform.ts +127 -0
  1122. package/src/vite/plugins/expose-ids/types.ts +45 -0
  1123. package/src/vite/plugins/expose-internal-ids.ts +796 -0
  1124. package/src/vite/plugins/performance-tracks.ts +92 -0
  1125. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1126. package/src/vite/plugins/use-cache-transform.ts +338 -0
  1127. package/src/vite/plugins/version-injector.ts +99 -0
  1128. package/src/vite/plugins/version-plugin.ts +323 -0
  1129. package/src/vite/plugins/virtual-entries.ts +123 -0
  1130. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  1131. package/src/vite/rango.ts +549 -0
  1132. package/src/vite/router-discovery.ts +1567 -0
  1133. package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +194 -22
  1134. package/src/vite/utils/banner.ts +36 -0
  1135. package/src/vite/utils/bundle-analysis.ts +139 -0
  1136. package/src/vite/utils/client-chunks.ts +190 -0
  1137. package/src/vite/utils/forward-user-plugins.ts +193 -0
  1138. package/src/vite/utils/manifest-utils.ts +19 -0
  1139. package/src/vite/utils/package-resolution.ts +161 -0
  1140. package/src/vite/utils/prerender-utils.ts +222 -0
  1141. package/src/vite/utils/shared-utils.ts +251 -0
  1142. package/CLAUDE.md +0 -43
  1143. package/src/browser/lru-cache.ts +0 -69
  1144. package/src/browser/request-controller.ts +0 -164
  1145. package/src/cache/memory-store.ts +0 -253
  1146. package/src/router.gen.ts +0 -6
  1147. package/src/static-handler.gen.ts +0 -5
  1148. package/src/urls.gen.ts +0 -8
  1149. package/src/vite/expose-internal-ids.ts +0 -1167
  1150. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
@@ -13,14 +13,43 @@
13
13
  import { AsyncLocalStorage } from "node:async_hooks";
14
14
  import type { CookieOptions } from "../router/middleware.js";
15
15
  import type { LoaderDefinition, LoaderContext } from "../types.js";
16
+ import type { ScopedReverseFunction } from "../reverse.js";
17
+ import type {
18
+ DefaultEnv,
19
+ DefaultReverseRouteMap,
20
+ DefaultRouteName,
21
+ } from "../types/global-namespace.js";
16
22
  import type { Handle } from "../handle.js";
17
- import { createHandleStore, type HandleStore } from "./handle-store.js";
23
+ import {
24
+ type ContextVar,
25
+ contextGet,
26
+ contextSet,
27
+ isNonCacheable,
28
+ } from "../context-var.js";
29
+ import {
30
+ createHandleStore,
31
+ buildHandleSnapshot,
32
+ type HandleStore,
33
+ type HandleData,
34
+ } from "./handle-store.js";
18
35
  import { isHandle } from "../handle.js";
19
- import { track } from "./context.js";
36
+ import { track, type MetricsStore } from "./context.js";
20
37
  import { getFetchableLoader } from "./fetchable-loader-store.js";
21
38
  import type { SegmentCacheStore } from "../cache/types.js";
22
39
  import type { Theme, ResolvedThemeConfig } from "../theme/types.js";
40
+ import type { ExecutionContext, RequestScope } from "../types/request-scope.js";
41
+ import { fireAndForgetWaitUntil } from "../types/request-scope.js";
23
42
  import { THEME_COOKIE } from "../theme/constants.js";
43
+ import type { LocationStateEntry } from "../browser/react/location-state-shared.js";
44
+ import { NOCACHE_SYMBOL, assertNotInsideCacheExec } from "../cache/taint.js";
45
+ import { isInsideCacheScope } from "./context.js";
46
+ import {
47
+ createReverseFunction,
48
+ stripInternalParams,
49
+ } from "../router/handler-context.js";
50
+ import { getGlobalRouteMap, isRouteRootScoped } from "../route-map-builder.js";
51
+ import { invariant } from "../errors.js";
52
+ import { isAutoGeneratedRouteName } from "../route-name.js";
24
53
 
25
54
  /**
26
55
  * Unified request context available via getRequestContext()
@@ -29,46 +58,50 @@ import { THEME_COOKIE } from "../theme/constants.js";
29
58
  * Use this when you need access to request data outside of route handlers.
30
59
  */
31
60
  export interface RequestContext<
32
- TEnv = unknown,
61
+ TEnv = DefaultEnv,
33
62
  TParams = Record<string, string>,
34
- > {
35
- /** Platform bindings (Cloudflare env, etc.) */
36
- env: TEnv;
37
- /** Original HTTP request */
38
- request: Request;
39
- /** Parsed URL (system params like _rsc* are NOT filtered here) */
40
- url: URL;
41
- /** URL pathname */
42
- pathname: string;
43
- /** URL search params (system params like _rsc* are NOT filtered here) */
44
- searchParams: URLSearchParams;
45
- /** Variables set by middleware (same as ctx.var) */
46
- var: Record<string, any>;
63
+ > extends RequestScope<TEnv> {
64
+ /** @internal Shared variable backing store for ctx.get()/ctx.set(). */
65
+ _variables: Record<string, any>;
47
66
  /** Get a variable set by middleware */
48
- get: <K extends string>(key: K) => any;
67
+ get: {
68
+ <T>(contextVar: ContextVar<T>): T | undefined;
69
+ <K extends string>(key: K): any;
70
+ };
49
71
  /** Set a variable (shared with middleware and handlers) */
50
- set: <K extends string>(key: K, value: any) => void;
72
+ set: {
73
+ <T>(
74
+ contextVar: ContextVar<T>,
75
+ value: T,
76
+ options?: { cache?: boolean },
77
+ ): void;
78
+ <K extends string>(key: K, value: any, options?: { cache?: boolean }): void;
79
+ };
51
80
  /**
52
81
  * Route params (populated after route matching)
53
82
  * Initially empty, then set to matched params
54
83
  */
55
84
  params: TParams;
56
- /**
57
- * Stub response for setting headers/cookies
58
- * Headers set here are merged into the final response
59
- */
60
- res: Response;
85
+ /** @internal Stub response for collecting headers/cookies. Use ctx.headers or ctx.header() instead. */
86
+ readonly res: Response;
61
87
 
62
- /** Get a cookie value from the request */
88
+ /** @internal Get a cookie value (effective: request + response mutations). Use cookies().get() instead. */
63
89
  cookie(name: string): string | undefined;
64
- /** Get all cookies from the request */
90
+ /** @internal Get all cookies (effective merged view). Use cookies().getAll() instead. */
65
91
  cookies(): Record<string, string>;
66
- /** Set a cookie on the response */
92
+ /** @internal Set a cookie on the response. Use cookies().set() instead. */
67
93
  setCookie(name: string, value: string, options?: CookieOptions): void;
68
- /** Delete a cookie */
69
- deleteCookie(name: string, options?: Pick<CookieOptions, "domain" | "path">): void;
94
+ /** @internal Delete a cookie. Use cookies().delete() instead. */
95
+ deleteCookie(
96
+ name: string,
97
+ options?: Pick<CookieOptions, "domain" | "path">,
98
+ ): void;
70
99
  /** Set a response header */
71
100
  header(name: string, value: string): void;
101
+ /** Set the response status code */
102
+ setStatus(status: number): void;
103
+ /** @internal Set status bypassing cache-exec guard (for framework error handling) */
104
+ _setStatus(status: number): void;
72
105
 
73
106
  /**
74
107
  * Access loader data or push handle data.
@@ -90,10 +123,12 @@ export interface RequestContext<
90
123
  * ```
91
124
  */
92
125
  use: {
93
- <T, TLoaderParams = any>(loader: LoaderDefinition<T, TLoaderParams>): Promise<T>;
94
- <TData, TAccumulated = TData[]>(handle: Handle<TData, TAccumulated>): (
95
- data: TData | Promise<TData> | (() => Promise<TData>)
96
- ) => void;
126
+ <T, TLoaderParams = any>(
127
+ loader: LoaderDefinition<T, TLoaderParams>,
128
+ ): Promise<T>;
129
+ <TData, TAccumulated = TData[]>(
130
+ handle: Handle<TData, TAccumulated>,
131
+ ): (data: TData | Promise<TData> | (() => Promise<TData>)) => void;
97
132
  };
98
133
 
99
134
  /** HTTP method (GET, POST, PUT, PATCH, DELETE, etc.) */
@@ -105,19 +140,11 @@ export interface RequestContext<
105
140
  /** @internal Cache store for segment caching (optional, used by CacheScope) */
106
141
  _cacheStore?: SegmentCacheStore;
107
142
 
108
- /**
109
- * Schedule work to run after the response is sent.
110
- * On Cloudflare Workers, uses ctx.waitUntil().
111
- * On Node.js, runs as fire-and-forget.
112
- *
113
- * @example
114
- * ```typescript
115
- * ctx.waitUntil(async () => {
116
- * await cacheStore.set(key, data, ttl);
117
- * });
118
- * ```
119
- */
120
- waitUntil(fn: () => Promise<void>): void;
143
+ /** @internal Cache profiles for "use cache" profile resolution (per-router) */
144
+ _cacheProfiles?: Record<
145
+ string,
146
+ import("../cache/profile-registry.js").CacheProfile
147
+ >;
121
148
 
122
149
  /**
123
150
  * Register a callback to run when the response is created.
@@ -178,8 +205,181 @@ export interface RequestContext<
178
205
 
179
206
  /** @internal Theme configuration (null if theme not enabled) */
180
207
  _themeConfig?: ResolvedThemeConfig | null;
208
+
209
+ /**
210
+ * Attach location state entries to the current response.
211
+ *
212
+ * For partial (SPA) requests, the state is included in the RSC payload
213
+ * metadata and merged into history.pushState on the client. For redirect
214
+ * responses, the state travels through the redirect payload so the target
215
+ * page can read it via useLocationState.
216
+ *
217
+ * Multiple calls accumulate entries.
218
+ *
219
+ * @example
220
+ * ```typescript
221
+ * ctx.setLocationState(Flash({ text: "Item saved!" }));
222
+ * ```
223
+ */
224
+ setLocationState(entries: LocationStateEntry | LocationStateEntry[]): void;
225
+
226
+ /** @internal Accumulated location state entries */
227
+ _locationState?: LocationStateEntry[];
228
+
229
+ /**
230
+ * The matched route name, if the route has an explicit name.
231
+ * Undefined before route matching or for unnamed routes.
232
+ * Includes the namespace prefix from include() (e.g., "blog.post").
233
+ */
234
+ routeName?: DefaultRouteName;
235
+
236
+ /**
237
+ * Generate URLs from route names.
238
+ * Uses the global route map. After route matching, scoped (`.name`) resolution
239
+ * works within the matched include() scope.
240
+ */
241
+ reverse: ScopedReverseFunction<
242
+ Record<string, string>,
243
+ DefaultReverseRouteMap
244
+ >;
245
+
246
+ /** @internal Route name from route matching, used for scoped reverse resolution */
247
+ _routeName?: string;
248
+
249
+ /** @internal Previous route key (from the navigation source), used for revalidation */
250
+ _prevRouteKey?: string;
251
+
252
+ /**
253
+ * @internal Render barrier for experimental `rendered()` API.
254
+ * Resolves when all non-loader segments have settled and handle data
255
+ * is available. Used by DSL loaders that call `ctx.rendered()`.
256
+ */
257
+ _renderBarrier: Promise<void>;
258
+
259
+ /**
260
+ * @internal Resolve the render barrier. Accepts resolved segments, filters
261
+ * out loaders, and captures non-loader segment IDs as the handle ordering.
262
+ * Called after segment resolution (fresh) or handle replay (cache/prerender).
263
+ */
264
+ _resolveRenderBarrier: (
265
+ segments: Array<{ type: string; id: string }>,
266
+ ) => void;
267
+
268
+ /**
269
+ * @internal Segment order at barrier resolution time, used by loader
270
+ * ctx.use(handle) to collect handle data in correct order.
271
+ */
272
+ _renderBarrierSegmentOrder?: string[];
273
+
274
+ /**
275
+ * @internal Set to true when the matched entry tree contains any `loading()`
276
+ * entries (streaming). On a streaming tree rendered() waits for the streaming
277
+ * handlers to settle (via handleStore.settled) before resolving, and the
278
+ * deadlock guard state is kept live until that wait completes.
279
+ */
280
+ _treeHasStreaming?: boolean;
281
+
282
+ /**
283
+ * @internal Loader IDs that have called rendered() and are waiting for the
284
+ * barrier. Used to detect deadlocks when a handler tries to await the same
285
+ * loader via ctx.use(Loader).
286
+ */
287
+ _renderBarrierWaiters?: Set<string>;
288
+
289
+ /**
290
+ * @internal Loader IDs that handlers have started awaiting via ctx.use().
291
+ * Used for bidirectional deadlock detection: if a loader later calls
292
+ * rendered() and a handler already awaits it, we can detect the deadlock.
293
+ */
294
+ _handlerLoaderDeps?: Set<string>;
295
+
296
+ /**
297
+ * @internal Cached HandleData snapshot built at barrier resolution time.
298
+ * Avoids rebuilding the snapshot on every loader ctx.use(handle) call.
299
+ */
300
+ _renderBarrierHandleSnapshot?: HandleData;
301
+
302
+ /**
303
+ * @internal The deadlock guard window is closed (no further handler-awaits-
304
+ * loader cycle is possible). For non-streaming trees this is set when the
305
+ * barrier resolves. For streaming trees the window stays open until
306
+ * handleStore.settled — rendered() keeps waiting past the barrier and a
307
+ * loading() handler can still resume and await a still-waiting loader — so it
308
+ * is set only after settled. The guard (loader-resolution `setupLoaderAccess`)
309
+ * reads this instead of `_renderBarrierSegmentOrder` so it does not go blind
310
+ * during the streaming settle wait.
311
+ */
312
+ _renderBarrierGuardClosed?: boolean;
313
+
314
+ /** @internal Per-request error dedup set for onError reporting */
315
+ _reportedErrors: WeakSet<object>;
316
+
317
+ /**
318
+ * @internal Report a non-fatal background error through the router's
319
+ * onError callback. Wired by the RSC handler / router during request
320
+ * creation. Cache-runtime and other subsystems call this to surface
321
+ * errors without failing the response.
322
+ */
323
+ _reportBackgroundError?: (error: unknown, category: string) => void;
324
+
325
+ /** @internal Per-request debug performance override (set via ctx.debugPerformance()) */
326
+ _debugPerformance?: boolean;
327
+
328
+ /** @internal Request-scoped performance metrics store */
329
+ _metricsStore?: MetricsStore;
330
+
331
+ /** @internal Router basename for this request (used by redirect()) */
332
+ _basename?: string;
333
+
334
+ /**
335
+ * @internal RouteSnapshot from classifyRequest, reused by match/matchPartial
336
+ * to avoid a second resolveRoute call. Cleared on HMR invalidation.
337
+ */
338
+ _classifiedRoute?: import("../router/route-snapshot.js").RouteSnapshot;
181
339
  }
182
340
 
341
+ /**
342
+ * Public view of RequestContext, without internal methods and fields.
343
+ *
344
+ * This is the type exported to library consumers. Internal code should
345
+ * use the full RequestContext interface directly.
346
+ */
347
+ export type PublicRequestContext<
348
+ TEnv = DefaultEnv,
349
+ TParams = Record<string, string>,
350
+ > = Omit<
351
+ RequestContext<TEnv, TParams>,
352
+ | "cookie"
353
+ | "cookies"
354
+ | "setCookie"
355
+ | "deleteCookie"
356
+ | "_handleStore"
357
+ | "_cacheStore"
358
+ | "_cacheProfiles"
359
+ | "_onResponseCallbacks"
360
+ | "_themeConfig"
361
+ | "_locationState"
362
+ | "_routeName"
363
+ | "_prevRouteKey"
364
+ | "_reportedErrors"
365
+ | "_renderBarrier"
366
+ | "_resolveRenderBarrier"
367
+ | "_renderBarrierSegmentOrder"
368
+ | "_treeHasStreaming"
369
+ | "_renderBarrierWaiters"
370
+ | "_handlerLoaderDeps"
371
+ | "_renderBarrierHandleSnapshot"
372
+ | "_renderBarrierGuardClosed"
373
+ | "_reportBackgroundError"
374
+ | "_debugPerformance"
375
+ | "_metricsStore"
376
+ | "_basename"
377
+ | "_setStatus"
378
+ | "_variables"
379
+ | "_classifiedRoute"
380
+ | "res"
381
+ >;
382
+
183
383
  // AsyncLocalStorage instance for request context
184
384
  const requestContextStorage = new AsyncLocalStorage<RequestContext<any>>();
185
385
 
@@ -189,16 +389,33 @@ const requestContextStorage = new AsyncLocalStorage<RequestContext<any>>();
189
389
  */
190
390
  export function runWithRequestContext<TEnv, T>(
191
391
  context: RequestContext<TEnv>,
192
- fn: () => T
392
+ fn: () => T,
193
393
  ): T {
194
394
  return requestContextStorage.run(context, fn);
195
395
  }
196
396
 
197
397
  /**
198
398
  * Get the current request context
199
- * Returns undefined if not running within a request context
399
+ * Throws if called outside of a request context
200
400
  */
201
- export function getRequestContext<TEnv = unknown>():
401
+ export function getRequestContext<TEnv = DefaultEnv>(): RequestContext<TEnv> {
402
+ const ctx = requestContextStorage.getStore() as
403
+ | RequestContext<TEnv>
404
+ | undefined;
405
+ invariant(
406
+ ctx,
407
+ "getRequestContext() called outside of a request context. " +
408
+ "This function must be called from within a route handler, loader, middleware, " +
409
+ "server action, or server component.",
410
+ );
411
+ return ctx;
412
+ }
413
+
414
+ /**
415
+ * @internal Get the request context without throwing — for internal code that
416
+ * may run outside a request context (cache stores, optional handle lookups, etc.)
417
+ */
418
+ export function _getRequestContext<TEnv = DefaultEnv>():
202
419
  | RequestContext<TEnv>
203
420
  | undefined {
204
421
  return requestContextStorage.getStore() as RequestContext<TEnv> | undefined;
@@ -206,38 +423,71 @@ export function getRequestContext<TEnv = unknown>():
206
423
 
207
424
  /**
208
425
  * Update params on the current request context
209
- * Called after route matching to populate route params
426
+ * Called after route matching to populate route params and route name
210
427
  */
211
- export function setRequestContextParams(params: Record<string, string>): void {
428
+ export function setRequestContextParams(
429
+ params: Record<string, string>,
430
+ routeName?: string,
431
+ ): void {
212
432
  const ctx = requestContextStorage.getStore();
213
433
  if (ctx) {
214
434
  ctx.params = params;
435
+ if (routeName !== undefined) {
436
+ ctx._routeName = routeName;
437
+ ctx.routeName = (
438
+ routeName && !isAutoGeneratedRouteName(routeName)
439
+ ? routeName
440
+ : undefined
441
+ ) as DefaultRouteName | undefined;
442
+ }
443
+ // Update reverse with scoped resolution now that route is known
444
+ ctx.reverse = createReverseFunction(
445
+ getGlobalRouteMap(),
446
+ routeName,
447
+ params,
448
+ routeName ? isRouteRootScoped(routeName) : undefined,
449
+ );
215
450
  }
216
451
  }
217
452
 
218
453
  /**
219
- * Get the current request context, throwing if not available
220
- * Use this when context is required (e.g., in loader actions)
454
+ * Store the previous route key on the request context.
455
+ * Called during partial-match context creation to make the navigation source
456
+ * route key available for revalidation and intercept evaluation.
457
+ * @internal
221
458
  */
222
- export function requireRequestContext<TEnv = unknown>(): RequestContext<TEnv> {
223
- const ctx = getRequestContext<TEnv>();
224
- if (!ctx) {
225
- throw new Error(
226
- "Request context not available. This function must be called from within a server action " +
227
- "executed through the RSC handler."
228
- );
459
+ export function setRequestContextPrevRouteKey(
460
+ prevRouteKey: string | undefined,
461
+ ): void {
462
+ const ctx = requestContextStorage.getStore();
463
+ if (ctx && prevRouteKey !== undefined) {
464
+ ctx._prevRouteKey = prevRouteKey;
229
465
  }
230
- return ctx;
231
466
  }
232
467
 
233
468
  /**
234
- * Cloudflare Workers ExecutionContext (subset we need)
469
+ * Get accumulated location state entries from the current request context.
470
+ * Returns undefined if no state has been set.
471
+ *
472
+ * @internal Used by the RSC handler to include state in payload metadata.
235
473
  */
236
- export interface ExecutionContext {
237
- waitUntil(promise: Promise<any>): void;
238
- passThroughOnException(): void;
474
+ export function getLocationState(): LocationStateEntry[] | undefined {
475
+ const ctx = getRequestContext();
476
+ return ctx?._locationState;
239
477
  }
240
478
 
479
+ /**
480
+ * Get the current request context, throwing if not available
481
+ * @deprecated Use getRequestContext() directly — it now throws if outside context
482
+ */
483
+ export function requireRequestContext<
484
+ TEnv = DefaultEnv,
485
+ >(): RequestContext<TEnv> {
486
+ return getRequestContext<TEnv>();
487
+ }
488
+
489
+ export type { ExecutionContext };
490
+
241
491
  /**
242
492
  * Options for creating a request context
243
493
  */
@@ -246,8 +496,15 @@ export interface CreateRequestContextOptions<TEnv> {
246
496
  request: Request;
247
497
  url: URL;
248
498
  variables: Record<string, any>;
499
+ /** Optional initial response stub headers/status to seed effective cookie reads */
500
+ initialResponse?: Response;
249
501
  /** Optional cache store for segment caching (used by CacheScope) */
250
502
  cacheStore?: SegmentCacheStore;
503
+ /** Optional cache profiles for "use cache" resolution (per-router) */
504
+ cacheProfiles?: Record<
505
+ string,
506
+ import("../cache/profile-registry.js").CacheProfile
507
+ >;
251
508
  /** Optional Cloudflare execution context for waitUntil support */
252
509
  executionContext?: ExecutionContext;
253
510
  /** Optional theme configuration (enables ctx.theme and ctx.setTheme) */
@@ -263,20 +520,37 @@ export interface CreateRequestContextOptions<TEnv> {
263
520
  * - Passed to handlers as ctx
264
521
  */
265
522
  export function createRequestContext<TEnv>(
266
- options: CreateRequestContextOptions<TEnv>
523
+ options: CreateRequestContextOptions<TEnv>,
267
524
  ): RequestContext<TEnv> {
268
- const { env, request, url, variables, cacheStore, executionContext, themeConfig } = options;
525
+ const {
526
+ env,
527
+ request,
528
+ url,
529
+ variables,
530
+ initialResponse,
531
+ cacheStore,
532
+ cacheProfiles,
533
+ executionContext,
534
+ themeConfig,
535
+ } = options;
269
536
  const cookieHeader = request.headers.get("Cookie");
270
537
  let parsedCookies: Record<string, string> | null = null;
271
538
 
272
- // Create stub response for collecting headers/cookies
273
- const stubResponse = new Response(null, { status: 200 });
539
+ // Create stub response for collecting headers/cookies.
540
+ // All cookie/header mutations go here; cookie reads derive from it.
541
+ let stubResponse = initialResponse
542
+ ? new Response(null, {
543
+ status: initialResponse.status,
544
+ statusText: initialResponse.statusText,
545
+ headers: new Headers(initialResponse.headers),
546
+ })
547
+ : new Response(null, { status: 200 });
274
548
 
275
549
  // Create handle store and loader memoization for this request
276
550
  const handleStore = createHandleStore();
277
551
  const loaderPromises = new Map<string, Promise<any>>();
278
552
 
279
- // Lazy parse cookies
553
+ // Lazy parse cookies from the original Cookie header
280
554
  const getParsedCookies = (): Record<string, string> => {
281
555
  if (!parsedCookies) {
282
556
  parsedCookies = parseCookiesFromHeader(cookieHeader);
@@ -284,11 +558,47 @@ export function createRequestContext<TEnv>(
284
558
  return parsedCookies;
285
559
  };
286
560
 
561
+ // Cached response cookie mutations — invalidated on setCookie/deleteCookie/setTheme
562
+ let responseCookieCache: Map<string, string | null> | null = null;
563
+ const getResponseCookies = (): Map<string, string | null> => {
564
+ if (!responseCookieCache) {
565
+ responseCookieCache = parseResponseCookies(stubResponse);
566
+ }
567
+ return responseCookieCache;
568
+ };
569
+ const invalidateResponseCookieCache = () => {
570
+ responseCookieCache = null;
571
+ };
572
+
573
+ // Guard: throw if a response-level side effect is called inside a cache() scope.
574
+ // Uses ALS to detect the scope (set during segment resolution).
575
+ function assertNotInsideCacheScopeALS(methodName: string): void {
576
+ if (isInsideCacheScope()) {
577
+ throw new Error(
578
+ `ctx.${methodName}() cannot be called inside a cache() boundary. ` +
579
+ `On cache hit the handler is skipped, so this side effect would be lost. ` +
580
+ `Move ctx.${methodName}() to a middleware or layout outside the cache() scope.`,
581
+ );
582
+ }
583
+ }
584
+
585
+ // Effective cookie read: response stub Set-Cookie wins, then original header.
586
+ // The stub IS the source of truth for same-request mutations.
587
+ const effectiveCookie = (name: string): string | undefined => {
588
+ const mutations = getResponseCookies();
589
+ if (mutations.has(name)) {
590
+ const v = mutations.get(name);
591
+ return v === null ? undefined : v;
592
+ }
593
+ return getParsedCookies()[name];
594
+ };
595
+
287
596
  // Theme helpers (only used when themeConfig is provided)
288
597
  const getTheme = (): Theme | undefined => {
289
598
  if (!themeConfig) return undefined;
290
599
 
291
- const stored = getParsedCookies()[themeConfig.storageKey];
600
+ // Use overlay-aware read so setTheme() in the same request is reflected
601
+ const stored = effectiveCookie(themeConfig.storageKey);
292
602
  if (stored) {
293
603
  // Validate stored value
294
604
  if (stored === "system" && themeConfig.enableSystem) {
@@ -306,65 +616,129 @@ export function createRequestContext<TEnv>(
306
616
 
307
617
  // Validate theme value
308
618
  if (theme !== "system" && !themeConfig.themes.includes(theme)) {
309
- console.warn(`[Theme] Invalid theme value: "${theme}". Valid values: system, ${themeConfig.themes.join(", ")}`);
619
+ console.warn(
620
+ `[Theme] Invalid theme value: "${theme}". Valid values: system, ${themeConfig.themes.join(", ")}`,
621
+ );
310
622
  return;
311
623
  }
312
624
 
313
- // Set cookie
625
+ // Write to stub — effectiveCookie() will pick it up on next read
314
626
  stubResponse.headers.append(
315
627
  "Set-Cookie",
316
628
  serializeCookieValue(themeConfig.storageKey, theme, {
317
629
  path: THEME_COOKIE.path,
318
630
  maxAge: THEME_COOKIE.maxAge,
319
631
  sameSite: THEME_COOKIE.sameSite,
320
- })
632
+ }),
321
633
  );
634
+ invalidateResponseCookieCache();
322
635
  };
323
636
 
637
+ // Strip internal _rsc* params so userland sees a clean URL.
638
+ const cleanUrl = stripInternalParams(url);
639
+
324
640
  // Build the context object first (without use), then add use
325
641
  const ctx: RequestContext<TEnv> = {
326
642
  env,
327
643
  request,
328
- url,
644
+ url: cleanUrl,
645
+ originalUrl: new URL(request.url),
329
646
  pathname: url.pathname,
330
- searchParams: url.searchParams,
331
- var: variables,
332
- get: <K extends string>(key: K) => variables[key],
333
- set: <K extends string>(key: K, value: any) => {
334
- variables[key] = value;
335
- },
647
+ searchParams: cleanUrl.searchParams,
648
+ _variables: variables,
649
+ get: ((keyOrVar: any) => {
650
+ if (isNonCacheable(variables, keyOrVar) && isInsideCacheScope()) {
651
+ throw new Error(
652
+ `ctx.get() for a non-cacheable variable cannot be called inside a cache() boundary. ` +
653
+ `The variable was created with { cache: false } or set with { cache: false }, ` +
654
+ `and its value would be stale on cache hit. Move the read outside the cached scope.`,
655
+ );
656
+ }
657
+ return contextGet(variables, keyOrVar);
658
+ }) as RequestContext<TEnv>["get"],
659
+ set: ((keyOrVar: any, value: any, options?: any) => {
660
+ assertNotInsideCacheExec(ctx, "set");
661
+ contextSet(variables, keyOrVar, value, options);
662
+ }) as RequestContext<TEnv>["set"],
336
663
  params: {} as Record<string, string>,
337
- res: stubResponse,
664
+
665
+ get res(): Response {
666
+ return stubResponse;
667
+ },
668
+ set res(_: Response) {
669
+ throw new Error(
670
+ "ctx.res is read-only. Use ctx.header() to set response headers, or cookies() for cookie mutations.",
671
+ );
672
+ },
338
673
 
339
674
  cookie(name: string): string | undefined {
340
- return getParsedCookies()[name];
675
+ return effectiveCookie(name);
341
676
  },
342
677
 
343
678
  cookies(): Record<string, string> {
344
- return { ...getParsedCookies() };
679
+ const parsed = getParsedCookies();
680
+ const mutations = getResponseCookies();
681
+ if (mutations.size === 0) return { ...parsed };
682
+ // Build result without delete (avoids V8 dictionary-mode de-opt)
683
+ const deleted = new Set<string>();
684
+ for (const [k, v] of mutations) {
685
+ if (v === null) deleted.add(k);
686
+ }
687
+ const result: Record<string, string> = {};
688
+ for (const key of Object.keys(parsed)) {
689
+ if (!deleted.has(key)) result[key] = parsed[key];
690
+ }
691
+ for (const [k, v] of mutations) {
692
+ if (v !== null) result[k] = v;
693
+ }
694
+ return result;
345
695
  },
346
696
 
347
697
  setCookie(name: string, value: string, options?: CookieOptions): void {
698
+ assertNotInsideCacheExec(ctx, "setCookie");
699
+ assertNotInsideCacheScopeALS("setCookie");
348
700
  stubResponse.headers.append(
349
701
  "Set-Cookie",
350
- serializeCookieValue(name, value, options)
702
+ serializeCookieValue(name, value, options),
351
703
  );
704
+ invalidateResponseCookieCache();
352
705
  },
353
706
 
354
707
  deleteCookie(
355
708
  name: string,
356
- options?: Pick<CookieOptions, "domain" | "path">
709
+ options?: Pick<CookieOptions, "domain" | "path">,
357
710
  ): void {
711
+ assertNotInsideCacheExec(ctx, "deleteCookie");
712
+ assertNotInsideCacheScopeALS("deleteCookie");
358
713
  stubResponse.headers.append(
359
714
  "Set-Cookie",
360
- serializeCookieValue(name, "", { ...options, maxAge: 0 })
715
+ serializeCookieValue(name, "", { ...options, maxAge: 0 }),
361
716
  );
717
+ invalidateResponseCookieCache();
362
718
  },
363
719
 
364
720
  header(name: string, value: string): void {
721
+ assertNotInsideCacheExec(ctx, "header");
722
+ assertNotInsideCacheScopeALS("header");
365
723
  stubResponse.headers.set(name, value);
366
724
  },
367
725
 
726
+ setStatus(status: number): void {
727
+ assertNotInsideCacheExec(ctx, "setStatus");
728
+ assertNotInsideCacheScopeALS("setStatus");
729
+ stubResponse = new Response(null, {
730
+ status,
731
+ headers: stubResponse.headers,
732
+ });
733
+ },
734
+
735
+ _setStatus(status: number): void {
736
+ stubResponse = new Response(null, {
737
+ status,
738
+ headers: stubResponse.headers,
739
+ });
740
+ },
741
+
368
742
  // Placeholder - will be replaced below
369
743
  use: null as any,
370
744
 
@@ -372,28 +746,124 @@ export function createRequestContext<TEnv>(
372
746
 
373
747
  _handleStore: handleStore,
374
748
  _cacheStore: cacheStore,
749
+ _cacheProfiles: cacheProfiles,
375
750
 
376
751
  waitUntil(fn: () => Promise<void>): void {
377
752
  if (executionContext?.waitUntil) {
378
- // Cloudflare Workers: use native waitUntil
379
753
  executionContext.waitUntil(fn());
380
754
  } else {
381
- // Node.js / dev: fire-and-forget with error logging
382
- fn().catch((err) => console.error("[waitUntil] Background task failed:", err));
755
+ fireAndForgetWaitUntil(fn);
383
756
  }
384
757
  },
385
758
 
759
+ executionContext,
760
+
386
761
  _onResponseCallbacks: [],
387
762
 
388
763
  onResponse(callback: (response: Response) => Response): void {
764
+ assertNotInsideCacheExec(ctx, "onResponse");
765
+ assertNotInsideCacheScopeALS("onResponse");
389
766
  this._onResponseCallbacks.push(callback);
390
767
  },
391
768
 
392
769
  // Theme properties (only set when themeConfig is provided)
393
- theme: themeConfig ? getTheme() : undefined,
394
- setTheme: themeConfig ? setTheme : undefined,
770
+ get theme() {
771
+ return themeConfig ? getTheme() : undefined;
772
+ },
773
+ setTheme: themeConfig
774
+ ? (theme: Theme) => {
775
+ assertNotInsideCacheExec(ctx, "setTheme");
776
+ setTheme(theme);
777
+ }
778
+ : undefined,
395
779
  _themeConfig: themeConfig,
780
+
781
+ setLocationState(entries: LocationStateEntry | LocationStateEntry[]): void {
782
+ assertNotInsideCacheExec(ctx, "setLocationState");
783
+ const arr = Array.isArray(entries) ? entries : [entries];
784
+ this._locationState = this._locationState
785
+ ? [...this._locationState, ...arr]
786
+ : arr;
787
+ },
788
+ _locationState: undefined,
789
+
790
+ _reportedErrors: new WeakSet<object>(),
791
+ _metricsStore: undefined,
792
+
793
+ // Render barrier: deferred promise resolved after non-loader segments settle.
794
+ _renderBarrier: null as any, // set below
795
+ _resolveRenderBarrier: null as any, // set below
796
+ _renderBarrierSegmentOrder: undefined,
797
+
798
+ reverse: createReverseFunction(getGlobalRouteMap(), undefined, {}),
799
+ };
800
+
801
+ // Lazy render barrier: only allocate the Promise when a loader actually
802
+ // calls rendered(). Requests that don't use rendered() pay zero cost.
803
+ let barrierResolved = false;
804
+ let resolveBarrier: (() => void) | undefined;
805
+ ctx._renderBarrier = null as any; // lazy — created on first access
806
+ ctx._resolveRenderBarrier = (
807
+ segments: Array<{ type: string; id: string }>,
808
+ ) => {
809
+ if (barrierResolved) return;
810
+ barrierResolved = true;
811
+ const segOrder = segments
812
+ .filter((s) => s.type !== "loader")
813
+ .map((s) => s.id);
814
+ ctx._renderBarrierSegmentOrder = segOrder;
815
+
816
+ // Closing the guard window means no handler can still form a deadlock cycle
817
+ // with a rendered() loader: drop the dependency-tracking state and mark it
818
+ // closed. WHEN this runs is the only streaming/non-streaming difference.
819
+ const closeGuard = () => {
820
+ ctx._renderBarrierWaiters = undefined;
821
+ ctx._handlerLoaderDeps = undefined;
822
+ ctx._renderBarrierGuardClosed = true;
823
+ };
824
+
825
+ if (ctx._treeHasStreaming) {
826
+ // Streaming: rendered() keeps waiting on handleStore.settled past this
827
+ // point, and loading() handlers are still in flight. The eager snapshot
828
+ // here would be incomplete, so leave it unset — rendered() builds and
829
+ // caches the complete one after settled. Keep the guard window OPEN so a
830
+ // handler that resumes and awaits a still-waiting rendered() loader is
831
+ // still caught; close it once settled (every tracked handler has finished
832
+ // then, so none can await a loader anymore). settled resolves after
833
+ // rendered() seals; if no loader used rendered(), nothing seals and the
834
+ // (empty) guard state is simply GC'd at request end.
835
+ handleStore.settled.then(closeGuard);
836
+ } else {
837
+ // Non-streaming: all handlers have settled by now. Build and cache the
838
+ // snapshot so loader ctx.use(handle) calls don't rebuild it, and close the
839
+ // guard window immediately.
840
+ ctx._renderBarrierHandleSnapshot = buildHandleSnapshot(
841
+ handleStore,
842
+ segOrder,
843
+ );
844
+ closeGuard();
845
+ }
846
+ if (resolveBarrier) resolveBarrier();
396
847
  };
848
+ Object.defineProperty(ctx, "_renderBarrier", {
849
+ get() {
850
+ // Barrier already resolved (cache/prerender hit) or first lazy access.
851
+ // Either way, replace the getter with a concrete value to avoid
852
+ // repeated Promise.resolve() allocations on subsequent reads.
853
+ const p = barrierResolved
854
+ ? Promise.resolve()
855
+ : new Promise<void>((resolve) => {
856
+ resolveBarrier = resolve;
857
+ });
858
+ Object.defineProperty(ctx, "_renderBarrier", {
859
+ value: p,
860
+ writable: false,
861
+ configurable: false,
862
+ });
863
+ return p;
864
+ },
865
+ configurable: true,
866
+ });
397
867
 
398
868
  // Now create use() with access to ctx
399
869
  ctx.use = createUseFunction({
@@ -402,14 +872,53 @@ export function createRequestContext<TEnv>(
402
872
  getContext: () => ctx,
403
873
  });
404
874
 
875
+ // Brand with taint symbol so "use cache" excludes ctx from cache keys
876
+ (ctx as any)[NOCACHE_SYMBOL] = true;
405
877
  return ctx;
406
878
  }
407
879
 
880
+ /**
881
+ * Parse Set-Cookie headers from a response into effective cookie state.
882
+ * Returns a map of cookie name -> value (string) or name -> null (deleted).
883
+ * Last-write-wins: later Set-Cookie entries for the same name overwrite earlier ones.
884
+ * Max-Age=0 is treated as a delete.
885
+ */
886
+ const MAX_AGE_ZERO_RE = /;\s*Max-Age\s*=\s*0/i;
887
+
888
+ function parseResponseCookies(response: Response): Map<string, string | null> {
889
+ const result = new Map<string, string | null>();
890
+ const setCookies = response.headers.getSetCookie();
891
+
892
+ for (const header of setCookies) {
893
+ // First segment before ';' is the name=value pair
894
+ const semiIdx = header.indexOf(";");
895
+ const pair = semiIdx === -1 ? header : header.substring(0, semiIdx);
896
+ const eqIdx = pair.indexOf("=");
897
+ if (eqIdx === -1) continue;
898
+
899
+ let name: string;
900
+ let value: string;
901
+ try {
902
+ name = decodeURIComponent(pair.substring(0, eqIdx).trim());
903
+ value = decodeURIComponent(pair.substring(eqIdx + 1).trim());
904
+ } catch {
905
+ // Malformed encoding — skip this entry
906
+ continue;
907
+ }
908
+
909
+ // Max-Age=0 means the cookie is being deleted
910
+ const isDeleted = MAX_AGE_ZERO_RE.test(header);
911
+ result.set(name, isDeleted ? null : value);
912
+ }
913
+
914
+ return result;
915
+ }
916
+
408
917
  /**
409
918
  * Parse cookies from Cookie header
410
919
  */
411
920
  function parseCookiesFromHeader(
412
- cookieHeader: string | null
921
+ cookieHeader: string | null,
413
922
  ): Record<string, string> {
414
923
  if (!cookieHeader) return {};
415
924
 
@@ -419,7 +928,13 @@ function parseCookiesFromHeader(
419
928
  for (const pair of pairs) {
420
929
  const [name, ...rest] = pair.trim().split("=");
421
930
  if (name) {
422
- cookies[name] = decodeURIComponent(rest.join("="));
931
+ const raw = rest.join("=");
932
+ try {
933
+ cookies[name] = decodeURIComponent(raw);
934
+ } catch {
935
+ // Malformed percent-encoded value (e.g. %zz, %2) - fall back to raw value
936
+ cookies[name] = raw;
937
+ }
423
938
  }
424
939
  }
425
940
 
@@ -432,7 +947,7 @@ function parseCookiesFromHeader(
432
947
  function serializeCookieValue(
433
948
  name: string,
434
949
  value: string,
435
- options: CookieOptions = {}
950
+ options: CookieOptions = {},
436
951
  ): string {
437
952
  let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
438
953
 
@@ -464,7 +979,7 @@ export interface CreateUseFunctionOptions<TEnv> {
464
979
  * - For handles: returns a push function to add handle data
465
980
  */
466
981
  export function createUseFunction<TEnv>(
467
- options: CreateUseFunctionOptions<TEnv>
982
+ options: CreateUseFunctionOptions<TEnv>,
468
983
  ): RequestContext["use"] {
469
984
  const { handleStore, loaderPromises, getContext } = options;
470
985
 
@@ -478,16 +993,19 @@ export function createUseFunction<TEnv>(
478
993
  if (!segmentId) {
479
994
  throw new Error(
480
995
  `Handle "${handle.$$id}" used outside of handler context. ` +
481
- `Handles must be used within route/layout handlers.`
996
+ `Handles must be used within route/layout handlers.`,
482
997
  );
483
998
  }
484
999
 
485
1000
  // Return a push function bound to this handle and segment
486
- return (dataOrFn: unknown | Promise<unknown> | (() => Promise<unknown>)) => {
1001
+ return (
1002
+ dataOrFn: unknown | Promise<unknown> | (() => Promise<unknown>),
1003
+ ) => {
487
1004
  // If it's a function, call it immediately to get the promise
488
- const valueOrPromise = typeof dataOrFn === "function"
489
- ? (dataOrFn as () => Promise<unknown>)()
490
- : dataOrFn;
1005
+ const valueOrPromise =
1006
+ typeof dataOrFn === "function"
1007
+ ? (dataOrFn as () => Promise<unknown>)()
1008
+ : dataOrFn;
491
1009
 
492
1010
  // Push directly - promises will be serialized by RSC and streamed
493
1011
  handleStore.push(handle.$$id, segmentId, valueOrPromise);
@@ -513,7 +1031,7 @@ export function createUseFunction<TEnv>(
513
1031
 
514
1032
  if (!loaderFn) {
515
1033
  throw new Error(
516
- `Loader "${loader.$$id}" has no function. This usually means the loader was defined without "use server" and the function was not included in the build.`
1034
+ `Loader "${loader.$$id}" has no function. This usually means the loader was defined without "use server" and the function was not included in the build.`,
517
1035
  );
518
1036
  }
519
1037
 
@@ -522,25 +1040,40 @@ export function createUseFunction<TEnv>(
522
1040
  // Create loader context with recursive use() support
523
1041
  const loaderCtx: LoaderContext<Record<string, string | undefined>, TEnv> = {
524
1042
  params: ctx.params,
1043
+ routeParams: (ctx.params ?? {}) as Record<string, string>,
525
1044
  request: ctx.request,
526
1045
  searchParams: ctx.searchParams,
1046
+ search: (ctx as any).search ?? {},
527
1047
  pathname: ctx.pathname,
528
1048
  url: ctx.url,
1049
+ originalUrl: ctx.originalUrl,
529
1050
  env: ctx.env as any,
530
- var: ctx.var as any,
1051
+ waitUntil: ctx.waitUntil.bind(ctx),
1052
+ executionContext: ctx.executionContext,
531
1053
  get: ctx.get as any,
532
- use: <TDep, TDepParams = any>(
533
- dep: LoaderDefinition<TDep, TDepParams>
1054
+ use: (<TDep, TDepParams = any>(
1055
+ dep: LoaderDefinition<TDep, TDepParams>,
534
1056
  ): Promise<TDep> => {
535
1057
  // Recursive call - will start dep loader if not already started
536
1058
  return ctx.use(dep);
537
- },
1059
+ }) as LoaderContext["use"],
538
1060
  method: "GET",
539
1061
  body: undefined,
1062
+ reverse: createReverseFunction(
1063
+ getGlobalRouteMap(),
1064
+ ctx._routeName,
1065
+ ctx.params as Record<string, string>,
1066
+ ctx._routeName ? isRouteRootScoped(ctx._routeName) : undefined,
1067
+ ),
1068
+ rendered: () => {
1069
+ throw new Error(
1070
+ `ctx.rendered() is only available in DSL loaders (registered via loader() in urls()). ` +
1071
+ `It cannot be used from request-context loaders or server actions.`,
1072
+ );
1073
+ },
540
1074
  };
541
1075
 
542
- // Start loader execution with tracking
543
- const doneLoader = track(`loader:${loader.$$id}`);
1076
+ const doneLoader = track(`loader:${loader.$$id}`, 2);
544
1077
  const promise = Promise.resolve(loaderFn(loaderCtx)).finally(() => {
545
1078
  doneLoader();
546
1079
  });