@rangojs/router 0.0.0-experimental.80 → 0.0.0-experimental.80daa23e

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 (1717) hide show
  1. package/AGENTS.md +8 -4
  2. package/README.md +318 -791
  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 +927 -273
  82. package/dist/bin/rango.js.map +1 -0
  83. package/dist/browser/event-controller.d.ts +191 -0
  84. package/dist/browser/event-controller.d.ts.map +1 -0
  85. package/dist/browser/event-controller.js +559 -0
  86. package/dist/browser/event-controller.js.map +1 -0
  87. package/dist/browser/index.d.ts +2 -0
  88. package/dist/browser/index.d.ts.map +1 -0
  89. package/dist/browser/index.js +14 -0
  90. package/dist/browser/index.js.map +1 -0
  91. package/dist/browser/link-interceptor.d.ts +38 -0
  92. package/dist/browser/link-interceptor.d.ts.map +1 -0
  93. package/dist/browser/link-interceptor.js +99 -0
  94. package/dist/browser/link-interceptor.js.map +1 -0
  95. package/dist/browser/logging.d.ts +10 -0
  96. package/dist/browser/logging.d.ts.map +1 -0
  97. package/dist/browser/logging.js +29 -0
  98. package/dist/browser/logging.js.map +1 -0
  99. package/dist/browser/lru-cache.d.ts +17 -0
  100. package/dist/browser/lru-cache.d.ts.map +1 -0
  101. package/dist/browser/lru-cache.js +50 -0
  102. package/dist/browser/lru-cache.js.map +1 -0
  103. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  104. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  105. package/dist/browser/merge-segment-loaders.js +102 -0
  106. package/dist/browser/merge-segment-loaders.js.map +1 -0
  107. package/dist/browser/navigation-bridge.d.ts +102 -0
  108. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  109. package/dist/browser/navigation-bridge.js +708 -0
  110. package/dist/browser/navigation-bridge.js.map +1 -0
  111. package/dist/browser/navigation-client.d.ts +25 -0
  112. package/dist/browser/navigation-client.d.ts.map +1 -0
  113. package/dist/browser/navigation-client.js +157 -0
  114. package/dist/browser/navigation-client.js.map +1 -0
  115. package/dist/browser/navigation-store.d.ts +101 -0
  116. package/dist/browser/navigation-store.d.ts.map +1 -0
  117. package/dist/browser/navigation-store.js +625 -0
  118. package/dist/browser/navigation-store.js.map +1 -0
  119. package/dist/browser/partial-update.d.ts +75 -0
  120. package/dist/browser/partial-update.d.ts.map +1 -0
  121. package/dist/browser/partial-update.js +426 -0
  122. package/dist/browser/partial-update.js.map +1 -0
  123. package/dist/browser/react/Link.d.ts +86 -0
  124. package/dist/browser/react/Link.d.ts.map +1 -0
  125. package/dist/browser/react/Link.js +128 -0
  126. package/dist/browser/react/Link.js.map +1 -0
  127. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  128. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  129. package/dist/browser/react/NavigationProvider.js +216 -0
  130. package/dist/browser/react/NavigationProvider.js.map +1 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  132. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  133. package/dist/browser/react/ScrollRestoration.js +57 -0
  134. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  135. package/dist/browser/react/context.d.ts +46 -0
  136. package/dist/browser/react/context.d.ts.map +1 -0
  137. package/dist/browser/react/context.js +10 -0
  138. package/dist/browser/react/context.js.map +1 -0
  139. package/dist/browser/react/index.d.ts +11 -0
  140. package/dist/browser/react/index.d.ts.map +1 -0
  141. package/dist/browser/react/index.js +22 -0
  142. package/dist/browser/react/index.js.map +1 -0
  143. package/dist/browser/react/location-state-shared.d.ts +63 -0
  144. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  145. package/dist/browser/react/location-state-shared.js +81 -0
  146. package/dist/browser/react/location-state-shared.js.map +1 -0
  147. package/dist/browser/react/location-state.d.ts +23 -0
  148. package/dist/browser/react/location-state.d.ts.map +1 -0
  149. package/dist/browser/react/location-state.js +29 -0
  150. package/dist/browser/react/location-state.js.map +1 -0
  151. package/dist/browser/react/mount-context.d.ts +24 -0
  152. package/dist/browser/react/mount-context.d.ts.map +1 -0
  153. package/dist/browser/react/mount-context.js +24 -0
  154. package/dist/browser/react/mount-context.js.map +1 -0
  155. package/dist/browser/react/use-action.d.ts +64 -0
  156. package/dist/browser/react/use-action.d.ts.map +1 -0
  157. package/dist/browser/react/use-action.js +134 -0
  158. package/dist/browser/react/use-action.js.map +1 -0
  159. package/dist/browser/react/use-client-cache.d.ts +41 -0
  160. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  161. package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -28
  162. package/dist/browser/react/use-client-cache.js.map +1 -0
  163. package/dist/browser/react/use-handle.d.ts +31 -0
  164. package/dist/browser/react/use-handle.d.ts.map +1 -0
  165. package/dist/browser/react/use-handle.js +144 -0
  166. package/dist/browser/react/use-handle.js.map +1 -0
  167. package/dist/browser/react/use-href.d.ts +33 -0
  168. package/dist/browser/react/use-href.d.ts.map +1 -0
  169. package/dist/browser/react/use-href.js +39 -0
  170. package/dist/browser/react/use-href.js.map +1 -0
  171. package/dist/browser/react/use-link-status.d.ts +37 -0
  172. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  173. package/dist/browser/react/use-link-status.js +99 -0
  174. package/dist/browser/react/use-link-status.js.map +1 -0
  175. package/dist/browser/react/use-mount.d.ts +25 -0
  176. package/dist/browser/react/use-mount.d.ts.map +1 -0
  177. package/dist/browser/react/use-mount.js +30 -0
  178. package/dist/browser/react/use-mount.js.map +1 -0
  179. package/dist/browser/react/use-navigation.d.ts +27 -0
  180. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  181. package/dist/browser/react/use-navigation.js +87 -0
  182. package/dist/browser/react/use-navigation.js.map +1 -0
  183. package/dist/browser/react/use-segments.d.ts +38 -0
  184. package/dist/browser/react/use-segments.d.ts.map +1 -0
  185. package/dist/browser/react/use-segments.js +130 -0
  186. package/dist/browser/react/use-segments.js.map +1 -0
  187. package/dist/browser/request-controller.d.ts +26 -0
  188. package/dist/browser/request-controller.d.ts.map +1 -0
  189. package/dist/browser/request-controller.js +147 -0
  190. package/dist/browser/request-controller.js.map +1 -0
  191. package/dist/browser/rsc-router.d.ts +129 -0
  192. package/dist/browser/rsc-router.d.ts.map +1 -0
  193. package/dist/browser/rsc-router.js +195 -0
  194. package/dist/browser/rsc-router.js.map +1 -0
  195. package/dist/browser/scroll-restoration.d.ts +93 -0
  196. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  197. package/dist/browser/scroll-restoration.js +321 -0
  198. package/dist/browser/scroll-restoration.js.map +1 -0
  199. package/dist/browser/segment-structure-assert.d.ts +17 -0
  200. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  201. package/dist/browser/segment-structure-assert.js +59 -0
  202. package/dist/browser/segment-structure-assert.js.map +1 -0
  203. package/dist/browser/server-action-bridge.d.ts +26 -0
  204. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  205. package/dist/browser/server-action-bridge.js +668 -0
  206. package/dist/browser/server-action-bridge.js.map +1 -0
  207. package/dist/browser/shallow.d.ts +12 -0
  208. package/dist/browser/shallow.d.ts.map +1 -0
  209. package/dist/browser/shallow.js +34 -0
  210. package/dist/browser/shallow.js.map +1 -0
  211. package/dist/browser/types.d.ts +369 -0
  212. package/dist/browser/types.d.ts.map +1 -0
  213. package/dist/browser/types.js +2 -0
  214. package/dist/browser/types.js.map +1 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  216. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  217. package/dist/build/__tests__/generate-cli.test.js +237 -0
  218. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  220. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  221. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  222. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  224. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  225. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  226. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  228. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  230. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  231. package/dist/build/generate-manifest.d.ts +81 -0
  232. package/dist/build/generate-manifest.d.ts.map +1 -0
  233. package/dist/build/generate-manifest.js +276 -0
  234. package/dist/build/generate-manifest.js.map +1 -0
  235. package/dist/build/generate-route-types.d.ts +115 -0
  236. package/dist/build/generate-route-types.d.ts.map +1 -0
  237. package/dist/build/generate-route-types.js +740 -0
  238. package/dist/build/generate-route-types.js.map +1 -0
  239. package/dist/build/index.d.ts +21 -0
  240. package/dist/build/index.d.ts.map +1 -0
  241. package/dist/build/index.js +21 -0
  242. package/dist/build/index.js.map +1 -0
  243. package/dist/build/route-trie.d.ts +71 -0
  244. package/dist/build/route-trie.d.ts.map +1 -0
  245. package/dist/build/route-trie.js +175 -0
  246. package/dist/build/route-trie.js.map +1 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  248. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  249. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  250. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  252. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  253. package/dist/cache/__tests__/document-cache.test.js +345 -0
  254. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  258. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  260. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  261. package/dist/cache/__tests__/memory-store.test.js +367 -0
  262. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  263. package/dist/cache/cache-scope.d.ts +102 -0
  264. package/dist/cache/cache-scope.d.ts.map +1 -0
  265. package/dist/cache/cache-scope.js +440 -0
  266. package/dist/cache/cache-scope.js.map +1 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  270. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  272. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  273. package/dist/cache/cf/cf-cache-store.js +242 -0
  274. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  275. package/dist/cache/cf/index.d.ts +14 -0
  276. package/dist/cache/cf/index.d.ts.map +1 -0
  277. package/dist/cache/cf/index.js +17 -0
  278. package/dist/cache/cf/index.js.map +1 -0
  279. package/dist/cache/document-cache.d.ts +64 -0
  280. package/dist/cache/document-cache.d.ts.map +1 -0
  281. package/dist/cache/document-cache.js +228 -0
  282. package/dist/cache/document-cache.js.map +1 -0
  283. package/dist/cache/index.d.ts +19 -0
  284. package/dist/cache/index.d.ts.map +1 -0
  285. package/dist/cache/index.js +21 -0
  286. package/dist/cache/index.js.map +1 -0
  287. package/dist/cache/memory-segment-store.d.ts +110 -0
  288. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  289. package/dist/cache/memory-segment-store.js +117 -0
  290. package/dist/cache/memory-segment-store.js.map +1 -0
  291. package/dist/cache/memory-store.d.ts +41 -0
  292. package/dist/cache/memory-store.d.ts.map +1 -0
  293. package/dist/cache/memory-store.js +191 -0
  294. package/dist/cache/memory-store.js.map +1 -0
  295. package/dist/cache/types.d.ts +317 -0
  296. package/dist/cache/types.d.ts.map +1 -0
  297. package/dist/cache/types.js +12 -0
  298. package/dist/cache/types.js.map +1 -0
  299. package/dist/client.d.ts +248 -0
  300. package/dist/client.d.ts.map +1 -0
  301. package/dist/client.js +367 -0
  302. package/dist/client.js.map +1 -0
  303. package/dist/client.rsc.d.ts +26 -0
  304. package/dist/client.rsc.d.ts.map +1 -0
  305. package/dist/client.rsc.js +46 -0
  306. package/dist/client.rsc.js.map +1 -0
  307. package/dist/component-utils.d.ts +36 -0
  308. package/dist/component-utils.d.ts.map +1 -0
  309. package/dist/component-utils.js +61 -0
  310. package/dist/component-utils.js.map +1 -0
  311. package/dist/components/DefaultDocument.d.ts +13 -0
  312. package/dist/components/DefaultDocument.d.ts.map +1 -0
  313. package/dist/components/DefaultDocument.js +15 -0
  314. package/dist/components/DefaultDocument.js.map +1 -0
  315. package/dist/debug.d.ts +58 -0
  316. package/dist/debug.d.ts.map +1 -0
  317. package/dist/debug.js +157 -0
  318. package/dist/debug.js.map +1 -0
  319. package/dist/default-error-boundary.d.ts +11 -0
  320. package/dist/default-error-boundary.d.ts.map +1 -0
  321. package/dist/default-error-boundary.js +45 -0
  322. package/dist/default-error-boundary.js.map +1 -0
  323. package/dist/deps/browser.d.ts +2 -0
  324. package/dist/deps/browser.d.ts.map +1 -0
  325. package/dist/deps/browser.js +3 -0
  326. package/dist/deps/browser.js.map +1 -0
  327. package/dist/deps/html-stream-client.d.ts +2 -0
  328. package/dist/deps/html-stream-client.d.ts.map +1 -0
  329. package/dist/deps/html-stream-client.js +3 -0
  330. package/dist/deps/html-stream-client.js.map +1 -0
  331. package/dist/deps/html-stream-server.d.ts +2 -0
  332. package/dist/deps/html-stream-server.d.ts.map +1 -0
  333. package/dist/deps/html-stream-server.js +3 -0
  334. package/dist/deps/html-stream-server.js.map +1 -0
  335. package/dist/deps/rsc.d.ts +2 -0
  336. package/dist/deps/rsc.d.ts.map +1 -0
  337. package/dist/deps/rsc.js +4 -0
  338. package/dist/deps/rsc.js.map +1 -0
  339. package/dist/deps/ssr.d.ts +2 -0
  340. package/dist/deps/ssr.d.ts.map +1 -0
  341. package/dist/deps/ssr.js +3 -0
  342. package/dist/deps/ssr.js.map +1 -0
  343. package/dist/errors.d.ts +174 -0
  344. package/dist/errors.d.ts.map +1 -0
  345. package/dist/errors.js +241 -0
  346. package/dist/errors.js.map +1 -0
  347. package/dist/handle.d.ts +78 -0
  348. package/dist/handle.d.ts.map +1 -0
  349. package/dist/handle.js +82 -0
  350. package/dist/handle.js.map +1 -0
  351. package/dist/handles/MetaTags.d.ts +14 -0
  352. package/dist/handles/MetaTags.d.ts.map +1 -0
  353. package/dist/handles/MetaTags.js +136 -0
  354. package/dist/handles/MetaTags.js.map +1 -0
  355. package/{src/handles/index.ts → dist/handles/index.d.ts} +1 -2
  356. package/dist/handles/index.d.ts.map +1 -0
  357. package/dist/handles/index.js +6 -0
  358. package/dist/handles/index.js.map +1 -0
  359. package/dist/handles/meta.d.ts +39 -0
  360. package/dist/handles/meta.d.ts.map +1 -0
  361. package/dist/handles/meta.js +202 -0
  362. package/dist/handles/meta.js.map +1 -0
  363. package/dist/host/__tests__/errors.test.d.ts +2 -0
  364. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  365. package/dist/host/__tests__/errors.test.js +76 -0
  366. package/dist/host/__tests__/errors.test.js.map +1 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  370. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  372. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  374. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  375. package/dist/host/__tests__/router.test.d.ts +2 -0
  376. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  377. package/dist/host/__tests__/router.test.js +241 -0
  378. package/dist/host/__tests__/router.test.js.map +1 -0
  379. package/dist/host/__tests__/testing.test.d.ts +2 -0
  380. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  381. package/dist/host/__tests__/testing.test.js +64 -0
  382. package/dist/host/__tests__/testing.test.js.map +1 -0
  383. package/dist/host/__tests__/utils.test.d.ts +2 -0
  384. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  385. package/dist/host/__tests__/utils.test.js +29 -0
  386. package/dist/host/__tests__/utils.test.js.map +1 -0
  387. package/dist/host/cookie-handler.d.ts +34 -0
  388. package/dist/host/cookie-handler.d.ts.map +1 -0
  389. package/dist/host/cookie-handler.js +124 -0
  390. package/dist/host/cookie-handler.js.map +1 -0
  391. package/dist/host/errors.d.ts +56 -0
  392. package/dist/host/errors.d.ts.map +1 -0
  393. package/dist/host/errors.js +79 -0
  394. package/dist/host/errors.js.map +1 -0
  395. package/dist/host/index.d.ts +29 -0
  396. package/dist/host/index.d.ts.map +1 -0
  397. package/dist/host/index.js +32 -0
  398. package/dist/host/index.js.map +1 -0
  399. package/dist/host/pattern-matcher.d.ts +36 -0
  400. package/dist/host/pattern-matcher.d.ts.map +1 -0
  401. package/dist/host/pattern-matcher.js +172 -0
  402. package/dist/host/pattern-matcher.js.map +1 -0
  403. package/dist/host/router.d.ts +26 -0
  404. package/dist/host/router.d.ts.map +1 -0
  405. package/dist/host/router.js +218 -0
  406. package/dist/host/router.js.map +1 -0
  407. package/dist/host/testing.d.ts +36 -0
  408. package/dist/host/testing.d.ts.map +1 -0
  409. package/dist/host/testing.js +55 -0
  410. package/dist/host/testing.js.map +1 -0
  411. package/dist/host/types.d.ts +115 -0
  412. package/dist/host/types.d.ts.map +1 -0
  413. package/dist/host/types.js +7 -0
  414. package/dist/host/types.js.map +1 -0
  415. package/dist/host/utils.d.ts +21 -0
  416. package/dist/host/utils.d.ts.map +1 -0
  417. package/dist/host/utils.js +23 -0
  418. package/dist/host/utils.js.map +1 -0
  419. package/dist/href-client.d.ts +131 -0
  420. package/dist/href-client.d.ts.map +1 -0
  421. package/dist/href-client.js +64 -0
  422. package/dist/href-client.js.map +1 -0
  423. package/dist/href-context.d.ts +29 -0
  424. package/dist/href-context.d.ts.map +1 -0
  425. package/dist/href-context.js +21 -0
  426. package/dist/href-context.js.map +1 -0
  427. package/dist/index.d.ts +73 -0
  428. package/dist/index.d.ts.map +1 -0
  429. package/dist/index.js +91 -0
  430. package/dist/index.js.map +1 -0
  431. package/dist/index.rsc.d.ts +32 -0
  432. package/dist/index.rsc.d.ts.map +1 -0
  433. package/dist/index.rsc.js +40 -0
  434. package/dist/index.rsc.js.map +1 -0
  435. package/dist/internal-debug.d.ts +2 -0
  436. package/dist/internal-debug.d.ts.map +1 -0
  437. package/dist/internal-debug.js +5 -0
  438. package/dist/internal-debug.js.map +1 -0
  439. package/dist/loader.d.ts +14 -0
  440. package/dist/loader.d.ts.map +1 -0
  441. package/dist/loader.js +20 -0
  442. package/dist/loader.js.map +1 -0
  443. package/dist/loader.rsc.d.ts +19 -0
  444. package/dist/loader.rsc.d.ts.map +1 -0
  445. package/dist/loader.rsc.js +99 -0
  446. package/dist/loader.rsc.js.map +1 -0
  447. package/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -10
  448. package/dist/network-error-thrower.d.ts.map +1 -0
  449. package/dist/network-error-thrower.js +14 -0
  450. package/dist/network-error-thrower.js.map +1 -0
  451. package/dist/outlet-context.d.ts +13 -0
  452. package/dist/outlet-context.d.ts.map +1 -0
  453. package/dist/outlet-context.js +3 -0
  454. package/dist/outlet-context.js.map +1 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  456. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  457. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  458. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  459. package/dist/prerender/param-hash.d.ts +16 -0
  460. package/dist/prerender/param-hash.d.ts.map +1 -0
  461. package/dist/prerender/param-hash.js +36 -0
  462. package/dist/prerender/param-hash.js.map +1 -0
  463. package/dist/prerender/store.d.ts +38 -0
  464. package/dist/prerender/store.d.ts.map +1 -0
  465. package/dist/prerender/store.js +61 -0
  466. package/dist/prerender/store.js.map +1 -0
  467. package/dist/prerender.d.ts +66 -0
  468. package/dist/prerender.d.ts.map +1 -0
  469. package/dist/prerender.js +57 -0
  470. package/dist/prerender.js.map +1 -0
  471. package/dist/reverse.d.ts +196 -0
  472. package/dist/reverse.d.ts.map +1 -0
  473. package/dist/reverse.js +78 -0
  474. package/dist/reverse.js.map +1 -0
  475. package/dist/root-error-boundary.d.ts +33 -0
  476. package/dist/root-error-boundary.d.ts.map +1 -0
  477. package/dist/root-error-boundary.js +165 -0
  478. package/dist/root-error-boundary.js.map +1 -0
  479. package/dist/route-content-wrapper.d.ts +46 -0
  480. package/dist/route-content-wrapper.d.ts.map +1 -0
  481. package/dist/route-content-wrapper.js +77 -0
  482. package/dist/route-content-wrapper.js.map +1 -0
  483. package/dist/route-definition.d.ts +421 -0
  484. package/dist/route-definition.d.ts.map +1 -0
  485. package/dist/route-definition.js +868 -0
  486. package/dist/route-definition.js.map +1 -0
  487. package/dist/route-map-builder.d.ts +155 -0
  488. package/dist/route-map-builder.d.ts.map +1 -0
  489. package/dist/route-map-builder.js +237 -0
  490. package/dist/route-map-builder.js.map +1 -0
  491. package/dist/route-types.d.ts +165 -0
  492. package/dist/route-types.d.ts.map +1 -0
  493. package/dist/route-types.js +7 -0
  494. package/dist/route-types.js.map +1 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  496. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  497. package/dist/router/__tests__/handler-context.test.js +65 -0
  498. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  502. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  503. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  504. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  505. package/dist/router/__tests__/match-context.test.js +92 -0
  506. package/dist/router/__tests__/match-context.test.js.map +1 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  508. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  509. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  510. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  511. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  512. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  513. package/dist/router/__tests__/match-result.test.js +457 -0
  514. package/dist/router/__tests__/match-result.test.js.map +1 -0
  515. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  516. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  517. package/dist/router/__tests__/on-error.test.js +678 -0
  518. package/dist/router/__tests__/on-error.test.js.map +1 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  520. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  521. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  522. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  526. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  527. package/dist/router/error-handling.d.ts +77 -0
  528. package/dist/router/error-handling.d.ts.map +1 -0
  529. package/dist/router/error-handling.js +202 -0
  530. package/dist/router/error-handling.js.map +1 -0
  531. package/dist/router/handler-context.d.ts +20 -0
  532. package/dist/router/handler-context.d.ts.map +1 -0
  533. package/dist/router/handler-context.js +198 -0
  534. package/dist/router/handler-context.js.map +1 -0
  535. package/dist/router/intercept-resolution.d.ts +66 -0
  536. package/dist/router/intercept-resolution.d.ts.map +1 -0
  537. package/dist/router/intercept-resolution.js +246 -0
  538. package/dist/router/intercept-resolution.js.map +1 -0
  539. package/dist/router/loader-resolution.d.ts +64 -0
  540. package/dist/router/loader-resolution.d.ts.map +1 -0
  541. package/dist/router/loader-resolution.js +284 -0
  542. package/dist/router/loader-resolution.js.map +1 -0
  543. package/dist/router/logging.d.ts +15 -0
  544. package/dist/router/logging.d.ts.map +1 -0
  545. package/dist/router/logging.js +99 -0
  546. package/dist/router/logging.js.map +1 -0
  547. package/dist/router/manifest.d.ts +22 -0
  548. package/dist/router/manifest.d.ts.map +1 -0
  549. package/dist/router/manifest.js +181 -0
  550. package/dist/router/manifest.js.map +1 -0
  551. package/dist/router/match-api.d.ts +35 -0
  552. package/dist/router/match-api.d.ts.map +1 -0
  553. package/dist/router/match-api.js +406 -0
  554. package/dist/router/match-api.js.map +1 -0
  555. package/dist/router/match-context.d.ts +206 -0
  556. package/dist/router/match-context.d.ts.map +1 -0
  557. package/dist/router/match-context.js +17 -0
  558. package/dist/router/match-context.js.map +1 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  560. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  561. package/dist/router/match-middleware/background-revalidation.js +75 -0
  562. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  564. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  565. package/dist/router/match-middleware/cache-lookup.js +257 -0
  566. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  567. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  568. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  569. package/dist/router/match-middleware/cache-store.js +108 -0
  570. package/dist/router/match-middleware/cache-store.js.map +1 -0
  571. package/dist/router/match-middleware/index.d.ts +81 -0
  572. package/dist/router/match-middleware/index.d.ts.map +1 -0
  573. package/dist/router/match-middleware/index.js +80 -0
  574. package/dist/router/match-middleware/index.js.map +1 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  576. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  577. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  578. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  580. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  581. package/dist/router/match-middleware/segment-resolution.js +53 -0
  582. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  583. package/dist/router/match-pipelines.d.ts +147 -0
  584. package/dist/router/match-pipelines.d.ts.map +1 -0
  585. package/dist/router/match-pipelines.js +82 -0
  586. package/dist/router/match-pipelines.js.map +1 -0
  587. package/dist/router/match-result.d.ts +126 -0
  588. package/dist/router/match-result.d.ts.map +1 -0
  589. package/dist/router/match-result.js +93 -0
  590. package/dist/router/match-result.js.map +1 -0
  591. package/dist/router/metrics.d.ts +20 -0
  592. package/dist/router/metrics.d.ts.map +1 -0
  593. package/dist/router/metrics.js +47 -0
  594. package/dist/router/metrics.js.map +1 -0
  595. package/dist/router/middleware.d.ts +249 -0
  596. package/dist/router/middleware.d.ts.map +1 -0
  597. package/dist/router/middleware.js +434 -0
  598. package/dist/router/middleware.js.map +1 -0
  599. package/dist/router/middleware.test.d.ts +2 -0
  600. package/dist/router/middleware.test.d.ts.map +1 -0
  601. package/dist/router/middleware.test.js +816 -0
  602. package/dist/router/middleware.test.js.map +1 -0
  603. package/dist/router/pattern-matching.d.ts +149 -0
  604. package/dist/router/pattern-matching.d.ts.map +1 -0
  605. package/dist/router/pattern-matching.js +349 -0
  606. package/dist/router/pattern-matching.js.map +1 -0
  607. package/dist/router/revalidation.d.ts +44 -0
  608. package/dist/router/revalidation.d.ts.map +1 -0
  609. package/dist/router/revalidation.js +147 -0
  610. package/dist/router/revalidation.js.map +1 -0
  611. package/dist/router/router-context.d.ts +135 -0
  612. package/dist/router/router-context.d.ts.map +1 -0
  613. package/dist/router/router-context.js +36 -0
  614. package/dist/router/router-context.js.map +1 -0
  615. package/dist/router/segment-resolution.d.ts +127 -0
  616. package/dist/router/segment-resolution.d.ts.map +1 -0
  617. package/dist/router/segment-resolution.js +919 -0
  618. package/dist/router/segment-resolution.js.map +1 -0
  619. package/dist/router/trie-matching.d.ts +40 -0
  620. package/dist/router/trie-matching.d.ts.map +1 -0
  621. package/dist/router/trie-matching.js +127 -0
  622. package/dist/router/trie-matching.js.map +1 -0
  623. package/dist/router/types.d.ts +136 -0
  624. package/dist/router/types.d.ts.map +1 -0
  625. package/dist/router/types.js +7 -0
  626. package/dist/router/types.js.map +1 -0
  627. package/dist/router.d.ts +753 -0
  628. package/dist/router.d.ts.map +1 -0
  629. package/dist/router.gen.d.ts +6 -0
  630. package/dist/router.gen.d.ts.map +1 -0
  631. package/dist/router.gen.js +6 -0
  632. package/dist/router.gen.js.map +1 -0
  633. package/dist/router.js +1304 -0
  634. package/dist/router.js.map +1 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  636. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  637. package/dist/rsc/__tests__/helpers.test.js +140 -0
  638. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  639. package/dist/rsc/handler.d.ts +45 -0
  640. package/dist/rsc/handler.d.ts.map +1 -0
  641. package/dist/rsc/handler.js +1172 -0
  642. package/dist/rsc/handler.js.map +1 -0
  643. package/dist/rsc/helpers.d.ts +16 -0
  644. package/dist/rsc/helpers.d.ts.map +1 -0
  645. package/dist/rsc/helpers.js +55 -0
  646. package/dist/rsc/helpers.js.map +1 -0
  647. package/dist/rsc/index.d.ts +22 -0
  648. package/dist/rsc/index.d.ts.map +1 -0
  649. package/dist/rsc/index.js +23 -0
  650. package/dist/rsc/index.js.map +1 -0
  651. package/dist/rsc/nonce.d.ts +9 -0
  652. package/dist/rsc/nonce.d.ts.map +1 -0
  653. package/dist/rsc/nonce.js +18 -0
  654. package/dist/rsc/nonce.js.map +1 -0
  655. package/dist/rsc/types.d.ts +206 -0
  656. package/dist/rsc/types.d.ts.map +1 -0
  657. package/dist/rsc/types.js +8 -0
  658. package/dist/rsc/types.js.map +1 -0
  659. package/dist/search-params.d.ts +103 -0
  660. package/dist/search-params.d.ts.map +1 -0
  661. package/dist/search-params.js +74 -0
  662. package/dist/search-params.js.map +1 -0
  663. package/dist/segment-system.d.ts +75 -0
  664. package/dist/segment-system.d.ts.map +1 -0
  665. package/dist/segment-system.js +336 -0
  666. package/dist/segment-system.js.map +1 -0
  667. package/dist/server/context.d.ts +245 -0
  668. package/dist/server/context.d.ts.map +1 -0
  669. package/dist/server/context.js +197 -0
  670. package/dist/server/context.js.map +1 -0
  671. package/dist/server/fetchable-loader-store.d.ts +18 -0
  672. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  673. package/dist/server/fetchable-loader-store.js +18 -0
  674. package/dist/server/fetchable-loader-store.js.map +1 -0
  675. package/dist/server/handle-store.d.ts +85 -0
  676. package/dist/server/handle-store.d.ts.map +1 -0
  677. package/dist/server/handle-store.js +142 -0
  678. package/dist/server/handle-store.js.map +1 -0
  679. package/dist/server/loader-registry.d.ts +55 -0
  680. package/dist/server/loader-registry.d.ts.map +1 -0
  681. package/dist/server/loader-registry.js +132 -0
  682. package/dist/server/loader-registry.js.map +1 -0
  683. package/dist/server/request-context.d.ts +226 -0
  684. package/dist/server/request-context.d.ts.map +1 -0
  685. package/dist/server/request-context.js +290 -0
  686. package/dist/server/request-context.js.map +1 -0
  687. package/dist/server/root-layout.d.ts +4 -0
  688. package/dist/server/root-layout.d.ts.map +1 -0
  689. package/dist/server/root-layout.js +5 -0
  690. package/dist/server/root-layout.js.map +1 -0
  691. package/dist/server.d.ts +15 -0
  692. package/dist/server.d.ts.map +1 -0
  693. package/dist/server.js +20 -0
  694. package/dist/server.js.map +1 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  698. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  699. package/dist/ssr/index.d.ts +98 -0
  700. package/dist/ssr/index.d.ts.map +1 -0
  701. package/dist/ssr/index.js +158 -0
  702. package/dist/ssr/index.js.map +1 -0
  703. package/dist/static-handler.d.ts +50 -0
  704. package/dist/static-handler.d.ts.map +1 -0
  705. package/dist/static-handler.gen.d.ts +5 -0
  706. package/dist/static-handler.gen.d.ts.map +1 -0
  707. package/dist/static-handler.gen.js +5 -0
  708. package/dist/static-handler.gen.js.map +1 -0
  709. package/dist/static-handler.js +29 -0
  710. package/dist/static-handler.js.map +1 -0
  711. package/dist/testing/vitest.js +82 -0
  712. package/dist/theme/ThemeProvider.d.ts +20 -0
  713. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  714. package/dist/theme/ThemeProvider.js +240 -0
  715. package/dist/theme/ThemeProvider.js.map +1 -0
  716. package/dist/theme/ThemeScript.d.ts +48 -0
  717. package/dist/theme/ThemeScript.d.ts.map +1 -0
  718. package/dist/theme/ThemeScript.js +13 -0
  719. package/dist/theme/ThemeScript.js.map +1 -0
  720. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  721. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  722. package/dist/theme/__tests__/theme.test.js +103 -0
  723. package/dist/theme/__tests__/theme.test.js.map +1 -0
  724. package/dist/theme/constants.d.ts +29 -0
  725. package/dist/theme/constants.d.ts.map +1 -0
  726. package/dist/theme/constants.js +48 -0
  727. package/dist/theme/constants.js.map +1 -0
  728. package/dist/theme/index.d.ts +31 -0
  729. package/dist/theme/index.d.ts.map +1 -0
  730. package/dist/theme/index.js +36 -0
  731. package/dist/theme/index.js.map +1 -0
  732. package/dist/theme/theme-context.d.ts +40 -0
  733. package/dist/theme/theme-context.d.ts.map +1 -0
  734. package/dist/theme/theme-context.js +60 -0
  735. package/dist/theme/theme-context.js.map +1 -0
  736. package/dist/theme/theme-script.d.ts +27 -0
  737. package/dist/theme/theme-script.d.ts.map +1 -0
  738. package/dist/theme/theme-script.js +147 -0
  739. package/dist/theme/theme-script.js.map +1 -0
  740. package/dist/theme/types.d.ts +163 -0
  741. package/dist/theme/types.d.ts.map +1 -0
  742. package/dist/theme/types.js +11 -0
  743. package/dist/theme/types.js.map +1 -0
  744. package/dist/theme/use-theme.d.ts +12 -0
  745. package/dist/theme/use-theme.d.ts.map +1 -0
  746. package/dist/theme/use-theme.js +40 -0
  747. package/dist/theme/use-theme.js.map +1 -0
  748. package/dist/types/__internal.d.ts +127 -0
  749. package/dist/types/bin/rango.d.ts +1 -0
  750. package/dist/types/browser/action-coordinator.d.ts +57 -0
  751. package/dist/types/browser/action-fence.d.ts +33 -0
  752. package/dist/types/browser/app-shell.d.ts +34 -0
  753. package/dist/types/browser/app-version.d.ts +6 -0
  754. package/dist/types/browser/connection-warmup.d.ts +31 -0
  755. package/dist/types/browser/cookie-name.d.ts +66 -0
  756. package/dist/types/browser/dev-discovery.d.ts +11 -0
  757. package/dist/types/browser/event-controller.d.ts +231 -0
  758. package/dist/types/browser/history-state.d.ts +26 -0
  759. package/dist/types/browser/index.d.ts +1 -0
  760. package/dist/types/browser/intercept-utils.d.ts +30 -0
  761. package/dist/types/browser/invalidate-client-cache.d.ts +17 -0
  762. package/dist/types/browser/link-interceptor.d.ts +53 -0
  763. package/dist/types/browser/logging.d.ts +33 -0
  764. package/dist/types/browser/merge-segment-loaders.d.ts +38 -0
  765. package/dist/types/browser/navigation-bridge.d.ts +39 -0
  766. package/dist/types/browser/navigation-client.d.ts +17 -0
  767. package/dist/types/browser/navigation-store-handle.d.ts +25 -0
  768. package/dist/types/browser/navigation-store.d.ts +85 -0
  769. package/dist/types/browser/navigation-transaction.d.ts +75 -0
  770. package/dist/types/browser/network-error-handler.d.ts +35 -0
  771. package/dist/types/browser/notify-listeners.d.ts +2 -0
  772. package/dist/types/browser/partial-update.d.ts +61 -0
  773. package/dist/types/browser/prefetch/cache.d.ts +224 -0
  774. package/dist/types/browser/prefetch/default-strategy.d.ts +31 -0
  775. package/dist/types/browser/prefetch/fetch.d.ts +52 -0
  776. package/dist/types/browser/prefetch/invalidation.d.ts +6 -0
  777. package/dist/types/browser/prefetch/loader.d.ts +12 -0
  778. package/dist/types/browser/prefetch/observer.d.ts +24 -0
  779. package/dist/types/browser/prefetch/policy.d.ts +13 -0
  780. package/dist/types/browser/prefetch/queue.d.ts +48 -0
  781. package/dist/types/browser/prefetch/resource-ready.d.ts +28 -0
  782. package/dist/types/browser/prefetch/runtime.d.ts +2 -0
  783. package/dist/types/browser/rango-state.d.ts +56 -0
  784. package/dist/types/browser/react/Link.d.ts +132 -0
  785. package/dist/types/browser/react/NavigationProvider.d.ts +88 -0
  786. package/dist/types/browser/react/ScrollRestoration.d.ts +78 -0
  787. package/dist/types/browser/react/context.d.ts +57 -0
  788. package/dist/types/browser/react/filter-segment-order.d.ts +35 -0
  789. package/dist/types/browser/react/index.d.ts +1 -0
  790. package/dist/types/browser/react/location-state-shared.d.ts +162 -0
  791. package/dist/types/browser/react/location-state.d.ts +29 -0
  792. package/dist/types/browser/react/mount-context.d.ts +23 -0
  793. package/dist/types/browser/react/nonce-context.d.ts +14 -0
  794. package/dist/types/browser/react/shallow-equal.d.ts +5 -0
  795. package/dist/types/browser/react/use-action.d.ts +61 -0
  796. package/dist/types/browser/react/use-handle.d.ts +21 -0
  797. package/dist/types/browser/react/use-href.d.ts +32 -0
  798. package/dist/types/browser/react/use-link-status.d.ts +36 -0
  799. package/dist/types/browser/react/use-mount.d.ts +24 -0
  800. package/dist/types/browser/react/use-navigation.d.ts +15 -0
  801. package/dist/types/browser/react/use-params.d.ts +21 -0
  802. package/dist/types/browser/react/use-pathname.d.ts +13 -0
  803. package/dist/types/browser/react/use-reverse.d.ts +40 -0
  804. package/dist/types/browser/react/use-router.d.ts +30 -0
  805. package/dist/types/browser/react/use-search-params.d.ts +66 -0
  806. package/dist/types/browser/react/use-segments.d.ts +29 -0
  807. package/dist/types/browser/response-adapter.d.ts +58 -0
  808. package/dist/types/browser/rsc-router.d.ts +146 -0
  809. package/dist/types/browser/scroll-restoration.d.ts +103 -0
  810. package/dist/types/browser/segment-reconciler.d.ts +74 -0
  811. package/dist/types/browser/segment-structure-assert.d.ts +16 -0
  812. package/dist/types/browser/server-action-bridge.d.ts +29 -0
  813. package/dist/types/browser/types.d.ts +546 -0
  814. package/dist/types/browser/validate-redirect-origin.d.ts +28 -0
  815. package/dist/types/build/collect-fallback-refs.d.ts +5 -0
  816. package/dist/types/build/generate-manifest.d.ts +106 -0
  817. package/dist/types/build/generate-route-types.d.ts +8 -0
  818. package/dist/types/build/index.d.ts +21 -0
  819. package/dist/types/build/merge-full-manifests.d.ts +3 -0
  820. package/dist/types/build/prefix-tree-utils.d.ts +56 -0
  821. package/dist/types/build/route-trie.d.ts +20 -0
  822. package/dist/types/build/route-types/ast-helpers.d.ts +3 -0
  823. package/dist/types/build/route-types/ast-route-extraction.d.ts +13 -0
  824. package/dist/types/build/route-types/codegen.d.ts +16 -0
  825. package/dist/types/build/route-types/include-resolution.d.ts +74 -0
  826. package/dist/types/build/route-types/param-extraction.d.ts +13 -0
  827. package/dist/types/build/route-types/per-module-writer.d.ts +20 -0
  828. package/dist/types/build/route-types/router-processing.d.ts +81 -0
  829. package/dist/types/build/route-types/scan-filter.d.ts +17 -0
  830. package/dist/types/build/route-types/source-scan.d.ts +13 -0
  831. package/dist/types/build/runtime-discovery.d.ts +24 -0
  832. package/dist/types/cache/background-task.d.ts +21 -0
  833. package/dist/types/cache/cache-error.d.ts +71 -0
  834. package/dist/types/cache/cache-exec-scope.d.ts +31 -0
  835. package/dist/types/cache/cache-key-utils.d.ts +43 -0
  836. package/dist/types/cache/cache-policy.d.ts +59 -0
  837. package/dist/types/cache/cache-runtime.d.ts +51 -0
  838. package/dist/types/cache/cache-scope.d.ts +215 -0
  839. package/dist/types/cache/cache-tag.d.ts +79 -0
  840. package/dist/types/cache/cf/cf-base64.d.ts +4 -0
  841. package/dist/types/cache/cf/cf-cache-constants.d.ts +112 -0
  842. package/dist/types/cache/cf/cf-cache-store.d.ts +630 -0
  843. package/dist/types/cache/cf/cf-cache-types.d.ts +365 -0
  844. package/dist/types/cache/cf/cf-kv-utils.d.ts +43 -0
  845. package/dist/types/cache/cf/cf-tag-marker-memo.d.ts +15 -0
  846. package/dist/types/cache/cf/cf-zone-purge.d.ts +31 -0
  847. package/dist/types/cache/cf/index.d.ts +4 -0
  848. package/dist/types/cache/document-cache.d.ts +71 -0
  849. package/dist/types/cache/handle-capture.d.ts +23 -0
  850. package/dist/types/cache/handle-snapshot.d.ts +39 -0
  851. package/dist/types/cache/index.d.ts +9 -0
  852. package/dist/types/cache/memory-segment-store.d.ts +163 -0
  853. package/dist/types/cache/profile-registry.d.ts +40 -0
  854. package/dist/types/cache/read-through-swr.d.ts +61 -0
  855. package/dist/types/cache/search-params-filter.d.ts +64 -0
  856. package/dist/types/cache/segment-codec.d.ts +78 -0
  857. package/dist/types/cache/shell-snapshot.d.ts +186 -0
  858. package/dist/types/cache/tag-invalidation.d.ts +74 -0
  859. package/dist/types/cache/taint.d.ts +77 -0
  860. package/dist/types/cache/types.d.ts +522 -0
  861. package/dist/types/cache/vercel/index.d.ts +1 -0
  862. package/dist/types/cache/vercel/vercel-cache-store.d.ts +268 -0
  863. package/dist/types/client-urls/client-root.d.ts +38 -0
  864. package/dist/types/client-urls/client-urls.d.ts +5 -0
  865. package/dist/types/client-urls/navigation.d.ts +38 -0
  866. package/dist/types/client-urls/revalidation-protocol.d.ts +25 -0
  867. package/dist/types/client-urls/server-projection.d.ts +71 -0
  868. package/dist/types/client-urls/types.d.ts +148 -0
  869. package/dist/types/client.d.ts +192 -0
  870. package/dist/types/client.rsc.d.ts +42 -0
  871. package/dist/types/cloudflare/index.d.ts +7 -0
  872. package/dist/types/cloudflare/tracing.d.ts +57 -0
  873. package/dist/types/component-utils.d.ts +46 -0
  874. package/dist/types/components/DefaultDocument.d.ts +13 -0
  875. package/dist/types/context-var.d.ts +84 -0
  876. package/dist/types/debug.d.ts +57 -0
  877. package/dist/types/decode-loader-results.d.ts +42 -0
  878. package/dist/types/default-error-boundary.d.ts +10 -0
  879. package/dist/types/defer.d.ts +89 -0
  880. package/dist/types/deps/browser.d.ts +1 -0
  881. package/dist/types/deps/html-stream-client.d.ts +1 -0
  882. package/dist/types/deps/html-stream-server.d.ts +1 -0
  883. package/dist/types/deps/rsc.d.ts +1 -0
  884. package/dist/types/deps/ssr.d.ts +1 -0
  885. package/dist/types/dev-discovery-protocol.d.ts +5 -0
  886. package/dist/types/encode-kv.d.ts +35 -0
  887. package/dist/types/errors.d.ts +227 -0
  888. package/dist/types/escape-script.d.ts +44 -0
  889. package/dist/types/handle.d.ts +93 -0
  890. package/dist/types/handles/MetaTags.d.ts +17 -0
  891. package/dist/types/handles/Scripts.d.ts +38 -0
  892. package/dist/types/handles/breadcrumbs.d.ts +43 -0
  893. package/dist/types/handles/deferred-resolution.d.ts +53 -0
  894. package/dist/types/handles/is-thenable.d.ts +10 -0
  895. package/dist/types/handles/meta.d.ts +43 -0
  896. package/dist/types/handles/script.d.ts +139 -0
  897. package/dist/types/host/cookie-handler.d.ts +8 -0
  898. package/dist/types/host/errors.d.ts +40 -0
  899. package/dist/types/host/index.d.ts +33 -0
  900. package/dist/types/host/pattern-matcher.d.ts +30 -0
  901. package/dist/types/host/router.d.ts +12 -0
  902. package/dist/types/host/testing.d.ts +41 -0
  903. package/dist/types/host/types.d.ts +148 -0
  904. package/dist/types/host/utils.d.ts +20 -0
  905. package/dist/types/href-client.d.ts +214 -0
  906. package/dist/types/index.d.ts +113 -0
  907. package/dist/types/index.rsc.d.ts +52 -0
  908. package/dist/types/internal-debug.d.ts +1 -0
  909. package/dist/types/loader-redirect.d.ts +27 -0
  910. package/dist/types/loader-store.d.ts +193 -0
  911. package/dist/types/loader.d.ts +18 -0
  912. package/dist/types/loader.rsc.d.ts +18 -0
  913. package/dist/types/missing-id-error.d.ts +1 -0
  914. package/dist/types/outlet-context.d.ts +32 -0
  915. package/dist/types/outlet-provider.d.ts +15 -0
  916. package/dist/types/prerender/build-shell-capture.d.ts +104 -0
  917. package/dist/types/prerender/param-hash.d.ts +6 -0
  918. package/dist/types/prerender/shell-manifest-key.d.ts +18 -0
  919. package/dist/types/prerender/store.d.ts +63 -0
  920. package/dist/types/prerender.d.ts +292 -0
  921. package/dist/types/redirect-origin.d.ts +71 -0
  922. package/dist/types/regex-escape.d.ts +6 -0
  923. package/dist/types/render-error-thrower.d.ts +13 -0
  924. package/dist/types/response-utils.d.ts +35 -0
  925. package/dist/types/reverse.d.ts +206 -0
  926. package/dist/types/root-error-boundary.d.ts +32 -0
  927. package/dist/types/route-content-wrapper.d.ts +84 -0
  928. package/dist/types/route-definition/dsl-helpers.d.ts +130 -0
  929. package/dist/types/route-definition/helper-factories.d.ts +22 -0
  930. package/dist/types/route-definition/helpers-types.d.ts +405 -0
  931. package/dist/types/route-definition/index.d.ts +7 -0
  932. package/dist/types/route-definition/redirect.d.ts +48 -0
  933. package/dist/types/route-definition/resolve-handler-use.d.ts +19 -0
  934. package/dist/types/route-definition/use-item-types.d.ts +1 -0
  935. package/dist/types/route-definition.d.ts +1 -0
  936. package/dist/types/route-map-builder.d.ts +102 -0
  937. package/dist/types/route-name.d.ts +27 -0
  938. package/dist/types/route-types.d.ts +172 -0
  939. package/dist/types/router/basename.d.ts +10 -0
  940. package/dist/types/router/content-negotiation.d.ts +91 -0
  941. package/dist/types/router/debug-manifest.d.ts +7 -0
  942. package/dist/types/router/error-handling.d.ts +110 -0
  943. package/dist/types/router/find-match.d.ts +19 -0
  944. package/dist/types/router/handler-context.d.ts +41 -0
  945. package/dist/types/router/instrument.d.ts +191 -0
  946. package/dist/types/router/intercept-resolution.d.ts +91 -0
  947. package/dist/types/router/lazy-includes.d.ts +26 -0
  948. package/dist/types/router/loader-resolution.d.ts +85 -0
  949. package/dist/types/router/logging.d.ts +41 -0
  950. package/dist/types/router/manifest.d.ts +8 -0
  951. package/dist/types/router/match-api.d.ts +19 -0
  952. package/dist/types/router/match-context.d.ts +184 -0
  953. package/dist/types/router/match-handlers.d.ts +48 -0
  954. package/dist/types/router/match-middleware/background-revalidation.d.ts +113 -0
  955. package/dist/types/router/match-middleware/cache-lookup.d.ts +126 -0
  956. package/dist/types/router/match-middleware/cache-store.d.ts +112 -0
  957. package/dist/types/router/match-middleware/index.d.ts +80 -0
  958. package/dist/types/router/match-middleware/intercept-resolution.d.ts +116 -0
  959. package/dist/types/router/match-middleware/segment-resolution.d.ts +94 -0
  960. package/dist/types/router/match-pipelines.d.ts +103 -0
  961. package/dist/types/router/match-result.d.ts +114 -0
  962. package/dist/types/router/metrics.d.ts +6 -0
  963. package/dist/types/router/middleware-types.d.ts +74 -0
  964. package/dist/types/router/middleware.d.ts +116 -0
  965. package/dist/types/router/navigation-snapshot.d.ts +51 -0
  966. package/dist/types/router/params-util.d.ts +8 -0
  967. package/dist/types/router/parse-pattern.d.ts +38 -0
  968. package/dist/types/router/pattern-matching.d.ts +169 -0
  969. package/dist/types/router/prefetch-cache-ttl.d.ts +27 -0
  970. package/dist/types/router/prefetch-default.d.ts +28 -0
  971. package/dist/types/router/prefetch-limits.d.ts +20 -0
  972. package/dist/types/router/prerender-match.d.ts +53 -0
  973. package/dist/types/router/preview-match.d.ts +22 -0
  974. package/dist/types/router/request-classification.d.ts +104 -0
  975. package/dist/types/router/revalidation.d.ts +64 -0
  976. package/dist/types/router/route-snapshot.d.ts +112 -0
  977. package/dist/types/router/route-trie-builder.d.ts +77 -0
  978. package/dist/types/router/router-context.d.ts +137 -0
  979. package/dist/types/router/router-interfaces.d.ts +461 -0
  980. package/dist/types/router/router-options.d.ts +792 -0
  981. package/dist/types/router/router-registry.d.ts +15 -0
  982. package/dist/types/router/segment-resolution/fresh.d.ts +55 -0
  983. package/dist/types/router/segment-resolution/helpers.d.ts +93 -0
  984. package/dist/types/router/segment-resolution/loader-cache.d.ts +33 -0
  985. package/dist/types/router/segment-resolution/loader-mask.d.ts +44 -0
  986. package/dist/types/router/segment-resolution/loader-snapshot.d.ts +90 -0
  987. package/dist/types/router/segment-resolution/mask-nested.d.ts +53 -0
  988. package/dist/types/router/segment-resolution/revalidation.d.ts +85 -0
  989. package/dist/types/router/segment-resolution/static-store.d.ts +17 -0
  990. package/dist/types/router/segment-resolution/streamed-handler-telemetry.d.ts +16 -0
  991. package/dist/types/router/segment-resolution/view-transition-default.d.ts +27 -0
  992. package/dist/types/router/segment-resolution.d.ts +3 -0
  993. package/dist/types/router/segment-wrappers.d.ts +53 -0
  994. package/dist/types/router/state-cookie-name.d.ts +1 -0
  995. package/dist/types/router/substitute-pattern-params.d.ts +23 -0
  996. package/dist/types/router/telemetry-otel.d.ts +113 -0
  997. package/dist/types/router/telemetry.d.ts +216 -0
  998. package/dist/types/router/timeout.d.ts +107 -0
  999. package/dist/types/router/tracing.d.ts +139 -0
  1000. package/dist/types/router/transition-when.d.ts +13 -0
  1001. package/dist/types/router/trie-matching.d.ts +32 -0
  1002. package/dist/types/router/types.d.ts +98 -0
  1003. package/dist/types/router/url-params.d.ts +26 -0
  1004. package/dist/types/router.d.ts +7 -0
  1005. package/dist/types/rsc/capture-queue.d.ts +49 -0
  1006. package/dist/types/rsc/full-payload.d.ts +22 -0
  1007. package/dist/types/rsc/handler-context.d.ts +32 -0
  1008. package/dist/types/rsc/handler.d.ts +9 -0
  1009. package/dist/types/rsc/helpers.d.ts +127 -0
  1010. package/dist/types/rsc/index.d.ts +17 -0
  1011. package/dist/types/rsc/json-route-result.d.ts +20 -0
  1012. package/dist/types/rsc/loader-fetch.d.ts +14 -0
  1013. package/dist/types/rsc/manifest-init.d.ts +18 -0
  1014. package/dist/types/rsc/nonce.d.ts +38 -0
  1015. package/dist/types/rsc/origin-guard.d.ts +50 -0
  1016. package/dist/types/rsc/progressive-enhancement.d.ts +19 -0
  1017. package/dist/types/rsc/redirect-guard.d.ts +37 -0
  1018. package/dist/types/rsc/render-pipeline.d.ts +148 -0
  1019. package/dist/types/rsc/response-cache-serve.d.ts +46 -0
  1020. package/dist/types/rsc/response-error.d.ts +19 -0
  1021. package/dist/types/rsc/response-route-handler.d.ts +29 -0
  1022. package/dist/types/rsc/routine-plan.d.ts +124 -0
  1023. package/dist/types/rsc/rsc-rendering.d.ts +18 -0
  1024. package/dist/types/rsc/runtime-warnings.d.ts +22 -0
  1025. package/dist/types/rsc/server-action.d.ts +68 -0
  1026. package/dist/types/rsc/shell-build-manifest.d.ts +90 -0
  1027. package/dist/types/rsc/shell-capture-constants.d.ts +44 -0
  1028. package/dist/types/rsc/shell-capture.d.ts +425 -0
  1029. package/dist/types/rsc/shell-serve.d.ts +200 -0
  1030. package/dist/types/rsc/ssr-setup.d.ts +73 -0
  1031. package/dist/types/rsc/stream-idle.d.ts +60 -0
  1032. package/dist/types/rsc/transition-gate.d.ts +23 -0
  1033. package/dist/types/rsc/types.d.ts +353 -0
  1034. package/dist/types/runtime-env.d.ts +1 -0
  1035. package/dist/types/search-params.d.ts +125 -0
  1036. package/dist/types/segment-content-promise.d.ts +13 -0
  1037. package/dist/types/segment-fragments.d.ts +79 -0
  1038. package/dist/types/segment-loader-promise.d.ts +22 -0
  1039. package/dist/types/segment-system.d.ts +86 -0
  1040. package/dist/types/serialize.d.ts +164 -0
  1041. package/dist/types/server/context.d.ts +520 -0
  1042. package/dist/types/server/cookie-parse.d.ts +10 -0
  1043. package/dist/types/server/cookie-store.d.ts +107 -0
  1044. package/dist/types/server/fetchable-loader-store.d.ts +20 -0
  1045. package/dist/types/server/handle-store.d.ts +131 -0
  1046. package/dist/types/server/loader-registry.d.ts +32 -0
  1047. package/dist/types/server/request-context.d.ts +717 -0
  1048. package/dist/types/server/root-layout.d.ts +3 -0
  1049. package/dist/types/server.d.ts +16 -0
  1050. package/dist/types/ssr/index.d.ts +271 -0
  1051. package/dist/types/ssr/inject-rsc-eager.d.ts +3 -0
  1052. package/dist/types/ssr/preinit-client-references.d.ts +71 -0
  1053. package/dist/types/ssr/ssr-root.d.ts +84 -0
  1054. package/dist/types/ssr-suspension-warning.d.ts +19 -0
  1055. package/dist/types/static-handler.d.ts +71 -0
  1056. package/dist/types/testing/cache-status.d.ts +63 -0
  1057. package/dist/types/testing/collect-handle.d.ts +20 -0
  1058. package/dist/types/testing/dispatch.d.ts +127 -0
  1059. package/dist/types/testing/dom.entry.d.ts +15 -0
  1060. package/dist/types/testing/e2e/fixture.d.ts +37 -0
  1061. package/dist/types/testing/e2e/index.d.ts +31 -0
  1062. package/dist/types/testing/e2e/matchers.d.ts +17 -0
  1063. package/dist/types/testing/e2e/page-helpers.d.ts +86 -0
  1064. package/dist/types/testing/e2e/parity.d.ts +111 -0
  1065. package/dist/types/testing/e2e/server.d.ts +35 -0
  1066. package/dist/types/testing/flight-matchers.d.ts +55 -0
  1067. package/dist/types/testing/flight-normalize.d.ts +1 -0
  1068. package/dist/types/testing/flight-tree.d.ts +192 -0
  1069. package/dist/types/testing/flight.d.ts +115 -0
  1070. package/dist/types/testing/flight.entry.d.ts +27 -0
  1071. package/dist/types/testing/generated-routes.d.ts +66 -0
  1072. package/dist/types/testing/index.d.ts +54 -0
  1073. package/dist/types/testing/internal/context.d.ts +225 -0
  1074. package/dist/types/testing/internal/flight-client-globals.d.ts +1 -0
  1075. package/dist/types/testing/internal/seed-vars.d.ts +30 -0
  1076. package/dist/types/testing/render-handler.d.ts +160 -0
  1077. package/dist/types/testing/render-route.d.ts +265 -0
  1078. package/dist/types/testing/run-loader.d.ts +195 -0
  1079. package/dist/types/testing/run-middleware.d.ts +132 -0
  1080. package/dist/types/testing/run-transition-when.d.ts +78 -0
  1081. package/dist/types/testing/shell-status.d.ts +81 -0
  1082. package/dist/types/testing/vitest-stubs/cloudflare-email.d.ts +6 -0
  1083. package/dist/types/testing/vitest-stubs/cloudflare-workers.d.ts +13 -0
  1084. package/dist/types/testing/vitest-stubs/plugin-rsc.d.ts +7 -0
  1085. package/dist/types/testing/vitest-stubs/version.d.ts +1 -0
  1086. package/dist/types/testing/vitest.d.ts +205 -0
  1087. package/dist/types/theme/ThemeProvider.d.ts +13 -0
  1088. package/dist/types/theme/ThemeScript.d.ts +45 -0
  1089. package/dist/types/theme/constants.d.ts +39 -0
  1090. package/dist/types/theme/index.d.ts +29 -0
  1091. package/dist/types/theme/theme-context.d.ts +21 -0
  1092. package/dist/types/theme/theme-script.d.ts +26 -0
  1093. package/dist/types/theme/types.d.ts +162 -0
  1094. package/dist/types/theme/use-theme.d.ts +8 -0
  1095. package/dist/types/types/boundaries.d.ts +115 -0
  1096. package/dist/types/types/cache-types.d.ts +191 -0
  1097. package/dist/types/types/error-types.d.ts +114 -0
  1098. package/dist/types/types/global-namespace.d.ts +90 -0
  1099. package/dist/types/types/handler-context.d.ts +658 -0
  1100. package/dist/types/types/index.d.ts +11 -0
  1101. package/dist/types/types/loader-types.d.ts +240 -0
  1102. package/dist/types/types/request-scope.d.ts +93 -0
  1103. package/dist/types/types/route-config.d.ts +105 -0
  1104. package/dist/types/types/route-entry.d.ts +98 -0
  1105. package/dist/types/types/segments.d.ts +254 -0
  1106. package/dist/types/types.d.ts +1 -0
  1107. package/dist/types/urls/include-helper.d.ts +17 -0
  1108. package/dist/types/urls/include-provider.d.ts +27 -0
  1109. package/dist/types/urls/index.d.ts +6 -0
  1110. package/dist/types/urls/path-helper-types.d.ts +207 -0
  1111. package/dist/types/urls/path-helper.d.ts +12 -0
  1112. package/dist/types/urls/pattern-types.d.ts +166 -0
  1113. package/dist/types/urls/response-types.d.ts +67 -0
  1114. package/dist/types/urls/type-extraction.d.ts +157 -0
  1115. package/dist/types/urls/urls-function.d.ts +24 -0
  1116. package/dist/types/urls.d.ts +1 -0
  1117. package/dist/types/use-loader.d.ts +150 -0
  1118. package/dist/types/vercel/index.d.ts +10 -0
  1119. package/dist/types/vercel/tracing.d.ts +71 -0
  1120. package/dist/types/vite/debug.d.ts +80 -0
  1121. package/dist/types/vite/discovery/bundle-postprocess.d.ts +12 -0
  1122. package/dist/types/vite/discovery/client-urls-projection.d.ts +53 -0
  1123. package/dist/types/vite/discovery/dev-prerender-cache.d.ts +65 -0
  1124. package/dist/types/vite/discovery/discover-routers.d.ts +17 -0
  1125. package/dist/types/vite/discovery/discovery-errors.d.ts +113 -0
  1126. package/dist/types/vite/discovery/gate-state.d.ts +79 -0
  1127. package/dist/types/vite/discovery/prerender-collection.d.ts +24 -0
  1128. package/dist/types/vite/discovery/route-types-writer.d.ts +32 -0
  1129. package/dist/types/vite/discovery/self-gen-tracking.d.ts +22 -0
  1130. package/dist/types/vite/discovery/shell-prerender-phase.d.ts +40 -0
  1131. package/dist/types/vite/discovery/state.d.ts +170 -0
  1132. package/dist/types/vite/discovery/virtual-module-codegen.d.ts +15 -0
  1133. package/dist/types/vite/encryption-key.d.ts +2 -0
  1134. package/dist/types/vite/index.d.ts +11 -0
  1135. package/dist/types/vite/inject-client-debug.d.ts +56 -0
  1136. package/dist/types/vite/plugin-types.d.ts +298 -0
  1137. package/dist/types/vite/plugins/cjs-to-esm.d.ts +6 -0
  1138. package/dist/types/vite/plugins/client-ref-dedup.d.ts +29 -0
  1139. package/dist/types/vite/plugins/client-ref-hashing.d.ts +35 -0
  1140. package/dist/types/vite/plugins/cloudflare-protocol-stub.d.ts +64 -0
  1141. package/dist/types/vite/plugins/expose-action-id.d.ts +18 -0
  1142. package/dist/types/vite/plugins/expose-id-utils.d.ts +37 -0
  1143. package/dist/types/vite/plugins/expose-ids/export-analysis.d.ts +19 -0
  1144. package/dist/types/vite/plugins/expose-ids/handler-transform.d.ts +10 -0
  1145. package/dist/types/vite/plugins/expose-ids/loader-transform.d.ts +8 -0
  1146. package/dist/types/vite/plugins/expose-ids/router-transform.d.ts +13 -0
  1147. package/dist/types/vite/plugins/expose-ids/types.d.ts +29 -0
  1148. package/dist/types/vite/plugins/expose-internal-ids.d.ts +16 -0
  1149. package/dist/types/vite/plugins/performance-tracks.d.ts +25 -0
  1150. package/dist/types/vite/plugins/refresh-cmd.d.ts +20 -0
  1151. package/dist/types/vite/plugins/server-ref-hashing.d.ts +24 -0
  1152. package/dist/types/vite/plugins/server-reference-pattern.d.ts +1 -0
  1153. package/dist/types/vite/plugins/use-cache-transform.d.ts +20 -0
  1154. package/dist/types/vite/plugins/vercel-output.d.ts +85 -0
  1155. package/dist/types/vite/plugins/version-injector.d.ts +21 -0
  1156. package/dist/types/vite/plugins/version-plugin.d.ts +19 -0
  1157. package/dist/types/vite/plugins/virtual-entries.d.ts +36 -0
  1158. package/dist/types/vite/plugins/virtual-stub-plugin.d.ts +7 -0
  1159. package/dist/types/vite/rango.d.ts +29 -0
  1160. package/dist/types/vite/router-discovery.d.ts +23 -0
  1161. package/dist/types/vite/utils/ast-handler-extract.d.ts +64 -0
  1162. package/dist/types/vite/utils/banner.d.ts +2 -0
  1163. package/dist/types/vite/utils/bundle-analysis.d.ts +28 -0
  1164. package/dist/types/vite/utils/client-chunks.d.ts +55 -0
  1165. package/dist/types/vite/utils/directive-prologue.d.ts +16 -0
  1166. package/dist/types/vite/utils/forward-user-plugins.d.ts +37 -0
  1167. package/dist/types/vite/utils/manifest-utils.d.ts +7 -0
  1168. package/dist/types/vite/utils/package-resolution.d.ts +6 -0
  1169. package/dist/types/vite/utils/prerender-utils.d.ts +32 -0
  1170. package/dist/types/vite/utils/shared-utils.d.ts +67 -0
  1171. package/dist/types.d.ts +1479 -0
  1172. package/dist/types.d.ts.map +1 -0
  1173. package/dist/types.js +10 -0
  1174. package/dist/types.js.map +1 -0
  1175. package/dist/urls.d.ts +441 -0
  1176. package/dist/urls.d.ts.map +1 -0
  1177. package/dist/urls.gen.d.ts +8 -0
  1178. package/dist/urls.gen.d.ts.map +1 -0
  1179. package/dist/urls.gen.js +8 -0
  1180. package/dist/urls.gen.js.map +1 -0
  1181. package/dist/urls.js +443 -0
  1182. package/dist/urls.js.map +1 -0
  1183. package/dist/use-loader.d.ts +127 -0
  1184. package/dist/use-loader.d.ts.map +1 -0
  1185. package/dist/use-loader.js +237 -0
  1186. package/dist/use-loader.js.map +1 -0
  1187. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  1188. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  1189. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  1190. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  1191. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  1192. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  1193. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  1194. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  1195. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  1196. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  1197. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  1198. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  1199. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  1200. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  1201. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  1202. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  1203. package/dist/vite/ast-handler-extract.d.ts +49 -0
  1204. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  1205. package/dist/vite/ast-handler-extract.js +249 -0
  1206. package/dist/vite/ast-handler-extract.js.map +1 -0
  1207. package/dist/vite/expose-action-id.d.ts +19 -0
  1208. package/dist/vite/expose-action-id.d.ts.map +1 -0
  1209. package/dist/vite/expose-action-id.js +250 -0
  1210. package/dist/vite/expose-action-id.js.map +1 -0
  1211. package/dist/vite/expose-id-utils.d.ts +69 -0
  1212. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  1213. package/dist/vite/expose-id-utils.js +289 -0
  1214. package/dist/vite/expose-id-utils.js.map +1 -0
  1215. package/dist/vite/expose-internal-ids.d.ts +22 -0
  1216. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  1217. package/dist/vite/expose-internal-ids.js +886 -0
  1218. package/dist/vite/expose-internal-ids.js.map +1 -0
  1219. package/dist/vite/index.d.ts +149 -0
  1220. package/dist/vite/index.d.ts.map +1 -0
  1221. package/dist/vite/index.js +10793 -4122
  1222. package/dist/vite/index.js.bak +5448 -0
  1223. package/dist/vite/index.js.map +1 -0
  1224. package/dist/vite/index.named-routes.gen.ts +103 -0
  1225. package/dist/vite/package-resolution.d.ts +43 -0
  1226. package/dist/vite/package-resolution.d.ts.map +1 -0
  1227. package/dist/vite/package-resolution.js +112 -0
  1228. package/dist/vite/package-resolution.js.map +1 -0
  1229. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1230. package/dist/vite/virtual-entries.d.ts +25 -0
  1231. package/dist/vite/virtual-entries.d.ts.map +1 -0
  1232. package/dist/vite/virtual-entries.js +110 -0
  1233. package/dist/vite/virtual-entries.js.map +1 -0
  1234. package/package.json +121 -38
  1235. package/skills/api-client/SKILL.md +211 -0
  1236. package/skills/breadcrumbs/SKILL.md +117 -8
  1237. package/skills/bundle-analysis/SKILL.md +159 -0
  1238. package/skills/cache-guide/SKILL.md +232 -34
  1239. package/skills/caching/SKILL.md +375 -19
  1240. package/skills/catalog.json +289 -0
  1241. package/skills/client-urls/SKILL.md +339 -0
  1242. package/skills/cloudflare/SKILL.md +153 -0
  1243. package/skills/cloudflare/agents/openai.yaml +4 -0
  1244. package/skills/cloudflare/references/d1-and-local-dev.md +131 -0
  1245. package/skills/cloudflare/references/streaming-and-deploy.md +107 -0
  1246. package/skills/cloudflare/references/webhooks-and-crypto.md +147 -0
  1247. package/skills/comparison/SKILL.md +50 -0
  1248. package/skills/comparison/agents/openai.yaml +4 -0
  1249. package/skills/comparison/references/framework-comparison.md +858 -0
  1250. package/skills/composability/SKILL.md +124 -4
  1251. package/skills/css/SKILL.md +76 -0
  1252. package/skills/debug-manifest/SKILL.md +5 -11
  1253. package/skills/defer-hydration/SKILL.md +235 -0
  1254. package/skills/deployment-caching/SKILL.md +176 -0
  1255. package/skills/document-cache/SKILL.md +116 -58
  1256. package/skills/fonts/SKILL.md +1 -1
  1257. package/skills/handler-use/SKILL.md +12 -10
  1258. package/skills/hooks/SKILL.md +73 -691
  1259. package/skills/hooks/data.md +282 -0
  1260. package/skills/hooks/handle-and-actions.md +110 -0
  1261. package/skills/hooks/navigation.md +110 -0
  1262. package/skills/hooks/outlets.md +62 -0
  1263. package/skills/hooks/state.md +228 -0
  1264. package/skills/hooks/urls.md +172 -0
  1265. package/skills/host-router/SKILL.md +129 -27
  1266. package/skills/i18n/SKILL.md +276 -0
  1267. package/skills/intercept/SKILL.md +75 -19
  1268. package/skills/layout/SKILL.md +40 -19
  1269. package/skills/links/SKILL.md +283 -17
  1270. package/skills/loader/SKILL.md +362 -11
  1271. package/skills/middleware/SKILL.md +58 -13
  1272. package/skills/migrate-nextjs/SKILL.md +336 -42
  1273. package/skills/migrate-nextjs/backend-host-swap.md +120 -0
  1274. package/skills/migrate-react-router/SKILL.md +95 -670
  1275. package/skills/migrate-react-router/component-migration.md +201 -0
  1276. package/skills/migrate-react-router/data-and-actions.md +236 -0
  1277. package/skills/migrate-react-router/route-mapping.md +284 -0
  1278. package/skills/mime-routes/SKILL.md +55 -18
  1279. package/skills/observability/SKILL.md +231 -0
  1280. package/skills/parallel/SKILL.md +72 -11
  1281. package/skills/ppr/SKILL.md +918 -0
  1282. package/skills/prerender/SKILL.md +137 -71
  1283. package/skills/rango/SKILL.md +325 -26
  1284. package/skills/react-compiler/SKILL.md +168 -0
  1285. package/skills/response-routes/SKILL.md +180 -52
  1286. package/skills/route/SKILL.md +126 -9
  1287. package/skills/router-setup/SKILL.md +69 -11
  1288. package/skills/scripts/SKILL.md +189 -0
  1289. package/skills/server-actions/SKILL.md +776 -0
  1290. package/skills/shell-manifest/SKILL.md +194 -0
  1291. package/skills/streams-and-websockets/SKILL.md +283 -0
  1292. package/skills/tailwind/SKILL.md +28 -4
  1293. package/skills/testing/SKILL.md +131 -0
  1294. package/skills/testing/bindings.md +103 -0
  1295. package/skills/testing/cache-prerender.md +172 -0
  1296. package/skills/testing/client-components.md +131 -0
  1297. package/skills/testing/e2e-parity.md +125 -0
  1298. package/skills/testing/flight.md +91 -0
  1299. package/skills/testing/handles.md +153 -0
  1300. package/skills/testing/loader.md +130 -0
  1301. package/skills/testing/middleware.md +99 -0
  1302. package/skills/testing/render-handler.md +122 -0
  1303. package/skills/testing/response-routes.md +95 -0
  1304. package/skills/testing/reverse-and-types.md +85 -0
  1305. package/skills/testing/server-actions.md +107 -0
  1306. package/skills/testing/server-tree.md +128 -0
  1307. package/skills/testing/setup.md +123 -0
  1308. package/skills/theme/SKILL.md +9 -6
  1309. package/skills/typesafety/SKILL.md +45 -626
  1310. package/skills/typesafety/env-and-bindings.md +254 -0
  1311. package/skills/typesafety/generated-files-and-cli.md +342 -0
  1312. package/skills/typesafety/params-and-search.md +153 -0
  1313. package/skills/typesafety/route-types.md +213 -0
  1314. package/skills/use-cache/SKILL.md +121 -15
  1315. package/skills/vercel/SKILL.md +149 -0
  1316. package/skills/view-transitions/SKILL.md +341 -0
  1317. package/src/__augment-tests__/augment.ts +81 -0
  1318. package/src/__augment-tests__/augmented.check.ts +116 -0
  1319. package/src/__internal.ts +0 -65
  1320. package/src/bin/rango.ts +7 -3
  1321. package/src/browser/action-coordinator.ts +53 -36
  1322. package/src/browser/action-fence.ts +47 -0
  1323. package/src/browser/app-shell.ts +39 -0
  1324. package/src/browser/connection-warmup.ts +134 -0
  1325. package/src/browser/cookie-name.ts +140 -0
  1326. package/src/browser/dev-discovery.ts +66 -0
  1327. package/src/browser/event-controller.ts +400 -168
  1328. package/src/browser/history-state.ts +21 -0
  1329. package/src/browser/index.ts +3 -3
  1330. package/src/browser/invalidate-client-cache.ts +52 -0
  1331. package/src/browser/link-interceptor.ts +469 -20
  1332. package/src/browser/logging.ts +28 -0
  1333. package/src/browser/merge-segment-loaders.ts +6 -4
  1334. package/src/browser/navigation-bridge.ts +171 -27
  1335. package/src/browser/navigation-client.ts +216 -90
  1336. package/src/browser/navigation-store-handle.ts +38 -0
  1337. package/src/browser/navigation-store.ts +167 -323
  1338. package/src/browser/navigation-transaction.ts +9 -59
  1339. package/src/browser/network-error-handler.ts +34 -7
  1340. package/src/browser/notify-listeners.ts +22 -0
  1341. package/src/browser/partial-update.ts +243 -144
  1342. package/src/browser/prefetch/cache.ts +325 -84
  1343. package/src/browser/prefetch/default-strategy.ts +74 -0
  1344. package/src/browser/prefetch/fetch.ts +411 -69
  1345. package/src/browser/prefetch/invalidation.ts +30 -0
  1346. package/src/browser/prefetch/loader.ts +111 -0
  1347. package/src/browser/prefetch/observer.ts +50 -22
  1348. package/src/browser/prefetch/queue.ts +61 -12
  1349. package/src/browser/prefetch/runtime.ts +6 -0
  1350. package/src/browser/rango-state.ts +178 -75
  1351. package/src/browser/react/Link.tsx +160 -92
  1352. package/src/browser/react/NavigationProvider.tsx +211 -121
  1353. package/src/browser/react/ScrollRestoration.tsx +10 -6
  1354. package/src/browser/react/context.ts +4 -0
  1355. package/src/browser/react/filter-segment-order.ts +66 -7
  1356. package/src/browser/react/index.ts +0 -48
  1357. package/src/browser/react/location-state-shared.ts +178 -8
  1358. package/src/browser/react/location-state.ts +39 -14
  1359. package/src/browser/react/use-action.ts +6 -15
  1360. package/src/browser/react/use-handle.ts +17 -14
  1361. package/src/browser/react/use-href.tsx +8 -1
  1362. package/src/browser/react/use-link-status.ts +33 -8
  1363. package/src/browser/react/use-navigation.ts +10 -5
  1364. package/src/browser/react/use-params.ts +20 -10
  1365. package/src/browser/react/use-reverse.ts +106 -0
  1366. package/src/browser/react/use-router.ts +62 -11
  1367. package/src/browser/react/use-search-params.ts +140 -22
  1368. package/src/browser/react/use-segments.ts +11 -21
  1369. package/src/browser/response-adapter.ts +99 -8
  1370. package/src/browser/rsc-router.tsx +248 -32
  1371. package/src/browser/scroll-restoration.ts +37 -22
  1372. package/src/browser/segment-reconciler.ts +31 -21
  1373. package/src/browser/segment-structure-assert.ts +2 -2
  1374. package/src/browser/server-action-bridge.ts +262 -65
  1375. package/src/browser/types.ts +132 -34
  1376. package/src/browser/validate-redirect-origin.ts +43 -16
  1377. package/src/build/collect-fallback-refs.ts +107 -0
  1378. package/src/build/generate-manifest.ts +213 -184
  1379. package/src/build/generate-route-types.ts +3 -1
  1380. package/src/build/index.ts +11 -3
  1381. package/src/build/merge-full-manifests.ts +161 -0
  1382. package/src/build/prefix-tree-utils.ts +123 -0
  1383. package/src/build/route-trie.ts +43 -280
  1384. package/src/build/route-types/ast-route-extraction.ts +15 -8
  1385. package/src/build/route-types/codegen.ts +16 -5
  1386. package/src/build/route-types/include-resolution.ts +513 -64
  1387. package/src/build/route-types/param-extraction.ts +6 -3
  1388. package/src/build/route-types/per-module-writer.ts +33 -12
  1389. package/src/build/route-types/router-processing.ts +312 -204
  1390. package/src/build/route-types/scan-filter.ts +1 -1
  1391. package/src/build/route-types/source-scan.ts +216 -0
  1392. package/src/build/runtime-discovery.ts +32 -29
  1393. package/src/cache/cache-error.ts +104 -0
  1394. package/src/cache/cache-exec-scope.ts +47 -0
  1395. package/src/cache/cache-key-utils.ts +73 -15
  1396. package/src/cache/cache-policy.ts +108 -34
  1397. package/src/cache/cache-runtime.ts +566 -121
  1398. package/src/cache/cache-scope.ts +383 -105
  1399. package/src/cache/cache-tag.ts +149 -0
  1400. package/src/cache/cf/cf-base64.ts +33 -0
  1401. package/src/cache/cf/cf-cache-constants.ts +134 -0
  1402. package/src/cache/cf/cf-cache-store.ts +3083 -392
  1403. package/src/cache/cf/cf-cache-types.ts +417 -0
  1404. package/src/cache/cf/cf-kv-utils.ts +84 -0
  1405. package/src/cache/cf/cf-tag-marker-memo.ts +108 -0
  1406. package/src/cache/cf/cf-zone-purge.ts +101 -0
  1407. package/src/cache/cf/index.ts +11 -16
  1408. package/src/cache/document-cache.ts +184 -53
  1409. package/src/cache/handle-snapshot.ts +92 -1
  1410. package/src/cache/index.ts +32 -20
  1411. package/src/cache/memory-segment-store.ts +286 -37
  1412. package/src/cache/profile-registry.ts +46 -31
  1413. package/src/cache/read-through-swr.ts +66 -16
  1414. package/src/cache/search-params-filter.ts +118 -0
  1415. package/src/cache/segment-codec.ts +80 -25
  1416. package/src/cache/shell-snapshot.ts +516 -0
  1417. package/src/cache/tag-invalidation.ts +230 -0
  1418. package/src/cache/taint.ts +28 -9
  1419. package/src/cache/types.ts +343 -100
  1420. package/src/cache/vercel/index.ts +11 -0
  1421. package/src/cache/vercel/vercel-cache-store.ts +1264 -0
  1422. package/src/client-urls/client-root.tsx +168 -0
  1423. package/src/client-urls/client-urls.ts +779 -0
  1424. package/src/client-urls/navigation.ts +237 -0
  1425. package/src/client-urls/revalidation-protocol.ts +56 -0
  1426. package/src/client-urls/server-projection.ts +670 -0
  1427. package/src/client-urls/types.ts +202 -0
  1428. package/src/client.rsc.tsx +53 -21
  1429. package/src/client.tsx +82 -67
  1430. package/src/cloudflare/index.ts +11 -0
  1431. package/src/cloudflare/tracing.ts +112 -0
  1432. package/src/component-utils.ts +19 -0
  1433. package/src/components/DefaultDocument.tsx +8 -2
  1434. package/src/context-var.ts +18 -6
  1435. package/src/decode-loader-results.ts +165 -0
  1436. package/src/defer.ts +185 -0
  1437. package/src/deps/ssr.ts +4 -2
  1438. package/src/dev-discovery-protocol.ts +11 -0
  1439. package/src/encode-kv.ts +49 -0
  1440. package/src/errors.ts +44 -4
  1441. package/src/escape-script.ts +52 -0
  1442. package/src/handle.ts +67 -37
  1443. package/src/handles/MetaTags.tsx +24 -53
  1444. package/src/handles/Scripts.tsx +183 -0
  1445. package/src/handles/breadcrumbs.ts +35 -8
  1446. package/src/handles/deferred-resolution.ts +134 -0
  1447. package/src/handles/is-thenable.ts +16 -0
  1448. package/src/handles/meta.ts +14 -40
  1449. package/src/handles/script.ts +244 -0
  1450. package/src/host/cookie-handler.ts +9 -60
  1451. package/src/host/errors.ts +13 -22
  1452. package/src/host/index.ts +9 -2
  1453. package/src/host/pattern-matcher.ts +23 -52
  1454. package/src/host/router.ts +107 -99
  1455. package/src/host/testing.ts +40 -27
  1456. package/src/host/types.ts +37 -4
  1457. package/src/host/utils.ts +1 -1
  1458. package/src/href-client.ts +137 -22
  1459. package/src/index.rsc.ts +108 -12
  1460. package/src/index.ts +106 -14
  1461. package/src/internal-debug.ts +11 -10
  1462. package/src/loader-redirect.tsx +64 -0
  1463. package/src/loader-store.ts +500 -0
  1464. package/src/loader.rsc.ts +20 -13
  1465. package/src/loader.ts +12 -11
  1466. package/src/missing-id-error.ts +68 -0
  1467. package/src/outlet-context.ts +21 -1
  1468. package/src/outlet-provider.tsx +20 -6
  1469. package/src/prerender/build-shell-capture.ts +453 -0
  1470. package/src/prerender/param-hash.ts +16 -16
  1471. package/src/prerender/shell-manifest-key.ts +20 -0
  1472. package/src/prerender/store.ts +47 -38
  1473. package/src/prerender.ts +81 -13
  1474. package/src/redirect-origin.ts +172 -0
  1475. package/src/regex-escape.ts +8 -0
  1476. package/src/render-error-thrower.tsx +20 -0
  1477. package/src/response-utils.ts +62 -0
  1478. package/src/reverse.ts +65 -39
  1479. package/src/root-error-boundary.tsx +1 -19
  1480. package/src/route-content-wrapper.tsx +120 -78
  1481. package/src/route-definition/dsl-helpers.ts +342 -313
  1482. package/src/route-definition/helper-factories.ts +28 -140
  1483. package/src/route-definition/helpers-types.ts +106 -62
  1484. package/src/route-definition/index.ts +1 -2
  1485. package/src/route-definition/redirect.ts +60 -28
  1486. package/src/route-definition/resolve-handler-use.ts +12 -1
  1487. package/src/route-definition/use-item-types.ts +29 -0
  1488. package/src/route-map-builder.ts +102 -74
  1489. package/src/route-types.ts +19 -46
  1490. package/src/router/basename.ts +14 -0
  1491. package/src/router/content-negotiation.ts +120 -30
  1492. package/src/router/error-handling.ts +110 -29
  1493. package/src/router/find-match.ts +129 -30
  1494. package/src/router/handler-context.ts +58 -57
  1495. package/src/router/instrument.ts +401 -0
  1496. package/src/router/intercept-resolution.ts +98 -21
  1497. package/src/router/lazy-includes.ts +83 -59
  1498. package/src/router/loader-resolution.ts +429 -85
  1499. package/src/router/logging.ts +0 -6
  1500. package/src/router/manifest.ts +74 -40
  1501. package/src/router/match-api.ts +94 -58
  1502. package/src/router/match-context.ts +0 -22
  1503. package/src/router/match-handlers.ts +268 -171
  1504. package/src/router/match-middleware/background-revalidation.ts +40 -24
  1505. package/src/router/match-middleware/cache-lookup.ts +316 -302
  1506. package/src/router/match-middleware/cache-store.ts +134 -52
  1507. package/src/router/match-middleware/intercept-resolution.ts +0 -22
  1508. package/src/router/match-middleware/segment-resolution.ts +0 -22
  1509. package/src/router/match-pipelines.ts +1 -42
  1510. package/src/router/match-result.ts +76 -79
  1511. package/src/router/metrics.ts +17 -36
  1512. package/src/router/middleware-types.ts +20 -130
  1513. package/src/router/middleware.ts +302 -172
  1514. package/src/router/navigation-snapshot.ts +51 -60
  1515. package/src/router/params-util.ts +23 -0
  1516. package/src/router/parse-pattern.ts +115 -0
  1517. package/src/router/pattern-matching.ts +181 -150
  1518. package/src/router/prefetch-cache-ttl.ts +51 -0
  1519. package/src/router/prefetch-default.ts +59 -0
  1520. package/src/router/prefetch-limits.ts +37 -0
  1521. package/src/router/prerender-match.ts +159 -69
  1522. package/src/router/preview-match.ts +6 -2
  1523. package/src/router/request-classification.ts +50 -69
  1524. package/src/router/revalidation.ts +146 -83
  1525. package/src/router/route-snapshot.ts +14 -3
  1526. package/src/router/route-trie-builder.ts +334 -0
  1527. package/src/router/router-context.ts +6 -29
  1528. package/src/router/router-interfaces.ts +168 -38
  1529. package/src/router/router-options.ts +235 -11
  1530. package/src/router/router-registry.ts +2 -5
  1531. package/src/router/segment-resolution/fresh.ts +219 -88
  1532. package/src/router/segment-resolution/helpers.ts +96 -18
  1533. package/src/router/segment-resolution/loader-cache.ts +208 -39
  1534. package/src/router/segment-resolution/loader-mask.ts +60 -0
  1535. package/src/router/segment-resolution/loader-snapshot.ts +259 -0
  1536. package/src/router/segment-resolution/mask-nested.ts +99 -0
  1537. package/src/router/segment-resolution/revalidation.ts +318 -321
  1538. package/src/router/segment-resolution/static-store.ts +55 -15
  1539. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  1540. package/src/router/segment-resolution/view-transition-default.ts +60 -0
  1541. package/src/router/segment-resolution.ts +5 -1
  1542. package/src/router/segment-wrappers.ts +6 -5
  1543. package/src/router/state-cookie-name.ts +33 -0
  1544. package/src/router/substitute-pattern-params.ts +75 -0
  1545. package/src/router/telemetry-otel.ts +171 -200
  1546. package/src/router/telemetry.ts +106 -20
  1547. package/src/router/timeout.ts +53 -22
  1548. package/src/router/tracing.ts +235 -0
  1549. package/src/router/transition-when.ts +76 -0
  1550. package/src/router/trie-matching.ts +171 -59
  1551. package/src/router/types.ts +9 -63
  1552. package/src/router/url-params.ts +57 -0
  1553. package/src/router.ts +249 -79
  1554. package/src/rsc/capture-queue.ts +218 -0
  1555. package/src/rsc/full-payload.ts +77 -0
  1556. package/src/rsc/handler-context.ts +4 -2
  1557. package/src/rsc/handler.ts +570 -288
  1558. package/src/rsc/helpers.ts +245 -47
  1559. package/src/rsc/index.ts +2 -5
  1560. package/src/rsc/json-route-result.ts +38 -0
  1561. package/src/rsc/loader-fetch.ts +116 -40
  1562. package/src/rsc/manifest-init.ts +55 -56
  1563. package/src/rsc/nonce.ts +26 -1
  1564. package/src/rsc/origin-guard.ts +39 -25
  1565. package/src/rsc/progressive-enhancement.ts +378 -83
  1566. package/src/rsc/redirect-guard.ts +102 -0
  1567. package/src/rsc/render-pipeline.ts +611 -0
  1568. package/src/rsc/response-cache-serve.ts +259 -0
  1569. package/src/rsc/response-error.ts +79 -12
  1570. package/src/rsc/response-route-handler.ts +80 -206
  1571. package/src/rsc/routine-plan.ts +359 -0
  1572. package/src/rsc/rsc-rendering.ts +1647 -164
  1573. package/src/rsc/runtime-warnings.ts +23 -10
  1574. package/src/rsc/server-action.ts +421 -138
  1575. package/src/rsc/shell-build-manifest.ts +343 -0
  1576. package/src/rsc/shell-capture-constants.ts +45 -0
  1577. package/src/rsc/shell-capture.ts +2135 -0
  1578. package/src/rsc/shell-serve.ts +350 -0
  1579. package/src/rsc/ssr-setup.ts +124 -16
  1580. package/src/rsc/stream-idle.ts +137 -0
  1581. package/src/rsc/transition-gate.ts +86 -0
  1582. package/src/rsc/types.ts +125 -7
  1583. package/src/runtime-env.ts +18 -0
  1584. package/src/search-params.ts +35 -30
  1585. package/src/segment-fragments.ts +165 -0
  1586. package/src/segment-loader-promise.ts +49 -4
  1587. package/src/segment-system.tsx +463 -153
  1588. package/src/serialize.ts +243 -0
  1589. package/src/server/context.ts +426 -55
  1590. package/src/server/cookie-parse.ts +32 -0
  1591. package/src/server/cookie-store.ts +162 -15
  1592. package/src/server/handle-store.ts +190 -70
  1593. package/src/server/loader-registry.ts +33 -42
  1594. package/src/server/request-context.ts +824 -215
  1595. package/src/server.ts +7 -2
  1596. package/src/ssr/index.tsx +687 -184
  1597. package/src/ssr/inject-rsc-eager.ts +167 -0
  1598. package/src/ssr/preinit-client-references.ts +106 -0
  1599. package/src/ssr/ssr-root.tsx +305 -0
  1600. package/src/ssr-suspension-warning.ts +67 -0
  1601. package/src/static-handler.ts +28 -15
  1602. package/src/testing/cache-status.ts +162 -0
  1603. package/src/testing/collect-handle.ts +46 -0
  1604. package/src/testing/dispatch.ts +951 -0
  1605. package/src/testing/dom.entry.ts +22 -0
  1606. package/src/testing/e2e/fixture.ts +188 -0
  1607. package/src/testing/e2e/index.ts +147 -0
  1608. package/src/testing/e2e/matchers.ts +35 -0
  1609. package/src/testing/e2e/page-helpers.ts +319 -0
  1610. package/src/testing/e2e/parity.ts +400 -0
  1611. package/src/testing/e2e/server.ts +195 -0
  1612. package/src/testing/flight-matchers.ts +97 -0
  1613. package/src/testing/flight-normalize.ts +11 -0
  1614. package/src/testing/flight-runtime.d.ts +57 -0
  1615. package/src/testing/flight-tree.ts +682 -0
  1616. package/src/testing/flight.entry.ts +52 -0
  1617. package/src/testing/flight.ts +257 -0
  1618. package/src/testing/generated-routes.ts +199 -0
  1619. package/src/testing/index.ts +121 -0
  1620. package/src/testing/internal/context.ts +380 -0
  1621. package/src/testing/internal/flight-client-globals.ts +30 -0
  1622. package/src/testing/internal/seed-vars.ts +54 -0
  1623. package/src/testing/render-handler.ts +371 -0
  1624. package/src/testing/render-route.tsx +667 -0
  1625. package/src/testing/run-loader.ts +423 -0
  1626. package/src/testing/run-middleware.ts +219 -0
  1627. package/src/testing/run-transition-when.ts +197 -0
  1628. package/src/testing/shell-status.ts +206 -0
  1629. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  1630. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  1631. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  1632. package/src/testing/vitest-stubs/version.ts +5 -0
  1633. package/src/testing/vitest.ts +305 -0
  1634. package/src/theme/ThemeProvider.tsx +56 -84
  1635. package/src/theme/ThemeScript.tsx +7 -9
  1636. package/src/theme/constants.ts +52 -13
  1637. package/src/theme/index.ts +0 -7
  1638. package/src/theme/theme-context.ts +1 -5
  1639. package/src/theme/theme-script.ts +22 -21
  1640. package/src/theme/use-theme.ts +0 -3
  1641. package/src/types/boundaries.ts +19 -35
  1642. package/src/types/cache-types.ts +13 -4
  1643. package/src/types/error-types.ts +30 -90
  1644. package/src/types/global-namespace.ts +54 -41
  1645. package/src/types/handler-context.ts +123 -64
  1646. package/src/types/index.ts +4 -10
  1647. package/src/types/loader-types.ts +76 -13
  1648. package/src/types/request-scope.ts +112 -0
  1649. package/src/types/route-config.ts +20 -52
  1650. package/src/types/route-entry.ts +3 -6
  1651. package/src/types/segments.ts +155 -14
  1652. package/src/urls/include-helper.ts +38 -64
  1653. package/src/urls/include-provider.ts +71 -0
  1654. package/src/urls/index.ts +2 -11
  1655. package/src/urls/path-helper-types.ts +88 -25
  1656. package/src/urls/path-helper.ts +30 -110
  1657. package/src/urls/pattern-types.ts +101 -19
  1658. package/src/urls/response-types.ts +22 -29
  1659. package/src/urls/type-extraction.ts +98 -154
  1660. package/src/urls/urls-function.ts +1 -19
  1661. package/src/use-loader.tsx +379 -110
  1662. package/src/vercel/index.ts +11 -0
  1663. package/src/vercel/tracing.ts +89 -0
  1664. package/src/vite/debug.ts +185 -0
  1665. package/src/vite/discovery/bundle-postprocess.ts +18 -14
  1666. package/src/vite/discovery/client-urls-projection.ts +322 -0
  1667. package/src/vite/discovery/dev-prerender-cache.ts +117 -0
  1668. package/src/vite/discovery/discover-routers.ts +178 -151
  1669. package/src/vite/discovery/discovery-errors.ts +255 -0
  1670. package/src/vite/discovery/gate-state.ts +171 -0
  1671. package/src/vite/discovery/prerender-collection.ts +125 -70
  1672. package/src/vite/discovery/route-types-writer.ts +40 -84
  1673. package/src/vite/discovery/self-gen-tracking.ts +27 -1
  1674. package/src/vite/discovery/shell-prerender-phase.ts +397 -0
  1675. package/src/vite/discovery/state.ts +104 -6
  1676. package/src/vite/discovery/virtual-module-codegen.ts +226 -87
  1677. package/src/vite/encryption-key.ts +29 -0
  1678. package/src/vite/index.ts +12 -0
  1679. package/src/vite/inject-client-debug.ts +88 -0
  1680. package/src/vite/plugin-types.ts +243 -10
  1681. package/src/vite/plugins/cjs-to-esm.ts +16 -19
  1682. package/src/vite/plugins/client-ref-dedup.ts +296 -29
  1683. package/src/vite/plugins/client-ref-hashing.ts +28 -15
  1684. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1685. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1686. package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
  1687. package/src/vite/plugins/expose-action-id.ts +95 -120
  1688. package/src/vite/plugins/expose-id-utils.ts +88 -55
  1689. package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
  1690. package/src/vite/plugins/expose-ids/handler-transform.ts +11 -90
  1691. package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
  1692. package/src/vite/plugins/expose-ids/router-transform.ts +118 -29
  1693. package/src/vite/plugins/expose-internal-ids.ts +551 -486
  1694. package/src/vite/plugins/performance-tracks.ts +26 -25
  1695. package/src/vite/plugins/refresh-cmd.ts +1 -1
  1696. package/src/vite/plugins/server-ref-hashing.ts +74 -0
  1697. package/src/vite/plugins/server-reference-pattern.ts +10 -0
  1698. package/src/vite/plugins/use-cache-transform.ts +73 -83
  1699. package/src/vite/plugins/vercel-output.ts +384 -0
  1700. package/src/vite/plugins/version-injector.ts +39 -29
  1701. package/src/vite/plugins/version-plugin.ts +45 -40
  1702. package/src/vite/plugins/virtual-entries.ts +193 -30
  1703. package/src/vite/rango.ts +287 -140
  1704. package/src/vite/router-discovery.ts +1639 -157
  1705. package/src/vite/utils/ast-handler-extract.ts +26 -35
  1706. package/src/vite/utils/banner.ts +1 -1
  1707. package/src/vite/utils/bundle-analysis.ts +10 -15
  1708. package/src/vite/utils/client-chunks.ts +184 -0
  1709. package/src/vite/utils/directive-prologue.ts +40 -0
  1710. package/src/vite/utils/forward-user-plugins.ts +171 -0
  1711. package/src/vite/utils/manifest-utils.ts +1 -59
  1712. package/src/vite/utils/package-resolution.ts +21 -52
  1713. package/src/vite/utils/prerender-utils.ts +96 -49
  1714. package/src/vite/utils/shared-utils.ts +156 -43
  1715. package/src/browser/action-response-classifier.ts +0 -99
  1716. package/src/browser/shallow.ts +0 -40
  1717. package/src/router/middleware-cookies.ts +0 -55
@@ -7,240 +7,1723 @@
7
7
  */
8
8
 
9
9
  import {
10
- requireRequestContext,
10
+ getRequestContext,
11
11
  setRequestContextParams,
12
- getLocationState,
12
+ runWithRequestContext,
13
+ wireRenderBarrier,
13
14
  } from "../server/request-context.js";
14
- import { resolveLocationStateEntries } from "../browser/react/location-state-shared.js";
15
+ import {
16
+ SeededShellStore,
17
+ buildShellLoaderSeed,
18
+ } from "../cache/shell-snapshot.js";
15
19
  import { appendMetric } from "../router/metrics.js";
16
- import { getSSRSetup } from "./ssr-setup.js";
20
+ import { observePhase, PHASES } from "../router/instrument.js";
21
+ import type { TraceSpan } from "../router/tracing.js";
22
+ import { getSSRSetup, createSsrHtmlStage, isRscRequest } from "./ssr-setup.js";
17
23
  import type { RscPayload } from "./types.js";
24
+ import type { SSRModule } from "./types.js";
25
+ import type { RequestContext } from "../server/request-context.js";
18
26
  import {
19
27
  createResponseWithMergedHeaders,
20
28
  createSimpleRedirectResponse,
29
+ attachLocationStateIfPresent,
30
+ matchAndRecordParams,
21
31
  } from "./helpers.js";
32
+ import {
33
+ createRenderStageTraceBridge,
34
+ renderRscFlightStage,
35
+ renderRscResponse,
36
+ } from "./render-pipeline.js";
37
+ import {
38
+ createRoutineTrace,
39
+ handoff,
40
+ runRoutine,
41
+ scope,
42
+ step,
43
+ type RoutinePlan,
44
+ } from "./routine-plan.js";
22
45
  import type { HandlerContext } from "./handler-context.js";
46
+ import { gateTransitions } from "./transition-gate.js";
47
+ import { buildFullPayload } from "./full-payload.js";
48
+ import {
49
+ scheduleShellCapture,
50
+ resolveShellCaptureDebugSink,
51
+ takeCaptureDebugEventForTiming,
52
+ describeShellCaptureEvent,
53
+ type ShellCaptureDescriptor,
54
+ } from "./shell-capture.js";
55
+ import {
56
+ PPR_REPLAY_STATUS_HEADER,
57
+ SHELL_STATUS_HEADER,
58
+ resolvePprConfig,
59
+ buildShellKey,
60
+ shellSearchSeed,
61
+ isValidShellHit,
62
+ hasIntactShellPayload,
63
+ base64ToBytes,
64
+ hasShellFamily,
65
+ warnShellStoreMissingOnce,
66
+ warnPprNonceActiveOnce,
67
+ describeShellTailTiming,
68
+ publishShellTailTiming,
69
+ takeShellTailTimingForServerTiming,
70
+ type ResolvedPprConfig,
71
+ type ShellTailTiming,
72
+ } from "./shell-serve.js";
73
+ import {
74
+ lookupBuildShell,
75
+ type DevShellLookup,
76
+ } from "./shell-build-manifest.js";
77
+ import { contextGet } from "../context-var.js";
78
+ import {
79
+ getNavigationContextHeader,
80
+ prerenderStoreShortCircuits,
81
+ } from "../router/navigation-snapshot.js";
82
+ import {
83
+ ensureFullRouteSnapshot,
84
+ type RouteSnapshot,
85
+ } from "../router/route-snapshot.js";
86
+ import { prerenderEntryExists } from "../router/match-middleware/cache-lookup.js";
87
+ import {
88
+ resolveSameOriginRedirect,
89
+ safeSameOriginLanding,
90
+ } from "../redirect-origin.js";
91
+ import { nonce as nonceToken } from "./nonce.js";
92
+ import { reportCacheError } from "../cache/cache-error.js";
93
+ import type { SearchParamsFilter } from "../cache/search-params-filter.js";
94
+ import { INTERNAL_RANGO_DEBUG } from "../internal-debug.js";
95
+ import type {
96
+ DocumentShellCacheEntry,
97
+ SegmentCacheStore,
98
+ ShellCacheEntry,
99
+ ShellSnapshotRecord,
100
+ } from "../cache/types.js";
101
+ import {
102
+ SEGMENT_FRAGMENT_CAPABILITY_HEADER,
103
+ SEGMENT_FRAGMENT_RECOVERY_HEADER,
104
+ } from "../segment-fragments.js";
105
+
106
+ type PprReplayBypassReason =
107
+ | "method"
108
+ | "dynamic"
109
+ | "nonce"
110
+ | "store-unavailable"
111
+ | "passive-read-unsupported"
112
+ | "no-navigation-context"
113
+ | "prerender-store"
114
+ | "intercept"
115
+ | "cache-disabled"
116
+ | "read-error"
117
+ | "no-entry"
118
+ | "invalid-version"
119
+ | "corrupt-entry"
120
+ | "handler-live-holes"
121
+ | "transition-when"
122
+ | "no-segment-snapshot"
123
+ | "snapshot-miss"
124
+ | "explicit-cache-hit"
125
+ | "stale-build-entry";
126
+
127
+ type PprReplayStatus =
128
+ | { outcome: "HIT"; freshness: "fresh" | "stale" }
129
+ | { outcome: "BYPASS"; reason: PprReplayBypassReason };
130
+
131
+ type ShellReplayDecision =
132
+ | { snapshot: ShellSnapshotRecord[] }
133
+ | { reason: PprReplayBypassReason };
134
+
135
+ function serializePprReplayStatus(status: PprReplayStatus): string {
136
+ return status.outcome === "HIT"
137
+ ? `HIT; freshness=${status.freshness}`
138
+ : `BYPASS; reason=${status.reason}`;
139
+ }
140
+
141
+ function describePprReplayStatus(status: PprReplayStatus): string {
142
+ return status.outcome === "HIT"
143
+ ? status.freshness
144
+ : `bypass:${status.reason}`;
145
+ }
146
+
147
+ function buildNavigationShellKey(
148
+ url: URL,
149
+ filter?: SearchParamsFilter,
150
+ ): string {
151
+ return `${buildShellKey(url, filter)}:navigation`;
152
+ }
153
+
154
+ function createShellCaptureDescriptor(
155
+ ctx: HandlerContext<any>,
156
+ key: string,
157
+ searchSeed: string,
158
+ originSeed: string,
159
+ pprConfig: ResolvedPprConfig,
160
+ store: SegmentCacheStore<any>,
161
+ navigationOnly?: true,
162
+ ): ShellCaptureDescriptor {
163
+ return {
164
+ key,
165
+ searchSeed,
166
+ // Derived from the same request URL as the key (the callers compute
167
+ // both next to each other, so they cannot drift): seeding the origin
168
+ // keeps origin-dependent static markup (Link's data-external)
169
+ // identical across capture, resume, and browser hydration.
170
+ originSeed,
171
+ buildVersion: ctx.version,
172
+ ttl: pprConfig.ttl,
173
+ swr: pprConfig.swr,
174
+ tags: pprConfig.tags,
175
+ captureTimeout: pprConfig.captureTimeout,
176
+ store,
177
+ debug: INTERNAL_RANGO_DEBUG,
178
+ maxSnapshotBytes: pprConfig.maxSnapshotBytes,
179
+ debugSink: resolveShellCaptureDebugSink(ctx.router.debugShellCapture),
180
+ navigationOnly,
181
+ };
182
+ }
183
+
184
+ function shouldHealReplayMiss(
185
+ reason: PprReplayBypassReason | undefined,
186
+ ): boolean {
187
+ return (
188
+ reason === undefined ||
189
+ reason === "invalid-version" ||
190
+ reason === "corrupt-entry" ||
191
+ reason === "stale-build-entry"
192
+ );
193
+ }
194
+
195
+ /**
196
+ * Post-match truth override for a pre-match BYPASS classification. The gate
197
+ * decides before matchPartial runs, but two facts only the match can settle:
198
+ * whether the prerender store ACTUALLY served (either artifact variant — the
199
+ * gate's probe reads only the non-intercept one), and whether the navigation
200
+ * resolved to an intercept (findInterceptForRoute runs during the match; the
201
+ * intercept-source header proves nothing in either direction). The resulting
202
+ * reason is stamped on the request context by withCacheLookup. A replay HIT is
203
+ * never overridden — the seeded record was demonstrably consumed, so neither
204
+ * fact can be true.
205
+ */
206
+ function reclassifyReplayStatus(
207
+ reqCtx: RequestContext<any>,
208
+ status: PprReplayStatus,
209
+ ): PprReplayStatus {
210
+ if (status.outcome === "HIT") return status;
211
+ const reason = reqCtx._pprReplayPostMatchReason;
212
+ return reason ? { outcome: "BYPASS", reason } : status;
213
+ }
214
+
215
+ function resolveDevShellLookup(
216
+ reqCtx: RequestContext<any>,
217
+ pprConfig: ResolvedPprConfig,
218
+ ): DevShellLookup | undefined {
219
+ if (process.env.NODE_ENV === "production") return undefined;
220
+ return {
221
+ isPrerenderRoute: reqCtx._classifiedRoute?.matched?.pr === true,
222
+ routeName: reqCtx._classifiedRoute?.routeKey,
223
+ ttl: pprConfig.ttl,
224
+ swr: pprConfig.swr,
225
+ tags: pprConfig.tags,
226
+ maxSnapshotBytes: pprConfig.maxSnapshotBytes,
227
+ captureTimeout: pprConfig.captureTimeout,
228
+ };
229
+ }
230
+
231
+ function replayableShellSnapshot(
232
+ entry: ShellCacheEntry,
233
+ buildVersion: string,
234
+ ): ShellReplayDecision {
235
+ if (!isValidShellHit(entry, buildVersion)) {
236
+ return { reason: "invalid-version" };
237
+ }
238
+ // navigationOnly entries store no document half (prelude/postponed absent),
239
+ // so the payload gate applies to document-snapshot entries alone. Replay
240
+ // consumes only the snapshot; fragment corruption inside it is caught by the
241
+ // consumer-side Flight decoders (SegmentFragmentDecodeError →
242
+ // segmentReplayCorrupt → healing capture at the document key).
243
+ if (!entry.navigationOnly && !hasIntactShellPayload(entry)) {
244
+ return { reason: "corrupt-entry" };
245
+ }
246
+ if (entry.handlerLiveHoles) return { reason: "handler-live-holes" };
247
+ if (entry.transitionWhen) return { reason: "transition-when" };
248
+ // Eligibility requires the CANONICAL doc segment record (`docKey`), not just
249
+ // any segment record: captures under an explicit cache() scope also record
250
+ // that tier's reads/writes under keys a partial lookup can never resolve,
251
+ // and counting those declared entries "replayable" that then always missed
252
+ // (a timing-dependent snapshot-miss/no-segment-snapshot flip-flop). Entries
253
+ // captured before the field existed read as no-segment-snapshot and heal on
254
+ // recapture (pre-release, same treatment as the buildVersion field).
255
+ const docKey = entry.docKey;
256
+ const snapshot = entry.snapshot;
257
+ const hasDocRecord =
258
+ docKey !== undefined &&
259
+ snapshot?.some((record) => {
260
+ if (
261
+ !record ||
262
+ typeof record !== "object" ||
263
+ record.family !== "segment" ||
264
+ record.key !== docKey ||
265
+ typeof record.value !== "object" ||
266
+ record.value === null
267
+ ) {
268
+ return false;
269
+ }
270
+ const segments = (record.value as { segments?: unknown }).segments;
271
+ return Array.isArray(segments) && segments.length > 0;
272
+ });
273
+ return hasDocRecord && snapshot
274
+ ? { snapshot }
275
+ : { reason: "no-segment-snapshot" };
276
+ }
277
+
278
+ export function handleRscRendering<TEnv>(
279
+ ctx: HandlerContext<TEnv>,
280
+ request: Request,
281
+ env: TEnv,
282
+ url: URL,
283
+ isPartial: boolean,
284
+ handleStore: ReturnType<typeof getRequestContext>["_handleStore"],
285
+ nonce: string | undefined,
286
+ ): Promise<Response> {
287
+ // Instrument the whole render phase once through the unified API: it records
288
+ // the "render:total" perf metric AND opens the "rango.render" span from the
289
+ // same boundary (match -> serialize -> SSR), so the two surfaces agree.
290
+ // Loaders kicked off during matching nest under the span; the SSR HTML pass
291
+ // below opens "rango.ssr" the same way.
292
+ return observePhase(PHASES.render, (span) =>
293
+ handleRscRenderingInner(
294
+ ctx,
295
+ request,
296
+ env,
297
+ url,
298
+ isPartial,
299
+ handleStore,
300
+ nonce,
301
+ span,
302
+ ),
303
+ );
304
+ }
305
+
306
+ interface RequestRenderInput<TEnv> {
307
+ ctx: HandlerContext<TEnv>;
308
+ request: Request;
309
+ env: TEnv;
310
+ url: URL;
311
+ isPartial: boolean;
312
+ handleStore: ReturnType<typeof getRequestContext>["_handleStore"];
313
+ nonce: string | undefined;
314
+ renderSpan: TraceSpan;
315
+ reqCtx: ReturnType<typeof getRequestContext>;
316
+ }
23
317
 
24
- export async function handleRscRendering<TEnv>(
318
+ type ShellServeOutcome =
319
+ | { kind: "serve"; response: Response }
320
+ | { kind: "miss"; descriptor: ShellCaptureDescriptor; ssrModule: SSRModule }
321
+ | { kind: "pass" };
322
+
323
+ type PreparedRender =
324
+ | { kind: "control"; response: Response }
325
+ | {
326
+ kind: "payload";
327
+ payload: RscPayload;
328
+ hasInterceptSlots: boolean;
329
+ pprReplayStatus?: PprReplayStatus;
330
+ partialCaptureNeeded: boolean;
331
+ partialCaptureKey?: string;
332
+ };
333
+
334
+ async function handleRscRenderingInner<TEnv>(
25
335
  ctx: HandlerContext<TEnv>,
26
336
  request: Request,
27
337
  env: TEnv,
28
338
  url: URL,
29
339
  isPartial: boolean,
30
- handleStore: ReturnType<typeof requireRequestContext>["_handleStore"],
340
+ handleStore: ReturnType<typeof getRequestContext>["_handleStore"],
31
341
  nonce: string | undefined,
342
+ renderSpan: TraceSpan,
32
343
  ): Promise<Response> {
33
- const reqCtx = requireRequestContext();
344
+ // Flow trace rides the internal debug surface (INTERNAL_RANGO_DEBUG=1): the
345
+ // Vite pipeline bakes the flag at build/dev-server start (inject-client-debug),
346
+ // so trace allocation and output fold out of ordinary production builds while
347
+ // an explicit debug build keeps them. The routine itself remains the executor.
348
+ const mode = isPartial ? "partial" : "document";
349
+ const trace = INTERNAL_RANGO_DEBUG ? createRoutineTrace(mode) : undefined;
350
+ const reqCtx = getRequestContext();
351
+ const input: RequestRenderInput<TEnv> = {
352
+ ctx,
353
+ request,
354
+ env,
355
+ url,
356
+ isPartial,
357
+ handleStore,
358
+ nonce,
359
+ renderSpan,
360
+ reqCtx,
361
+ };
362
+ try {
363
+ return await runRoutine(requestRenderPlan(input), {
364
+ trace,
365
+ owner: reqCtx,
366
+ });
367
+ } finally {
368
+ if (trace) {
369
+ console.log(
370
+ `[routine] ${request.method} ${url.pathname} (${trace.name})\n${trace.format()}`,
371
+ );
372
+ }
373
+ }
374
+ }
375
+
376
+ /**
377
+ * The request-level render plan. Reads top to bottom as the request executes:
378
+ * serve a stored PPR shell if one commits, otherwise match and build the
379
+ * payload, render it through the stage driver, then hand off background
380
+ * captures. Effects run through the routine runner (yield-before-execute,
381
+ * exact result/error identity — see routine-plan.ts).
382
+ */
383
+ function* requestRenderPlan<TEnv>(
384
+ input: RequestRenderInput<TEnv>,
385
+ ): RoutinePlan<Response> {
386
+ const { isPartial, reqCtx } = input;
387
+
388
+ // --- Axis 2: integrated PPR shell serve (docs/design/ppr-shell-resume.md) ---
389
+ //
390
+ // COMMIT POINT: this render pass runs strictly AFTER the whole middleware
391
+ // chain (executeRender wraps it), so no shell byte can precede a guard
392
+ // decision — that ordering is what makes a shared shell safe. Routes
393
+ // without the `ppr` option stay pure axis 1 at zero cost.
394
+ const shell = yield* scope("shell-serve", shellServePlan(input));
395
+ if (shell.kind === "serve") return shell.response;
396
+
397
+ // Match + payload. A control response (redirect, prerender collection)
398
+ // ends the plan before any rendering.
399
+ const prepared = yield* scope(
400
+ isPartial ? "prepare:partial" : "prepare:full",
401
+ preparePayloadPlan(input),
402
+ );
403
+ if (prepared.kind === "control") return prepared.response;
404
+
405
+ // For partial requests, include any server-set location state in the payload.
406
+ // SSR (full page) requests ignore location state since there's no history.state
407
+ // to write to on a fresh page load.
408
+ if (isPartial && prepared.payload.metadata) {
409
+ attachLocationStateIfPresent(prepared.payload);
410
+ }
411
+
412
+ const response = yield* step("render", () =>
413
+ renderPreparedRscResponse(input, prepared),
414
+ );
415
+
416
+ // --- Axis 2: PPR shell CAPTURE on MISS (background task; see design doc) ---
417
+ // Capture only a 200 HTML document (a 404/error render is not a cacheable
418
+ // shell). Capture does not flow through the HTTP pipeline — middleware never
419
+ // re-runs (it already ran for this request; guarding is serve-time).
420
+ // reqCtx._dynamic is re-read here on purpose: a loader may have marked the
421
+ // request dynamic while rendering.
422
+ if (shell.kind === "miss" && !reqCtx._dynamic) {
423
+ if (
424
+ response.status === 200 &&
425
+ (response.headers.get("content-type") ?? "").includes("text/html")
426
+ ) {
427
+ const { descriptor, ssrModule } = shell;
428
+ yield* handoff("shell-capture", () =>
429
+ scheduleShellCapture(
430
+ input.ctx,
431
+ input.request,
432
+ input.env,
433
+ input.url,
434
+ reqCtx,
435
+ ssrModule,
436
+ descriptor,
437
+ ),
438
+ );
439
+ }
440
+ response.headers.set(SHELL_STATUS_HEADER, "MISS");
441
+ }
442
+
443
+ if (
444
+ isPartial &&
445
+ prepared.partialCaptureNeeded &&
446
+ !reqCtx._dynamic &&
447
+ response.status === 200
448
+ ) {
449
+ const captureKey = prepared.partialCaptureKey;
450
+ yield* handoff("navigation-shell-capture", () =>
451
+ scheduleNavigationShellCapture(input, captureKey),
452
+ );
453
+ }
454
+
455
+ return response;
456
+ }
457
+
458
+ /**
459
+ * Axis 2 shell serve. Sync gates stay plan code; store and SSR effects run as
460
+ * named steps. Outcomes: serve a composed shell response, report a MISS (the
461
+ * top-level plan schedules the capture after the response commits), or pass
462
+ * (route not eligible — pure axis 1).
463
+ */
464
+ function* shellServePlan<TEnv>(
465
+ input: RequestRenderInput<TEnv>,
466
+ ): RoutinePlan<ShellServeOutcome> {
467
+ const { ctx, request, env, url, isPartial, handleStore, nonce, reqCtx } =
468
+ input;
469
+
470
+ if (
471
+ isPartial ||
472
+ request.method !== "GET" ||
473
+ url.searchParams.has("__prerender_collect") ||
474
+ isRscRequest(request, url, false) ||
475
+ reqCtx._dynamic
476
+ ) {
477
+ return { kind: "pass" };
478
+ }
479
+ const pprConfig = resolvePprConfig(reqCtx._classifiedRoute?.manifestEntry);
480
+ if (!pprConfig) return { kind: "pass" };
481
+
482
+ // A per-request CSP nonce pins the route to axis 1: a shared shell would
483
+ // freeze the capture request's nonce and CSP would reject it for every
484
+ // other visitor. BOTH nonce sources must gate — the createRouter({ nonce })
485
+ // provider (`nonce` param) and a middleware ctx.set(nonce, …) token write;
486
+ // the provider-only check missed the latter (issue #656).
487
+ const activeNonce = nonce ?? contextGet(reqCtx._variables, nonceToken);
488
+ const store = reqCtx._cacheStore;
489
+ const key = buildShellKey(url, reqCtx._searchParamsFilter);
490
+ mirrorPprServerTimingsForDev(key, reqCtx);
491
+ if (activeNonce !== undefined) {
492
+ // Declared intent that cannot be honored deserves a diagnostic (unlike an
493
+ // undeclared route, which is silent): a ppr route gated off by an active
494
+ // per-request nonce warns once per key. Axis 1 after the warning.
495
+ warnPprNonceActiveOnce(key);
496
+ return { kind: "pass" };
497
+ }
498
+ if (!hasShellFamily(store)) {
499
+ // Declared intent that cannot be honored deserves a diagnostic (unlike an
500
+ // undeclared route, which is silent). Axis 1 after the warning.
501
+ warnShellStoreMissingOnce(key);
502
+ return { kind: "pass" };
503
+ }
504
+
505
+ // SSR setup starts before route handling, so read the shell before joining it
506
+ // to overlap the remaining setup work with cache I/O.
507
+ const cached = yield* step("shell-read", () =>
508
+ readShellEntry(store, key, reqCtx),
509
+ );
34
510
 
35
- let payload: RscPayload;
36
- let hasInterceptSlots = false;
511
+ // allReady (ssr.resolveStreaming) bypasses PPR entirely: buffering defeats
512
+ // streaming, so bots/SEO crawlers get one complete axis-1 document. These
513
+ // routes pay one unnecessary shell read to keep the PPR hot path concurrent.
514
+ const [ssrModule, streamMode] = yield* step("ssr-setup", () =>
515
+ getSSRSetup(ctx, request, env, url, reqCtx._metricsStore),
516
+ );
517
+ if (
518
+ streamMode === "allReady" ||
519
+ !ssrModule.resumeShellHTML ||
520
+ !ssrModule.captureShellHTML
521
+ ) {
522
+ return { kind: "pass" };
523
+ }
524
+ const descriptor = createShellCaptureDescriptor(
525
+ ctx,
526
+ key,
527
+ shellSearchSeed(url, reqCtx._searchParamsFilter),
528
+ url.origin,
529
+ pprConfig,
530
+ store,
531
+ );
532
+
533
+ if (
534
+ cached &&
535
+ !cached.entry.navigationOnly &&
536
+ isValidShellHit(cached.entry, ctx.version)
537
+ ) {
538
+ if (!hasIntactShellPayload(cached.entry)) {
539
+ // Corrupt stored payload (undecodable prelude / unparseable
540
+ // postponed): a store-layer fault worth a diagnostic, unlike the
541
+ // silent version-mismatch lifecycle misses above. Degrade to MISS
542
+ // — the top-level plan schedules the recapture that overwrites it.
543
+ reportCacheError(
544
+ new Error(
545
+ `corrupt shell entry for "${key}": prelude/postponed failed ` +
546
+ "the integrity check; serving axis 1 and recapturing",
547
+ ),
548
+ "cache-read",
549
+ "[ShellServe] getShell",
550
+ );
551
+ } else {
552
+ // Stale (SWR) hit: serve the stale shell now, recapture in the
553
+ // background (stampede-guarded + backoff inside scheduleShellCapture).
554
+ if (cached.shouldRevalidate) {
555
+ yield* handoff("shell-recapture", () =>
556
+ scheduleShellCapture(
557
+ ctx,
558
+ request,
559
+ env,
560
+ url,
561
+ reqCtx,
562
+ ssrModule,
563
+ descriptor,
564
+ ),
565
+ );
566
+ }
567
+ const entry = cached.entry;
568
+ const response = yield* step("shell-hit", () =>
569
+ serveShellHit(
570
+ ctx,
571
+ request,
572
+ env,
573
+ url,
574
+ reqCtx,
575
+ handleStore,
576
+ ssrModule,
577
+ entry,
578
+ descriptor,
579
+ ),
580
+ );
581
+ return { kind: "serve", response };
582
+ }
583
+ }
584
+
585
+ // Build-time shell read-through (producer B, #699): on a runtime
586
+ // store MISS a Prerender+ppr route serves its `vite build`-baked
587
+ // shell through the SAME serve path. lookupBuildShell owns every
588
+ // gate and fails to null (ordinary MISS path takes over); past
589
+ // ppr.ttl the baked entry still serves while SWR recaptures — the
590
+ // upgrade path from build entry to runtime entry.
591
+ const buildHit = yield* step("build-shell-lookup", () =>
592
+ lookupBuildShell(
593
+ url,
594
+ ctx.version,
595
+ store,
596
+ // Dev: no build manifest exists; producer B runs on demand via
597
+ // the dev server's /__rsc_shell endpoint for PRERENDERED routes
598
+ // only (production's exact candidate set). Folded away in
599
+ // production builds (NODE_ENV is a compile-time constant).
600
+ resolveDevShellLookup(reqCtx, pprConfig),
601
+ reqCtx._searchParamsFilter,
602
+ ),
603
+ );
604
+ if (buildHit) {
605
+ // Past ppr.ttl: still serve the baked entry, recapture upgrades it.
606
+ if (buildHit.stale) {
607
+ yield* handoff("shell-recapture", () =>
608
+ scheduleShellCapture(
609
+ ctx,
610
+ request,
611
+ env,
612
+ url,
613
+ reqCtx,
614
+ ssrModule,
615
+ descriptor,
616
+ ),
617
+ );
618
+ }
619
+ const response = yield* step("shell-hit", () =>
620
+ serveShellHit(
621
+ ctx,
622
+ request,
623
+ env,
624
+ url,
625
+ reqCtx,
626
+ handleStore,
627
+ ssrModule,
628
+ buildHit.entry,
629
+ descriptor,
630
+ ),
631
+ );
632
+ return { kind: "serve", response };
633
+ }
634
+
635
+ // MISS (no entry, invalid reactVersion, or store read failure): axis 1
636
+ // + a background capture scheduled once the response is known servable.
637
+ return { kind: "miss", descriptor, ssrModule };
638
+ }
639
+
640
+ /**
641
+ * Match the request and assemble the RSC payload, or produce a control
642
+ * response (redirect, prerender collection) that ends the request plan.
643
+ */
644
+ function* preparePayloadPlan<TEnv>(
645
+ input: RequestRenderInput<TEnv>,
646
+ ): RoutinePlan<PreparedRender> {
647
+ const { ctx, request, env, url, isPartial, handleStore, nonce, reqCtx } =
648
+ input;
37
649
 
38
650
  if (isPartial) {
39
651
  // Partial render (navigation)
40
- const result = await ctx.router.matchPartial(request, { env });
652
+ const replay = yield* step("match:ppr-replay", () =>
653
+ matchPartialAndRecordParams(ctx, request, env, url, reqCtx, nonce),
654
+ );
655
+ const result = replay.result;
656
+ const pprReplayStatus = replay.status;
657
+ const partialCaptureNeeded =
658
+ "captureNeeded" in replay && replay.captureNeeded === true;
659
+ const partialCaptureKey =
660
+ "captureKey" in replay ? replay.captureKey : undefined;
41
661
 
42
662
  if (!result) {
43
663
  // Fall back to full render
44
- const match = await ctx.router.match(request, { env });
45
- setRequestContextParams(match.params, match.routeName);
664
+ const match = yield* step("match:fallback", () =>
665
+ matchAndRecordParams(ctx, request, env),
666
+ );
46
667
 
47
668
  if (match.redirect) {
48
669
  // Partial request: use X-RSC-Redirect header so the client can
49
670
  // perform SPA navigation. A raw 308 would be auto-followed by
50
- // fetch, hitting the target without _rsc_partial.
51
- return createSimpleRedirectResponse(match.redirect);
671
+ // fetch, hitting the target without _rsc_partial. Resolve the
672
+ // target server-side (same open-redirect policy as 3xx).
673
+ const redirectResponse = createSimpleRedirectResponse(match.redirect, {
674
+ requestOrigin: url.origin,
675
+ basename: ctx.router.basename,
676
+ });
677
+ if (pprReplayStatus) {
678
+ redirectResponse.headers.set(
679
+ PPR_REPLAY_STATUS_HEADER,
680
+ serializePprReplayStatus(pprReplayStatus),
681
+ );
682
+ }
683
+ return { kind: "control", response: redirectResponse };
52
684
  }
53
685
 
54
- payload = {
55
- metadata: {
56
- pathname: url.pathname,
57
- routerId: ctx.router.id,
58
- basename: ctx.router.basename,
59
- segments: match.segments,
60
- matched: match.matched,
61
- diff: match.diff,
62
- params: match.params,
63
- isPartial: false,
64
- rootLayout: ctx.router.rootLayout,
65
- handles: handleStore.stream(),
66
- version: ctx.version,
67
- prefetchCacheTTL: ctx.router.prefetchCacheTTL,
68
- themeConfig: ctx.router.themeConfig,
69
- initialTheme: reqCtx.theme,
70
- },
686
+ return {
687
+ kind: "payload",
688
+ payload: buildFullPayload(match, ctx, url, reqCtx, handleStore),
689
+ hasInterceptSlots: false,
690
+ pprReplayStatus,
691
+ partialCaptureNeeded,
692
+ partialCaptureKey,
71
693
  };
72
- } else {
73
- setRequestContextParams(result.params, result.routeName);
74
-
75
- hasInterceptSlots = !!result.slots;
694
+ }
76
695
 
77
- payload = {
696
+ return {
697
+ kind: "payload",
698
+ payload: {
78
699
  metadata: {
79
700
  pathname: url.pathname,
701
+ // routerId is serialized on every payload (including within-session
702
+ // ones) so the frontend can read the current app/router identity. It
703
+ // always equals the current app's id: a cross-app navigation is
704
+ // intercepted server-side (X-RSC-Reload) and never delivers a
705
+ // different-router payload to the client.
80
706
  routerId: ctx.router.id,
81
- segments: result.segments,
707
+ segments: gateTransitions(
708
+ result.segments,
709
+ reqCtx,
710
+ ctx.router.onError,
711
+ ),
82
712
  matched: result.matched,
83
713
  diff: result.diff,
714
+ resolvedIds: result.resolvedIds,
84
715
  params: result.params,
85
716
  isPartial: true,
86
717
  slots: result.slots,
718
+ interceptTargets: result.interceptTargets,
87
719
  handles: handleStore.stream(),
88
720
  version: ctx.version,
89
721
  prefetchCacheTTL: ctx.router.prefetchCacheTTL,
722
+ prefetchCacheSize: ctx.router.prefetchCacheSize,
723
+ prefetchConcurrency: ctx.router.prefetchConcurrency,
724
+ defaultPrefetch: ctx.router.defaultPrefetch,
725
+ stateCookieName: ctx.router.resolvedStateCookieName,
90
726
  },
91
- };
92
- }
93
- } else {
94
- // Full render (initial page load)
95
- const match = await ctx.router.match(request, { env });
96
- setRequestContextParams(match.params, match.routeName);
727
+ },
728
+ hasInterceptSlots: !!result.slots,
729
+ pprReplayStatus,
730
+ partialCaptureNeeded,
731
+ partialCaptureKey,
732
+ };
733
+ }
734
+
735
+ // Full render (initial page load)
736
+ const match = yield* step("match", () =>
737
+ matchAndRecordParams(ctx, request, env),
738
+ );
97
739
 
98
- if (match.redirect) {
99
- return createResponseWithMergedHeaders(null, {
740
+ if (match.redirect) {
741
+ return {
742
+ kind: "control",
743
+ response: createResponseWithMergedHeaders(null, {
100
744
  status: 308,
101
745
  headers: { Location: match.redirect },
102
- });
103
- }
746
+ }),
747
+ };
748
+ }
749
+
750
+ // Caching is now handled in router.match() via cache provider in request context
751
+ // match.segments already contains cached or fresh segments as appropriate
752
+
753
+ if (url.searchParams.has("__prerender_collect")) {
754
+ const response = yield* step("prerender-collect", () =>
755
+ collectPrerenderArtifacts(match, handleStore),
756
+ );
757
+ return { kind: "control", response };
758
+ }
759
+
760
+ return {
761
+ kind: "payload",
762
+ payload: buildFullPayload(match, ctx, url, reqCtx, handleStore),
763
+ hasInterceptSlots: false,
764
+ partialCaptureNeeded: false,
765
+ };
766
+ }
767
+
768
+ /**
769
+ * PPR replay match that stamps params/routeName when a replay result exists.
770
+ * A null result records nothing — the fallback match records its own.
771
+ */
772
+ async function matchPartialAndRecordParams<TEnv>(
773
+ ctx: HandlerContext<TEnv>,
774
+ request: Request,
775
+ env: TEnv,
776
+ url: URL,
777
+ reqCtx: RequestContext<any>,
778
+ nonce: string | undefined,
779
+ ): Promise<Awaited<ReturnType<typeof matchPartialWithPprReplay<TEnv>>>> {
780
+ const replay = await matchPartialWithPprReplay(
781
+ ctx,
782
+ request,
783
+ env,
784
+ url,
785
+ reqCtx,
786
+ nonce,
787
+ );
788
+ if (replay.result) {
789
+ setRequestContextParams(replay.result.params, replay.result.routeName);
790
+ }
791
+ return replay;
792
+ }
104
793
 
105
- // Caching is now handled in router.match() via cache provider in request context
106
- // match.segments already contains cached or fresh segments as appropriate
794
+ /**
795
+ * Shell store read that degrades to null on failure (axis 1 MISS, never a 500)
796
+ * and records the raw `ppr:shell-read` outcome (pre-validity-gates, so a
797
+ * version-mismatch lifecycle miss stays distinguishable from a store miss).
798
+ */
799
+ async function readShellEntry<
800
+ TStore extends { getShell(key: string): Promise<unknown> },
801
+ >(
802
+ store: TStore,
803
+ key: string,
804
+ reqCtx: ReturnType<typeof getRequestContext>,
805
+ ): Promise<Awaited<ReturnType<TStore["getShell"]>> | null> {
806
+ let cached: Awaited<ReturnType<TStore["getShell"]>> | null = null;
807
+ const shellReadStart = reqCtx._metricsStore ? performance.now() : 0;
808
+ try {
809
+ // The constraint types the call as Promise<unknown>; the instantiated
810
+ // TStore carries the real entry type, so the assertion restores it.
811
+ cached = (await store.getShell(key)) as Awaited<
812
+ ReturnType<TStore["getShell"]>
813
+ >;
814
+ } catch (error) {
815
+ reportCacheError(error, "cache-read", "[ShellServe] getShell");
816
+ }
817
+ if (reqCtx._metricsStore) {
818
+ appendMetric(
819
+ reqCtx._metricsStore,
820
+ "ppr:shell-read",
821
+ shellReadStart,
822
+ performance.now() - shellReadStart,
823
+ undefined,
824
+ cached ? "hit" : "miss",
825
+ );
826
+ }
827
+ return cached;
828
+ }
107
829
 
108
- if (url.searchParams.has("__prerender_collect")) {
109
- // Build-time prerender collection: serialize segments and handle data
110
- // to JSON for storage as build artifacts. At runtime the worker
111
- // deserializes these and feeds them through the normal segment pipeline.
112
- const nonLoaderSegments = match.segments.filter(
113
- (s) => s.type !== "loader",
830
+ /**
831
+ * Dev Server-Timing mirror (issue #651): a capture completes AFTER its
832
+ * triggering response committed, so its outcome can only ride a LATER
833
+ * response's header. Read-and-clear keeps one capture = one report;
834
+ * dev-only (see takeCaptureDebugEventForTiming).
835
+ */
836
+ function mirrorPprServerTimingsForDev(
837
+ key: string,
838
+ reqCtx: ReturnType<typeof getRequestContext>,
839
+ ): void {
840
+ if (process.env.NODE_ENV !== "production" && reqCtx._metricsStore) {
841
+ const lastCapture = takeCaptureDebugEventForTiming(key);
842
+ if (lastCapture) {
843
+ appendMetric(
844
+ reqCtx._metricsStore,
845
+ "ppr:capture",
846
+ performance.now(),
847
+ lastCapture.attemptMs ?? 0,
848
+ undefined,
849
+ // attemptMs already rides as this entry's dur — drop it from desc.
850
+ describeShellCaptureEvent({ ...lastCapture, attemptMs: undefined }),
114
851
  );
115
- handleStore.seal();
116
- await handleStore.settled;
117
- const { serializeSegments } = await import("../cache/segment-codec.js");
118
- const serializedSegments = await serializeSegments(nonLoaderSegments);
119
- const handles: Record<string, Record<string, unknown[]>> = {};
120
- for (const seg of nonLoaderSegments) {
121
- const segHandles = handleStore.getDataForSegment(seg.id);
122
- if (Object.keys(segHandles).length > 0) {
123
- handles[seg.id] = segHandles;
124
- }
125
- }
126
- return new Response(
127
- JSON.stringify({
128
- segments: serializedSegments,
129
- handles,
130
- routeName: match.routeName,
131
- params: match.params,
132
- }),
133
- { headers: { "Content-Type": "application/json" } },
852
+ }
853
+ // Same mirror for the previous HIT's tail: its per-stage numbers
854
+ // (seed/match/handover/first-html/complete) finished after that
855
+ // response's headers were committed, so they ride THIS request's
856
+ // Server-Timing as `ppr:tail;dur=<complete ms>`.
857
+ const lastTail = takeShellTailTimingForServerTiming(key);
858
+ if (lastTail) {
859
+ appendMetric(
860
+ reqCtx._metricsStore,
861
+ "ppr:tail",
862
+ performance.now(),
863
+ lastTail.completeMs ?? 0,
864
+ undefined,
865
+ // completeMs already rides as this entry's dur — drop it from desc.
866
+ describeShellTailTiming({ ...lastTail, completeMs: undefined }),
134
867
  );
135
- } else {
136
- payload = {
137
- // Initial SSR can reconstruct the tree from segments + rootLayout,
138
- // so we omit root to avoid sending the same structure twice.
139
-
140
- metadata: {
141
- pathname: url.pathname,
142
- routerId: ctx.router.id,
143
- basename: ctx.router.basename,
144
- segments: match.segments,
145
- matched: match.matched,
146
- diff: match.diff,
147
- params: match.params,
148
- isPartial: false,
149
- rootLayout: ctx.router.rootLayout,
150
- handles: handleStore.stream(),
151
- version: ctx.version,
152
- prefetchCacheTTL: ctx.router.prefetchCacheTTL,
153
- themeConfig: ctx.router.themeConfig,
154
- initialTheme: reqCtx.theme,
155
- },
156
- };
157
868
  }
158
869
  }
870
+ }
159
871
 
160
- // For partial requests, include any server-set location state in the payload.
161
- // SSR (full page) requests ignore location state since there's no history.state
162
- // to write to on a fresh page load.
163
- if (isPartial && payload.metadata) {
164
- const locationState = getLocationState();
165
- if (locationState) {
166
- payload.metadata.locationState =
167
- resolveLocationStateEntries(locationState);
872
+ /**
873
+ * Build-time prerender collection: serialize segments and handle data
874
+ * to JSON for storage as build artifacts. At runtime the worker
875
+ * deserializes these and feeds them through the normal segment pipeline.
876
+ */
877
+ async function collectPrerenderArtifacts<TEnv>(
878
+ match: Awaited<ReturnType<HandlerContext<TEnv>["router"]["match"]>>,
879
+ handleStore: ReturnType<typeof getRequestContext>["_handleStore"],
880
+ ): Promise<Response> {
881
+ const nonLoaderSegments = match.segments.filter((s) => s.type !== "loader");
882
+ handleStore.seal();
883
+ await handleStore.settled;
884
+ const { serializeSegments } = await import("../cache/segment-codec.js");
885
+ const serializedSegments = await serializeSegments(nonLoaderSegments);
886
+ const handles: Record<string, Record<string, unknown[]>> = {};
887
+ for (const seg of nonLoaderSegments) {
888
+ const segHandles = handleStore.getDataForSegment(seg.id);
889
+ if (Object.keys(segHandles).length > 0) {
890
+ handles[seg.id] = segHandles;
168
891
  }
169
892
  }
893
+ return new Response(
894
+ JSON.stringify({
895
+ segments: serializedSegments,
896
+ handles,
897
+ routeName: match.routeName,
898
+ params: match.params,
899
+ }),
900
+ { headers: { "Content-Type": "application/json" } },
901
+ );
902
+ }
170
903
 
904
+ /** Assemble headers + tracking and run the foreground stage-driver render. */
905
+ function renderPreparedRscResponse<TEnv>(
906
+ input: RequestRenderInput<TEnv>,
907
+ prepared: Extract<PreparedRender, { kind: "payload" }>,
908
+ ): Promise<Response> {
909
+ const { ctx, request, env, url, isPartial, nonce, reqCtx, renderSpan } =
910
+ input;
911
+ const { payload, pprReplayStatus, hasInterceptSlots } = prepared;
171
912
  const metricsStore = reqCtx._metricsStore;
172
- const renderStart = performance.now();
173
-
174
- // Serialize to RSC stream
175
- const rscSerializeStart = performance.now();
176
- const rscStream = ctx.renderToReadableStream<RscPayload>(payload, {
177
- onError: (error: unknown) => {
178
- ctx.callOnError(error, "rendering", { request, url, env });
179
- },
180
- });
181
- const rscSerializeDur = performance.now() - rscSerializeStart;
182
- // This measures synchronous stream creation, not end-to-end stream consumption.
183
- appendMetric(
184
- metricsStore,
185
- "rsc-serialize",
186
- rscSerializeStart,
187
- rscSerializeDur,
188
- );
189
913
 
190
- // Determine if this is an RSC request or HTML request.
191
- // Partial requests (_rsc_partial) are always RSC -- they come from client-side
192
- // navigation or prefetch fetch(). We cannot rely on Accept alone since some
193
- // browsers may send Accept: text/html for non-HTML requests.
194
- const isRscRequest =
195
- isPartial ||
196
- (!request.headers.get("accept")?.includes("text/html") &&
197
- !url.searchParams.has("__html")) ||
198
- url.searchParams.has("__rsc");
199
-
200
- if (isRscRequest) {
201
- const renderDur = performance.now() - renderStart;
202
- appendMetric(metricsStore, "render:total", renderStart, renderDur);
203
- const rscHeaders: Record<string, string> = {
204
- "content-type": "text/x-component;charset=utf-8",
205
- vary: "accept, X-Rango-State, X-RSC-Router-Client-Path",
206
- };
207
- // Enable browser HTTP caching for prefetch responses only.
208
- // Requires X-Rango-Prefetch header (sent by Link prefetch fetch),
209
- // non-intercept context (intercept responses depend on source page),
210
- // and a configured cache-control value (false disables caching).
211
- const isPrefetch = request.headers.has("X-Rango-Prefetch");
212
- if (isPrefetch && isPartial && !hasInterceptSlots) {
213
- const cc = ctx.router.prefetchCacheControl;
214
- if (cc) {
215
- rscHeaders["cache-control"] = cc;
216
- }
914
+ const rscHeaders: Record<string, string> = {
915
+ "content-type": "text/x-component;charset=utf-8",
916
+ vary: `accept, X-Rango-State, X-RSC-Router-Client-Path, ${SEGMENT_FRAGMENT_CAPABILITY_HEADER}, ${SEGMENT_FRAGMENT_RECOVERY_HEADER}`,
917
+ // Router identity, so the client can verify pre-decode (before importing
918
+ // chunks) that this content payload belongs to its app and refuse a
919
+ // foreign one (cache/proxy/bug). Control-only reload/redirect responses
920
+ // are deliberately NOT stamped. See browser/response-adapter.ts.
921
+ "X-RSC-Router-Id": ctx.router.id,
922
+ };
923
+ if (pprReplayStatus) {
924
+ rscHeaders[PPR_REPLAY_STATUS_HEADER] =
925
+ serializePprReplayStatus(pprReplayStatus);
926
+ }
927
+ // Tell the client's prefetch cache to scope this response to its source
928
+ // URL (instead of the default source-agnostic wildcard). Intercept
929
+ // responses depend on the source page matching an intercept rule, so
930
+ // they must not be reused for navigations from other sources.
931
+ if (hasInterceptSlots) {
932
+ rscHeaders["x-rsc-prefetch-scope"] = "source";
933
+ }
934
+ // Enable browser HTTP caching for prefetch responses only.
935
+ // Requires X-Rango-Prefetch header (sent by Link prefetch fetch),
936
+ // non-intercept context (intercept responses depend on source page),
937
+ // and a configured cache-control value (false disables caching).
938
+ const isPrefetch = request.headers.has("X-Rango-Prefetch");
939
+ if (isPrefetch && isPartial && !hasInterceptSlots) {
940
+ const cc = ctx.router.prefetchCacheControl;
941
+ if (cc) {
942
+ rscHeaders["cache-control"] = cc;
217
943
  }
218
- return createResponseWithMergedHeaders(rscStream, {
219
- headers: rscHeaders,
220
- });
221
944
  }
222
945
 
223
- // Delegate to SSR for HTML response (reuse early setup if available)
224
- const [ssrModule, streamMode] = await getSSRSetup(
946
+ const isFlightResponse = isRscRequest(request, url, isPartial);
947
+ const stageTracking = {
948
+ mode: isPartial ? ("partial" as const) : ("full" as const),
949
+ routeKey: reqCtx._routeName,
950
+ span: renderSpan,
951
+ onEvent:
952
+ reqCtx._activeRoutine &&
953
+ createRenderStageTraceBridge(reqCtx._activeRoutine),
954
+ };
955
+ return renderRscResponse(
956
+ {
957
+ ctx,
958
+ request,
959
+ env,
960
+ url,
961
+ payload,
962
+ init: { headers: rscHeaders },
963
+ tracking: stageTracking,
964
+ },
965
+ isFlightResponse
966
+ ? undefined
967
+ : {
968
+ html: createSsrHtmlStage({
969
+ ctx,
970
+ request,
971
+ env,
972
+ url,
973
+ metricsStore,
974
+ render: { nonce },
975
+ init: { headers: { "content-type": "text/html;charset=utf-8" } },
976
+ }),
977
+ },
978
+ );
979
+ }
980
+
981
+ /**
982
+ * Background capture for a navigation-only shell (partial replay reported
983
+ * captureNeeded). SSR setup is resolved lazily inside the capture because the
984
+ * partial request itself never touched HTML rendering.
985
+ */
986
+ function scheduleNavigationShellCapture<TEnv>(
987
+ input: RequestRenderInput<TEnv>,
988
+ partialCaptureKey: string | undefined,
989
+ ): void {
990
+ const { ctx, request, env, url, reqCtx } = input;
991
+ const pprConfig = resolvePprConfig(reqCtx._classifiedRoute?.manifestEntry)!;
992
+ const store = reqCtx._cacheStore!;
993
+ scheduleShellCapture(
225
994
  ctx,
226
995
  request,
227
996
  env,
228
997
  url,
229
- metricsStore,
998
+ reqCtx,
999
+ async (captureRequest, captureUrl) => {
1000
+ const [ssrModule, streamMode] = await getSSRSetup(
1001
+ ctx,
1002
+ captureRequest,
1003
+ env,
1004
+ captureUrl,
1005
+ undefined,
1006
+ );
1007
+ return streamMode === "allReady" ? null : ssrModule;
1008
+ },
1009
+ createShellCaptureDescriptor(
1010
+ ctx,
1011
+ partialCaptureKey ??
1012
+ buildNavigationShellKey(url, reqCtx._searchParamsFilter),
1013
+ shellSearchSeed(url, reqCtx._searchParamsFilter),
1014
+ url.origin,
1015
+ pprConfig,
1016
+ store,
1017
+ true,
1018
+ ),
230
1019
  );
1020
+ }
231
1021
 
232
- const ssrRenderStart = performance.now();
233
- const htmlStream = await ssrModule.renderHTML(rscStream, {
234
- nonce,
235
- streamMode,
1022
+ /**
1023
+ * Reuse a PPR capture's canonical segment record for a partial navigation.
1024
+ * The ordinary matchPartial pipeline remains authoritative: it projects the
1025
+ * cached target tree against the client's segment ids, evaluates revalidation,
1026
+ * and resolves every loader fresh. Only segment-family records are seeded;
1027
+ * captured item/response/loader values belong to document parity and must not
1028
+ * pin navigation data.
1029
+ */
1030
+ async function matchPartialWithPprReplay<TEnv>(
1031
+ ctx: HandlerContext<TEnv>,
1032
+ request: Request,
1033
+ env: TEnv,
1034
+ url: URL,
1035
+ reqCtx: RequestContext<any>,
1036
+ nonce: string | undefined,
1037
+ ) {
1038
+ const replayStart = reqCtx._metricsStore ? performance.now() : 0;
1039
+ const recordReplayStatus = (status: PprReplayStatus): void => {
1040
+ if (!reqCtx._metricsStore) return;
1041
+ appendMetric(
1042
+ reqCtx._metricsStore,
1043
+ "ppr:navigation-replay",
1044
+ replayStart,
1045
+ performance.now() - replayStart,
1046
+ undefined,
1047
+ describePprReplayStatus(status),
1048
+ );
1049
+ };
1050
+ const finalizeReplayStatus = (status: PprReplayStatus): PprReplayStatus => {
1051
+ const finalStatus = reclassifyReplayStatus(reqCtx, status);
1052
+ recordReplayStatus(finalStatus);
1053
+ return finalStatus;
1054
+ };
1055
+ let armFragments = false;
1056
+ /**
1057
+ * Every matchPartial in this function runs through this helper so the
1058
+ * fragment flag (#700 passthrough, armed below the navigation-context gate)
1059
+ * can never outlive a match or miss a lane — a thrown-Response redirect
1060
+ * exit included. Mutate-restore on the SHARED reqCtx, never a derived
1061
+ * context: the pipeline writes ambient state during the match that must
1062
+ * land on reqCtx (_pprReplayPostMatchReason, location state,
1063
+ * _treeHasStreaming read by the render-barrier closure). Assign-back
1064
+ * restore leaves an own `undefined` after the first arm, matching the
1065
+ * _shellImplicitCache idiom.
1066
+ */
1067
+ const matchPartialForReplay = async () => {
1068
+ if (!armFragments) return ctx.router.matchPartial(request, { env });
1069
+ const prevFragmentPayload = reqCtx._shellFragmentPayload;
1070
+ reqCtx._shellFragmentPayload = true;
1071
+ try {
1072
+ return await ctx.router.matchPartial(request, { env });
1073
+ } finally {
1074
+ reqCtx._shellFragmentPayload = prevFragmentPayload;
1075
+ }
1076
+ };
1077
+ const runMatch = async (status?: PprReplayStatus) => {
1078
+ const result = await matchPartialForReplay();
1079
+ // The match may have settled a fact the pre-match gate could only guess
1080
+ // at (prerender serve, intercept resolution) — report the truth.
1081
+ const finalStatus = status ? finalizeReplayStatus(status) : undefined;
1082
+ return { result, status: finalStatus };
1083
+ };
1084
+ const pprConfig = resolvePprConfig(reqCtx._classifiedRoute?.manifestEntry);
1085
+ const activeNonce = nonce ?? contextGet(reqCtx._variables, nonceToken);
1086
+ const store = reqCtx._cacheStore;
1087
+
1088
+ if (!pprConfig) return runMatch();
1089
+ if (request.method !== "GET") {
1090
+ return runMatch({ outcome: "BYPASS", reason: "method" });
1091
+ }
1092
+ if (reqCtx._dynamic) {
1093
+ return runMatch({ outcome: "BYPASS", reason: "dynamic" });
1094
+ }
1095
+ if (activeNonce !== undefined) {
1096
+ return runMatch({ outcome: "BYPASS", reason: "nonce" });
1097
+ }
1098
+ if (!hasShellFamily(store)) {
1099
+ return runMatch({ outcome: "BYPASS", reason: "store-unavailable" });
1100
+ }
1101
+ if (store.supportsPassiveShellReads !== true) {
1102
+ return runMatch({
1103
+ outcome: "BYPASS",
1104
+ reason: "passive-read-unsupported",
1105
+ });
1106
+ }
1107
+ // A partial without navigation context (curl probes, synthetic monitors)
1108
+ // can never produce a partial match — createMatchContextForPartial returns
1109
+ // null and the seeded record could not have been consulted, which used to
1110
+ // read as a misleading `snapshot-miss` AFTER two wasted getShell reads.
1111
+ // Same predicate as resolveNavigation, decided before any store I/O.
1112
+ if (!getNavigationContextHeader(request)) {
1113
+ return runMatch({ outcome: "BYPASS", reason: "no-navigation-context" });
1114
+ }
1115
+ // Fragment passthrough (#700), extended to partial replay. Navigation
1116
+ // context proves the request can be matched; the separate capability header
1117
+ // proves its payload consumer can expand envelopes. Older clients and the
1118
+ // one-shot corruption recovery request still replay the same segment record,
1119
+ // but through the server decode path.
1120
+ armFragments =
1121
+ request.headers.get(SEGMENT_FRAGMENT_RECOVERY_HEADER) !== "1" &&
1122
+ request.headers.get(SEGMENT_FRAGMENT_CAPABILITY_HEADER) === "1";
1123
+ // The prerender probe and the cache-opt-out gate below both need the
1124
+ // classified snapshot; resolve (and persist) it once.
1125
+ const routeSnapshot = classifiedRouteSnapshot(reqCtx);
1126
+ // Prerender routes short-circuit in withCacheLookup and serve the partial
1127
+ // from build-time segments — a better-than-HIT outcome. Their captures
1128
+ // record no doc segment record (withCacheStore skips on the prerender hit),
1129
+ // so seeding could never succeed; skip the reads and report the store that
1130
+ // actually serves instead of blaming a "broken" capture. Bypass ONLY when
1131
+ // the baked artifact actually exists — the trie's pr flag alone is not a
1132
+ // serve guarantee: a Passthrough(Prerender()) route with an unbaked or
1133
+ // ctx.passthrough()-skipped param misses the store and renders live, and
1134
+ // replay (including its heal capture) must stay available for it. The
1135
+ // probe goes through the same memoized store the middleware serves from.
1136
+ // Shared predicate with the middleware (it declines on dev HMR — such
1137
+ // partials fall through to the ordinary replay decision here too).
1138
+ //
1139
+ // The probe is a PRE-match fast path, not the truth: it reads only the
1140
+ // non-intercept artifact, and whether the navigation IS an intercept (and
1141
+ // therefore whether tryPrerenderLookup reads `paramHash` or
1142
+ // `paramHash + "/i"`) is resolved during the match by match-api's
1143
+ // findInterceptForRoute — an intercept-source header proves nothing in
1144
+ // either direction. runMatch reclassifies every BYPASS from the stamped
1145
+ // post-match facts (reclassifyReplayStatus), so a wrong guess here can
1146
+ // skip the two getShell reads but never mis-report or mis-heal.
1147
+ if (
1148
+ prerenderStoreShortCircuits(routeSnapshot?.matched?.pr, request) &&
1149
+ (await prerenderEntryExists(
1150
+ routeSnapshot?.matched?.routeKey,
1151
+ routeSnapshot?.params ?? {},
1152
+ url.pathname,
1153
+ routeSnapshot?.entries ?? [],
1154
+ ))
1155
+ ) {
1156
+ return runMatch({ outcome: "BYPASS", reason: "prerender-store" });
1157
+ }
1158
+ // Consumer cache opt-outs are absolute: a STATICALLY disabled scope
1159
+ // (cache(false)) bypasses before any shell read — no heal capture (its
1160
+ // snapshot would be equally unusable). A `condition()` predicate is
1161
+ // request-time state and must NOT be pre-decided here: evaluating it at the
1162
+ // gate and again at the lookup lets a false-then-true flap report
1163
+ // cache-disabled while the explicit tier serves. The lookup's own
1164
+ // evaluation governs (withCacheLookup fires the marker's onExplicitBypass,
1165
+ // reported as cache-disabled post-match).
1166
+ const routeCacheScope = routeSnapshot?.cacheScope ?? null;
1167
+ if (routeCacheScope && !routeCacheScope.enabled) {
1168
+ return runMatch({ outcome: "BYPASS", reason: "cache-disabled" });
1169
+ }
1170
+
1171
+ const key = buildShellKey(url, reqCtx._searchParamsFilter);
1172
+ const navigationKey = `${key}:navigation`;
1173
+ let cached: Awaited<ReturnType<typeof store.getShell>> = null;
1174
+ try {
1175
+ cached = await store.getShell(key, { claimRevalidation: false });
1176
+ } catch (error) {
1177
+ reportCacheError(error, "cache-read", "[NavigationPPR] getShell");
1178
+ return runMatch({ outcome: "BYPASS", reason: "read-error" });
1179
+ }
1180
+
1181
+ let bypassReason: PprReplayBypassReason | undefined;
1182
+ let snapshot: ShellSnapshotRecord[] | undefined;
1183
+ let snapshotStoreKey: string | undefined;
1184
+ let freshness: "fresh" | "stale" = "fresh";
1185
+ if (cached) {
1186
+ const decision = replayableShellSnapshot(cached.entry, ctx.version);
1187
+ if ("snapshot" in decision) {
1188
+ snapshot = decision.snapshot;
1189
+ snapshotStoreKey = key;
1190
+ freshness = cached.shouldRevalidate ? "stale" : "fresh";
1191
+ } else {
1192
+ bypassReason = decision.reason;
1193
+ }
1194
+ }
1195
+
1196
+ if (
1197
+ !snapshot &&
1198
+ bypassReason !== "handler-live-holes" &&
1199
+ bypassReason !== "transition-when"
1200
+ ) {
1201
+ let navigationCached: Awaited<ReturnType<typeof store.getShell>> = null;
1202
+ try {
1203
+ navigationCached = await store.getShell(navigationKey, {
1204
+ claimRevalidation: false,
1205
+ });
1206
+ } catch (error) {
1207
+ reportCacheError(error, "cache-read", "[NavigationPPR] getShell");
1208
+ return runMatch({ outcome: "BYPASS", reason: "read-error" });
1209
+ }
1210
+ if (navigationCached) {
1211
+ const decision = replayableShellSnapshot(
1212
+ navigationCached.entry,
1213
+ ctx.version,
1214
+ );
1215
+ if ("snapshot" in decision) {
1216
+ snapshot = decision.snapshot;
1217
+ snapshotStoreKey = navigationKey;
1218
+ freshness = navigationCached.shouldRevalidate ? "stale" : "fresh";
1219
+ } else {
1220
+ bypassReason = decision.reason;
1221
+ }
1222
+ }
1223
+ }
1224
+
1225
+ if (!snapshot) {
1226
+ // Production build manifests are local module data. In dev, resolving a
1227
+ // missing build shell would foreground-fetch /__rsc_shell and block an
1228
+ // otherwise ordinary navigation on capture, so replay remains runtime-only.
1229
+ const buildHit = await lookupBuildShell(
1230
+ url,
1231
+ ctx.version,
1232
+ store,
1233
+ undefined,
1234
+ reqCtx._searchParamsFilter,
1235
+ );
1236
+ if (buildHit?.stale) {
1237
+ bypassReason ??= "stale-build-entry";
1238
+ } else if (buildHit) {
1239
+ const buildDecision = replayableShellSnapshot(
1240
+ buildHit.entry,
1241
+ ctx.version,
1242
+ );
1243
+ if ("snapshot" in buildDecision) {
1244
+ snapshot = buildDecision.snapshot;
1245
+ } else {
1246
+ bypassReason ??= buildDecision.reason;
1247
+ }
1248
+ }
1249
+ }
1250
+
1251
+ if (!snapshot) {
1252
+ // Report-only marker for routes with an ENABLED route-derived scope: the
1253
+ // lookup's own outcome must stay reportable even without a replayable
1254
+ // snapshot. An always-false condition() route never produces a doc
1255
+ // record (the consumer's write refusal is absolute — see
1256
+ // recordShellCaptureDocRecord), so without this its lookup-time refusal
1257
+ // would be misreported as the eligibility reason and heal captures would
1258
+ // be scheduled for snapshots that can never become consumable. The
1259
+ // marker carries NO store: the seeded fallback in withCacheLookup
1260
+ // requires one, so nothing can be served through it — it only reports.
1261
+ // Bare routes never see it (an installed marker would otherwise mint an
1262
+ // implicit scope over the REAL doc: partition in
1263
+ // resolveShellImplicitCacheScope).
1264
+ if (routeCacheScope?.enabled) {
1265
+ let explicitCacheHit = false;
1266
+ let explicitCacheBypass = false;
1267
+ const previousImplicitCache = reqCtx._shellImplicitCache;
1268
+ reqCtx._shellImplicitCache = {
1269
+ onExplicitHit: () => {
1270
+ explicitCacheHit = true;
1271
+ },
1272
+ onExplicitBypass: () => {
1273
+ explicitCacheBypass = true;
1274
+ },
1275
+ };
1276
+ try {
1277
+ const result = await matchPartialForReplay();
1278
+ const provisionalStatus: PprReplayStatus = explicitCacheBypass
1279
+ ? { outcome: "BYPASS", reason: "cache-disabled" }
1280
+ : explicitCacheHit
1281
+ ? { outcome: "BYPASS", reason: "explicit-cache-hit" }
1282
+ : { outcome: "BYPASS", reason: bypassReason ?? "no-entry" };
1283
+ const status = finalizeReplayStatus(provisionalStatus);
1284
+ return {
1285
+ result,
1286
+ status,
1287
+ // A lookup-time opt-out makes every heal snapshot unusable
1288
+ // (recordShellCaptureDocRecord refuses under the same predicate),
1289
+ // and a prerender-served or intercept match never consults a heal
1290
+ // snapshot at all. Otherwise heal the shouldHealReplayMiss set PLUS
1291
+ // `no-segment-snapshot`: an entry captured while condition() was
1292
+ // false legitimately lacks a snapshot, and a later request whose
1293
+ // lookup did NOT refuse (condition true now) can heal it — the
1294
+ // capture derives from THIS request's context, so its doc record
1295
+ // records. Excluding it left replay dead until the document
1296
+ // recaptured. The always-false route stays protected: its every
1297
+ // lookup refuses, so explicitCacheBypass suppresses the heal.
1298
+ captureNeeded:
1299
+ !explicitCacheBypass &&
1300
+ reqCtx._pprReplayPostMatchReason === undefined &&
1301
+ (shouldHealReplayMiss(bypassReason) ||
1302
+ bypassReason === "no-segment-snapshot"),
1303
+ };
1304
+ } finally {
1305
+ reqCtx._shellImplicitCache = previousImplicitCache;
1306
+ }
1307
+ }
1308
+ const match = await runMatch({
1309
+ outcome: "BYPASS",
1310
+ reason: bypassReason ?? "no-entry",
1311
+ });
1312
+ return {
1313
+ ...match,
1314
+ captureNeeded:
1315
+ reqCtx._pprReplayPostMatchReason === undefined &&
1316
+ shouldHealReplayMiss(bypassReason),
1317
+ };
1318
+ }
1319
+
1320
+ const previousImplicitCache = reqCtx._shellImplicitCache;
1321
+ let segmentReplayHit = false;
1322
+ let segmentReplayCorrupt = false;
1323
+ let explicitCacheHit = false;
1324
+ let explicitCacheBypass = false;
1325
+ reqCtx._shellImplicitCache = {
1326
+ ttl: pprConfig.ttl,
1327
+ swr: pprConfig.swr,
1328
+ store: new SeededShellStore(store, snapshot, {
1329
+ segmentsOnly: true,
1330
+ }),
1331
+ keyPrefix: "doc",
1332
+ onHit: () => {
1333
+ segmentReplayHit = true;
1334
+ },
1335
+ onCorrupt: () => {
1336
+ segmentReplayCorrupt = true;
1337
+ },
1338
+ // Arms the explicit-scope composition in withCacheLookup: a route-derived
1339
+ // cache() scope stays authoritative, the seeded doc record supplies the
1340
+ // match only on its miss. An explicit-tier hit must NOT report a replay
1341
+ // HIT — it served under the consumer's own semantics.
1342
+ onExplicitHit: () => {
1343
+ explicitCacheHit = true;
1344
+ },
1345
+ // Lookup-time condition() refusal (or a scope with no store): the gate
1346
+ // deliberately does not pre-decide predicates, so the truthful
1347
+ // cache-disabled report comes from the lookup that actually refused.
1348
+ onExplicitBypass: () => {
1349
+ explicitCacheBypass = true;
1350
+ },
1351
+ };
1352
+
1353
+ try {
1354
+ const result = await matchPartialForReplay();
1355
+ const provisionalStatus: PprReplayStatus = segmentReplayHit
1356
+ ? { outcome: "HIT", freshness }
1357
+ : explicitCacheHit
1358
+ ? { outcome: "BYPASS", reason: "explicit-cache-hit" }
1359
+ : explicitCacheBypass
1360
+ ? { outcome: "BYPASS", reason: "cache-disabled" }
1361
+ : { outcome: "BYPASS", reason: "snapshot-miss" };
1362
+ // A prerender serve or intercept resolution leaves the seeded record
1363
+ // unconsulted (prerender short-circuits before the scope; intercepts
1364
+ // keep snapshot.cacheScope) — the "snapshot-miss" guess would blame the
1365
+ // capture for a lane that was never in play.
1366
+ const status = finalizeReplayStatus(provisionalStatus);
1367
+ return {
1368
+ result,
1369
+ status,
1370
+ captureNeeded:
1371
+ segmentReplayCorrupt && reqCtx._pprReplayPostMatchReason === undefined,
1372
+ // A corrupt document snapshot must be overwritten at the document key;
1373
+ // writing only the secondary navigation key would leave the preferred
1374
+ // document entry shadowing the repair forever. The capture remains marked
1375
+ // navigationOnly, so a document request ignores it and recaptures a
1376
+ // document-safe shell under the same key.
1377
+ captureKey: segmentReplayCorrupt ? snapshotStoreKey : undefined,
1378
+ };
1379
+ } finally {
1380
+ reqCtx._shellImplicitCache = previousImplicitCache;
1381
+ }
1382
+ }
1383
+
1384
+ /**
1385
+ * The full route snapshot for the classified route, or null when
1386
+ * classification is unavailable (the gates then fall open to the ordinary
1387
+ * replay decision). Persists the enriched snapshot back onto
1388
+ * `_classifiedRoute` so the manifest-chain walk runs once per request:
1389
+ * matchPartial's createMatchContextForPartial re-reads `_classifiedRoute` and
1390
+ * calls ensureFullRouteSnapshot again, and the write-back lets that call hit
1391
+ * the entries-already-built fast path and reuse this same scope chain instead
1392
+ * of rebuilding it.
1393
+ */
1394
+ function classifiedRouteSnapshot(
1395
+ reqCtx: RequestContext<any>,
1396
+ ): RouteSnapshot<any> | null {
1397
+ const classified = reqCtx._classifiedRoute;
1398
+ if (!classified?.manifestEntry) return null;
1399
+ const full = ensureFullRouteSnapshot({
1400
+ ...classified,
1401
+ entries: classified.entries ?? [],
236
1402
  });
237
- const ssrRenderDur = performance.now() - ssrRenderStart;
238
- appendMetric(metricsStore, "ssr-render-html", ssrRenderStart, ssrRenderDur);
1403
+ reqCtx._classifiedRoute = full;
1404
+ return full;
1405
+ }
239
1406
 
240
- const renderDur = performance.now() - renderStart;
241
- appendMetric(metricsStore, "render:total", renderStart, renderDur);
1407
+ /**
1408
+ * Neutralize the shell-HIT degradation redirect target. The inline
1409
+ * `location.replace` in a committed 200 body bypasses the 3xx chokepoint
1410
+ * (guardOutgoingRedirect only sees 3xx + Location), so this reuses the same
1411
+ * same-origin resolver directly: unsafe targets neutralize to the
1412
+ * redirect-guard.ts landing instead of navigating the user off-host.
1413
+ */
1414
+ export function resolveShellHitRedirectTarget(
1415
+ rawTarget: string,
1416
+ requestOrigin: string,
1417
+ basename: string | undefined,
1418
+ ): string {
1419
+ return (
1420
+ resolveSameOriginRedirect(rawTarget, requestOrigin) ??
1421
+ safeSameOriginLanding(basename)
1422
+ );
1423
+ }
1424
+
1425
+ /**
1426
+ * Serve a validated shell HIT: commit the stored prelude bytes NOW and run the
1427
+ * live tail behind them inside the response stream. Plain byte concatenation is
1428
+ * correct — React foster-parents content streamed after the prelude's closing
1429
+ * `</body></html>`. After the flush a failing hole cannot become a 500/redirect
1430
+ * (error UI renders inline — the documented PPR constraint). The tail promise
1431
+ * is kicked off SYNCHRONOUSLY so it runs inside the current ALS request-context
1432
+ * frame; the adapter may pull the stream outside it.
1433
+ */
1434
+ function serveShellHit(
1435
+ ctx: HandlerContext<any>,
1436
+ request: Request,
1437
+ env: any,
1438
+ url: URL,
1439
+ reqCtx: RequestContext<any>,
1440
+ handleStore: ReturnType<typeof getRequestContext>["_handleStore"],
1441
+ ssrModule: SSRModule,
1442
+ entry: DocumentShellCacheEntry,
1443
+ descriptor: ShellCaptureDescriptor,
1444
+ ): Response {
1445
+ const preludeBytes = base64ToBytes(entry.prelude);
1446
+ // Per-stage tail timing for the dev `ppr:tail` Server-Timing mirror. Dev
1447
+ // only (NODE_ENV folds the branch away in production builds); offsets are
1448
+ // relative to this commit point.
1449
+ const tailTiming: ShellTailTiming | null =
1450
+ process.env.NODE_ENV !== "production"
1451
+ ? {
1452
+ key: descriptor.key,
1453
+ outcome: "complete",
1454
+ preludeBytes: preludeBytes.length,
1455
+ }
1456
+ : null;
1457
+ const tailT0 = tailTiming ? performance.now() : 0;
242
1458
 
243
- return createResponseWithMergedHeaders(htmlStream, {
244
- headers: { "content-type": "text/html;charset=utf-8" },
1459
+ const createTailContext = (): RequestContext<any> => {
1460
+ const tailCtx: RequestContext<any> = Object.create(reqCtx);
1461
+ // Matching writes render state onto the derived context. Its barrier must
1462
+ // close over that same context or a streaming tail inherits the base
1463
+ // context's premature non-streaming handle snapshot.
1464
+ wireRenderBarrier(tailCtx, handleStore);
1465
+ return tailCtx;
1466
+ };
1467
+
1468
+ const renderTail = async (
1469
+ activeCtx: RequestContext<any>,
1470
+ ): Promise<ReadableStream<Uint8Array> | { redirect: string }> => {
1471
+ const matchStart = INTERNAL_RANGO_DEBUG ? performance.now() : 0;
1472
+ const match = await ctx.router.match(request, { env });
1473
+ if (tailTiming) {
1474
+ tailTiming.matchMs = Math.round(performance.now() - tailT0);
1475
+ }
1476
+ if (INTERNAL_RANGO_DEBUG) {
1477
+ console.log(
1478
+ `[Server][ppr] shell HIT: tail match done +${Math.round(performance.now() - matchStart)}ms (abs ${Math.round(performance.now())}, started ${Math.round(matchStart)})`,
1479
+ );
1480
+ }
1481
+ if (match.redirect) return { redirect: match.redirect };
1482
+ setRequestContextParams(match.params, match.routeName);
1483
+ const payload = buildFullPayload(match, ctx, url, activeCtx, handleStore);
1484
+ // Theme fidelity for resume: replay the CAPTURE's initialTheme into the
1485
+ // payload so the resume/hydration trees match the frozen prelude by
1486
+ // construction. The visitor still sees THEIR theme — the prelude's FOUC
1487
+ // script applies the cookie pre-paint and ThemeProvider re-syncs post-mount.
1488
+ if (payload.metadata) {
1489
+ payload.metadata.initialTheme = entry.initialTheme as
1490
+ | import("../theme/types.js").Theme
1491
+ | undefined;
1492
+ }
1493
+ // Full Flight render per request: hydration needs the whole payload (there
1494
+ // is no Flight-side resume — a React limitation, not ours).
1495
+ const flightStage = renderRscFlightStage({
1496
+ ctx,
1497
+ request,
1498
+ env,
1499
+ url,
1500
+ payload,
1501
+ tracking: {
1502
+ mode: "full",
1503
+ routeKey: activeCtx._routeName,
1504
+ },
1505
+ });
1506
+ let rscStream = flightStage.stream;
1507
+ // Timing tap: when does the Flight render produce its FIRST byte? Compared
1508
+ // with the eager-inject/first-tail logs this proves whether hydration-start
1509
+ // latency is genuine server work (loaders) or stream plumbing holding
1510
+ // ready bytes back.
1511
+ if (INTERNAL_RANGO_DEBUG) {
1512
+ const tapStart = performance.now();
1513
+ let first = false;
1514
+ rscStream = rscStream.pipeThrough(
1515
+ new TransformStream({
1516
+ transform(chunk, controller) {
1517
+ if (!first) {
1518
+ first = true;
1519
+ console.log(
1520
+ `[Server][ppr] flight render: first chunk +${Math.round(performance.now() - tapStart)}ms (abs ${Math.round(performance.now())})`,
1521
+ );
1522
+ }
1523
+ controller.enqueue(chunk);
1524
+ },
1525
+ }),
1526
+ );
1527
+ }
1528
+ return observePhase(PHASES.ssr, () =>
1529
+ ssrModule.resumeShellHTML!(rscStream, {
1530
+ postponed: entry.postponed,
1531
+ nonce: undefined,
1532
+ // The shell key's own search — identical to the capture seed for
1533
+ // this key, so the resume tree matches the captured tree.
1534
+ search: shellSearchSeed(url, reqCtx._searchParamsFilter),
1535
+ // The HIT request's origin — same host as the capture's (key-scoped).
1536
+ origin: url.origin,
1537
+ }),
1538
+ );
1539
+ };
1540
+
1541
+ const tailPromise: Promise<
1542
+ ReadableStream<Uint8Array> | { redirect: string }
1543
+ > = (async () => {
1544
+ // Snapshot seeding (docs/design/ppr-shell-resume.md): the tail render must
1545
+ // match the frozen prelude, so pinned cache reads replay their capture-time
1546
+ // values via a SeededShellStore overlay while unpinned reads (the holes)
1547
+ // stay live. The overlay lives on a DERIVED context so the shared reqCtx is
1548
+ // untouched.
1549
+ if (entry.snapshot && entry.snapshot.length > 0) {
1550
+ const seededCtx = createTailContext();
1551
+ if (reqCtx._cacheStore) {
1552
+ seededCtx._cacheStore = new SeededShellStore(
1553
+ reqCtx._cacheStore,
1554
+ entry.snapshot,
1555
+ );
1556
+ }
1557
+ // Loader-family records (bake-lane containers, loader-container-bake):
1558
+ // decode into a seed Map for the resolveLoaderData overlay, so the
1559
+ // payload's baked container bytes match the frozen prelude while the
1560
+ // hole-marker paths keep the fresh run's live nested promises.
1561
+ const seedStart = INTERNAL_RANGO_DEBUG ? performance.now() : 0;
1562
+ const loaderSeed = await buildShellLoaderSeed(entry.snapshot);
1563
+ if (tailTiming) {
1564
+ tailTiming.seedMs = Math.round(performance.now() - tailT0);
1565
+ }
1566
+ if (INTERNAL_RANGO_DEBUG) {
1567
+ console.log(
1568
+ `[Server][ppr] shell HIT: loader seed built +${Math.round(performance.now() - seedStart)}ms (abs ${Math.round(performance.now())})`,
1569
+ );
1570
+ }
1571
+ if (loaderSeed) seededCtx._shellLoaderSeed = loaderSeed;
1572
+ // Shell fast path (serve side): if the capture recorded the implicit doc
1573
+ // segment record and the handler layer declared no liveness, the tail's
1574
+ // cache lookup HITs the seeded doc entry — the handler layer is REPLAYED,
1575
+ // not re-executed (loaders still run fresh). Anything else degrades to
1576
+ // the full tail automatically.
1577
+ if (!entry.handlerLiveHoles && !entry.transitionWhen) {
1578
+ seededCtx._shellImplicitCache = {
1579
+ ttl: descriptor.ttl,
1580
+ swr: descriptor.swr,
1581
+ keyPrefix: "doc",
1582
+ };
1583
+ if (INTERNAL_RANGO_DEBUG) {
1584
+ console.log(
1585
+ `[Server][ppr] shell HIT: fast path armed (implicit doc cache) (abs ${Math.round(performance.now())})`,
1586
+ );
1587
+ }
1588
+ } else if (INTERNAL_RANGO_DEBUG) {
1589
+ console.log(
1590
+ `[Server][ppr] shell HIT: fast path declined — request-dependent handler/transition state; tail re-runs handlers (abs ${Math.round(performance.now())})`,
1591
+ );
1592
+ }
1593
+ // Fragment splice (issue #700): store hits in THIS tail emit their stored
1594
+ // segment fragments verbatim (expanded by segment-fragments.ts). The flag
1595
+ // lives on the derived context so it can never leak into a capture render,
1596
+ // which serializes segments and must see real elements.
1597
+ seededCtx._shellFragmentPayload = true;
1598
+ return runWithRequestContext(seededCtx, () => renderTail(seededCtx));
1599
+ }
1600
+ // No snapshot (e.g. a producer B entry): still a shell-HIT tail, so arm the
1601
+ // fragment splice on a derived context — never the shared reqCtx, from which
1602
+ // scheduleShellCapture derives the capture context (the flag must not be
1603
+ // inherited there).
1604
+ const fragmentCtx = createTailContext();
1605
+ fragmentCtx._shellFragmentPayload = true;
1606
+ return runWithRequestContext(fragmentCtx, () => renderTail(fragmentCtx));
1607
+ })();
1608
+ // The stream below is the only consumer; pre-attach a no-op catch so a tail
1609
+ // failure before the stream is pulled never surfaces as an unhandled rejection.
1610
+ tailPromise.catch(() => {});
1611
+
1612
+ const serveStart = INTERNAL_RANGO_DEBUG ? performance.now() : 0;
1613
+ const body = new ReadableStream<Uint8Array>({
1614
+ async start(controller) {
1615
+ controller.enqueue(preludeBytes);
1616
+ if (INTERNAL_RANGO_DEBUG) {
1617
+ console.log(
1618
+ `[Server][ppr] shell HIT: prelude enqueued (${preludeBytes.length}b) +${Math.round(performance.now() - serveStart)}ms`,
1619
+ );
1620
+ }
1621
+ try {
1622
+ const tail = await tailPromise;
1623
+ if (tailTiming) {
1624
+ tailTiming.handoverMs = Math.round(performance.now() - tailT0);
1625
+ }
1626
+ if (INTERNAL_RANGO_DEBUG) {
1627
+ console.log(
1628
+ `[Server][ppr] shell HIT: tail stream handed over +${Math.round(performance.now() - serveStart)}ms (abs ${Math.round(performance.now())})`,
1629
+ );
1630
+ }
1631
+ if (tail instanceof ReadableStream) {
1632
+ const reader = tail.getReader();
1633
+ let firstTailChunk = true;
1634
+ let tailBytes = 0;
1635
+ try {
1636
+ for (;;) {
1637
+ const { done, value } = await reader.read();
1638
+ if (done) break;
1639
+ if (firstTailChunk) {
1640
+ firstTailChunk = false;
1641
+ if (tailTiming) {
1642
+ tailTiming.firstHtmlMs = Math.round(
1643
+ performance.now() - tailT0,
1644
+ );
1645
+ }
1646
+ if (INTERNAL_RANGO_DEBUG) {
1647
+ console.log(
1648
+ `[Server][ppr] shell HIT: first tail chunk on the wire +${Math.round(performance.now() - serveStart)}ms (abs ${Math.round(performance.now())})`,
1649
+ );
1650
+ }
1651
+ }
1652
+ if (tailTiming || INTERNAL_RANGO_DEBUG) {
1653
+ tailBytes += value.length;
1654
+ }
1655
+ controller.enqueue(value);
1656
+ }
1657
+ } finally {
1658
+ reader.releaseLock();
1659
+ }
1660
+ if (tailTiming) {
1661
+ tailTiming.completeMs = Math.round(performance.now() - tailT0);
1662
+ tailTiming.tailBytes = tailBytes;
1663
+ }
1664
+ // Bounds the post-header work Server-Timing structurally cannot see:
1665
+ // the HIT commits headers at the flush, so ALL live-tail time (match,
1666
+ // loaders, Flight, resume) happens inside the response body. This
1667
+ // line plus the [Server][segments] build logs narrate that window.
1668
+ if (INTERNAL_RANGO_DEBUG) {
1669
+ console.log(
1670
+ `[Server][ppr] shell HIT: tail complete +${Math.round(performance.now() - serveStart)}ms (${tailBytes}b)`,
1671
+ );
1672
+ }
1673
+ } else {
1674
+ // Defensive, near-unreachable: a redirecting match cannot have captured
1675
+ // a shell (capture bails on redirects), so a HIT on a redirecting URL
1676
+ // requires the route to have BECOME redirecting within the shell TTL.
1677
+ // The 200 + prelude are already committed; degrade to a client-side
1678
+ // replace so the user still lands on the target. The target is
1679
+ // neutralized first (see resolveShellHitRedirectTarget).
1680
+ const safeTarget = resolveShellHitRedirectTarget(
1681
+ tail.redirect,
1682
+ url.origin,
1683
+ ctx.router.basename,
1684
+ );
1685
+ controller.enqueue(
1686
+ new TextEncoder().encode(
1687
+ `<script>location.replace(${JSON.stringify(safeTarget)})</script>`,
1688
+ ),
1689
+ );
1690
+ if (tailTiming) {
1691
+ tailTiming.outcome = "redirect";
1692
+ tailTiming.completeMs = Math.round(performance.now() - tailT0);
1693
+ }
1694
+ }
1695
+ if (tailTiming) publishShellTailTiming(tailTiming);
1696
+ controller.close();
1697
+ } catch (error) {
1698
+ // Self-heal on a failed tail: errors the pre-commit gates cannot catch
1699
+ // (mismatched postponed blob, hard render error above the holes) throw
1700
+ // here AFTER the 200 + prelude flushed and would re-fail on every
1701
+ // request until the entry ages out — recapture overwrites the entry.
1702
+ // Client disconnects land here too; the recapture is idempotent and
1703
+ // bounded by scheduleShellCapture's stampede guard + backoff.
1704
+ scheduleShellCapture(
1705
+ ctx,
1706
+ request,
1707
+ env,
1708
+ url,
1709
+ reqCtx,
1710
+ ssrModule,
1711
+ descriptor,
1712
+ );
1713
+ if (tailTiming) {
1714
+ tailTiming.outcome = "error";
1715
+ tailTiming.completeMs = Math.round(performance.now() - tailT0);
1716
+ publishShellTailTiming(tailTiming);
1717
+ }
1718
+ controller.error(error);
1719
+ }
1720
+ },
1721
+ });
1722
+
1723
+ return createResponseWithMergedHeaders(body, {
1724
+ headers: {
1725
+ "content-type": "text/html;charset=utf-8",
1726
+ [SHELL_STATUS_HEADER]: "HIT",
1727
+ },
245
1728
  });
246
1729
  }