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

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