@rangojs/router 0.0.0-experimental.dfdb0387 → 0.0.0-experimental.e9c0b2f2

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 (1199) hide show
  1. package/AGENTS.md +8 -0
  2. package/README.md +184 -31
  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 +339 -106
  82. package/dist/bin/rango.js.map +1 -0
  83. package/dist/browser/event-controller.d.ts +191 -0
  84. package/dist/browser/event-controller.d.ts.map +1 -0
  85. package/dist/browser/event-controller.js +559 -0
  86. package/dist/browser/event-controller.js.map +1 -0
  87. package/dist/browser/index.d.ts +2 -0
  88. package/dist/browser/index.d.ts.map +1 -0
  89. package/dist/browser/index.js +14 -0
  90. package/dist/browser/index.js.map +1 -0
  91. package/dist/browser/link-interceptor.d.ts +38 -0
  92. package/dist/browser/link-interceptor.d.ts.map +1 -0
  93. package/dist/browser/link-interceptor.js +99 -0
  94. package/dist/browser/link-interceptor.js.map +1 -0
  95. package/dist/browser/logging.d.ts +10 -0
  96. package/dist/browser/logging.d.ts.map +1 -0
  97. package/dist/browser/logging.js +29 -0
  98. package/dist/browser/logging.js.map +1 -0
  99. package/dist/browser/lru-cache.d.ts +17 -0
  100. package/dist/browser/lru-cache.d.ts.map +1 -0
  101. package/dist/browser/lru-cache.js +50 -0
  102. package/dist/browser/lru-cache.js.map +1 -0
  103. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  104. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  105. package/dist/browser/merge-segment-loaders.js +102 -0
  106. package/dist/browser/merge-segment-loaders.js.map +1 -0
  107. package/dist/browser/navigation-bridge.d.ts +102 -0
  108. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  109. package/dist/browser/navigation-bridge.js +708 -0
  110. package/dist/browser/navigation-bridge.js.map +1 -0
  111. package/dist/browser/navigation-client.d.ts +25 -0
  112. package/dist/browser/navigation-client.d.ts.map +1 -0
  113. package/dist/browser/navigation-client.js +157 -0
  114. package/dist/browser/navigation-client.js.map +1 -0
  115. package/dist/browser/navigation-store.d.ts +101 -0
  116. package/dist/browser/navigation-store.d.ts.map +1 -0
  117. package/dist/browser/navigation-store.js +625 -0
  118. package/dist/browser/navigation-store.js.map +1 -0
  119. package/dist/browser/partial-update.d.ts +75 -0
  120. package/dist/browser/partial-update.d.ts.map +1 -0
  121. package/dist/browser/partial-update.js +426 -0
  122. package/dist/browser/partial-update.js.map +1 -0
  123. package/dist/browser/react/Link.d.ts +86 -0
  124. package/dist/browser/react/Link.d.ts.map +1 -0
  125. package/dist/browser/react/Link.js +128 -0
  126. package/dist/browser/react/Link.js.map +1 -0
  127. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  128. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  129. package/dist/browser/react/NavigationProvider.js +216 -0
  130. package/dist/browser/react/NavigationProvider.js.map +1 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  132. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  133. package/dist/browser/react/ScrollRestoration.js +57 -0
  134. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  135. package/dist/browser/react/context.d.ts +46 -0
  136. package/dist/browser/react/context.d.ts.map +1 -0
  137. package/dist/browser/react/context.js +10 -0
  138. package/dist/browser/react/context.js.map +1 -0
  139. package/dist/browser/react/index.d.ts +11 -0
  140. package/dist/browser/react/index.d.ts.map +1 -0
  141. package/dist/browser/react/index.js +22 -0
  142. package/dist/browser/react/index.js.map +1 -0
  143. package/dist/browser/react/location-state-shared.d.ts +63 -0
  144. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  145. package/dist/browser/react/location-state-shared.js +81 -0
  146. package/dist/browser/react/location-state-shared.js.map +1 -0
  147. package/dist/browser/react/location-state.d.ts +23 -0
  148. package/dist/browser/react/location-state.d.ts.map +1 -0
  149. package/dist/browser/react/location-state.js +29 -0
  150. package/dist/browser/react/location-state.js.map +1 -0
  151. package/dist/browser/react/mount-context.d.ts +24 -0
  152. package/dist/browser/react/mount-context.d.ts.map +1 -0
  153. package/dist/browser/react/mount-context.js +24 -0
  154. package/dist/browser/react/mount-context.js.map +1 -0
  155. package/dist/browser/react/use-action.d.ts +64 -0
  156. package/dist/browser/react/use-action.d.ts.map +1 -0
  157. package/dist/browser/react/use-action.js +134 -0
  158. package/dist/browser/react/use-action.js.map +1 -0
  159. package/dist/browser/react/use-client-cache.d.ts +41 -0
  160. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  161. package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -28
  162. package/dist/browser/react/use-client-cache.js.map +1 -0
  163. package/dist/browser/react/use-handle.d.ts +31 -0
  164. package/dist/browser/react/use-handle.d.ts.map +1 -0
  165. package/dist/browser/react/use-handle.js +144 -0
  166. package/dist/browser/react/use-handle.js.map +1 -0
  167. package/dist/browser/react/use-href.d.ts +33 -0
  168. package/dist/browser/react/use-href.d.ts.map +1 -0
  169. package/dist/browser/react/use-href.js +39 -0
  170. package/dist/browser/react/use-href.js.map +1 -0
  171. package/dist/browser/react/use-link-status.d.ts +37 -0
  172. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  173. package/dist/browser/react/use-link-status.js +99 -0
  174. package/dist/browser/react/use-link-status.js.map +1 -0
  175. package/dist/browser/react/use-mount.d.ts +25 -0
  176. package/dist/browser/react/use-mount.d.ts.map +1 -0
  177. package/dist/browser/react/use-mount.js +30 -0
  178. package/dist/browser/react/use-mount.js.map +1 -0
  179. package/dist/browser/react/use-navigation.d.ts +27 -0
  180. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  181. package/dist/browser/react/use-navigation.js +87 -0
  182. package/dist/browser/react/use-navigation.js.map +1 -0
  183. package/dist/browser/react/use-segments.d.ts +38 -0
  184. package/dist/browser/react/use-segments.d.ts.map +1 -0
  185. package/dist/browser/react/use-segments.js +130 -0
  186. package/dist/browser/react/use-segments.js.map +1 -0
  187. package/dist/browser/request-controller.d.ts +26 -0
  188. package/dist/browser/request-controller.d.ts.map +1 -0
  189. package/dist/browser/request-controller.js +147 -0
  190. package/dist/browser/request-controller.js.map +1 -0
  191. package/dist/browser/rsc-router.d.ts +129 -0
  192. package/dist/browser/rsc-router.d.ts.map +1 -0
  193. package/dist/browser/rsc-router.js +195 -0
  194. package/dist/browser/rsc-router.js.map +1 -0
  195. package/dist/browser/scroll-restoration.d.ts +93 -0
  196. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  197. package/dist/browser/scroll-restoration.js +321 -0
  198. package/dist/browser/scroll-restoration.js.map +1 -0
  199. package/dist/browser/segment-structure-assert.d.ts +17 -0
  200. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  201. package/dist/browser/segment-structure-assert.js +59 -0
  202. package/dist/browser/segment-structure-assert.js.map +1 -0
  203. package/dist/browser/server-action-bridge.d.ts +26 -0
  204. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  205. package/dist/browser/server-action-bridge.js +668 -0
  206. package/dist/browser/server-action-bridge.js.map +1 -0
  207. package/dist/browser/shallow.d.ts +12 -0
  208. package/dist/browser/shallow.d.ts.map +1 -0
  209. package/dist/browser/shallow.js +34 -0
  210. package/dist/browser/shallow.js.map +1 -0
  211. package/dist/browser/types.d.ts +369 -0
  212. package/dist/browser/types.d.ts.map +1 -0
  213. package/dist/browser/types.js +2 -0
  214. package/dist/browser/types.js.map +1 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  216. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  217. package/dist/build/__tests__/generate-cli.test.js +237 -0
  218. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  220. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  221. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  222. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  224. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  225. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  226. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  228. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  230. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  231. package/dist/build/generate-manifest.d.ts +81 -0
  232. package/dist/build/generate-manifest.d.ts.map +1 -0
  233. package/dist/build/generate-manifest.js +276 -0
  234. package/dist/build/generate-manifest.js.map +1 -0
  235. package/dist/build/generate-route-types.d.ts +115 -0
  236. package/dist/build/generate-route-types.d.ts.map +1 -0
  237. package/dist/build/generate-route-types.js +740 -0
  238. package/dist/build/generate-route-types.js.map +1 -0
  239. package/dist/build/index.d.ts +21 -0
  240. package/dist/build/index.d.ts.map +1 -0
  241. package/dist/build/index.js +21 -0
  242. package/dist/build/index.js.map +1 -0
  243. package/dist/build/route-trie.d.ts +71 -0
  244. package/dist/build/route-trie.d.ts.map +1 -0
  245. package/dist/build/route-trie.js +175 -0
  246. package/dist/build/route-trie.js.map +1 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  248. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  249. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  250. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  252. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  253. package/dist/cache/__tests__/document-cache.test.js +345 -0
  254. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  258. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  260. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  261. package/dist/cache/__tests__/memory-store.test.js +367 -0
  262. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  263. package/dist/cache/cache-scope.d.ts +102 -0
  264. package/dist/cache/cache-scope.d.ts.map +1 -0
  265. package/dist/cache/cache-scope.js +440 -0
  266. package/dist/cache/cache-scope.js.map +1 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  270. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  272. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  273. package/dist/cache/cf/cf-cache-store.js +242 -0
  274. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  275. package/dist/cache/cf/index.d.ts +14 -0
  276. package/dist/cache/cf/index.d.ts.map +1 -0
  277. package/dist/cache/cf/index.js +17 -0
  278. package/dist/cache/cf/index.js.map +1 -0
  279. package/dist/cache/document-cache.d.ts +64 -0
  280. package/dist/cache/document-cache.d.ts.map +1 -0
  281. package/dist/cache/document-cache.js +228 -0
  282. package/dist/cache/document-cache.js.map +1 -0
  283. package/dist/cache/index.d.ts +19 -0
  284. package/dist/cache/index.d.ts.map +1 -0
  285. package/dist/cache/index.js +21 -0
  286. package/dist/cache/index.js.map +1 -0
  287. package/dist/cache/memory-segment-store.d.ts +110 -0
  288. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  289. package/dist/cache/memory-segment-store.js +117 -0
  290. package/dist/cache/memory-segment-store.js.map +1 -0
  291. package/dist/cache/memory-store.d.ts +41 -0
  292. package/dist/cache/memory-store.d.ts.map +1 -0
  293. package/dist/cache/memory-store.js +191 -0
  294. package/dist/cache/memory-store.js.map +1 -0
  295. package/dist/cache/types.d.ts +317 -0
  296. package/dist/cache/types.d.ts.map +1 -0
  297. package/dist/cache/types.js +12 -0
  298. package/dist/cache/types.js.map +1 -0
  299. package/dist/client.d.ts +248 -0
  300. package/dist/client.d.ts.map +1 -0
  301. package/dist/client.js +367 -0
  302. package/dist/client.js.map +1 -0
  303. package/dist/client.rsc.d.ts +26 -0
  304. package/dist/client.rsc.d.ts.map +1 -0
  305. package/dist/client.rsc.js +46 -0
  306. package/dist/client.rsc.js.map +1 -0
  307. package/dist/component-utils.d.ts +36 -0
  308. package/dist/component-utils.d.ts.map +1 -0
  309. package/dist/component-utils.js +61 -0
  310. package/dist/component-utils.js.map +1 -0
  311. package/dist/components/DefaultDocument.d.ts +13 -0
  312. package/dist/components/DefaultDocument.d.ts.map +1 -0
  313. package/dist/components/DefaultDocument.js +15 -0
  314. package/dist/components/DefaultDocument.js.map +1 -0
  315. package/dist/debug.d.ts +58 -0
  316. package/dist/debug.d.ts.map +1 -0
  317. package/dist/debug.js +157 -0
  318. package/dist/debug.js.map +1 -0
  319. package/dist/default-error-boundary.d.ts +11 -0
  320. package/dist/default-error-boundary.d.ts.map +1 -0
  321. package/dist/default-error-boundary.js +45 -0
  322. package/dist/default-error-boundary.js.map +1 -0
  323. package/dist/deps/browser.d.ts +2 -0
  324. package/dist/deps/browser.d.ts.map +1 -0
  325. package/dist/deps/browser.js +3 -0
  326. package/dist/deps/browser.js.map +1 -0
  327. package/dist/deps/html-stream-client.d.ts +2 -0
  328. package/dist/deps/html-stream-client.d.ts.map +1 -0
  329. package/dist/deps/html-stream-client.js +3 -0
  330. package/dist/deps/html-stream-client.js.map +1 -0
  331. package/dist/deps/html-stream-server.d.ts +2 -0
  332. package/dist/deps/html-stream-server.d.ts.map +1 -0
  333. package/dist/deps/html-stream-server.js +3 -0
  334. package/dist/deps/html-stream-server.js.map +1 -0
  335. package/dist/deps/rsc.d.ts +2 -0
  336. package/dist/deps/rsc.d.ts.map +1 -0
  337. package/dist/deps/rsc.js +4 -0
  338. package/dist/deps/rsc.js.map +1 -0
  339. package/dist/deps/ssr.d.ts +2 -0
  340. package/dist/deps/ssr.d.ts.map +1 -0
  341. package/dist/deps/ssr.js +3 -0
  342. package/dist/deps/ssr.js.map +1 -0
  343. package/dist/errors.d.ts +174 -0
  344. package/dist/errors.d.ts.map +1 -0
  345. package/dist/errors.js +241 -0
  346. package/dist/errors.js.map +1 -0
  347. package/dist/handle.d.ts +78 -0
  348. package/dist/handle.d.ts.map +1 -0
  349. package/dist/handle.js +82 -0
  350. package/dist/handle.js.map +1 -0
  351. package/dist/handles/MetaTags.d.ts +14 -0
  352. package/dist/handles/MetaTags.d.ts.map +1 -0
  353. package/dist/handles/MetaTags.js +136 -0
  354. package/dist/handles/MetaTags.js.map +1 -0
  355. package/{src/handles/index.ts → dist/handles/index.d.ts} +1 -2
  356. package/dist/handles/index.d.ts.map +1 -0
  357. package/dist/handles/index.js +6 -0
  358. package/dist/handles/index.js.map +1 -0
  359. package/dist/handles/meta.d.ts +39 -0
  360. package/dist/handles/meta.d.ts.map +1 -0
  361. package/dist/handles/meta.js +202 -0
  362. package/dist/handles/meta.js.map +1 -0
  363. package/dist/host/__tests__/errors.test.d.ts +2 -0
  364. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  365. package/dist/host/__tests__/errors.test.js +76 -0
  366. package/dist/host/__tests__/errors.test.js.map +1 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  370. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  372. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  374. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  375. package/dist/host/__tests__/router.test.d.ts +2 -0
  376. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  377. package/dist/host/__tests__/router.test.js +241 -0
  378. package/dist/host/__tests__/router.test.js.map +1 -0
  379. package/dist/host/__tests__/testing.test.d.ts +2 -0
  380. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  381. package/dist/host/__tests__/testing.test.js +64 -0
  382. package/dist/host/__tests__/testing.test.js.map +1 -0
  383. package/dist/host/__tests__/utils.test.d.ts +2 -0
  384. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  385. package/dist/host/__tests__/utils.test.js +29 -0
  386. package/dist/host/__tests__/utils.test.js.map +1 -0
  387. package/dist/host/cookie-handler.d.ts +34 -0
  388. package/dist/host/cookie-handler.d.ts.map +1 -0
  389. package/dist/host/cookie-handler.js +124 -0
  390. package/dist/host/cookie-handler.js.map +1 -0
  391. package/dist/host/errors.d.ts +56 -0
  392. package/dist/host/errors.d.ts.map +1 -0
  393. package/dist/host/errors.js +79 -0
  394. package/dist/host/errors.js.map +1 -0
  395. package/dist/host/index.d.ts +29 -0
  396. package/dist/host/index.d.ts.map +1 -0
  397. package/dist/host/index.js +32 -0
  398. package/dist/host/index.js.map +1 -0
  399. package/dist/host/pattern-matcher.d.ts +36 -0
  400. package/dist/host/pattern-matcher.d.ts.map +1 -0
  401. package/dist/host/pattern-matcher.js +172 -0
  402. package/dist/host/pattern-matcher.js.map +1 -0
  403. package/dist/host/router.d.ts +26 -0
  404. package/dist/host/router.d.ts.map +1 -0
  405. package/dist/host/router.js +218 -0
  406. package/dist/host/router.js.map +1 -0
  407. package/dist/host/testing.d.ts +36 -0
  408. package/dist/host/testing.d.ts.map +1 -0
  409. package/dist/host/testing.js +55 -0
  410. package/dist/host/testing.js.map +1 -0
  411. package/dist/host/types.d.ts +115 -0
  412. package/dist/host/types.d.ts.map +1 -0
  413. package/dist/host/types.js +7 -0
  414. package/dist/host/types.js.map +1 -0
  415. package/dist/host/utils.d.ts +21 -0
  416. package/dist/host/utils.d.ts.map +1 -0
  417. package/dist/host/utils.js +23 -0
  418. package/dist/host/utils.js.map +1 -0
  419. package/dist/href-client.d.ts +131 -0
  420. package/dist/href-client.d.ts.map +1 -0
  421. package/dist/href-client.js +64 -0
  422. package/dist/href-client.js.map +1 -0
  423. package/dist/href-context.d.ts +29 -0
  424. package/dist/href-context.d.ts.map +1 -0
  425. package/dist/href-context.js +21 -0
  426. package/dist/href-context.js.map +1 -0
  427. package/dist/index.d.ts +73 -0
  428. package/dist/index.d.ts.map +1 -0
  429. package/dist/index.js +91 -0
  430. package/dist/index.js.map +1 -0
  431. package/dist/index.rsc.d.ts +32 -0
  432. package/dist/index.rsc.d.ts.map +1 -0
  433. package/dist/index.rsc.js +40 -0
  434. package/dist/index.rsc.js.map +1 -0
  435. package/dist/internal-debug.d.ts +2 -0
  436. package/dist/internal-debug.d.ts.map +1 -0
  437. package/dist/internal-debug.js +5 -0
  438. package/dist/internal-debug.js.map +1 -0
  439. package/dist/loader.d.ts +14 -0
  440. package/dist/loader.d.ts.map +1 -0
  441. package/dist/loader.js +20 -0
  442. package/dist/loader.js.map +1 -0
  443. package/dist/loader.rsc.d.ts +19 -0
  444. package/dist/loader.rsc.d.ts.map +1 -0
  445. package/dist/loader.rsc.js +99 -0
  446. package/dist/loader.rsc.js.map +1 -0
  447. package/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/testing/vitest.js +82 -0
  712. package/dist/theme/ThemeProvider.d.ts +20 -0
  713. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  714. package/dist/theme/ThemeProvider.js +240 -0
  715. package/dist/theme/ThemeProvider.js.map +1 -0
  716. package/dist/theme/ThemeScript.d.ts +48 -0
  717. package/dist/theme/ThemeScript.d.ts.map +1 -0
  718. package/dist/theme/ThemeScript.js +13 -0
  719. package/dist/theme/ThemeScript.js.map +1 -0
  720. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  721. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  722. package/dist/theme/__tests__/theme.test.js +103 -0
  723. package/dist/theme/__tests__/theme.test.js.map +1 -0
  724. package/dist/theme/constants.d.ts +29 -0
  725. package/dist/theme/constants.d.ts.map +1 -0
  726. package/dist/theme/constants.js +48 -0
  727. package/dist/theme/constants.js.map +1 -0
  728. package/dist/theme/index.d.ts +31 -0
  729. package/dist/theme/index.d.ts.map +1 -0
  730. package/dist/theme/index.js +36 -0
  731. package/dist/theme/index.js.map +1 -0
  732. package/dist/theme/theme-context.d.ts +40 -0
  733. package/dist/theme/theme-context.d.ts.map +1 -0
  734. package/dist/theme/theme-context.js +60 -0
  735. package/dist/theme/theme-context.js.map +1 -0
  736. package/dist/theme/theme-script.d.ts +27 -0
  737. package/dist/theme/theme-script.d.ts.map +1 -0
  738. package/dist/theme/theme-script.js +147 -0
  739. package/dist/theme/theme-script.js.map +1 -0
  740. package/dist/theme/types.d.ts +163 -0
  741. package/dist/theme/types.d.ts.map +1 -0
  742. package/dist/theme/types.js +11 -0
  743. package/dist/theme/types.js.map +1 -0
  744. package/dist/theme/use-theme.d.ts +12 -0
  745. package/dist/theme/use-theme.d.ts.map +1 -0
  746. package/dist/theme/use-theme.js +40 -0
  747. package/dist/theme/use-theme.js.map +1 -0
  748. package/dist/types.d.ts +1479 -0
  749. package/dist/types.d.ts.map +1 -0
  750. package/dist/types.js +10 -0
  751. package/dist/types.js.map +1 -0
  752. package/dist/urls.d.ts +441 -0
  753. package/dist/urls.d.ts.map +1 -0
  754. package/dist/urls.gen.d.ts +8 -0
  755. package/dist/urls.gen.d.ts.map +1 -0
  756. package/dist/urls.gen.js +8 -0
  757. package/dist/urls.gen.js.map +1 -0
  758. package/dist/urls.js +443 -0
  759. package/dist/urls.js.map +1 -0
  760. package/dist/use-loader.d.ts +127 -0
  761. package/dist/use-loader.d.ts.map +1 -0
  762. package/dist/use-loader.js +237 -0
  763. package/dist/use-loader.js.map +1 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  767. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  771. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  775. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  777. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  779. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  780. package/dist/vite/ast-handler-extract.d.ts +49 -0
  781. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  782. package/dist/vite/ast-handler-extract.js +249 -0
  783. package/dist/vite/ast-handler-extract.js.map +1 -0
  784. package/dist/vite/expose-action-id.d.ts +19 -0
  785. package/dist/vite/expose-action-id.d.ts.map +1 -0
  786. package/dist/vite/expose-action-id.js +250 -0
  787. package/dist/vite/expose-action-id.js.map +1 -0
  788. package/dist/vite/expose-id-utils.d.ts +69 -0
  789. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  790. package/dist/vite/expose-id-utils.js +289 -0
  791. package/dist/vite/expose-id-utils.js.map +1 -0
  792. package/dist/vite/expose-internal-ids.d.ts +22 -0
  793. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  794. package/dist/vite/expose-internal-ids.js +886 -0
  795. package/dist/vite/expose-internal-ids.js.map +1 -0
  796. package/dist/vite/index.d.ts +149 -0
  797. package/dist/vite/index.d.ts.map +1 -0
  798. package/dist/vite/index.js +3247 -1128
  799. package/dist/vite/index.js.bak +5448 -0
  800. package/dist/vite/index.js.map +1 -0
  801. package/dist/vite/index.named-routes.gen.ts +103 -0
  802. package/dist/vite/package-resolution.d.ts +43 -0
  803. package/dist/vite/package-resolution.d.ts.map +1 -0
  804. package/dist/vite/package-resolution.js +112 -0
  805. package/dist/vite/package-resolution.js.map +1 -0
  806. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  807. package/dist/vite/virtual-entries.d.ts +25 -0
  808. package/dist/vite/virtual-entries.d.ts.map +1 -0
  809. package/dist/vite/virtual-entries.js +110 -0
  810. package/dist/vite/virtual-entries.js.map +1 -0
  811. package/package.json +81 -12
  812. package/skills/api-client/SKILL.md +211 -0
  813. package/skills/breadcrumbs/SKILL.md +64 -2
  814. package/skills/bundle-analysis/SKILL.md +159 -0
  815. package/skills/cache-guide/SKILL.md +224 -32
  816. package/skills/caching/SKILL.md +279 -17
  817. package/skills/composability/SKILL.md +27 -2
  818. package/skills/css/SKILL.md +76 -0
  819. package/skills/debug-manifest/SKILL.md +4 -2
  820. package/skills/document-cache/SKILL.md +78 -55
  821. package/skills/handler-use/SKILL.md +364 -0
  822. package/skills/hooks/SKILL.md +250 -30
  823. package/skills/host-router/SKILL.md +125 -23
  824. package/skills/i18n/SKILL.md +276 -0
  825. package/skills/intercept/SKILL.md +50 -6
  826. package/skills/layout/SKILL.md +35 -9
  827. package/skills/links/SKILL.md +247 -17
  828. package/skills/loader/SKILL.md +225 -9
  829. package/skills/middleware/SKILL.md +50 -13
  830. package/skills/migrate-nextjs/SKILL.md +584 -0
  831. package/skills/migrate-react-router/SKILL.md +771 -0
  832. package/skills/mime-routes/SKILL.md +28 -1
  833. package/skills/observability/SKILL.md +194 -0
  834. package/skills/parallel/SKILL.md +77 -7
  835. package/skills/prerender/SKILL.md +45 -43
  836. package/skills/rango/SKILL.md +257 -22
  837. package/skills/react-compiler/SKILL.md +168 -0
  838. package/skills/response-routes/SKILL.md +123 -48
  839. package/skills/route/SKILL.md +70 -5
  840. package/skills/router-setup/SKILL.md +30 -6
  841. package/skills/scripts/SKILL.md +179 -0
  842. package/skills/server-actions/SKILL.md +775 -0
  843. package/skills/streams-and-websockets/SKILL.md +283 -0
  844. package/skills/tailwind/SKILL.md +27 -3
  845. package/skills/testing/SKILL.md +129 -0
  846. package/skills/testing/bindings.md +103 -0
  847. package/skills/testing/cache-prerender.md +127 -0
  848. package/skills/testing/client-components.md +124 -0
  849. package/skills/testing/e2e-parity.md +125 -0
  850. package/skills/testing/flight.md +91 -0
  851. package/skills/testing/handles.md +129 -0
  852. package/skills/testing/loader.md +128 -0
  853. package/skills/testing/middleware.md +99 -0
  854. package/skills/testing/render-handler.md +121 -0
  855. package/skills/testing/response-routes.md +95 -0
  856. package/skills/testing/reverse-and-types.md +84 -0
  857. package/skills/testing/server-actions.md +107 -0
  858. package/skills/testing/server-tree.md +128 -0
  859. package/skills/testing/setup.md +123 -0
  860. package/skills/typesafety/SKILL.md +322 -29
  861. package/skills/use-cache/SKILL.md +46 -14
  862. package/skills/vercel/SKILL.md +128 -0
  863. package/skills/view-transitions/SKILL.md +294 -0
  864. package/src/__augment-tests__/augment.ts +81 -0
  865. package/src/__augment-tests__/augmented.check.ts +116 -0
  866. package/src/__internal.ts +0 -65
  867. package/src/browser/action-coordinator.ts +53 -36
  868. package/src/browser/action-fence.ts +47 -0
  869. package/src/browser/app-shell.ts +39 -0
  870. package/src/browser/connection-warmup.ts +134 -0
  871. package/src/browser/cookie-name.ts +140 -0
  872. package/src/browser/event-controller.ts +192 -150
  873. package/src/browser/history-state.ts +21 -0
  874. package/src/browser/index.ts +3 -3
  875. package/src/browser/invalidate-client-cache.ts +52 -0
  876. package/src/browser/navigation-bridge.ts +50 -11
  877. package/src/browser/navigation-client.ts +113 -78
  878. package/src/browser/navigation-store-handle.ts +38 -0
  879. package/src/browser/navigation-store.ts +33 -59
  880. package/src/browser/navigation-transaction.ts +9 -59
  881. package/src/browser/partial-update.ts +109 -122
  882. package/src/browser/prefetch/cache.ts +193 -68
  883. package/src/browser/prefetch/fetch.ts +293 -59
  884. package/src/browser/prefetch/queue.ts +42 -8
  885. package/src/browser/rango-state.ts +158 -76
  886. package/src/browser/react/Link.tsx +48 -20
  887. package/src/browser/react/NavigationProvider.tsx +95 -117
  888. package/src/browser/react/ScrollRestoration.tsx +10 -6
  889. package/src/browser/react/filter-segment-order.ts +66 -7
  890. package/src/browser/react/index.ts +0 -48
  891. package/src/browser/react/location-state-shared.ts +178 -8
  892. package/src/browser/react/location-state.ts +39 -14
  893. package/src/browser/react/use-action.ts +6 -15
  894. package/src/browser/react/use-handle.ts +17 -14
  895. package/src/browser/react/use-href.tsx +8 -1
  896. package/src/browser/react/use-link-status.ts +33 -8
  897. package/src/browser/react/use-navigation.ts +32 -7
  898. package/src/browser/react/use-params.ts +20 -10
  899. package/src/browser/react/use-reverse.ts +106 -0
  900. package/src/browser/react/use-router.ts +25 -3
  901. package/src/browser/react/use-search-params.ts +0 -5
  902. package/src/browser/react/use-segments.ts +11 -21
  903. package/src/browser/response-adapter.ts +66 -4
  904. package/src/browser/rsc-router.tsx +91 -24
  905. package/src/browser/scroll-restoration.ts +30 -17
  906. package/src/browser/segment-reconciler.ts +10 -14
  907. package/src/browser/segment-structure-assert.ts +2 -2
  908. package/src/browser/server-action-bridge.ts +214 -55
  909. package/src/browser/types.ts +48 -8
  910. package/src/browser/validate-redirect-origin.ts +43 -16
  911. package/src/build/collect-fallback-refs.ts +107 -0
  912. package/src/build/generate-manifest.ts +60 -35
  913. package/src/build/generate-route-types.ts +3 -1
  914. package/src/build/index.ts +8 -2
  915. package/src/build/prefix-tree-utils.ts +123 -0
  916. package/src/build/route-trie.ts +165 -36
  917. package/src/build/route-types/ast-route-extraction.ts +15 -8
  918. package/src/build/route-types/codegen.ts +16 -5
  919. package/src/build/route-types/include-resolution.ts +117 -23
  920. package/src/build/route-types/param-extraction.ts +6 -3
  921. package/src/build/route-types/per-module-writer.ts +22 -6
  922. package/src/build/route-types/router-processing.ts +128 -51
  923. package/src/build/route-types/scan-filter.ts +1 -1
  924. package/src/build/route-types/source-scan.ts +216 -0
  925. package/src/build/runtime-discovery.ts +9 -20
  926. package/src/cache/cache-error.ts +104 -0
  927. package/src/cache/cache-key-utils.ts +29 -13
  928. package/src/cache/cache-policy.ts +108 -34
  929. package/src/cache/cache-runtime.ts +199 -37
  930. package/src/cache/cache-scope.ts +188 -82
  931. package/src/cache/cache-tag.ts +103 -0
  932. package/src/cache/cf/cf-base64.ts +33 -0
  933. package/src/cache/cf/cf-cache-constants.ts +127 -0
  934. package/src/cache/cf/cf-cache-store.ts +1989 -378
  935. package/src/cache/cf/cf-cache-types.ts +349 -0
  936. package/src/cache/cf/cf-kv-utils.ts +46 -0
  937. package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
  938. package/src/cache/cf/index.ts +6 -16
  939. package/src/cache/document-cache.ts +72 -20
  940. package/src/cache/handle-snapshot.ts +70 -0
  941. package/src/cache/index.ts +22 -20
  942. package/src/cache/memory-segment-store.ts +136 -37
  943. package/src/cache/profile-registry.ts +31 -31
  944. package/src/cache/read-through-swr.ts +41 -11
  945. package/src/cache/segment-codec.ts +9 -17
  946. package/src/cache/tag-invalidation.ts +230 -0
  947. package/src/cache/types.ts +37 -100
  948. package/src/cache/vercel/index.ts +11 -0
  949. package/src/cache/vercel/vercel-cache-store.ts +855 -0
  950. package/src/client.rsc.tsx +44 -21
  951. package/src/client.tsx +118 -235
  952. package/src/cloudflare/index.ts +11 -0
  953. package/src/cloudflare/tracing.ts +109 -0
  954. package/src/component-utils.ts +19 -0
  955. package/src/components/DefaultDocument.tsx +8 -2
  956. package/src/context-var.ts +18 -6
  957. package/src/decode-loader-results.ts +52 -0
  958. package/src/defer.ts +196 -0
  959. package/src/deps/ssr.ts +0 -1
  960. package/src/encode-kv.ts +49 -0
  961. package/src/errors.ts +30 -4
  962. package/src/escape-script.ts +52 -0
  963. package/src/handle.ts +31 -23
  964. package/src/handles/MetaTags.tsx +56 -19
  965. package/src/handles/Scripts.tsx +183 -0
  966. package/src/handles/breadcrumbs.ts +37 -8
  967. package/src/handles/is-thenable.ts +19 -0
  968. package/src/handles/meta.ts +51 -40
  969. package/src/handles/script.ts +244 -0
  970. package/src/host/cookie-handler.ts +9 -60
  971. package/src/host/errors.ts +0 -24
  972. package/src/host/index.ts +8 -2
  973. package/src/host/pattern-matcher.ts +23 -52
  974. package/src/host/router.ts +107 -99
  975. package/src/host/testing.ts +40 -27
  976. package/src/host/types.ts +37 -4
  977. package/src/host/utils.ts +1 -1
  978. package/src/href-client.ts +137 -22
  979. package/src/index.rsc.ts +90 -11
  980. package/src/index.ts +125 -19
  981. package/src/internal-debug.ts +2 -4
  982. package/src/loader-store.ts +500 -0
  983. package/src/loader.rsc.ts +20 -13
  984. package/src/loader.ts +12 -11
  985. package/src/missing-id-error.ts +68 -0
  986. package/src/network-error-thrower.tsx +1 -6
  987. package/src/outlet-context.ts +1 -1
  988. package/src/outlet-provider.tsx +1 -5
  989. package/src/prerender/param-hash.ts +16 -16
  990. package/src/prerender/store.ts +32 -37
  991. package/src/prerender.ts +61 -6
  992. package/src/redirect-origin.ts +100 -0
  993. package/src/regex-escape.ts +8 -0
  994. package/src/response-utils.ts +62 -0
  995. package/src/reverse.ts +65 -36
  996. package/src/root-error-boundary.tsx +1 -19
  997. package/src/route-content-wrapper.tsx +7 -72
  998. package/src/route-definition/dsl-helpers.ts +418 -273
  999. package/src/route-definition/helper-factories.ts +29 -139
  1000. package/src/route-definition/helpers-types.ts +103 -31
  1001. package/src/route-definition/redirect.ts +44 -11
  1002. package/src/route-definition/resolve-handler-use.ts +12 -0
  1003. package/src/route-definition/use-item-types.ts +32 -0
  1004. package/src/route-map-builder.ts +0 -16
  1005. package/src/route-types.ts +26 -41
  1006. package/src/router/basename.ts +14 -0
  1007. package/src/router/content-negotiation.ts +73 -25
  1008. package/src/router/error-handling.ts +45 -18
  1009. package/src/router/find-match.ts +44 -23
  1010. package/src/router/handler-context.ts +27 -39
  1011. package/src/router/instrument.ts +350 -0
  1012. package/src/router/intercept-resolution.ts +39 -20
  1013. package/src/router/lazy-includes.ts +15 -52
  1014. package/src/router/loader-resolution.ts +155 -72
  1015. package/src/router/logging.ts +0 -6
  1016. package/src/router/manifest.ts +40 -42
  1017. package/src/router/match-api.ts +4 -23
  1018. package/src/router/match-context.ts +0 -22
  1019. package/src/router/match-handlers.ts +58 -58
  1020. package/src/router/match-middleware/background-revalidation.ts +6 -7
  1021. package/src/router/match-middleware/cache-lookup.ts +161 -286
  1022. package/src/router/match-middleware/cache-store.ts +31 -34
  1023. package/src/router/match-middleware/intercept-resolution.ts +0 -22
  1024. package/src/router/match-middleware/segment-resolution.ts +0 -22
  1025. package/src/router/match-pipelines.ts +1 -42
  1026. package/src/router/match-result.ts +44 -74
  1027. package/src/router/metrics.ts +0 -34
  1028. package/src/router/middleware-types.ts +7 -134
  1029. package/src/router/middleware.ts +266 -166
  1030. package/src/router/navigation-snapshot.ts +0 -51
  1031. package/src/router/params-util.ts +23 -0
  1032. package/src/router/pattern-matching.ts +132 -90
  1033. package/src/router/prefetch-cache-ttl.ts +51 -0
  1034. package/src/router/prerender-match.ts +104 -65
  1035. package/src/router/preview-match.ts +3 -1
  1036. package/src/router/request-classification.ts +28 -62
  1037. package/src/router/revalidation.ts +123 -73
  1038. package/src/router/route-snapshot.ts +0 -1
  1039. package/src/router/router-context.ts +3 -28
  1040. package/src/router/router-interfaces.ts +83 -35
  1041. package/src/router/router-options.ts +136 -5
  1042. package/src/router/router-registry.ts +2 -5
  1043. package/src/router/segment-resolution/fresh.ts +93 -84
  1044. package/src/router/segment-resolution/helpers.ts +86 -6
  1045. package/src/router/segment-resolution/loader-cache.ts +62 -37
  1046. package/src/router/segment-resolution/revalidation.ts +269 -320
  1047. package/src/router/segment-resolution/static-store.ts +19 -5
  1048. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  1049. package/src/router/segment-resolution/view-transition-default.ts +36 -0
  1050. package/src/router/segment-resolution.ts +5 -1
  1051. package/src/router/segment-wrappers.ts +6 -5
  1052. package/src/router/state-cookie-name.ts +33 -0
  1053. package/src/router/substitute-pattern-params.ts +56 -0
  1054. package/src/router/telemetry-otel.ts +161 -199
  1055. package/src/router/telemetry.ts +96 -19
  1056. package/src/router/timeout.ts +0 -20
  1057. package/src/router/tracing.ts +206 -0
  1058. package/src/router/trie-matching.ts +163 -59
  1059. package/src/router/types.ts +9 -63
  1060. package/src/router/url-params.ts +44 -0
  1061. package/src/router.ts +110 -55
  1062. package/src/rsc/handler-context.ts +3 -2
  1063. package/src/rsc/handler.ts +266 -219
  1064. package/src/rsc/helpers.ts +168 -46
  1065. package/src/rsc/index.ts +2 -5
  1066. package/src/rsc/json-route-result.ts +38 -0
  1067. package/src/rsc/loader-fetch.ts +114 -38
  1068. package/src/rsc/manifest-init.ts +28 -41
  1069. package/src/rsc/origin-guard.ts +39 -25
  1070. package/src/rsc/progressive-enhancement.ts +63 -9
  1071. package/src/rsc/redirect-guard.ts +99 -0
  1072. package/src/rsc/response-cache-serve.ts +238 -0
  1073. package/src/rsc/response-error.ts +79 -12
  1074. package/src/rsc/response-route-handler.ts +99 -189
  1075. package/src/rsc/rsc-rendering.ts +99 -75
  1076. package/src/rsc/runtime-warnings.ts +23 -10
  1077. package/src/rsc/server-action.ts +258 -115
  1078. package/src/rsc/ssr-setup.ts +16 -0
  1079. package/src/rsc/types.ts +23 -5
  1080. package/src/runtime-env.ts +18 -0
  1081. package/src/search-params.ts +35 -30
  1082. package/src/segment-content-promise.ts +67 -0
  1083. package/src/segment-loader-promise.ts +149 -0
  1084. package/src/segment-system.tsx +218 -202
  1085. package/src/serialize.ts +243 -0
  1086. package/src/server/context.ts +175 -53
  1087. package/src/server/cookie-parse.ts +32 -0
  1088. package/src/server/cookie-store.ts +80 -5
  1089. package/src/server/handle-store.ts +21 -38
  1090. package/src/server/loader-registry.ts +21 -42
  1091. package/src/server/request-context.ts +235 -175
  1092. package/src/ssr/index.tsx +21 -16
  1093. package/src/static-handler.ts +10 -13
  1094. package/src/testing/cache-status.ts +162 -0
  1095. package/src/testing/collect-handle.ts +40 -0
  1096. package/src/testing/dispatch.ts +701 -0
  1097. package/src/testing/dom.entry.ts +22 -0
  1098. package/src/testing/e2e/fixture.ts +188 -0
  1099. package/src/testing/e2e/index.ts +128 -0
  1100. package/src/testing/e2e/matchers.ts +35 -0
  1101. package/src/testing/e2e/page-helpers.ts +272 -0
  1102. package/src/testing/e2e/parity.ts +387 -0
  1103. package/src/testing/e2e/server.ts +195 -0
  1104. package/src/testing/flight-matchers.ts +97 -0
  1105. package/src/testing/flight-normalize.ts +11 -0
  1106. package/src/testing/flight-runtime.d.ts +57 -0
  1107. package/src/testing/flight-tree.ts +682 -0
  1108. package/src/testing/flight.entry.ts +52 -0
  1109. package/src/testing/flight.ts +257 -0
  1110. package/src/testing/generated-routes.ts +183 -0
  1111. package/src/testing/index.ts +99 -0
  1112. package/src/testing/internal/context.ts +371 -0
  1113. package/src/testing/internal/flight-client-globals.ts +30 -0
  1114. package/src/testing/internal/seed-vars.ts +54 -0
  1115. package/src/testing/render-handler.ts +343 -0
  1116. package/src/testing/render-route.tsx +581 -0
  1117. package/src/testing/run-loader.ts +385 -0
  1118. package/src/testing/run-middleware.ts +205 -0
  1119. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  1120. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  1121. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  1122. package/src/testing/vitest-stubs/version.ts +5 -0
  1123. package/src/testing/vitest.ts +305 -0
  1124. package/src/theme/ThemeProvider.tsx +20 -58
  1125. package/src/theme/ThemeScript.tsx +7 -9
  1126. package/src/theme/constants.ts +52 -13
  1127. package/src/theme/index.ts +0 -7
  1128. package/src/theme/theme-context.ts +1 -5
  1129. package/src/theme/theme-script.ts +22 -21
  1130. package/src/theme/use-theme.ts +0 -3
  1131. package/src/types/boundaries.ts +0 -35
  1132. package/src/types/cache-types.ts +13 -4
  1133. package/src/types/error-types.ts +30 -90
  1134. package/src/types/global-namespace.ts +54 -41
  1135. package/src/types/handler-context.ts +109 -61
  1136. package/src/types/index.ts +1 -10
  1137. package/src/types/loader-types.ts +11 -9
  1138. package/src/types/request-scope.ts +112 -0
  1139. package/src/types/route-config.ts +6 -50
  1140. package/src/types/route-entry.ts +11 -6
  1141. package/src/types/segments.ts +35 -15
  1142. package/src/urls/include-helper.ts +33 -70
  1143. package/src/urls/index.ts +1 -11
  1144. package/src/urls/path-helper-types.ts +49 -9
  1145. package/src/urls/path-helper.ts +17 -106
  1146. package/src/urls/pattern-types.ts +36 -19
  1147. package/src/urls/response-types.ts +22 -29
  1148. package/src/urls/type-extraction.ts +58 -139
  1149. package/src/urls/urls-function.ts +1 -18
  1150. package/src/use-loader.tsx +292 -107
  1151. package/src/vercel/index.ts +11 -0
  1152. package/src/vercel/tracing.ts +88 -0
  1153. package/src/vite/debug.ts +185 -0
  1154. package/src/vite/discovery/bundle-postprocess.ts +8 -7
  1155. package/src/vite/discovery/discover-routers.ts +126 -85
  1156. package/src/vite/discovery/discovery-errors.ts +194 -0
  1157. package/src/vite/discovery/gate-state.ts +171 -0
  1158. package/src/vite/discovery/prerender-collection.ts +96 -68
  1159. package/src/vite/discovery/route-types-writer.ts +40 -84
  1160. package/src/vite/discovery/self-gen-tracking.ts +27 -1
  1161. package/src/vite/discovery/state.ts +45 -1
  1162. package/src/vite/discovery/virtual-module-codegen.ts +14 -34
  1163. package/src/vite/index.ts +4 -0
  1164. package/src/vite/plugin-types.ts +210 -10
  1165. package/src/vite/plugins/cjs-to-esm.ts +16 -19
  1166. package/src/vite/plugins/client-ref-dedup.ts +16 -11
  1167. package/src/vite/plugins/client-ref-hashing.ts +28 -15
  1168. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1169. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1170. package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
  1171. package/src/vite/plugins/expose-action-id.ts +48 -95
  1172. package/src/vite/plugins/expose-id-utils.ts +88 -55
  1173. package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
  1174. package/src/vite/plugins/expose-ids/handler-transform.ts +11 -90
  1175. package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
  1176. package/src/vite/plugins/expose-ids/router-transform.ts +118 -29
  1177. package/src/vite/plugins/expose-internal-ids.ts +505 -486
  1178. package/src/vite/plugins/performance-tracks.ts +26 -25
  1179. package/src/vite/plugins/refresh-cmd.ts +1 -1
  1180. package/src/vite/plugins/use-cache-transform.ts +73 -83
  1181. package/src/vite/plugins/vercel-output.ts +295 -0
  1182. package/src/vite/plugins/version-injector.ts +21 -25
  1183. package/src/vite/plugins/version-plugin.ts +37 -40
  1184. package/src/vite/plugins/virtual-entries.ts +71 -18
  1185. package/src/vite/rango.ts +225 -137
  1186. package/src/vite/router-discovery.ts +769 -106
  1187. package/src/vite/utils/ast-handler-extract.ts +26 -35
  1188. package/src/vite/utils/banner.ts +1 -1
  1189. package/src/vite/utils/bundle-analysis.ts +10 -15
  1190. package/src/vite/utils/client-chunks.ts +184 -0
  1191. package/src/vite/utils/directive-prologue.ts +40 -0
  1192. package/src/vite/utils/forward-user-plugins.ts +171 -0
  1193. package/src/vite/utils/manifest-utils.ts +4 -59
  1194. package/src/vite/utils/package-resolution.ts +20 -52
  1195. package/src/vite/utils/prerender-utils.ts +67 -38
  1196. package/src/vite/utils/shared-utils.ts +95 -43
  1197. package/src/browser/action-response-classifier.ts +0 -99
  1198. package/src/browser/shallow.ts +0 -40
  1199. package/src/router/middleware-cookies.ts +0 -55
@@ -10,15 +10,21 @@ import type { Plugin } from "vite";
10
10
  import { createServer as createViteServer } from "vite";
11
11
  import { resolve } from "node:path";
12
12
  import { readFileSync } from "node:fs";
13
- import { createRequire } from "node:module";
13
+ import { createRequire, register } from "node:module";
14
14
  import { pathToFileURL } from "node:url";
15
15
  import {
16
16
  formatNestedRouterConflictError,
17
17
  findNestedRouterConflict,
18
18
  findRouterFiles,
19
+ createScanFilter,
19
20
  } from "../build/generate-route-types.js";
21
+ import { firstCodeMatchIndex } from "../build/route-types/source-scan.js";
20
22
  import { createVersionPlugin } from "./plugins/version-plugin.js";
21
23
  import { createVirtualStubPlugin } from "./plugins/virtual-stub-plugin.js";
24
+ import {
25
+ BUILD_ENV_GLOBAL_KEY,
26
+ createCloudflareProtocolStubPlugin,
27
+ } from "./plugins/cloudflare-protocol-stub.js";
22
28
  import {
23
29
  exposeInternalIds,
24
30
  exposeRouterId,
@@ -31,7 +37,10 @@ import {
31
37
  type DiscoveryState,
32
38
  type PluginOptions,
33
39
  } from "./discovery/state.js";
34
- import { consumeSelfGenWrite } from "./discovery/self-gen-tracking.js";
40
+ import {
41
+ consumeSelfGenWrite,
42
+ peekSelfGenWrite,
43
+ } from "./discovery/self-gen-tracking.js";
35
44
  import { discoverRouters } from "./discovery/discover-routers.js";
36
45
  import {
37
46
  writeCombinedRouteTypesWithTracking,
@@ -43,10 +52,65 @@ import {
43
52
  generatePerRouterModule,
44
53
  } from "./discovery/virtual-module-codegen.js";
45
54
  import { postprocessBundle } from "./discovery/bundle-postprocess.js";
55
+ import { createDiscoveryGate } from "./discovery/gate-state.js";
46
56
  import { resetStagedBuildAssets } from "./utils/prerender-utils.js";
57
+ import { resolveRscEntryFromConfig } from "./utils/shared-utils.js";
58
+ import {
59
+ pickForwardedRunnerConfig,
60
+ selectForwardableResolvePlugins,
61
+ } from "./utils/forward-user-plugins.js";
62
+ import { createRangoDebugger, timed, timedSync, NS } from "./debug.js";
63
+
64
+ const debugDiscovery = createRangoDebugger(NS.discovery);
65
+ const debugRoutes = createRangoDebugger(NS.routes);
66
+ const debugBuild = createRangoDebugger(NS.build);
67
+ const debugDev = createRangoDebugger(NS.dev);
47
68
 
48
69
  export { VIRTUAL_ROUTES_MANIFEST_ID };
49
70
 
71
+ // ============================================================================
72
+ // Node ESM Loader Hook Registration
73
+ // ============================================================================
74
+
75
+ /**
76
+ * Registers a Node ESM loader hook that resolves `cloudflare:*` specifiers
77
+ * to a data: URL stub. Defense-in-depth alongside the Vite transform in
78
+ * `cloudflare-protocol-stub.ts`:
79
+ *
80
+ * - The Vite transform catches `cloudflare:*` imports in modules that flow
81
+ * through Vite's plugin pipeline. That's the vast majority of cases.
82
+ * - The Node loader catches imports in modules that Vite/Rollup externalize
83
+ * (e.g. the `partyserver` package, which has a top-level
84
+ * `import { DurableObject, env } from "cloudflare:workers"` and ships
85
+ * shapes plugin-rsc marks as external). Externalized modules are loaded
86
+ * via Node's native ESM loader, which rejects URL schemes.
87
+ *
88
+ * Registration is process-global and one-shot. The hook only intercepts
89
+ * `cloudflare:*` specifiers; everything else passes through via
90
+ * `nextResolve()`. It runs in a separate worker thread (Node ESM loader
91
+ * architecture), so it can't read the `globalThis[BUILD_ENV_GLOBAL_KEY]`
92
+ * bridge that the Vite transform uses — the stubs served here always
93
+ * return `env = {}`. That's fine because externalized libraries don't
94
+ * typically access `env` at module top level; user source (where real
95
+ * `env` matters at build time) flows through the Vite transform.
96
+ */
97
+ let loaderHookRegistered = false;
98
+ function ensureCloudflareProtocolLoaderRegistered(): void {
99
+ if (loaderHookRegistered) return;
100
+ loaderHookRegistered = true;
101
+ try {
102
+ register(
103
+ new URL("./plugins/cloudflare-protocol-loader-hook.mjs", import.meta.url),
104
+ );
105
+ } catch (err: any) {
106
+ // register() requires Node 18.19+ / 20.6+. Older Node still has the
107
+ // Vite transform as primary defense.
108
+ console.warn(
109
+ `[rango] Could not register Node ESM loader hook for cloudflare:* imports (${err?.message ?? err}). Falling back to Vite transform only.`,
110
+ );
111
+ }
112
+ }
113
+
50
114
  // ============================================================================
51
115
  // Temp Server Factory
52
116
  // ============================================================================
@@ -66,15 +130,32 @@ async function createTempRscServer(
66
130
  state: DiscoveryState,
67
131
  options: { forceBuild?: boolean; cacheDir?: string } = {},
68
132
  ) {
133
+ // Install the Node ESM loader hook before any module evaluation so
134
+ // `cloudflare:*` specifiers in externalized/loader-delegated modules
135
+ // (e.g. packages plugin-rsc marks as external) resolve to stubs
136
+ // instead of crashing Node's native loader.
137
+ ensureCloudflareProtocolLoaderRegistered();
69
138
  const { default: rsc } = await import("@vitejs/plugin-rsc");
139
+ // Mirror the user's resolution config + plugins so discovery (and the
140
+ // prerender/static rendering that shares this runner) resolves modules the
141
+ // same way the real environment does. Falls back to the legacy alias-only
142
+ // behavior if configResolved hasn't populated the parity slice yet.
143
+ const runnerConfig = state.userRunnerConfig;
144
+ const resolveConfig = runnerConfig?.resolve ?? {
145
+ alias: state.userResolveAlias,
146
+ };
147
+ const oxcConfig = runnerConfig?.oxc ?? {
148
+ jsx: { runtime: "automatic", importSource: "react" },
149
+ };
70
150
  return createViteServer({
71
151
  root: state.projectRoot,
72
152
  configFile: false,
73
153
  server: { middlewareMode: true },
74
154
  appType: "custom",
75
155
  logLevel: "silent",
76
- resolve: { alias: state.userResolveAlias },
77
- esbuild: { jsx: "automatic", jsxImportSource: "react" },
156
+ resolve: resolveConfig,
157
+ ...(runnerConfig?.define ? { define: runnerConfig.define } : {}),
158
+ oxc: oxcConfig as any,
78
159
  ...(options.cacheDir && { cacheDir: options.cacheDir }),
79
160
  plugins: [
80
161
  rsc({
@@ -88,10 +169,15 @@ async function createTempRscServer(
88
169
  ...(options.forceBuild ? [hashClientRefs(state.projectRoot)] : []),
89
170
  createVersionPlugin(),
90
171
  createVirtualStubPlugin(),
172
+ createCloudflareProtocolStubPlugin(),
91
173
  // Dev prerender must use dev-mode IDs (path-based) to match the workerd
92
174
  // runtime. forceBuild produces hashed IDs for production bundle consistency.
93
175
  exposeInternalIds(options.forceBuild ? { forceBuild: true } : undefined),
94
176
  exposeRouterId(),
177
+ // Forwarded user resolution plugins (e.g. vite-tsconfig-paths). Stripped
178
+ // to resolveId/load and placed last so framework resolution runs first;
179
+ // Vite re-sorts by `enforce`, so `enforce: "pre"` resolvers still lead.
180
+ ...state.userResolvePlugins,
95
181
  ],
96
182
  });
97
183
  }
@@ -119,7 +205,7 @@ async function resolveBuildEnv(
119
205
  if (option === "auto") {
120
206
  if (factoryCtx.preset !== "cloudflare") {
121
207
  throw new Error(
122
- '[rsc-router] buildEnv: "auto" is only supported with preset: "cloudflare". ' +
208
+ '[rango] buildEnv: "auto" is only supported with preset: "cloudflare". ' +
123
209
  "Use a factory function or plain object for other presets.",
124
210
  );
125
211
  }
@@ -141,7 +227,7 @@ async function resolveBuildEnv(
141
227
  };
142
228
  } catch (err: any) {
143
229
  throw new Error(
144
- '[rsc-router] buildEnv: "auto" requires wrangler to be installed.\n' +
230
+ '[rango] buildEnv: "auto" requires wrangler to be installed.\n' +
145
231
  `Install it with: pnpm add -D wrangler\n${err.message}`,
146
232
  );
147
233
  }
@@ -177,6 +263,11 @@ async function acquireBuildEnv(
177
263
 
178
264
  s.resolvedBuildEnv = result.env;
179
265
  s.buildEnvDispose = result.dispose ?? null;
266
+ // Bridge the resolved env into `cloudflare:workers`'s stubbed `env`
267
+ // export so user code that does `import { env } from "cloudflare:workers"`
268
+ // sees the real bindings proxy during discovery + prerender instead of
269
+ // an empty object. The stub reads this global at module-evaluation time.
270
+ (globalThis as Record<string, unknown>)[BUILD_ENV_GLOBAL_KEY] = result.env;
180
271
  return true;
181
272
  }
182
273
 
@@ -188,11 +279,12 @@ async function releaseBuildEnv(s: DiscoveryState): Promise<void> {
188
279
  try {
189
280
  await s.buildEnvDispose();
190
281
  } catch (err: any) {
191
- console.warn(`[rsc-router] buildEnv dispose failed: ${err.message}`);
282
+ console.warn(`[rango] buildEnv dispose failed: ${err.message}`);
192
283
  }
193
284
  s.buildEnvDispose = null;
194
285
  }
195
286
  s.resolvedBuildEnv = undefined;
287
+ delete (globalThis as Record<string, unknown>)[BUILD_ENV_GLOBAL_KEY];
196
288
  }
197
289
 
198
290
  /**
@@ -235,28 +327,39 @@ export function createRouterDiscoveryPlugin(
235
327
 
236
328
  configResolved(config) {
237
329
  s.projectRoot = config.root;
330
+ // Compile the optional discovery scan filter (glob include/exclude) now
331
+ // that the project root is known. findRouterFiles() below — and the
332
+ // build/HMR rediscovery paths — honor s.scanFilter.
333
+ s.scanFilter = opts?.discovery
334
+ ? createScanFilter(s.projectRoot, opts.discovery)
335
+ : undefined;
238
336
  s.isBuildMode = config.command === "build";
239
337
  viteCommand = config.command as "serve" | "build";
240
338
  viteMode = config.mode;
241
339
  // Capture user's resolve aliases for the temp server
242
340
  s.userResolveAlias = config.resolve.alias;
341
+ // Capture the data-only resolution config (resolve.*, define, oxc) and
342
+ // the user's resolution plugins (resolveId/load) so the discovery temp
343
+ // server resolves modules the same way the real environment does.
344
+ // Without this, both flavors of user resolution are absent during
345
+ // discovery/prerender/static rendering even though they apply at request
346
+ // time: third-party resolvers (e.g. vite-tsconfig-paths, forwarded as
347
+ // plugins) and Vite 8's native resolve.tsconfigPaths (forwarded in the
348
+ // data slice). See utils/forward-user-plugins.ts.
349
+ s.userRunnerConfig = pickForwardedRunnerConfig(config);
350
+ s.userResolvePlugins = selectForwardableResolvePlugins(
351
+ config.plugins as any,
352
+ );
243
353
  // Node preset: pick up auto-discovered router path from the config() hook.
244
354
  // The auto-discover plugin runs in config() using Vite's resolved root,
245
355
  // populating the mutable ref before configResolved fires.
246
356
  if (!s.resolvedEntryPath && opts?.routerPathRef?.path) {
247
357
  s.resolvedEntryPath = opts.routerPathRef.path;
248
358
  }
249
- // Cloudflare preset: read entry from resolved environment config.
250
- // The @cloudflare/vite-plugin reads wrangler config (toml/json/jsonc)
251
- // and sets optimizeDeps.entries on the RSC environment.
359
+ // Cloudflare preset: entry comes from the resolved RSC env config.
252
360
  if (!s.resolvedEntryPath) {
253
- const rscEnvConfig = (config.environments as any)?.["rsc"];
254
- const entries = rscEnvConfig?.optimizeDeps?.entries;
255
- if (typeof entries === "string") {
256
- s.resolvedEntryPath = entries;
257
- } else if (Array.isArray(entries) && entries.length > 0) {
258
- s.resolvedEntryPath = entries[0];
259
- }
361
+ const entry = resolveRscEntryFromConfig(config);
362
+ if (entry) s.resolvedEntryPath = entry;
260
363
  }
261
364
  // Generate combined named-routes.gen.ts from static source parsing.
262
365
  // Runs before the dev server starts so the gen file exists immediately for IDE.
@@ -295,6 +398,17 @@ export function createRouterDiscoveryPlugin(
295
398
  resolveDiscovery = resolve;
296
399
  });
297
400
 
401
+ // Manifest-readiness gate + rediscovery scheduler.
402
+ // The virtual:rsc-router/routes-manifest module's `load()` hook
403
+ // awaits `s.discoveryDone`; the gate is reset on each discovery
404
+ // cycle so workerd's HMR reloads block until the new gen file is
405
+ // written. State machine + transitions are extracted into
406
+ // ./discovery/gate-state.ts and unit-tested there — see the
407
+ // module's JSDoc for the four-flag contract.
408
+ const gate = createDiscoveryGate(s, debugDiscovery);
409
+ const beginDiscoveryGate = gate.beginGate;
410
+ const resolveDiscoveryGate = gate.resolveGate;
411
+
298
412
  // Compute dev server origin from resolved URLs (preferred) or config port (fallback).
299
413
  // Called after discovery (or in the load hook) when the server may be listening.
300
414
  const getDevServerOrigin = () =>
@@ -317,10 +431,104 @@ export function createRouterDiscoveryPlugin(
317
431
  releaseBuildEnv(s).catch(() => {});
318
432
  });
319
433
 
434
+ // Mirror the build-path contract (the buildStart hook below, which sets
435
+ // __rscRouterDiscoveryActive before running user modules):
436
+ // set __rscRouterDiscoveryActive before running user modules so any
437
+ // module-level router.reverse() calls return a placeholder instead
438
+ // of throwing. The temp Vite server's module runner has its own
439
+ // module context; the flag must be on globalThis to cross that
440
+ // boundary. Cleared in finally so the dev request handlers run with
441
+ // strict reverse() semantics afterwards.
442
+ async function importEntryAndRegistry(tempRscEnv: any): Promise<void> {
443
+ const flagAlreadySet = !!(globalThis as any).__rscRouterDiscoveryActive;
444
+ if (!flagAlreadySet) {
445
+ (globalThis as any).__rscRouterDiscoveryActive = true;
446
+ }
447
+ try {
448
+ debugDiscovery?.(
449
+ "importEntryAndRegistry: importing entry (flag=%s)",
450
+ (globalThis as any).__rscRouterDiscoveryActive ?? false,
451
+ );
452
+ await tempRscEnv.runner.import(s.resolvedEntryPath!);
453
+ debugDiscovery?.(
454
+ "importEntryAndRegistry: entry import OK, fetching RouterRegistry",
455
+ );
456
+ const serverMod = await tempRscEnv.runner.import(
457
+ "@rangojs/router/server",
458
+ );
459
+ prerenderNodeRegistry = serverMod.RouterRegistry;
460
+ debugDiscovery?.(
461
+ "importEntryAndRegistry: registry size=%d",
462
+ prerenderNodeRegistry?.size ?? 0,
463
+ );
464
+ } finally {
465
+ if (!flagAlreadySet) {
466
+ delete (globalThis as any).__rscRouterDiscoveryActive;
467
+ debugDiscovery?.(
468
+ "importEntryAndRegistry: cleared __rscRouterDiscoveryActive",
469
+ );
470
+ }
471
+ }
472
+ }
473
+
320
474
  async function getOrCreateTempServer(): Promise<any | null> {
321
- if (prerenderNodeRegistry) {
322
- return (prerenderTempServer.environments as any)?.rsc ?? null;
475
+ // Reuse path: if a temp server is already alive, prefer reusing
476
+ // it over orphaning the existing instance and spinning up a new
477
+ // one. This handles two cases:
478
+ //
479
+ // 1. Steady-state cache hit (cold-start completed, registry
480
+ // cached) — return the env immediately.
481
+ // 2. Recovery from a failed refresh: refreshTempRscEnv() may
482
+ // have invalidated and nulled the registry, then thrown
483
+ // during importEntryAndRegistry. Without reuse, the next
484
+ // call would `createTempRscServer` and overwrite the
485
+ // handle, leaking the previous server. Try to re-import on
486
+ // the existing runner first; only if THAT fails do we
487
+ // close the orphan and create new.
488
+ if (prerenderTempServer) {
489
+ const existingEnv = (prerenderTempServer.environments as any)?.rsc;
490
+ if (existingEnv?.runner) {
491
+ if (prerenderNodeRegistry) {
492
+ debugDiscovery?.(
493
+ "getOrCreateTempServer: cached temp runner reused",
494
+ );
495
+ return existingEnv;
496
+ }
497
+ // Server alive but registry missing — likely after a prior
498
+ // refresh's invalidate + import threw. Try to re-import.
499
+ debugDiscovery?.(
500
+ "getOrCreateTempServer: server alive but registry missing — re-importing",
501
+ );
502
+ try {
503
+ await importEntryAndRegistry(existingEnv);
504
+ return existingEnv;
505
+ } catch (err: any) {
506
+ debugDiscovery?.(
507
+ "getOrCreateTempServer: reuse import failed (%s) — closing orphan and creating fresh",
508
+ err?.message ?? String(err),
509
+ );
510
+ await prerenderTempServer.close().catch(() => {});
511
+ prerenderTempServer = null;
512
+ prerenderNodeRegistry = null;
513
+ // Fall through to create-new path below.
514
+ }
515
+ } else {
516
+ // Server reference exists but its rsc env is unhealthy
517
+ // (no runner). Close and recreate.
518
+ debugDiscovery?.(
519
+ "getOrCreateTempServer: existing server has no rsc.runner — closing and recreating",
520
+ );
521
+ await prerenderTempServer.close().catch(() => {});
522
+ prerenderTempServer = null;
523
+ prerenderNodeRegistry = null;
524
+ }
323
525
  }
526
+
527
+ // Create path: no existing temp server (or just nullified above).
528
+ debugDiscovery?.(
529
+ "getOrCreateTempServer: creating new temp server, entry=%s",
530
+ s.resolvedEntryPath ?? "(unset)",
531
+ );
324
532
  try {
325
533
  prerenderTempServer = await createTempRscServer(s, {
326
534
  cacheDir: "node_modules/.vite_prerender",
@@ -328,64 +536,189 @@ export function createRouterDiscoveryPlugin(
328
536
 
329
537
  const tempRscEnv = (prerenderTempServer.environments as any)?.rsc;
330
538
  if (tempRscEnv?.runner) {
331
- await tempRscEnv.runner.import(s.resolvedEntryPath!);
332
- const serverMod = await tempRscEnv.runner.import(
333
- "@rangojs/router/server",
334
- );
335
- prerenderNodeRegistry = serverMod.RouterRegistry;
539
+ await importEntryAndRegistry(tempRscEnv);
336
540
  return tempRscEnv;
337
541
  }
542
+ debugDiscovery?.(
543
+ "getOrCreateTempServer: tempRscEnv.runner unavailable",
544
+ );
338
545
  } catch (err: any) {
339
- console.warn(
340
- `[rsc-router] Failed to create temp runner: ${err.message}`,
546
+ debugDiscovery?.(
547
+ "getOrCreateTempServer: FAILED message=%s",
548
+ err.message,
341
549
  );
550
+ console.warn(`[rango] Failed to create temp runner: ${err.message}`);
342
551
  }
343
552
  return null;
344
553
  }
345
554
 
555
+ // Clear the package-level singleton registries that survive a Vite
556
+ // moduleGraph.invalidateAll(). createRouter() / createHostRouter()
557
+ // call .set(id, ...) on these Maps; for "router removed" or
558
+ // "router id changed" edits, the OLD entry would persist after
559
+ // re-import without an explicit .clear(), leaving ghost routes
560
+ // in discoverRouters' output.
561
+ //
562
+ // We import the same module the runner imports, so the .clear()
563
+ // here mutates the same Map the freshly re-imported entry will
564
+ // populate.
565
+ async function clearTempRegistries(tempRscEnv: any): Promise<void> {
566
+ try {
567
+ const serverMod = await tempRscEnv.runner.import(
568
+ "@rangojs/router/server",
569
+ );
570
+ if (typeof serverMod?.RouterRegistry?.clear === "function") {
571
+ serverMod.RouterRegistry.clear();
572
+ }
573
+ if (typeof serverMod?.HostRouterRegistry?.clear === "function") {
574
+ serverMod.HostRouterRegistry.clear();
575
+ }
576
+ debugDiscovery?.(
577
+ "clearTempRegistries: cleared RouterRegistry + HostRouterRegistry",
578
+ );
579
+ } catch (err: any) {
580
+ // Non-fatal: if the import fails here, importEntryAndRegistry
581
+ // below will fail loudly with the same root cause and the
582
+ // caller will surface it.
583
+ debugDiscovery?.(
584
+ "clearTempRegistries: import @rangojs/router/server failed (%s)",
585
+ err?.message ?? String(err),
586
+ );
587
+ }
588
+ }
589
+
590
+ // HMR refresh: keep the temp Vite server alive across HMR cycles and
591
+ // invalidate its module graph instead of close+recreate. Closing the
592
+ // temp server during workerd's first post-cold-start module-fetch
593
+ // window disrupted the main dev server's transport — the user-visible
594
+ // symptom was a `transport was disconnected, cannot call "fetchModule"`
595
+ // error on the first urls.tsx edit (workerd's cache was cold, so its
596
+ // eval was still in flight when our close() ran). Module-graph
597
+ // invalidation is the architecturally cleaner refresh: same Vite
598
+ // instance, same transport, fresh source.
599
+ //
600
+ // Falls back to close+recreate when neither the env-level nor
601
+ // server-level moduleGraph exposes invalidateAll() (defensive — Vite
602
+ // versions / preset configurations may differ in which graph carries
603
+ // the module-runner cache).
604
+ async function refreshTempRscEnv(): Promise<any | null> {
605
+ let tempRscEnv = await getOrCreateTempServer();
606
+ if (!tempRscEnv) return null;
607
+
608
+ // Module-runner cache is on the per-environment graph in Vite 6+;
609
+ // older / non-environments setups carry it on the server graph.
610
+ // Try env first, server second.
611
+ const envGraph = (tempRscEnv as any).moduleGraph;
612
+ const serverGraph = (prerenderTempServer as any)?.moduleGraph;
613
+ const target = envGraph?.invalidateAll
614
+ ? envGraph
615
+ : serverGraph?.invalidateAll
616
+ ? serverGraph
617
+ : null;
618
+
619
+ if (!target) {
620
+ // No invalidate method available — fall back to close+recreate.
621
+ // This preserves the previous behavior in case a Vite version
622
+ // doesn't expose invalidateAll on either graph.
623
+ debugDiscovery?.(
624
+ "refreshTempRscEnv: invalidateAll unavailable on env+server graphs, falling back to close+recreate",
625
+ );
626
+ if (prerenderTempServer) {
627
+ await prerenderTempServer.close().catch(() => {});
628
+ prerenderTempServer = null;
629
+ prerenderNodeRegistry = null;
630
+ }
631
+ return await getOrCreateTempServer();
632
+ }
633
+
634
+ debugDiscovery?.(
635
+ "refreshTempRscEnv: invalidating module graph (%s)",
636
+ envGraph?.invalidateAll ? "env" : "server",
637
+ );
638
+ target.invalidateAll();
639
+ // Drop the cached registry so importEntryAndRegistry re-reads it
640
+ // through the now-invalidated module runner.
641
+ prerenderNodeRegistry = null;
642
+ // Clear singleton Maps that Vite's moduleGraph invalidation can't
643
+ // reach (RouterRegistry / HostRouterRegistry). Without this, an
644
+ // edit that REMOVES a createRouter() call or CHANGES a router id
645
+ // would leave the old entry in the registry, and discoverRouters
646
+ // would still emit its routes alongside whatever the new source
647
+ // declares.
648
+ await clearTempRegistries(tempRscEnv);
649
+ await importEntryAndRegistry(tempRscEnv);
650
+ return tempRscEnv;
651
+ }
652
+
346
653
  const discover = async () => {
654
+ const discoverStart = performance.now();
347
655
  const rscEnv = (server.environments as any)?.rsc;
348
656
  if (!rscEnv?.runner) {
349
657
  // Cloudflare dev: no module runner available (workerd-based RSC env).
350
658
  // Set devServerOrigin so the virtual module can inject __PRERENDER_DEV_URL
351
659
  // for on-demand prerender via the /__rsc_prerender endpoint.
660
+ debugDiscovery?.(
661
+ "dev: cloudflare path start, __rscRouterDiscoveryActive=%s",
662
+ (globalThis as any).__rscRouterDiscoveryActive ?? false,
663
+ );
352
664
  s.devServerOrigin = getDevServerOrigin();
353
665
 
354
666
  // Create a temp Node.js server to run runtime discovery and generate
355
667
  // named route types (static parser can't resolve factory calls).
356
668
  try {
357
669
  // Acquire build-time env bindings for dev prerender
358
- await acquireBuildEnv(s, viteCommand, viteMode);
670
+ await timed(debugDiscovery, "acquireBuildEnv", () =>
671
+ acquireBuildEnv(s, viteCommand, viteMode),
672
+ );
359
673
 
360
- const tempRscEnv = await getOrCreateTempServer();
674
+ const tempRscEnv = await timed(
675
+ debugDiscovery,
676
+ "getOrCreateTempServer",
677
+ () => getOrCreateTempServer(),
678
+ );
361
679
  if (tempRscEnv) {
362
- await discoverRouters(s, tempRscEnv);
363
- writeRouteTypesFiles(s);
680
+ await timed(debugDiscovery, "discoverRouters (cloudflare)", () =>
681
+ discoverRouters(s, tempRscEnv),
682
+ );
683
+ timedSync(debugDiscovery, "writeRouteTypesFiles", () =>
684
+ writeRouteTypesFiles(s),
685
+ );
364
686
  }
365
687
  } catch (err: any) {
366
688
  console.warn(
367
- `[rsc-router] Cloudflare dev discovery failed: ${err.message}\n${err.stack}`,
689
+ `[rango] Cloudflare dev discovery failed: ${err.message}\n${err.stack}`,
368
690
  );
369
691
  }
370
692
 
693
+ debugDiscovery?.(
694
+ "dev discovery done (%sms)",
695
+ (performance.now() - discoverStart).toFixed(1),
696
+ );
371
697
  resolveDiscovery!();
372
698
  return;
373
699
  }
374
700
 
375
701
  try {
376
702
  // Acquire build-time env bindings for dev prerender (Node.js path)
377
- await acquireBuildEnv(s, viteCommand, viteMode);
703
+ debugDiscovery?.("dev: node path start");
704
+ await timed(debugDiscovery, "acquireBuildEnv", () =>
705
+ acquireBuildEnv(s, viteCommand, viteMode),
706
+ );
378
707
 
379
708
  // Set the readiness gate BEFORE discovery so early requests
380
709
  // block until manifest is populated
381
- const serverMod = await rscEnv.runner.import(
382
- "@rangojs/router/server",
710
+ const serverMod = await timed(
711
+ debugDiscovery,
712
+ "import @rangojs/router/server",
713
+ () => rscEnv.runner.import("@rangojs/router/server"),
383
714
  );
384
715
  if (serverMod?.setManifestReadyPromise) {
385
716
  serverMod.setManifestReadyPromise(discoveryPromise);
386
717
  }
387
718
 
388
- await discoverRouters(s, rscEnv);
719
+ await timed(debugDiscovery, "discoverRouters", () =>
720
+ discoverRouters(s, rscEnv),
721
+ );
389
722
 
390
723
  // Store server origin for dev prerender endpoint (virtual module injection)
391
724
  s.devServerOrigin = getDevServerOrigin();
@@ -395,24 +728,36 @@ export function createRouterDiscoveryPlugin(
395
728
  // routes (e.g. Array.from loops) that the static parser cannot see.
396
729
  // writeRouteTypesFiles() only writes when content changes, so this
397
730
  // won't cause unnecessary HMR triggers.
398
- writeRouteTypesFiles(s);
731
+ timedSync(debugDiscovery, "writeRouteTypesFiles", () =>
732
+ writeRouteTypesFiles(s),
733
+ );
399
734
 
400
735
  // Populate the route map and per-router data in the RSC env
401
- await propagateDiscoveryState(rscEnv);
736
+ await timed(debugDiscovery, "propagateDiscoveryState", () =>
737
+ propagateDiscoveryState(rscEnv),
738
+ );
402
739
  } catch (err: any) {
403
740
  console.warn(
404
- `[rsc-router] Router discovery failed: ${err.message}\n${err.stack}`,
741
+ `[rango] Router discovery failed: ${err.message}\n${err.stack}`,
405
742
  );
406
743
  } finally {
744
+ debugDiscovery?.(
745
+ "dev discovery done (%sms)",
746
+ (performance.now() - discoverStart).toFixed(1),
747
+ );
407
748
  resolveDiscovery!();
408
749
  }
409
750
  };
410
751
 
411
752
  // Schedule after all plugins have finished configureServer.
412
- // Store the promise so the virtual module's load hook can await it.
413
- s.discoveryDone = new Promise<void>((resolve) => {
414
- setTimeout(() => discover().then(resolve, resolve), 0);
415
- });
753
+ // The gate (s.discoveryDone) is reset via beginDiscoveryGate() and
754
+ // resolved when discover() finishes, so the virtual manifest module's
755
+ // load() awaits the populated state.
756
+ beginDiscoveryGate();
757
+ setTimeout(
758
+ () => discover().then(resolveDiscoveryGate, resolveDiscoveryGate),
759
+ 0,
760
+ );
416
761
 
417
762
  // Dev-mode on-demand prerender endpoint.
418
763
  // When workerd hits a prerender route, it fetches this endpoint instead of
@@ -452,24 +797,30 @@ export function createRouterDiscoveryPlugin(
452
797
  if (s.mergedRouteTrie && serverMod.setRouteTrie) {
453
798
  serverMod.setRouteTrie(s.mergedRouteTrie);
454
799
  }
455
- if (serverMod.setRouterManifest) {
456
- for (const [routerId, manifest] of s.perRouterManifestDataMap) {
457
- serverMod.setRouterManifest(routerId, manifest);
458
- }
459
- }
460
- if (serverMod.setRouterTrie) {
461
- for (const [routerId, trie] of s.perRouterTrieMap) {
462
- serverMod.setRouterTrie(routerId, trie);
463
- }
464
- }
465
- if (serverMod.setRouterPrecomputedEntries) {
466
- for (const [routerId, entries] of s.perRouterPrecomputedMap) {
467
- serverMod.setRouterPrecomputedEntries(routerId, entries);
468
- }
800
+ const perRouterSetters: Array<[Map<string, any>, string]> = [
801
+ [s.perRouterManifestDataMap, "setRouterManifest"],
802
+ [s.perRouterTrieMap, "setRouterTrie"],
803
+ [s.perRouterPrecomputedMap, "setRouterPrecomputedEntries"],
804
+ ];
805
+ for (const [map, fn] of perRouterSetters) {
806
+ const setter = serverMod[fn];
807
+ if (typeof setter !== "function") continue;
808
+ for (const [routerId, value] of map) setter(routerId, value);
469
809
  }
470
810
  };
471
811
 
472
812
  server.middlewares.use("/__rsc_prerender", async (req: any, res: any) => {
813
+ const reqStart = debugDev ? performance.now() : 0;
814
+ const logResult = (status: number, note: string) => {
815
+ debugDev?.(
816
+ "/__rsc_prerender %s -> %d %s (%sms)",
817
+ req.url,
818
+ status,
819
+ note,
820
+ (performance.now() - reqStart).toFixed(1),
821
+ );
822
+ };
823
+
473
824
  if (s.discoveryDone) await s.discoveryDone;
474
825
 
475
826
  const url = new URL(req.url || "/", "http://localhost");
@@ -477,6 +828,7 @@ export function createRouterDiscoveryPlugin(
477
828
  if (!pathname) {
478
829
  res.statusCode = 400;
479
830
  res.end("Missing pathname");
831
+ logResult(400, "missing pathname");
480
832
  return;
481
833
  }
482
834
 
@@ -496,10 +848,11 @@ export function createRouterDiscoveryPlugin(
496
848
  registry = serverMod.RouterRegistry ?? null;
497
849
  } catch (err: any) {
498
850
  console.warn(
499
- `[rsc-router] Dev prerender module refresh failed: ${err.message}`,
851
+ `[rango] Dev prerender module refresh failed: ${err.message}`,
500
852
  );
501
853
  res.statusCode = 500;
502
854
  res.end(`Prerender handler error: ${err.message}`);
855
+ logResult(500, "module refresh failed");
503
856
  return;
504
857
  }
505
858
  } else {
@@ -518,6 +871,7 @@ export function createRouterDiscoveryPlugin(
518
871
  if (!registry || registry.size === 0) {
519
872
  res.statusCode = 503;
520
873
  res.end("Prerender runner not available");
874
+ logResult(503, "no registry");
521
875
  return;
522
876
  }
523
877
 
@@ -547,25 +901,32 @@ export function createRouterDiscoveryPlugin(
547
901
  if (wantIntercept && result.interceptSegments?.length) {
548
902
  payload = {
549
903
  segments: [...result.segments, ...result.interceptSegments],
550
- handles: {
551
- ...result.handles,
552
- ...(result.interceptHandles || {}),
553
- },
904
+ // Pre-encoded MERGED handle string from the producer (handles are
905
+ // Flight-encoded so Promise/ReactNode values survive the wire).
906
+ handles: result.interceptHandles ?? "",
554
907
  };
555
908
  } else {
556
909
  payload = { segments: result.segments, handles: result.handles };
557
910
  }
558
911
  res.end(JSON.stringify(payload));
912
+ logResult(200, `match ${result.routeName}`);
559
913
  return;
560
914
  } catch (err: any) {
561
- console.warn(
562
- `[rsc-router] Dev prerender failed for ${pathname}: ${err.message}`,
563
- );
915
+ // matchForPrerender now re-throws render failures instead of baking
916
+ // an error page (issue #587). In dev there is no frozen artifact, so
917
+ // we fall through (404 -> live handler). A `throw new Skip()` is the
918
+ // expected "skip this URL" signal, not a failure, so it stays quiet.
919
+ if (err?.name !== "Skip") {
920
+ console.warn(
921
+ `[rango] Dev prerender error for ${pathname} (serving live instead): ${err.message}`,
922
+ );
923
+ }
564
924
  }
565
925
  }
566
926
 
567
927
  res.statusCode = 404;
568
928
  res.end("No prerender match");
929
+ logResult(404, "no match");
569
930
  });
570
931
 
571
932
  // Watch url module and router files for changes and regenerate named-routes.gen.ts.
@@ -608,21 +969,135 @@ export function createRouterDiscoveryPlugin(
608
969
 
609
970
  // Re-run runtime discovery so factory-generated routes that the
610
971
  // static parser cannot see are refreshed after source changes.
611
- let runtimeRediscoveryInProgress = false;
972
+ // The state-machine concerns (queued/pending/gatePending) are
973
+ // owned by the gate created above (./discovery/gate-state.ts).
974
+ // Here we provide just the env-specific work.
612
975
  const refreshRuntimeDiscovery = async () => {
613
976
  const rscEnv = (server.environments as any)?.rsc;
614
- if (!rscEnv?.runner || runtimeRediscoveryInProgress) return;
615
- runtimeRediscoveryInProgress = true;
977
+ const hasMainRunner = !!rscEnv?.runner;
978
+ // Cloudflare HMR has no main RSC runner (workerd is a separate
979
+ // runtime). When we have a populated runtime manifest from cold
980
+ // start, we can re-discover via the temp Node runner — the same
981
+ // mechanism getOrCreateTempServer() uses at startup. Without a
982
+ // populated manifest there's nothing useful to do, so bail
983
+ // before involving the gate machine at all.
984
+ if (!hasMainRunner && s.perRouterManifests.length === 0) return;
985
+ await gate.runRefreshCycle(async () => {
986
+ const hmrStart = performance.now();
987
+ try {
988
+ if (hasMainRunner) {
989
+ await timed(debugDiscovery, "hmr discoverRouters", () =>
990
+ discoverRouters(s, rscEnv),
991
+ );
992
+ timedSync(debugDiscovery, "hmr writeRouteTypesFiles", () =>
993
+ writeRouteTypesFiles(s),
994
+ );
995
+ await timed(debugDiscovery, "hmr propagateDiscoveryState", () =>
996
+ propagateDiscoveryState(rscEnv),
997
+ );
998
+ } else {
999
+ // Cloudflare HMR: invalidate the temp server's RSC module
1000
+ // graph (or close+recreate as a fallback) so the runner
1001
+ // re-reads the freshly edited source. Keeping the same
1002
+ // Vite instance alive avoids disrupting workerd's transport
1003
+ // during the first post-cold-start module-fetch window.
1004
+ const tempRscEnv = await timed(
1005
+ debugDiscovery,
1006
+ "hmr refreshTempRscEnv (cloudflare)",
1007
+ () => refreshTempRscEnv(),
1008
+ );
1009
+ if (!tempRscEnv) {
1010
+ throw new Error(
1011
+ "temp runner unavailable for cloudflare HMR rediscovery",
1012
+ );
1013
+ }
1014
+ await timed(
1015
+ debugDiscovery,
1016
+ "hmr discoverRouters (cloudflare)",
1017
+ () => discoverRouters(s, tempRscEnv),
1018
+ );
1019
+ timedSync(debugDiscovery, "hmr writeRouteTypesFiles", () =>
1020
+ writeRouteTypesFiles(s),
1021
+ );
1022
+ }
1023
+ if (s.lastDiscoveryError) {
1024
+ debugDiscovery?.(
1025
+ "hmr: cleared lastDiscoveryError (%s) after successful rediscovery",
1026
+ s.lastDiscoveryError.message,
1027
+ );
1028
+ s.lastDiscoveryError = null;
1029
+ }
1030
+ // Cloudflare dev: on a successful cycle drop the workerd runner's
1031
+ // cached worker-entry chain so the next request re-evaluates
1032
+ // createRouter() with the new routes. Fired here in the work path
1033
+ // (not the caller's .then()) so a queued follow-up cycle that
1034
+ // succeeds after an earlier failed cycle still reloads:
1035
+ // runRefreshCycle recurses queued work without awaiting it, so the
1036
+ // original call already resolved on the failed cycle. A failed
1037
+ // cycle throws above and never reaches here, so a broken edit
1038
+ // never reloads the worker onto bad source.
1039
+ if (rscEnv && !rscEnv.runner) forceCloudflareWorkerReload(rscEnv);
1040
+ } catch (err: any) {
1041
+ s.lastDiscoveryError = {
1042
+ message: err?.message ?? String(err),
1043
+ at: Date.now(),
1044
+ };
1045
+ console.warn(
1046
+ `[rango] Runtime re-discovery failed: ${err.message}`,
1047
+ );
1048
+ debugDiscovery?.(
1049
+ "hmr: lastDiscoveryError set (%s) — manifest preserved at last-good; recovery mode active (any in-scan source change will trigger rediscovery)",
1050
+ err?.message,
1051
+ );
1052
+ } finally {
1053
+ debugDiscovery?.(
1054
+ "hmr re-discovery done (%sms)",
1055
+ (performance.now() - hmrStart).toFixed(1),
1056
+ );
1057
+ }
1058
+ });
1059
+ };
1060
+
1061
+ // Cloudflare dev only. workerd serves every request through the
1062
+ // runner-worker singleton, which re-resolves the worker entry per
1063
+ // request via runner.import("virtual:cloudflare/worker-entry"). The
1064
+ // route table lives in the user's createRouter() instance, captured
1065
+ // when that entry chain (entry -> router -> urls) was last evaluated
1066
+ // and then cached in the runner's evaluatedModules. The route-file
1067
+ // watcher refreshes discovery + types on the Node side, but the worker
1068
+ // keeps serving the cached (stale) router: route-definition modules
1069
+ // have no import.meta.hot boundary, so Vite never sends the worker an
1070
+ // HMR update for them and the entry chain is never evicted.
1071
+ //
1072
+ // Fix: after discovery completes, (1) invalidate the worker env's
1073
+ // Node-side module graph, then (2) send a full-reload to the worker.
1074
+ // Step (2) alone is insufficient: the full-reload handler clears the
1075
+ // runner's evaluatedModules and re-imports entrypoints, but each
1076
+ // re-import fetches the module back through this Node-side graph, which
1077
+ // still holds the pre-edit transform of urls.tsx — so createRouter()
1078
+ // rebuilds the stale route table and the new route 404s/hits the
1079
+ // catch-all. Invalidating the graph forces a fresh transform on
1080
+ // re-fetch (the same mechanism refreshTempRscEnv uses for discovery),
1081
+ // so the re-import re-runs createRouter() with the new routes. This is
1082
+ // the programmatic equivalent of the dev-server "r + enter" restart,
1083
+ // scoped to the worker environment instead of tearing down the server.
1084
+ const forceCloudflareWorkerReload = (rscEnv: any) => {
1085
+ if (!rscEnv?.hot) return;
616
1086
  try {
617
- await discoverRouters(s, rscEnv);
618
- writeRouteTypesFiles(s);
619
- await propagateDiscoveryState(rscEnv);
1087
+ const graph = rscEnv.moduleGraph;
1088
+ if (graph?.invalidateAll) {
1089
+ graph.invalidateAll();
1090
+ debugDiscovery?.("hmr: invalidated workerd rsc module graph");
1091
+ }
1092
+ rscEnv.hot.send({ type: "full-reload" });
1093
+ debugDiscovery?.(
1094
+ "hmr: forced workerd rsc env reload (full-reload)",
1095
+ );
620
1096
  } catch (err: any) {
621
- console.warn(
622
- `[rsc-router] Runtime re-discovery failed: ${err.message}`,
1097
+ debugDiscovery?.(
1098
+ "hmr: workerd reload failed: %s",
1099
+ err?.message ?? err,
623
1100
  );
624
- } finally {
625
- runtimeRediscoveryInProgress = false;
626
1101
  }
627
1102
  };
628
1103
 
@@ -630,23 +1105,50 @@ export function createRouterDiscoveryPlugin(
630
1105
  clearTimeout(routeChangeTimer);
631
1106
  routeChangeTimer = setTimeout(() => {
632
1107
  routeChangeTimer = undefined;
1108
+ const regenStart = debugDiscovery ? performance.now() : 0;
1109
+ const rscEnv = (server.environments as any)?.rsc;
1110
+ const skipStaticWrite =
1111
+ !rscEnv?.runner && s.perRouterManifests.length > 0;
633
1112
  try {
634
- writeCombinedRouteTypesWithTracking(s);
635
- if (s.perRouterManifests.length > 0) {
636
- supplementGenFilesWithRuntimeRoutes(s);
1113
+ // In cloudflare dev with a populated runtime manifest, the
1114
+ // static parser produces a strictly smaller (and actively
1115
+ // wrong) gen file — supplementGenFilesWithRuntimeRoutes can
1116
+ // only restore factory-only prefixes, and apps with mixed
1117
+ // static+factory routes under shared prefixes (cf-stress)
1118
+ // collapse to the 19-route static view. Skip the static
1119
+ // write entirely; runtime rediscovery below will overwrite
1120
+ // the gen file with the authoritative manifest.
1121
+ if (skipStaticWrite) {
1122
+ debugDiscovery?.(
1123
+ "watcher: skipping static write (cloudflare HMR — runtime rediscovery owns gen file)",
1124
+ );
1125
+ } else {
1126
+ writeCombinedRouteTypesWithTracking(s);
1127
+ if (s.perRouterManifests.length > 0) {
1128
+ supplementGenFilesWithRuntimeRoutes(s);
1129
+ }
637
1130
  }
638
1131
  } catch (err: any) {
639
- console.error(
640
- `[rsc-router] Route regeneration error: ${err.message}`,
641
- );
1132
+ console.error(`[rango] Route regeneration error: ${err.message}`);
642
1133
  }
1134
+ debugDiscovery?.(
1135
+ "watcher: regenerated gen files (%sms)",
1136
+ (performance.now() - regenStart).toFixed(1),
1137
+ );
643
1138
  // Async: re-run runtime discovery to refresh factory-generated
644
- // routes that the static parser cannot resolve.
1139
+ // routes that the static parser cannot resolve. Resolves the
1140
+ // discovery gate when complete.
645
1141
  if (s.perRouterManifests.length > 0) {
1142
+ // The cloudflare workerd reload fires inside refreshRuntimeDiscovery
1143
+ // on the successful cycle (see forceCloudflareWorkerReload call
1144
+ // there) so queued follow-up cycles also trigger it.
646
1145
  refreshRuntimeDiscovery().catch((err: any) => {
647
1146
  console.warn(
648
- `[rsc-router] Runtime re-discovery error: ${err.message}`,
1147
+ `[rango] Runtime re-discovery error: ${err.message}`,
649
1148
  );
1149
+ // Even on error, unblock the gate so workerd's reload doesn't
1150
+ // hang indefinitely against the previous manifest.
1151
+ resolveDiscoveryGate();
650
1152
  });
651
1153
  }
652
1154
  }, 100);
@@ -659,21 +1161,74 @@ export function createRouterDiscoveryPlugin(
659
1161
  !filePath.endsWith(".tsx") &&
660
1162
  !filePath.endsWith(".js") &&
661
1163
  !filePath.endsWith(".jsx")
662
- )
1164
+ ) {
1165
+ if (s.lastDiscoveryError) {
1166
+ debugDiscovery?.(
1167
+ "watcher: skip non-source %s [LASTERR %s]",
1168
+ filePath,
1169
+ s.lastDiscoveryError.message,
1170
+ );
1171
+ }
663
1172
  return;
1173
+ }
664
1174
  // Apply scan filter as early-exit before reading file
665
- if (s.scanFilter && !s.scanFilter(filePath)) return;
1175
+ if (s.scanFilter && !s.scanFilter(filePath)) {
1176
+ if (s.lastDiscoveryError) {
1177
+ debugDiscovery?.(
1178
+ "watcher: skip scan-filter %s [LASTERR %s]",
1179
+ filePath,
1180
+ s.lastDiscoveryError.message,
1181
+ );
1182
+ }
1183
+ return;
1184
+ }
1185
+ // Recovery mode: when the previous HMR re-discovery failed, the
1186
+ // import graph is incomplete and the manifest is stuck at the
1187
+ // last-good state. The fix may land in a non-route file (e.g. a
1188
+ // helper imported by the router, a missing module being created,
1189
+ // or a "use client" component) that the narrow content sniff
1190
+ // would otherwise filter out. While in recovery, treat any
1191
+ // in-scan source change as a candidate for rediscovery; the
1192
+ // tighter filter resumes once discovery succeeds again.
1193
+ const inRecoveryMode = !!s.lastDiscoveryError;
666
1194
  try {
667
1195
  const source = readFileSync(filePath, "utf-8");
668
1196
  const trimmed = source.trimStart();
669
- if (
1197
+ const isUseClient =
670
1198
  trimmed.startsWith('"use client"') ||
671
- trimmed.startsWith("'use client'")
672
- )
673
- return;
674
- const hasUrls = source.includes("urls(");
675
- const hasCreateRouter = /\bcreateRouter\s*[<(]/.test(source);
676
- if (!hasUrls && !hasCreateRouter) return;
1199
+ trimmed.startsWith("'use client'");
1200
+ if (!inRecoveryMode && isUseClient) return;
1201
+ // Cheap raw pre-check first; only when a candidate token is present
1202
+ // do we confirm it occurs in real code (not a comment/string) via a
1203
+ // single allocation-free code-region scan. Most saved files contain
1204
+ // neither token and skip the scan entirely. This avoids a comment or
1205
+ // string mention spuriously marking a file relevant and triggering an
1206
+ // unnecessary re-discovery on save.
1207
+ let hasUrls = source.includes("urls(");
1208
+ let hasCreateRouter = /\bcreateRouter\s*[<(]/.test(source);
1209
+ if (hasUrls) hasUrls = firstCodeMatchIndex(source, /urls\(/g) >= 0;
1210
+ if (hasCreateRouter) {
1211
+ hasCreateRouter =
1212
+ firstCodeMatchIndex(source, /\bcreateRouter\s*[<(]/g) >= 0;
1213
+ }
1214
+ if (!inRecoveryMode && !hasUrls && !hasCreateRouter) return;
1215
+ if (inRecoveryMode) {
1216
+ debugDiscovery?.(
1217
+ "watcher: recovery rediscovery for %s (urls=%s, router=%s, useClient=%s) [LASTERR %s]",
1218
+ filePath,
1219
+ hasUrls,
1220
+ hasCreateRouter,
1221
+ isUseClient,
1222
+ s.lastDiscoveryError!.message,
1223
+ );
1224
+ } else {
1225
+ debugDiscovery?.(
1226
+ "watcher: %s matches (urls=%s, router=%s)",
1227
+ filePath,
1228
+ hasUrls,
1229
+ hasCreateRouter,
1230
+ );
1231
+ }
677
1232
  // Invalidate cache when a router file changes (new router added/removed)
678
1233
  if (hasCreateRouter) {
679
1234
  const nestedRouterConflict = findNestedRouterConflict([
@@ -688,8 +1243,27 @@ export function createRouterDiscoveryPlugin(
688
1243
  }
689
1244
  s.cachedRouterFiles = undefined;
690
1245
  }
1246
+ // Note the event in the gate machine IMMEDIATELY (before the
1247
+ // 100ms debounce and any downstream HMR fanout). This sets
1248
+ // both `pendingEvents` (so refresh's finally holds the gate
1249
+ // through the tail window even if no rediscovery is queued)
1250
+ // and resets `discoveryDone` to a fresh pending promise (so
1251
+ // workerd reloads triggered by the same source change can't
1252
+ // observe a stale resolved gate from cold-start). Resolved
1253
+ // by the trailing refreshRuntimeDiscovery() cycle.
1254
+ if (s.perRouterManifests.length > 0) {
1255
+ gate.noteRouteEvent();
1256
+ }
691
1257
  scheduleRouteRegeneration();
692
- } catch {
1258
+ } catch (readErr: any) {
1259
+ if (s.lastDiscoveryError) {
1260
+ debugDiscovery?.(
1261
+ "watcher: read error %s: %s [LASTERR %s]",
1262
+ filePath,
1263
+ readErr?.message,
1264
+ s.lastDiscoveryError.message,
1265
+ );
1266
+ }
693
1267
  // Ignore read errors for deleted/moved files
694
1268
  }
695
1269
  };
@@ -718,13 +1292,23 @@ export function createRouterDiscoveryPlugin(
718
1292
  async buildStart() {
719
1293
  if (!s.isBuildMode) return;
720
1294
  // Only run once across environment builds
721
- if (s.mergedRouteManifest !== null) return;
1295
+ if (s.mergedRouteManifest !== null) {
1296
+ debugDiscovery?.(
1297
+ "build: skip (already discovered, env=%s)",
1298
+ this.environment?.name ?? "?",
1299
+ );
1300
+ return;
1301
+ }
1302
+ const buildStartTime = performance.now();
1303
+ debugDiscovery?.("build: start (env=%s)", this.environment?.name ?? "?");
722
1304
  resetStagedBuildAssets(s.projectRoot);
723
1305
  s.prerenderManifestEntries = null;
724
1306
  s.staticManifestEntries = null;
725
1307
 
726
1308
  // Acquire build-time env bindings if configured
727
- await acquireBuildEnv(s, viteCommand, viteMode);
1309
+ await timed(debugDiscovery, "build acquireBuildEnv", () =>
1310
+ acquireBuildEnv(s, viteCommand, viteMode),
1311
+ );
728
1312
 
729
1313
  let tempServer: any = null;
730
1314
  // Signal to user-space code (e.g. reverse.ts) that build-time discovery
@@ -733,12 +1317,16 @@ export function createRouterDiscoveryPlugin(
733
1317
  // between the vite plugin and user code loaded via runner.import().
734
1318
  (globalThis as any).__rscRouterDiscoveryActive = true;
735
1319
  try {
736
- tempServer = await createTempRscServer(s, { forceBuild: true });
1320
+ tempServer = await timed(
1321
+ debugDiscovery,
1322
+ "build createTempRscServer",
1323
+ () => createTempRscServer(s, { forceBuild: true }),
1324
+ );
737
1325
 
738
1326
  const rscEnv = (tempServer.environments as any)?.rsc;
739
1327
  if (!rscEnv?.runner) {
740
1328
  console.warn(
741
- "[rsc-router] RSC environment runner not available during build, skipping manifest generation",
1329
+ "[rango] RSC environment runner not available during build, skipping manifest generation",
742
1330
  );
743
1331
  return;
744
1332
  }
@@ -753,11 +1341,15 @@ export function createRouterDiscoveryPlugin(
753
1341
  s.resolvedStaticModules = tempIdsPlugin.api.staticHandlerModules;
754
1342
  }
755
1343
 
756
- await discoverRouters(s, rscEnv);
1344
+ await timed(debugDiscovery, "build discoverRouters", () =>
1345
+ discoverRouters(s, rscEnv),
1346
+ );
757
1347
  // Update named-routes.gen.ts from runtime discovery.
758
1348
  // The runtime manifest includes dynamically generated routes
759
1349
  // that the static parser cannot extract from source code.
760
- writeRouteTypesFiles(s);
1350
+ timedSync(debugDiscovery, "build writeRouteTypesFiles", () =>
1351
+ writeRouteTypesFiles(s),
1352
+ );
761
1353
  } catch (err: any) {
762
1354
  // Extract the user source file from the stack trace (skip internal frames)
763
1355
  const sourceFile = err.stack
@@ -777,14 +1369,50 @@ export function createRouterDiscoveryPlugin(
777
1369
  .filter(Boolean)
778
1370
  .join("\n");
779
1371
  throw new Error(
780
- `[rsc-router] Build-time router discovery failed:\n${details}`,
1372
+ `[rango] Build-time router discovery failed:\n${details}`,
1373
+ { cause: err },
781
1374
  );
782
1375
  } finally {
783
1376
  delete (globalThis as any).__rscRouterDiscoveryActive;
784
1377
  if (tempServer) {
785
- await tempServer.close();
1378
+ await timed(debugDiscovery, "build tempServer.close", () =>
1379
+ tempServer.close(),
1380
+ );
786
1381
  }
787
1382
  await releaseBuildEnv(s);
1383
+ debugDiscovery?.(
1384
+ "build discovery done (%sms)",
1385
+ (performance.now() - buildStartTime).toFixed(1),
1386
+ );
1387
+ }
1388
+ },
1389
+
1390
+ // Suppress vite's HMR cascade for our own gen-file writes.
1391
+ //
1392
+ // After every cf HMR cycle, refreshTempRscEnv → writeRouteTypesFiles
1393
+ // writes the configured gen files (default `router.named-routes.gen.ts`,
1394
+ // but the source filenames and gen suffix are user-configurable). The
1395
+ // chokidar watcher then fires twice independently: our
1396
+ // `handleRouteFileChange` (already short-circuited by
1397
+ // `consumeSelfGenWrite` inside `maybeHandleGeneratedRouteFileMutation`),
1398
+ // AND vite's own HMR pipeline (which invalidates the gen file's
1399
+ // importers and triggers a second workerd full reload — visible to the
1400
+ // user as a duplicate "[Rango] HMR: version changed" on the client).
1401
+ //
1402
+ // `peekSelfGenWrite` is the authoritative filter: its map only contains
1403
+ // paths that `markSelfGenWrite` has registered, so it natively works
1404
+ // for any configured gen-file name. It is non-consuming so the chokidar
1405
+ // handler that fires later can still consume the same entry. Returning
1406
+ // [] tells vite "no modules invalidated by this change" — safe because
1407
+ // `s.perRouterManifests` is already up-to-date (the write that just
1408
+ // happened is the consequence of our just-completed rediscovery).
1409
+ handleHotUpdate(ctx) {
1410
+ if (peekSelfGenWrite(s, ctx.file)) {
1411
+ debugDiscovery?.(
1412
+ "handleHotUpdate: suppressing self-write HMR cascade for %s",
1413
+ ctx.file,
1414
+ );
1415
+ return [];
788
1416
  }
789
1417
  },
790
1418
 
@@ -808,19 +1436,38 @@ export function createRouterDiscoveryPlugin(
808
1436
  // This is critical for Cloudflare dev where the worker runs in a separate
809
1437
  // Miniflare process and can only receive manifest data via the virtual module.
810
1438
  if (s.discoveryDone) {
811
- await s.discoveryDone;
1439
+ await timed(
1440
+ debugRoutes,
1441
+ "await discoveryDone (manifest)",
1442
+ () => s.discoveryDone,
1443
+ );
812
1444
  }
813
- return generateRoutesManifestModule(s);
1445
+ const code = await timed(
1446
+ debugRoutes,
1447
+ "generateRoutesManifestModule",
1448
+ () => generateRoutesManifestModule(s),
1449
+ );
1450
+ debugRoutes?.("manifest module emitted (%d bytes)", code?.length ?? 0);
1451
+ return code;
814
1452
  }
815
1453
  // Per-router virtual modules: pure data exports (no side effects).
816
1454
  // ensureRouterManifest() imports the module and stores the data.
817
1455
  const perRouterPrefix = "\0" + VIRTUAL_ROUTES_MANIFEST_ID + "/";
818
1456
  if (id.startsWith(perRouterPrefix)) {
819
1457
  if (s.discoveryDone) {
820
- await s.discoveryDone;
1458
+ await timed(
1459
+ debugRoutes,
1460
+ "await discoveryDone (per-router)",
1461
+ () => s.discoveryDone,
1462
+ );
821
1463
  }
822
1464
  const routerId = id.slice(perRouterPrefix.length);
823
- return generatePerRouterModule(s, routerId);
1465
+ const code = await timed(
1466
+ debugRoutes,
1467
+ `generatePerRouterModule ${routerId}`,
1468
+ () => generatePerRouterModule(s, routerId),
1469
+ );
1470
+ return code;
824
1471
  }
825
1472
  // virtual:rsc-router/prerender-paths load handler removed
826
1473
  return null;
@@ -830,6 +1477,7 @@ export function createRouterDiscoveryPlugin(
830
1477
  // Used by closeBundle for handler code eviction and prerender data injection.
831
1478
  generateBundle(_options: any, bundle: any) {
832
1479
  if (this.environment?.name !== "rsc") return;
1480
+ const genStart = debugBuild ? performance.now() : 0;
833
1481
 
834
1482
  // Record RSC entry chunk filename for closeBundle injection
835
1483
  for (const [fileName, chunk] of Object.entries(bundle) as [
@@ -842,8 +1490,13 @@ export function createRouterDiscoveryPlugin(
842
1490
  }
843
1491
  }
844
1492
 
845
- if (!s.resolvedPrerenderModules?.size && !s.resolvedStaticModules?.size)
1493
+ if (!s.resolvedPrerenderModules?.size && !s.resolvedStaticModules?.size) {
1494
+ debugBuild?.(
1495
+ "generateBundle (rsc): no handlers to scan (%sms)",
1496
+ (performance.now() - genStart).toFixed(1),
1497
+ );
846
1498
  return;
1499
+ }
847
1500
 
848
1501
  // Clear maps at the start of each RSC generateBundle pass.
849
1502
  // Vite 6 multi-environment builds run RSC twice (analysis + production);
@@ -898,6 +1551,14 @@ export function createRouterDiscoveryPlugin(
898
1551
  }
899
1552
  }
900
1553
  }
1554
+
1555
+ debugBuild?.(
1556
+ "generateBundle (rsc): scanned %d chunks, %d prerender chunk(s), %d static chunk(s) (%sms)",
1557
+ Object.keys(bundle).length,
1558
+ s.handlerChunkInfoMap.size,
1559
+ s.staticHandlerChunkInfoMap.size,
1560
+ (performance.now() - genStart).toFixed(1),
1561
+ );
901
1562
  },
902
1563
 
903
1564
  // Build-time pre-rendering: evict handler code and inject collected prerender data.
@@ -911,7 +1572,9 @@ export function createRouterDiscoveryPlugin(
911
1572
  // Only run for the RSC environment — other environments (client, ssr) have
912
1573
  // no prerender/static data to process and would just do redundant file I/O.
913
1574
  if (this.environment && this.environment.name !== "rsc") return;
914
- postprocessBundle(s);
1575
+ timedSync(debugBuild, "closeBundle postprocessBundle", () =>
1576
+ postprocessBundle(s),
1577
+ );
915
1578
  },
916
1579
  },
917
1580
  };