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

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 (903) 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 +82 -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 +19 -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 +17 -1
  813. package/skills/catalog.json +265 -0
  814. package/skills/comparison/references/framework-comparison.md +1 -1
  815. package/skills/composability/SKILL.md +1 -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 +1 -1
  842. package/skills/parallel/SKILL.md +8 -1
  843. package/skills/ppr/SKILL.md +261 -28
  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 +1 -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 +44 -919
  857. package/skills/typesafety/env-and-bindings.md +254 -0
  858. package/skills/typesafety/generated-files-and-cli.md +305 -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/router/manifest.ts +13 -5
  885. package/src/router/match-api.ts +70 -30
  886. package/src/router/match-handlers.ts +6 -2
  887. package/src/router/match-result.ts +35 -15
  888. package/src/router/middleware.ts +10 -3
  889. package/src/router/request-classification.ts +20 -7
  890. package/src/router/route-snapshot.ts +10 -0
  891. package/src/router/segment-resolution/fresh.ts +25 -4
  892. package/src/router/segment-resolution/loader-cache.ts +57 -8
  893. package/src/router/segment-resolution/loader-mask.ts +26 -3
  894. package/src/router/segment-resolution/loader-snapshot.ts +170 -0
  895. package/src/rsc/nonce.ts +10 -1
  896. package/src/rsc/rsc-rendering.ts +39 -8
  897. package/src/rsc/shell-capture.ts +196 -13
  898. package/src/rsc/shell-serve.ts +26 -0
  899. package/src/server/cookie-store.ts +6 -0
  900. package/src/server/request-context.ts +33 -0
  901. package/src/ssr/index.tsx +7 -0
  902. package/src/vite/discovery/dev-prerender-cache.ts +117 -0
  903. package/src/vite/router-discovery.ts +78 -15
@@ -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,11 @@ async function attemptCapture(
641
715
  derivedCtx._transitionWhen = [];
642
716
  derivedCtx._shellCaptureRun = true;
643
717
  derivedCtx._metricsStore = undefined;
718
+ // Bake-lane loader containers (loaders on entries with no renderable
719
+ // loading() execute during capture — docs/design/loader-container-bake.md).
720
+ // resolveLoaderData registers each container promise here; the drain in
721
+ // captureAndStoreShell elides + pins them into the snapshot's loader family.
722
+ derivedCtx._shellCaptureLoaderRecords = new Map();
644
723
  // Own onResponse list so the capture's match-middleware callbacks (the ring-3
645
724
  // segment cache write registers here) are ISOLATED from the foreground's shared
646
725
  // array AND can be fired by captureAndStoreShell. The segment write is gated
@@ -765,13 +844,44 @@ async function captureAndStoreShell(
765
844
  // Bounded by maxWaitMs like every quiesce input (a defer hanging on a masked
766
845
  // loader still ends in the sanity-gate refusal).
767
846
  const handlesBaked = handleStore.getData().then(resolveDeferredHandleValues);
768
- const gate = gateFlightForCapture(rscStream, undefined, handlesBaked);
847
+ // Bake-lane loader containers hold the gate the same way (loader-container-
848
+ // bake): a boundary-less container with real latency (a 100ms layout loader)
849
+ // would otherwise lose the 2-hop byte-quiet race — the pending loaderData row
850
+ // emits no bytes, the gate freezes, and the awaiting tree pins above <body>.
851
+ // The records map is fully populated before this point (loader promises are
852
+ // created during the capture's match()), so the hold covers every bake-lane
853
+ // container. allSettled: a REJECTED container releases the hold (the drain
854
+ // below refuses the capture); nested promises INSIDE a container never hold
855
+ // the gate — they stay holes. Bounded by maxWaitMs like every quiesce input.
856
+ const loaderRecordsForHold = reqCtx._shellCaptureLoaderRecords;
857
+ const holdUntil =
858
+ loaderRecordsForHold && loaderRecordsForHold.size > 0
859
+ ? Promise.allSettled([handlesBaked, ...loaderRecordsForHold.values()])
860
+ : handlesBaked;
861
+ const gate = gateFlightForCapture(rscStream, undefined, holdUntil);
769
862
  // Quiesce = handles settled AND the Flight shell rows went task-quiet. Either
770
863
  // half stalling is bounded by captureShellHTML's maxWaitMs.
771
864
  const quiesce = Promise.all([handleStore.settled, gate.quiesce]).then(
772
865
  () => {},
773
866
  );
774
867
 
868
+ // Deterministic identity-guard refusal, checked at BOTH exits below: the
869
+ // guard error either rejects the prerender itself (boundary-less segment —
870
+ // lands in the catch) or is swallowed into per-loader error UI (the render
871
+ // completes — caught after the try). One helper so the message and the
872
+ // "refused" mapping cannot drift between the two sites.
873
+ const refuseOnGuardTrip = (): "refused" | undefined => {
874
+ const fnName = reqCtx._shellCaptureGuardTripped;
875
+ if (!fnName) return undefined;
876
+ warnCaptureRefusedOnce(
877
+ capture.key,
878
+ `a bake-lane loader (a loader on an entry with no loading()) called ${fnName}() during capture. ` +
879
+ "Identity must not bake into a shared shell. Give that loader's entry a loading() boundary " +
880
+ "(the live lane, exempt from the guard) or move the identity-dependent part into a nested promise.",
881
+ );
882
+ return "refused";
883
+ };
884
+
775
885
  try {
776
886
  // captureShellHTML CONSUMES the (gated) stream — it is not also SSR'd.
777
887
  let result: Awaited<ReturnType<typeof captureShellHTML>>;
@@ -783,6 +893,10 @@ async function captureAndStoreShell(
783
893
  }),
784
894
  );
785
895
  } catch (error) {
896
+ // Guard-tripped rejection arrives here (not at the drain) — refuse
897
+ // BEFORE the AbortError-vs-rethrow decision below.
898
+ const refused = refuseOnGuardTrip();
899
+ if (refused) return refused;
786
900
  // captureShellHTML normally converts its OWN deliberate abort to a null
787
901
  // return (index.tsx). This catch is defensive: if an AbortError still escapes
788
902
  // (a runtime where the abort surfaces as a stream rejection outside its
@@ -801,6 +915,13 @@ async function captureAndStoreShell(
801
915
  // yet finished; on a loader route WITHOUT a route-level loading() boundary it is
802
916
  // the structural eternal-MISS shape (the masked loader pins the tree above
803
917
  // <body> at tree-build). The caller's warning names both.
918
+ // Guard check first — BEFORE the trivial-prelude retry path. A guard trip
919
+ // is deterministic (retrying re-trips it), and when the tripping loader's
920
+ // error UI still completed a shell, storing it would bake the failure into
921
+ // a shared page.
922
+ const refused = refuseOnGuardTrip();
923
+ if (refused) return refused;
924
+
804
925
  if (result === null) {
805
926
  return "no-shell";
806
927
  }
@@ -847,6 +968,54 @@ async function captureAndStoreShell(
847
968
  snapshot = recording.drainSnapshot();
848
969
  }
849
970
 
971
+ // Pin the bake-lane loader containers (loader family). Settled containers
972
+ // are promise-elided (a still-pending nested promise is a hole marker, not
973
+ // shell material) and Flight-serialized; a REJECTED container refuses the
974
+ // capture — per-loader error UI must never bake into the shared shell. A
975
+ // container still pending here either pinned the tree (the trivial-prelude
976
+ // gate above already returned no-shell) or postponed under an ANCESTOR
977
+ // boundary (it is a hole; omitting the record keeps it live).
978
+ const loaderRecords = reqCtx._shellCaptureLoaderRecords;
979
+ if (loaderRecords && loaderRecords.size > 0) {
980
+ // The codec import is deferred past the elide probes: a rejected record
981
+ // refuses and a never-settled record is omitted WITHOUT touching Flight
982
+ // (also keeps the virtual @vitejs/plugin-rsc import out of unit configs).
983
+ let serializeContainer:
984
+ | typeof import("../cache/segment-codec.js").serializeResult
985
+ | undefined;
986
+ for (const [segmentKey, containerPromise] of loaderRecords) {
987
+ const elided = await elideLoaderContainer(containerPromise);
988
+ if (elided.state === "rejected") {
989
+ warnCaptureRefusedOnce(
990
+ capture.key,
991
+ `the loader for segment "${segmentKey}" rejected during capture; its error UI must not bake into the shared shell. ` +
992
+ "Fix the loader, or give its entry a loading() boundary so it stays on the live lane.",
993
+ );
994
+ return "refused";
995
+ }
996
+ // The container itself never settled: it is a hole (under an ancestor
997
+ // boundary) or the trivial-prelude gate already fired. Omit — no pin.
998
+ if (isLoaderHoleMarker(elided.value)) continue;
999
+ try {
1000
+ // serializeResult (not rscSerialize): null is a valid container and
1001
+ // must round-trip; serializeResult preserves it through Flight.
1002
+ serializeContainer ??= (await import("../cache/segment-codec.js"))
1003
+ .serializeResult;
1004
+ const serialized = await serializeContainer(elided.value);
1005
+ if (serialized !== null) {
1006
+ (snapshot ??= []).push({
1007
+ family: "loader",
1008
+ key: segmentKey,
1009
+ value: { value: serialized },
1010
+ });
1011
+ }
1012
+ } catch {
1013
+ // Non-serializable container: leave it unpinned (it drifts on a HIT,
1014
+ // the pre-snapshot behavior) rather than failing the capture.
1015
+ }
1016
+ }
1017
+ }
1018
+
850
1019
  const store = capture.store ?? reqCtx._cacheStore;
851
1020
  if (store?.putShell) {
852
1021
  try {
@@ -895,3 +1064,17 @@ async function captureAndStoreShell(
895
1064
 
896
1065
  // Exported for unit tests that drive the capture core directly.
897
1066
  export { runShellCapture, captureAndStoreShell };
1067
+
1068
+ // Exported for unit tests that pin the refused-capture backoff policy directly
1069
+ // (dev cap vs production exponential growth, stored-clears, cold-start re-probe).
1070
+ // These are the same module-level functions the schedule path uses; a test that
1071
+ // drove them through a real capture round-trip could not assert the exact window
1072
+ // arithmetic without a full cold render.
1073
+ export {
1074
+ isCaptureBackedOff,
1075
+ markCaptureBackoff,
1076
+ clearCaptureBackoff,
1077
+ REFUSED_CAPTURE_BASE_MS,
1078
+ REFUSED_CAPTURE_MAX_MS,
1079
+ REFUSED_CAPTURE_DEV_MAX_MS,
1080
+ };
@@ -122,3 +122,29 @@ export function warnShellStoreMissingOnce(key: string): void {
122
122
  "via createRouter({ cache }).",
123
123
  );
124
124
  }
125
+
126
+ /** Keys already warned about an active per-request nonce (once per key). */
127
+ const warnedNonceActive = new Set<string>();
128
+
129
+ /**
130
+ * Warn once per key that a route declared `ppr` but a per-request CSP nonce is
131
+ * active for the request, so the route stays on axis 1 (a shared shell would
132
+ * freeze one request's nonce for every visitor — useNonce() renders it into every
133
+ * nonced script/style/meta and the browser's CSP would then reject the frozen
134
+ * nonce for all but the capture request). The nonce blocks capture whether it came
135
+ * from the `createRouter({ nonce })` provider or from a direct `ctx.set(nonce, …)`
136
+ * token write in middleware. Same declared-intent-cannot-be-honored doctrine as
137
+ * the missing-store warning above (an undeclared route stays silent).
138
+ */
139
+ export function warnPprNonceActiveOnce(key: string): void {
140
+ if (warnedNonceActive.has(key)) return;
141
+ warnedNonceActive.add(key);
142
+ console.warn(
143
+ `[rango] Route for "${key}" declares the ppr path option, but a per-request ` +
144
+ "CSP nonce is active for this request (from createRouter({ nonce }) or a " +
145
+ "ctx.set(nonce, …) token write in middleware), so the route is served on " +
146
+ "axis 1 without a shell. A shell is shared per host+URL; baking one " +
147
+ "request's nonce into it would break CSP for every other visitor. Drop the " +
148
+ "ppr option on this route, or stop setting a per-request nonce for it.",
149
+ );
150
+ }
@@ -164,6 +164,12 @@ function assertNotInsideShellCapture(ctx: unknown, fnName: string): void {
164
164
  typeof ctx === "object" &&
165
165
  (ctx as { _shellCaptureRun?: unknown })._shellCaptureRun === true
166
166
  ) {
167
+ // Flag the capture context BEFORE throwing: inside an executing bake-lane
168
+ // loader this throw is swallowed by wrapLoaderPromise into per-loader error
169
+ // UI, which would bake silently into the shared shell. The capture checks
170
+ // the flag after the render and refuses (shell-capture.ts).
171
+ (ctx as { _shellCaptureGuardTripped?: string })._shellCaptureGuardTripped =
172
+ fnName;
167
173
  throw new Error(
168
174
  `${fnName}() cannot be called while capturing a shared shell ` +
169
175
  `(shell-cache middleware). The captured shell is served to every user ` +
@@ -187,6 +187,39 @@ export interface RequestContext<
187
187
  */
188
188
  _shellCaptureRun?: boolean;
189
189
 
190
+ /**
191
+ * @internal Bake-lane loader containers collected DURING a shell capture:
192
+ * segment-key -> the loader's (pre-wrap) result promise. Populated by
193
+ * resolveLoaderData for loaders on entries with no renderable loading() (the
194
+ * bake lane — they execute at capture instead of being masked; see
195
+ * docs/design/loader-container-bake.md). Drained by captureAndStoreShell
196
+ * after the shell quiesces: settled containers are promise-elided,
197
+ * Flight-serialized, and pinned into the snapshot's loader family; a
198
+ * REJECTED container refuses the capture (error UI must never bake into the
199
+ * shared shell). Own property of the capture's derived context only.
200
+ */
201
+ _shellCaptureLoaderRecords?: Map<string, Promise<unknown>>;
202
+
203
+ /**
204
+ * @internal Loader-family snapshot seed for a shell HIT's tail render:
205
+ * segment-key -> the capture's elided container (already Flight-deserialized
206
+ * by serveShellHit). resolveLoaderData overlays it onto the fresh run's
207
+ * container (recorded paths pinned, hole-marker paths keep the fresh nested
208
+ * promises) so the payload's baked bytes match the frozen prelude. Own
209
+ * property of the HIT tail's derived context only.
210
+ */
211
+ _shellLoaderSeed?: Map<string, unknown>;
212
+
213
+ /**
214
+ * @internal Set (to the offending fn name) by the cookies()/headers()
215
+ * capture guard when it throws DURING a capture render. Load-bearing for the
216
+ * bake lane: a guard throw inside an executing loader is swallowed by
217
+ * wrapLoaderPromise into per-loader error UI, which would otherwise bake
218
+ * silently into the shared shell — the capture checks this flag after the
219
+ * render and refuses instead. Deterministic, so the capture does not retry.
220
+ */
221
+ _shellCaptureGuardTripped?: string;
222
+
190
223
  /**
191
224
  * @internal Handler-owned registry of explicit per-scope stores from
192
225
  * cache({ store }). Created once per createRSCHandler() and threaded into
package/src/ssr/index.tsx CHANGED
@@ -470,6 +470,13 @@ export function createShellCaptureHandler<TEnv = unknown>(
470
470
  reportRenderError(onError, error);
471
471
  },
472
472
  });
473
+ // Pre-attach a no-op catch: the real await sits AFTER quiesce + the
474
+ // post-quiesce hops, so an early prerender rejection (e.g. a bake-lane
475
+ // loader tripping the identity guard within milliseconds) would otherwise
476
+ // spend several turns handler-less and crash the worker as an unhandled
477
+ // rejection. The actual rejection handling still happens at the await
478
+ // below; this parallel handler only keeps the gap crash-free.
479
+ prerenderPromise.catch(() => {});
473
480
 
474
481
  // Wait for the caller's quiesce signal. By the time it resolves the Flight
475
482
  // input is byte-quiet and FROZEN by the capture gate (shell-capture.ts
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Dev prerender result cache — memoizes /__rsc_prerender responses between
3
+ * HMR edits (issue #654).
4
+ *
5
+ * Freshness invariant (why identity keying is correct): the endpoint
6
+ * re-imports the user's entry module through a Vite module runner on every
7
+ * request. When ANY module in the entry → router → urls → handler chain was
8
+ * invalidated (file edit propagates up the importer graph), that import
9
+ * re-executes the entry, `createRouter()` re-runs, and `RouterRegistry.set`
10
+ * (router.ts) replaces the router instance with a NEW object. When nothing
11
+ * was invalidated, the import is a module-cache hit and the instance is the
12
+ * SAME object. Router-instance identity therefore IS the HMR generation:
13
+ * keying the cache on it gives "serve cached until an edit invalidates the
14
+ * chain" without any watcher bookkeeping, and the WeakMap lets every stale
15
+ * generation's bucket be garbage-collected the moment the registry drops
16
+ * the old instance.
17
+ *
18
+ * Staleness envelope: a cached body can only go stale through NON-module
19
+ * inputs (a getParams() reading a database, fs content outside the module
20
+ * graph). Production freezes those at build time, so serving them frozen
21
+ * between edits makes dev MORE faithful to production, not less — the
22
+ * pre-#654 behavior of re-rendering per request was the anomaly.
23
+ */
24
+
25
+ import type { SerializedSegmentData } from "../../cache/types.js";
26
+
27
+ /** Structural slice of `matchForPrerender`'s result the payload derivation needs. */
28
+ export interface DevPrerenderMatchPayloadSource {
29
+ segments: SerializedSegmentData[];
30
+ handles: string;
31
+ interceptSegments?: SerializedSegmentData[];
32
+ interceptHandles?: string;
33
+ }
34
+
35
+ /** Serialized response bodies for the two endpoint variants of one render. */
36
+ export interface DevPrerenderPayloadBodies {
37
+ /** `intercept != 1` response: the route's own segments + handles. */
38
+ main: string;
39
+ /**
40
+ * `intercept=1` response: main + intercept segments with the MERGED handle
41
+ * string. Falls back to `main` byte-for-byte when the route has no
42
+ * intercept segments — mirroring the endpoint's historical behavior.
43
+ */
44
+ intercept: string;
45
+ }
46
+
47
+ export interface DevPrerenderCache {
48
+ get(router: object, key: string): string | undefined;
49
+ set(router: object, key: string, body: string): void;
50
+ }
51
+
52
+ /**
53
+ * Derive both variant bodies from one matchForPrerender result, so a single
54
+ * render warms the main AND intercept cache keys (matchForPrerender computes
55
+ * intercept segments unconditionally either way — see prerender-match.ts
56
+ * step 14).
57
+ */
58
+ export function payloadBodiesFromResult(
59
+ result: DevPrerenderMatchPayloadSource,
60
+ ): DevPrerenderPayloadBodies {
61
+ const main = JSON.stringify({
62
+ segments: result.segments,
63
+ handles: result.handles,
64
+ });
65
+ const intercept = result.interceptSegments?.length
66
+ ? JSON.stringify({
67
+ segments: [...result.segments, ...result.interceptSegments],
68
+ handles: result.interceptHandles ?? "",
69
+ })
70
+ : main;
71
+ return { main, intercept };
72
+ }
73
+
74
+ /**
75
+ * Cache key for one endpoint request shape. `pathname` and `routeName` come
76
+ * straight from the query; `passthrough` selects the getParams-checked match
77
+ * path; `intercept` selects which variant body is served. All four dimensions
78
+ * change the response, so all four are in the key.
79
+ */
80
+ export function devPrerenderCacheKey(
81
+ pathname: string,
82
+ opts: { intercept: boolean; passthrough: boolean; routeName: string | null },
83
+ ): string {
84
+ return `${pathname}|i=${opts.intercept ? 1 : 0}|p=${opts.passthrough ? 1 : 0}|r=${opts.routeName ?? ""}`;
85
+ }
86
+
87
+ /**
88
+ * Per-router FIFO cap: a dev session that visits an unbounded set of
89
+ * prerendered pathnames (e.g. crawling param routes) must not grow one
90
+ * bucket without limit. 500 rendered payloads is far beyond any interactive
91
+ * session; eviction order does not matter for correctness (a miss just
92
+ * re-renders).
93
+ */
94
+ const MAX_ENTRIES_PER_ROUTER = 500;
95
+
96
+ export function createDevPrerenderCache(
97
+ maxEntriesPerRouter: number = MAX_ENTRIES_PER_ROUTER,
98
+ ): DevPrerenderCache {
99
+ const buckets = new WeakMap<object, Map<string, string>>();
100
+ return {
101
+ get(router: object, key: string): string | undefined {
102
+ return buckets.get(router)?.get(key);
103
+ },
104
+ set(router: object, key: string, body: string): void {
105
+ let bucket = buckets.get(router);
106
+ if (!bucket) {
107
+ bucket = new Map();
108
+ buckets.set(router, bucket);
109
+ }
110
+ if (!bucket.has(key) && bucket.size >= maxEntriesPerRouter) {
111
+ const oldest = bucket.keys().next().value;
112
+ if (oldest !== undefined) bucket.delete(oldest);
113
+ }
114
+ bucket.set(key, body);
115
+ },
116
+ };
117
+ }