@rangojs/router 0.0.0-experimental.15 → 0.0.0-experimental.151

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 (1284) hide show
  1. package/AGENTS.md +13 -0
  2. package/README.md +308 -451
  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 +1844 -237
  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/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -8
  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 +7554 -2070
  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 +142 -61
  811. package/skills/api-client/SKILL.md +211 -0
  812. package/skills/breadcrumbs/SKILL.md +329 -0
  813. package/skills/bundle-analysis/SKILL.md +159 -0
  814. package/skills/cache-guide/SKILL.md +489 -0
  815. package/skills/caching/SKILL.md +413 -26
  816. package/skills/catalog.json +271 -0
  817. package/skills/comparison/SKILL.md +50 -0
  818. package/skills/comparison/agents/openai.yaml +4 -0
  819. package/skills/comparison/references/framework-comparison.md +837 -0
  820. package/skills/composability/SKILL.md +278 -0
  821. package/skills/css/SKILL.md +76 -0
  822. package/skills/debug-manifest/SKILL.md +16 -18
  823. package/skills/defer-hydration/SKILL.md +235 -0
  824. package/skills/document-cache/SKILL.md +96 -63
  825. package/skills/fonts/SKILL.md +7 -5
  826. package/skills/handler-use/SKILL.md +364 -0
  827. package/skills/hooks/SKILL.md +76 -436
  828. package/skills/hooks/data.md +273 -0
  829. package/skills/hooks/handle-and-actions.md +103 -0
  830. package/skills/hooks/navigation.md +110 -0
  831. package/skills/hooks/outlets.md +41 -0
  832. package/skills/hooks/state.md +228 -0
  833. package/skills/hooks/urls.md +135 -0
  834. package/skills/host-router/SKILL.md +320 -0
  835. package/skills/i18n/SKILL.md +276 -0
  836. package/skills/intercept/SKILL.md +215 -16
  837. package/skills/layout/SKILL.md +147 -7
  838. package/skills/links/SKILL.md +304 -25
  839. package/skills/loader/SKILL.md +629 -55
  840. package/skills/middleware/SKILL.md +251 -38
  841. package/skills/migrate-nextjs/SKILL.md +745 -0
  842. package/skills/migrate-react-router/SKILL.md +153 -0
  843. package/skills/migrate-react-router/cloudflare-workers.md +129 -0
  844. package/skills/migrate-react-router/component-migration.md +196 -0
  845. package/skills/migrate-react-router/data-and-actions.md +225 -0
  846. package/skills/migrate-react-router/route-mapping.md +271 -0
  847. package/skills/mime-routes/SKILL.md +60 -21
  848. package/skills/observability/SKILL.md +202 -0
  849. package/skills/parallel/SKILL.md +296 -4
  850. package/skills/ppr/SKILL.md +658 -0
  851. package/skills/prerender/SKILL.md +487 -52
  852. package/skills/rango/SKILL.md +324 -29
  853. package/skills/react-compiler/SKILL.md +168 -0
  854. package/skills/response-routes/SKILL.md +264 -122
  855. package/skills/route/SKILL.md +359 -22
  856. package/skills/router-setup/SKILL.md +247 -34
  857. package/skills/scripts/SKILL.md +179 -0
  858. package/skills/server-actions/SKILL.md +776 -0
  859. package/skills/shell-manifest/SKILL.md +185 -0
  860. package/skills/streams-and-websockets/SKILL.md +283 -0
  861. package/skills/tailwind/SKILL.md +28 -4
  862. package/skills/testing/SKILL.md +126 -222
  863. package/skills/testing/bindings.md +103 -0
  864. package/skills/testing/cache-prerender.md +127 -0
  865. package/skills/testing/client-components.md +124 -0
  866. package/skills/testing/e2e-parity.md +125 -0
  867. package/skills/testing/flight.md +91 -0
  868. package/skills/testing/handles.md +131 -0
  869. package/skills/testing/loader.md +128 -0
  870. package/skills/testing/middleware.md +99 -0
  871. package/skills/testing/render-handler.md +122 -0
  872. package/skills/testing/response-routes.md +95 -0
  873. package/skills/testing/reverse-and-types.md +85 -0
  874. package/skills/testing/server-actions.md +107 -0
  875. package/skills/testing/server-tree.md +128 -0
  876. package/skills/testing/setup.md +123 -0
  877. package/skills/theme/SKILL.md +10 -9
  878. package/skills/typesafety/SKILL.md +45 -496
  879. package/skills/typesafety/env-and-bindings.md +254 -0
  880. package/skills/typesafety/generated-files-and-cli.md +335 -0
  881. package/skills/typesafety/params-and-search.md +153 -0
  882. package/skills/typesafety/route-types.md +209 -0
  883. package/skills/use-cache/SKILL.md +383 -0
  884. package/skills/vercel/SKILL.md +128 -0
  885. package/skills/view-transitions/SKILL.md +337 -0
  886. package/src/__augment-tests__/augment.ts +81 -0
  887. package/src/__augment-tests__/augmented.check.ts +116 -0
  888. package/src/__internal.ts +77 -44
  889. package/src/bin/rango.ts +275 -29
  890. package/src/browser/action-coordinator.ts +114 -0
  891. package/src/browser/action-fence.ts +47 -0
  892. package/src/browser/app-shell.ts +39 -0
  893. package/src/browser/app-version.ts +14 -0
  894. package/src/browser/connection-warmup.ts +134 -0
  895. package/src/browser/cookie-name.ts +140 -0
  896. package/src/browser/event-controller.ts +348 -212
  897. package/src/browser/history-state.ts +101 -0
  898. package/src/browser/index.ts +3 -3
  899. package/src/browser/intercept-utils.ts +52 -0
  900. package/src/browser/invalidate-client-cache.ts +52 -0
  901. package/src/browser/link-interceptor.ts +24 -4
  902. package/src/browser/logging.ts +39 -0
  903. package/src/browser/merge-segment-loaders.ts +23 -13
  904. package/src/browser/navigation-bridge.ts +385 -576
  905. package/src/browser/navigation-client.ts +249 -75
  906. package/src/browser/navigation-store-handle.ts +38 -0
  907. package/src/browser/navigation-store.ts +230 -124
  908. package/src/browser/navigation-transaction.ts +247 -0
  909. package/src/browser/network-error-handler.ts +88 -0
  910. package/src/browser/partial-update.ts +432 -365
  911. package/src/browser/prefetch/cache.ts +381 -0
  912. package/src/browser/prefetch/fetch.ts +462 -0
  913. package/src/browser/prefetch/observer.ts +65 -0
  914. package/src/browser/prefetch/policy.ts +48 -0
  915. package/src/browser/prefetch/queue.ts +209 -0
  916. package/src/browser/prefetch/resource-ready.ts +77 -0
  917. package/src/browser/rango-state.ts +194 -0
  918. package/src/browser/react/Link.tsx +284 -67
  919. package/src/browser/react/NavigationProvider.tsx +267 -109
  920. package/src/browser/react/ScrollRestoration.tsx +10 -6
  921. package/src/browser/react/context.ts +11 -0
  922. package/src/browser/react/filter-segment-order.ts +70 -0
  923. package/src/browser/react/index.ts +0 -48
  924. package/src/browser/react/location-state-shared.ts +272 -60
  925. package/src/browser/react/location-state.ts +90 -20
  926. package/src/browser/react/mount-context.ts +6 -1
  927. package/src/browser/react/nonce-context.ts +23 -0
  928. package/src/browser/react/shallow-equal.ts +27 -0
  929. package/src/browser/react/use-action.ts +35 -66
  930. package/src/browser/react/use-handle.ts +39 -126
  931. package/src/browser/react/use-href.tsx +8 -1
  932. package/src/browser/react/use-link-status.ts +39 -13
  933. package/src/browser/react/use-navigation.ts +53 -69
  934. package/src/browser/react/use-params.ts +75 -0
  935. package/src/browser/react/use-pathname.ts +47 -0
  936. package/src/browser/react/use-reverse.ts +106 -0
  937. package/src/browser/react/use-router.ts +98 -0
  938. package/src/browser/react/use-search-params.ts +51 -0
  939. package/src/browser/react/use-segments.ts +72 -99
  940. package/src/browser/response-adapter.ts +164 -0
  941. package/src/browser/rsc-router.tsx +355 -73
  942. package/src/browser/scroll-restoration.ts +140 -50
  943. package/src/browser/segment-reconciler.ts +253 -0
  944. package/src/browser/segment-structure-assert.ts +17 -1
  945. package/src/browser/server-action-bridge.ts +668 -613
  946. package/src/browser/types.ts +235 -51
  947. package/src/browser/validate-redirect-origin.ts +56 -0
  948. package/src/build/collect-fallback-refs.ts +107 -0
  949. package/src/build/generate-manifest.ts +243 -183
  950. package/src/build/generate-route-types.ts +41 -848
  951. package/src/build/index.ts +12 -7
  952. package/src/build/prefix-tree-utils.ts +123 -0
  953. package/src/build/route-trie.ts +218 -80
  954. package/src/build/route-types/ast-helpers.ts +25 -0
  955. package/src/build/route-types/ast-route-extraction.ts +105 -0
  956. package/src/build/route-types/codegen.ts +113 -0
  957. package/src/build/route-types/include-resolution.ts +812 -0
  958. package/src/build/route-types/param-extraction.ts +51 -0
  959. package/src/build/route-types/per-module-writer.ts +144 -0
  960. package/src/build/route-types/router-processing.ts +695 -0
  961. package/src/build/route-types/scan-filter.ts +85 -0
  962. package/src/build/route-types/source-scan.ts +216 -0
  963. package/src/build/runtime-discovery.ts +223 -0
  964. package/src/cache/background-task.ts +34 -0
  965. package/src/cache/cache-error.ts +104 -0
  966. package/src/cache/cache-key-utils.ts +88 -0
  967. package/src/cache/cache-policy.ts +199 -0
  968. package/src/cache/cache-runtime.ts +695 -0
  969. package/src/cache/cache-scope.ts +324 -335
  970. package/src/cache/cache-tag.ts +149 -0
  971. package/src/cache/cf/cf-base64.ts +33 -0
  972. package/src/cache/cf/cf-cache-constants.ts +127 -0
  973. package/src/cache/cf/cf-cache-store.ts +2602 -156
  974. package/src/cache/cf/cf-cache-types.ts +349 -0
  975. package/src/cache/cf/cf-kv-utils.ts +46 -0
  976. package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
  977. package/src/cache/cf/index.ts +17 -17
  978. package/src/cache/document-cache.ts +226 -102
  979. package/src/cache/handle-capture.ts +81 -0
  980. package/src/cache/handle-snapshot.ts +132 -0
  981. package/src/cache/index.ts +24 -35
  982. package/src/cache/memory-segment-store.ts +446 -30
  983. package/src/cache/profile-registry.ts +88 -0
  984. package/src/cache/read-through-swr.ts +178 -0
  985. package/src/cache/segment-codec.ts +295 -0
  986. package/src/cache/shell-snapshot.ts +464 -0
  987. package/src/cache/tag-invalidation.ts +230 -0
  988. package/src/cache/taint.ts +153 -0
  989. package/src/cache/types.ts +283 -211
  990. package/src/cache/vercel/index.ts +11 -0
  991. package/src/cache/vercel/vercel-cache-store.ts +1201 -0
  992. package/src/client.rsc.tsx +43 -21
  993. package/src/client.tsx +131 -347
  994. package/src/cloudflare/index.ts +11 -0
  995. package/src/cloudflare/tracing.ts +108 -0
  996. package/src/component-utils.ts +23 -4
  997. package/src/components/DefaultDocument.tsx +13 -3
  998. package/src/context-var.ts +168 -0
  999. package/src/debug.ts +19 -9
  1000. package/src/decode-loader-results.ts +52 -0
  1001. package/src/defer.ts +185 -0
  1002. package/src/deps/ssr.ts +4 -2
  1003. package/src/encode-kv.ts +49 -0
  1004. package/src/errors.ts +106 -10
  1005. package/src/escape-script.ts +52 -0
  1006. package/src/handle.ts +110 -35
  1007. package/src/handles/MetaTags.tsx +83 -59
  1008. package/src/handles/Scripts.tsx +183 -0
  1009. package/src/handles/breadcrumbs.ts +93 -0
  1010. package/src/handles/deferred-resolution.ts +127 -0
  1011. package/src/handles/is-thenable.ts +18 -0
  1012. package/src/handles/meta.ts +44 -53
  1013. package/src/handles/script.ts +244 -0
  1014. package/src/host/cookie-handler.ts +20 -65
  1015. package/src/host/errors.ts +21 -30
  1016. package/src/host/index.ts +13 -9
  1017. package/src/host/pattern-matcher.ts +50 -79
  1018. package/src/host/router.ts +151 -121
  1019. package/src/host/testing.ts +45 -32
  1020. package/src/host/types.ts +52 -11
  1021. package/src/host/utils.ts +2 -2
  1022. package/src/href-client.ts +192 -57
  1023. package/src/index.rsc.ts +180 -35
  1024. package/src/index.ts +245 -73
  1025. package/src/internal-debug.ts +9 -2
  1026. package/src/loader-store.ts +500 -0
  1027. package/src/loader.rsc.ts +31 -99
  1028. package/src/loader.ts +30 -12
  1029. package/src/missing-id-error.ts +68 -0
  1030. package/src/outlet-context.ts +1 -1
  1031. package/src/outlet-provider.tsx +41 -0
  1032. package/src/prerender/build-shell-capture.ts +447 -0
  1033. package/src/prerender/param-hash.ts +16 -14
  1034. package/src/prerender/shell-manifest-key.ts +20 -0
  1035. package/src/prerender/store.ts +131 -22
  1036. package/src/prerender.ts +460 -26
  1037. package/src/redirect-origin.ts +114 -0
  1038. package/src/regex-escape.ts +8 -0
  1039. package/src/render-error-thrower.tsx +20 -0
  1040. package/src/response-utils.ts +62 -0
  1041. package/src/reverse.ts +198 -128
  1042. package/src/root-error-boundary.tsx +42 -48
  1043. package/src/route-content-wrapper.tsx +22 -77
  1044. package/src/route-definition/dsl-helpers.ts +1116 -0
  1045. package/src/route-definition/helper-factories.ts +88 -0
  1046. package/src/route-definition/helpers-types.ts +506 -0
  1047. package/src/route-definition/index.ts +54 -0
  1048. package/src/route-definition/redirect.ts +134 -0
  1049. package/src/route-definition/resolve-handler-use.ts +160 -0
  1050. package/src/route-definition/use-item-types.ts +29 -0
  1051. package/src/route-definition.ts +1 -1481
  1052. package/src/route-map-builder.ts +120 -145
  1053. package/src/route-name.ts +53 -0
  1054. package/src/route-types.ts +71 -45
  1055. package/src/router/basename.ts +14 -0
  1056. package/src/router/content-negotiation.ts +305 -0
  1057. package/src/router/debug-manifest.ts +72 -0
  1058. package/src/router/error-handling.ts +54 -27
  1059. package/src/router/find-match.ts +259 -0
  1060. package/src/router/handler-context.ts +385 -125
  1061. package/src/router/instrument.ts +355 -0
  1062. package/src/router/intercept-resolution.ts +88 -28
  1063. package/src/router/lazy-includes.ts +260 -0
  1064. package/src/router/loader-resolution.ts +449 -157
  1065. package/src/router/logging.ts +106 -6
  1066. package/src/router/manifest.ts +144 -62
  1067. package/src/router/match-api.ts +224 -256
  1068. package/src/router/match-context.ts +4 -24
  1069. package/src/router/match-handlers.ts +499 -0
  1070. package/src/router/match-middleware/background-revalidation.ts +117 -93
  1071. package/src/router/match-middleware/cache-lookup.ts +308 -150
  1072. package/src/router/match-middleware/cache-store.ts +123 -51
  1073. package/src/router/match-middleware/intercept-resolution.ts +44 -43
  1074. package/src/router/match-middleware/segment-resolution.ts +64 -22
  1075. package/src/router/match-pipelines.ts +11 -87
  1076. package/src/router/match-result.ts +143 -52
  1077. package/src/router/metrics.ts +235 -29
  1078. package/src/router/middleware-types.ts +110 -0
  1079. package/src/router/middleware.ts +526 -441
  1080. package/src/router/navigation-snapshot.ts +133 -0
  1081. package/src/router/params-util.ts +23 -0
  1082. package/src/router/parse-pattern.ts +115 -0
  1083. package/src/router/pattern-matching.ts +311 -142
  1084. package/src/router/prefetch-cache-ttl.ts +51 -0
  1085. package/src/router/prefetch-limits.ts +37 -0
  1086. package/src/router/prerender-match.ts +575 -0
  1087. package/src/router/preview-match.ts +102 -0
  1088. package/src/router/request-classification.ts +291 -0
  1089. package/src/router/revalidation.ts +203 -62
  1090. package/src/router/route-snapshot.ts +256 -0
  1091. package/src/router/router-context.ts +45 -48
  1092. package/src/router/router-interfaces.ts +564 -0
  1093. package/src/router/router-options.ts +784 -0
  1094. package/src/router/router-registry.ts +21 -0
  1095. package/src/router/segment-resolution/fresh.ts +812 -0
  1096. package/src/router/segment-resolution/helpers.ts +348 -0
  1097. package/src/router/segment-resolution/loader-cache.ts +315 -0
  1098. package/src/router/segment-resolution/loader-mask.ts +60 -0
  1099. package/src/router/segment-resolution/loader-snapshot.ts +259 -0
  1100. package/src/router/segment-resolution/mask-nested.ts +99 -0
  1101. package/src/router/segment-resolution/revalidation.ts +1340 -0
  1102. package/src/router/segment-resolution/static-store.ts +81 -0
  1103. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  1104. package/src/router/segment-resolution/view-transition-default.ts +56 -0
  1105. package/src/router/segment-resolution.ts +25 -1354
  1106. package/src/router/segment-wrappers.ts +292 -0
  1107. package/src/router/state-cookie-name.ts +33 -0
  1108. package/src/router/substitute-pattern-params.ts +75 -0
  1109. package/src/router/telemetry-otel.ts +259 -0
  1110. package/src/router/telemetry.ts +385 -0
  1111. package/src/router/timeout.ts +128 -0
  1112. package/src/router/tracing.ts +215 -0
  1113. package/src/router/trie-matching.ts +240 -61
  1114. package/src/router/types.ts +23 -70
  1115. package/src/router/url-params.ts +57 -0
  1116. package/src/router.ts +795 -2390
  1117. package/src/rsc/capture-queue.ts +67 -0
  1118. package/src/rsc/full-payload.ts +70 -0
  1119. package/src/rsc/handler-context.ts +46 -0
  1120. package/src/rsc/handler.ts +956 -1164
  1121. package/src/rsc/helpers.ts +736 -19
  1122. package/src/rsc/index.ts +2 -25
  1123. package/src/rsc/json-route-result.ts +38 -0
  1124. package/src/rsc/loader-fetch.ts +305 -0
  1125. package/src/rsc/manifest-init.ts +77 -0
  1126. package/src/rsc/nonce.ts +23 -0
  1127. package/src/rsc/origin-guard.ts +155 -0
  1128. package/src/rsc/progressive-enhancement.ts +541 -0
  1129. package/src/rsc/redirect-guard.ts +100 -0
  1130. package/src/rsc/response-cache-serve.ts +238 -0
  1131. package/src/rsc/response-error.ts +104 -0
  1132. package/src/rsc/response-route-handler.ts +257 -0
  1133. package/src/rsc/rsc-rendering.ts +856 -0
  1134. package/src/rsc/runtime-warnings.ts +55 -0
  1135. package/src/rsc/server-action.ts +525 -0
  1136. package/src/rsc/shell-build-manifest.ts +316 -0
  1137. package/src/rsc/shell-capture-constants.ts +27 -0
  1138. package/src/rsc/shell-capture.ts +1716 -0
  1139. package/src/rsc/shell-serve.ts +226 -0
  1140. package/src/rsc/ssr-setup.ts +176 -0
  1141. package/src/rsc/transition-gate.ts +89 -0
  1142. package/src/rsc/types.ts +95 -12
  1143. package/src/runtime-env.ts +18 -0
  1144. package/src/search-params.ts +99 -82
  1145. package/src/segment-content-promise.ts +67 -0
  1146. package/src/segment-fragments.ts +124 -0
  1147. package/src/segment-loader-promise.ts +167 -0
  1148. package/src/segment-system.tsx +464 -135
  1149. package/src/serialize.ts +243 -0
  1150. package/src/server/context.ts +640 -85
  1151. package/src/server/cookie-parse.ts +32 -0
  1152. package/src/server/cookie-store.ts +337 -0
  1153. package/src/server/fetchable-loader-store.ts +11 -6
  1154. package/src/server/handle-store.ts +123 -42
  1155. package/src/server/loader-registry.ts +51 -100
  1156. package/src/server/request-context.ts +1069 -152
  1157. package/src/server.ts +15 -8
  1158. package/src/ssr/index.tsx +661 -140
  1159. package/src/ssr/inject-rsc-eager.ts +167 -0
  1160. package/src/ssr/preinit-client-references.ts +106 -0
  1161. package/src/ssr/ssr-root.tsx +261 -0
  1162. package/src/static-handler.ts +45 -18
  1163. package/src/testing/cache-status.ts +162 -0
  1164. package/src/testing/collect-handle.ts +46 -0
  1165. package/src/testing/dispatch.ts +813 -0
  1166. package/src/testing/dom.entry.ts +22 -0
  1167. package/src/testing/e2e/fixture.ts +188 -0
  1168. package/src/testing/e2e/index.ts +128 -0
  1169. package/src/testing/e2e/matchers.ts +35 -0
  1170. package/src/testing/e2e/page-helpers.ts +272 -0
  1171. package/src/testing/e2e/parity.ts +387 -0
  1172. package/src/testing/e2e/server.ts +195 -0
  1173. package/src/testing/flight-matchers.ts +97 -0
  1174. package/src/testing/flight-normalize.ts +11 -0
  1175. package/src/testing/flight-runtime.d.ts +57 -0
  1176. package/src/testing/flight-tree.ts +682 -0
  1177. package/src/testing/flight.entry.ts +52 -0
  1178. package/src/testing/flight.ts +257 -0
  1179. package/src/testing/generated-routes.ts +199 -0
  1180. package/src/testing/index.ts +105 -0
  1181. package/src/testing/internal/context.ts +380 -0
  1182. package/src/testing/internal/flight-client-globals.ts +30 -0
  1183. package/src/testing/internal/seed-vars.ts +54 -0
  1184. package/src/testing/render-handler.ts +371 -0
  1185. package/src/testing/render-route.tsx +584 -0
  1186. package/src/testing/run-loader.ts +385 -0
  1187. package/src/testing/run-middleware.ts +219 -0
  1188. package/src/testing/run-transition-when.ts +164 -0
  1189. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  1190. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  1191. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  1192. package/src/testing/vitest-stubs/version.ts +5 -0
  1193. package/src/testing/vitest.ts +305 -0
  1194. package/src/theme/ThemeProvider.tsx +76 -98
  1195. package/src/theme/ThemeScript.tsx +12 -14
  1196. package/src/theme/constants.ts +57 -15
  1197. package/src/theme/index.ts +3 -20
  1198. package/src/theme/theme-context.ts +5 -35
  1199. package/src/theme/theme-script.ts +43 -39
  1200. package/src/theme/use-theme.ts +0 -3
  1201. package/src/types/boundaries.ts +123 -0
  1202. package/src/types/cache-types.ts +207 -0
  1203. package/src/types/error-types.ts +132 -0
  1204. package/src/types/global-namespace.ts +113 -0
  1205. package/src/types/handler-context.ts +850 -0
  1206. package/src/types/index.ts +81 -0
  1207. package/src/types/loader-types.ts +212 -0
  1208. package/src/types/request-scope.ts +112 -0
  1209. package/src/types/route-config.ts +138 -0
  1210. package/src/types/route-entry.ts +114 -0
  1211. package/src/types/segments.ts +271 -0
  1212. package/src/types.ts +1 -1795
  1213. package/src/urls/include-helper.ts +162 -0
  1214. package/src/urls/include-provider.ts +71 -0
  1215. package/src/urls/index.ts +44 -0
  1216. package/src/urls/path-helper-types.ts +418 -0
  1217. package/src/urls/path-helper.ts +280 -0
  1218. package/src/urls/pattern-types.ts +189 -0
  1219. package/src/urls/response-types.ts +109 -0
  1220. package/src/urls/type-extraction.ts +316 -0
  1221. package/src/urls/urls-function.ts +80 -0
  1222. package/src/urls.ts +1 -1352
  1223. package/src/use-loader.tsx +406 -141
  1224. package/src/vercel/index.ts +11 -0
  1225. package/src/vercel/tracing.ts +88 -0
  1226. package/src/vite/debug.ts +185 -0
  1227. package/src/vite/discovery/bundle-postprocess.ts +182 -0
  1228. package/src/vite/discovery/dev-prerender-cache.ts +117 -0
  1229. package/src/vite/discovery/discover-routers.ts +408 -0
  1230. package/src/vite/discovery/discovery-errors.ts +255 -0
  1231. package/src/vite/discovery/gate-state.ts +171 -0
  1232. package/src/vite/discovery/prerender-collection.ts +483 -0
  1233. package/src/vite/discovery/route-types-writer.ts +214 -0
  1234. package/src/vite/discovery/self-gen-tracking.ts +73 -0
  1235. package/src/vite/discovery/shell-prerender-phase.ts +397 -0
  1236. package/src/vite/discovery/state.ts +205 -0
  1237. package/src/vite/discovery/virtual-module-codegen.ts +293 -0
  1238. package/src/vite/index.ts +31 -2255
  1239. package/src/vite/inject-client-debug.ts +88 -0
  1240. package/src/vite/plugin-types.ts +336 -0
  1241. package/src/vite/plugins/cjs-to-esm.ts +90 -0
  1242. package/src/vite/plugins/client-ref-dedup.ts +120 -0
  1243. package/src/vite/plugins/client-ref-hashing.ts +118 -0
  1244. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1245. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1246. package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
  1247. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
  1248. package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +89 -79
  1249. package/src/vite/plugins/expose-ids/export-analysis.ts +363 -0
  1250. package/src/vite/plugins/expose-ids/handler-transform.ts +130 -0
  1251. package/src/vite/plugins/expose-ids/loader-transform.ts +64 -0
  1252. package/src/vite/plugins/expose-ids/router-transform.ts +199 -0
  1253. package/src/vite/plugins/expose-ids/types.ts +45 -0
  1254. package/src/vite/plugins/expose-internal-ids.ts +805 -0
  1255. package/src/vite/plugins/performance-tracks.ts +89 -0
  1256. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1257. package/src/vite/plugins/use-cache-transform.ts +313 -0
  1258. package/src/vite/plugins/vercel-output.ts +384 -0
  1259. package/src/vite/plugins/version-injector.ts +94 -0
  1260. package/src/vite/plugins/version-plugin.ts +271 -0
  1261. package/src/vite/plugins/virtual-entries.ts +267 -0
  1262. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  1263. package/src/vite/rango.ts +600 -0
  1264. package/src/vite/router-discovery.ts +2120 -0
  1265. package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +200 -37
  1266. package/src/vite/utils/banner.ts +36 -0
  1267. package/src/vite/utils/bundle-analysis.ts +132 -0
  1268. package/src/vite/utils/client-chunks.ts +184 -0
  1269. package/src/vite/utils/directive-prologue.ts +40 -0
  1270. package/src/vite/utils/forward-user-plugins.ts +171 -0
  1271. package/src/vite/utils/manifest-utils.ts +15 -0
  1272. package/src/vite/utils/package-resolution.ts +89 -0
  1273. package/src/vite/utils/prerender-utils.ts +268 -0
  1274. package/src/vite/utils/shared-utils.ts +271 -0
  1275. package/CLAUDE.md +0 -43
  1276. package/src/browser/lru-cache.ts +0 -69
  1277. package/src/browser/request-controller.ts +0 -164
  1278. package/src/browser/shallow.ts +0 -35
  1279. package/src/cache/memory-store.ts +0 -253
  1280. package/src/router.gen.ts +0 -6
  1281. package/src/static-handler.gen.ts +0 -5
  1282. package/src/urls.gen.ts +0 -8
  1283. package/src/vite/expose-internal-ids.ts +0 -1167
  1284. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
@@ -1,7 +1,17 @@
1
1
  import { AsyncLocalStorage } from "node:async_hooks";
2
2
  import type { ReactNode } from "react";
3
- import type { PartialCacheOptions, ErrorBoundaryHandler, Handler, LoaderDefinition, MiddlewareFn, NotFoundBoundaryHandler, ShouldRevalidateFn } from "../types";
4
- import { invariant } from "../errors";
3
+ import type {
4
+ PartialCacheOptions,
5
+ ErrorBoundaryHandler,
6
+ Handler,
7
+ LoaderDefinition,
8
+ MiddlewareFn,
9
+ NotFoundBoundaryHandler,
10
+ ShouldRevalidateFn,
11
+ TransitionConfig,
12
+ } from "../types";
13
+ import { invariant, DslContextError } from "../errors";
14
+ import type { DefaultRouteName } from "../types/global-namespace.js";
5
15
 
6
16
  // ============================================================================
7
17
  // Performance Metrics Types
@@ -13,9 +23,11 @@ import { invariant } from "../errors";
13
23
  * @internal This type is an implementation detail and may change without notice.
14
24
  */
15
25
  export interface PerformanceMetric {
16
- label: string; // e.g., "route-matching", "loader:UserLoader"
17
- duration: number; // milliseconds
18
- startTime: number; // relative to request start
26
+ label: string; // e.g., "route-matching", "loader:UserLoader"
27
+ duration: number; // milliseconds
28
+ startTime: number; // relative to request start
29
+ depth?: number; // nesting level for hierarchical display (0 = top-level)
30
+ desc?: string; // free-form outcome detail, emitted as Server-Timing desc="..."
19
31
  }
20
32
 
21
33
  /**
@@ -29,7 +41,7 @@ export interface MetricsStore {
29
41
  metrics: PerformanceMetric[];
30
42
  }
31
43
  // ============================================================================
32
- // RSC Router Context
44
+ // Rango Context
33
45
  // ============================================================================
34
46
 
35
47
  /**
@@ -60,6 +72,10 @@ export type EntryPropCommon = {
60
72
  };
61
73
 
62
74
  /**
75
+ * Attachments resolved by walking the parent chain, not owned by the entry:
76
+ * middleware composes downward; revalidate and the error/notFound boundaries are
77
+ * resolved by nearest-ancestor lookup. Inherited, not a single execution chain.
78
+ *
63
79
  * @internal This type is an implementation detail and may change without notice.
64
80
  */
65
81
  export type EntryPropDatas = {
@@ -69,6 +85,16 @@ export type EntryPropDatas = {
69
85
  notFoundBoundary: (ReactNode | NotFoundBoundaryHandler)[];
70
86
  };
71
87
 
88
+ /**
89
+ * Render-time presentation fields shared by every entry variant.
90
+ *
91
+ * @internal This type is an implementation detail and may change without notice.
92
+ */
93
+ export type EntryPropRender = {
94
+ loading?: ReactNode | false;
95
+ transition?: TransitionConfig;
96
+ };
97
+
72
98
  /**
73
99
  * Loader entry stored in EntryData
74
100
  * Contains the loader definition and its revalidation rules
@@ -105,12 +131,14 @@ export type InterceptSegmentsState = {
105
131
  * @internal This type is an implementation detail and may change without notice.
106
132
  */
107
133
  export type InterceptSelectorContext<TEnv = any> = {
108
- from: URL; // Source URL (where user is coming from)
109
- to: URL; // Destination URL (where user is navigating to)
110
- params: Record<string, string>; // Matched route params
111
- request: Request; // The HTTP request object
112
- env: TEnv; // Platform bindings (Cloudflare env, etc.)
113
- segments: InterceptSegmentsState; // Client's current segments (where navigating FROM)
134
+ from: URL; // Source URL (where user is coming from)
135
+ to: URL; // Destination URL (where user is navigating to)
136
+ params: Record<string, string>; // Matched route params
137
+ request: Request; // The HTTP request object
138
+ env: TEnv; // Platform bindings (Cloudflare env, etc.)
139
+ segments: InterceptSegmentsState; // Client's current segments (where navigating FROM)
140
+ fromRouteName?: DefaultRouteName; // Named route being navigated away from (undefined for unnamed routes)
141
+ toRouteName?: DefaultRouteName; // Named route being navigated to (undefined for unnamed routes)
114
142
  };
115
143
 
116
144
  /**
@@ -119,7 +147,22 @@ export type InterceptSelectorContext<TEnv = any> = {
119
147
  *
120
148
  * @internal This type is an implementation detail and may change without notice.
121
149
  */
122
- export type InterceptWhenFn<TEnv = any> = (ctx: InterceptSelectorContext<TEnv>) => boolean;
150
+ export type InterceptWhenFn<TEnv = any> = (
151
+ ctx: InterceptSelectorContext<TEnv>,
152
+ ) => boolean;
153
+
154
+ /**
155
+ * Config object passed to intercept() (its 4th argument). `when` gates whether
156
+ * the intercept activates on a soft navigation — a single match-time selector or
157
+ * an array of them (ALL must return true; omit to always activate). This is the
158
+ * intercept counterpart to transition({ when }); both express conditional
159
+ * behavior as a config field rather than a separate DSL helper.
160
+ *
161
+ * @internal This type is an implementation detail and may change without notice.
162
+ */
163
+ export interface InterceptConfig<TEnv = any> {
164
+ when?: InterceptWhenFn<TEnv> | InterceptWhenFn<TEnv>[];
165
+ }
123
166
 
124
167
  /**
125
168
  * Intercept entry stored in EntryData
@@ -128,8 +171,8 @@ export type InterceptWhenFn<TEnv = any> = (ctx: InterceptSelectorContext<TEnv>)
128
171
  * @internal This type is an implementation detail and may change without notice.
129
172
  */
130
173
  export type InterceptEntry = {
131
- slotName: `@${string}`; // e.g., "@modal"
132
- routeName: string; // e.g., "card"
174
+ slotName: `@${string}`; // e.g., "@modal"
175
+ routeName: string; // e.g., "card"
133
176
  handler: ReactNode | Handler<any, any, any>;
134
177
  middleware: MiddlewareFn<any, any>[];
135
178
  revalidate: ShouldRevalidateFn<any, any>[];
@@ -137,14 +180,34 @@ export type InterceptEntry = {
137
180
  notFoundBoundary: (ReactNode | NotFoundBoundaryHandler)[];
138
181
  loader: LoaderEntry[];
139
182
  loading?: ReactNode | false;
140
- layout?: ReactNode | Handler<any, any, any>; // Wrapper layout with <Outlet /> for content
141
- when: InterceptWhenFn[]; // Selector conditions - all must return true to intercept
183
+ transition?: TransitionConfig;
184
+ layout?: ReactNode | Handler<any, any, any>; // Wrapper layout with <Outlet /> for content
185
+ when: InterceptWhenFn[]; // Selector conditions - all must return true to intercept
142
186
  };
143
187
 
188
+ export interface ParallelEntryData
189
+ extends EntryPropCommon, EntryPropDatas, EntryPropSegments, EntryPropRender {
190
+ type: "parallel";
191
+ handler: Record<`@${string}`, Handler<any, any, any> | ReactNode>;
192
+ /** Set when any parallel slot is a Static definition */
193
+ isStaticPrerender?: true;
194
+ /** Per-slot static handler $$ids for build-time store lookup */
195
+ staticHandlerIds?: Record<string, string>;
196
+ }
197
+
198
+ export type ParallelEntries = Partial<Record<`@${string}`, ParallelEntryData>>;
199
+
200
+ /**
201
+ * This entry's own structural children plus its owned loaders. `loader` lives
202
+ * here (not in EntryPropDatas) because loaders are owned by the entry, not
203
+ * inherited from ancestors.
204
+ *
205
+ * @internal This type is an implementation detail and may change without notice.
206
+ */
144
207
  export type EntryPropSegments = {
145
208
  loader: LoaderEntry[];
146
209
  layout: EntryData[];
147
- parallel: EntryData[]; // type: "parallel" entries with their own loaders/revalidate/loading
210
+ parallel: ParallelEntries; // slot -> parallel entry (same entry may back multiple slots)
148
211
  intercept: InterceptEntry[]; // intercept definitions for soft navigation
149
212
  };
150
213
 
@@ -152,46 +215,56 @@ export type EntryData =
152
215
  | ({
153
216
  type: "route";
154
217
  handler: Handler<any, any, any>;
155
- loading?: ReactNode | false;
156
218
  /** URL pattern for this route (used by path() in urls()) */
157
219
  pattern?: string;
158
220
  /** Set when handler is a Prerender definition */
159
221
  isPrerender?: true;
160
222
  /** Original PrerenderHandlerDefinition (for build-time getParams access) */
161
- prerenderDef?: { getParams?: () => Promise<any[]> | any[]; options?: { passthrough?: boolean } };
223
+ prerenderDef?: {
224
+ getParams?: (ctx: any) => Promise<any[]> | any[];
225
+ options?: { concurrency?: number };
226
+ };
227
+ /** Set when route is wrapped with Passthrough() — has a separate live handler */
228
+ isPassthrough?: true;
229
+ /** Live handler for runtime fallback (only set on Passthrough routes) */
230
+ liveHandler?: Handler<any, any, any>;
162
231
  /** Set when handler is a Static definition (build-time only) */
163
232
  isStaticPrerender?: true;
233
+ /** Static handler $$id for build-time store lookup */
234
+ staticHandlerId?: string;
164
235
  /** Response type for non-RSC routes (json, text, image, any) */
165
236
  responseType?: string;
237
+ /**
238
+ * PPR (partial pre-rendering) opt-in from the path() `ppr` option. A
239
+ * document-level property of the page route: `true` uses the default
240
+ * shell policy, an object carries ttl/swr/tags. Read by the integrated
241
+ * PPR serve path (rsc/shell-serve.ts resolvePprConfig).
242
+ */
243
+ ppr?: boolean | import("../urls/pattern-types.js").PartialPrerenderProps;
166
244
  } & EntryPropCommon &
167
245
  EntryPropDatas &
168
- EntryPropSegments)
246
+ EntryPropSegments &
247
+ EntryPropRender)
169
248
  | ({
170
249
  type: "layout";
171
250
  handler: ReactNode | Handler<any, any, any>;
172
- loading?: ReactNode | false;
173
251
  /** Set when handler is a Static definition (build-time only) */
174
252
  isStaticPrerender?: true;
253
+ /** Static handler $$id for build-time store lookup */
254
+ staticHandlerId?: string;
175
255
  } & EntryPropCommon &
176
256
  EntryPropDatas &
177
- EntryPropSegments)
178
- | ({
179
- type: "parallel";
180
- handler: Record<`@${string}`, Handler<any, any, any> | ReactNode>;
181
- loading?: ReactNode | false;
182
- /** Set when any parallel slot is a Static definition */
183
- isStaticPrerender?: true;
184
- } & EntryPropCommon &
185
- EntryPropDatas &
186
- EntryPropSegments)
257
+ EntryPropSegments &
258
+ EntryPropRender)
259
+ | ParallelEntryData
187
260
  | ({
188
261
  type: "cache";
189
262
  /** Cache entries create cache boundaries and render like layouts (with Outlet) */
190
263
  handler: ReactNode | Handler<any, any, any>;
191
- loading?: ReactNode | false;
192
264
  } & EntryPropCommon &
193
265
  EntryPropDatas &
194
- EntryPropSegments);
266
+ EntryPropSegments &
267
+ EntryPropRender);
195
268
 
196
269
  /**
197
270
  * Tracked include info for build-time manifest generation
@@ -204,6 +277,17 @@ export interface TrackedInclude {
204
277
  lazy: boolean;
205
278
  }
206
279
 
280
+ /**
281
+ * Cached response-header write scope (issue #713). `kind` selects the error
282
+ * wording; `routeKey` names the route in the error.
283
+ *
284
+ * @internal This type is an implementation detail and may change without notice.
285
+ */
286
+ export type CachedHeaderScope = {
287
+ kind: "cache" | "ppr";
288
+ routeKey?: string;
289
+ };
290
+
207
291
  /**
208
292
  * Context stored in AsyncLocalStorage
209
293
  */
@@ -229,13 +313,72 @@ interface HelperContext {
229
313
  urlPrefix?: string;
230
314
  /** Name prefix from include() - applied to all named routes */
231
315
  namePrefix?: string;
316
+ /** True when this scope is at root level (no named include boundary above).
317
+ * Routes at root scope allow dot-local reverse to fall back to bare names. */
318
+ rootScoped?: boolean;
232
319
  /** Run helper for cleaner middleware code */
233
320
  run?: <T>(fn: () => T | Promise<T>) => T | Promise<T>;
234
321
  /** Tracked includes for build-time manifest generation */
235
322
  trackedIncludes?: TrackedInclude[];
323
+ /** Cache profiles for DSL-time cache("profileName") resolution */
324
+ cacheProfiles?: Record<
325
+ string,
326
+ import("../cache/profile-registry.js").CacheProfile
327
+ >;
328
+ /** True when resolving handlers inside a cache() DSL boundary.
329
+ * Read by ctx.get() to guard non-cacheable variable reads. */
330
+ insideCacheScope?: boolean;
331
+ /**
332
+ * RULE (issue #713): in any cached scenario ONLY MIDDLEWARE writes response
333
+ * headers. Latched by the segment funnels, consulted by
334
+ * assertCachedHeaderWriteAllowed(); full doctrine in
335
+ * docs/design/ppr-shell-resume.md "The header doctrine".
336
+ */
337
+ cachedHeaderScope?: CachedHeaderScope;
338
+ /**
339
+ * Include scope string applied to direct-descendant shortCodes.
340
+ *
341
+ * Each `include(...)` call allocates a sibling-positional token like `I0`,
342
+ * `I1` from its parent's include counter and stores the composed scope
343
+ * (`${parentScope}I${idx}`) in its lazyContext. When the include's handler
344
+ * evaluates lazily, the store's `includeScope` is set from that context so
345
+ * every direct-descendant shortCode is generated as
346
+ * `${parent.shortCode}${includeScope}${prefix}${index}` — preventing
347
+ * collisions with siblings declared outside the include.
348
+ *
349
+ * The scope is NOT propagated through `store.run(...)`, so layouts /
350
+ * parallels / caches inside the include absorb the scope into their own
351
+ * shortCodes and their children start fresh.
352
+ */
353
+ includeScope?: string;
354
+ }
355
+ // Use a global symbol key so the AsyncLocalStorage instance survives HMR
356
+ // module re-evaluation. Without this, Vite's RSC module runner may create
357
+ // a new instance when context.ts is re-evaluated, while other modules still
358
+ // hold references to the old instance — causing getStore() to return
359
+ // undefined even inside a run() callback.
360
+ const RSC_CONTEXT_KEY = Symbol.for("rangojs-router:rsc-context");
361
+ export const RangoContext: AsyncLocalStorage<HelperContext> = ((
362
+ globalThis as any
363
+ )[RSC_CONTEXT_KEY] ??= new AsyncLocalStorage<HelperContext>());
364
+
365
+ /** shortCode prefix letter per entry type (e.g. "L0", "R2", "M1C0"). */
366
+ const SHORT_CODE_PREFIX: Record<
367
+ "layout" | "parallel" | "route" | "loader" | "cache",
368
+ string
369
+ > = {
370
+ layout: "L",
371
+ parallel: "P",
372
+ route: "R",
373
+ loader: "D",
374
+ cache: "C",
375
+ };
376
+
377
+ /** Post-increment a named per-store counter, returning the prior value. */
378
+ function bumpCounter(store: HelperContext, key: string): number {
379
+ store.counters[key] ??= 0;
380
+ return store.counters[key]++;
236
381
  }
237
- export const RSCRouterContext: AsyncLocalStorage<HelperContext> =
238
- new AsyncLocalStorage<HelperContext>();
239
382
 
240
383
  export const getContext = (): {
241
384
  context: AsyncLocalStorage<HelperContext>;
@@ -243,29 +386,29 @@ export const getContext = (): {
243
386
  getParent: () => EntryData | null;
244
387
  getOrCreateStore: (forRoute?: string) => HelperContext;
245
388
  getNextIndex: (
246
- type: (string & {}) | "layout" | "parallel" | "middleware" | "revalidate"
389
+ type: (string & {}) | "layout" | "parallel" | "middleware" | "revalidate",
247
390
  ) => string;
248
391
  getShortCode: (
249
- type: "layout" | "parallel" | "route" | "loader" | "cache"
392
+ type: "layout" | "parallel" | "route" | "loader" | "cache",
250
393
  ) => string;
251
394
  run: <T>(
252
395
  namespace: string,
253
396
  parent: EntryData | null,
254
- callback: (...args: any[]) => T
397
+ callback: (...args: any[]) => T,
255
398
  ) => T;
256
399
  runWithStore: <T>(
257
400
  store: HelperContext,
258
401
  namespace: string,
259
402
  parent: EntryData | null,
260
- callback: (...args: any[]) => T
403
+ callback: (...args: any[]) => T,
261
404
  ) => T;
262
405
  } => {
263
- const context = RSCRouterContext;
406
+ const context = RangoContext;
264
407
 
265
408
  return {
266
409
  context,
267
410
  getOrCreateStore: (forRoute?: string): HelperContext => {
268
- let store = RSCRouterContext.getStore();
411
+ let store = RangoContext.getStore();
269
412
  if (!store) {
270
413
  store = {
271
414
  manifest: new Map<string, EntryData>(),
@@ -285,7 +428,7 @@ export const getContext = (): {
285
428
  const store = context.getStore();
286
429
  if (!store) {
287
430
  throw new Error(
288
- "RSC Router context store is not available. Make sure to run within RSC Router context."
431
+ "Rango context store is not available. Make sure to run within Rango context.",
289
432
  );
290
433
  }
291
434
  return store;
@@ -299,44 +442,46 @@ export const getContext = (): {
299
442
  return store.parent;
300
443
  },
301
444
  getNextIndex: (
302
- type: (string & {}) | "layout" | "parallel" | "middleware" | "revalidate"
445
+ type: (string & {}) | "layout" | "parallel" | "middleware" | "revalidate",
303
446
  ) => {
304
447
  const store = context.getStore();
305
- invariant(store, "No context RSCRouterContext available");
306
- store.counters[type] ??= 0;
307
- const index = store.counters[type];
308
- store.counters[type] = index + 1;
309
- return `$${type}.${index}`;
448
+ invariant(store, "No context RangoContext available");
449
+ return `$${type}.${bumpCounter(store, type)}`;
310
450
  },
311
- getShortCode: (type: "layout" | "parallel" | "route" | "loader" | "cache") => {
451
+ getShortCode: (
452
+ type: "layout" | "parallel" | "route" | "loader" | "cache",
453
+ ) => {
312
454
  const store = context.getStore();
313
- invariant(store, "No context RSCRouterContext available");
455
+ invariant(store, "No context RangoContext available");
314
456
 
315
457
  const parent = store.parent;
316
- const prefix = type === "layout" ? "L" : type === "parallel" ? "P" : type === "loader" ? "D" : type === "cache" ? "C" : "R";
317
- const mountPrefix = store.mountIndex !== undefined ? `M${store.mountIndex}` : "";
458
+ const prefix = SHORT_CODE_PREFIX[type];
459
+ const mountPrefix =
460
+ store.mountIndex !== undefined ? `M${store.mountIndex}` : "";
461
+
462
+ const includeScope = store.includeScope ?? "";
318
463
 
319
464
  if (!parent) {
320
465
  // Root entry: prefix with mount index and use mount-scoped counter
321
- const counterKey = mountPrefix ? `${mountPrefix}_root_${type}` : `root_${type}`;
322
- store.counters[counterKey] ??= 0;
323
- const index = store.counters[counterKey];
324
- store.counters[counterKey] = index + 1;
325
- return `${mountPrefix}${prefix}${index}`;
466
+ const counterKey = mountPrefix
467
+ ? `${mountPrefix}_root_${type}`
468
+ : `root_${type}`;
469
+ return `${mountPrefix}${prefix}${bumpCounter(store, counterKey)}`;
326
470
  } else {
327
- // Child entry: use parent-scoped counter (parent already has M prefix)
328
- const counterKey = `${parent.shortCode}_${type}`;
329
- store.counters[counterKey] ??= 0;
330
- const index = store.counters[counterKey];
331
- store.counters[counterKey] = index + 1;
332
- return `${parent.shortCode}${prefix}${index}`;
471
+ // Child entry: use parent-scoped counter with includeScope appended.
472
+ // When we're evaluating a lazy include's direct children, includeScope
473
+ // is a per-include token like "I0" / "I1I0" that partitions the
474
+ // parent's counter namespace so routes inside one include cannot
475
+ // collide with siblings declared outside it.
476
+ const counterKey = `${parent.shortCode}${includeScope}_${type}`;
477
+ return `${parent.shortCode}${includeScope}${prefix}${bumpCounter(store, counterKey)}`;
333
478
  }
334
479
  },
335
480
  runWithStore: <T>(
336
481
  store: HelperContext,
337
482
  namespace: string,
338
483
  parent: EntryData | null,
339
- callback: (...args: any[]) => T
484
+ callback: (...args: any[]) => T,
340
485
  ): T => {
341
486
  return context.run(
342
487
  {
@@ -353,23 +498,33 @@ export const getContext = (): {
353
498
  searchSchemas: store.searchSchemas,
354
499
  urlPrefix: store.urlPrefix,
355
500
  namePrefix: store.namePrefix,
501
+ rootScoped: store.rootScoped,
356
502
  trackedIncludes: store.trackedIncludes,
503
+ cacheProfiles: store.cacheProfiles,
504
+ includeScope: store.includeScope,
505
+ // cachedHeaderScope (and insideCacheScope) deliberately NOT copied —
506
+ // the header guard's middleware exemption depends on the latch dying
507
+ // with the funnel scope (see assertCachedHeaderWriteAllowed).
357
508
  },
358
- callback
509
+ callback,
359
510
  );
360
511
  },
361
512
  run: <T>(
362
513
  namespace: string,
363
514
  parent: EntryData | null,
364
- callback: (...args: any[]) => T
515
+ callback: (...args: any[]) => T,
365
516
  ) => {
366
517
  const store = context.getStore();
367
518
  // Preserve parent counters to ensure globally unique shortCodes
368
519
  const counters = store?.counters || {};
369
520
  const manifest = store ? store.manifest : new Map<string, EntryData>();
370
521
  const patterns = store?.patterns || new Map<string, string>();
371
- const trailingSlash = store?.trailingSlash || new Map<string, "never" | "always" | "ignore">();
372
- const searchSchemas = store?.searchSchemas || new Map<string, Record<string, string>>();
522
+ const patternsByPrefix = store?.patternsByPrefix;
523
+ const trailingSlash =
524
+ store?.trailingSlash ||
525
+ new Map<string, "never" | "always" | "ignore">();
526
+ const searchSchemas =
527
+ store?.searchSchemas || new Map<string, Record<string, string>>();
373
528
  return context.run(
374
529
  {
375
530
  manifest,
@@ -381,18 +536,46 @@ export const getContext = (): {
381
536
  metrics: store?.metrics,
382
537
  isSSR: store?.isSSR,
383
538
  patterns,
539
+ patternsByPrefix,
384
540
  trailingSlash,
385
541
  searchSchemas,
386
542
  urlPrefix: store?.urlPrefix,
387
543
  namePrefix: store?.namePrefix,
544
+ rootScoped: store?.rootScoped,
388
545
  trackedIncludes: store?.trackedIncludes,
546
+ cacheProfiles: store?.cacheProfiles,
389
547
  },
390
- callback
548
+ callback,
391
549
  );
392
550
  },
393
551
  };
394
552
  };
395
553
 
554
+ /**
555
+ * Acquire the active DSL build context, throwing `message` if a helper was
556
+ * called outside a urls()/map() builder. Returns the store API and the live
557
+ * HelperContext so callers avoid a second getContext() lookup.
558
+ */
559
+ export function requireDslContext(message: string): {
560
+ store: ReturnType<typeof getContext>;
561
+ ctx: HelperContext;
562
+ } {
563
+ const store = getContext();
564
+ const ctx = store.context.getStore();
565
+ if (!ctx) {
566
+ // The only reason the store is absent here is that a route-definition helper
567
+ // ran with no active RangoContext — i.e. outside a urls()/map() builder.
568
+ // Record that as the cause so the throw is self-explanatory, not a bare
569
+ // "must be called inside urls()" with no indication of the mechanism.
570
+ throw new DslContextError(message, {
571
+ cause:
572
+ "RangoContext store is undefined: a route-definition helper was called " +
573
+ "outside an active urls()/map() builder.",
574
+ });
575
+ }
576
+ return { store, ctx };
577
+ }
578
+
396
579
  /**
397
580
  * Run a callback with specific URL and name prefixes
398
581
  * Used by include() to apply prefixes to nested patterns
@@ -400,9 +583,9 @@ export const getContext = (): {
400
583
  export function runWithPrefixes<T>(
401
584
  urlPrefix: string,
402
585
  namePrefix: string | undefined,
403
- callback: () => T
586
+ callback: () => T,
404
587
  ): T {
405
- const store = RSCRouterContext.getStore();
588
+ const store = RangoContext.getStore();
406
589
  if (!store) {
407
590
  throw new Error("runWithPrefixes must be called within router context");
408
591
  }
@@ -418,19 +601,43 @@ export function runWithPrefixes<T>(
418
601
  } else {
419
602
  combinedUrlPrefix = urlPrefix;
420
603
  }
421
- const combinedNamePrefix = namePrefix
422
- ? store.namePrefix
423
- ? `${store.namePrefix}.${namePrefix}`
424
- : namePrefix
425
- : store.namePrefix;
604
+ const combinedNamePrefix =
605
+ namePrefix !== undefined
606
+ ? namePrefix === ""
607
+ ? store.namePrefix
608
+ : store.namePrefix
609
+ ? `${store.namePrefix}.${namePrefix}`
610
+ : namePrefix
611
+ : store.namePrefix;
426
612
 
427
- return RSCRouterContext.run(
613
+ // Track root scope for dot-local reverse resolution.
614
+ //
615
+ // The flag answers: "can this route reach bare names at root scope?"
616
+ // It propagates through the include chain:
617
+ //
618
+ // { name: "" } — transparent: inherit parent, default true
619
+ // { name: "foo" } — inherit parent if already set, else create boundary (false)
620
+ // no name — inherit parent unchanged
621
+ //
622
+ // This means { name: "" } + nested { name: "sub" } keeps rootScoped=true
623
+ // (the outer transparent include establishes root access, and the inner
624
+ // named include inherits it). But a direct { name: "sub" } at root gets
625
+ // rootScoped=false (no prior root-access grant, so it creates a boundary).
626
+ const combinedRootScoped =
627
+ namePrefix === ""
628
+ ? (store.rootScoped ?? true)
629
+ : namePrefix !== undefined
630
+ ? (store.rootScoped ?? false)
631
+ : store.rootScoped;
632
+
633
+ return RangoContext.run(
428
634
  {
429
635
  ...store,
430
636
  urlPrefix: combinedUrlPrefix,
431
637
  namePrefix: combinedNamePrefix,
638
+ rootScoped: combinedRootScoped,
432
639
  },
433
- callback
640
+ callback,
434
641
  );
435
642
  }
436
643
 
@@ -438,7 +645,7 @@ export function runWithPrefixes<T>(
438
645
  * Get current URL prefix from context
439
646
  */
440
647
  export function getUrlPrefix(): string {
441
- const store = RSCRouterContext.getStore();
648
+ const store = RangoContext.getStore();
442
649
  return store?.urlPrefix || "";
443
650
  }
444
651
 
@@ -446,13 +653,96 @@ export function getUrlPrefix(): string {
446
653
  * Get current name prefix from context
447
654
  */
448
655
  export function getNamePrefix(): string | undefined {
449
- const store = RSCRouterContext.getStore();
656
+ const store = RangoContext.getStore();
450
657
  return store?.namePrefix;
451
658
  }
452
659
 
660
+ /**
661
+ * Get whether the current scope is at root level (no named include boundary above).
662
+ * Returns true at root or inside { name: "" } includes, false inside named includes.
663
+ */
664
+ export function getRootScoped(): boolean {
665
+ const store = RangoContext.getStore();
666
+ return store?.rootScoped ?? true;
667
+ }
668
+
453
669
  // Export HelperContext type for use in other modules
454
670
  export type { HelperContext };
455
671
 
672
+ /**
673
+ * Return an isolated copy of a lazy include's captured parent entry.
674
+ *
675
+ * DSL helpers (loader(), middleware(), etc.) mutate ctx.parent in place.
676
+ * Multiple include() scopes capture the *same* syntheticMapRoot as their
677
+ * parent, so without isolation one include's loaders/middleware leak into
678
+ * every other route that shares that root.
679
+ *
680
+ * The clone is shallow: only the mutable arrays are copied so each
681
+ * include pushes to its own list. The rest of the entry (id, shortCode,
682
+ * parent pointer, handler) stays shared, which is correct and cheap.
683
+ */
684
+ export function getIsolatedLazyParent(
685
+ captured: EntryData | null | undefined,
686
+ ): EntryData | null {
687
+ if (!captured) return null;
688
+ return {
689
+ ...captured,
690
+ loader: [...captured.loader],
691
+ middleware: [...captured.middleware],
692
+ revalidate: [...captured.revalidate],
693
+ errorBoundary: [...captured.errorBoundary],
694
+ notFoundBoundary: [...captured.notFoundBoundary],
695
+ layout: [...captured.layout],
696
+ parallel: { ...captured.parallel },
697
+ intercept: [...captured.intercept],
698
+ };
699
+ }
700
+
701
+ export function getParallelEntries(
702
+ parallels: ParallelEntries | EntryData[] | undefined,
703
+ ): ParallelEntryData[] {
704
+ if (!parallels) return [];
705
+ if (Array.isArray(parallels)) {
706
+ return parallels.filter(
707
+ (entry): entry is ParallelEntryData => entry.type === "parallel",
708
+ );
709
+ }
710
+ return Object.values(parallels).filter(
711
+ (entry): entry is ParallelEntryData => !!entry,
712
+ );
713
+ }
714
+
715
+ export function getParallelSlotEntries(
716
+ parallels: ParallelEntries | EntryData[] | undefined,
717
+ ): Array<{ slot: `@${string}`; entry: ParallelEntryData }> {
718
+ if (!parallels) return [];
719
+
720
+ if (Array.isArray(parallels)) {
721
+ return getParallelEntries(parallels).flatMap((entry) =>
722
+ (Object.keys(entry.handler) as `@${string}`[]).map((slot) => ({
723
+ slot,
724
+ entry,
725
+ })),
726
+ );
727
+ }
728
+
729
+ return Object.entries(parallels)
730
+ .filter(([, entry]) => !!entry)
731
+ .map(([slot, entry]) => ({
732
+ slot: slot as `@${string}`,
733
+ entry: entry!,
734
+ }));
735
+ }
736
+
737
+ export function getParallelSlotCount(
738
+ parallels: ParallelEntries | EntryData[] | undefined,
739
+ ): number {
740
+ if (!parallels) return 0;
741
+ return Array.isArray(parallels)
742
+ ? parallels.filter((entry) => entry?.type === "parallel").length
743
+ : Object.keys(parallels).length;
744
+ }
745
+
456
746
  // ============================================================================
457
747
  // Performance Metrics Helpers
458
748
  // ============================================================================
@@ -468,8 +758,8 @@ export type { HelperContext };
468
758
  * done(); // Records duration
469
759
  * ```
470
760
  */
471
- export function track(label: string): () => void {
472
- const store = RSCRouterContext.getStore();
761
+ export function track(label: string, depth?: number): () => void {
762
+ const store = RangoContext.getStore();
473
763
 
474
764
  // No-op if context unavailable or metrics not enabled
475
765
  if (!store?.metrics?.enabled) {
@@ -479,7 +769,272 @@ export function track(label: string): () => void {
479
769
  const startTime = performance.now() - store.metrics.requestStart;
480
770
 
481
771
  return () => {
482
- const duration = performance.now() - store.metrics!.requestStart - startTime;
483
- store.metrics!.metrics.push({ label, duration, startTime });
772
+ const duration =
773
+ performance.now() - store.metrics!.requestStart - startTime;
774
+ store.metrics!.metrics.push({
775
+ label,
776
+ duration,
777
+ startTime,
778
+ ...(depth != null ? { depth } : {}),
779
+ });
484
780
  };
485
781
  }
782
+
783
+ /**
784
+ * Separate ALS for tracking loader execution scope.
785
+ * Uses a dedicated ALS (not RangoContext) to avoid issues with
786
+ * nested RangoContext.run() calls in Vite's module runner.
787
+ */
788
+ const LOADER_SCOPE_KEY = Symbol.for("rangojs-router:loader-scope");
789
+ const loaderScopeALS: AsyncLocalStorage<{ active: true }> = ((
790
+ globalThis as any
791
+ )[LOADER_SCOPE_KEY] ??= new AsyncLocalStorage<{ active: true }>());
792
+
793
+ // Purity-only scope: marks that a loader FUNCTION BODY is executing, regardless
794
+ // of how the loader was invoked (DSL via runInsideLoaderScope, or handler-
795
+ // invoked via ctx.use). Consulted by isInsideCacheScope() to exempt
796
+ // request-scoped reads, by getCurrentLoaderBodyId() for guard-warning
797
+ // attribution, and by isInsideHandlerInvokedLoaderBody() for the
798
+ // consumption-lane rule (the shell-capture guard exemption). It deliberately
799
+ // does NOT affect isInsideLoaderScope(), so rendered()/barrier/deadlock
800
+ // gating (which must distinguish DSL from handler-invoked loaders) is
801
+ // unchanged.
802
+ const LOADER_BODY_SCOPE_KEY = Symbol.for("rangojs-router:loader-body-scope");
803
+ const loaderBodyScopeALS: AsyncLocalStorage<{
804
+ active: true;
805
+ loaderId?: string;
806
+ handlerInvoked?: boolean;
807
+ }> = ((globalThis as any)[LOADER_BODY_SCOPE_KEY] ??= new AsyncLocalStorage<{
808
+ active: true;
809
+ loaderId?: string;
810
+ handlerInvoked?: boolean;
811
+ }>());
812
+
813
+ /**
814
+ * Check if the current execution is inside a cache() DSL boundary.
815
+ * Returns false inside loader execution — loaders are always fresh
816
+ * (never cached), so non-cacheable reads are safe.
817
+ */
818
+ export function isInsideCacheScope(): boolean {
819
+ if (RangoContext.getStore()?.insideCacheScope !== true) return false;
820
+ // Request-scoped READS are exempt in any loader body — DSL loaders re-run on
821
+ // every request (including cache() HITs via resolveLoadersOnly), and a
822
+ // handler-invoked loader body, though skipped with its handler on a HIT,
823
+ // yields a BAKED shared copy in the cached artifact — an accepted
824
+ // consumption-lane tradeoff (#672/#674). This is deliberately BROADER than
825
+ // the WRITE guard (assertCachedHeaderWriteAllowed narrows the cache()
826
+ // exemption to DSL scope, #725): a read bakes-and-accepts, a Set-Cookie/header
827
+ // write drops-and-throws because it has no baked-copy semantics on a HIT.
828
+ if (isInsideAnyLoaderScope()) return false;
829
+ return true;
830
+ }
831
+
832
+ /**
833
+ * Check if the current execution is inside a DSL loader scope
834
+ * (wrapped by runInsideLoaderScope). Used by rendered() barrier
835
+ * to distinguish DSL loaders from handler-invoked loaders.
836
+ */
837
+ export function isInsideLoaderScope(): boolean {
838
+ return loaderScopeALS.getStore()?.active === true;
839
+ }
840
+
841
+ /**
842
+ * Latch the cached header-write scope for the current request. First latch
843
+ * wins: a ppr route latched at the funnel top is not downgraded by a nested
844
+ * cache() entry (the document-scoped wording is the more useful one).
845
+ * Takes scalars so the already-latched path allocates nothing.
846
+ */
847
+ export function latchCachedHeaderScope(
848
+ kind: CachedHeaderScope["kind"],
849
+ routeKey?: string,
850
+ ): void {
851
+ const store = RangoContext.getStore();
852
+ if (store && !store.cachedHeaderScope) {
853
+ store.cachedHeaderScope = { kind, routeKey };
854
+ }
855
+ }
856
+
857
+ /** True inside ANY loader execution — DSL loader scope or a loader body
858
+ * (however invoked). The "loaders always re-run fresh" exemptions key off
859
+ * this. */
860
+ function isInsideAnyLoaderScope(): boolean {
861
+ return (
862
+ loaderScopeALS.getStore()?.active === true ||
863
+ loaderBodyScopeALS.getStore()?.active === true
864
+ );
865
+ }
866
+
867
+ /**
868
+ * The one ppr opt-in predicate: a page route entry that DECLARED `ppr`
869
+ * (`false` and undefined mean plain axis 1). Shared by the serve path
870
+ * (rsc/shell-serve.ts resolvePprConfig) and the header-write latch below so
871
+ * the two layers can never drift on what counts as a ppr route.
872
+ */
873
+ export function isPprEntry(entry: EntryData): entry is EntryData & {
874
+ type: "route";
875
+ ppr: true | import("../urls/pattern-types.js").PartialPrerenderProps;
876
+ } {
877
+ return (
878
+ entry.type === "route" && entry.ppr !== undefined && entry.ppr !== false
879
+ );
880
+ }
881
+
882
+ /**
883
+ * Latch the ppr header-write scope when the entry chain about to resolve is a
884
+ * `ppr` page route's. Called at the TOP of every segment funnel — unlike
885
+ * cache() (positional: ancestors before the boundary stay writable), ppr is
886
+ * document-scoped: the root layout down to the page bakes into the shared
887
+ * shell, so the whole funnel is cached territory.
888
+ *
889
+ * Checks the LEAF entry only: `entries` is the traverseBack chain
890
+ * [root, ..., manifestEntry], and the serve path reads `ppr` off the same
891
+ * leaf (rsc-rendering.ts: resolvePprConfig(manifestEntry)) — guard and serve
892
+ * share the predicate (isPprEntry) AND the input, so they cannot drift.
893
+ */
894
+ export function latchPprHeaderScopeForEntries(
895
+ entries: EntryData[],
896
+ routeKey?: string,
897
+ ): void {
898
+ const store = RangoContext.getStore();
899
+ if (!store || store.cachedHeaderScope) return;
900
+ const leaf = entries[entries.length - 1];
901
+ if (leaf !== undefined && isPprEntry(leaf)) {
902
+ store.cachedHeaderScope = { kind: "ppr", routeKey };
903
+ }
904
+ }
905
+
906
+ /**
907
+ * RULE (issue #713): in any cached scenario ONLY MIDDLEWARE writes response
908
+ * headers — handler and loader writes throw while a scope is latched; the one
909
+ * exemption is DSL (registered) loaders under plain cache(). A handler-invoked
910
+ * loader body (ctx.use from a handler, never registered with loader()) is
911
+ * skipped with its handler on a HIT and throws like a handler write (#725).
912
+ * Full layer rules and rationale: docs/design/ppr-shell-resume.md "The header
913
+ * doctrine".
914
+ */
915
+ export function assertCachedHeaderWriteAllowed(
916
+ surface: string,
917
+ surfaceProp?: string | symbol,
918
+ ): void {
919
+ const scope = RangoContext.getStore()?.cachedHeaderScope;
920
+ if (!scope) return;
921
+ // Exempt DSL loaders (loaderScopeALS) ONLY. A registered loader re-runs on
922
+ // every cache HIT (fresh.ts runInsideLoaderScope -> cache-lookup.ts
923
+ // resolveLoadersOnly), so its header/cookie writes merge into every response
924
+ // with no MISS/HIT divergence. A handler-invoked loader body has
925
+ // loaderBodyScopeALS active but loaderScopeALS unset (loader-resolution.ts
926
+ // derives isDslLoader from isInsideLoaderScope()); on a HIT the handler is
927
+ // skipped so that loader never re-runs and its write would land only on the
928
+ // MISS — throw it. isInsideLoaderScope() (not isInsideAnyLoaderScope) is the
929
+ // discriminator; the DSL scope ALS survives nested ctx.use bodies, so a
930
+ // handler-invoked loader nested under a DSL loader stays exempt (its DSL
931
+ // parent re-invokes it on every HIT). This is the exempt fast path, so the
932
+ // broad predicate for the error label is deferred to the throw path below.
933
+ if (scope.kind === "cache" && isInsideLoaderScope()) return;
934
+ // Everything below runs only on the throw path — `surfaceProp` exists so
935
+ // callers pass constants and the success path allocates nothing (the full
936
+ // surface, e.g. "ctx.headers.set()", is assembled here). isInsideAnyLoaderScope
937
+ // (broad) labels a now-throwing handler-invoked loader body "loader".
938
+ const fullSurface =
939
+ surfaceProp === undefined ? surface : `${surface}.${String(surfaceProp)}()`;
940
+ const layer = isInsideAnyLoaderScope() ? "loader" : "handler";
941
+ const route = scope.routeKey ? ` (route "${scope.routeKey}")` : "";
942
+ const where =
943
+ scope.kind === "ppr"
944
+ ? `on a ppr route${route} — the document shell is cached and replayed`
945
+ : `inside a cache() boundary${route}`;
946
+ // ppr loader writes fail by physics (headers flush before loaders settle);
947
+ // every other throw — a handler, or a handler-invoked loader under cache() —
948
+ // fails because the handler is skipped on a HIT, so key the reason on the
949
+ // scope kind, not the layer.
950
+ const why =
951
+ scope.kind === "ppr" && layer === "loader"
952
+ ? "The response headers flush with the shell before loaders settle, so this write is dropped on cache hits."
953
+ : "On a cache hit the handler is skipped, so this write would silently vanish.";
954
+ throw new Error(
955
+ `${fullSurface} cannot be called from a ${layer} ${where}. ${why} ` +
956
+ "Set response headers in route middleware instead — middleware runs " +
957
+ "on every request, including cache hits.",
958
+ );
959
+ }
960
+
961
+ /**
962
+ * Run `fn` inside a loader scope. While active, cache-scope guards
963
+ * are bypassed because loaders are always fresh (never cached) and
964
+ * their side effects (setCookie, header, etc.) are safe.
965
+ */
966
+ export function runInsideLoaderScope<T>(fn: () => T): T {
967
+ return loaderScopeALS.run({ active: true }, fn);
968
+ }
969
+
970
+ /**
971
+ * Run `fn` inside a loader BODY scope. Marks loader-function execution for the
972
+ * cache-purity guard only (isInsideCacheScope), WITHOUT affecting
973
+ * isInsideLoaderScope()/rendered() gating. Applied to every loader body (DSL
974
+ * and handler-invoked via ctx.use) so request-scoped reads inside a loader
975
+ * never trip the cache-scope guards — loaders always run fresh.
976
+ */
977
+ export function runInsideLoaderBodyScope<T>(
978
+ fn: () => T,
979
+ loaderId?: string,
980
+ handlerInvoked?: boolean,
981
+ ): T {
982
+ return loaderBodyScopeALS.run({ active: true, loaderId, handlerInvoked }, fn);
983
+ }
984
+
985
+ /**
986
+ * The $$id of the loader whose body is currently executing, or undefined
987
+ * outside any loader body. Used by the shell-capture identity guard
988
+ * (cookie-store.ts) so its refusal warning can name the loader that read
989
+ * cookies()/headers() instead of blaming a lane it cannot see — the old
990
+ * hardcoded "bake-lane loader" text misled a live-lane debugging session
991
+ * (issue #672, secondary).
992
+ */
993
+ export function getCurrentLoaderBodyId(): string | undefined {
994
+ return loaderBodyScopeALS.getStore()?.loaderId;
995
+ }
996
+
997
+ /**
998
+ * True while a HANDLER-invoked loader body (`await ctx.use(Loader)` from a
999
+ * handler, not the DSL segment funnel) is executing. The consumption-lane
1000
+ * rule keys off this: handler consumption yields a BAKED copy in every shared
1001
+ * artifact — cache(), "use cache", and the PPR shell — so the shell-capture
1002
+ * identity guard (cookie-store.ts) permits cookies()/headers() here, exactly
1003
+ * like the cache-purity guards do. DSL segment loaders (live lane masked at
1004
+ * capture, bake lane guarded) never set the flag.
1005
+ */
1006
+ export function isInsideHandlerInvokedLoaderBody(): boolean {
1007
+ return loaderBodyScopeALS.getStore()?.handlerInvoked === true;
1008
+ }
1009
+
1010
+ // Scope for handle PUSH CALLBACKS (push(() => ...), including async ones).
1011
+ // A push callback's value is stored as-is; if it is a promise it is NOT tracked
1012
+ // by handleStore.settled and does not block segment resolution, so a
1013
+ // ctx.use(loader) made from inside such a callback can never form a rendered()
1014
+ // deadlock. This is an ALS (not a plain boolean) so the exemption survives the
1015
+ // callback's own awaits — an async push callback that resumes after `await`
1016
+ // still reads as "inside a push callback" and stays out of the deadlock guard.
1017
+ const PUSH_CALLBACK_SCOPE_KEY = Symbol.for(
1018
+ "rangojs-router:push-callback-scope",
1019
+ );
1020
+ const pushCallbackScopeALS: AsyncLocalStorage<{ active: true }> = ((
1021
+ globalThis as any
1022
+ )[PUSH_CALLBACK_SCOPE_KEY] ??= new AsyncLocalStorage<{ active: true }>());
1023
+
1024
+ /**
1025
+ * Check if the current execution is inside a handle push callback (sync or an
1026
+ * async callback's continuation). Used by the handler-to-loader deadlock guard
1027
+ * to exempt push-callback continuations.
1028
+ */
1029
+ export function isInsidePushCallbackScope(): boolean {
1030
+ return pushCallbackScopeALS.getStore()?.active === true;
1031
+ }
1032
+
1033
+ /**
1034
+ * Run `fn` inside a push-callback scope. Wraps the invocation of a handle push
1035
+ * callback so that any ctx.use(loader) it makes — including after one of its own
1036
+ * awaits — is exempt from the deadlock guard.
1037
+ */
1038
+ export function runInsidePushCallbackScope<T>(fn: () => T): T {
1039
+ return pushCallbackScopeALS.run({ active: true }, fn);
1040
+ }