@rangojs/router 0.0.0-experimental.19 → 0.0.0-experimental.190fb30d

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 (1254) hide show
  1. package/AGENTS.md +13 -0
  2. package/README.md +304 -708
  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 +822 -182
  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/dist/handles/index.d.ts +6 -0
  356. package/dist/handles/index.d.ts.map +1 -0
  357. package/{src/handles/index.ts → dist/handles/index.js} +1 -1
  358. package/dist/handles/index.js.map +1 -0
  359. package/dist/handles/meta.d.ts +39 -0
  360. package/dist/handles/meta.d.ts.map +1 -0
  361. package/dist/handles/meta.js +202 -0
  362. package/dist/handles/meta.js.map +1 -0
  363. package/dist/host/__tests__/errors.test.d.ts +2 -0
  364. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  365. package/dist/host/__tests__/errors.test.js +76 -0
  366. package/dist/host/__tests__/errors.test.js.map +1 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  370. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  372. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  374. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  375. package/dist/host/__tests__/router.test.d.ts +2 -0
  376. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  377. package/dist/host/__tests__/router.test.js +241 -0
  378. package/dist/host/__tests__/router.test.js.map +1 -0
  379. package/dist/host/__tests__/testing.test.d.ts +2 -0
  380. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  381. package/dist/host/__tests__/testing.test.js +64 -0
  382. package/dist/host/__tests__/testing.test.js.map +1 -0
  383. package/dist/host/__tests__/utils.test.d.ts +2 -0
  384. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  385. package/dist/host/__tests__/utils.test.js +29 -0
  386. package/dist/host/__tests__/utils.test.js.map +1 -0
  387. package/dist/host/cookie-handler.d.ts +34 -0
  388. package/dist/host/cookie-handler.d.ts.map +1 -0
  389. package/dist/host/cookie-handler.js +124 -0
  390. package/dist/host/cookie-handler.js.map +1 -0
  391. package/dist/host/errors.d.ts +56 -0
  392. package/dist/host/errors.d.ts.map +1 -0
  393. package/dist/host/errors.js +79 -0
  394. package/dist/host/errors.js.map +1 -0
  395. package/dist/host/index.d.ts +29 -0
  396. package/dist/host/index.d.ts.map +1 -0
  397. package/dist/host/index.js +32 -0
  398. package/dist/host/index.js.map +1 -0
  399. package/dist/host/pattern-matcher.d.ts +36 -0
  400. package/dist/host/pattern-matcher.d.ts.map +1 -0
  401. package/dist/host/pattern-matcher.js +172 -0
  402. package/dist/host/pattern-matcher.js.map +1 -0
  403. package/dist/host/router.d.ts +26 -0
  404. package/dist/host/router.d.ts.map +1 -0
  405. package/dist/host/router.js +218 -0
  406. package/dist/host/router.js.map +1 -0
  407. package/dist/host/testing.d.ts +36 -0
  408. package/dist/host/testing.d.ts.map +1 -0
  409. package/dist/host/testing.js +55 -0
  410. package/dist/host/testing.js.map +1 -0
  411. package/dist/host/types.d.ts +115 -0
  412. package/dist/host/types.d.ts.map +1 -0
  413. package/dist/host/types.js +7 -0
  414. package/dist/host/types.js.map +1 -0
  415. package/dist/host/utils.d.ts +21 -0
  416. package/dist/host/utils.d.ts.map +1 -0
  417. package/dist/host/utils.js +23 -0
  418. package/dist/host/utils.js.map +1 -0
  419. package/dist/href-client.d.ts +131 -0
  420. package/dist/href-client.d.ts.map +1 -0
  421. package/dist/href-client.js +64 -0
  422. package/dist/href-client.js.map +1 -0
  423. package/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.d.ts +1479 -0
  749. package/dist/types.d.ts.map +1 -0
  750. package/dist/types.js +10 -0
  751. package/dist/types.js.map +1 -0
  752. package/dist/urls.d.ts +441 -0
  753. package/dist/urls.d.ts.map +1 -0
  754. package/dist/urls.gen.d.ts +8 -0
  755. package/dist/urls.gen.d.ts.map +1 -0
  756. package/dist/urls.gen.js +8 -0
  757. package/dist/urls.gen.js.map +1 -0
  758. package/dist/urls.js +443 -0
  759. package/dist/urls.js.map +1 -0
  760. package/dist/use-loader.d.ts +127 -0
  761. package/dist/use-loader.d.ts.map +1 -0
  762. package/dist/use-loader.js +237 -0
  763. package/dist/use-loader.js.map +1 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  767. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  771. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  775. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  777. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  779. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  780. package/dist/vite/ast-handler-extract.d.ts +49 -0
  781. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  782. package/dist/vite/ast-handler-extract.js +249 -0
  783. package/dist/vite/ast-handler-extract.js.map +1 -0
  784. package/dist/vite/expose-action-id.d.ts +19 -0
  785. package/dist/vite/expose-action-id.d.ts.map +1 -0
  786. package/dist/vite/expose-action-id.js +250 -0
  787. package/dist/vite/expose-action-id.js.map +1 -0
  788. package/dist/vite/expose-id-utils.d.ts +69 -0
  789. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  790. package/dist/vite/expose-id-utils.js +289 -0
  791. package/dist/vite/expose-id-utils.js.map +1 -0
  792. package/dist/vite/expose-internal-ids.d.ts +22 -0
  793. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  794. package/dist/vite/expose-internal-ids.js +886 -0
  795. package/dist/vite/expose-internal-ids.js.map +1 -0
  796. package/dist/vite/index.d.ts +149 -0
  797. package/dist/vite/index.d.ts.map +1 -0
  798. package/dist/vite/index.js +4644 -1433
  799. package/dist/vite/index.js.bak +5448 -0
  800. package/dist/vite/index.js.map +1 -0
  801. package/dist/vite/index.named-routes.gen.ts +103 -0
  802. package/dist/vite/package-resolution.d.ts +43 -0
  803. package/dist/vite/package-resolution.d.ts.map +1 -0
  804. package/dist/vite/package-resolution.js +112 -0
  805. package/dist/vite/package-resolution.js.map +1 -0
  806. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  807. package/dist/vite/virtual-entries.d.ts +25 -0
  808. package/dist/vite/virtual-entries.d.ts.map +1 -0
  809. package/dist/vite/virtual-entries.js +110 -0
  810. package/dist/vite/virtual-entries.js.map +1 -0
  811. package/package.json +87 -16
  812. package/skills/api-client/SKILL.md +211 -0
  813. package/skills/breadcrumbs/SKILL.md +329 -0
  814. package/skills/bundle-analysis/SKILL.md +159 -0
  815. package/skills/cache-guide/SKILL.md +251 -24
  816. package/skills/caching/SKILL.md +379 -21
  817. package/skills/catalog.json +271 -0
  818. package/skills/comparison/SKILL.md +50 -0
  819. package/skills/comparison/agents/openai.yaml +4 -0
  820. package/skills/comparison/references/framework-comparison.md +837 -0
  821. package/skills/composability/SKILL.md +110 -4
  822. package/skills/css/SKILL.md +76 -0
  823. package/skills/debug-manifest/SKILL.md +5 -3
  824. package/skills/defer-hydration/SKILL.md +235 -0
  825. package/skills/document-cache/SKILL.md +87 -56
  826. package/skills/fonts/SKILL.md +1 -1
  827. package/skills/handler-use/SKILL.md +364 -0
  828. package/skills/hooks/SKILL.md +76 -692
  829. package/skills/hooks/data.md +273 -0
  830. package/skills/hooks/handle-and-actions.md +103 -0
  831. package/skills/hooks/navigation.md +110 -0
  832. package/skills/hooks/outlets.md +41 -0
  833. package/skills/hooks/state.md +228 -0
  834. package/skills/hooks/urls.md +135 -0
  835. package/skills/host-router/SKILL.md +320 -0
  836. package/skills/i18n/SKILL.md +276 -0
  837. package/skills/intercept/SKILL.md +94 -18
  838. package/skills/layout/SKILL.md +62 -19
  839. package/skills/links/SKILL.md +249 -17
  840. package/skills/loader/SKILL.md +320 -32
  841. package/skills/middleware/SKILL.md +59 -16
  842. package/skills/migrate-nextjs/SKILL.md +745 -0
  843. package/skills/migrate-react-router/SKILL.md +153 -0
  844. package/skills/migrate-react-router/cloudflare-workers.md +129 -0
  845. package/skills/migrate-react-router/component-migration.md +196 -0
  846. package/skills/migrate-react-router/data-and-actions.md +225 -0
  847. package/skills/migrate-react-router/route-mapping.md +271 -0
  848. package/skills/mime-routes/SKILL.md +29 -2
  849. package/skills/observability/SKILL.md +202 -0
  850. package/skills/parallel/SKILL.md +225 -10
  851. package/skills/ppr/SKILL.md +618 -0
  852. package/skills/prerender/SKILL.md +180 -126
  853. package/skills/rango/SKILL.md +318 -25
  854. package/skills/react-compiler/SKILL.md +168 -0
  855. package/skills/response-routes/SKILL.md +138 -49
  856. package/skills/route/SKILL.md +175 -13
  857. package/skills/router-setup/SKILL.md +139 -14
  858. package/skills/scripts/SKILL.md +179 -0
  859. package/skills/server-actions/SKILL.md +776 -0
  860. package/skills/shell-manifest/SKILL.md +185 -0
  861. package/skills/streams-and-websockets/SKILL.md +283 -0
  862. package/skills/tailwind/SKILL.md +28 -4
  863. package/skills/testing/SKILL.md +126 -222
  864. package/skills/testing/bindings.md +103 -0
  865. package/skills/testing/cache-prerender.md +127 -0
  866. package/skills/testing/client-components.md +124 -0
  867. package/skills/testing/e2e-parity.md +125 -0
  868. package/skills/testing/flight.md +91 -0
  869. package/skills/testing/handles.md +131 -0
  870. package/skills/testing/loader.md +128 -0
  871. package/skills/testing/middleware.md +99 -0
  872. package/skills/testing/render-handler.md +122 -0
  873. package/skills/testing/response-routes.md +95 -0
  874. package/skills/testing/reverse-and-types.md +85 -0
  875. package/skills/testing/server-actions.md +107 -0
  876. package/skills/testing/server-tree.md +128 -0
  877. package/skills/testing/setup.md +123 -0
  878. package/skills/theme/SKILL.md +1 -1
  879. package/skills/typesafety/SKILL.md +45 -614
  880. package/skills/typesafety/env-and-bindings.md +254 -0
  881. package/skills/typesafety/generated-files-and-cli.md +335 -0
  882. package/skills/typesafety/params-and-search.md +153 -0
  883. package/skills/typesafety/route-types.md +209 -0
  884. package/skills/use-cache/SKILL.md +74 -15
  885. package/skills/vercel/SKILL.md +128 -0
  886. package/skills/view-transitions/SKILL.md +337 -0
  887. package/src/__augment-tests__/augment.ts +81 -0
  888. package/src/__augment-tests__/augmented.check.ts +116 -0
  889. package/src/__internal.ts +67 -40
  890. package/src/bin/rango.ts +18 -0
  891. package/src/browser/action-coordinator.ts +53 -36
  892. package/src/browser/action-fence.ts +47 -0
  893. package/src/browser/app-shell.ts +39 -0
  894. package/src/browser/app-version.ts +14 -0
  895. package/src/browser/connection-warmup.ts +134 -0
  896. package/src/browser/cookie-name.ts +140 -0
  897. package/src/browser/event-controller.ts +257 -158
  898. package/src/browser/history-state.ts +21 -0
  899. package/src/browser/index.ts +3 -3
  900. package/src/browser/invalidate-client-cache.ts +52 -0
  901. package/src/browser/link-interceptor.ts +4 -0
  902. package/src/browser/logging.ts +28 -0
  903. package/src/browser/merge-segment-loaders.ts +6 -4
  904. package/src/browser/navigation-bridge.ts +222 -38
  905. package/src/browser/navigation-client.ts +233 -58
  906. package/src/browser/navigation-store-handle.ts +38 -0
  907. package/src/browser/navigation-store.ts +203 -80
  908. package/src/browser/navigation-transaction.ts +18 -66
  909. package/src/browser/network-error-handler.ts +34 -7
  910. package/src/browser/partial-update.ts +242 -126
  911. package/src/browser/prefetch/cache.ts +344 -30
  912. package/src/browser/prefetch/fetch.ts +373 -48
  913. package/src/browser/prefetch/policy.ts +6 -0
  914. package/src/browser/prefetch/queue.ts +144 -23
  915. package/src/browser/prefetch/resource-ready.ts +77 -0
  916. package/src/browser/rango-state.ts +158 -76
  917. package/src/browser/react/Link.tsx +135 -18
  918. package/src/browser/react/NavigationProvider.tsx +240 -122
  919. package/src/browser/react/ScrollRestoration.tsx +10 -6
  920. package/src/browser/react/context.ts +7 -2
  921. package/src/browser/react/filter-segment-order.ts +66 -7
  922. package/src/browser/react/index.ts +0 -48
  923. package/src/browser/react/location-state-shared.ts +178 -8
  924. package/src/browser/react/location-state.ts +39 -14
  925. package/src/browser/react/use-action.ts +6 -15
  926. package/src/browser/react/use-handle.ts +23 -69
  927. package/src/browser/react/use-href.tsx +8 -1
  928. package/src/browser/react/use-link-status.ts +33 -8
  929. package/src/browser/react/use-navigation.ts +32 -7
  930. package/src/browser/react/use-params.ts +20 -10
  931. package/src/browser/react/use-reverse.ts +106 -0
  932. package/src/browser/react/use-router.ts +46 -11
  933. package/src/browser/react/use-search-params.ts +0 -5
  934. package/src/browser/react/use-segments.ts +11 -21
  935. package/src/browser/response-adapter.ts +99 -8
  936. package/src/browser/rsc-router.tsx +276 -75
  937. package/src/browser/scroll-restoration.ts +61 -47
  938. package/src/browser/segment-reconciler.ts +44 -7
  939. package/src/browser/segment-structure-assert.ts +2 -2
  940. package/src/browser/server-action-bridge.ts +631 -442
  941. package/src/browser/types.ts +160 -12
  942. package/src/browser/validate-redirect-origin.ts +43 -16
  943. package/src/build/collect-fallback-refs.ts +107 -0
  944. package/src/build/generate-manifest.ts +207 -158
  945. package/src/build/generate-route-types.ts +8 -1
  946. package/src/build/index.ts +11 -3
  947. package/src/build/prefix-tree-utils.ts +123 -0
  948. package/src/build/route-trie.ts +215 -42
  949. package/src/build/route-types/ast-route-extraction.ts +15 -8
  950. package/src/build/route-types/codegen.ts +16 -5
  951. package/src/build/route-types/include-resolution.ts +464 -63
  952. package/src/build/route-types/param-extraction.ts +6 -3
  953. package/src/build/route-types/per-module-writer.ts +22 -6
  954. package/src/build/route-types/router-processing.ts +442 -106
  955. package/src/build/route-types/scan-filter.ts +9 -2
  956. package/src/build/route-types/source-scan.ts +216 -0
  957. package/src/build/runtime-discovery.ts +13 -21
  958. package/src/cache/cache-error.ts +104 -0
  959. package/src/cache/cache-key-utils.ts +58 -13
  960. package/src/cache/cache-policy.ts +108 -34
  961. package/src/cache/cache-runtime.ts +454 -97
  962. package/src/cache/cache-scope.ts +235 -103
  963. package/src/cache/cache-tag.ts +149 -0
  964. package/src/cache/cf/cf-base64.ts +33 -0
  965. package/src/cache/cf/cf-cache-constants.ts +127 -0
  966. package/src/cache/cf/cf-cache-store.ts +2446 -170
  967. package/src/cache/cf/cf-cache-types.ts +349 -0
  968. package/src/cache/cf/cf-kv-utils.ts +46 -0
  969. package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
  970. package/src/cache/cf/index.ts +11 -17
  971. package/src/cache/document-cache.ts +144 -49
  972. package/src/cache/handle-snapshot.ts +70 -0
  973. package/src/cache/index.ts +24 -20
  974. package/src/cache/memory-segment-store.ts +243 -37
  975. package/src/cache/profile-registry.ts +46 -31
  976. package/src/cache/read-through-swr.ts +56 -12
  977. package/src/cache/segment-codec.ts +13 -21
  978. package/src/cache/shell-snapshot.ts +417 -0
  979. package/src/cache/tag-invalidation.ts +230 -0
  980. package/src/cache/taint.ts +55 -0
  981. package/src/cache/types.ts +194 -99
  982. package/src/cache/vercel/index.ts +11 -0
  983. package/src/cache/vercel/vercel-cache-store.ts +1132 -0
  984. package/src/client.rsc.tsx +42 -21
  985. package/src/client.tsx +117 -336
  986. package/src/cloudflare/index.ts +11 -0
  987. package/src/cloudflare/tracing.ts +108 -0
  988. package/src/component-utils.ts +19 -0
  989. package/src/components/DefaultDocument.tsx +8 -2
  990. package/src/context-var.ts +84 -2
  991. package/src/debug.ts +2 -2
  992. package/src/decode-loader-results.ts +52 -0
  993. package/src/defer.ts +185 -0
  994. package/src/deps/ssr.ts +0 -1
  995. package/src/encode-kv.ts +49 -0
  996. package/src/errors.ts +30 -4
  997. package/src/escape-script.ts +52 -0
  998. package/src/handle.ts +104 -34
  999. package/src/handles/MetaTags.tsx +24 -53
  1000. package/src/handles/Scripts.tsx +183 -0
  1001. package/src/handles/breadcrumbs.ts +93 -0
  1002. package/src/handles/deferred-resolution.ts +127 -0
  1003. package/src/handles/is-thenable.ts +18 -0
  1004. package/src/handles/meta.ts +14 -40
  1005. package/src/handles/script.ts +244 -0
  1006. package/src/host/cookie-handler.ts +9 -60
  1007. package/src/host/errors.ts +13 -22
  1008. package/src/host/index.ts +9 -5
  1009. package/src/host/pattern-matcher.ts +23 -52
  1010. package/src/host/router.ts +107 -99
  1011. package/src/host/testing.ts +40 -27
  1012. package/src/host/types.ts +37 -4
  1013. package/src/host/utils.ts +1 -1
  1014. package/src/href-client.ts +137 -22
  1015. package/src/index.rsc.ts +86 -30
  1016. package/src/index.ts +158 -68
  1017. package/src/internal-debug.ts +11 -10
  1018. package/src/loader-store.ts +500 -0
  1019. package/src/loader.rsc.ts +20 -13
  1020. package/src/loader.ts +12 -11
  1021. package/src/missing-id-error.ts +68 -0
  1022. package/src/outlet-context.ts +1 -1
  1023. package/src/outlet-provider.tsx +1 -5
  1024. package/src/prerender/param-hash.ts +16 -16
  1025. package/src/prerender/store.ts +63 -26
  1026. package/src/prerender.ts +215 -86
  1027. package/src/redirect-origin.ts +114 -0
  1028. package/src/regex-escape.ts +8 -0
  1029. package/src/render-error-thrower.tsx +20 -0
  1030. package/src/response-utils.ts +62 -0
  1031. package/src/reverse.ts +65 -15
  1032. package/src/root-error-boundary.tsx +1 -19
  1033. package/src/route-content-wrapper.tsx +19 -77
  1034. package/src/route-definition/dsl-helpers.ts +485 -303
  1035. package/src/route-definition/helper-factories.ts +28 -140
  1036. package/src/route-definition/helpers-types.ts +153 -77
  1037. package/src/route-definition/index.ts +4 -5
  1038. package/src/route-definition/redirect.ts +53 -12
  1039. package/src/route-definition/resolve-handler-use.ts +160 -0
  1040. package/src/route-definition/use-item-types.ts +29 -0
  1041. package/src/route-map-builder.ts +48 -21
  1042. package/src/route-types.ts +37 -46
  1043. package/src/router/basename.ts +14 -0
  1044. package/src/router/content-negotiation.ts +164 -17
  1045. package/src/router/error-handling.ts +45 -18
  1046. package/src/router/find-match.ts +130 -29
  1047. package/src/router/handler-context.ts +110 -39
  1048. package/src/router/instrument.ts +355 -0
  1049. package/src/router/intercept-resolution.ts +50 -24
  1050. package/src/router/lazy-includes.ts +89 -63
  1051. package/src/router/loader-resolution.ts +286 -56
  1052. package/src/router/logging.ts +5 -8
  1053. package/src/router/manifest.ts +105 -56
  1054. package/src/router/match-api.ts +179 -219
  1055. package/src/router/match-context.ts +0 -22
  1056. package/src/router/match-handlers.ts +211 -165
  1057. package/src/router/match-middleware/background-revalidation.ts +66 -22
  1058. package/src/router/match-middleware/cache-lookup.ts +214 -263
  1059. package/src/router/match-middleware/cache-store.ts +105 -50
  1060. package/src/router/match-middleware/intercept-resolution.ts +8 -28
  1061. package/src/router/match-middleware/segment-resolution.ts +52 -18
  1062. package/src/router/match-pipelines.ts +1 -42
  1063. package/src/router/match-result.ts +127 -52
  1064. package/src/router/metrics.ts +217 -26
  1065. package/src/router/middleware-types.ts +24 -110
  1066. package/src/router/middleware.ts +412 -199
  1067. package/src/router/navigation-snapshot.ts +133 -0
  1068. package/src/router/params-util.ts +23 -0
  1069. package/src/router/parse-pattern.ts +115 -0
  1070. package/src/router/pattern-matching.ts +183 -137
  1071. package/src/router/prefetch-cache-ttl.ts +51 -0
  1072. package/src/router/prefetch-limits.ts +37 -0
  1073. package/src/router/prerender-match.ts +207 -58
  1074. package/src/router/preview-match.ts +35 -103
  1075. package/src/router/request-classification.ts +291 -0
  1076. package/src/router/revalidation.ts +144 -74
  1077. package/src/router/route-snapshot.ts +256 -0
  1078. package/src/router/router-context.ts +11 -29
  1079. package/src/router/router-interfaces.ts +160 -36
  1080. package/src/router/router-options.ts +215 -23
  1081. package/src/router/router-registry.ts +2 -5
  1082. package/src/router/segment-resolution/fresh.ts +318 -77
  1083. package/src/router/segment-resolution/helpers.ts +116 -31
  1084. package/src/router/segment-resolution/loader-cache.ts +156 -39
  1085. package/src/router/segment-resolution/loader-mask.ts +67 -0
  1086. package/src/router/segment-resolution/loader-snapshot.ts +308 -0
  1087. package/src/router/segment-resolution/revalidation.ts +496 -391
  1088. package/src/router/segment-resolution/static-store.ts +19 -5
  1089. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  1090. package/src/router/segment-resolution/view-transition-default.ts +56 -0
  1091. package/src/router/segment-resolution.ts +5 -1
  1092. package/src/router/segment-wrappers.ts +8 -5
  1093. package/src/router/state-cookie-name.ts +33 -0
  1094. package/src/router/substitute-pattern-params.ts +75 -0
  1095. package/src/router/telemetry-otel.ts +160 -200
  1096. package/src/router/telemetry.ts +105 -20
  1097. package/src/router/timeout.ts +0 -20
  1098. package/src/router/tracing.ts +215 -0
  1099. package/src/router/trie-matching.ts +188 -58
  1100. package/src/router/types.ts +10 -63
  1101. package/src/router/url-params.ts +57 -0
  1102. package/src/router.ts +224 -65
  1103. package/src/rsc/full-payload.ts +70 -0
  1104. package/src/rsc/handler-context.ts +3 -2
  1105. package/src/rsc/handler.ts +726 -457
  1106. package/src/rsc/helpers.ts +168 -46
  1107. package/src/rsc/index.ts +2 -25
  1108. package/src/rsc/json-route-result.ts +38 -0
  1109. package/src/rsc/loader-fetch.ts +127 -31
  1110. package/src/rsc/manifest-init.ts +33 -42
  1111. package/src/rsc/nonce.ts +10 -1
  1112. package/src/rsc/origin-guard.ts +39 -25
  1113. package/src/rsc/progressive-enhancement.ts +159 -23
  1114. package/src/rsc/redirect-guard.ts +100 -0
  1115. package/src/rsc/response-cache-serve.ts +238 -0
  1116. package/src/rsc/response-error.ts +79 -12
  1117. package/src/rsc/response-route-handler.ts +99 -189
  1118. package/src/rsc/rsc-rendering.ts +516 -104
  1119. package/src/rsc/runtime-warnings.ts +23 -10
  1120. package/src/rsc/server-action.ts +293 -115
  1121. package/src/rsc/shell-capture.ts +1166 -0
  1122. package/src/rsc/shell-serve.ts +181 -0
  1123. package/src/rsc/ssr-setup.ts +144 -0
  1124. package/src/rsc/transition-gate.ts +89 -0
  1125. package/src/rsc/types.ts +64 -6
  1126. package/src/runtime-env.ts +18 -0
  1127. package/src/search-params.ts +49 -41
  1128. package/src/segment-content-promise.ts +67 -0
  1129. package/src/segment-loader-promise.ts +167 -0
  1130. package/src/segment-system.tsx +418 -131
  1131. package/src/serialize.ts +243 -0
  1132. package/src/server/context.ts +375 -63
  1133. package/src/server/cookie-parse.ts +32 -0
  1134. package/src/server/cookie-store.ts +152 -5
  1135. package/src/server/handle-store.ts +40 -38
  1136. package/src/server/loader-registry.ts +38 -46
  1137. package/src/server/request-context.ts +585 -178
  1138. package/src/server.ts +6 -0
  1139. package/src/ssr/index.tsx +467 -174
  1140. package/src/ssr/inject-rsc-eager.ts +167 -0
  1141. package/src/ssr/ssr-root.tsx +228 -0
  1142. package/src/static-handler.ts +27 -18
  1143. package/src/testing/cache-status.ts +162 -0
  1144. package/src/testing/collect-handle.ts +46 -0
  1145. package/src/testing/dispatch.ts +813 -0
  1146. package/src/testing/dom.entry.ts +22 -0
  1147. package/src/testing/e2e/fixture.ts +188 -0
  1148. package/src/testing/e2e/index.ts +128 -0
  1149. package/src/testing/e2e/matchers.ts +35 -0
  1150. package/src/testing/e2e/page-helpers.ts +272 -0
  1151. package/src/testing/e2e/parity.ts +387 -0
  1152. package/src/testing/e2e/server.ts +195 -0
  1153. package/src/testing/flight-matchers.ts +97 -0
  1154. package/src/testing/flight-normalize.ts +11 -0
  1155. package/src/testing/flight-runtime.d.ts +57 -0
  1156. package/src/testing/flight-tree.ts +682 -0
  1157. package/src/testing/flight.entry.ts +52 -0
  1158. package/src/testing/flight.ts +257 -0
  1159. package/src/testing/generated-routes.ts +199 -0
  1160. package/src/testing/index.ts +105 -0
  1161. package/src/testing/internal/context.ts +371 -0
  1162. package/src/testing/internal/flight-client-globals.ts +30 -0
  1163. package/src/testing/internal/seed-vars.ts +54 -0
  1164. package/src/testing/render-handler.ts +357 -0
  1165. package/src/testing/render-route.tsx +584 -0
  1166. package/src/testing/run-loader.ts +385 -0
  1167. package/src/testing/run-middleware.ts +205 -0
  1168. package/src/testing/run-transition-when.ts +164 -0
  1169. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  1170. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  1171. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  1172. package/src/testing/vitest-stubs/version.ts +5 -0
  1173. package/src/testing/vitest.ts +305 -0
  1174. package/src/theme/ThemeProvider.tsx +56 -84
  1175. package/src/theme/ThemeScript.tsx +7 -9
  1176. package/src/theme/constants.ts +52 -13
  1177. package/src/theme/index.ts +3 -19
  1178. package/src/theme/theme-context.ts +1 -5
  1179. package/src/theme/theme-script.ts +22 -21
  1180. package/src/theme/use-theme.ts +0 -3
  1181. package/src/types/boundaries.ts +0 -35
  1182. package/src/types/cache-types.ts +17 -8
  1183. package/src/types/error-types.ts +30 -90
  1184. package/src/types/global-namespace.ts +54 -41
  1185. package/src/types/handler-context.ts +237 -89
  1186. package/src/types/index.ts +3 -10
  1187. package/src/types/loader-types.ts +44 -15
  1188. package/src/types/request-scope.ts +112 -0
  1189. package/src/types/route-config.ts +23 -46
  1190. package/src/types/route-entry.ts +19 -7
  1191. package/src/types/segments.ts +137 -19
  1192. package/src/urls/include-helper.ts +40 -75
  1193. package/src/urls/include-provider.ts +71 -0
  1194. package/src/urls/index.ts +2 -11
  1195. package/src/urls/path-helper-types.ts +102 -23
  1196. package/src/urls/path-helper.ts +62 -111
  1197. package/src/urls/pattern-types.ts +84 -19
  1198. package/src/urls/response-types.ts +25 -22
  1199. package/src/urls/type-extraction.ts +98 -154
  1200. package/src/urls/urls-function.ts +1 -19
  1201. package/src/use-loader.tsx +346 -89
  1202. package/src/vercel/index.ts +11 -0
  1203. package/src/vercel/tracing.ts +88 -0
  1204. package/src/vite/debug.ts +185 -0
  1205. package/src/vite/discovery/bundle-postprocess.ts +64 -91
  1206. package/src/vite/discovery/dev-prerender-cache.ts +117 -0
  1207. package/src/vite/discovery/discover-routers.ts +147 -88
  1208. package/src/vite/discovery/discovery-errors.ts +255 -0
  1209. package/src/vite/discovery/gate-state.ts +171 -0
  1210. package/src/vite/discovery/prerender-collection.ts +247 -145
  1211. package/src/vite/discovery/route-types-writer.ts +40 -84
  1212. package/src/vite/discovery/self-gen-tracking.ts +27 -1
  1213. package/src/vite/discovery/state.ts +61 -13
  1214. package/src/vite/discovery/virtual-module-codegen.ts +14 -34
  1215. package/src/vite/index.ts +19 -3
  1216. package/src/vite/inject-client-debug.ts +88 -0
  1217. package/src/vite/plugin-types.ts +234 -62
  1218. package/src/vite/plugins/cjs-to-esm.ts +16 -19
  1219. package/src/vite/plugins/client-ref-dedup.ts +120 -0
  1220. package/src/vite/plugins/client-ref-hashing.ts +28 -15
  1221. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1222. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1223. package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
  1224. package/src/vite/plugins/expose-action-id.ts +49 -98
  1225. package/src/vite/plugins/expose-id-utils.ts +96 -51
  1226. package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
  1227. package/src/vite/plugins/expose-ids/handler-transform.ts +15 -64
  1228. package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
  1229. package/src/vite/plugins/expose-ids/router-transform.ts +118 -29
  1230. package/src/vite/plugins/expose-internal-ids.ts +553 -317
  1231. package/src/vite/plugins/performance-tracks.ts +89 -0
  1232. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1233. package/src/vite/plugins/use-cache-transform.ts +73 -83
  1234. package/src/vite/plugins/vercel-output.ts +384 -0
  1235. package/src/vite/plugins/version-injector.ts +40 -29
  1236. package/src/vite/plugins/version-plugin.ts +46 -37
  1237. package/src/vite/plugins/virtual-entries.ts +138 -27
  1238. package/src/vite/rango.ts +356 -295
  1239. package/src/vite/router-discovery.ts +1106 -166
  1240. package/src/vite/utils/ast-handler-extract.ts +26 -35
  1241. package/src/vite/utils/banner.ts +4 -4
  1242. package/src/vite/utils/bundle-analysis.ts +10 -15
  1243. package/src/vite/utils/client-chunks.ts +184 -0
  1244. package/src/vite/utils/directive-prologue.ts +40 -0
  1245. package/src/vite/utils/forward-user-plugins.ts +171 -0
  1246. package/src/vite/utils/manifest-utils.ts +4 -59
  1247. package/src/vite/utils/package-resolution.ts +20 -52
  1248. package/src/vite/utils/prerender-utils.ts +158 -38
  1249. package/src/vite/utils/shared-utils.ts +144 -44
  1250. package/CLAUDE.md +0 -5
  1251. package/src/browser/action-response-classifier.ts +0 -99
  1252. package/src/browser/shallow.ts +0 -40
  1253. package/src/route-definition/route-function.ts +0 -119
  1254. package/src/router/middleware-cookies.ts +0 -55
@@ -8,23 +8,34 @@
8
8
  */
9
9
 
10
10
  import { createElement } from "react";
11
- import { RouteNotFoundError } from "../errors.js";
11
+ import { isRouteNotFoundError } from "../errors.js";
12
12
  import { matchMiddleware, executeMiddleware } from "../router/middleware.js";
13
13
  import {
14
14
  runWithRequestContext,
15
15
  setRequestContextParams,
16
- requireRequestContext,
16
+ getRequestContext,
17
+ _getRequestContext,
17
18
  createRequestContext,
18
19
  } from "../server/request-context.js";
19
20
  import * as rscDeps from "@vitejs/plugin-rsc/rsc";
20
-
21
- import type { RscPayload, CreateRSCHandlerOptions } from "./types.js";
21
+ import type {
22
+ RscPayload,
23
+ CreateRSCHandlerOptions,
24
+ LoadSSRModule,
25
+ SSRModule,
26
+ } from "./types.js";
22
27
  import {
23
28
  createResponseWithMergedHeaders,
24
29
  finalizeResponse,
25
30
  interceptRedirectForPartial,
26
31
  buildRouteMiddlewareEntries,
27
32
  } from "./helpers.js";
33
+ import { guardOutgoingRedirect } from "./redirect-guard.js";
34
+ import { resolvedHandleStream } from "../handles/deferred-resolution.js";
35
+ import {
36
+ isWebSocketUpgradeResponse,
37
+ appendVaryAccept,
38
+ } from "../response-utils.js";
28
39
  import {
29
40
  handleResponseRoute,
30
41
  type ResponseRouteMatch,
@@ -38,8 +49,6 @@ import {
38
49
  createReverseFunction,
39
50
  stripInternalParams,
40
51
  } from "../router/handler-context.js";
41
- import { getRouterContext } from "../router/router-context.js";
42
- import { resolveSink, safeEmit } from "../router/telemetry.js";
43
52
  import { contextSet } from "../context-var.js";
44
53
  import {
45
54
  hasCachedManifest,
@@ -50,6 +59,8 @@ import {
50
59
  getRouterTrie,
51
60
  } from "../route-map-builder.js";
52
61
  import type { HandlerContext } from "./handler-context.js";
62
+ import type { CacheErrorCategory } from "../cache/cache-error.js";
63
+ import type { SegmentCacheStore } from "../cache/types.js";
53
64
  import { buildRouterTrieFromUrlpatterns } from "./manifest-init.js";
54
65
  import { handleProgressiveEnhancement } from "./progressive-enhancement.js";
55
66
  import {
@@ -58,7 +69,10 @@ import {
58
69
  type ActionContinuation,
59
70
  } from "./server-action.js";
60
71
  import { handleLoaderFetch } from "./loader-fetch.js";
61
- import { checkRequestOrigin, type OriginCheckPhase } from "./origin-guard.js";
72
+ import {
73
+ checkRequestOrigin,
74
+ ORIGIN_CHECK_PHASE_BY_MODE,
75
+ } from "./origin-guard.js";
62
76
  import { handleRscRendering } from "./rsc-rendering.js";
63
77
  import {
64
78
  withTimeout,
@@ -66,6 +80,25 @@ import {
66
80
  createDefaultTimeoutResponse,
67
81
  type TimeoutPhase,
68
82
  } from "../router/timeout.js";
83
+ import {
84
+ createMetricsStore,
85
+ appendMetric,
86
+ buildMetricsTiming,
87
+ } from "../router/metrics.js";
88
+ import { observePhase, PHASES } from "../router/instrument.js";
89
+ import { safeEmit, resolveSink, getRequestId } from "../router/telemetry.js";
90
+ import {
91
+ startSSRSetup,
92
+ getSSRSetup,
93
+ mayNeedSSR,
94
+ isRscRequest,
95
+ SSR_SETUP_VAR,
96
+ } from "./ssr-setup.js";
97
+ import {
98
+ classifyRequest,
99
+ type RequestPlan,
100
+ type ExecutableRequestPlan,
101
+ } from "../router/request-classification.js";
69
102
 
70
103
  /**
71
104
  * Create an RSC request handler.
@@ -100,12 +133,35 @@ import {
100
133
  * });
101
134
  * ```
102
135
  */
136
+
137
+ /**
138
+ * Response that tells the client to do a full document navigation. Shared by
139
+ * the terminal reload plans (version-mismatch and app-switch): an empty 200
140
+ * carrying X-RSC-Reload, which the client turns into window.location.href.
141
+ */
142
+ function createReloadResponse(reloadUrl: string) {
143
+ return createResponseWithMergedHeaders(null, {
144
+ status: 200,
145
+ headers: {
146
+ "X-RSC-Reload": reloadUrl,
147
+ "content-type": "text/x-component;charset=utf-8",
148
+ },
149
+ });
150
+ }
151
+
103
152
  export function createRSCHandler<
104
153
  TEnv = unknown,
105
154
  TRoutes extends Record<string, string> = Record<string, string>,
106
155
  >(options: CreateRSCHandlerOptions<TEnv, TRoutes>) {
107
156
  const { router, version = VERSION, nonce: nonceProvider } = options;
108
157
 
158
+ // Handler-owned registry of explicit per-scope stores from cache({ store }).
159
+ // Lives in the closure so it is scoped per handler (multi-router deployments
160
+ // get separate registries) and accumulates every explicit store this handler
161
+ // resolves across requests. updateTag()/revalidateTag() iterate it to reach
162
+ // stores not covered by the app-level ctx._cacheStore.
163
+ const explicitTaggedStores = new Set<SegmentCacheStore>();
164
+
109
165
  // Use provided deps or default to @vitejs/plugin-rsc/rsc exports
110
166
  const deps = options.deps ?? rscDeps;
111
167
  const {
@@ -117,10 +173,22 @@ export function createRSCHandler<
117
173
  decodeFormState,
118
174
  } = deps;
119
175
 
120
- // Use provided loadSSRModule or default to vite RSC module loader
121
- const loadSSRModule =
176
+ // Use provided loadSSRModule or default to vite RSC module loader.
177
+ // In production the SSR module is stable across requests, so memoize
178
+ // the dynamic import to avoid repeated module resolution overhead.
179
+ // In dev mode Vite may hot-reload the module, so skip memoization.
180
+ const rawLoadSSRModule: LoadSSRModule =
122
181
  options.loadSSRModule ??
123
182
  (() => import.meta.viteRsc.loadModule("ssr", "index"));
183
+ let _ssrModulePromise: Promise<SSRModule> | undefined;
184
+ const loadSSRModule: LoadSSRModule =
185
+ process.env.NODE_ENV === "production"
186
+ ? () =>
187
+ (_ssrModulePromise ??= rawLoadSSRModule().catch((err) => {
188
+ _ssrModulePromise = undefined;
189
+ throw err;
190
+ }))
191
+ : rawLoadSSRModule;
124
192
 
125
193
  /**
126
194
  * Per-request error reporter that deduplicates via the ALS request context.
@@ -133,10 +201,13 @@ export function createRSCHandler<
133
201
  phase: ErrorPhase,
134
202
  context: Parameters<typeof invokeOnError<TEnv>>[3],
135
203
  ): void {
136
- if (error != null && typeof error === "object") {
137
- const reportedErrors = requireRequestContext()._reportedErrors;
138
- if (reportedErrors.has(error)) return;
139
- reportedErrors.add(error);
204
+ // Guard: abort signal handlers fire asynchronously outside the ALS
205
+ // request scope, so the context may be gone. Skip dedup in that
206
+ // case — the error is from a cancelled stream, not a real failure.
207
+ const reqCtx = _getRequestContext();
208
+ if (error != null && typeof error === "object" && reqCtx) {
209
+ if (reqCtx._reportedErrors.has(error)) return;
210
+ reqCtx._reportedErrors.add(error);
140
211
  }
141
212
  invokeOnError(router.onError, error, phase, context, "RSC");
142
213
  }
@@ -176,23 +247,18 @@ export function createRSCHandler<
176
247
  metadata: { timeout: true, phase, durationMs },
177
248
  });
178
249
 
179
- try {
180
- const routerCtx = getRouterContext();
181
- if (routerCtx?.telemetry) {
182
- safeEmit(resolveSink(routerCtx.telemetry), {
183
- type: "request.timeout" as const,
184
- timestamp: performance.now(),
185
- requestId: routerCtx.requestId,
186
- phase,
187
- pathname: url.pathname,
188
- routeKey,
189
- actionId,
190
- durationMs,
191
- customHandler: !!router.onTimeout,
192
- });
193
- }
194
- } catch {
195
- // Router context may not be available
250
+ if (router.telemetry) {
251
+ safeEmit(resolveSink(router.telemetry), {
252
+ type: "request.timeout",
253
+ timestamp: performance.now(),
254
+ requestId: getRequestId(request),
255
+ phase,
256
+ pathname: url.pathname,
257
+ routeKey,
258
+ actionId,
259
+ durationMs,
260
+ customHandler: !!router.onTimeout,
261
+ });
196
262
  }
197
263
 
198
264
  if (router.onTimeout) {
@@ -225,16 +291,27 @@ export function createRSCHandler<
225
291
  function createRedirectFlightResponse(
226
292
  redirectUrl: string,
227
293
  locationState?: Record<string, unknown>,
294
+ external?: boolean,
228
295
  ): Response {
229
296
  const redirectPayload: RscPayload = {
230
297
  metadata: {
231
298
  pathname: redirectUrl,
232
299
  segments: [],
233
- redirect: { url: redirectUrl },
300
+ redirect: { url: redirectUrl, ...(external && { external: true }) },
234
301
  ...(locationState && { locationState }),
235
302
  },
236
303
  };
237
- const rscStream = renderToReadableStream<RscPayload>(redirectPayload);
304
+ const rscStream = renderToReadableStream<RscPayload>(redirectPayload, {
305
+ onError: (error: unknown) => {
306
+ const reqCtx = _getRequestContext<TEnv>();
307
+ if (!reqCtx) return;
308
+ callOnError(error, "rendering", {
309
+ request: reqCtx.request,
310
+ url: reqCtx.url,
311
+ env: reqCtx.env,
312
+ });
313
+ },
314
+ });
238
315
  return createResponseWithMergedHeaders(rscStream, {
239
316
  status: 200,
240
317
  headers: { "content-type": "text/x-component;charset=utf-8" },
@@ -268,6 +345,11 @@ export function createRSCHandler<
268
345
  input: RouterRequestInput<TEnv> = {},
269
346
  ): Promise<Response> {
270
347
  const handlerStart = performance.now();
348
+ // Create the metrics store at handler start so handler:total has startTime=0
349
+ // and all metrics are relative to the request entry point.
350
+ const earlyMetricsStore = router.debugPerformance
351
+ ? createMetricsStore(true, handlerStart)
352
+ : undefined;
271
353
 
272
354
  const { env = {} as TEnv, vars: initialVars, ctx: executionCtx } = input;
273
355
 
@@ -310,7 +392,7 @@ export function createRSCHandler<
310
392
  // Resolve cache store configuration
311
393
  // Priority: options.cache (handler override) > router.cache (router default)
312
394
  // Store is enabled only if: config provided, enabled, and no ?__no_cache query param
313
- let cacheStore = undefined;
395
+ let cacheStore: SegmentCacheStore | undefined;
314
396
  const cacheOption = options.cache ?? router.cache;
315
397
  if (cacheOption && !url.searchParams.has("__no_cache")) {
316
398
  const cacheConfig =
@@ -377,15 +459,27 @@ export function createRSCHandler<
377
459
  url,
378
460
  variables,
379
461
  cacheStore,
462
+ explicitTaggedStores,
380
463
  cacheProfiles: router.cacheProfiles,
381
464
  executionContext: executionCtx,
382
465
  themeConfig: router.themeConfig,
466
+ stateCookieName: router.resolvedStateCookieName,
467
+ version,
383
468
  });
469
+ // Thread the true request entry timestamp onto the context so a metrics
470
+ // store created MID-request (ctx.debugPerformance() / getMetricsStore) anchors
471
+ // to the real start, not the opt-in moment — phases that began earlier then
472
+ // report non-negative offsets. Set unconditionally: debug may be enabled later.
473
+ requestContext._handlerStart = handlerStart;
474
+ if (earlyMetricsStore) {
475
+ requestContext._debugPerformance = true;
476
+ requestContext._metricsStore = earlyMetricsStore;
477
+ }
384
478
  // Wire background error reporting so "use cache" and other subsystems
385
479
  // can surface non-fatal errors through the router's onError callback.
386
480
  requestContext._reportBackgroundError = (
387
481
  error: unknown,
388
- category: string,
482
+ category: CacheErrorCategory,
389
483
  ) => {
390
484
  callOnError(error, "cache", {
391
485
  request,
@@ -415,42 +509,120 @@ export function createRSCHandler<
415
509
  // - Server components during rendering
416
510
  // - Error boundaries
417
511
  // - Streaming
418
- return runWithRequestContext(requestContext, async () => {
419
- // Core handler logic (wrapped by middleware)
420
- const coreHandler = async (): Promise<Response> => {
421
- return coreRequestHandler(request, env, url, variables, nonce);
422
- };
512
+ // Store basename on request context (scoped per-request via existing ALS)
513
+ requestContext._basename = router.basename;
514
+
515
+ // Resolved span tracing for this request (read at each traced phase).
516
+ requestContext._tracing = router.tracing;
517
+
518
+ // The "rango.request" span is opened inside the request context so the
519
+ // Cloudflare runner can read executionContext.tracing, and so every nested
520
+ // phase span (and the platform's automatic KV/D1/fetch spans) nests under
521
+ // it. Construction-bound: the span ends when the Response is built, never
522
+ // wrapping the streamed body. metric:false — handler:total is metered
523
+ // directly below (a grand total incl. the pre-context bootstrap timings).
524
+ // When tracing is off this is a direct pass-through.
525
+ return runWithRequestContext(requestContext, () =>
526
+ observePhase(PHASES.request, async (span) => {
527
+ span.setAttribute("http.method", request.method);
528
+ // The matched route template is not known until match() runs later, so
529
+ // emit the concrete path as url.path (low-level), NOT http.route — the
530
+ // latter is reserved for the low-cardinality template (OTel convention).
531
+ span.setAttribute("url.path", url.pathname);
532
+
533
+ // Core handler logic (wrapped by middleware)
534
+ const coreHandler = async (): Promise<Response> => {
535
+ return coreRequestHandler(request, env, url, variables, nonce);
536
+ };
423
537
 
424
- // Execute middleware chain if any, otherwise call core handler directly
425
- if (matchedMiddleware.length > 0) {
426
- const mwResponse = await executeMiddleware(
427
- matchedMiddleware,
428
- request,
429
- env,
430
- variables,
431
- coreHandler,
432
- createReverseFunction(getRequiredRouteMap()),
433
- );
538
+ // Execute middleware chain if any, otherwise call core handler directly
539
+ let response: Response;
540
+ if (matchedMiddleware.length > 0) {
541
+ const mwResponse = await executeMiddleware(
542
+ matchedMiddleware,
543
+ request,
544
+ env,
545
+ variables,
546
+ coreHandler,
547
+ createReverseFunction(getRequiredRouteMap()),
548
+ );
434
549
 
435
- if (
436
- url.searchParams.has("_rsc_partial") ||
437
- url.searchParams.has("_rsc_action")
438
- ) {
439
- const intercepted = interceptRedirectForPartial(
440
- mwResponse,
441
- createRedirectFlightResponse,
550
+ if (
551
+ url.searchParams.has("_rsc_partial") ||
552
+ url.searchParams.has("_rsc_action")
553
+ ) {
554
+ const intercepted = interceptRedirectForPartial(
555
+ mwResponse,
556
+ createRedirectFlightResponse,
557
+ );
558
+ response = intercepted ?? finalizeResponse(mwResponse);
559
+ } else {
560
+ response = finalizeResponse(mwResponse);
561
+ }
562
+ } else {
563
+ response = await coreHandler();
564
+ }
565
+
566
+ // Finalize metrics after all middleware (including post-next work)
567
+ // has completed so :post spans are captured in the timeline.
568
+ // Handler timing parts are always emitted (even without debug metrics)
569
+ // so non-debug requests still get bootstrap Server-Timing entries.
570
+ const handlerTimingArr: string[] = variables.__handlerTiming || [];
571
+ // Preserve any existing Server-Timing set by response routes or middleware
572
+ const existingTiming = response.headers.get("Server-Timing");
573
+ const timingParts = existingTiming
574
+ ? [existingTiming, ...handlerTimingArr]
575
+ : [...handlerTimingArr];
576
+
577
+ const metricsStore = requestContext._metricsStore;
578
+ if (metricsStore) {
579
+ // When the store was created at handler start (earlyMetricsStore),
580
+ // handler:total covers the full request. When ctx.debugPerformance()
581
+ // created the store mid-request its requestStart is now the threaded
582
+ // _handlerStart (== handlerStart), so both branches yield the true
583
+ // request entry; reading the store's own anchor keeps this correct even
584
+ // if a store ever lands without the threading (falls back to its start).
585
+ const totalStart = earlyMetricsStore
586
+ ? handlerStart
587
+ : metricsStore.requestStart;
588
+ appendMetric(
589
+ metricsStore,
590
+ "handler:total",
591
+ totalStart,
592
+ performance.now() - totalStart,
442
593
  );
443
- if (intercepted) return intercepted;
594
+ const metricsTiming = buildMetricsTiming(
595
+ request.method,
596
+ url.pathname,
597
+ metricsStore,
598
+ );
599
+ if (metricsTiming) timingParts.push(metricsTiming);
444
600
  }
445
601
 
446
- return finalizeResponse(mwResponse);
447
- }
602
+ const fullTiming = timingParts.join(", ");
603
+ if (fullTiming && !isWebSocketUpgradeResponse(response)) {
604
+ try {
605
+ response.headers.set("Server-Timing", fullTiming);
606
+ } catch {
607
+ // Immutable headers (e.g. a passed-through platform Response) — drop
608
+ // the timing header, never the response. Instrumentation must not
609
+ // 500 a request.
610
+ }
611
+ }
448
612
 
449
- return coreHandler();
450
- });
613
+ // Single open-redirect chokepoint: every response (PE, full-page,
614
+ // middleware short-circuit, response-route) funnels through here, so
615
+ // guarding browser-followed (3xx) redirects once covers them all and any
616
+ // future redirect exit. Soft SPA/Flight redirects are 200/204 and pass
617
+ // through untouched (validated client-side instead).
618
+ return guardOutgoingRedirect(response, url.origin, router.basename);
619
+ }),
620
+ );
451
621
  };
452
622
 
453
- // Core request handling logic (separated for middleware wrapping)
623
+ // Core request handling logic (separated for middleware wrapping).
624
+ // Uses the classify → execute model: classifyRequest produces a RequestPlan,
625
+ // then execution dispatches on the plan mode.
454
626
  async function coreRequestHandler(
455
627
  request: Request,
456
628
  env: TEnv,
@@ -458,56 +630,103 @@ export function createRSCHandler<
458
630
  variables: Record<string, any>,
459
631
  nonce: string | undefined,
460
632
  ): Promise<Response> {
461
- const previewStart = performance.now();
462
- const preview = await router.previewMatch(request, { env });
463
- const previewDur = performance.now() - previewStart;
464
633
  const handlerTiming: string[] = variables.__handlerTiming || [];
465
- handlerTiming.push(`handler-preview-match;dur=${previewDur.toFixed(2)}`);
466
- // Response route short-circuit: skip entire RSC pipeline
467
- if (preview?.responseType && preview.handler) {
468
- const responseOutcome = await withTimeout(
469
- handleResponseRoute(
470
- handlerCtx,
471
- preview as ResponseRouteMatch,
472
- request,
473
- env,
474
- url,
475
- variables,
634
+
635
+ // Debug manifest endpoint: handled before classification since it
636
+ // doesn't need a route match and needs trie access from the closure.
637
+ const isDev = process.env.NODE_ENV !== "production";
638
+ if (
639
+ url.searchParams.has("__debug_manifest") &&
640
+ (isDev || router.allowDebugManifest)
641
+ ) {
642
+ const trie = getRouterTrie(router.id) ?? getRouteTrie();
643
+ const routeManifest = getRequiredRouteMap();
644
+ const { extractAncestryFromTrie } =
645
+ await import("../build/route-trie.js");
646
+ return new Response(
647
+ JSON.stringify(
648
+ {
649
+ routerId: router.id,
650
+ routeManifest,
651
+ routeAncestry: trie ? extractAncestryFromTrie(trie) : {},
652
+ routeTrie: trie,
653
+ precomputedEntries: getPrecomputedEntries(),
654
+ },
655
+ null,
656
+ 2,
476
657
  ),
477
- router.timeouts.renderStartMs,
478
- "render-start",
658
+ {
659
+ headers: { "Content-Type": "application/json" },
660
+ },
479
661
  );
480
- if (responseOutcome.timedOut) {
481
- return handleTimeoutResponse(
482
- request,
483
- env,
484
- url,
485
- "render-start",
486
- responseOutcome.durationMs,
487
- preview?.routeKey,
488
- );
662
+ }
663
+
664
+ // ---- 1. Classify ----
665
+ // classifyRequest may throw RouteNotFoundError for unknown routes.
666
+ // In that case, fall through to a full-render plan so the pipeline
667
+ // can render the 404 page via the existing error handling path.
668
+ const classifyStart = performance.now();
669
+ let plan: RequestPlan<TEnv>;
670
+ try {
671
+ plan = await classifyRequest<TEnv>(request, url, {
672
+ findMatch: router.findMatch,
673
+ routerVersion: version,
674
+ routerId: router.id,
675
+ });
676
+ } catch (error) {
677
+ if (isRouteNotFoundError(error)) {
678
+ // Let the render path handle 404 — match()/matchPartial() will
679
+ // re-throw RouteNotFoundError and the catch block in
680
+ // executeRenderWithMiddleware renders the not-found page.
681
+ plan = {
682
+ mode: "full-render",
683
+ route: {
684
+ matched: null as any,
685
+ manifestEntry: null as any,
686
+ entries: [],
687
+ routeKey: "",
688
+ localRouteName: "",
689
+ params: {},
690
+ routeMiddleware: [],
691
+ cacheScope: null,
692
+ isPassthrough: false,
693
+ },
694
+ negotiated: false,
695
+ };
696
+ } else {
697
+ throw error;
698
+ }
699
+ }
700
+ const classifyDur = performance.now() - classifyStart;
701
+ handlerTiming.push(`handler-classify;dur=${classifyDur.toFixed(2)}`);
702
+
703
+ // ---- 2. Terminal plans (no execution needed) ----
704
+ if (plan.mode === "redirect") {
705
+ // Redirects are handled by the pipeline (match/matchPartial),
706
+ // but for partial requests we short-circuit with a Flight redirect.
707
+ if (url.searchParams.has("_rsc_partial")) {
708
+ return createRedirectFlightResponse(plan.redirectUrl);
489
709
  }
490
- return responseOutcome.result;
710
+ // Full requests: let the pipeline handle the redirect via match()
711
+ // which returns { redirect: url }. Fall through to full-render.
491
712
  }
492
713
 
493
- const routeReverse = createReverseFunction(getRequiredRouteMap());
714
+ if (plan.mode === "version-mismatch") {
715
+ console.log(
716
+ `[RSC] Version mismatch: client=${url.searchParams.get("_rsc_v")}, server=${version}. Forcing reload.`,
717
+ );
718
+ return createReloadResponse(plan.reloadUrl);
719
+ }
494
720
 
495
- const isAction =
496
- request.headers.has("rsc-action") || url.searchParams.has("_rsc_action");
497
- const isLoaderFetch = url.searchParams.has("_rsc_loader");
498
- const actionId =
499
- request.headers.get("rsc-action") || url.searchParams.get("_rsc_action");
500
-
501
- // Origin guard: reject cross-origin actions, loader fetches, and
502
- // PE form submissions before any execution. Regular page navigations
503
- // (GET without _rsc_loader/_rsc_action) are not affected.
504
- const originPhase: OriginCheckPhase | null = isAction
505
- ? "action"
506
- : isLoaderFetch
507
- ? "loader"
508
- : request.method === "POST"
509
- ? "pe-form"
510
- : null;
721
+ if (plan.mode === "app-switch") {
722
+ // Cross-app SPA navigation crossed a host-router app boundary. Force a
723
+ // real document navigation so the target app's document is re-established
724
+ // (stylesheets, theme, warmup, prefetch-TTL). See request-classification.
725
+ return createReloadResponse(plan.reloadUrl);
726
+ }
727
+
728
+ // ---- 3. Origin guard (gate for action/loader/PE modes) ----
729
+ const originPhase = ORIGIN_CHECK_PHASE_BY_MODE[plan.mode];
511
730
  if (originPhase) {
512
731
  const originResult = await checkRequestOrigin(
513
732
  request,
@@ -535,37 +754,52 @@ export function createRSCHandler<
535
754
  },
536
755
  });
537
756
 
538
- try {
539
- const routerCtx = getRouterContext();
540
- if (routerCtx?.telemetry) {
541
- safeEmit(resolveSink(routerCtx.telemetry), {
542
- type: "request.origin-rejected" as const,
543
- timestamp: performance.now(),
544
- requestId: routerCtx.requestId,
545
- method: request.method,
546
- pathname: url.pathname,
547
- phase: originPhase,
548
- origin: request.headers.get("origin"),
549
- host: request.headers.get("host"),
550
- });
551
- }
552
- } catch {
553
- // Router context may not be available
757
+ if (router.telemetry) {
758
+ safeEmit(resolveSink(router.telemetry), {
759
+ type: "request.origin-rejected",
760
+ timestamp: performance.now(),
761
+ requestId: getRequestId(request),
762
+ method: request.method,
763
+ pathname: url.pathname,
764
+ phase: originPhase,
765
+ origin: request.headers.get("origin"),
766
+ host: request.headers.get("host"),
767
+ });
554
768
  }
555
769
 
556
770
  return originResult;
557
771
  }
558
772
  }
559
773
 
560
- // Get handle store from request context
561
- const handleStore = requireRequestContext()._handleStore;
774
+ // ---- 4. Execute ----
775
+ return executeRequest(
776
+ plan as ExecutableRequestPlan<TEnv>,
777
+ request,
778
+ env,
779
+ url,
780
+ variables,
781
+ nonce,
782
+ );
783
+ }
784
+
785
+ // Execute a classified request plan. Dispatches to the appropriate handler
786
+ // based on plan.mode. Lives in the createRSCHandler closure for access to
787
+ // handlerCtx, router, callOnError, etc.
788
+ // Only receives executable plans (version-mismatch is handled above).
789
+ async function executeRequest(
790
+ plan: ExecutableRequestPlan<TEnv>,
791
+ request: Request,
792
+ env: TEnv,
793
+ url: URL,
794
+ variables: Record<string, any>,
795
+ nonce: string | undefined,
796
+ ): Promise<Response> {
797
+ // Common setup
798
+ const handleStore = getRequestContext()._handleStore;
562
799
 
563
800
  // Wire up error reporting for late streaming-handle failures
564
- // (LateHandlePushError: handle pushed after stream completion).
565
- // Without this, these errors are only caught by React's error boundary
566
- // and never reach the router's onError callback or telemetry.
567
801
  handleStore.onError = (error: Error) => {
568
- const reqCtx = requireRequestContext();
802
+ const reqCtx = getRequestContext();
569
803
  callOnError(error, "handler", {
570
804
  request,
571
805
  url,
@@ -573,66 +807,152 @@ export function createRSCHandler<
573
807
  params: reqCtx.params as Record<string, string>,
574
808
  handledByBoundary: true,
575
809
  });
576
- try {
577
- const routerCtx = getRouterContext();
578
- if (routerCtx?.telemetry) {
579
- safeEmit(resolveSink(routerCtx.telemetry), {
580
- type: "handler.error" as const,
581
- timestamp: performance.now(),
582
- requestId: routerCtx.requestId,
583
- error,
584
- handledByBoundary: true,
585
- pathname: url.pathname,
586
- routeKey: reqCtx._routeName,
587
- params: reqCtx.params as Record<string, string>,
588
- });
589
- }
590
- } catch {
591
- // Router context may not be available (e.g. prerender path)
810
+ if (router.telemetry) {
811
+ safeEmit(resolveSink(router.telemetry), {
812
+ type: "handler.error",
813
+ timestamp: performance.now(),
814
+ requestId: getRequestId(request),
815
+ error,
816
+ handledByBoundary: true,
817
+ pathname: url.pathname,
818
+ routeKey: reqCtx._routeName,
819
+ params: reqCtx.params as Record<string, string>,
820
+ });
592
821
  }
593
822
  };
594
823
 
595
824
  // Set route params early so all execution paths can access ctx.params.
596
- if (preview?.params) {
597
- setRequestContextParams(preview.params, preview.routeKey);
825
+ // Also store the classified snapshot so match/matchPartial can reuse it
826
+ // instead of calling resolveRoute again.
827
+ if (plan.mode !== "redirect") {
828
+ setRequestContextParams(plan.route.params, plan.route.routeKey);
829
+ getRequestContext()._classifiedRoute = plan.route;
598
830
  }
599
831
 
600
- // Progressive enhancement runs before the normal action/render paths.
601
- // Route middleware wraps the PE re-render so handlers see the same
602
- // context variables regardless of JS/no-JS transport.
603
- const progressiveResult = await handleProgressiveEnhancement(
604
- handlerCtx,
605
- request,
606
- env,
607
- url,
608
- isAction,
609
- handleStore,
610
- nonce,
611
- {
612
- routeMiddleware: preview?.routeMiddleware,
832
+ const routeReverse = createReverseFunction(getRequiredRouteMap());
833
+
834
+ // ---- Response route: skip entire RSC pipeline ----
835
+ if (plan.mode === "response") {
836
+ // Build ResponseRouteMatch from plan fields. handleResponseRoute
837
+ // expects a flat object with params at the top level.
838
+ const responseMatch: ResponseRouteMatch = {
839
+ responseType: plan.responseType,
840
+ handler: plan.handler,
841
+ params: plan.route.params,
842
+ negotiated: plan.negotiated,
843
+ manifestEntry: plan.manifestEntry,
844
+ routeMiddleware: plan.routeMiddleware,
845
+ };
846
+ const responseOutcome = await withTimeout(
847
+ handleResponseRoute(
848
+ handlerCtx,
849
+ responseMatch,
850
+ request,
851
+ env,
852
+ url,
853
+ variables,
854
+ ),
855
+ router.timeouts.renderStartMs,
856
+ "render-start",
857
+ );
858
+ if (responseOutcome.timedOut) {
859
+ return handleTimeoutResponse(
860
+ request,
861
+ env,
862
+ url,
863
+ "render-start",
864
+ responseOutcome.durationMs,
865
+ plan.route.routeKey,
866
+ );
867
+ }
868
+ const response = responseOutcome.result;
869
+ if (plan.negotiated && !isWebSocketUpgradeResponse(response)) {
870
+ // handleResponseRoute (callHandlerWithVary) already appends Vary: Accept
871
+ // for negotiated responses; dedup so we don't emit Vary: Accept, Accept.
872
+ appendVaryAccept(response);
873
+ }
874
+ return response;
875
+ }
876
+
877
+ // SSR setup: kick off in parallel for modes that need HTML rendering.
878
+ // Placed after response-route short-circuit so response/mime routes
879
+ // never pay for SSR work.
880
+ //
881
+ // Only kick off when the request will actually render HTML, so the
882
+ // eager loadSSRModule() + user resolveStreaming() are not started (and
883
+ // never consumed) for a request that returns an RSC stream — that wasted
884
+ // work also leaves an orphaned Promise.all that can reject (D7). PE form
885
+ // submissions always render HTML (handleProgressiveEnhancement renders via
886
+ // getSSRSetup regardless of Accept). For full/partial-render and action,
887
+ // the render-time HTML decision is exactly !isRscRequest — mayNeedSSR is
888
+ // the coarse transport pre-filter, isRscRequest is the precise Accept call
889
+ // (it, unlike mayNeedSSR, treats a MISSING Accept as RSC). Both must pass.
890
+ const willRenderHtml =
891
+ plan.mode === "pe-render" ||
892
+ (mayNeedSSR(request, url) &&
893
+ !isRscRequest(request, url, plan.mode === "partial-render"));
894
+ if (plan.mode !== "loader" && willRenderHtml) {
895
+ variables[SSR_SETUP_VAR] = startSSRSetup(
896
+ handlerCtx,
897
+ request,
898
+ env,
899
+ url,
900
+ router.debugPerformance
901
+ ? () => getRequestContext()._metricsStore
902
+ : undefined,
903
+ );
904
+ }
905
+
906
+ // ---- Loader fetch ----
907
+ if (plan.mode === "loader") {
908
+ return handleLoaderFetch(
909
+ handlerCtx,
910
+ request,
911
+ env,
912
+ url,
613
913
  variables,
614
- routeReverse,
615
- },
616
- );
617
- if (progressiveResult) {
618
- return progressiveResult;
914
+ plan.route.params,
915
+ );
619
916
  }
620
917
 
621
- // --- Action execution: runs BEFORE route middleware ---
622
- // Route middleware wraps rendering only. For actions, the action runs
623
- // first in the global middleware context, then route middleware wraps
624
- // the revalidation pass (identical to a normal render).
625
- let actionContinuation: ActionContinuation | undefined;
626
- if (isAction && actionId) {
918
+ // ---- Progressive enhancement ----
919
+ if (plan.mode === "pe-render") {
920
+ const peResult = await handleProgressiveEnhancement(
921
+ handlerCtx,
922
+ request,
923
+ env,
924
+ url,
925
+ false, // isAction = false for PE
926
+ handleStore,
927
+ nonce,
928
+ {
929
+ routeMiddleware: plan.route.routeMiddleware,
930
+ variables,
931
+ routeReverse,
932
+ },
933
+ );
934
+ if (peResult) return peResult;
935
+ // PE handler returned null (not a PE form) — fall through to render
936
+ }
937
+
938
+ // ---- Action: execute action, then revalidate wrapped in route middleware ----
939
+ if (plan.mode === "action") {
940
+ let actionContinuation: ActionContinuation | undefined;
627
941
  try {
942
+ // Instrument the action execution as its own phase (action:<actionId> +
943
+ // rango.action), so a POST shows the mutation time AND which action ran,
944
+ // not just the downstream revalidation render. The action's own
945
+ // loaders/fetches nest under rango.action.
628
946
  const actionOutcome = await withTimeout(
629
- executeServerAction(
630
- handlerCtx,
631
- request,
632
- env,
633
- url,
634
- actionId,
635
- handleStore,
947
+ observePhase(PHASES.action(plan.actionId), () =>
948
+ executeServerAction(
949
+ handlerCtx,
950
+ request,
951
+ env,
952
+ url,
953
+ plan.actionId,
954
+ handleStore,
955
+ ),
636
956
  ),
637
957
  router.timeouts.actionMs,
638
958
  "action",
@@ -644,8 +964,8 @@ export function createRSCHandler<
644
964
  url,
645
965
  "action",
646
966
  actionOutcome.durationMs,
647
- preview?.routeKey,
648
- actionId,
967
+ plan.route.routeKey,
968
+ plan.actionId,
649
969
  );
650
970
  }
651
971
  const result = actionOutcome.result;
@@ -657,40 +977,251 @@ export function createRSCHandler<
657
977
  request,
658
978
  url,
659
979
  env,
660
- actionId,
980
+ actionId: plan.actionId,
661
981
  handledByBoundary: false,
662
982
  });
663
983
  console.error(`[RSC] Action error:`, error);
664
984
  throw error;
665
985
  }
666
- }
667
986
 
668
- // --- Rendering (action revalidation or navigation) ---
669
- // Route middleware wraps this — same code path for both cases.
670
- const renderHandler = async () => {
671
- const response = await coreRequestHandlerInner(
987
+ // Revalidation render wrapped in route middleware.
988
+ // Actions from client-side navigation include _rsc_partial — preserve
989
+ // the partial flag so the revalidation returns a Flight stream, not HTML.
990
+ // App-switch is already excluded by classifyRequest (would be full-render).
991
+ const isPartialAction = url.searchParams.has("_rsc_partial");
992
+ return executeRenderWithMiddleware(
993
+ plan.route.routeMiddleware,
994
+ plan.negotiated,
995
+ plan.route.routeKey,
996
+ routeReverse,
672
997
  request,
673
998
  env,
674
999
  url,
675
1000
  variables,
676
1001
  nonce,
677
- preview?.params,
678
- preview?.routeKey,
679
1002
  handleStore,
1003
+ isPartialAction,
680
1004
  actionContinuation,
681
1005
  );
682
- if (preview?.negotiated) {
683
- response.headers.append("Vary", "Accept");
1006
+ }
1007
+
1008
+ // Full render, partial render, fallen-through PE, and full-page redirect all
1009
+ // render through the same middleware-wrapped path. Only full/partial-render
1010
+ // carry negotiation + the partial flag; pe/redirect render plainly.
1011
+ const isPartial = plan.mode === "partial-render";
1012
+ const negotiated =
1013
+ plan.mode === "full-render" || plan.mode === "partial-render"
1014
+ ? plan.negotiated
1015
+ : false;
1016
+ return executeRenderWithMiddleware(
1017
+ plan.route.routeMiddleware,
1018
+ negotiated,
1019
+ plan.route.routeKey,
1020
+ routeReverse,
1021
+ request,
1022
+ env,
1023
+ url,
1024
+ variables,
1025
+ nonce,
1026
+ handleStore,
1027
+ isPartial,
1028
+ );
1029
+ }
1030
+
1031
+ // Shared render execution: wraps handleRscRendering (or revalidateAfterAction)
1032
+ // in route middleware and timeout handling. Consolidates the pattern used by
1033
+ // action-revalidate, full-render, and partial-render modes.
1034
+ async function executeRenderWithMiddleware(
1035
+ routeMiddleware: import("../router/middleware-types.js").CollectedMiddleware[],
1036
+ negotiated: boolean,
1037
+ routeKey: string,
1038
+ routeReverse: ReturnType<typeof createReverseFunction>,
1039
+ request: Request,
1040
+ env: TEnv,
1041
+ url: URL,
1042
+ variables: Record<string, any>,
1043
+ nonce: string | undefined,
1044
+ handleStore: ReturnType<typeof getRequestContext>["_handleStore"],
1045
+ isPartial: boolean,
1046
+ actionContinuation?: ActionContinuation,
1047
+ ): Promise<Response> {
1048
+ const renderHandler = async (): Promise<Response> => {
1049
+ try {
1050
+ let response: Response;
1051
+ if (actionContinuation) {
1052
+ response = await revalidateAfterAction(
1053
+ handlerCtx,
1054
+ request,
1055
+ env,
1056
+ url,
1057
+ handleStore,
1058
+ actionContinuation,
1059
+ );
1060
+ } else {
1061
+ response = await handleRscRendering(
1062
+ handlerCtx,
1063
+ request,
1064
+ env,
1065
+ url,
1066
+ isPartial,
1067
+ handleStore,
1068
+ nonce,
1069
+ );
1070
+ }
1071
+ if (negotiated && !isWebSocketUpgradeResponse(response)) {
1072
+ // handleRscRendering bakes `accept` into the RSC response's Vary list;
1073
+ // dedup so the negotiated append does not list accept twice.
1074
+ appendVaryAccept(response);
1075
+ }
1076
+ return response;
1077
+ } catch (error) {
1078
+ // Check if middleware/handler returned Response
1079
+ if (error instanceof Response) {
1080
+ // An action revalidation render is delivered to the client over the
1081
+ // same Flight-parsing path as a partial navigation, so a Response
1082
+ // thrown during it must be converted exactly like a partial one
1083
+ // (raw 200 -> hard-nav hint, 3xx -> Flight redirect). Without this,
1084
+ // the no-middleware path returns the raw Response (the with-middleware
1085
+ // path is already covered by the isPartial || actionContinuation
1086
+ // guard below).
1087
+ const treatAsPartial = isPartial || actionContinuation != null;
1088
+
1089
+ // During partial (client-side navigation), a 200 Response from a handler
1090
+ // means the route serves raw content (JSON, text, etc.), not JSX.
1091
+ // Signal the browser to hard-navigate so it renders the raw response.
1092
+ if (treatAsPartial && error.status === 200) {
1093
+ console.warn(
1094
+ `[RSC] Route handler at ${url.pathname} returned a Response during client-side navigation. ` +
1095
+ `Falling back to hard navigation. Use data-external on the <Link> to avoid the extra round-trip.`,
1096
+ );
1097
+ return createResponseWithMergedHeaders(null, {
1098
+ status: 200,
1099
+ headers: {
1100
+ "X-RSC-Reload": stripInternalParams(url).toString(),
1101
+ "content-type": "text/x-component;charset=utf-8",
1102
+ },
1103
+ });
1104
+ }
1105
+
1106
+ if (treatAsPartial) {
1107
+ const intercepted = interceptRedirectForPartial(
1108
+ error,
1109
+ createRedirectFlightResponse,
1110
+ );
1111
+ if (intercepted) return intercepted;
1112
+ }
1113
+
1114
+ return error;
1115
+ }
1116
+
1117
+ // Render 404 page for unmatched routes
1118
+ if (isRouteNotFoundError(error)) {
1119
+ callOnError(error, "routing", {
1120
+ request,
1121
+ url,
1122
+ env,
1123
+ handledByBoundary: true,
1124
+ });
1125
+
1126
+ const notFoundOption = router.notFound;
1127
+ const notFoundComponent =
1128
+ typeof notFoundOption === "function"
1129
+ ? notFoundOption({ pathname: url.pathname })
1130
+ : (notFoundOption ?? createElement("h1", null, "Not Found"));
1131
+
1132
+ const notFoundSegment = {
1133
+ id: "notFound",
1134
+ namespace: "notFound",
1135
+ type: "route" as const,
1136
+ index: 0,
1137
+ component: notFoundComponent,
1138
+ params: {},
1139
+ };
1140
+
1141
+ const payload: RscPayload = {
1142
+ metadata: {
1143
+ pathname: url.pathname,
1144
+ routerId: router.id,
1145
+ basename: router.basename,
1146
+ segments: [notFoundSegment],
1147
+ matched: [],
1148
+ diff: [],
1149
+ // Shape parity with buildFullPayload (rsc-rendering.ts): the 404
1150
+ // payload carries params/resolvedIds/prefetchCacheTTL the same way a
1151
+ // matched full render does. resolvedIds mirrors the rendered segment
1152
+ // list (the single notFound segment) like the error-boundary path
1153
+ // (match-api.ts) does for its boundary segment.
1154
+ resolvedIds: [notFoundSegment.id],
1155
+ params: {},
1156
+ isPartial: false,
1157
+ rootLayout: router.rootLayout,
1158
+ // Full (404) render: resolve deferred handle values server-side.
1159
+ handles: resolvedHandleStream(handleStore),
1160
+ version,
1161
+ prefetchCacheTTL: router.prefetchCacheTTL,
1162
+ prefetchCacheSize: router.prefetchCacheSize,
1163
+ prefetchConcurrency: router.prefetchConcurrency,
1164
+ stateCookieName: router.resolvedStateCookieName,
1165
+ themeConfig: router.themeConfig,
1166
+ warmupEnabled: router.warmupEnabled,
1167
+ strictMode: router.strictMode,
1168
+ initialTheme: getRequestContext().theme,
1169
+ },
1170
+ };
1171
+
1172
+ const rscStream = renderToReadableStream(payload, {
1173
+ onError: (error: unknown) => {
1174
+ callOnError(error, "rendering", { request, url, env });
1175
+ },
1176
+ });
1177
+
1178
+ if (isRscRequest(request, url, isPartial)) {
1179
+ return createResponseWithMergedHeaders(rscStream, {
1180
+ status: 404,
1181
+ headers: {
1182
+ "content-type": "text/x-component;charset=utf-8",
1183
+ // Router identity for the client's pre-decode integrity check; a
1184
+ // same-app 404 matches and applies in place. See response-adapter.
1185
+ "X-RSC-Router-Id": router.id,
1186
+ },
1187
+ });
1188
+ }
1189
+
1190
+ const [ssrModule, streamMode] = await getSSRSetup(
1191
+ handlerCtx,
1192
+ request,
1193
+ env,
1194
+ url,
1195
+ getRequestContext()._metricsStore,
1196
+ );
1197
+ const htmlStream = await ssrModule.renderHTML(rscStream, {
1198
+ nonce,
1199
+ streamMode,
1200
+ });
1201
+
1202
+ return createResponseWithMergedHeaders(htmlStream, {
1203
+ status: 404,
1204
+ headers: { "content-type": "text/html;charset=utf-8" },
1205
+ });
1206
+ }
1207
+
1208
+ // Report unhandled errors
1209
+ callOnError(error, "routing", {
1210
+ request,
1211
+ url,
1212
+ env,
1213
+ handledByBoundary: false,
1214
+ });
1215
+ console.error(`[RSC] Error:`, error);
1216
+ throw error;
684
1217
  }
685
- return response;
686
1218
  };
687
1219
 
688
- // Wrap the render path (with or without route middleware) in a
689
- // renderStartMs timeout so slow renders are caught before output.
1220
+ // Wrap the render path in a renderStartMs timeout
690
1221
  const executeRender = async (): Promise<Response> => {
691
- if (preview?.routeMiddleware && preview.routeMiddleware.length > 0) {
1222
+ if (routeMiddleware.length > 0) {
692
1223
  const mwResponse = await executeMiddleware(
693
- buildRouteMiddlewareEntries<TEnv>(preview.routeMiddleware),
1224
+ buildRouteMiddlewareEntries<TEnv>(routeMiddleware),
694
1225
  request,
695
1226
  env,
696
1227
  variables,
@@ -698,10 +1229,7 @@ export function createRSCHandler<
698
1229
  routeReverse,
699
1230
  );
700
1231
 
701
- if (
702
- url.searchParams.has("_rsc_partial") ||
703
- url.searchParams.has("_rsc_action")
704
- ) {
1232
+ if (isPartial || actionContinuation) {
705
1233
  const intercepted = interceptRedirectForPartial(
706
1234
  mwResponse,
707
1235
  createRedirectFlightResponse,
@@ -712,7 +1240,6 @@ export function createRSCHandler<
712
1240
  return finalizeResponse(mwResponse);
713
1241
  }
714
1242
 
715
- // No route middleware, proceed directly
716
1243
  return renderHandler();
717
1244
  };
718
1245
 
@@ -728,267 +1255,9 @@ export function createRSCHandler<
728
1255
  url,
729
1256
  "render-start",
730
1257
  renderOutcome.durationMs,
731
- preview?.routeKey,
1258
+ routeKey,
732
1259
  );
733
1260
  }
734
1261
  return renderOutcome.result;
735
1262
  }
736
-
737
- // Inner request handler: rendering logic wrapped by route middleware.
738
- // Handles action revalidation (when actionContinuation is present),
739
- // loader fetches, and regular RSC rendering.
740
- async function coreRequestHandlerInner(
741
- request: Request,
742
- env: TEnv,
743
- url: URL,
744
- variables: Record<string, any>,
745
- nonce: string | undefined,
746
- routeParams?: Record<string, string>,
747
- routeKey?: string,
748
- handleStore?: ReturnType<typeof requireRequestContext>["_handleStore"],
749
- actionContinuation?: ActionContinuation,
750
- ): Promise<Response> {
751
- const isPartial = url.searchParams.has("_rsc_partial");
752
- const isAction =
753
- request.headers.has("rsc-action") || url.searchParams.has("_rsc_action");
754
-
755
- // Version mismatch detection - client may have stale code after HMR/deployment
756
- // If versions don't match, tell the client to reload
757
- const clientVersion = url.searchParams.get("_rsc_v");
758
- if (version && clientVersion && clientVersion !== version) {
759
- console.log(
760
- `[RSC] Version mismatch: client=${clientVersion}, server=${version}. Forcing reload.`,
761
- );
762
-
763
- // For actions, reload current page (referer) if same origin.
764
- // For navigation, load the target URL.
765
- // Validate referer origin to prevent open redirect via crafted header.
766
- let reloadUrl = stripInternalParams(url).toString();
767
- if (isAction) {
768
- const referer = request.headers.get("referer");
769
- if (referer) {
770
- try {
771
- const refererUrl = new URL(referer);
772
- if (refererUrl.origin === url.origin) {
773
- reloadUrl = referer;
774
- }
775
- } catch {
776
- // Malformed referer, fall back to cleanUrl
777
- }
778
- }
779
- }
780
-
781
- // Return special response that tells client to reload
782
- return createResponseWithMergedHeaders(null, {
783
- status: 200,
784
- headers: {
785
- "X-RSC-Reload": reloadUrl,
786
- "content-type": "text/x-component;charset=utf-8",
787
- },
788
- });
789
- }
790
- // Debug manifest endpoint: ?__debug_manifest on any route.
791
- // Always available in dev, requires allowDebugManifest option in production.
792
- const isDev = process.env.NODE_ENV !== "production";
793
- if (
794
- url.searchParams.has("__debug_manifest") &&
795
- (isDev || router.allowDebugManifest)
796
- ) {
797
- const trie = getRouterTrie(router.id) ?? getRouteTrie();
798
- const routeManifest = getRequiredRouteMap();
799
- const { extractAncestryFromTrie } =
800
- await import("../build/route-trie.js");
801
- return new Response(
802
- JSON.stringify(
803
- {
804
- routerId: router.id,
805
- routeManifest,
806
- routeAncestry: trie ? extractAncestryFromTrie(trie) : {},
807
- routeTrie: trie,
808
- precomputedEntries: getPrecomputedEntries(),
809
- },
810
- null,
811
- 2,
812
- ),
813
- {
814
- headers: { "Content-Type": "application/json" },
815
- },
816
- );
817
- }
818
-
819
- const store = handleStore ?? requireRequestContext()._handleStore;
820
-
821
- try {
822
- // Route params were already set in coreRequestHandler, but set again
823
- // for callers that enter coreRequestHandlerInner directly.
824
- if (routeParams) {
825
- setRequestContextParams(routeParams, routeKey);
826
- }
827
-
828
- // ============================================================================
829
- // ACTION REVALIDATION (action already executed, revalidate segments)
830
- // ============================================================================
831
- if (actionContinuation) {
832
- return await revalidateAfterAction(
833
- handlerCtx,
834
- request,
835
- env,
836
- url,
837
- store,
838
- actionContinuation,
839
- );
840
- }
841
-
842
- // ============================================================================
843
- // LOADER FETCH EXECUTION (data fetching with RSC serialization)
844
- // ============================================================================
845
- const isLoaderRequest = url.searchParams.has("_rsc_loader");
846
- if (isLoaderRequest) {
847
- return handleLoaderFetch(
848
- handlerCtx,
849
- request,
850
- env,
851
- url,
852
- variables,
853
- routeParams,
854
- );
855
- }
856
-
857
- // ============================================================================
858
- // REGULAR RSC RENDERING (Navigation)
859
- // ============================================================================
860
- // Note: Must use "return await" for try/catch to catch async rejections
861
- return await handleRscRendering(
862
- handlerCtx,
863
- request,
864
- env,
865
- url,
866
- isPartial,
867
- store,
868
- nonce,
869
- );
870
- } catch (error) {
871
- // Check if middleware/handler returned Response
872
- if (error instanceof Response) {
873
- // During partial (client-side navigation), a 200 Response from a handler
874
- // means the route serves raw content (JSON, text, etc.), not JSX.
875
- // Signal the browser to hard-navigate so it renders the raw response.
876
- // Only for 200 — redirects (3xx) work already because the browser follows
877
- // them automatically to a URL that serves Flight data.
878
- if (isPartial && error.status === 200) {
879
- console.warn(
880
- `[RSC] Route handler at ${url.pathname} returned a Response during client-side navigation. ` +
881
- `Falling back to hard navigation. Use data-external on the <Link> to avoid the extra round-trip.`,
882
- );
883
- return createResponseWithMergedHeaders(null, {
884
- status: 200,
885
- headers: {
886
- "X-RSC-Reload": stripInternalParams(url).toString(),
887
- "content-type": "text/x-component;charset=utf-8",
888
- },
889
- });
890
- }
891
-
892
- if (isPartial) {
893
- const intercepted = interceptRedirectForPartial(
894
- error,
895
- createRedirectFlightResponse,
896
- );
897
- if (intercepted) return intercepted;
898
- }
899
-
900
- return error;
901
- }
902
-
903
- // Render 404 page for unmatched routes
904
- // Check both instanceof and error.name for cross-bundle compatibility
905
- const isRouteNotFound =
906
- error instanceof RouteNotFoundError ||
907
- (error instanceof Error && error.name === "RouteNotFoundError");
908
- if (isRouteNotFound) {
909
- callOnError(error, "routing", {
910
- request,
911
- url,
912
- env,
913
- handledByBoundary: true, // Handled by notFound component
914
- });
915
-
916
- // Get notFound component from router options or use default
917
- const notFoundOption = router.notFound;
918
- const notFoundComponent =
919
- typeof notFoundOption === "function"
920
- ? notFoundOption({ pathname: url.pathname })
921
- : (notFoundOption ?? createElement("h1", null, "Not Found"));
922
-
923
- // Create a simple segment for the 404 page
924
- const notFoundSegment = {
925
- id: "notFound",
926
- namespace: "notFound",
927
- type: "route" as const,
928
- index: 0,
929
- component: notFoundComponent,
930
- params: {},
931
- };
932
-
933
- const payload: RscPayload = {
934
- metadata: {
935
- pathname: url.pathname,
936
- segments: [notFoundSegment],
937
- matched: [],
938
- diff: [],
939
- isPartial: false,
940
- rootLayout: router.rootLayout,
941
- handles: store.stream(),
942
- version,
943
- themeConfig: router.themeConfig,
944
- warmupEnabled: router.warmupEnabled,
945
- initialTheme: requireRequestContext().theme,
946
- // No routeName for not-found routes
947
- },
948
- };
949
-
950
- const rscStream = renderToReadableStream(payload);
951
-
952
- // Determine if this is an RSC request or HTML request.
953
- // Partial requests are always RSC (see main isRscRequest comment).
954
- const isRscRequest =
955
- isPartial ||
956
- (!request.headers.get("accept")?.includes("text/html") &&
957
- !url.searchParams.has("__html")) ||
958
- url.searchParams.has("__rsc");
959
-
960
- if (isRscRequest) {
961
- return createResponseWithMergedHeaders(rscStream, {
962
- status: 404,
963
- headers: { "content-type": "text/x-component;charset=utf-8" },
964
- });
965
- }
966
-
967
- // Delegate to SSR for HTML response
968
- const [ssrModule, streamMode] = await Promise.all([
969
- loadSSRModule(),
970
- handlerCtx.resolveStreamMode(request, env, url),
971
- ]);
972
- const htmlStream = await ssrModule.renderHTML(rscStream, {
973
- nonce,
974
- streamMode,
975
- });
976
-
977
- return createResponseWithMergedHeaders(htmlStream, {
978
- status: 404,
979
- headers: { "content-type": "text/html;charset=utf-8" },
980
- });
981
- }
982
-
983
- // Report unhandled errors
984
- callOnError(error, "routing", {
985
- request,
986
- url,
987
- env,
988
- handledByBoundary: false,
989
- });
990
- console.error(`[RSC] Error:`, error);
991
- throw error;
992
- }
993
- }
994
1263
  }