@rangojs/router 0.0.0-experimental.25 → 0.0.0-experimental.25dbaac3

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 (997) hide show
  1. package/AGENTS.md +4 -0
  2. package/README.md +191 -37
  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 +138 -50
  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/dist/browser/react/use-client-cache.js +39 -0
  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/dist/handles/index.js +6 -0
  358. package/dist/handles/index.js.map +1 -0
  359. package/dist/handles/meta.d.ts +39 -0
  360. package/dist/handles/meta.d.ts.map +1 -0
  361. package/dist/handles/meta.js +202 -0
  362. package/dist/handles/meta.js.map +1 -0
  363. package/dist/host/__tests__/errors.test.d.ts +2 -0
  364. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  365. package/dist/host/__tests__/errors.test.js +76 -0
  366. package/dist/host/__tests__/errors.test.js.map +1 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  370. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  372. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  374. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  375. package/dist/host/__tests__/router.test.d.ts +2 -0
  376. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  377. package/dist/host/__tests__/router.test.js +241 -0
  378. package/dist/host/__tests__/router.test.js.map +1 -0
  379. package/dist/host/__tests__/testing.test.d.ts +2 -0
  380. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  381. package/dist/host/__tests__/testing.test.js +64 -0
  382. package/dist/host/__tests__/testing.test.js.map +1 -0
  383. package/dist/host/__tests__/utils.test.d.ts +2 -0
  384. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  385. package/dist/host/__tests__/utils.test.js +29 -0
  386. package/dist/host/__tests__/utils.test.js.map +1 -0
  387. package/dist/host/cookie-handler.d.ts +34 -0
  388. package/dist/host/cookie-handler.d.ts.map +1 -0
  389. package/dist/host/cookie-handler.js +124 -0
  390. package/dist/host/cookie-handler.js.map +1 -0
  391. package/dist/host/errors.d.ts +56 -0
  392. package/dist/host/errors.d.ts.map +1 -0
  393. package/dist/host/errors.js +79 -0
  394. package/dist/host/errors.js.map +1 -0
  395. package/dist/host/index.d.ts +29 -0
  396. package/dist/host/index.d.ts.map +1 -0
  397. package/dist/host/index.js +32 -0
  398. package/dist/host/index.js.map +1 -0
  399. package/dist/host/pattern-matcher.d.ts +36 -0
  400. package/dist/host/pattern-matcher.d.ts.map +1 -0
  401. package/dist/host/pattern-matcher.js +172 -0
  402. package/dist/host/pattern-matcher.js.map +1 -0
  403. package/dist/host/router.d.ts +26 -0
  404. package/dist/host/router.d.ts.map +1 -0
  405. package/dist/host/router.js +218 -0
  406. package/dist/host/router.js.map +1 -0
  407. package/dist/host/testing.d.ts +36 -0
  408. package/dist/host/testing.d.ts.map +1 -0
  409. package/dist/host/testing.js +55 -0
  410. package/dist/host/testing.js.map +1 -0
  411. package/dist/host/types.d.ts +115 -0
  412. package/dist/host/types.d.ts.map +1 -0
  413. package/dist/host/types.js +7 -0
  414. package/dist/host/types.js.map +1 -0
  415. package/dist/host/utils.d.ts +21 -0
  416. package/dist/host/utils.d.ts.map +1 -0
  417. package/dist/host/utils.js +23 -0
  418. package/dist/host/utils.js.map +1 -0
  419. package/dist/href-client.d.ts +131 -0
  420. package/dist/href-client.d.ts.map +1 -0
  421. package/dist/href-client.js +64 -0
  422. package/dist/href-client.js.map +1 -0
  423. package/dist/href-context.d.ts +29 -0
  424. package/dist/href-context.d.ts.map +1 -0
  425. package/dist/href-context.js +21 -0
  426. package/dist/href-context.js.map +1 -0
  427. package/dist/index.d.ts +73 -0
  428. package/dist/index.d.ts.map +1 -0
  429. package/dist/index.js +91 -0
  430. package/dist/index.js.map +1 -0
  431. package/dist/index.rsc.d.ts +32 -0
  432. package/dist/index.rsc.d.ts.map +1 -0
  433. package/dist/index.rsc.js +40 -0
  434. package/dist/index.rsc.js.map +1 -0
  435. package/dist/internal-debug.d.ts +2 -0
  436. package/dist/internal-debug.d.ts.map +1 -0
  437. package/dist/internal-debug.js +5 -0
  438. package/dist/internal-debug.js.map +1 -0
  439. package/dist/loader.d.ts +14 -0
  440. package/dist/loader.d.ts.map +1 -0
  441. package/dist/loader.js +20 -0
  442. package/dist/loader.js.map +1 -0
  443. package/dist/loader.rsc.d.ts +19 -0
  444. package/dist/loader.rsc.d.ts.map +1 -0
  445. package/dist/loader.rsc.js +99 -0
  446. package/dist/loader.rsc.js.map +1 -0
  447. package/dist/network-error-thrower.d.ts +17 -0
  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/theme/ThemeProvider.d.ts +20 -0
  712. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  713. package/dist/theme/ThemeProvider.js +240 -0
  714. package/dist/theme/ThemeProvider.js.map +1 -0
  715. package/dist/theme/ThemeScript.d.ts +48 -0
  716. package/dist/theme/ThemeScript.d.ts.map +1 -0
  717. package/dist/theme/ThemeScript.js +13 -0
  718. package/dist/theme/ThemeScript.js.map +1 -0
  719. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  720. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  721. package/dist/theme/__tests__/theme.test.js +103 -0
  722. package/dist/theme/__tests__/theme.test.js.map +1 -0
  723. package/dist/theme/constants.d.ts +29 -0
  724. package/dist/theme/constants.d.ts.map +1 -0
  725. package/dist/theme/constants.js +48 -0
  726. package/dist/theme/constants.js.map +1 -0
  727. package/dist/theme/index.d.ts +31 -0
  728. package/dist/theme/index.d.ts.map +1 -0
  729. package/dist/theme/index.js +36 -0
  730. package/dist/theme/index.js.map +1 -0
  731. package/dist/theme/theme-context.d.ts +40 -0
  732. package/dist/theme/theme-context.d.ts.map +1 -0
  733. package/dist/theme/theme-context.js +60 -0
  734. package/dist/theme/theme-context.js.map +1 -0
  735. package/dist/theme/theme-script.d.ts +27 -0
  736. package/dist/theme/theme-script.d.ts.map +1 -0
  737. package/dist/theme/theme-script.js +147 -0
  738. package/dist/theme/theme-script.js.map +1 -0
  739. package/dist/theme/types.d.ts +163 -0
  740. package/dist/theme/types.d.ts.map +1 -0
  741. package/dist/theme/types.js +11 -0
  742. package/dist/theme/types.js.map +1 -0
  743. package/dist/theme/use-theme.d.ts +12 -0
  744. package/dist/theme/use-theme.d.ts.map +1 -0
  745. package/dist/theme/use-theme.js +40 -0
  746. package/dist/theme/use-theme.js.map +1 -0
  747. package/dist/types.d.ts +1479 -0
  748. package/dist/types.d.ts.map +1 -0
  749. package/dist/types.js +10 -0
  750. package/dist/types.js.map +1 -0
  751. package/dist/urls.d.ts +441 -0
  752. package/dist/urls.d.ts.map +1 -0
  753. package/dist/urls.gen.d.ts +8 -0
  754. package/dist/urls.gen.d.ts.map +1 -0
  755. package/dist/urls.gen.js +8 -0
  756. package/dist/urls.gen.js.map +1 -0
  757. package/dist/urls.js +443 -0
  758. package/dist/urls.js.map +1 -0
  759. package/dist/use-loader.d.ts +127 -0
  760. package/dist/use-loader.d.ts.map +1 -0
  761. package/dist/use-loader.js +237 -0
  762. package/dist/use-loader.js.map +1 -0
  763. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  767. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  771. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  775. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  777. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  779. package/dist/vite/ast-handler-extract.d.ts +49 -0
  780. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  781. package/dist/vite/ast-handler-extract.js +249 -0
  782. package/dist/vite/ast-handler-extract.js.map +1 -0
  783. package/dist/vite/expose-action-id.d.ts +19 -0
  784. package/dist/vite/expose-action-id.d.ts.map +1 -0
  785. package/dist/vite/expose-action-id.js +250 -0
  786. package/dist/vite/expose-action-id.js.map +1 -0
  787. package/dist/vite/expose-id-utils.d.ts +69 -0
  788. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  789. package/dist/vite/expose-id-utils.js +289 -0
  790. package/dist/vite/expose-id-utils.js.map +1 -0
  791. package/dist/vite/expose-internal-ids.d.ts +22 -0
  792. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  793. package/dist/vite/expose-internal-ids.js +886 -0
  794. package/dist/vite/expose-internal-ids.js.map +1 -0
  795. package/dist/vite/index.d.ts +149 -0
  796. package/dist/vite/index.d.ts.map +1 -0
  797. package/dist/vite/index.js +2041 -719
  798. package/dist/vite/index.js.bak +5448 -0
  799. package/dist/vite/index.js.map +1 -0
  800. package/dist/vite/index.named-routes.gen.ts +103 -0
  801. package/dist/vite/package-resolution.d.ts +43 -0
  802. package/dist/vite/package-resolution.d.ts.map +1 -0
  803. package/dist/vite/package-resolution.js +112 -0
  804. package/dist/vite/package-resolution.js.map +1 -0
  805. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  806. package/dist/vite/virtual-entries.d.ts +25 -0
  807. package/dist/vite/virtual-entries.d.ts.map +1 -0
  808. package/dist/vite/virtual-entries.js +110 -0
  809. package/dist/vite/virtual-entries.js.map +1 -0
  810. package/package.json +19 -16
  811. package/skills/breadcrumbs/SKILL.md +252 -0
  812. package/skills/cache-guide/SKILL.md +32 -0
  813. package/skills/caching/SKILL.md +45 -4
  814. package/skills/handler-use/SKILL.md +362 -0
  815. package/skills/hooks/SKILL.md +55 -41
  816. package/skills/intercept/SKILL.md +20 -0
  817. package/skills/layout/SKILL.md +22 -0
  818. package/skills/links/SKILL.md +93 -17
  819. package/skills/loader/SKILL.md +141 -24
  820. package/skills/middleware/SKILL.md +36 -3
  821. package/skills/migrate-nextjs/SKILL.md +562 -0
  822. package/skills/migrate-react-router/SKILL.md +769 -0
  823. package/skills/parallel/SKILL.md +192 -0
  824. package/skills/prerender/SKILL.md +110 -68
  825. package/skills/rango/SKILL.md +25 -22
  826. package/skills/response-routes/SKILL.md +8 -0
  827. package/skills/route/SKILL.md +58 -4
  828. package/skills/router-setup/SKILL.md +93 -3
  829. package/skills/server-actions/SKILL.md +739 -0
  830. package/skills/streams-and-websockets/SKILL.md +283 -0
  831. package/skills/typesafety/SKILL.md +37 -23
  832. package/src/__internal.ts +92 -0
  833. package/src/browser/app-shell.ts +52 -0
  834. package/src/browser/app-version.ts +14 -0
  835. package/src/browser/event-controller.ts +49 -4
  836. package/src/browser/link-interceptor.ts +4 -0
  837. package/src/browser/navigation-bridge.ts +175 -17
  838. package/src/browser/navigation-client.ts +177 -44
  839. package/src/browser/navigation-store.ts +68 -9
  840. package/src/browser/navigation-transaction.ts +11 -9
  841. package/src/browser/partial-update.ts +113 -17
  842. package/src/browser/prefetch/cache.ts +275 -28
  843. package/src/browser/prefetch/fetch.ts +191 -46
  844. package/src/browser/prefetch/policy.ts +6 -0
  845. package/src/browser/prefetch/queue.ts +123 -20
  846. package/src/browser/prefetch/resource-ready.ts +77 -0
  847. package/src/browser/rango-state.ts +53 -13
  848. package/src/browser/react/Link.tsx +98 -14
  849. package/src/browser/react/NavigationProvider.tsx +109 -21
  850. package/src/browser/react/context.ts +7 -2
  851. package/src/browser/react/filter-segment-order.ts +51 -7
  852. package/src/browser/react/use-handle.ts +9 -58
  853. package/src/browser/react/use-navigation.ts +22 -2
  854. package/src/browser/react/use-params.ts +11 -1
  855. package/src/browser/react/use-router.ts +29 -9
  856. package/src/browser/react/use-segments.ts +11 -8
  857. package/src/browser/rsc-router.tsx +177 -66
  858. package/src/browser/scroll-restoration.ts +41 -42
  859. package/src/browser/segment-reconciler.ts +36 -9
  860. package/src/browser/server-action-bridge.ts +8 -6
  861. package/src/browser/types.ts +79 -5
  862. package/src/build/generate-manifest.ts +6 -6
  863. package/src/build/generate-route-types.ts +3 -0
  864. package/src/build/route-trie.ts +67 -25
  865. package/src/build/route-types/include-resolution.ts +8 -1
  866. package/src/build/route-types/router-processing.ts +223 -74
  867. package/src/build/route-types/scan-filter.ts +8 -1
  868. package/src/cache/cache-runtime.ts +15 -11
  869. package/src/cache/cache-scope.ts +48 -7
  870. package/src/cache/cf/cf-cache-store.ts +455 -15
  871. package/src/cache/cf/index.ts +5 -1
  872. package/src/cache/document-cache.ts +17 -7
  873. package/src/cache/index.ts +1 -0
  874. package/src/cache/taint.ts +55 -0
  875. package/src/client.rsc.tsx +2 -1
  876. package/src/client.tsx +85 -276
  877. package/src/context-var.ts +72 -2
  878. package/src/debug.ts +2 -2
  879. package/src/handle.ts +40 -0
  880. package/src/handles/breadcrumbs.ts +66 -0
  881. package/src/handles/index.ts +1 -0
  882. package/src/index.rsc.ts +9 -36
  883. package/src/index.ts +53 -43
  884. package/src/outlet-context.ts +1 -1
  885. package/src/prerender/store.ts +5 -4
  886. package/src/prerender.ts +138 -77
  887. package/src/response-utils.ts +28 -0
  888. package/src/reverse.ts +27 -2
  889. package/src/route-definition/dsl-helpers.ts +240 -40
  890. package/src/route-definition/helpers-types.ts +73 -20
  891. package/src/route-definition/index.ts +3 -0
  892. package/src/route-definition/redirect.ts +11 -3
  893. package/src/route-definition/resolve-handler-use.ts +155 -0
  894. package/src/route-map-builder.ts +7 -1
  895. package/src/route-types.ts +18 -0
  896. package/src/router/content-negotiation.ts +100 -1
  897. package/src/router/find-match.ts +4 -2
  898. package/src/router/handler-context.ts +129 -26
  899. package/src/router/intercept-resolution.ts +11 -4
  900. package/src/router/lazy-includes.ts +10 -7
  901. package/src/router/loader-resolution.ts +159 -21
  902. package/src/router/logging.ts +5 -2
  903. package/src/router/manifest.ts +31 -16
  904. package/src/router/match-api.ts +129 -193
  905. package/src/router/match-handlers.ts +1 -0
  906. package/src/router/match-middleware/background-revalidation.ts +30 -2
  907. package/src/router/match-middleware/cache-lookup.ts +94 -17
  908. package/src/router/match-middleware/cache-store.ts +53 -10
  909. package/src/router/match-middleware/intercept-resolution.ts +9 -7
  910. package/src/router/match-middleware/segment-resolution.ts +61 -5
  911. package/src/router/match-result.ts +122 -17
  912. package/src/router/metrics.ts +144 -35
  913. package/src/router/middleware-types.ts +39 -30
  914. package/src/router/middleware.ts +126 -86
  915. package/src/router/navigation-snapshot.ts +182 -0
  916. package/src/router/pattern-matching.ts +94 -11
  917. package/src/router/prerender-match.ts +114 -10
  918. package/src/router/preview-match.ts +30 -102
  919. package/src/router/request-classification.ts +310 -0
  920. package/src/router/revalidation.ts +42 -8
  921. package/src/router/route-snapshot.ts +245 -0
  922. package/src/router/router-context.ts +6 -1
  923. package/src/router/router-interfaces.ts +44 -5
  924. package/src/router/router-options.ts +49 -18
  925. package/src/router/segment-resolution/fresh.ts +206 -20
  926. package/src/router/segment-resolution/helpers.ts +30 -25
  927. package/src/router/segment-resolution/loader-cache.ts +1 -0
  928. package/src/router/segment-resolution/revalidation.ts +452 -286
  929. package/src/router/segment-wrappers.ts +2 -0
  930. package/src/router/trie-matching.ts +30 -6
  931. package/src/router/types.ts +1 -0
  932. package/src/router/url-params.ts +49 -0
  933. package/src/router.ts +74 -15
  934. package/src/rsc/handler.ts +561 -367
  935. package/src/rsc/helpers.ts +69 -41
  936. package/src/rsc/loader-fetch.ts +23 -3
  937. package/src/rsc/manifest-init.ts +5 -1
  938. package/src/rsc/progressive-enhancement.ts +39 -10
  939. package/src/rsc/response-route-handler.ts +14 -1
  940. package/src/rsc/rsc-rendering.ts +35 -59
  941. package/src/rsc/server-action.ts +14 -17
  942. package/src/rsc/ssr-setup.ts +128 -0
  943. package/src/rsc/types.ts +17 -1
  944. package/src/search-params.ts +16 -13
  945. package/src/segment-content-promise.ts +67 -0
  946. package/src/segment-loader-promise.ts +122 -0
  947. package/src/segment-system.tsx +109 -23
  948. package/src/server/context.ts +166 -17
  949. package/src/server/handle-store.ts +19 -0
  950. package/src/server/loader-registry.ts +9 -8
  951. package/src/server/request-context.ts +207 -63
  952. package/src/ssr/index.tsx +9 -1
  953. package/src/static-handler.ts +18 -6
  954. package/src/types/cache-types.ts +4 -4
  955. package/src/types/handler-context.ts +148 -75
  956. package/src/types/loader-types.ts +41 -15
  957. package/src/types/request-scope.ts +126 -0
  958. package/src/types/route-config.ts +17 -8
  959. package/src/types/route-entry.ts +19 -1
  960. package/src/types/segments.ts +19 -5
  961. package/src/urls/include-helper.ts +24 -14
  962. package/src/urls/path-helper-types.ts +39 -6
  963. package/src/urls/path-helper.ts +48 -13
  964. package/src/urls/pattern-types.ts +12 -0
  965. package/src/urls/response-types.ts +18 -16
  966. package/src/use-loader.tsx +77 -5
  967. package/src/vite/debug.ts +184 -0
  968. package/src/vite/discovery/bundle-postprocess.ts +30 -33
  969. package/src/vite/discovery/discover-routers.ts +36 -4
  970. package/src/vite/discovery/gate-state.ts +171 -0
  971. package/src/vite/discovery/prerender-collection.ts +175 -74
  972. package/src/vite/discovery/self-gen-tracking.ts +27 -1
  973. package/src/vite/discovery/state.ts +13 -6
  974. package/src/vite/index.ts +8 -3
  975. package/src/vite/plugin-types.ts +51 -79
  976. package/src/vite/plugins/cjs-to-esm.ts +5 -0
  977. package/src/vite/plugins/client-ref-dedup.ts +16 -0
  978. package/src/vite/plugins/client-ref-hashing.ts +16 -4
  979. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  980. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  981. package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
  982. package/src/vite/plugins/expose-action-id.ts +53 -31
  983. package/src/vite/plugins/expose-id-utils.ts +12 -0
  984. package/src/vite/plugins/expose-ids/handler-transform.ts +30 -0
  985. package/src/vite/plugins/expose-ids/router-transform.ts +20 -3
  986. package/src/vite/plugins/expose-internal-ids.ts +563 -316
  987. package/src/vite/plugins/performance-tracks.ts +96 -0
  988. package/src/vite/plugins/refresh-cmd.ts +127 -0
  989. package/src/vite/plugins/use-cache-transform.ts +56 -43
  990. package/src/vite/plugins/version-injector.ts +37 -11
  991. package/src/vite/plugins/version-plugin.ts +13 -1
  992. package/src/vite/rango.ts +204 -217
  993. package/src/vite/router-discovery.ts +732 -94
  994. package/src/vite/utils/banner.ts +4 -4
  995. package/src/vite/utils/package-resolution.ts +41 -1
  996. package/src/vite/utils/prerender-utils.ts +37 -5
  997. package/src/vite/utils/shared-utils.ts +3 -2
@@ -14,17 +14,24 @@ import {
14
14
  runWithRequestContext,
15
15
  setRequestContextParams,
16
16
  requireRequestContext,
17
+ getRequestContext,
18
+ _getRequestContext,
17
19
  createRequestContext,
18
20
  } from "../server/request-context.js";
19
21
  import * as rscDeps from "@vitejs/plugin-rsc/rsc";
20
-
21
- import type { RscPayload, CreateRSCHandlerOptions } from "./types.js";
22
+ import type {
23
+ RscPayload,
24
+ CreateRSCHandlerOptions,
25
+ LoadSSRModule,
26
+ SSRModule,
27
+ } from "./types.js";
22
28
  import {
23
29
  createResponseWithMergedHeaders,
24
30
  finalizeResponse,
25
31
  interceptRedirectForPartial,
26
32
  buildRouteMiddlewareEntries,
27
33
  } from "./helpers.js";
34
+ import { isWebSocketUpgradeResponse } from "../response-utils.js";
28
35
  import {
29
36
  handleResponseRoute,
30
37
  type ResponseRouteMatch,
@@ -50,6 +57,7 @@ import {
50
57
  getRouterTrie,
51
58
  } from "../route-map-builder.js";
52
59
  import type { HandlerContext } from "./handler-context.js";
60
+ import type { SegmentCacheStore } from "../cache/types.js";
53
61
  import { buildRouterTrieFromUrlpatterns } from "./manifest-init.js";
54
62
  import { handleProgressiveEnhancement } from "./progressive-enhancement.js";
55
63
  import {
@@ -66,7 +74,22 @@ import {
66
74
  createDefaultTimeoutResponse,
67
75
  type TimeoutPhase,
68
76
  } from "../router/timeout.js";
69
- import { createMetricsStore } from "../router/metrics.js";
77
+ import {
78
+ createMetricsStore,
79
+ appendMetric,
80
+ buildMetricsTiming,
81
+ } from "../router/metrics.js";
82
+ import {
83
+ startSSRSetup,
84
+ getSSRSetup,
85
+ mayNeedSSR,
86
+ SSR_SETUP_VAR,
87
+ } from "./ssr-setup.js";
88
+ import {
89
+ classifyRequest,
90
+ type RequestPlan,
91
+ type ExecutableRequestPlan,
92
+ } from "../router/request-classification.js";
70
93
 
71
94
  /**
72
95
  * Create an RSC request handler.
@@ -118,10 +141,22 @@ export function createRSCHandler<
118
141
  decodeFormState,
119
142
  } = deps;
120
143
 
121
- // Use provided loadSSRModule or default to vite RSC module loader
122
- const loadSSRModule =
144
+ // Use provided loadSSRModule or default to vite RSC module loader.
145
+ // In production the SSR module is stable across requests, so memoize
146
+ // the dynamic import to avoid repeated module resolution overhead.
147
+ // In dev mode Vite may hot-reload the module, so skip memoization.
148
+ const rawLoadSSRModule: LoadSSRModule =
123
149
  options.loadSSRModule ??
124
150
  (() => import.meta.viteRsc.loadModule("ssr", "index"));
151
+ let _ssrModulePromise: Promise<SSRModule> | undefined;
152
+ const loadSSRModule: LoadSSRModule =
153
+ process.env.NODE_ENV === "production"
154
+ ? () =>
155
+ (_ssrModulePromise ??= rawLoadSSRModule().catch((err) => {
156
+ _ssrModulePromise = undefined;
157
+ throw err;
158
+ }))
159
+ : rawLoadSSRModule;
125
160
 
126
161
  /**
127
162
  * Per-request error reporter that deduplicates via the ALS request context.
@@ -134,10 +169,13 @@ export function createRSCHandler<
134
169
  phase: ErrorPhase,
135
170
  context: Parameters<typeof invokeOnError<TEnv>>[3],
136
171
  ): void {
137
- if (error != null && typeof error === "object") {
138
- const reportedErrors = requireRequestContext()._reportedErrors;
139
- if (reportedErrors.has(error)) return;
140
- reportedErrors.add(error);
172
+ // Guard: abort signal handlers fire asynchronously outside the ALS
173
+ // request scope, so the context may be gone. Skip dedup in that
174
+ // case — the error is from a cancelled stream, not a real failure.
175
+ const reqCtx = _getRequestContext();
176
+ if (error != null && typeof error === "object" && reqCtx) {
177
+ if (reqCtx._reportedErrors.has(error)) return;
178
+ reqCtx._reportedErrors.add(error);
141
179
  }
142
180
  invokeOnError(router.onError, error, phase, context, "RSC");
143
181
  }
@@ -269,6 +307,11 @@ export function createRSCHandler<
269
307
  input: RouterRequestInput<TEnv> = {},
270
308
  ): Promise<Response> {
271
309
  const handlerStart = performance.now();
310
+ // Create the metrics store at handler start so handler:total has startTime=0
311
+ // and all metrics are relative to the request entry point.
312
+ const earlyMetricsStore = router.debugPerformance
313
+ ? createMetricsStore(true, handlerStart)
314
+ : undefined;
272
315
 
273
316
  const { env = {} as TEnv, vars: initialVars, ctx: executionCtx } = input;
274
317
 
@@ -311,7 +354,7 @@ export function createRSCHandler<
311
354
  // Resolve cache store configuration
312
355
  // Priority: options.cache (handler override) > router.cache (router default)
313
356
  // Store is enabled only if: config provided, enabled, and no ?__no_cache query param
314
- let cacheStore = undefined;
357
+ let cacheStore: SegmentCacheStore | undefined;
315
358
  const cacheOption = options.cache ?? router.cache;
316
359
  if (cacheOption && !url.searchParams.has("__no_cache")) {
317
360
  const cacheConfig =
@@ -382,9 +425,9 @@ export function createRSCHandler<
382
425
  executionContext: executionCtx,
383
426
  themeConfig: router.themeConfig,
384
427
  });
385
- if (router.debugPerformance) {
428
+ if (earlyMetricsStore) {
386
429
  requestContext._debugPerformance = true;
387
- requestContext._metricsStore ??= createMetricsStore(true);
430
+ requestContext._metricsStore = earlyMetricsStore;
388
431
  }
389
432
  // Wire background error reporting so "use cache" and other subsystems
390
433
  // can surface non-fatal errors through the router's onError callback.
@@ -420,6 +463,9 @@ export function createRSCHandler<
420
463
  // - Server components during rendering
421
464
  // - Error boundaries
422
465
  // - Streaming
466
+ // Store basename on request context (scoped per-request via existing ALS)
467
+ requestContext._basename = router.basename;
468
+
423
469
  return runWithRequestContext(requestContext, async () => {
424
470
  // Core handler logic (wrapped by middleware)
425
471
  const coreHandler = async (): Promise<Response> => {
@@ -427,6 +473,7 @@ export function createRSCHandler<
427
473
  };
428
474
 
429
475
  // Execute middleware chain if any, otherwise call core handler directly
476
+ let response: Response;
430
477
  if (matchedMiddleware.length > 0) {
431
478
  const mwResponse = await executeMiddleware(
432
479
  matchedMiddleware,
@@ -445,17 +492,60 @@ export function createRSCHandler<
445
492
  mwResponse,
446
493
  createRedirectFlightResponse,
447
494
  );
448
- if (intercepted) return intercepted;
495
+ response = intercepted ?? finalizeResponse(mwResponse);
496
+ } else {
497
+ response = finalizeResponse(mwResponse);
449
498
  }
499
+ } else {
500
+ response = await coreHandler();
501
+ }
450
502
 
451
- return finalizeResponse(mwResponse);
503
+ // Finalize metrics after all middleware (including post-next work)
504
+ // has completed so :post spans are captured in the timeline.
505
+ // Handler timing parts are always emitted (even without debug metrics)
506
+ // so non-debug requests still get bootstrap Server-Timing entries.
507
+ const handlerTimingArr: string[] = variables.__handlerTiming || [];
508
+ // Preserve any existing Server-Timing set by response routes or middleware
509
+ const existingTiming = response.headers.get("Server-Timing");
510
+ const timingParts = existingTiming
511
+ ? [existingTiming, ...handlerTimingArr]
512
+ : [...handlerTimingArr];
513
+
514
+ const metricsStore = requestContext._metricsStore;
515
+ if (metricsStore) {
516
+ // When the store was created at handler start (earlyMetricsStore),
517
+ // handler:total covers the full request. When ctx.debugPerformance()
518
+ // created the store mid-request, use its requestStart to avoid a
519
+ // negative startTime offset.
520
+ const totalStart = earlyMetricsStore
521
+ ? handlerStart
522
+ : metricsStore.requestStart;
523
+ appendMetric(
524
+ metricsStore,
525
+ "handler:total",
526
+ totalStart,
527
+ performance.now() - totalStart,
528
+ );
529
+ const metricsTiming = buildMetricsTiming(
530
+ request.method,
531
+ url.pathname,
532
+ metricsStore,
533
+ );
534
+ if (metricsTiming) timingParts.push(metricsTiming);
535
+ }
536
+
537
+ const fullTiming = timingParts.join(", ");
538
+ if (fullTiming && !isWebSocketUpgradeResponse(response)) {
539
+ response.headers.set("Server-Timing", fullTiming);
452
540
  }
453
541
 
454
- return coreHandler();
542
+ return response;
455
543
  });
456
544
  };
457
545
 
458
- // Core request handling logic (separated for middleware wrapping)
546
+ // Core request handling logic (separated for middleware wrapping).
547
+ // Uses the classify → execute model: classifyRequest produces a RequestPlan,
548
+ // then execution dispatches on the plan mode.
459
549
  async function coreRequestHandler(
460
550
  request: Request,
461
551
  env: TEnv,
@@ -463,56 +553,112 @@ export function createRSCHandler<
463
553
  variables: Record<string, any>,
464
554
  nonce: string | undefined,
465
555
  ): Promise<Response> {
466
- const previewStart = performance.now();
467
- const preview = await router.previewMatch(request, { env });
468
- const previewDur = performance.now() - previewStart;
469
556
  const handlerTiming: string[] = variables.__handlerTiming || [];
470
- handlerTiming.push(`handler-preview-match;dur=${previewDur.toFixed(2)}`);
471
- // Response route short-circuit: skip entire RSC pipeline
472
- if (preview?.responseType && preview.handler) {
473
- const responseOutcome = await withTimeout(
474
- handleResponseRoute(
475
- handlerCtx,
476
- preview as ResponseRouteMatch,
477
- request,
478
- env,
479
- url,
480
- variables,
557
+
558
+ // Debug manifest endpoint: handled before classification since it
559
+ // doesn't need a route match and needs trie access from the closure.
560
+ const isDev = process.env.NODE_ENV !== "production";
561
+ if (
562
+ url.searchParams.has("__debug_manifest") &&
563
+ (isDev || router.allowDebugManifest)
564
+ ) {
565
+ const trie = getRouterTrie(router.id) ?? getRouteTrie();
566
+ const routeManifest = getRequiredRouteMap();
567
+ const { extractAncestryFromTrie } =
568
+ await import("../build/route-trie.js");
569
+ return new Response(
570
+ JSON.stringify(
571
+ {
572
+ routerId: router.id,
573
+ routeManifest,
574
+ routeAncestry: trie ? extractAncestryFromTrie(trie) : {},
575
+ routeTrie: trie,
576
+ precomputedEntries: getPrecomputedEntries(),
577
+ },
578
+ null,
579
+ 2,
481
580
  ),
482
- router.timeouts.renderStartMs,
483
- "render-start",
581
+ {
582
+ headers: { "Content-Type": "application/json" },
583
+ },
484
584
  );
485
- if (responseOutcome.timedOut) {
486
- return handleTimeoutResponse(
487
- request,
488
- env,
489
- url,
490
- "render-start",
491
- responseOutcome.durationMs,
492
- preview?.routeKey,
493
- );
585
+ }
586
+
587
+ // ---- 1. Classify ----
588
+ // classifyRequest may throw RouteNotFoundError for unknown routes.
589
+ // In that case, fall through to a full-render plan so the pipeline
590
+ // can render the 404 page via the existing error handling path.
591
+ const classifyStart = performance.now();
592
+ let plan: RequestPlan<TEnv>;
593
+ try {
594
+ plan = await classifyRequest<TEnv>(request, url, {
595
+ findMatch: router.findMatch,
596
+ routerVersion: version,
597
+ routerId: router.id,
598
+ });
599
+ } catch (error) {
600
+ if (
601
+ error instanceof RouteNotFoundError ||
602
+ (error instanceof Error && error.name === "RouteNotFoundError")
603
+ ) {
604
+ // Let the render path handle 404 — match()/matchPartial() will
605
+ // re-throw RouteNotFoundError and the catch block in
606
+ // executeRenderWithMiddleware renders the not-found page.
607
+ plan = {
608
+ mode: "full-render",
609
+ route: {
610
+ matched: null as any,
611
+ manifestEntry: null as any,
612
+ entries: [],
613
+ routeKey: "",
614
+ localRouteName: "",
615
+ params: {},
616
+ routeMiddleware: [],
617
+ cacheScope: null,
618
+ isPassthrough: false,
619
+ },
620
+ negotiated: false,
621
+ };
622
+ } else {
623
+ throw error;
624
+ }
625
+ }
626
+ const classifyDur = performance.now() - classifyStart;
627
+ handlerTiming.push(`handler-classify;dur=${classifyDur.toFixed(2)}`);
628
+
629
+ // ---- 2. Terminal plans (no execution needed) ----
630
+ if (plan.mode === "redirect") {
631
+ // Redirects are handled by the pipeline (match/matchPartial),
632
+ // but for partial requests we short-circuit with a Flight redirect.
633
+ if (url.searchParams.has("_rsc_partial")) {
634
+ return createRedirectFlightResponse(plan.redirectUrl);
494
635
  }
495
- return responseOutcome.result;
636
+ // Full requests: let the pipeline handle the redirect via match()
637
+ // which returns { redirect: url }. Fall through to full-render.
496
638
  }
497
639
 
498
- const routeReverse = createReverseFunction(getRequiredRouteMap());
640
+ if (plan.mode === "version-mismatch") {
641
+ console.log(
642
+ `[RSC] Version mismatch: client=${url.searchParams.get("_rsc_v")}, server=${version}. Forcing reload.`,
643
+ );
644
+ return createResponseWithMergedHeaders(null, {
645
+ status: 200,
646
+ headers: {
647
+ "X-RSC-Reload": plan.reloadUrl,
648
+ "content-type": "text/x-component;charset=utf-8",
649
+ },
650
+ });
651
+ }
499
652
 
500
- const isAction =
501
- request.headers.has("rsc-action") || url.searchParams.has("_rsc_action");
502
- const isLoaderFetch = url.searchParams.has("_rsc_loader");
503
- const actionId =
504
- request.headers.get("rsc-action") || url.searchParams.get("_rsc_action");
505
-
506
- // Origin guard: reject cross-origin actions, loader fetches, and
507
- // PE form submissions before any execution. Regular page navigations
508
- // (GET without _rsc_loader/_rsc_action) are not affected.
509
- const originPhase: OriginCheckPhase | null = isAction
510
- ? "action"
511
- : isLoaderFetch
512
- ? "loader"
513
- : request.method === "POST"
514
- ? "pe-form"
515
- : null;
653
+ // ---- 3. Origin guard (gate for action/loader/PE modes) ----
654
+ const originPhase: OriginCheckPhase | null =
655
+ plan.mode === "action"
656
+ ? "action"
657
+ : plan.mode === "loader"
658
+ ? "loader"
659
+ : plan.mode === "pe-render"
660
+ ? "pe-form"
661
+ : null;
516
662
  if (originPhase) {
517
663
  const originResult = await checkRequestOrigin(
518
664
  request,
@@ -562,13 +708,33 @@ export function createRSCHandler<
562
708
  }
563
709
  }
564
710
 
565
- // Get handle store from request context
711
+ // ---- 4. Execute ----
712
+ return executeRequest(
713
+ plan as ExecutableRequestPlan<TEnv>,
714
+ request,
715
+ env,
716
+ url,
717
+ variables,
718
+ nonce,
719
+ );
720
+ }
721
+
722
+ // Execute a classified request plan. Dispatches to the appropriate handler
723
+ // based on plan.mode. Lives in the createRSCHandler closure for access to
724
+ // handlerCtx, router, callOnError, etc.
725
+ // Only receives executable plans (version-mismatch is handled above).
726
+ async function executeRequest(
727
+ plan: ExecutableRequestPlan<TEnv>,
728
+ request: Request,
729
+ env: TEnv,
730
+ url: URL,
731
+ variables: Record<string, any>,
732
+ nonce: string | undefined,
733
+ ): Promise<Response> {
734
+ // Common setup
566
735
  const handleStore = requireRequestContext()._handleStore;
567
736
 
568
737
  // Wire up error reporting for late streaming-handle failures
569
- // (LateHandlePushError: handle pushed after stream completion).
570
- // Without this, these errors are only caught by React's error boundary
571
- // and never reach the router's onError callback or telemetry.
572
738
  handleStore.onError = (error: Error) => {
573
739
  const reqCtx = requireRequestContext();
574
740
  callOnError(error, "handler", {
@@ -598,37 +764,106 @@ export function createRSCHandler<
598
764
  };
599
765
 
600
766
  // Set route params early so all execution paths can access ctx.params.
601
- if (preview?.params) {
602
- setRequestContextParams(preview.params, preview.routeKey);
767
+ // Also store the classified snapshot so match/matchPartial can reuse it
768
+ // instead of calling resolveRoute again.
769
+ if (plan.mode !== "redirect") {
770
+ setRequestContextParams(plan.route.params, plan.route.routeKey);
771
+ requireRequestContext()._classifiedRoute = plan.route;
603
772
  }
604
773
 
605
- // Progressive enhancement runs before the normal action/render paths.
606
- // Route middleware wraps the PE re-render so handlers see the same
607
- // context variables regardless of JS/no-JS transport.
608
- const progressiveResult = await handleProgressiveEnhancement(
609
- handlerCtx,
610
- request,
611
- env,
612
- url,
613
- isAction,
614
- handleStore,
615
- nonce,
616
- {
617
- routeMiddleware: preview?.routeMiddleware,
774
+ const routeReverse = createReverseFunction(getRequiredRouteMap());
775
+
776
+ // ---- Response route: skip entire RSC pipeline ----
777
+ if (plan.mode === "response") {
778
+ // Build ResponseRouteMatch from plan fields. handleResponseRoute
779
+ // expects a flat object with params at the top level.
780
+ const responseMatch: ResponseRouteMatch = {
781
+ responseType: plan.responseType,
782
+ handler: plan.handler,
783
+ params: plan.route.params,
784
+ negotiated: plan.negotiated,
785
+ manifestEntry: plan.manifestEntry,
786
+ routeMiddleware: plan.routeMiddleware,
787
+ };
788
+ const responseOutcome = await withTimeout(
789
+ handleResponseRoute(
790
+ handlerCtx,
791
+ responseMatch,
792
+ request,
793
+ env,
794
+ url,
795
+ variables,
796
+ ),
797
+ router.timeouts.renderStartMs,
798
+ "render-start",
799
+ );
800
+ if (responseOutcome.timedOut) {
801
+ return handleTimeoutResponse(
802
+ request,
803
+ env,
804
+ url,
805
+ "render-start",
806
+ responseOutcome.durationMs,
807
+ plan.route.routeKey,
808
+ );
809
+ }
810
+ const response = responseOutcome.result;
811
+ if (plan.negotiated && !isWebSocketUpgradeResponse(response)) {
812
+ response.headers.append("Vary", "Accept");
813
+ }
814
+ return response;
815
+ }
816
+
817
+ // SSR setup: kick off in parallel for modes that need HTML rendering.
818
+ // Placed after response-route short-circuit so response/mime routes
819
+ // never pay for SSR work.
820
+ if (plan.mode !== "loader" && mayNeedSSR(request, url)) {
821
+ variables[SSR_SETUP_VAR] = startSSRSetup(
822
+ handlerCtx,
823
+ request,
824
+ env,
825
+ url,
826
+ router.debugPerformance
827
+ ? () => requireRequestContext()._metricsStore
828
+ : undefined,
829
+ );
830
+ }
831
+
832
+ // ---- Loader fetch ----
833
+ if (plan.mode === "loader") {
834
+ return handleLoaderFetch(
835
+ handlerCtx,
836
+ request,
837
+ env,
838
+ url,
618
839
  variables,
619
- routeReverse,
620
- },
621
- );
622
- if (progressiveResult) {
623
- return progressiveResult;
840
+ plan.route.params,
841
+ );
842
+ }
843
+
844
+ // ---- Progressive enhancement ----
845
+ if (plan.mode === "pe-render") {
846
+ const peResult = await handleProgressiveEnhancement(
847
+ handlerCtx,
848
+ request,
849
+ env,
850
+ url,
851
+ false, // isAction = false for PE
852
+ handleStore,
853
+ nonce,
854
+ {
855
+ routeMiddleware: plan.route.routeMiddleware,
856
+ variables,
857
+ routeReverse,
858
+ },
859
+ );
860
+ if (peResult) return peResult;
861
+ // PE handler returned null (not a PE form) — fall through to render
624
862
  }
625
863
 
626
- // --- Action execution: runs BEFORE route middleware ---
627
- // Route middleware wraps rendering only. For actions, the action runs
628
- // first in the global middleware context, then route middleware wraps
629
- // the revalidation pass (identical to a normal render).
630
- let actionContinuation: ActionContinuation | undefined;
631
- if (isAction && actionId) {
864
+ // ---- Action: execute action, then revalidate wrapped in route middleware ----
865
+ if (plan.mode === "action") {
866
+ let actionContinuation: ActionContinuation | undefined;
632
867
  try {
633
868
  const actionOutcome = await withTimeout(
634
869
  executeServerAction(
@@ -636,7 +871,7 @@ export function createRSCHandler<
636
871
  request,
637
872
  env,
638
873
  url,
639
- actionId,
874
+ plan.actionId,
640
875
  handleStore,
641
876
  ),
642
877
  router.timeouts.actionMs,
@@ -649,8 +884,8 @@ export function createRSCHandler<
649
884
  url,
650
885
  "action",
651
886
  actionOutcome.durationMs,
652
- preview?.routeKey,
653
- actionId,
887
+ plan.route.routeKey,
888
+ plan.actionId,
654
889
  );
655
890
  }
656
891
  const result = actionOutcome.result;
@@ -662,338 +897,297 @@ export function createRSCHandler<
662
897
  request,
663
898
  url,
664
899
  env,
665
- actionId,
900
+ actionId: plan.actionId,
666
901
  handledByBoundary: false,
667
902
  });
668
903
  console.error(`[RSC] Action error:`, error);
669
904
  throw error;
670
905
  }
671
- }
672
906
 
673
- // --- Rendering (action revalidation or navigation) ---
674
- // Route middleware wraps this same code path for both cases.
675
- const renderHandler = async () => {
676
- const response = await coreRequestHandlerInner(
907
+ // Revalidation render wrapped in route middleware.
908
+ // Actions from client-side navigation include _rsc_partial preserve
909
+ // the partial flag so the revalidation returns a Flight stream, not HTML.
910
+ // App-switch is already excluded by classifyRequest (would be full-render).
911
+ const isPartialAction = url.searchParams.has("_rsc_partial");
912
+ return executeRenderWithMiddleware(
913
+ plan.route.routeMiddleware,
914
+ plan.negotiated,
915
+ plan.route.routeKey,
916
+ routeReverse,
677
917
  request,
678
918
  env,
679
919
  url,
680
920
  variables,
681
921
  nonce,
682
- preview?.params,
683
- preview?.routeKey,
684
922
  handleStore,
923
+ isPartialAction,
685
924
  actionContinuation,
686
925
  );
687
- if (preview?.negotiated) {
688
- response.headers.append("Vary", "Accept");
689
- }
690
- return response;
691
- };
692
-
693
- // Wrap the render path (with or without route middleware) in a
694
- // renderStartMs timeout so slow renders are caught before output.
695
- const executeRender = async (): Promise<Response> => {
696
- if (preview?.routeMiddleware && preview.routeMiddleware.length > 0) {
697
- const mwResponse = await executeMiddleware(
698
- buildRouteMiddlewareEntries<TEnv>(preview.routeMiddleware),
699
- request,
700
- env,
701
- variables,
702
- renderHandler,
703
- routeReverse,
704
- );
705
-
706
- if (
707
- url.searchParams.has("_rsc_partial") ||
708
- url.searchParams.has("_rsc_action")
709
- ) {
710
- const intercepted = interceptRedirectForPartial(
711
- mwResponse,
712
- createRedirectFlightResponse,
713
- );
714
- if (intercepted) return intercepted;
715
- }
716
-
717
- return finalizeResponse(mwResponse);
718
- }
926
+ }
719
927
 
720
- // No route middleware, proceed directly
721
- return renderHandler();
722
- };
928
+ // ---- Full render / Partial render (or PE that fell through) ----
929
+ if (plan.mode === "full-render" || plan.mode === "partial-render") {
930
+ const isPartial = plan.mode === "partial-render";
931
+ return executeRenderWithMiddleware(
932
+ plan.route.routeMiddleware,
933
+ plan.negotiated,
934
+ plan.route.routeKey,
935
+ routeReverse,
936
+ request,
937
+ env,
938
+ url,
939
+ variables,
940
+ nonce,
941
+ handleStore,
942
+ isPartial,
943
+ );
944
+ }
723
945
 
724
- const renderOutcome = await withTimeout(
725
- executeRender(),
726
- router.timeouts.renderStartMs,
727
- "render-start",
728
- );
729
- if (renderOutcome.timedOut) {
730
- return handleTimeoutResponse(
946
+ // PE that fell through (handleProgressiveEnhancement returned null)
947
+ // falls back to full render
948
+ if (plan.mode === "pe-render") {
949
+ return executeRenderWithMiddleware(
950
+ plan.route.routeMiddleware,
951
+ false,
952
+ plan.route.routeKey,
953
+ routeReverse,
731
954
  request,
732
955
  env,
733
956
  url,
734
- "render-start",
735
- renderOutcome.durationMs,
736
- preview?.routeKey,
957
+ variables,
958
+ nonce,
959
+ handleStore,
960
+ false,
737
961
  );
738
962
  }
739
- return renderOutcome.result;
963
+
964
+ // Redirect plan that wasn't handled above (full-page redirect — let
965
+ // the pipeline handle it via match() which returns { redirect: url })
966
+ return executeRenderWithMiddleware(
967
+ plan.route.routeMiddleware,
968
+ false,
969
+ plan.route.routeKey,
970
+ routeReverse,
971
+ request,
972
+ env,
973
+ url,
974
+ variables,
975
+ nonce,
976
+ handleStore,
977
+ false,
978
+ );
740
979
  }
741
980
 
742
- // Inner request handler: rendering logic wrapped by route middleware.
743
- // Handles action revalidation (when actionContinuation is present),
744
- // loader fetches, and regular RSC rendering.
745
- async function coreRequestHandlerInner(
981
+ // Shared render execution: wraps handleRscRendering (or revalidateAfterAction)
982
+ // in route middleware and timeout handling. Consolidates the pattern used by
983
+ // action-revalidate, full-render, and partial-render modes.
984
+ async function executeRenderWithMiddleware(
985
+ routeMiddleware: import("../router/middleware-types.js").CollectedMiddleware[],
986
+ negotiated: boolean,
987
+ routeKey: string,
988
+ routeReverse: ReturnType<typeof createReverseFunction>,
746
989
  request: Request,
747
990
  env: TEnv,
748
991
  url: URL,
749
992
  variables: Record<string, any>,
750
993
  nonce: string | undefined,
751
- routeParams?: Record<string, string>,
752
- routeKey?: string,
753
- handleStore?: ReturnType<typeof requireRequestContext>["_handleStore"],
994
+ handleStore: ReturnType<typeof requireRequestContext>["_handleStore"],
995
+ isPartial: boolean,
754
996
  actionContinuation?: ActionContinuation,
755
997
  ): Promise<Response> {
756
- const isPartial = url.searchParams.has("_rsc_partial");
757
- const isAction =
758
- request.headers.has("rsc-action") || url.searchParams.has("_rsc_action");
759
-
760
- // Version mismatch detection - client may have stale code after HMR/deployment
761
- // If versions don't match, tell the client to reload
762
- const clientVersion = url.searchParams.get("_rsc_v");
763
- if (version && clientVersion && clientVersion !== version) {
764
- console.log(
765
- `[RSC] Version mismatch: client=${clientVersion}, server=${version}. Forcing reload.`,
766
- );
998
+ const renderHandler = async (): Promise<Response> => {
999
+ try {
1000
+ let response: Response;
1001
+ if (actionContinuation) {
1002
+ response = await revalidateAfterAction(
1003
+ handlerCtx,
1004
+ request,
1005
+ env,
1006
+ url,
1007
+ handleStore,
1008
+ actionContinuation,
1009
+ );
1010
+ } else {
1011
+ response = await handleRscRendering(
1012
+ handlerCtx,
1013
+ request,
1014
+ env,
1015
+ url,
1016
+ isPartial,
1017
+ handleStore,
1018
+ nonce,
1019
+ );
1020
+ }
1021
+ if (negotiated && !isWebSocketUpgradeResponse(response)) {
1022
+ response.headers.append("Vary", "Accept");
1023
+ }
1024
+ return response;
1025
+ } catch (error) {
1026
+ // Check if middleware/handler returned Response
1027
+ if (error instanceof Response) {
1028
+ // During partial (client-side navigation), a 200 Response from a handler
1029
+ // means the route serves raw content (JSON, text, etc.), not JSX.
1030
+ // Signal the browser to hard-navigate so it renders the raw response.
1031
+ if (isPartial && error.status === 200) {
1032
+ console.warn(
1033
+ `[RSC] Route handler at ${url.pathname} returned a Response during client-side navigation. ` +
1034
+ `Falling back to hard navigation. Use data-external on the <Link> to avoid the extra round-trip.`,
1035
+ );
1036
+ return createResponseWithMergedHeaders(null, {
1037
+ status: 200,
1038
+ headers: {
1039
+ "X-RSC-Reload": stripInternalParams(url).toString(),
1040
+ "content-type": "text/x-component;charset=utf-8",
1041
+ },
1042
+ });
1043
+ }
767
1044
 
768
- // For actions, reload current page (referer) if same origin.
769
- // For navigation, load the target URL.
770
- // Validate referer origin to prevent open redirect via crafted header.
771
- let reloadUrl = stripInternalParams(url).toString();
772
- if (isAction) {
773
- const referer = request.headers.get("referer");
774
- if (referer) {
775
- try {
776
- const refererUrl = new URL(referer);
777
- if (refererUrl.origin === url.origin) {
778
- reloadUrl = referer;
779
- }
780
- } catch {
781
- // Malformed referer, fall back to cleanUrl
1045
+ if (isPartial) {
1046
+ const intercepted = interceptRedirectForPartial(
1047
+ error,
1048
+ createRedirectFlightResponse,
1049
+ );
1050
+ if (intercepted) return intercepted;
782
1051
  }
1052
+
1053
+ return error;
783
1054
  }
784
- }
785
1055
 
786
- // Return special response that tells client to reload
787
- return createResponseWithMergedHeaders(null, {
788
- status: 200,
789
- headers: {
790
- "X-RSC-Reload": reloadUrl,
791
- "content-type": "text/x-component;charset=utf-8",
792
- },
793
- });
794
- }
795
- // Debug manifest endpoint: ?__debug_manifest on any route.
796
- // Always available in dev, requires allowDebugManifest option in production.
797
- const isDev = process.env.NODE_ENV !== "production";
798
- if (
799
- url.searchParams.has("__debug_manifest") &&
800
- (isDev || router.allowDebugManifest)
801
- ) {
802
- const trie = getRouterTrie(router.id) ?? getRouteTrie();
803
- const routeManifest = getRequiredRouteMap();
804
- const { extractAncestryFromTrie } =
805
- await import("../build/route-trie.js");
806
- return new Response(
807
- JSON.stringify(
808
- {
809
- routerId: router.id,
810
- routeManifest,
811
- routeAncestry: trie ? extractAncestryFromTrie(trie) : {},
812
- routeTrie: trie,
813
- precomputedEntries: getPrecomputedEntries(),
814
- },
815
- null,
816
- 2,
817
- ),
818
- {
819
- headers: { "Content-Type": "application/json" },
820
- },
821
- );
822
- }
1056
+ // Render 404 page for unmatched routes
1057
+ const isRouteNotFound =
1058
+ error instanceof RouteNotFoundError ||
1059
+ (error instanceof Error && error.name === "RouteNotFoundError");
1060
+ if (isRouteNotFound) {
1061
+ callOnError(error, "routing", {
1062
+ request,
1063
+ url,
1064
+ env,
1065
+ handledByBoundary: true,
1066
+ });
1067
+
1068
+ const notFoundOption = router.notFound;
1069
+ const notFoundComponent =
1070
+ typeof notFoundOption === "function"
1071
+ ? notFoundOption({ pathname: url.pathname })
1072
+ : (notFoundOption ?? createElement("h1", null, "Not Found"));
1073
+
1074
+ const notFoundSegment = {
1075
+ id: "notFound",
1076
+ namespace: "notFound",
1077
+ type: "route" as const,
1078
+ index: 0,
1079
+ component: notFoundComponent,
1080
+ params: {},
1081
+ };
1082
+
1083
+ const payload: RscPayload = {
1084
+ metadata: {
1085
+ pathname: url.pathname,
1086
+ routerId: router.id,
1087
+ basename: router.basename,
1088
+ segments: [notFoundSegment],
1089
+ matched: [],
1090
+ diff: [],
1091
+ isPartial: false,
1092
+ rootLayout: router.rootLayout,
1093
+ handles: handleStore.stream(),
1094
+ version,
1095
+ themeConfig: router.themeConfig,
1096
+ warmupEnabled: router.warmupEnabled,
1097
+ initialTheme: requireRequestContext().theme,
1098
+ },
1099
+ };
823
1100
 
824
- const store = handleStore ?? requireRequestContext()._handleStore;
1101
+ const rscStream = renderToReadableStream(payload, {
1102
+ onError: (error: unknown) => {
1103
+ callOnError(error, "rendering", { request, url, env });
1104
+ },
1105
+ });
825
1106
 
826
- try {
827
- // Route params were already set in coreRequestHandler, but set again
828
- // for callers that enter coreRequestHandlerInner directly.
829
- if (routeParams) {
830
- setRequestContextParams(routeParams, routeKey);
831
- }
1107
+ const isRscRequest =
1108
+ isPartial ||
1109
+ (!request.headers.get("accept")?.includes("text/html") &&
1110
+ !url.searchParams.has("__html")) ||
1111
+ url.searchParams.has("__rsc");
832
1112
 
833
- // ============================================================================
834
- // ACTION REVALIDATION (action already executed, revalidate segments)
835
- // ============================================================================
836
- if (actionContinuation) {
837
- return await revalidateAfterAction(
838
- handlerCtx,
1113
+ if (isRscRequest) {
1114
+ return createResponseWithMergedHeaders(rscStream, {
1115
+ status: 404,
1116
+ headers: { "content-type": "text/x-component;charset=utf-8" },
1117
+ });
1118
+ }
1119
+
1120
+ const [ssrModule, streamMode] = await getSSRSetup(
1121
+ handlerCtx,
1122
+ request,
1123
+ env,
1124
+ url,
1125
+ requireRequestContext()._metricsStore,
1126
+ );
1127
+ const htmlStream = await ssrModule.renderHTML(rscStream, {
1128
+ nonce,
1129
+ streamMode,
1130
+ });
1131
+
1132
+ return createResponseWithMergedHeaders(htmlStream, {
1133
+ status: 404,
1134
+ headers: { "content-type": "text/html;charset=utf-8" },
1135
+ });
1136
+ }
1137
+
1138
+ // Report unhandled errors
1139
+ callOnError(error, "routing", {
839
1140
  request,
840
- env,
841
1141
  url,
842
- store,
843
- actionContinuation,
844
- );
1142
+ env,
1143
+ handledByBoundary: false,
1144
+ });
1145
+ console.error(`[RSC] Error:`, error);
1146
+ throw error;
845
1147
  }
1148
+ };
846
1149
 
847
- // ============================================================================
848
- // LOADER FETCH EXECUTION (data fetching with RSC serialization)
849
- // ============================================================================
850
- const isLoaderRequest = url.searchParams.has("_rsc_loader");
851
- if (isLoaderRequest) {
852
- return handleLoaderFetch(
853
- handlerCtx,
1150
+ // Wrap the render path in a renderStartMs timeout
1151
+ const executeRender = async (): Promise<Response> => {
1152
+ if (routeMiddleware.length > 0) {
1153
+ const mwResponse = await executeMiddleware(
1154
+ buildRouteMiddlewareEntries<TEnv>(routeMiddleware),
854
1155
  request,
855
1156
  env,
856
- url,
857
1157
  variables,
858
- routeParams,
1158
+ renderHandler,
1159
+ routeReverse,
859
1160
  );
860
- }
861
-
862
- // ============================================================================
863
- // REGULAR RSC RENDERING (Navigation)
864
- // ============================================================================
865
- // Note: Must use "return await" for try/catch to catch async rejections
866
- return await handleRscRendering(
867
- handlerCtx,
868
- request,
869
- env,
870
- url,
871
- isPartial,
872
- store,
873
- nonce,
874
- );
875
- } catch (error) {
876
- // Check if middleware/handler returned Response
877
- if (error instanceof Response) {
878
- // During partial (client-side navigation), a 200 Response from a handler
879
- // means the route serves raw content (JSON, text, etc.), not JSX.
880
- // Signal the browser to hard-navigate so it renders the raw response.
881
- // Only for 200 — redirects (3xx) work already because the browser follows
882
- // them automatically to a URL that serves Flight data.
883
- if (isPartial && error.status === 200) {
884
- console.warn(
885
- `[RSC] Route handler at ${url.pathname} returned a Response during client-side navigation. ` +
886
- `Falling back to hard navigation. Use data-external on the <Link> to avoid the extra round-trip.`,
887
- );
888
- return createResponseWithMergedHeaders(null, {
889
- status: 200,
890
- headers: {
891
- "X-RSC-Reload": stripInternalParams(url).toString(),
892
- "content-type": "text/x-component;charset=utf-8",
893
- },
894
- });
895
- }
896
1161
 
897
- if (isPartial) {
1162
+ if (isPartial || actionContinuation) {
898
1163
  const intercepted = interceptRedirectForPartial(
899
- error,
1164
+ mwResponse,
900
1165
  createRedirectFlightResponse,
901
1166
  );
902
1167
  if (intercepted) return intercepted;
903
1168
  }
904
1169
 
905
- return error;
1170
+ return finalizeResponse(mwResponse);
906
1171
  }
907
1172
 
908
- // Render 404 page for unmatched routes
909
- // Check both instanceof and error.name for cross-bundle compatibility
910
- const isRouteNotFound =
911
- error instanceof RouteNotFoundError ||
912
- (error instanceof Error && error.name === "RouteNotFoundError");
913
- if (isRouteNotFound) {
914
- callOnError(error, "routing", {
915
- request,
916
- url,
917
- env,
918
- handledByBoundary: true, // Handled by notFound component
919
- });
920
-
921
- // Get notFound component from router options or use default
922
- const notFoundOption = router.notFound;
923
- const notFoundComponent =
924
- typeof notFoundOption === "function"
925
- ? notFoundOption({ pathname: url.pathname })
926
- : (notFoundOption ?? createElement("h1", null, "Not Found"));
927
-
928
- // Create a simple segment for the 404 page
929
- const notFoundSegment = {
930
- id: "notFound",
931
- namespace: "notFound",
932
- type: "route" as const,
933
- index: 0,
934
- component: notFoundComponent,
935
- params: {},
936
- };
937
-
938
- const payload: RscPayload = {
939
- metadata: {
940
- pathname: url.pathname,
941
- segments: [notFoundSegment],
942
- matched: [],
943
- diff: [],
944
- isPartial: false,
945
- rootLayout: router.rootLayout,
946
- handles: store.stream(),
947
- version,
948
- themeConfig: router.themeConfig,
949
- warmupEnabled: router.warmupEnabled,
950
- initialTheme: requireRequestContext().theme,
951
- // No routeName for not-found routes
952
- },
953
- };
954
-
955
- const rscStream = renderToReadableStream(payload);
956
-
957
- // Determine if this is an RSC request or HTML request.
958
- // Partial requests are always RSC (see main isRscRequest comment).
959
- const isRscRequest =
960
- isPartial ||
961
- (!request.headers.get("accept")?.includes("text/html") &&
962
- !url.searchParams.has("__html")) ||
963
- url.searchParams.has("__rsc");
964
-
965
- if (isRscRequest) {
966
- return createResponseWithMergedHeaders(rscStream, {
967
- status: 404,
968
- headers: { "content-type": "text/x-component;charset=utf-8" },
969
- });
970
- }
971
-
972
- // Delegate to SSR for HTML response
973
- const [ssrModule, streamMode] = await Promise.all([
974
- loadSSRModule(),
975
- handlerCtx.resolveStreamMode(request, env, url),
976
- ]);
977
- const htmlStream = await ssrModule.renderHTML(rscStream, {
978
- nonce,
979
- streamMode,
980
- });
981
-
982
- return createResponseWithMergedHeaders(htmlStream, {
983
- status: 404,
984
- headers: { "content-type": "text/html;charset=utf-8" },
985
- });
986
- }
1173
+ return renderHandler();
1174
+ };
987
1175
 
988
- // Report unhandled errors
989
- callOnError(error, "routing", {
1176
+ const renderOutcome = await withTimeout(
1177
+ executeRender(),
1178
+ router.timeouts.renderStartMs,
1179
+ "render-start",
1180
+ );
1181
+ if (renderOutcome.timedOut) {
1182
+ return handleTimeoutResponse(
990
1183
  request,
991
- url,
992
1184
  env,
993
- handledByBoundary: false,
994
- });
995
- console.error(`[RSC] Error:`, error);
996
- throw error;
1185
+ url,
1186
+ "render-start",
1187
+ renderOutcome.durationMs,
1188
+ routeKey,
1189
+ );
997
1190
  }
1191
+ return renderOutcome.result;
998
1192
  }
999
1193
  }