@rangojs/router 0.0.0-experimental.141 → 0.0.0-experimental.143

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 (918) hide show
  1. package/AGENTS.md +6 -10
  2. package/README.md +17 -0
  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.map +1 -0
  82. package/dist/browser/event-controller.d.ts +191 -0
  83. package/dist/browser/event-controller.d.ts.map +1 -0
  84. package/dist/browser/event-controller.js +559 -0
  85. package/dist/browser/event-controller.js.map +1 -0
  86. package/dist/browser/index.d.ts +2 -0
  87. package/dist/browser/index.d.ts.map +1 -0
  88. package/dist/browser/index.js +14 -0
  89. package/dist/browser/index.js.map +1 -0
  90. package/dist/browser/link-interceptor.d.ts +38 -0
  91. package/dist/browser/link-interceptor.d.ts.map +1 -0
  92. package/dist/browser/link-interceptor.js +99 -0
  93. package/dist/browser/link-interceptor.js.map +1 -0
  94. package/dist/browser/logging.d.ts +10 -0
  95. package/dist/browser/logging.d.ts.map +1 -0
  96. package/dist/browser/logging.js +29 -0
  97. package/dist/browser/logging.js.map +1 -0
  98. package/dist/browser/lru-cache.d.ts +17 -0
  99. package/dist/browser/lru-cache.d.ts.map +1 -0
  100. package/dist/browser/lru-cache.js +50 -0
  101. package/dist/browser/lru-cache.js.map +1 -0
  102. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  103. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  104. package/dist/browser/merge-segment-loaders.js +102 -0
  105. package/dist/browser/merge-segment-loaders.js.map +1 -0
  106. package/dist/browser/navigation-bridge.d.ts +102 -0
  107. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  108. package/dist/browser/navigation-bridge.js +708 -0
  109. package/dist/browser/navigation-bridge.js.map +1 -0
  110. package/dist/browser/navigation-client.d.ts +25 -0
  111. package/dist/browser/navigation-client.d.ts.map +1 -0
  112. package/dist/browser/navigation-client.js +157 -0
  113. package/dist/browser/navigation-client.js.map +1 -0
  114. package/dist/browser/navigation-store.d.ts +101 -0
  115. package/dist/browser/navigation-store.d.ts.map +1 -0
  116. package/dist/browser/navigation-store.js +625 -0
  117. package/dist/browser/navigation-store.js.map +1 -0
  118. package/dist/browser/partial-update.d.ts +75 -0
  119. package/dist/browser/partial-update.d.ts.map +1 -0
  120. package/dist/browser/partial-update.js +426 -0
  121. package/dist/browser/partial-update.js.map +1 -0
  122. package/dist/browser/react/Link.d.ts +86 -0
  123. package/dist/browser/react/Link.d.ts.map +1 -0
  124. package/dist/browser/react/Link.js +128 -0
  125. package/dist/browser/react/Link.js.map +1 -0
  126. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  127. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  128. package/dist/browser/react/NavigationProvider.js +216 -0
  129. package/dist/browser/react/NavigationProvider.js.map +1 -0
  130. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  132. package/dist/browser/react/ScrollRestoration.js +57 -0
  133. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  134. package/dist/browser/react/context.d.ts +46 -0
  135. package/dist/browser/react/context.d.ts.map +1 -0
  136. package/dist/browser/react/context.js +10 -0
  137. package/dist/browser/react/context.js.map +1 -0
  138. package/dist/browser/react/index.d.ts +11 -0
  139. package/dist/browser/react/index.d.ts.map +1 -0
  140. package/dist/browser/react/index.js +22 -0
  141. package/dist/browser/react/index.js.map +1 -0
  142. package/dist/browser/react/location-state-shared.d.ts +63 -0
  143. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  144. package/dist/browser/react/location-state-shared.js +81 -0
  145. package/dist/browser/react/location-state-shared.js.map +1 -0
  146. package/dist/browser/react/location-state.d.ts +23 -0
  147. package/dist/browser/react/location-state.d.ts.map +1 -0
  148. package/dist/browser/react/location-state.js +29 -0
  149. package/dist/browser/react/location-state.js.map +1 -0
  150. package/dist/browser/react/mount-context.d.ts +24 -0
  151. package/dist/browser/react/mount-context.d.ts.map +1 -0
  152. package/dist/browser/react/mount-context.js +24 -0
  153. package/dist/browser/react/mount-context.js.map +1 -0
  154. package/dist/browser/react/use-action.d.ts +64 -0
  155. package/dist/browser/react/use-action.d.ts.map +1 -0
  156. package/dist/browser/react/use-action.js +134 -0
  157. package/dist/browser/react/use-action.js.map +1 -0
  158. package/dist/browser/react/use-client-cache.d.ts +41 -0
  159. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  160. package/dist/browser/react/use-client-cache.js +39 -0
  161. package/dist/browser/react/use-client-cache.js.map +1 -0
  162. package/dist/browser/react/use-handle.d.ts +31 -0
  163. package/dist/browser/react/use-handle.d.ts.map +1 -0
  164. package/dist/browser/react/use-handle.js +144 -0
  165. package/dist/browser/react/use-handle.js.map +1 -0
  166. package/dist/browser/react/use-href.d.ts +33 -0
  167. package/dist/browser/react/use-href.d.ts.map +1 -0
  168. package/dist/browser/react/use-href.js +39 -0
  169. package/dist/browser/react/use-href.js.map +1 -0
  170. package/dist/browser/react/use-link-status.d.ts +37 -0
  171. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  172. package/dist/browser/react/use-link-status.js +99 -0
  173. package/dist/browser/react/use-link-status.js.map +1 -0
  174. package/dist/browser/react/use-mount.d.ts +25 -0
  175. package/dist/browser/react/use-mount.d.ts.map +1 -0
  176. package/dist/browser/react/use-mount.js +30 -0
  177. package/dist/browser/react/use-mount.js.map +1 -0
  178. package/dist/browser/react/use-navigation.d.ts +27 -0
  179. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  180. package/dist/browser/react/use-navigation.js +87 -0
  181. package/dist/browser/react/use-navigation.js.map +1 -0
  182. package/dist/browser/react/use-segments.d.ts +38 -0
  183. package/dist/browser/react/use-segments.d.ts.map +1 -0
  184. package/dist/browser/react/use-segments.js +130 -0
  185. package/dist/browser/react/use-segments.js.map +1 -0
  186. package/dist/browser/request-controller.d.ts +26 -0
  187. package/dist/browser/request-controller.d.ts.map +1 -0
  188. package/dist/browser/request-controller.js +147 -0
  189. package/dist/browser/request-controller.js.map +1 -0
  190. package/dist/browser/rsc-router.d.ts +129 -0
  191. package/dist/browser/rsc-router.d.ts.map +1 -0
  192. package/dist/browser/rsc-router.js +195 -0
  193. package/dist/browser/rsc-router.js.map +1 -0
  194. package/dist/browser/scroll-restoration.d.ts +93 -0
  195. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  196. package/dist/browser/scroll-restoration.js +321 -0
  197. package/dist/browser/scroll-restoration.js.map +1 -0
  198. package/dist/browser/segment-structure-assert.d.ts +17 -0
  199. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  200. package/dist/browser/segment-structure-assert.js +59 -0
  201. package/dist/browser/segment-structure-assert.js.map +1 -0
  202. package/dist/browser/server-action-bridge.d.ts +26 -0
  203. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  204. package/dist/browser/server-action-bridge.js +668 -0
  205. package/dist/browser/server-action-bridge.js.map +1 -0
  206. package/dist/browser/shallow.d.ts +12 -0
  207. package/dist/browser/shallow.d.ts.map +1 -0
  208. package/dist/browser/shallow.js +34 -0
  209. package/dist/browser/shallow.js.map +1 -0
  210. package/dist/browser/types.d.ts +369 -0
  211. package/dist/browser/types.d.ts.map +1 -0
  212. package/dist/browser/types.js +2 -0
  213. package/dist/browser/types.js.map +1 -0
  214. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  216. package/dist/build/__tests__/generate-cli.test.js +237 -0
  217. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  218. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  220. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  221. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  222. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  224. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  225. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  226. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  228. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  230. package/dist/build/generate-manifest.d.ts +81 -0
  231. package/dist/build/generate-manifest.d.ts.map +1 -0
  232. package/dist/build/generate-manifest.js +276 -0
  233. package/dist/build/generate-manifest.js.map +1 -0
  234. package/dist/build/generate-route-types.d.ts +115 -0
  235. package/dist/build/generate-route-types.d.ts.map +1 -0
  236. package/dist/build/generate-route-types.js +740 -0
  237. package/dist/build/generate-route-types.js.map +1 -0
  238. package/dist/build/index.d.ts +21 -0
  239. package/dist/build/index.d.ts.map +1 -0
  240. package/dist/build/index.js +21 -0
  241. package/dist/build/index.js.map +1 -0
  242. package/dist/build/route-trie.d.ts +71 -0
  243. package/dist/build/route-trie.d.ts.map +1 -0
  244. package/dist/build/route-trie.js +175 -0
  245. package/dist/build/route-trie.js.map +1 -0
  246. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  248. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  249. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  250. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  252. package/dist/cache/__tests__/document-cache.test.js +345 -0
  253. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  254. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  258. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  260. package/dist/cache/__tests__/memory-store.test.js +367 -0
  261. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  262. package/dist/cache/cache-scope.d.ts +102 -0
  263. package/dist/cache/cache-scope.d.ts.map +1 -0
  264. package/dist/cache/cache-scope.js +440 -0
  265. package/dist/cache/cache-scope.js.map +1 -0
  266. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  270. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  272. package/dist/cache/cf/cf-cache-store.js +242 -0
  273. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  274. package/dist/cache/cf/index.d.ts +14 -0
  275. package/dist/cache/cf/index.d.ts.map +1 -0
  276. package/dist/cache/cf/index.js +17 -0
  277. package/dist/cache/cf/index.js.map +1 -0
  278. package/dist/cache/document-cache.d.ts +64 -0
  279. package/dist/cache/document-cache.d.ts.map +1 -0
  280. package/dist/cache/document-cache.js +228 -0
  281. package/dist/cache/document-cache.js.map +1 -0
  282. package/dist/cache/index.d.ts +19 -0
  283. package/dist/cache/index.d.ts.map +1 -0
  284. package/dist/cache/index.js +21 -0
  285. package/dist/cache/index.js.map +1 -0
  286. package/dist/cache/memory-segment-store.d.ts +110 -0
  287. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  288. package/dist/cache/memory-segment-store.js +117 -0
  289. package/dist/cache/memory-segment-store.js.map +1 -0
  290. package/dist/cache/memory-store.d.ts +41 -0
  291. package/dist/cache/memory-store.d.ts.map +1 -0
  292. package/dist/cache/memory-store.js +191 -0
  293. package/dist/cache/memory-store.js.map +1 -0
  294. package/dist/cache/types.d.ts +317 -0
  295. package/dist/cache/types.d.ts.map +1 -0
  296. package/dist/cache/types.js +12 -0
  297. package/dist/cache/types.js.map +1 -0
  298. package/dist/client.d.ts +248 -0
  299. package/dist/client.d.ts.map +1 -0
  300. package/dist/client.js +367 -0
  301. package/dist/client.js.map +1 -0
  302. package/dist/client.rsc.d.ts +26 -0
  303. package/dist/client.rsc.d.ts.map +1 -0
  304. package/dist/client.rsc.js +46 -0
  305. package/dist/client.rsc.js.map +1 -0
  306. package/dist/component-utils.d.ts +36 -0
  307. package/dist/component-utils.d.ts.map +1 -0
  308. package/dist/component-utils.js +61 -0
  309. package/dist/component-utils.js.map +1 -0
  310. package/dist/components/DefaultDocument.d.ts +13 -0
  311. package/dist/components/DefaultDocument.d.ts.map +1 -0
  312. package/dist/components/DefaultDocument.js +15 -0
  313. package/dist/components/DefaultDocument.js.map +1 -0
  314. package/dist/debug.d.ts +58 -0
  315. package/dist/debug.d.ts.map +1 -0
  316. package/dist/debug.js +157 -0
  317. package/dist/debug.js.map +1 -0
  318. package/dist/default-error-boundary.d.ts +11 -0
  319. package/dist/default-error-boundary.d.ts.map +1 -0
  320. package/dist/default-error-boundary.js +45 -0
  321. package/dist/default-error-boundary.js.map +1 -0
  322. package/dist/deps/browser.d.ts +2 -0
  323. package/dist/deps/browser.d.ts.map +1 -0
  324. package/dist/deps/browser.js +3 -0
  325. package/dist/deps/browser.js.map +1 -0
  326. package/dist/deps/html-stream-client.d.ts +2 -0
  327. package/dist/deps/html-stream-client.d.ts.map +1 -0
  328. package/dist/deps/html-stream-client.js +3 -0
  329. package/dist/deps/html-stream-client.js.map +1 -0
  330. package/dist/deps/html-stream-server.d.ts +2 -0
  331. package/dist/deps/html-stream-server.d.ts.map +1 -0
  332. package/dist/deps/html-stream-server.js +3 -0
  333. package/dist/deps/html-stream-server.js.map +1 -0
  334. package/dist/deps/rsc.d.ts +2 -0
  335. package/dist/deps/rsc.d.ts.map +1 -0
  336. package/dist/deps/rsc.js +4 -0
  337. package/dist/deps/rsc.js.map +1 -0
  338. package/dist/deps/ssr.d.ts +2 -0
  339. package/dist/deps/ssr.d.ts.map +1 -0
  340. package/dist/deps/ssr.js +3 -0
  341. package/dist/deps/ssr.js.map +1 -0
  342. package/dist/errors.d.ts +174 -0
  343. package/dist/errors.d.ts.map +1 -0
  344. package/dist/errors.js +241 -0
  345. package/dist/errors.js.map +1 -0
  346. package/dist/handle.d.ts +78 -0
  347. package/dist/handle.d.ts.map +1 -0
  348. package/dist/handle.js +82 -0
  349. package/dist/handle.js.map +1 -0
  350. package/dist/handles/MetaTags.d.ts +14 -0
  351. package/dist/handles/MetaTags.d.ts.map +1 -0
  352. package/dist/handles/MetaTags.js +136 -0
  353. package/dist/handles/MetaTags.js.map +1 -0
  354. package/dist/handles/index.d.ts +6 -0
  355. package/dist/handles/index.d.ts.map +1 -0
  356. package/dist/handles/index.js +6 -0
  357. package/dist/handles/index.js.map +1 -0
  358. package/dist/handles/meta.d.ts +39 -0
  359. package/dist/handles/meta.d.ts.map +1 -0
  360. package/dist/handles/meta.js +202 -0
  361. package/dist/handles/meta.js.map +1 -0
  362. package/dist/host/__tests__/errors.test.d.ts +2 -0
  363. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  364. package/dist/host/__tests__/errors.test.js +76 -0
  365. package/dist/host/__tests__/errors.test.js.map +1 -0
  366. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  370. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  372. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  374. package/dist/host/__tests__/router.test.d.ts +2 -0
  375. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  376. package/dist/host/__tests__/router.test.js +241 -0
  377. package/dist/host/__tests__/router.test.js.map +1 -0
  378. package/dist/host/__tests__/testing.test.d.ts +2 -0
  379. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  380. package/dist/host/__tests__/testing.test.js +64 -0
  381. package/dist/host/__tests__/testing.test.js.map +1 -0
  382. package/dist/host/__tests__/utils.test.d.ts +2 -0
  383. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  384. package/dist/host/__tests__/utils.test.js +29 -0
  385. package/dist/host/__tests__/utils.test.js.map +1 -0
  386. package/dist/host/cookie-handler.d.ts +34 -0
  387. package/dist/host/cookie-handler.d.ts.map +1 -0
  388. package/dist/host/cookie-handler.js +124 -0
  389. package/dist/host/cookie-handler.js.map +1 -0
  390. package/dist/host/errors.d.ts +56 -0
  391. package/dist/host/errors.d.ts.map +1 -0
  392. package/dist/host/errors.js +79 -0
  393. package/dist/host/errors.js.map +1 -0
  394. package/dist/host/index.d.ts +29 -0
  395. package/dist/host/index.d.ts.map +1 -0
  396. package/dist/host/index.js +32 -0
  397. package/dist/host/index.js.map +1 -0
  398. package/dist/host/pattern-matcher.d.ts +36 -0
  399. package/dist/host/pattern-matcher.d.ts.map +1 -0
  400. package/dist/host/pattern-matcher.js +172 -0
  401. package/dist/host/pattern-matcher.js.map +1 -0
  402. package/dist/host/router.d.ts +26 -0
  403. package/dist/host/router.d.ts.map +1 -0
  404. package/dist/host/router.js +218 -0
  405. package/dist/host/router.js.map +1 -0
  406. package/dist/host/testing.d.ts +36 -0
  407. package/dist/host/testing.d.ts.map +1 -0
  408. package/dist/host/testing.js +55 -0
  409. package/dist/host/testing.js.map +1 -0
  410. package/dist/host/types.d.ts +115 -0
  411. package/dist/host/types.d.ts.map +1 -0
  412. package/dist/host/types.js +7 -0
  413. package/dist/host/types.js.map +1 -0
  414. package/dist/host/utils.d.ts +21 -0
  415. package/dist/host/utils.d.ts.map +1 -0
  416. package/dist/host/utils.js +23 -0
  417. package/dist/host/utils.js.map +1 -0
  418. package/dist/href-client.d.ts +131 -0
  419. package/dist/href-client.d.ts.map +1 -0
  420. package/dist/href-client.js +64 -0
  421. package/dist/href-client.js.map +1 -0
  422. package/dist/href-context.d.ts +29 -0
  423. package/dist/href-context.d.ts.map +1 -0
  424. package/dist/href-context.js +21 -0
  425. package/dist/href-context.js.map +1 -0
  426. package/dist/index.d.ts +73 -0
  427. package/dist/index.d.ts.map +1 -0
  428. package/dist/index.js +91 -0
  429. package/dist/index.js.map +1 -0
  430. package/dist/index.rsc.d.ts +32 -0
  431. package/dist/index.rsc.d.ts.map +1 -0
  432. package/dist/index.rsc.js +40 -0
  433. package/dist/index.rsc.js.map +1 -0
  434. package/dist/internal-debug.d.ts +2 -0
  435. package/dist/internal-debug.d.ts.map +1 -0
  436. package/dist/internal-debug.js +5 -0
  437. package/dist/internal-debug.js.map +1 -0
  438. package/dist/loader.d.ts +14 -0
  439. package/dist/loader.d.ts.map +1 -0
  440. package/dist/loader.js +20 -0
  441. package/dist/loader.js.map +1 -0
  442. package/dist/loader.rsc.d.ts +19 -0
  443. package/dist/loader.rsc.d.ts.map +1 -0
  444. package/dist/loader.rsc.js +99 -0
  445. package/dist/loader.rsc.js.map +1 -0
  446. package/dist/network-error-thrower.d.ts +17 -0
  447. package/dist/network-error-thrower.d.ts.map +1 -0
  448. package/dist/network-error-thrower.js +14 -0
  449. package/dist/network-error-thrower.js.map +1 -0
  450. package/dist/outlet-context.d.ts +13 -0
  451. package/dist/outlet-context.d.ts.map +1 -0
  452. package/dist/outlet-context.js +3 -0
  453. package/dist/outlet-context.js.map +1 -0
  454. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  456. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  457. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  458. package/dist/prerender/param-hash.d.ts +16 -0
  459. package/dist/prerender/param-hash.d.ts.map +1 -0
  460. package/dist/prerender/param-hash.js +36 -0
  461. package/dist/prerender/param-hash.js.map +1 -0
  462. package/dist/prerender/store.d.ts +38 -0
  463. package/dist/prerender/store.d.ts.map +1 -0
  464. package/dist/prerender/store.js +61 -0
  465. package/dist/prerender/store.js.map +1 -0
  466. package/dist/prerender.d.ts +66 -0
  467. package/dist/prerender.d.ts.map +1 -0
  468. package/dist/prerender.js +57 -0
  469. package/dist/prerender.js.map +1 -0
  470. package/dist/reverse.d.ts +196 -0
  471. package/dist/reverse.d.ts.map +1 -0
  472. package/dist/reverse.js +78 -0
  473. package/dist/reverse.js.map +1 -0
  474. package/dist/root-error-boundary.d.ts +33 -0
  475. package/dist/root-error-boundary.d.ts.map +1 -0
  476. package/dist/root-error-boundary.js +165 -0
  477. package/dist/root-error-boundary.js.map +1 -0
  478. package/dist/route-content-wrapper.d.ts +46 -0
  479. package/dist/route-content-wrapper.d.ts.map +1 -0
  480. package/dist/route-content-wrapper.js +77 -0
  481. package/dist/route-content-wrapper.js.map +1 -0
  482. package/dist/route-definition.d.ts +421 -0
  483. package/dist/route-definition.d.ts.map +1 -0
  484. package/dist/route-definition.js +868 -0
  485. package/dist/route-definition.js.map +1 -0
  486. package/dist/route-map-builder.d.ts +155 -0
  487. package/dist/route-map-builder.d.ts.map +1 -0
  488. package/dist/route-map-builder.js +237 -0
  489. package/dist/route-map-builder.js.map +1 -0
  490. package/dist/route-types.d.ts +165 -0
  491. package/dist/route-types.d.ts.map +1 -0
  492. package/dist/route-types.js +7 -0
  493. package/dist/route-types.js.map +1 -0
  494. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  496. package/dist/router/__tests__/handler-context.test.js +65 -0
  497. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  498. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  502. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  503. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  504. package/dist/router/__tests__/match-context.test.js +92 -0
  505. package/dist/router/__tests__/match-context.test.js.map +1 -0
  506. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  508. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  509. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  510. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  511. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  512. package/dist/router/__tests__/match-result.test.js +457 -0
  513. package/dist/router/__tests__/match-result.test.js.map +1 -0
  514. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  515. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  516. package/dist/router/__tests__/on-error.test.js +678 -0
  517. package/dist/router/__tests__/on-error.test.js.map +1 -0
  518. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  520. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  521. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  522. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  526. package/dist/router/error-handling.d.ts +77 -0
  527. package/dist/router/error-handling.d.ts.map +1 -0
  528. package/dist/router/error-handling.js +202 -0
  529. package/dist/router/error-handling.js.map +1 -0
  530. package/dist/router/handler-context.d.ts +20 -0
  531. package/dist/router/handler-context.d.ts.map +1 -0
  532. package/dist/router/handler-context.js +198 -0
  533. package/dist/router/handler-context.js.map +1 -0
  534. package/dist/router/intercept-resolution.d.ts +66 -0
  535. package/dist/router/intercept-resolution.d.ts.map +1 -0
  536. package/dist/router/intercept-resolution.js +246 -0
  537. package/dist/router/intercept-resolution.js.map +1 -0
  538. package/dist/router/loader-resolution.d.ts +64 -0
  539. package/dist/router/loader-resolution.d.ts.map +1 -0
  540. package/dist/router/loader-resolution.js +284 -0
  541. package/dist/router/loader-resolution.js.map +1 -0
  542. package/dist/router/logging.d.ts +15 -0
  543. package/dist/router/logging.d.ts.map +1 -0
  544. package/dist/router/logging.js +99 -0
  545. package/dist/router/logging.js.map +1 -0
  546. package/dist/router/manifest.d.ts +22 -0
  547. package/dist/router/manifest.d.ts.map +1 -0
  548. package/dist/router/manifest.js +181 -0
  549. package/dist/router/manifest.js.map +1 -0
  550. package/dist/router/match-api.d.ts +35 -0
  551. package/dist/router/match-api.d.ts.map +1 -0
  552. package/dist/router/match-api.js +406 -0
  553. package/dist/router/match-api.js.map +1 -0
  554. package/dist/router/match-context.d.ts +206 -0
  555. package/dist/router/match-context.d.ts.map +1 -0
  556. package/dist/router/match-context.js +17 -0
  557. package/dist/router/match-context.js.map +1 -0
  558. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  560. package/dist/router/match-middleware/background-revalidation.js +75 -0
  561. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  562. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  564. package/dist/router/match-middleware/cache-lookup.js +257 -0
  565. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  566. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  567. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  568. package/dist/router/match-middleware/cache-store.js +108 -0
  569. package/dist/router/match-middleware/cache-store.js.map +1 -0
  570. package/dist/router/match-middleware/index.d.ts +81 -0
  571. package/dist/router/match-middleware/index.d.ts.map +1 -0
  572. package/dist/router/match-middleware/index.js +80 -0
  573. package/dist/router/match-middleware/index.js.map +1 -0
  574. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  576. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  577. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  578. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  580. package/dist/router/match-middleware/segment-resolution.js +53 -0
  581. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  582. package/dist/router/match-pipelines.d.ts +147 -0
  583. package/dist/router/match-pipelines.d.ts.map +1 -0
  584. package/dist/router/match-pipelines.js +82 -0
  585. package/dist/router/match-pipelines.js.map +1 -0
  586. package/dist/router/match-result.d.ts +126 -0
  587. package/dist/router/match-result.d.ts.map +1 -0
  588. package/dist/router/match-result.js +93 -0
  589. package/dist/router/match-result.js.map +1 -0
  590. package/dist/router/metrics.d.ts +20 -0
  591. package/dist/router/metrics.d.ts.map +1 -0
  592. package/dist/router/metrics.js +47 -0
  593. package/dist/router/metrics.js.map +1 -0
  594. package/dist/router/middleware.d.ts +249 -0
  595. package/dist/router/middleware.d.ts.map +1 -0
  596. package/dist/router/middleware.js +434 -0
  597. package/dist/router/middleware.js.map +1 -0
  598. package/dist/router/middleware.test.d.ts +2 -0
  599. package/dist/router/middleware.test.d.ts.map +1 -0
  600. package/dist/router/middleware.test.js +816 -0
  601. package/dist/router/middleware.test.js.map +1 -0
  602. package/dist/router/pattern-matching.d.ts +149 -0
  603. package/dist/router/pattern-matching.d.ts.map +1 -0
  604. package/dist/router/pattern-matching.js +349 -0
  605. package/dist/router/pattern-matching.js.map +1 -0
  606. package/dist/router/revalidation.d.ts +44 -0
  607. package/dist/router/revalidation.d.ts.map +1 -0
  608. package/dist/router/revalidation.js +147 -0
  609. package/dist/router/revalidation.js.map +1 -0
  610. package/dist/router/router-context.d.ts +135 -0
  611. package/dist/router/router-context.d.ts.map +1 -0
  612. package/dist/router/router-context.js +36 -0
  613. package/dist/router/router-context.js.map +1 -0
  614. package/dist/router/segment-resolution.d.ts +127 -0
  615. package/dist/router/segment-resolution.d.ts.map +1 -0
  616. package/dist/router/segment-resolution.js +919 -0
  617. package/dist/router/segment-resolution.js.map +1 -0
  618. package/dist/router/trie-matching.d.ts +40 -0
  619. package/dist/router/trie-matching.d.ts.map +1 -0
  620. package/dist/router/trie-matching.js +127 -0
  621. package/dist/router/trie-matching.js.map +1 -0
  622. package/dist/router/types.d.ts +136 -0
  623. package/dist/router/types.d.ts.map +1 -0
  624. package/dist/router/types.js +7 -0
  625. package/dist/router/types.js.map +1 -0
  626. package/dist/router.d.ts +753 -0
  627. package/dist/router.d.ts.map +1 -0
  628. package/dist/router.gen.d.ts +6 -0
  629. package/dist/router.gen.d.ts.map +1 -0
  630. package/dist/router.gen.js +6 -0
  631. package/dist/router.gen.js.map +1 -0
  632. package/dist/router.js +1304 -0
  633. package/dist/router.js.map +1 -0
  634. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  636. package/dist/rsc/__tests__/helpers.test.js +140 -0
  637. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  638. package/dist/rsc/handler.d.ts +45 -0
  639. package/dist/rsc/handler.d.ts.map +1 -0
  640. package/dist/rsc/handler.js +1172 -0
  641. package/dist/rsc/handler.js.map +1 -0
  642. package/dist/rsc/helpers.d.ts +16 -0
  643. package/dist/rsc/helpers.d.ts.map +1 -0
  644. package/dist/rsc/helpers.js +55 -0
  645. package/dist/rsc/helpers.js.map +1 -0
  646. package/dist/rsc/index.d.ts +22 -0
  647. package/dist/rsc/index.d.ts.map +1 -0
  648. package/dist/rsc/index.js +23 -0
  649. package/dist/rsc/index.js.map +1 -0
  650. package/dist/rsc/nonce.d.ts +9 -0
  651. package/dist/rsc/nonce.d.ts.map +1 -0
  652. package/dist/rsc/nonce.js +18 -0
  653. package/dist/rsc/nonce.js.map +1 -0
  654. package/dist/rsc/types.d.ts +206 -0
  655. package/dist/rsc/types.d.ts.map +1 -0
  656. package/dist/rsc/types.js +8 -0
  657. package/dist/rsc/types.js.map +1 -0
  658. package/dist/search-params.d.ts +103 -0
  659. package/dist/search-params.d.ts.map +1 -0
  660. package/dist/search-params.js +74 -0
  661. package/dist/search-params.js.map +1 -0
  662. package/dist/segment-system.d.ts +75 -0
  663. package/dist/segment-system.d.ts.map +1 -0
  664. package/dist/segment-system.js +336 -0
  665. package/dist/segment-system.js.map +1 -0
  666. package/dist/server/context.d.ts +245 -0
  667. package/dist/server/context.d.ts.map +1 -0
  668. package/dist/server/context.js +197 -0
  669. package/dist/server/context.js.map +1 -0
  670. package/dist/server/fetchable-loader-store.d.ts +18 -0
  671. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  672. package/dist/server/fetchable-loader-store.js +18 -0
  673. package/dist/server/fetchable-loader-store.js.map +1 -0
  674. package/dist/server/handle-store.d.ts +85 -0
  675. package/dist/server/handle-store.d.ts.map +1 -0
  676. package/dist/server/handle-store.js +142 -0
  677. package/dist/server/handle-store.js.map +1 -0
  678. package/dist/server/loader-registry.d.ts +55 -0
  679. package/dist/server/loader-registry.d.ts.map +1 -0
  680. package/dist/server/loader-registry.js +132 -0
  681. package/dist/server/loader-registry.js.map +1 -0
  682. package/dist/server/request-context.d.ts +226 -0
  683. package/dist/server/request-context.d.ts.map +1 -0
  684. package/dist/server/request-context.js +290 -0
  685. package/dist/server/request-context.js.map +1 -0
  686. package/dist/server/root-layout.d.ts +4 -0
  687. package/dist/server/root-layout.d.ts.map +1 -0
  688. package/dist/server/root-layout.js +5 -0
  689. package/dist/server/root-layout.js.map +1 -0
  690. package/dist/server.d.ts +15 -0
  691. package/dist/server.d.ts.map +1 -0
  692. package/dist/server.js +20 -0
  693. package/dist/server.js.map +1 -0
  694. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  698. package/dist/ssr/index.d.ts +98 -0
  699. package/dist/ssr/index.d.ts.map +1 -0
  700. package/dist/ssr/index.js +158 -0
  701. package/dist/ssr/index.js.map +1 -0
  702. package/dist/static-handler.d.ts +50 -0
  703. package/dist/static-handler.d.ts.map +1 -0
  704. package/dist/static-handler.gen.d.ts +5 -0
  705. package/dist/static-handler.gen.d.ts.map +1 -0
  706. package/dist/static-handler.gen.js +5 -0
  707. package/dist/static-handler.gen.js.map +1 -0
  708. package/dist/static-handler.js +29 -0
  709. package/dist/static-handler.js.map +1 -0
  710. package/dist/theme/ThemeProvider.d.ts +20 -0
  711. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  712. package/dist/theme/ThemeProvider.js +240 -0
  713. package/dist/theme/ThemeProvider.js.map +1 -0
  714. package/dist/theme/ThemeScript.d.ts +48 -0
  715. package/dist/theme/ThemeScript.d.ts.map +1 -0
  716. package/dist/theme/ThemeScript.js +13 -0
  717. package/dist/theme/ThemeScript.js.map +1 -0
  718. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  719. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  720. package/dist/theme/__tests__/theme.test.js +103 -0
  721. package/dist/theme/__tests__/theme.test.js.map +1 -0
  722. package/dist/theme/constants.d.ts +29 -0
  723. package/dist/theme/constants.d.ts.map +1 -0
  724. package/dist/theme/constants.js +48 -0
  725. package/dist/theme/constants.js.map +1 -0
  726. package/dist/theme/index.d.ts +31 -0
  727. package/dist/theme/index.d.ts.map +1 -0
  728. package/dist/theme/index.js +36 -0
  729. package/dist/theme/index.js.map +1 -0
  730. package/dist/theme/theme-context.d.ts +40 -0
  731. package/dist/theme/theme-context.d.ts.map +1 -0
  732. package/dist/theme/theme-context.js +60 -0
  733. package/dist/theme/theme-context.js.map +1 -0
  734. package/dist/theme/theme-script.d.ts +27 -0
  735. package/dist/theme/theme-script.d.ts.map +1 -0
  736. package/dist/theme/theme-script.js +147 -0
  737. package/dist/theme/theme-script.js.map +1 -0
  738. package/dist/theme/types.d.ts +163 -0
  739. package/dist/theme/types.d.ts.map +1 -0
  740. package/dist/theme/types.js +11 -0
  741. package/dist/theme/types.js.map +1 -0
  742. package/dist/theme/use-theme.d.ts +12 -0
  743. package/dist/theme/use-theme.d.ts.map +1 -0
  744. package/dist/theme/use-theme.js +40 -0
  745. package/dist/theme/use-theme.js.map +1 -0
  746. package/dist/types.d.ts +1479 -0
  747. package/dist/types.d.ts.map +1 -0
  748. package/dist/types.js +10 -0
  749. package/dist/types.js.map +1 -0
  750. package/dist/urls.d.ts +441 -0
  751. package/dist/urls.d.ts.map +1 -0
  752. package/dist/urls.gen.d.ts +8 -0
  753. package/dist/urls.gen.d.ts.map +1 -0
  754. package/dist/urls.gen.js +8 -0
  755. package/dist/urls.gen.js.map +1 -0
  756. package/dist/urls.js +443 -0
  757. package/dist/urls.js.map +1 -0
  758. package/dist/use-loader.d.ts +127 -0
  759. package/dist/use-loader.d.ts.map +1 -0
  760. package/dist/use-loader.js +237 -0
  761. package/dist/use-loader.js.map +1 -0
  762. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  763. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  766. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  767. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  770. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  771. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  774. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  775. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  776. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  777. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  778. package/dist/vite/ast-handler-extract.d.ts +49 -0
  779. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  780. package/dist/vite/ast-handler-extract.js +249 -0
  781. package/dist/vite/ast-handler-extract.js.map +1 -0
  782. package/dist/vite/expose-action-id.d.ts +19 -0
  783. package/dist/vite/expose-action-id.d.ts.map +1 -0
  784. package/dist/vite/expose-action-id.js +250 -0
  785. package/dist/vite/expose-action-id.js.map +1 -0
  786. package/dist/vite/expose-id-utils.d.ts +69 -0
  787. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  788. package/dist/vite/expose-id-utils.js +289 -0
  789. package/dist/vite/expose-id-utils.js.map +1 -0
  790. package/dist/vite/expose-internal-ids.d.ts +22 -0
  791. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  792. package/dist/vite/expose-internal-ids.js +886 -0
  793. package/dist/vite/expose-internal-ids.js.map +1 -0
  794. package/dist/vite/index.d.ts +149 -0
  795. package/dist/vite/index.d.ts.map +1 -0
  796. package/dist/vite/index.js +84 -15
  797. package/dist/vite/index.js.bak +5448 -0
  798. package/dist/vite/index.js.map +1 -0
  799. package/dist/vite/index.named-routes.gen.ts +103 -0
  800. package/dist/vite/package-resolution.d.ts +43 -0
  801. package/dist/vite/package-resolution.d.ts.map +1 -0
  802. package/dist/vite/package-resolution.js +112 -0
  803. package/dist/vite/package-resolution.js.map +1 -0
  804. package/dist/vite/virtual-entries.d.ts +25 -0
  805. package/dist/vite/virtual-entries.d.ts.map +1 -0
  806. package/dist/vite/virtual-entries.js +110 -0
  807. package/dist/vite/virtual-entries.js.map +1 -0
  808. package/package.json +21 -18
  809. package/skills/api-client/SKILL.md +1 -1
  810. package/skills/breadcrumbs/SKILL.md +1 -1
  811. package/skills/cache-guide/SKILL.md +1 -1
  812. package/skills/caching/SKILL.md +35 -1
  813. package/skills/catalog.json +265 -0
  814. package/skills/comparison/references/framework-comparison.md +1 -1
  815. package/skills/composability/SKILL.md +33 -1
  816. package/skills/debug-manifest/SKILL.md +1 -1
  817. package/skills/document-cache/SKILL.md +9 -1
  818. package/skills/fonts/SKILL.md +1 -1
  819. package/skills/handler-use/SKILL.md +1 -1
  820. package/skills/hooks/SKILL.md +54 -892
  821. package/skills/hooks/data.md +273 -0
  822. package/skills/hooks/handle-and-actions.md +103 -0
  823. package/skills/hooks/navigation.md +110 -0
  824. package/skills/hooks/outlets.md +41 -0
  825. package/skills/hooks/state.md +228 -0
  826. package/skills/hooks/urls.md +135 -0
  827. package/skills/host-router/SKILL.md +1 -1
  828. package/skills/i18n/SKILL.md +1 -1
  829. package/skills/intercept/SKILL.md +8 -1
  830. package/skills/layout/SKILL.md +1 -1
  831. package/skills/links/SKILL.md +1 -1
  832. package/skills/loader/SKILL.md +8 -1
  833. package/skills/middleware/SKILL.md +1 -1
  834. package/skills/migrate-nextjs/SKILL.md +133 -1
  835. package/skills/migrate-react-router/SKILL.md +42 -816
  836. package/skills/migrate-react-router/cloudflare-workers.md +129 -0
  837. package/skills/migrate-react-router/component-migration.md +196 -0
  838. package/skills/migrate-react-router/data-and-actions.md +225 -0
  839. package/skills/migrate-react-router/route-mapping.md +271 -0
  840. package/skills/mime-routes/SKILL.md +1 -1
  841. package/skills/observability/SKILL.md +9 -1
  842. package/skills/parallel/SKILL.md +10 -1
  843. package/skills/ppr/SKILL.md +331 -32
  844. package/skills/prerender/SKILL.md +8 -1
  845. package/skills/rango/SKILL.md +12 -12
  846. package/skills/response-routes/SKILL.md +1 -1
  847. package/skills/route/SKILL.md +9 -1
  848. package/skills/router-setup/SKILL.md +1 -1
  849. package/skills/scripts/SKILL.md +1 -1
  850. package/skills/server-actions/SKILL.md +3 -2
  851. package/skills/shell-manifest/SKILL.md +1 -1
  852. package/skills/streams-and-websockets/SKILL.md +1 -1
  853. package/skills/tailwind/SKILL.md +1 -1
  854. package/skills/testing/SKILL.md +1 -1
  855. package/skills/theme/SKILL.md +1 -1
  856. package/skills/typesafety/SKILL.md +45 -919
  857. package/skills/typesafety/env-and-bindings.md +254 -0
  858. package/skills/typesafety/generated-files-and-cli.md +335 -0
  859. package/skills/typesafety/params-and-search.md +153 -0
  860. package/skills/typesafety/route-types.md +209 -0
  861. package/skills/use-cache/SKILL.md +7 -1
  862. package/skills/vercel/SKILL.md +1 -1
  863. package/skills/view-transitions/SKILL.md +1 -1
  864. package/src/browser/event-controller.ts +41 -10
  865. package/src/browser/logging.ts +10 -0
  866. package/src/browser/merge-segment-loaders.ts +6 -4
  867. package/src/browser/navigation-client.ts +5 -1
  868. package/src/browser/navigation-store.ts +46 -6
  869. package/src/browser/partial-update.ts +27 -15
  870. package/src/browser/prefetch/cache.ts +26 -4
  871. package/src/browser/prefetch/fetch.ts +27 -17
  872. package/src/browser/react/Link.tsx +13 -3
  873. package/src/browser/react/NavigationProvider.tsx +21 -19
  874. package/src/browser/scroll-restoration.ts +7 -5
  875. package/src/browser/segment-reconciler.ts +31 -21
  876. package/src/browser/types.ts +12 -0
  877. package/src/cache/cache-runtime.ts +203 -23
  878. package/src/cache/document-cache.ts +20 -9
  879. package/src/cache/memory-segment-store.ts +53 -2
  880. package/src/cache/segment-codec.ts +4 -4
  881. package/src/cache/shell-snapshot.ts +50 -1
  882. package/src/cache/types.ts +25 -5
  883. package/src/cache/vercel/vercel-cache-store.ts +131 -107
  884. package/src/cloudflare/tracing.ts +7 -8
  885. package/src/index.rsc.ts +1 -0
  886. package/src/index.ts +12 -8
  887. package/src/route-definition/helpers-types.ts +5 -4
  888. package/src/route-map-builder.ts +24 -1
  889. package/src/router/find-match.ts +15 -1
  890. package/src/router/instrument.ts +9 -4
  891. package/src/router/manifest.ts +13 -5
  892. package/src/router/match-api.ts +70 -30
  893. package/src/router/match-handlers.ts +176 -135
  894. package/src/router/match-result.ts +35 -15
  895. package/src/router/middleware.ts +46 -32
  896. package/src/router/request-classification.ts +20 -7
  897. package/src/router/route-snapshot.ts +10 -0
  898. package/src/router/router-interfaces.ts +9 -0
  899. package/src/router/segment-resolution/fresh.ts +25 -4
  900. package/src/router/segment-resolution/loader-cache.ts +57 -8
  901. package/src/router/segment-resolution/loader-mask.ts +26 -3
  902. package/src/router/segment-resolution/loader-snapshot.ts +251 -0
  903. package/src/router/telemetry-otel.ts +6 -8
  904. package/src/router/tracing.ts +14 -5
  905. package/src/router.ts +15 -6
  906. package/src/rsc/handler.ts +46 -30
  907. package/src/rsc/nonce.ts +10 -1
  908. package/src/rsc/rsc-rendering.ts +39 -8
  909. package/src/rsc/shell-capture.ts +201 -13
  910. package/src/rsc/shell-serve.ts +26 -0
  911. package/src/server/cookie-store.ts +6 -0
  912. package/src/server/request-context.ts +33 -0
  913. package/src/ssr/index.tsx +7 -0
  914. package/src/testing/dispatch.ts +142 -37
  915. package/src/urls/path-helper-types.ts +9 -4
  916. package/src/vercel/tracing.ts +7 -7
  917. package/src/vite/discovery/dev-prerender-cache.ts +117 -0
  918. package/src/vite/router-discovery.ts +78 -15
@@ -41,7 +41,7 @@ import { runThenSettle } from "./tracing.js";
41
41
  import type {
42
42
  RouterTracingConfig,
43
43
  SpanRunner,
44
- TracePhaseToggles,
44
+ TracingToggleOptions,
45
45
  } from "./tracing.js";
46
46
 
47
47
  // ---------------------------------------------------------------------------
@@ -92,13 +92,11 @@ const STATUS_ERROR = 2;
92
92
  // Tracing adapter: phase spans via startActiveSpan (the `tracing` slot)
93
93
  // ---------------------------------------------------------------------------
94
94
 
95
- /** Options for createOTelTracing. */
96
- export interface OTelTracingOptions {
97
- /** Master switch. Defaults to true. */
98
- enabled?: boolean;
99
- /** Per-phase span toggles. Omitted phases default to enabled. */
100
- spans?: TracePhaseToggles;
101
- }
95
+ /**
96
+ * Options for createOTelTracing. Alias of the shared {@link TracingToggleOptions}
97
+ * (`enabled` master switch + per-phase `spans` toggles); the name is public API.
98
+ */
99
+ export type OTelTracingOptions = TracingToggleOptions;
102
100
 
103
101
  /**
104
102
  * Create the tracing config that maps the router's phases onto OTel spans via
@@ -81,17 +81,26 @@ export interface TracePhaseToggles {
81
81
  ssr?: boolean;
82
82
  }
83
83
 
84
+ /**
85
+ * The option pair shared by every tracing factory (enabled master switch +
86
+ * per-phase span toggles). Extended by OTelTracingOptions,
87
+ * CloudflareTracingOptions, VercelTracingOptions, and RouterTracingConfig so
88
+ * a phase added to TracePhaseToggles propagates everywhere from one place.
89
+ */
90
+ export interface TracingToggleOptions {
91
+ /** Master switch. Defaults to true. */
92
+ enabled?: boolean;
93
+ /** Per-phase span toggles. Omitted phases default to enabled. */
94
+ spans?: TracePhaseToggles;
95
+ }
96
+
84
97
  /**
85
98
  * Value passed to `createRouter({ tracing })`. Produced by a platform factory
86
99
  * such as `createCloudflareTracing()`.
87
100
  */
88
- export interface RouterTracingConfig {
101
+ export interface RouterTracingConfig extends TracingToggleOptions {
89
102
  /** Platform span runner. */
90
103
  runner: SpanRunner;
91
- /** Master switch. Defaults to true when a config object is provided. */
92
- enabled?: boolean;
93
- /** Per-phase span toggles. */
94
- spans?: TracePhaseToggles;
95
104
  }
96
105
 
97
106
  /**
package/src/router.ts CHANGED
@@ -420,13 +420,13 @@ export function createRouter<TEnv = any>(
420
420
 
421
421
  // Wrapper to pass debugPerformance to external createMetricsStore.
422
422
  // Also checks per-request flag set by ctx.debugPerformance() in middleware.
423
+ // With no active request context there is nowhere to hang the store, so return
424
+ // undefined: an orphan store would collect metrics no reader can reach (nothing
425
+ // holds it, and appendMetric(undefined, ...) is already a no-op).
423
426
  const getMetricsStore = () => {
424
427
  const reqCtx = _getRequestContext();
425
428
  const enabled = debugPerformance || !!reqCtx?._debugPerformance;
426
- if (!enabled) return undefined;
427
- if (!reqCtx) {
428
- return createMetricsStore(true);
429
- }
429
+ if (!enabled || !reqCtx) return undefined;
430
430
  reqCtx._metricsStore ??= createMetricsStore(true);
431
431
  return reqCtx._metricsStore;
432
432
  };
@@ -501,8 +501,12 @@ export function createRouter<TEnv = any>(
501
501
  ? getRequestId(errorContext.request)
502
502
  : undefined
503
503
  : undefined;
504
+ // Derived once here for both the loader.start and loader.end emits (the
505
+ // loader.error emit uses ctx.loaderName from wrapLoaderWithErrorHandling).
506
+ const loaderName = telemetrySink
507
+ ? segmentId.split(".").pop() || "unknown"
508
+ : "";
504
509
  if (telemetrySink) {
505
- const loaderName = segmentId.split(".").pop() || "unknown";
506
510
  safeEmit(telemetry, {
507
511
  type: "loader.start",
508
512
  timestamp: loaderStart,
@@ -556,7 +560,6 @@ export function createRouter<TEnv = any>(
556
560
 
557
561
  // Emit loader.end after the promise settles (fire-and-forget)
558
562
  if (telemetrySink) {
559
- const loaderName = segmentId.split(".").pop() || "unknown";
560
563
  result.then((r) => {
561
564
  safeEmit(telemetry, {
562
565
  type: "loader.end",
@@ -1008,6 +1011,12 @@ export function createRouter<TEnv = any>(
1008
1011
  // Expose resolved span tracing for the handler (Cloudflare custom spans)
1009
1012
  tracing: resolvedTracing,
1010
1013
 
1014
+ // Expose the raw telemetry sink so handler-level emitters (timeout, origin
1015
+ // rejection, late-handle handler.error) can emit outside the match ALS.
1016
+ // Raw (not the resolveSink no-op wrapper) so router.telemetry stays
1017
+ // undefined when unconfigured and call sites gate on truthiness.
1018
+ telemetry: telemetrySink,
1019
+
1011
1020
  // Expose debug manifest flag for handler
1012
1021
  allowDebugManifest: allowDebugManifestOption,
1013
1022
 
@@ -85,7 +85,8 @@ import {
85
85
  appendMetric,
86
86
  buildMetricsTiming,
87
87
  } from "../router/metrics.js";
88
- import { observePhase, observeEvent, PHASES } from "../router/instrument.js";
88
+ import { observePhase, PHASES } from "../router/instrument.js";
89
+ import { safeEmit, resolveSink, getRequestId } from "../router/telemetry.js";
89
90
  import {
90
91
  startSSRSetup,
91
92
  getSSRSetup,
@@ -246,16 +247,19 @@ export function createRSCHandler<
246
247
  metadata: { timeout: true, phase, durationMs },
247
248
  });
248
249
 
249
- observeEvent({
250
- type: "request.timeout",
251
- timestamp: performance.now(),
252
- phase,
253
- pathname: url.pathname,
254
- routeKey,
255
- actionId,
256
- durationMs,
257
- customHandler: !!router.onTimeout,
258
- });
250
+ if (router.telemetry) {
251
+ safeEmit(resolveSink(router.telemetry), {
252
+ type: "request.timeout",
253
+ timestamp: performance.now(),
254
+ requestId: getRequestId(request),
255
+ phase,
256
+ pathname: url.pathname,
257
+ routeKey,
258
+ actionId,
259
+ durationMs,
260
+ customHandler: !!router.onTimeout,
261
+ });
262
+ }
259
263
 
260
264
  if (router.onTimeout) {
261
265
  try {
@@ -590,7 +594,13 @@ export function createRSCHandler<
590
594
 
591
595
  const fullTiming = timingParts.join(", ");
592
596
  if (fullTiming && !isWebSocketUpgradeResponse(response)) {
593
- response.headers.set("Server-Timing", fullTiming);
597
+ try {
598
+ response.headers.set("Server-Timing", fullTiming);
599
+ } catch {
600
+ // Immutable headers (e.g. a passed-through platform Response) — drop
601
+ // the timing header, never the response. Instrumentation must not
602
+ // 500 a request.
603
+ }
594
604
  }
595
605
 
596
606
  // Single open-redirect chokepoint: every response (PE, full-page,
@@ -737,15 +747,18 @@ export function createRSCHandler<
737
747
  },
738
748
  });
739
749
 
740
- observeEvent({
741
- type: "request.origin-rejected",
742
- timestamp: performance.now(),
743
- method: request.method,
744
- pathname: url.pathname,
745
- phase: originPhase,
746
- origin: request.headers.get("origin"),
747
- host: request.headers.get("host"),
748
- });
750
+ if (router.telemetry) {
751
+ safeEmit(resolveSink(router.telemetry), {
752
+ type: "request.origin-rejected",
753
+ timestamp: performance.now(),
754
+ requestId: getRequestId(request),
755
+ method: request.method,
756
+ pathname: url.pathname,
757
+ phase: originPhase,
758
+ origin: request.headers.get("origin"),
759
+ host: request.headers.get("host"),
760
+ });
761
+ }
749
762
 
750
763
  return originResult;
751
764
  }
@@ -787,15 +800,18 @@ export function createRSCHandler<
787
800
  params: reqCtx.params as Record<string, string>,
788
801
  handledByBoundary: true,
789
802
  });
790
- observeEvent({
791
- type: "handler.error",
792
- timestamp: performance.now(),
793
- error,
794
- handledByBoundary: true,
795
- pathname: url.pathname,
796
- routeKey: reqCtx._routeName,
797
- params: reqCtx.params as Record<string, string>,
798
- });
803
+ if (router.telemetry) {
804
+ safeEmit(resolveSink(router.telemetry), {
805
+ type: "handler.error",
806
+ timestamp: performance.now(),
807
+ requestId: getRequestId(request),
808
+ error,
809
+ handledByBoundary: true,
810
+ pathname: url.pathname,
811
+ routeKey: reqCtx._routeName,
812
+ params: reqCtx.params as Record<string, string>,
813
+ });
814
+ }
799
815
  };
800
816
 
801
817
  // Set route params early so all execution paths can access ctx.params.
package/src/rsc/nonce.ts CHANGED
@@ -8,11 +8,20 @@ import { createVar } from "../context-var.js";
8
8
  /**
9
9
  * Typed ContextVar token for CSP nonce.
10
10
  *
11
- * Use this to access the nonce in middleware or handlers:
11
+ * Use this to READ the nonce in middleware or handlers:
12
12
  * ```ts
13
13
  * import { nonce } from "@rangojs/router";
14
14
  * const value = ctx.get(nonce); // string | undefined
15
15
  * ```
16
+ *
17
+ * Supply the nonce via the `createRouter({ nonce })` provider, not by writing
18
+ * this token yourself. The provider value is threaded into the router's SSR
19
+ * machinery (NonceContext/useNonce, Scripts/MetaTags attributes, the inlined
20
+ * Flight payload scripts) AND sets this token. A direct `ctx.set(nonce, value)`
21
+ * in middleware runs AFTER the SSR nonce is resolved: the value is readable via
22
+ * `ctx.get(nonce)` and gates PPR shell capture (a per-request nonce must never
23
+ * bake into a shared shell), but the router will not apply it to its own
24
+ * scripts — useNonce() stays undefined for that request.
16
25
  */
17
26
  export const nonce: ContextVar<string> = createVar<string>();
18
27
 
@@ -11,7 +11,10 @@ import {
11
11
  setRequestContextParams,
12
12
  runWithRequestContext,
13
13
  } from "../server/request-context.js";
14
- import { SeededShellStore } from "../cache/shell-snapshot.js";
14
+ import {
15
+ SeededShellStore,
16
+ buildShellLoaderSeed,
17
+ } from "../cache/shell-snapshot.js";
15
18
  import { appendMetric } from "../router/metrics.js";
16
19
  import { observePhase, PHASES } from "../router/instrument.js";
17
20
  import { getSSRSetup, isRscRequest } from "./ssr-setup.js";
@@ -38,7 +41,10 @@ import {
38
41
  base64ToBytes,
39
42
  hasShellFamily,
40
43
  warnShellStoreMissingOnce,
44
+ warnPprNonceActiveOnce,
41
45
  } from "./shell-serve.js";
46
+ import { contextGet } from "../context-var.js";
47
+ import { nonce as nonceToken } from "./nonce.js";
42
48
  import { reportCacheError } from "../cache/cache-error.js";
43
49
  import { INTERNAL_RANGO_DEBUG } from "../internal-debug.js";
44
50
  import type { ShellCacheEntry } from "../cache/types.js";
@@ -107,16 +113,33 @@ async function handleRscRenderingInner<TEnv>(
107
113
  } | null = null;
108
114
  if (
109
115
  !isPartial &&
110
- nonce === undefined &&
111
116
  request.method === "GET" &&
112
117
  !url.searchParams.has("__prerender_collect") &&
113
118
  !isRscRequest(request, url, false)
114
119
  ) {
115
120
  const pprConfig = resolvePprConfig(reqCtx._classifiedRoute?.manifestEntry);
116
121
  if (pprConfig) {
122
+ // A per-request CSP nonce pins the route to axis 1: useNonce() (and any app
123
+ // code reading the nonce) renders it into every nonced script/style/meta, so
124
+ // a shell shared per host+URL would freeze one request's nonce for every
125
+ // visitor and the browser's CSP would reject the frozen nonce for all but the
126
+ // capture request. The nonce arrives two ways and BOTH must gate: the
127
+ // createRouter({ nonce }) provider (threaded here as `nonce`), and a direct
128
+ // token write in middleware (ctx.set(nonce, value)). The token is only
129
+ // visible in the post-middleware request variables — and this commit point
130
+ // runs AFTER the whole middleware chain (see the block header), so it is
131
+ // present here. Reading it closes the gap the provider-only check left open
132
+ // (issue #656). The threaded-param check stays first: the provider path is
133
+ // resolved before any variable read and short-circuits cheaply.
134
+ const activeNonce = nonce ?? contextGet(reqCtx._variables, nonceToken);
117
135
  const store = reqCtx._cacheStore;
118
136
  const key = buildShellKey(url);
119
- if (!hasShellFamily(store)) {
137
+ if (activeNonce !== undefined) {
138
+ // Declared intent that cannot be honored deserves a diagnostic (unlike an
139
+ // undeclared route, which is silent): a ppr route gated off by an active
140
+ // per-request nonce warns once per key. Axis 1 after the warning.
141
+ warnPprNonceActiveOnce(key);
142
+ } else if (!hasShellFamily(store)) {
120
143
  // Declared intent that cannot be honored deserves a diagnostic (unlike an
121
144
  // undeclared route, which is silent). Axis 1 after the warning.
122
145
  warnShellStoreMissingOnce(key);
@@ -469,12 +492,20 @@ function serveShellHit(
469
492
  // never recorded) falls through to the real store and stays LIVE. The
470
493
  // overlay lives on a DERIVED context (own _cacheStore), so the shared reqCtx
471
494
  // is untouched; an entry without a snapshot keeps the pre-snapshot behavior.
472
- if (entry.snapshot && entry.snapshot.length > 0 && reqCtx._cacheStore) {
495
+ if (entry.snapshot && entry.snapshot.length > 0) {
473
496
  const seededCtx: RequestContext<any> = Object.create(reqCtx);
474
- seededCtx._cacheStore = new SeededShellStore(
475
- reqCtx._cacheStore,
476
- entry.snapshot,
477
- );
497
+ if (reqCtx._cacheStore) {
498
+ seededCtx._cacheStore = new SeededShellStore(
499
+ reqCtx._cacheStore,
500
+ entry.snapshot,
501
+ );
502
+ }
503
+ // Loader-family records (bake-lane containers, loader-container-bake):
504
+ // decode into a seed Map for the resolveLoaderData overlay, so the
505
+ // payload's baked container bytes match the frozen prelude while the
506
+ // hole-marker paths keep the fresh run's live nested promises.
507
+ const loaderSeed = await buildShellLoaderSeed(entry.snapshot);
508
+ if (loaderSeed) seededCtx._shellLoaderSeed = loaderSeed;
478
509
  return runWithRequestContext(seededCtx, () => renderTail(seededCtx));
479
510
  }
480
511
  return renderTail(reqCtx);
@@ -33,6 +33,10 @@ import type {
33
33
  SegmentCacheStore,
34
34
  ShellSnapshotRecord,
35
35
  } from "../cache/types.js";
36
+ import {
37
+ elideLoaderContainer,
38
+ isLoaderHoleMarker,
39
+ } from "../router/segment-resolution/loader-snapshot.js";
36
40
  import {
37
41
  RecordingShellStore,
38
42
  getRecordingStore,
@@ -169,7 +173,8 @@ const inFlightCaptures = new Set<string>();
169
173
 
170
174
  /**
171
175
  * Refused-capture backoff bounds. The window is EXPONENTIAL in the consecutive
172
- * failure count: `min(BASE * 2^(failures-1), MAX)` — 1s, 2s, 4s, … capped at 60s.
176
+ * failure count: `min(BASE * 2^(failures-1), ceiling)` — 1s, 2s, 4s, … up to the
177
+ * mode's ceiling (60s in production, {@link REFUSED_CAPTURE_DEV_MAX_MS} in dev).
173
178
  *
174
179
  * Why exponential and not a flat 60s: a flat long window conflates two very
175
180
  * different failures. A STRUCTURALLY ineligible route (no loading(), a cookie
@@ -179,12 +184,44 @@ const inFlightCaptures = new Set<string>();
179
184
  * request or two, not be frozen for 60s (that would re-break the very cold-start DX
180
185
  * the retry fixes; it bit the cloudflare dev e2e). Escalating from 1s means the
181
186
  * eligible route re-probes almost immediately (warm now → HIT and clear), while the
182
- * doomed route ramps to the 60s cap within a handful of failures. Either way an
187
+ * doomed route ramps to the ceiling within a handful of failures. Either way an
183
188
  * app-wide mount never re-renders a doomed route on EVERY request.
184
189
  */
185
190
  const REFUSED_CAPTURE_BASE_MS = 1_000;
186
191
  const REFUSED_CAPTURE_MAX_MS = 60_000;
187
192
 
193
+ /**
194
+ * DEV-only backoff ceiling. In dev the 60s production cap is pure harm: the
195
+ * dominant no-shell cause is a COLD module graph (route modules, SSR/Flight
196
+ * transforms built lazily), and the very attempt that failed WARMS that graph, so
197
+ * the next attempt a beat later usually completes the shell. Capping the dev window
198
+ * low keeps a cold-but-eligible route re-probing every ~2s instead of freezing for
199
+ * up to 60s once the exponential climbs (1s→2s→4s→…→60s). A 60s freeze outlasts the
200
+ * e2e warm windows on cold CI runners: the capture races an unfinished shell,
201
+ * escalates the backoff past the poll window, and every subsequent request inside
202
+ * that window is skipped as backed-off — an eternal MISS for the test even though
203
+ * the modules are warm by then. Production keeps the full 60s cap: there the
204
+ * no-shell cause is far more likely to be a genuinely ineligible route (no
205
+ * loading()), which SHOULD be re-probed rarely. See #652 (item 3) and
206
+ * docs/design/ppr-shell-resume.md ("Refused-capture backoff").
207
+ */
208
+ const REFUSED_CAPTURE_DEV_MAX_MS = 2_000;
209
+
210
+ /**
211
+ * Dev signal, matching the rest of the RSC runtime (handler.ts, server-action.ts,
212
+ * progressive-enhancement.ts): treat anything but an explicit production build as
213
+ * dev. The build folds `process.env.NODE_ENV` to a literal, so this is a compile-
214
+ * time constant in the shipped worker — no runtime probe.
215
+ */
216
+ function isDevMode(): boolean {
217
+ return process.env.NODE_ENV !== "production";
218
+ }
219
+
220
+ /** The active backoff ceiling for the current mode (dev capped low, prod at 60s). */
221
+ function refusedCaptureCeilingMs(): number {
222
+ return isDevMode() ? REFUSED_CAPTURE_DEV_MAX_MS : REFUSED_CAPTURE_MAX_MS;
223
+ }
224
+
188
225
  /**
189
226
  * Refused-capture backoff: key -> { consecutive failure count, epoch ms until which
190
227
  * the key is not re-probed }. A key enters backoff only after runShellCapture's
@@ -203,12 +240,19 @@ function isCaptureBackedOff(key: string): boolean {
203
240
  return Date.now() < entry.until;
204
241
  }
205
242
 
206
- /** Record a refused/failed capture, escalating the backoff window exponentially. */
243
+ /**
244
+ * Record a refused/failed capture, escalating the backoff window exponentially up
245
+ * to the current mode's ceiling. The failure count keeps climbing across attempts
246
+ * (so a genuinely doomed route still ramps toward its cap), but the WINDOW is
247
+ * clamped: 60s in production, {@link REFUSED_CAPTURE_DEV_MAX_MS} in dev so a
248
+ * cold-but-eligible route re-probes fast instead of freezing out the e2e warm
249
+ * window on a cold CI runner (#652 item 3).
250
+ */
207
251
  function markCaptureBackoff(key: string): void {
208
252
  const failures = (refusedCaptures.get(key)?.failures ?? 0) + 1;
209
253
  const window = Math.min(
210
254
  REFUSED_CAPTURE_BASE_MS * 2 ** (failures - 1),
211
- REFUSED_CAPTURE_MAX_MS,
255
+ refusedCaptureCeilingMs(),
212
256
  );
213
257
  refusedCaptures.set(key, { failures, until: Date.now() + window });
214
258
  }
@@ -243,21 +287,46 @@ function warnNullCaptureOnce(key: string): void {
243
287
  warnedNullCaptures.add(key);
244
288
  console.warn(
245
289
  `[rango] Shell capture for "${key}" produced no usable shell after an in-place ` +
246
- "retry; nothing was stored, so this request stays on MISS. Two things cause this, " +
247
- "told apart by whether the route ever flips to HIT:\n" +
290
+ "retry; nothing was stored, so this request stays on MISS. Causes, told apart " +
291
+ "by whether the route ever flips to HIT:\n" +
248
292
  " 1. Cold-start warmup (dev module transform, or a cold worker): the capture raced " +
249
293
  "an unfinished shell render. This SELF-HEALS — the route flips to HIT once a later " +
250
294
  "request warms the modules. Usually nothing to do.\n" +
251
- " 2. A loader route WITHOUT a route-level loading() boundary: its loader data is " +
252
- "awaited at tree-build, so under capture's masked loaders no shell exists above " +
253
- "<body>, and the route NEVER flips to HIT. Add loading() to the loader route (and " +
254
- "keep shell material in a layout) to make it PPR-capturable.\n" +
295
+ " 2. Something suspends above <body> with no Suspense boundary and never settles " +
296
+ "within the capture window: a slower-than-the-capture-guard bake-lane loader " +
297
+ "(loaders on entries WITHOUT loading() execute at capture and their containers " +
298
+ "bake — the boundary-less await must settle for a shell to exist), or a pending " +
299
+ "promise consumed without a <Suspense> above it. The boundary belongs on the " +
300
+ "entry/component that OWNS the data: loading() on the entry that registers the " +
301
+ "loader (a child route's loading() does not unpin a parent layout's loaders), or " +
302
+ "a <Suspense> above the consuming component.\n" +
255
303
  'See the /ppr skill (node_modules/@rangojs/router/skills/ppr/SKILL.md), "The hole ' +
256
- 'contract", or the design doc: ' +
304
+ 'doctrine" and "The layout-with-loaders playbook", or the design docs: ' +
257
305
  "https://github.com/ivogt/vite-rsc/blob/main/packages/rangojs-router/docs/design/ppr-shell-resume.md",
258
306
  );
259
307
  }
260
308
 
309
+ /** Keys already warned about a deterministic capture refusal (once per key). */
310
+ const warnedRefusedCaptures = new Set<string>();
311
+
312
+ /**
313
+ * Warn once per key that the capture was REFUSED for a deterministic reason
314
+ * (identity-guard trip or a rejected bake-lane loader). Distinct from
315
+ * warnNullCaptureOnce: these are not cold-start shapes, the retry is skipped,
316
+ * and the message carries the concrete cause instead of a differential.
317
+ */
318
+ function warnCaptureRefusedOnce(key: string, reason: string): void {
319
+ if (warnedRefusedCaptures.has(key)) return;
320
+ warnedRefusedCaptures.add(key);
321
+ console.warn(
322
+ `[rango] Shell capture for "${key}" was refused: ${reason}\n` +
323
+ "The route stays on MISS (axis 1) — the page keeps working, only the shell " +
324
+ "cache is off. See the /ppr skill " +
325
+ "(node_modules/@rangojs/router/skills/ppr/SKILL.md) and " +
326
+ "docs/design/loader-container-bake.md.",
327
+ );
328
+ }
329
+
261
330
  export interface FlightCaptureGate {
262
331
  /** Identity passthrough of the source stream; feed this to captureShellHTML. */
263
332
  stream: ReadableStream<Uint8Array>;
@@ -504,7 +573,7 @@ export function scheduleShellCapture(
504
573
  * - `no-shell`: the prelude came back trivial (no <body>) OR captureShellHTML
505
574
  * rejected with our own abort. This is the only RETRYABLE outcome.
506
575
  */
507
- type CaptureAttemptOutcome = "stored" | "redirect" | "no-shell";
576
+ type CaptureAttemptOutcome = "stored" | "redirect" | "no-shell" | "refused";
508
577
 
509
578
  /**
510
579
  * Run the shell capture with a single in-place retry, then store the result.
@@ -547,6 +616,10 @@ async function runShellCapture(
547
616
  ssrModule,
548
617
  descriptor,
549
618
  );
619
+ // "refused" is deterministic (identity guard / rejected bake-lane loader —
620
+ // its own warning already fired): no retry, and the caller backs the key off
621
+ // exactly like a structural no-shell.
622
+ if (first === "refused") return "no-shell";
550
623
  // "stored" (success) or "redirect" (no shell exists): nothing to retry.
551
624
  if (first !== "no-shell") return first;
552
625
 
@@ -568,6 +641,7 @@ async function runShellCapture(
568
641
  ssrModule,
569
642
  descriptor,
570
643
  );
644
+ if (second === "refused") return "no-shell";
571
645
  if (second !== "no-shell") return second;
572
646
 
573
647
  // Both attempts came back with no usable shell. Cold-start would have healed by
@@ -641,6 +715,16 @@ async function attemptCapture(
641
715
  derivedCtx._transitionWhen = [];
642
716
  derivedCtx._shellCaptureRun = true;
643
717
  derivedCtx._metricsStore = undefined;
718
+ // Spans, like perf metrics above, are a FOREGROUND surface: the capture
719
+ // re-render must not emit a second rango.render/loader/ssr set after the
720
+ // foreground rango.request span ended (orphan spans in the trace).
721
+ // _tracing is otherwise inherited through Object.create(reqCtx).
722
+ derivedCtx._tracing = undefined;
723
+ // Bake-lane loader containers (loaders on entries with no renderable
724
+ // loading() execute during capture — docs/design/loader-container-bake.md).
725
+ // resolveLoaderData registers each container promise here; the drain in
726
+ // captureAndStoreShell elides + pins them into the snapshot's loader family.
727
+ derivedCtx._shellCaptureLoaderRecords = new Map();
644
728
  // Own onResponse list so the capture's match-middleware callbacks (the ring-3
645
729
  // segment cache write registers here) are ISOLATED from the foreground's shared
646
730
  // array AND can be fired by captureAndStoreShell. The segment write is gated
@@ -765,13 +849,44 @@ async function captureAndStoreShell(
765
849
  // Bounded by maxWaitMs like every quiesce input (a defer hanging on a masked
766
850
  // loader still ends in the sanity-gate refusal).
767
851
  const handlesBaked = handleStore.getData().then(resolveDeferredHandleValues);
768
- const gate = gateFlightForCapture(rscStream, undefined, handlesBaked);
852
+ // Bake-lane loader containers hold the gate the same way (loader-container-
853
+ // bake): a boundary-less container with real latency (a 100ms layout loader)
854
+ // would otherwise lose the 2-hop byte-quiet race — the pending loaderData row
855
+ // emits no bytes, the gate freezes, and the awaiting tree pins above <body>.
856
+ // The records map is fully populated before this point (loader promises are
857
+ // created during the capture's match()), so the hold covers every bake-lane
858
+ // container. allSettled: a REJECTED container releases the hold (the drain
859
+ // below refuses the capture); nested promises INSIDE a container never hold
860
+ // the gate — they stay holes. Bounded by maxWaitMs like every quiesce input.
861
+ const loaderRecordsForHold = reqCtx._shellCaptureLoaderRecords;
862
+ const holdUntil =
863
+ loaderRecordsForHold && loaderRecordsForHold.size > 0
864
+ ? Promise.allSettled([handlesBaked, ...loaderRecordsForHold.values()])
865
+ : handlesBaked;
866
+ const gate = gateFlightForCapture(rscStream, undefined, holdUntil);
769
867
  // Quiesce = handles settled AND the Flight shell rows went task-quiet. Either
770
868
  // half stalling is bounded by captureShellHTML's maxWaitMs.
771
869
  const quiesce = Promise.all([handleStore.settled, gate.quiesce]).then(
772
870
  () => {},
773
871
  );
774
872
 
873
+ // Deterministic identity-guard refusal, checked at BOTH exits below: the
874
+ // guard error either rejects the prerender itself (boundary-less segment —
875
+ // lands in the catch) or is swallowed into per-loader error UI (the render
876
+ // completes — caught after the try). One helper so the message and the
877
+ // "refused" mapping cannot drift between the two sites.
878
+ const refuseOnGuardTrip = (): "refused" | undefined => {
879
+ const fnName = reqCtx._shellCaptureGuardTripped;
880
+ if (!fnName) return undefined;
881
+ warnCaptureRefusedOnce(
882
+ capture.key,
883
+ `a bake-lane loader (a loader on an entry with no loading()) called ${fnName}() during capture. ` +
884
+ "Identity must not bake into a shared shell. Give that loader's entry a loading() boundary " +
885
+ "(the live lane, exempt from the guard) or move the identity-dependent part into a nested promise.",
886
+ );
887
+ return "refused";
888
+ };
889
+
775
890
  try {
776
891
  // captureShellHTML CONSUMES the (gated) stream — it is not also SSR'd.
777
892
  let result: Awaited<ReturnType<typeof captureShellHTML>>;
@@ -783,6 +898,10 @@ async function captureAndStoreShell(
783
898
  }),
784
899
  );
785
900
  } catch (error) {
901
+ // Guard-tripped rejection arrives here (not at the drain) — refuse
902
+ // BEFORE the AbortError-vs-rethrow decision below.
903
+ const refused = refuseOnGuardTrip();
904
+ if (refused) return refused;
786
905
  // captureShellHTML normally converts its OWN deliberate abort to a null
787
906
  // return (index.tsx). This catch is defensive: if an AbortError still escapes
788
907
  // (a runtime where the abort surfaces as a stream rejection outside its
@@ -801,6 +920,13 @@ async function captureAndStoreShell(
801
920
  // yet finished; on a loader route WITHOUT a route-level loading() boundary it is
802
921
  // the structural eternal-MISS shape (the masked loader pins the tree above
803
922
  // <body> at tree-build). The caller's warning names both.
923
+ // Guard check first — BEFORE the trivial-prelude retry path. A guard trip
924
+ // is deterministic (retrying re-trips it), and when the tripping loader's
925
+ // error UI still completed a shell, storing it would bake the failure into
926
+ // a shared page.
927
+ const refused = refuseOnGuardTrip();
928
+ if (refused) return refused;
929
+
804
930
  if (result === null) {
805
931
  return "no-shell";
806
932
  }
@@ -847,6 +973,54 @@ async function captureAndStoreShell(
847
973
  snapshot = recording.drainSnapshot();
848
974
  }
849
975
 
976
+ // Pin the bake-lane loader containers (loader family). Settled containers
977
+ // are promise-elided (a still-pending nested promise is a hole marker, not
978
+ // shell material) and Flight-serialized; a REJECTED container refuses the
979
+ // capture — per-loader error UI must never bake into the shared shell. A
980
+ // container still pending here either pinned the tree (the trivial-prelude
981
+ // gate above already returned no-shell) or postponed under an ANCESTOR
982
+ // boundary (it is a hole; omitting the record keeps it live).
983
+ const loaderRecords = reqCtx._shellCaptureLoaderRecords;
984
+ if (loaderRecords && loaderRecords.size > 0) {
985
+ // The codec import is deferred past the elide probes: a rejected record
986
+ // refuses and a never-settled record is omitted WITHOUT touching Flight
987
+ // (also keeps the virtual @vitejs/plugin-rsc import out of unit configs).
988
+ let serializeContainer:
989
+ | typeof import("../cache/segment-codec.js").serializeResult
990
+ | undefined;
991
+ for (const [segmentKey, containerPromise] of loaderRecords) {
992
+ const elided = await elideLoaderContainer(containerPromise);
993
+ if (elided.state === "rejected") {
994
+ warnCaptureRefusedOnce(
995
+ capture.key,
996
+ `the loader for segment "${segmentKey}" rejected during capture; its error UI must not bake into the shared shell. ` +
997
+ "Fix the loader, or give its entry a loading() boundary so it stays on the live lane.",
998
+ );
999
+ return "refused";
1000
+ }
1001
+ // The container itself never settled: it is a hole (under an ancestor
1002
+ // boundary) or the trivial-prelude gate already fired. Omit — no pin.
1003
+ if (isLoaderHoleMarker(elided.value)) continue;
1004
+ try {
1005
+ // serializeResult (not rscSerialize): null is a valid container and
1006
+ // must round-trip; serializeResult preserves it through Flight.
1007
+ serializeContainer ??= (await import("../cache/segment-codec.js"))
1008
+ .serializeResult;
1009
+ const serialized = await serializeContainer(elided.value);
1010
+ if (serialized !== null) {
1011
+ (snapshot ??= []).push({
1012
+ family: "loader",
1013
+ key: segmentKey,
1014
+ value: { value: serialized },
1015
+ });
1016
+ }
1017
+ } catch {
1018
+ // Non-serializable container: leave it unpinned (it drifts on a HIT,
1019
+ // the pre-snapshot behavior) rather than failing the capture.
1020
+ }
1021
+ }
1022
+ }
1023
+
850
1024
  const store = capture.store ?? reqCtx._cacheStore;
851
1025
  if (store?.putShell) {
852
1026
  try {
@@ -895,3 +1069,17 @@ async function captureAndStoreShell(
895
1069
 
896
1070
  // Exported for unit tests that drive the capture core directly.
897
1071
  export { runShellCapture, captureAndStoreShell };
1072
+
1073
+ // Exported for unit tests that pin the refused-capture backoff policy directly
1074
+ // (dev cap vs production exponential growth, stored-clears, cold-start re-probe).
1075
+ // These are the same module-level functions the schedule path uses; a test that
1076
+ // drove them through a real capture round-trip could not assert the exact window
1077
+ // arithmetic without a full cold render.
1078
+ export {
1079
+ isCaptureBackedOff,
1080
+ markCaptureBackoff,
1081
+ clearCaptureBackoff,
1082
+ REFUSED_CAPTURE_BASE_MS,
1083
+ REFUSED_CAPTURE_MAX_MS,
1084
+ REFUSED_CAPTURE_DEV_MAX_MS,
1085
+ };