@rangojs/router 0.0.0-experimental.19 → 0.0.0-experimental.1db96a9e

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 (968) hide show
  1. package/{CLAUDE.md → AGENTS.md} +4 -0
  2. package/README.md +122 -30
  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 +245 -63
  82. package/dist/bin/rango.js.map +1 -0
  83. package/dist/browser/event-controller.d.ts +191 -0
  84. package/dist/browser/event-controller.d.ts.map +1 -0
  85. package/dist/browser/event-controller.js +559 -0
  86. package/dist/browser/event-controller.js.map +1 -0
  87. package/dist/browser/index.d.ts +2 -0
  88. package/dist/browser/index.d.ts.map +1 -0
  89. package/dist/browser/index.js +14 -0
  90. package/dist/browser/index.js.map +1 -0
  91. package/dist/browser/link-interceptor.d.ts +38 -0
  92. package/dist/browser/link-interceptor.d.ts.map +1 -0
  93. package/dist/browser/link-interceptor.js +99 -0
  94. package/dist/browser/link-interceptor.js.map +1 -0
  95. package/dist/browser/logging.d.ts +10 -0
  96. package/dist/browser/logging.d.ts.map +1 -0
  97. package/dist/browser/logging.js +29 -0
  98. package/dist/browser/logging.js.map +1 -0
  99. package/dist/browser/lru-cache.d.ts +17 -0
  100. package/dist/browser/lru-cache.d.ts.map +1 -0
  101. package/dist/browser/lru-cache.js +50 -0
  102. package/dist/browser/lru-cache.js.map +1 -0
  103. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  104. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  105. package/dist/browser/merge-segment-loaders.js +102 -0
  106. package/dist/browser/merge-segment-loaders.js.map +1 -0
  107. package/dist/browser/navigation-bridge.d.ts +102 -0
  108. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  109. package/dist/browser/navigation-bridge.js +708 -0
  110. package/dist/browser/navigation-bridge.js.map +1 -0
  111. package/dist/browser/navigation-client.d.ts +25 -0
  112. package/dist/browser/navigation-client.d.ts.map +1 -0
  113. package/dist/browser/navigation-client.js +157 -0
  114. package/dist/browser/navigation-client.js.map +1 -0
  115. package/dist/browser/navigation-store.d.ts +101 -0
  116. package/dist/browser/navigation-store.d.ts.map +1 -0
  117. package/dist/browser/navigation-store.js +625 -0
  118. package/dist/browser/navigation-store.js.map +1 -0
  119. package/dist/browser/partial-update.d.ts +75 -0
  120. package/dist/browser/partial-update.d.ts.map +1 -0
  121. package/dist/browser/partial-update.js +426 -0
  122. package/dist/browser/partial-update.js.map +1 -0
  123. package/dist/browser/react/Link.d.ts +86 -0
  124. package/dist/browser/react/Link.d.ts.map +1 -0
  125. package/dist/browser/react/Link.js +128 -0
  126. package/dist/browser/react/Link.js.map +1 -0
  127. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  128. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  129. package/dist/browser/react/NavigationProvider.js +216 -0
  130. package/dist/browser/react/NavigationProvider.js.map +1 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  132. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  133. package/dist/browser/react/ScrollRestoration.js +57 -0
  134. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  135. package/dist/browser/react/context.d.ts +46 -0
  136. package/dist/browser/react/context.d.ts.map +1 -0
  137. package/dist/browser/react/context.js +10 -0
  138. package/dist/browser/react/context.js.map +1 -0
  139. package/dist/browser/react/index.d.ts +11 -0
  140. package/dist/browser/react/index.d.ts.map +1 -0
  141. package/dist/browser/react/index.js +22 -0
  142. package/dist/browser/react/index.js.map +1 -0
  143. package/dist/browser/react/location-state-shared.d.ts +63 -0
  144. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  145. package/dist/browser/react/location-state-shared.js +81 -0
  146. package/dist/browser/react/location-state-shared.js.map +1 -0
  147. package/dist/browser/react/location-state.d.ts +23 -0
  148. package/dist/browser/react/location-state.d.ts.map +1 -0
  149. package/dist/browser/react/location-state.js +29 -0
  150. package/dist/browser/react/location-state.js.map +1 -0
  151. package/dist/browser/react/mount-context.d.ts +24 -0
  152. package/dist/browser/react/mount-context.d.ts.map +1 -0
  153. package/dist/browser/react/mount-context.js +24 -0
  154. package/dist/browser/react/mount-context.js.map +1 -0
  155. package/dist/browser/react/use-action.d.ts +64 -0
  156. package/dist/browser/react/use-action.d.ts.map +1 -0
  157. package/dist/browser/react/use-action.js +134 -0
  158. package/dist/browser/react/use-action.js.map +1 -0
  159. package/dist/browser/react/use-client-cache.d.ts +41 -0
  160. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  161. package/dist/browser/react/use-client-cache.js +39 -0
  162. package/dist/browser/react/use-client-cache.js.map +1 -0
  163. package/dist/browser/react/use-handle.d.ts +31 -0
  164. package/dist/browser/react/use-handle.d.ts.map +1 -0
  165. package/dist/browser/react/use-handle.js +144 -0
  166. package/dist/browser/react/use-handle.js.map +1 -0
  167. package/dist/browser/react/use-href.d.ts +33 -0
  168. package/dist/browser/react/use-href.d.ts.map +1 -0
  169. package/dist/browser/react/use-href.js +39 -0
  170. package/dist/browser/react/use-href.js.map +1 -0
  171. package/dist/browser/react/use-link-status.d.ts +37 -0
  172. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  173. package/dist/browser/react/use-link-status.js +99 -0
  174. package/dist/browser/react/use-link-status.js.map +1 -0
  175. package/dist/browser/react/use-mount.d.ts +25 -0
  176. package/dist/browser/react/use-mount.d.ts.map +1 -0
  177. package/dist/browser/react/use-mount.js +30 -0
  178. package/dist/browser/react/use-mount.js.map +1 -0
  179. package/dist/browser/react/use-navigation.d.ts +27 -0
  180. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  181. package/dist/browser/react/use-navigation.js +87 -0
  182. package/dist/browser/react/use-navigation.js.map +1 -0
  183. package/dist/browser/react/use-segments.d.ts +38 -0
  184. package/dist/browser/react/use-segments.d.ts.map +1 -0
  185. package/dist/browser/react/use-segments.js +130 -0
  186. package/dist/browser/react/use-segments.js.map +1 -0
  187. package/dist/browser/request-controller.d.ts +26 -0
  188. package/dist/browser/request-controller.d.ts.map +1 -0
  189. package/dist/browser/request-controller.js +147 -0
  190. package/dist/browser/request-controller.js.map +1 -0
  191. package/dist/browser/rsc-router.d.ts +129 -0
  192. package/dist/browser/rsc-router.d.ts.map +1 -0
  193. package/dist/browser/rsc-router.js +195 -0
  194. package/dist/browser/rsc-router.js.map +1 -0
  195. package/dist/browser/scroll-restoration.d.ts +93 -0
  196. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  197. package/dist/browser/scroll-restoration.js +321 -0
  198. package/dist/browser/scroll-restoration.js.map +1 -0
  199. package/dist/browser/segment-structure-assert.d.ts +17 -0
  200. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  201. package/dist/browser/segment-structure-assert.js +59 -0
  202. package/dist/browser/segment-structure-assert.js.map +1 -0
  203. package/dist/browser/server-action-bridge.d.ts +26 -0
  204. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  205. package/dist/browser/server-action-bridge.js +668 -0
  206. package/dist/browser/server-action-bridge.js.map +1 -0
  207. package/dist/browser/shallow.d.ts +12 -0
  208. package/dist/browser/shallow.d.ts.map +1 -0
  209. package/dist/browser/shallow.js +34 -0
  210. package/dist/browser/shallow.js.map +1 -0
  211. package/dist/browser/types.d.ts +369 -0
  212. package/dist/browser/types.d.ts.map +1 -0
  213. package/dist/browser/types.js +2 -0
  214. package/dist/browser/types.js.map +1 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  216. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  217. package/dist/build/__tests__/generate-cli.test.js +237 -0
  218. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  220. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  221. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  222. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  224. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  225. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  226. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  228. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  230. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  231. package/dist/build/generate-manifest.d.ts +81 -0
  232. package/dist/build/generate-manifest.d.ts.map +1 -0
  233. package/dist/build/generate-manifest.js +276 -0
  234. package/dist/build/generate-manifest.js.map +1 -0
  235. package/dist/build/generate-route-types.d.ts +115 -0
  236. package/dist/build/generate-route-types.d.ts.map +1 -0
  237. package/dist/build/generate-route-types.js +740 -0
  238. package/dist/build/generate-route-types.js.map +1 -0
  239. package/dist/build/index.d.ts +21 -0
  240. package/dist/build/index.d.ts.map +1 -0
  241. package/dist/build/index.js +21 -0
  242. package/dist/build/index.js.map +1 -0
  243. package/dist/build/route-trie.d.ts +71 -0
  244. package/dist/build/route-trie.d.ts.map +1 -0
  245. package/dist/build/route-trie.js +175 -0
  246. package/dist/build/route-trie.js.map +1 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  248. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  249. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  250. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  252. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  253. package/dist/cache/__tests__/document-cache.test.js +345 -0
  254. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  258. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  260. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  261. package/dist/cache/__tests__/memory-store.test.js +367 -0
  262. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  263. package/dist/cache/cache-scope.d.ts +102 -0
  264. package/dist/cache/cache-scope.d.ts.map +1 -0
  265. package/dist/cache/cache-scope.js +440 -0
  266. package/dist/cache/cache-scope.js.map +1 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  270. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  272. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  273. package/dist/cache/cf/cf-cache-store.js +242 -0
  274. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  275. package/dist/cache/cf/index.d.ts +14 -0
  276. package/dist/cache/cf/index.d.ts.map +1 -0
  277. package/dist/cache/cf/index.js +17 -0
  278. package/dist/cache/cf/index.js.map +1 -0
  279. package/dist/cache/document-cache.d.ts +64 -0
  280. package/dist/cache/document-cache.d.ts.map +1 -0
  281. package/dist/cache/document-cache.js +228 -0
  282. package/dist/cache/document-cache.js.map +1 -0
  283. package/dist/cache/index.d.ts +19 -0
  284. package/dist/cache/index.d.ts.map +1 -0
  285. package/dist/cache/index.js +21 -0
  286. package/dist/cache/index.js.map +1 -0
  287. package/dist/cache/memory-segment-store.d.ts +110 -0
  288. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  289. package/dist/cache/memory-segment-store.js +117 -0
  290. package/dist/cache/memory-segment-store.js.map +1 -0
  291. package/dist/cache/memory-store.d.ts +41 -0
  292. package/dist/cache/memory-store.d.ts.map +1 -0
  293. package/dist/cache/memory-store.js +191 -0
  294. package/dist/cache/memory-store.js.map +1 -0
  295. package/dist/cache/types.d.ts +317 -0
  296. package/dist/cache/types.d.ts.map +1 -0
  297. package/dist/cache/types.js +12 -0
  298. package/dist/cache/types.js.map +1 -0
  299. package/dist/client.d.ts +248 -0
  300. package/dist/client.d.ts.map +1 -0
  301. package/dist/client.js +367 -0
  302. package/dist/client.js.map +1 -0
  303. package/dist/client.rsc.d.ts +26 -0
  304. package/dist/client.rsc.d.ts.map +1 -0
  305. package/dist/client.rsc.js +46 -0
  306. package/dist/client.rsc.js.map +1 -0
  307. package/dist/component-utils.d.ts +36 -0
  308. package/dist/component-utils.d.ts.map +1 -0
  309. package/dist/component-utils.js +61 -0
  310. package/dist/component-utils.js.map +1 -0
  311. package/dist/components/DefaultDocument.d.ts +13 -0
  312. package/dist/components/DefaultDocument.d.ts.map +1 -0
  313. package/dist/components/DefaultDocument.js +15 -0
  314. package/dist/components/DefaultDocument.js.map +1 -0
  315. package/dist/debug.d.ts +58 -0
  316. package/dist/debug.d.ts.map +1 -0
  317. package/dist/debug.js +157 -0
  318. package/dist/debug.js.map +1 -0
  319. package/dist/default-error-boundary.d.ts +11 -0
  320. package/dist/default-error-boundary.d.ts.map +1 -0
  321. package/dist/default-error-boundary.js +45 -0
  322. package/dist/default-error-boundary.js.map +1 -0
  323. package/dist/deps/browser.d.ts +2 -0
  324. package/dist/deps/browser.d.ts.map +1 -0
  325. package/dist/deps/browser.js +3 -0
  326. package/dist/deps/browser.js.map +1 -0
  327. package/dist/deps/html-stream-client.d.ts +2 -0
  328. package/dist/deps/html-stream-client.d.ts.map +1 -0
  329. package/dist/deps/html-stream-client.js +3 -0
  330. package/dist/deps/html-stream-client.js.map +1 -0
  331. package/dist/deps/html-stream-server.d.ts +2 -0
  332. package/dist/deps/html-stream-server.d.ts.map +1 -0
  333. package/dist/deps/html-stream-server.js +3 -0
  334. package/dist/deps/html-stream-server.js.map +1 -0
  335. package/dist/deps/rsc.d.ts +2 -0
  336. package/dist/deps/rsc.d.ts.map +1 -0
  337. package/dist/deps/rsc.js +4 -0
  338. package/dist/deps/rsc.js.map +1 -0
  339. package/dist/deps/ssr.d.ts +2 -0
  340. package/dist/deps/ssr.d.ts.map +1 -0
  341. package/dist/deps/ssr.js +3 -0
  342. package/dist/deps/ssr.js.map +1 -0
  343. package/dist/errors.d.ts +174 -0
  344. package/dist/errors.d.ts.map +1 -0
  345. package/dist/errors.js +241 -0
  346. package/dist/errors.js.map +1 -0
  347. package/dist/handle.d.ts +78 -0
  348. package/dist/handle.d.ts.map +1 -0
  349. package/dist/handle.js +82 -0
  350. package/dist/handle.js.map +1 -0
  351. package/dist/handles/MetaTags.d.ts +14 -0
  352. package/dist/handles/MetaTags.d.ts.map +1 -0
  353. package/dist/handles/MetaTags.js +136 -0
  354. package/dist/handles/MetaTags.js.map +1 -0
  355. package/dist/handles/index.d.ts +6 -0
  356. package/dist/handles/index.d.ts.map +1 -0
  357. package/dist/handles/index.js +6 -0
  358. package/dist/handles/index.js.map +1 -0
  359. package/dist/handles/meta.d.ts +39 -0
  360. package/dist/handles/meta.d.ts.map +1 -0
  361. package/dist/handles/meta.js +202 -0
  362. package/dist/handles/meta.js.map +1 -0
  363. package/dist/host/__tests__/errors.test.d.ts +2 -0
  364. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  365. package/dist/host/__tests__/errors.test.js +76 -0
  366. package/dist/host/__tests__/errors.test.js.map +1 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  370. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  372. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  374. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  375. package/dist/host/__tests__/router.test.d.ts +2 -0
  376. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  377. package/dist/host/__tests__/router.test.js +241 -0
  378. package/dist/host/__tests__/router.test.js.map +1 -0
  379. package/dist/host/__tests__/testing.test.d.ts +2 -0
  380. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  381. package/dist/host/__tests__/testing.test.js +64 -0
  382. package/dist/host/__tests__/testing.test.js.map +1 -0
  383. package/dist/host/__tests__/utils.test.d.ts +2 -0
  384. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  385. package/dist/host/__tests__/utils.test.js +29 -0
  386. package/dist/host/__tests__/utils.test.js.map +1 -0
  387. package/dist/host/cookie-handler.d.ts +34 -0
  388. package/dist/host/cookie-handler.d.ts.map +1 -0
  389. package/dist/host/cookie-handler.js +124 -0
  390. package/dist/host/cookie-handler.js.map +1 -0
  391. package/dist/host/errors.d.ts +56 -0
  392. package/dist/host/errors.d.ts.map +1 -0
  393. package/dist/host/errors.js +79 -0
  394. package/dist/host/errors.js.map +1 -0
  395. package/dist/host/index.d.ts +29 -0
  396. package/dist/host/index.d.ts.map +1 -0
  397. package/dist/host/index.js +32 -0
  398. package/dist/host/index.js.map +1 -0
  399. package/dist/host/pattern-matcher.d.ts +36 -0
  400. package/dist/host/pattern-matcher.d.ts.map +1 -0
  401. package/dist/host/pattern-matcher.js +172 -0
  402. package/dist/host/pattern-matcher.js.map +1 -0
  403. package/dist/host/router.d.ts +26 -0
  404. package/dist/host/router.d.ts.map +1 -0
  405. package/dist/host/router.js +218 -0
  406. package/dist/host/router.js.map +1 -0
  407. package/dist/host/testing.d.ts +36 -0
  408. package/dist/host/testing.d.ts.map +1 -0
  409. package/dist/host/testing.js +55 -0
  410. package/dist/host/testing.js.map +1 -0
  411. package/dist/host/types.d.ts +115 -0
  412. package/dist/host/types.d.ts.map +1 -0
  413. package/dist/host/types.js +7 -0
  414. package/dist/host/types.js.map +1 -0
  415. package/dist/host/utils.d.ts +21 -0
  416. package/dist/host/utils.d.ts.map +1 -0
  417. package/dist/host/utils.js +23 -0
  418. package/dist/host/utils.js.map +1 -0
  419. package/dist/href-client.d.ts +131 -0
  420. package/dist/href-client.d.ts.map +1 -0
  421. package/dist/href-client.js +64 -0
  422. package/dist/href-client.js.map +1 -0
  423. package/dist/href-context.d.ts +29 -0
  424. package/dist/href-context.d.ts.map +1 -0
  425. package/dist/href-context.js +21 -0
  426. package/dist/href-context.js.map +1 -0
  427. package/dist/index.d.ts +73 -0
  428. package/dist/index.d.ts.map +1 -0
  429. package/dist/index.js +91 -0
  430. package/dist/index.js.map +1 -0
  431. package/dist/index.rsc.d.ts +32 -0
  432. package/dist/index.rsc.d.ts.map +1 -0
  433. package/dist/index.rsc.js +40 -0
  434. package/dist/index.rsc.js.map +1 -0
  435. package/dist/internal-debug.d.ts +2 -0
  436. package/dist/internal-debug.d.ts.map +1 -0
  437. package/dist/internal-debug.js +5 -0
  438. package/dist/internal-debug.js.map +1 -0
  439. package/dist/loader.d.ts +14 -0
  440. package/dist/loader.d.ts.map +1 -0
  441. package/dist/loader.js +20 -0
  442. package/dist/loader.js.map +1 -0
  443. package/dist/loader.rsc.d.ts +19 -0
  444. package/dist/loader.rsc.d.ts.map +1 -0
  445. package/dist/loader.rsc.js +99 -0
  446. package/dist/loader.rsc.js.map +1 -0
  447. package/dist/network-error-thrower.d.ts +17 -0
  448. package/dist/network-error-thrower.d.ts.map +1 -0
  449. package/dist/network-error-thrower.js +14 -0
  450. package/dist/network-error-thrower.js.map +1 -0
  451. package/dist/outlet-context.d.ts +13 -0
  452. package/dist/outlet-context.d.ts.map +1 -0
  453. package/dist/outlet-context.js +3 -0
  454. package/dist/outlet-context.js.map +1 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  456. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  457. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  458. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  459. package/dist/prerender/param-hash.d.ts +16 -0
  460. package/dist/prerender/param-hash.d.ts.map +1 -0
  461. package/dist/prerender/param-hash.js +36 -0
  462. package/dist/prerender/param-hash.js.map +1 -0
  463. package/dist/prerender/store.d.ts +38 -0
  464. package/dist/prerender/store.d.ts.map +1 -0
  465. package/dist/prerender/store.js +61 -0
  466. package/dist/prerender/store.js.map +1 -0
  467. package/dist/prerender.d.ts +66 -0
  468. package/dist/prerender.d.ts.map +1 -0
  469. package/dist/prerender.js +57 -0
  470. package/dist/prerender.js.map +1 -0
  471. package/dist/reverse.d.ts +196 -0
  472. package/dist/reverse.d.ts.map +1 -0
  473. package/dist/reverse.js +78 -0
  474. package/dist/reverse.js.map +1 -0
  475. package/dist/root-error-boundary.d.ts +33 -0
  476. package/dist/root-error-boundary.d.ts.map +1 -0
  477. package/dist/root-error-boundary.js +165 -0
  478. package/dist/root-error-boundary.js.map +1 -0
  479. package/dist/route-content-wrapper.d.ts +46 -0
  480. package/dist/route-content-wrapper.d.ts.map +1 -0
  481. package/dist/route-content-wrapper.js +77 -0
  482. package/dist/route-content-wrapper.js.map +1 -0
  483. package/dist/route-definition.d.ts +421 -0
  484. package/dist/route-definition.d.ts.map +1 -0
  485. package/dist/route-definition.js +868 -0
  486. package/dist/route-definition.js.map +1 -0
  487. package/dist/route-map-builder.d.ts +155 -0
  488. package/dist/route-map-builder.d.ts.map +1 -0
  489. package/dist/route-map-builder.js +237 -0
  490. package/dist/route-map-builder.js.map +1 -0
  491. package/dist/route-types.d.ts +165 -0
  492. package/dist/route-types.d.ts.map +1 -0
  493. package/dist/route-types.js +7 -0
  494. package/dist/route-types.js.map +1 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  496. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  497. package/dist/router/__tests__/handler-context.test.js +65 -0
  498. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  502. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  503. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  504. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  505. package/dist/router/__tests__/match-context.test.js +92 -0
  506. package/dist/router/__tests__/match-context.test.js.map +1 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  508. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  509. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  510. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  511. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  512. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  513. package/dist/router/__tests__/match-result.test.js +457 -0
  514. package/dist/router/__tests__/match-result.test.js.map +1 -0
  515. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  516. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  517. package/dist/router/__tests__/on-error.test.js +678 -0
  518. package/dist/router/__tests__/on-error.test.js.map +1 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  520. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  521. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  522. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  526. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  527. package/dist/router/error-handling.d.ts +77 -0
  528. package/dist/router/error-handling.d.ts.map +1 -0
  529. package/dist/router/error-handling.js +202 -0
  530. package/dist/router/error-handling.js.map +1 -0
  531. package/dist/router/handler-context.d.ts +20 -0
  532. package/dist/router/handler-context.d.ts.map +1 -0
  533. package/dist/router/handler-context.js +198 -0
  534. package/dist/router/handler-context.js.map +1 -0
  535. package/dist/router/intercept-resolution.d.ts +66 -0
  536. package/dist/router/intercept-resolution.d.ts.map +1 -0
  537. package/dist/router/intercept-resolution.js +246 -0
  538. package/dist/router/intercept-resolution.js.map +1 -0
  539. package/dist/router/loader-resolution.d.ts +64 -0
  540. package/dist/router/loader-resolution.d.ts.map +1 -0
  541. package/dist/router/loader-resolution.js +284 -0
  542. package/dist/router/loader-resolution.js.map +1 -0
  543. package/dist/router/logging.d.ts +15 -0
  544. package/dist/router/logging.d.ts.map +1 -0
  545. package/dist/router/logging.js +99 -0
  546. package/dist/router/logging.js.map +1 -0
  547. package/dist/router/manifest.d.ts +22 -0
  548. package/dist/router/manifest.d.ts.map +1 -0
  549. package/dist/router/manifest.js +181 -0
  550. package/dist/router/manifest.js.map +1 -0
  551. package/dist/router/match-api.d.ts +35 -0
  552. package/dist/router/match-api.d.ts.map +1 -0
  553. package/dist/router/match-api.js +406 -0
  554. package/dist/router/match-api.js.map +1 -0
  555. package/dist/router/match-context.d.ts +206 -0
  556. package/dist/router/match-context.d.ts.map +1 -0
  557. package/dist/router/match-context.js +17 -0
  558. package/dist/router/match-context.js.map +1 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  560. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  561. package/dist/router/match-middleware/background-revalidation.js +75 -0
  562. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  564. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  565. package/dist/router/match-middleware/cache-lookup.js +257 -0
  566. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  567. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  568. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  569. package/dist/router/match-middleware/cache-store.js +108 -0
  570. package/dist/router/match-middleware/cache-store.js.map +1 -0
  571. package/dist/router/match-middleware/index.d.ts +81 -0
  572. package/dist/router/match-middleware/index.d.ts.map +1 -0
  573. package/dist/router/match-middleware/index.js +80 -0
  574. package/dist/router/match-middleware/index.js.map +1 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  576. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  577. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  578. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  580. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  581. package/dist/router/match-middleware/segment-resolution.js +53 -0
  582. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  583. package/dist/router/match-pipelines.d.ts +147 -0
  584. package/dist/router/match-pipelines.d.ts.map +1 -0
  585. package/dist/router/match-pipelines.js +82 -0
  586. package/dist/router/match-pipelines.js.map +1 -0
  587. package/dist/router/match-result.d.ts +126 -0
  588. package/dist/router/match-result.d.ts.map +1 -0
  589. package/dist/router/match-result.js +93 -0
  590. package/dist/router/match-result.js.map +1 -0
  591. package/dist/router/metrics.d.ts +20 -0
  592. package/dist/router/metrics.d.ts.map +1 -0
  593. package/dist/router/metrics.js +47 -0
  594. package/dist/router/metrics.js.map +1 -0
  595. package/dist/router/middleware.d.ts +249 -0
  596. package/dist/router/middleware.d.ts.map +1 -0
  597. package/dist/router/middleware.js +434 -0
  598. package/dist/router/middleware.js.map +1 -0
  599. package/dist/router/middleware.test.d.ts +2 -0
  600. package/dist/router/middleware.test.d.ts.map +1 -0
  601. package/dist/router/middleware.test.js +816 -0
  602. package/dist/router/middleware.test.js.map +1 -0
  603. package/dist/router/pattern-matching.d.ts +149 -0
  604. package/dist/router/pattern-matching.d.ts.map +1 -0
  605. package/dist/router/pattern-matching.js +349 -0
  606. package/dist/router/pattern-matching.js.map +1 -0
  607. package/dist/router/revalidation.d.ts +44 -0
  608. package/dist/router/revalidation.d.ts.map +1 -0
  609. package/dist/router/revalidation.js +147 -0
  610. package/dist/router/revalidation.js.map +1 -0
  611. package/dist/router/router-context.d.ts +135 -0
  612. package/dist/router/router-context.d.ts.map +1 -0
  613. package/dist/router/router-context.js +36 -0
  614. package/dist/router/router-context.js.map +1 -0
  615. package/dist/router/segment-resolution.d.ts +127 -0
  616. package/dist/router/segment-resolution.d.ts.map +1 -0
  617. package/dist/router/segment-resolution.js +919 -0
  618. package/dist/router/segment-resolution.js.map +1 -0
  619. package/dist/router/trie-matching.d.ts +40 -0
  620. package/dist/router/trie-matching.d.ts.map +1 -0
  621. package/dist/router/trie-matching.js +127 -0
  622. package/dist/router/trie-matching.js.map +1 -0
  623. package/dist/router/types.d.ts +136 -0
  624. package/dist/router/types.d.ts.map +1 -0
  625. package/dist/router/types.js +7 -0
  626. package/dist/router/types.js.map +1 -0
  627. package/dist/router.d.ts +753 -0
  628. package/dist/router.d.ts.map +1 -0
  629. package/dist/router.gen.d.ts +6 -0
  630. package/dist/router.gen.d.ts.map +1 -0
  631. package/dist/router.gen.js +6 -0
  632. package/dist/router.gen.js.map +1 -0
  633. package/dist/router.js +1304 -0
  634. package/dist/router.js.map +1 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  636. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  637. package/dist/rsc/__tests__/helpers.test.js +140 -0
  638. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  639. package/dist/rsc/handler.d.ts +45 -0
  640. package/dist/rsc/handler.d.ts.map +1 -0
  641. package/dist/rsc/handler.js +1172 -0
  642. package/dist/rsc/handler.js.map +1 -0
  643. package/dist/rsc/helpers.d.ts +16 -0
  644. package/dist/rsc/helpers.d.ts.map +1 -0
  645. package/dist/rsc/helpers.js +55 -0
  646. package/dist/rsc/helpers.js.map +1 -0
  647. package/dist/rsc/index.d.ts +22 -0
  648. package/dist/rsc/index.d.ts.map +1 -0
  649. package/dist/rsc/index.js +23 -0
  650. package/dist/rsc/index.js.map +1 -0
  651. package/dist/rsc/nonce.d.ts +9 -0
  652. package/dist/rsc/nonce.d.ts.map +1 -0
  653. package/dist/rsc/nonce.js +18 -0
  654. package/dist/rsc/nonce.js.map +1 -0
  655. package/dist/rsc/types.d.ts +206 -0
  656. package/dist/rsc/types.d.ts.map +1 -0
  657. package/dist/rsc/types.js +8 -0
  658. package/dist/rsc/types.js.map +1 -0
  659. package/dist/search-params.d.ts +103 -0
  660. package/dist/search-params.d.ts.map +1 -0
  661. package/dist/search-params.js +74 -0
  662. package/dist/search-params.js.map +1 -0
  663. package/dist/segment-system.d.ts +75 -0
  664. package/dist/segment-system.d.ts.map +1 -0
  665. package/dist/segment-system.js +336 -0
  666. package/dist/segment-system.js.map +1 -0
  667. package/dist/server/context.d.ts +245 -0
  668. package/dist/server/context.d.ts.map +1 -0
  669. package/dist/server/context.js +197 -0
  670. package/dist/server/context.js.map +1 -0
  671. package/dist/server/fetchable-loader-store.d.ts +18 -0
  672. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  673. package/dist/server/fetchable-loader-store.js +18 -0
  674. package/dist/server/fetchable-loader-store.js.map +1 -0
  675. package/dist/server/handle-store.d.ts +85 -0
  676. package/dist/server/handle-store.d.ts.map +1 -0
  677. package/dist/server/handle-store.js +142 -0
  678. package/dist/server/handle-store.js.map +1 -0
  679. package/dist/server/loader-registry.d.ts +55 -0
  680. package/dist/server/loader-registry.d.ts.map +1 -0
  681. package/dist/server/loader-registry.js +132 -0
  682. package/dist/server/loader-registry.js.map +1 -0
  683. package/dist/server/request-context.d.ts +226 -0
  684. package/dist/server/request-context.d.ts.map +1 -0
  685. package/dist/server/request-context.js +290 -0
  686. package/dist/server/request-context.js.map +1 -0
  687. package/dist/server/root-layout.d.ts +4 -0
  688. package/dist/server/root-layout.d.ts.map +1 -0
  689. package/dist/server/root-layout.js +5 -0
  690. package/dist/server/root-layout.js.map +1 -0
  691. package/dist/server.d.ts +15 -0
  692. package/dist/server.d.ts.map +1 -0
  693. package/dist/server.js +20 -0
  694. package/dist/server.js.map +1 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  698. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  699. package/dist/ssr/index.d.ts +98 -0
  700. package/dist/ssr/index.d.ts.map +1 -0
  701. package/dist/ssr/index.js +158 -0
  702. package/dist/ssr/index.js.map +1 -0
  703. package/dist/static-handler.d.ts +50 -0
  704. package/dist/static-handler.d.ts.map +1 -0
  705. package/dist/static-handler.gen.d.ts +5 -0
  706. package/dist/static-handler.gen.d.ts.map +1 -0
  707. package/dist/static-handler.gen.js +5 -0
  708. package/dist/static-handler.gen.js.map +1 -0
  709. package/dist/static-handler.js +29 -0
  710. package/dist/static-handler.js.map +1 -0
  711. package/dist/theme/ThemeProvider.d.ts +20 -0
  712. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  713. package/dist/theme/ThemeProvider.js +240 -0
  714. package/dist/theme/ThemeProvider.js.map +1 -0
  715. package/dist/theme/ThemeScript.d.ts +48 -0
  716. package/dist/theme/ThemeScript.d.ts.map +1 -0
  717. package/dist/theme/ThemeScript.js +13 -0
  718. package/dist/theme/ThemeScript.js.map +1 -0
  719. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  720. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  721. package/dist/theme/__tests__/theme.test.js +103 -0
  722. package/dist/theme/__tests__/theme.test.js.map +1 -0
  723. package/dist/theme/constants.d.ts +29 -0
  724. package/dist/theme/constants.d.ts.map +1 -0
  725. package/dist/theme/constants.js +48 -0
  726. package/dist/theme/constants.js.map +1 -0
  727. package/dist/theme/index.d.ts +31 -0
  728. package/dist/theme/index.d.ts.map +1 -0
  729. package/dist/theme/index.js +36 -0
  730. package/dist/theme/index.js.map +1 -0
  731. package/dist/theme/theme-context.d.ts +40 -0
  732. package/dist/theme/theme-context.d.ts.map +1 -0
  733. package/dist/theme/theme-context.js +60 -0
  734. package/dist/theme/theme-context.js.map +1 -0
  735. package/dist/theme/theme-script.d.ts +27 -0
  736. package/dist/theme/theme-script.d.ts.map +1 -0
  737. package/dist/theme/theme-script.js +147 -0
  738. package/dist/theme/theme-script.js.map +1 -0
  739. package/dist/theme/types.d.ts +163 -0
  740. package/dist/theme/types.d.ts.map +1 -0
  741. package/dist/theme/types.js +11 -0
  742. package/dist/theme/types.js.map +1 -0
  743. package/dist/theme/use-theme.d.ts +12 -0
  744. package/dist/theme/use-theme.d.ts.map +1 -0
  745. package/dist/theme/use-theme.js +40 -0
  746. package/dist/theme/use-theme.js.map +1 -0
  747. package/dist/types.d.ts +1479 -0
  748. package/dist/types.d.ts.map +1 -0
  749. package/dist/types.js +10 -0
  750. package/dist/types.js.map +1 -0
  751. package/dist/urls.d.ts +441 -0
  752. package/dist/urls.d.ts.map +1 -0
  753. package/dist/urls.gen.d.ts +8 -0
  754. package/dist/urls.gen.d.ts.map +1 -0
  755. package/dist/urls.gen.js +8 -0
  756. package/dist/urls.gen.js.map +1 -0
  757. package/dist/urls.js +443 -0
  758. package/dist/urls.js.map +1 -0
  759. package/dist/use-loader.d.ts +127 -0
  760. package/dist/use-loader.d.ts.map +1 -0
  761. package/dist/use-loader.js +237 -0
  762. package/dist/use-loader.js.map +1 -0
  763. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  767. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  771. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  775. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  777. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  779. package/dist/vite/ast-handler-extract.d.ts +49 -0
  780. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  781. package/dist/vite/ast-handler-extract.js +249 -0
  782. package/dist/vite/ast-handler-extract.js.map +1 -0
  783. package/dist/vite/expose-action-id.d.ts +19 -0
  784. package/dist/vite/expose-action-id.d.ts.map +1 -0
  785. package/dist/vite/expose-action-id.js +250 -0
  786. package/dist/vite/expose-action-id.js.map +1 -0
  787. package/dist/vite/expose-id-utils.d.ts +69 -0
  788. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  789. package/dist/vite/expose-id-utils.js +289 -0
  790. package/dist/vite/expose-id-utils.js.map +1 -0
  791. package/dist/vite/expose-internal-ids.d.ts +22 -0
  792. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  793. package/dist/vite/expose-internal-ids.js +886 -0
  794. package/dist/vite/expose-internal-ids.js.map +1 -0
  795. package/dist/vite/index.d.ts +149 -0
  796. package/dist/vite/index.d.ts.map +1 -0
  797. package/dist/vite/index.js +985 -465
  798. package/dist/vite/index.js.bak +5448 -0
  799. package/dist/vite/index.js.map +1 -0
  800. package/dist/vite/index.named-routes.gen.ts +103 -0
  801. package/dist/vite/package-resolution.d.ts +43 -0
  802. package/dist/vite/package-resolution.d.ts.map +1 -0
  803. package/dist/vite/package-resolution.js +112 -0
  804. package/dist/vite/package-resolution.js.map +1 -0
  805. package/dist/vite/virtual-entries.d.ts +25 -0
  806. package/dist/vite/virtual-entries.d.ts.map +1 -0
  807. package/dist/vite/virtual-entries.js +110 -0
  808. package/dist/vite/virtual-entries.js.map +1 -0
  809. package/package.json +3 -3
  810. package/skills/breadcrumbs/SKILL.md +250 -0
  811. package/skills/cache-guide/SKILL.md +32 -0
  812. package/skills/caching/SKILL.md +49 -8
  813. package/skills/document-cache/SKILL.md +2 -2
  814. package/skills/hooks/SKILL.md +33 -31
  815. package/skills/host-router/SKILL.md +218 -0
  816. package/skills/links/SKILL.md +3 -1
  817. package/skills/loader/SKILL.md +72 -22
  818. package/skills/middleware/SKILL.md +2 -0
  819. package/skills/parallel/SKILL.md +126 -0
  820. package/skills/prerender/SKILL.md +112 -70
  821. package/skills/rango/SKILL.md +0 -1
  822. package/skills/route/SKILL.md +34 -4
  823. package/skills/router-setup/SKILL.md +95 -5
  824. package/skills/typesafety/SKILL.md +35 -23
  825. package/src/__internal.ts +92 -0
  826. package/src/bin/rango.ts +18 -0
  827. package/src/browser/app-version.ts +14 -0
  828. package/src/browser/event-controller.ts +5 -0
  829. package/src/browser/link-interceptor.ts +4 -0
  830. package/src/browser/navigation-bridge.ts +114 -18
  831. package/src/browser/navigation-client.ts +126 -44
  832. package/src/browser/navigation-store.ts +43 -8
  833. package/src/browser/navigation-transaction.ts +11 -9
  834. package/src/browser/partial-update.ts +80 -15
  835. package/src/browser/prefetch/cache.ts +166 -27
  836. package/src/browser/prefetch/fetch.ts +52 -39
  837. package/src/browser/prefetch/policy.ts +6 -0
  838. package/src/browser/prefetch/queue.ts +92 -20
  839. package/src/browser/prefetch/resource-ready.ts +77 -0
  840. package/src/browser/react/Link.tsx +70 -14
  841. package/src/browser/react/NavigationProvider.tsx +40 -4
  842. package/src/browser/react/context.ts +7 -2
  843. package/src/browser/react/use-handle.ts +9 -58
  844. package/src/browser/react/use-router.ts +21 -8
  845. package/src/browser/rsc-router.tsx +143 -59
  846. package/src/browser/scroll-restoration.ts +41 -42
  847. package/src/browser/segment-reconciler.ts +6 -1
  848. package/src/browser/server-action-bridge.ts +454 -436
  849. package/src/browser/types.ts +60 -5
  850. package/src/build/generate-manifest.ts +6 -6
  851. package/src/build/generate-route-types.ts +5 -0
  852. package/src/build/route-trie.ts +19 -3
  853. package/src/build/route-types/include-resolution.ts +8 -1
  854. package/src/build/route-types/router-processing.ts +346 -87
  855. package/src/build/route-types/scan-filter.ts +8 -1
  856. package/src/cache/cache-runtime.ts +15 -11
  857. package/src/cache/cache-scope.ts +48 -7
  858. package/src/cache/cf/cf-cache-store.ts +453 -11
  859. package/src/cache/cf/index.ts +5 -1
  860. package/src/cache/document-cache.ts +17 -7
  861. package/src/cache/index.ts +1 -0
  862. package/src/cache/taint.ts +55 -0
  863. package/src/client.rsc.tsx +2 -1
  864. package/src/client.tsx +3 -102
  865. package/src/context-var.ts +72 -2
  866. package/src/debug.ts +2 -2
  867. package/src/handle.ts +40 -0
  868. package/src/handles/breadcrumbs.ts +66 -0
  869. package/src/handles/index.ts +1 -0
  870. package/src/host/index.ts +0 -3
  871. package/src/index.rsc.ts +8 -37
  872. package/src/index.ts +44 -66
  873. package/src/prerender/store.ts +57 -15
  874. package/src/prerender.ts +138 -77
  875. package/src/reverse.ts +22 -1
  876. package/src/route-definition/dsl-helpers.ts +73 -25
  877. package/src/route-definition/helpers-types.ts +10 -6
  878. package/src/route-definition/index.ts +3 -3
  879. package/src/route-definition/redirect.ts +11 -3
  880. package/src/route-definition/resolve-handler-use.ts +149 -0
  881. package/src/route-map-builder.ts +7 -1
  882. package/src/route-types.ts +11 -0
  883. package/src/router/content-negotiation.ts +100 -1
  884. package/src/router/find-match.ts +4 -2
  885. package/src/router/handler-context.ts +108 -25
  886. package/src/router/intercept-resolution.ts +11 -4
  887. package/src/router/lazy-includes.ts +4 -1
  888. package/src/router/loader-resolution.ts +157 -22
  889. package/src/router/logging.ts +5 -2
  890. package/src/router/manifest.ts +9 -3
  891. package/src/router/match-api.ts +125 -190
  892. package/src/router/match-middleware/background-revalidation.ts +30 -2
  893. package/src/router/match-middleware/cache-lookup.ts +92 -16
  894. package/src/router/match-middleware/cache-store.ts +53 -10
  895. package/src/router/match-middleware/intercept-resolution.ts +9 -7
  896. package/src/router/match-middleware/segment-resolution.ts +61 -5
  897. package/src/router/match-result.ts +22 -15
  898. package/src/router/metrics.ts +238 -13
  899. package/src/router/middleware-types.ts +53 -12
  900. package/src/router/middleware.ts +172 -85
  901. package/src/router/navigation-snapshot.ts +182 -0
  902. package/src/router/pattern-matching.ts +20 -5
  903. package/src/router/prerender-match.ts +114 -10
  904. package/src/router/preview-match.ts +30 -102
  905. package/src/router/request-classification.ts +310 -0
  906. package/src/router/revalidation.ts +27 -7
  907. package/src/router/route-snapshot.ts +245 -0
  908. package/src/router/router-context.ts +6 -1
  909. package/src/router/router-interfaces.ts +50 -5
  910. package/src/router/router-options.ts +50 -19
  911. package/src/router/segment-resolution/fresh.ts +210 -19
  912. package/src/router/segment-resolution/helpers.ts +30 -25
  913. package/src/router/segment-resolution/loader-cache.ts +1 -0
  914. package/src/router/segment-resolution/revalidation.ts +448 -301
  915. package/src/router/segment-wrappers.ts +2 -0
  916. package/src/router/trie-matching.ts +20 -2
  917. package/src/router/types.ts +1 -0
  918. package/src/router.ts +88 -15
  919. package/src/rsc/handler.ts +550 -359
  920. package/src/rsc/index.ts +0 -20
  921. package/src/rsc/loader-fetch.ts +23 -3
  922. package/src/rsc/manifest-init.ts +5 -1
  923. package/src/rsc/progressive-enhancement.ts +35 -10
  924. package/src/rsc/rsc-rendering.ts +40 -44
  925. package/src/rsc/server-action.ts +22 -10
  926. package/src/rsc/ssr-setup.ts +128 -0
  927. package/src/rsc/types.ts +11 -1
  928. package/src/search-params.ts +16 -13
  929. package/src/segment-system.tsx +140 -4
  930. package/src/server/context.ts +148 -16
  931. package/src/server/handle-store.ts +19 -0
  932. package/src/server/loader-registry.ts +9 -8
  933. package/src/server/request-context.ts +223 -35
  934. package/src/server.ts +6 -0
  935. package/src/ssr/index.tsx +4 -0
  936. package/src/static-handler.ts +18 -6
  937. package/src/theme/index.ts +4 -13
  938. package/src/types/cache-types.ts +4 -4
  939. package/src/types/handler-context.ts +149 -49
  940. package/src/types/loader-types.ts +36 -9
  941. package/src/types/route-config.ts +17 -8
  942. package/src/types/route-entry.ts +8 -1
  943. package/src/types/segments.ts +2 -5
  944. package/src/urls/path-helper-types.ts +9 -2
  945. package/src/urls/path-helper.ts +48 -13
  946. package/src/urls/pattern-types.ts +12 -0
  947. package/src/urls/response-types.ts +16 -6
  948. package/src/use-loader.tsx +73 -4
  949. package/src/vite/discovery/bundle-postprocess.ts +61 -89
  950. package/src/vite/discovery/discover-routers.ts +23 -5
  951. package/src/vite/discovery/prerender-collection.ts +78 -15
  952. package/src/vite/discovery/state.ts +17 -13
  953. package/src/vite/index.ts +8 -3
  954. package/src/vite/plugin-types.ts +51 -79
  955. package/src/vite/plugins/client-ref-dedup.ts +115 -0
  956. package/src/vite/plugins/expose-action-id.ts +1 -3
  957. package/src/vite/plugins/expose-ids/handler-transform.ts +30 -0
  958. package/src/vite/plugins/expose-internal-ids.ts +122 -39
  959. package/src/vite/plugins/performance-tracks.ts +88 -0
  960. package/src/vite/plugins/refresh-cmd.ts +127 -0
  961. package/src/vite/plugins/version-plugin.ts +13 -1
  962. package/src/vite/rango.ts +174 -211
  963. package/src/vite/router-discovery.ts +194 -45
  964. package/src/vite/utils/banner.ts +3 -3
  965. package/src/vite/utils/prerender-utils.ts +78 -0
  966. package/src/vite/utils/shared-utils.ts +3 -2
  967. package/skills/testing/SKILL.md +0 -226
  968. package/src/route-definition/route-function.ts +0 -119
@@ -1,6 +1,6 @@
1
1
  // src/vite/rango.ts
2
2
  import { readFileSync as readFileSync7 } from "node:fs";
3
- import { resolve as resolve7 } from "node:path";
3
+ import { resolve as resolve9 } from "node:path";
4
4
 
5
5
  // src/vite/plugins/expose-action-id.ts
6
6
  import MagicString from "magic-string";
@@ -292,7 +292,7 @@ function exposeActionId() {
292
292
  }
293
293
  if (!rscPluginApi) {
294
294
  throw new Error(
295
- "[rsc-router] Could not find @vitejs/plugin-rsc. @rangojs/router requires the Vite RSC plugin.\nThe RSC plugin should be included automatically. If you disabled it with\nrango({ rsc: false }), add rsc() before rango() in your config."
295
+ "[rsc-router] Could not find @vitejs/plugin-rsc. @rangojs/router requires the Vite RSC plugin, which is included automatically by rango()."
296
296
  );
297
297
  }
298
298
  if (!isBuild) return;
@@ -910,9 +910,7 @@ function generateWholeFileStubs(cfg, bindings, code, filePath, isBuild) {
910
910
  });
911
911
  return { code: stubs.join("\n") + "\n", map: null };
912
912
  }
913
- function generateExprStubs(cfg, bindings, code, filePath, sourceId, isBuild) {
914
- if (bindings.length === 0) return null;
915
- const s = new MagicString2(code);
913
+ function stubHandlerExprs(cfg, bindings, s, filePath, isBuild) {
916
914
  let hasChanges = false;
917
915
  for (const binding of bindings) {
918
916
  const exportName = binding.exportNames[0];
@@ -924,15 +922,7 @@ function generateExprStubs(cfg, bindings, code, filePath, sourceId, isBuild) {
924
922
  );
925
923
  hasChanges = true;
926
924
  }
927
- if (!hasChanges) return null;
928
- return {
929
- code: s.toString(),
930
- map: s.generateMap({
931
- source: sourceId,
932
- includeContent: true,
933
- hires: "boundary"
934
- })
935
- };
925
+ return hasChanges;
936
926
  }
937
927
  function transformHandlerIds(cfg, bindings, s, filePath, isBuild) {
938
928
  let hasChanges = false;
@@ -1269,15 +1259,6 @@ ${lazyImports.join(",\n")}
1269
1259
  isBuild
1270
1260
  );
1271
1261
  if (wholeFile) return wholeFile;
1272
- const exprStubs = generateExprStubs(
1273
- PRERENDER_CONFIG,
1274
- bindings,
1275
- code,
1276
- filePath,
1277
- id,
1278
- isBuild
1279
- );
1280
- if (exprStubs) return exprStubs;
1281
1262
  }
1282
1263
  if (hasPrerenderHandlerCode && isRscEnv && isBuild) {
1283
1264
  const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
@@ -1329,15 +1310,57 @@ ${lazyImports.join(",\n")}
1329
1310
  isBuild
1330
1311
  );
1331
1312
  if (wholeFile) return wholeFile;
1332
- const exprStubs = generateExprStubs(
1333
- STATIC_CONFIG,
1334
- bindings,
1335
- code,
1336
- filePath,
1337
- id,
1338
- isBuild
1339
- );
1340
- if (exprStubs) return exprStubs;
1313
+ }
1314
+ if (!isRscEnv && (hasPrerenderHandlerCode || hasStaticHandlerCode)) {
1315
+ const allBindings = [];
1316
+ if (hasLoaderCode) {
1317
+ allBindings.push(...getBindings(code, getFnNames("createLoader")));
1318
+ }
1319
+ if (hasHandleCode) {
1320
+ allBindings.push(...getBindings(code, getFnNames("createHandle")));
1321
+ }
1322
+ if (hasLocationStateCode) {
1323
+ allBindings.push(
1324
+ ...getBindings(code, getFnNames("createLocationState"))
1325
+ );
1326
+ }
1327
+ if (hasPrerenderHandlerCode) {
1328
+ allBindings.push(
1329
+ ...getBindings(code, getFnNames(PRERENDER_CONFIG.fnName))
1330
+ );
1331
+ }
1332
+ if (hasStaticHandlerCode) {
1333
+ allBindings.push(
1334
+ ...getBindings(code, getFnNames(STATIC_CONFIG.fnName))
1335
+ );
1336
+ }
1337
+ if (allBindings.length > 0 && isExportOnlyFile(code, allBindings)) {
1338
+ const stubs = [];
1339
+ for (const binding of allBindings) {
1340
+ const name = binding.exportNames[0];
1341
+ const stubId = isBuild ? hashId(filePath, name) : `${filePath}#${name}`;
1342
+ const fnCall = code.slice(
1343
+ binding.callExprStart,
1344
+ binding.callOpenParenPos + 1
1345
+ );
1346
+ let brand = "loader";
1347
+ if (hasPrerenderHandlerCode && getFnNames(PRERENDER_CONFIG.fnName).some(
1348
+ (n) => fnCall.includes(n)
1349
+ )) {
1350
+ brand = PRERENDER_CONFIG.brand;
1351
+ } else if (hasStaticHandlerCode && getFnNames(STATIC_CONFIG.fnName).some((n) => fnCall.includes(n))) {
1352
+ brand = STATIC_CONFIG.brand;
1353
+ } else if (hasHandleCode && getFnNames("createHandle").some((n) => fnCall.includes(n))) {
1354
+ brand = "handle";
1355
+ } else if (hasLocationStateCode && getFnNames("createLocationState").some((n) => fnCall.includes(n))) {
1356
+ brand = "locationState";
1357
+ }
1358
+ stubs.push(
1359
+ `export const ${name} = { __brand: "${brand}", $$id: "${stubId}" };`
1360
+ );
1361
+ }
1362
+ return { code: stubs.join("\n") + "\n", map: null };
1363
+ }
1341
1364
  }
1342
1365
  if (hasStaticHandlerCode && isRscEnv && isBuild) {
1343
1366
  const fnNames = getFnNames(STATIC_CONFIG.fnName);
@@ -1372,25 +1395,41 @@ ${lazyImports.join(",\n")}
1372
1395
  isBuild
1373
1396
  ) || changed;
1374
1397
  }
1375
- if (hasPrerenderHandlerCode && isRscEnv) {
1398
+ if (hasPrerenderHandlerCode) {
1376
1399
  const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
1377
- changed = transformHandlerIds(
1378
- PRERENDER_CONFIG,
1379
- getBindings(code, fnNames),
1380
- s,
1381
- filePath,
1382
- isBuild
1383
- ) || changed;
1400
+ const bindings = getBindings(code, fnNames);
1401
+ if (isRscEnv) {
1402
+ changed = transformHandlerIds(
1403
+ PRERENDER_CONFIG,
1404
+ bindings,
1405
+ s,
1406
+ filePath,
1407
+ isBuild
1408
+ ) || changed;
1409
+ } else {
1410
+ changed = stubHandlerExprs(
1411
+ PRERENDER_CONFIG,
1412
+ bindings,
1413
+ s,
1414
+ filePath,
1415
+ isBuild
1416
+ ) || changed;
1417
+ }
1384
1418
  }
1385
- if (hasStaticHandlerCode && isRscEnv) {
1419
+ if (hasStaticHandlerCode) {
1386
1420
  const fnNames = getFnNames(STATIC_CONFIG.fnName);
1387
- changed = transformHandlerIds(
1388
- STATIC_CONFIG,
1389
- getBindings(code, fnNames),
1390
- s,
1391
- filePath,
1392
- isBuild
1393
- ) || changed;
1421
+ const bindings = getBindings(code, fnNames);
1422
+ if (isRscEnv) {
1423
+ changed = transformHandlerIds(
1424
+ STATIC_CONFIG,
1425
+ bindings,
1426
+ s,
1427
+ filePath,
1428
+ isBuild
1429
+ ) || changed;
1430
+ } else {
1431
+ changed = stubHandlerExprs(STATIC_CONFIG, bindings, s, filePath, isBuild) || changed;
1432
+ }
1394
1433
  }
1395
1434
  if (!changed) return;
1396
1435
  return {
@@ -1585,6 +1624,53 @@ function warnOnNearMissDirectives(ast, fileId, warn) {
1585
1624
  }
1586
1625
  }
1587
1626
 
1627
+ // src/vite/plugins/client-ref-dedup.ts
1628
+ var CLIENT_IN_SERVER_PROXY_PREFIX = "virtual:vite-rsc/client-in-server-package-proxy/";
1629
+ function extractPackageName(absolutePath) {
1630
+ const marker = "/node_modules/";
1631
+ const idx = absolutePath.lastIndexOf(marker);
1632
+ if (idx === -1) return null;
1633
+ const afterModules = absolutePath.slice(idx + marker.length);
1634
+ if (afterModules.startsWith("@")) {
1635
+ const parts = afterModules.split("/");
1636
+ if (parts.length < 2 || !parts[1]) return null;
1637
+ return `${parts[0]}/${parts[1]}`;
1638
+ }
1639
+ const name = afterModules.split("/")[0];
1640
+ return name || null;
1641
+ }
1642
+ function clientRefDedup() {
1643
+ let clientExclude = [];
1644
+ return {
1645
+ name: "@rangojs/router:client-ref-dedup",
1646
+ enforce: "pre",
1647
+ apply: "serve",
1648
+ configResolved(config) {
1649
+ const clientEnv = config.environments?.["client"];
1650
+ clientExclude = clientEnv?.optimizeDeps?.exclude ?? config.optimizeDeps?.exclude ?? [];
1651
+ },
1652
+ resolveId(source, importer, options) {
1653
+ if (this.environment?.name !== "client") return;
1654
+ if (!importer?.includes(CLIENT_IN_SERVER_PROXY_PREFIX)) return;
1655
+ if (!source.includes("/node_modules/")) return;
1656
+ if (!importer) return;
1657
+ const packageName = extractPackageName(source);
1658
+ if (!packageName) return;
1659
+ if (clientExclude.includes(packageName)) return;
1660
+ return `\0rango:dedup/${packageName}`;
1661
+ },
1662
+ load(id) {
1663
+ if (!id.startsWith("\0rango:dedup/")) return;
1664
+ const packageName = id.slice("\0rango:dedup/".length);
1665
+ return [
1666
+ `export * from ${JSON.stringify(packageName)};`,
1667
+ `import * as __all__ from ${JSON.stringify(packageName)};`,
1668
+ `export default __all__.default;`
1669
+ ].join("\n");
1670
+ }
1671
+ };
1672
+ }
1673
+
1588
1674
  // src/vite/plugins/virtual-entries.ts
1589
1675
  var VIRTUAL_ENTRY_BROWSER = `
1590
1676
  import {
@@ -1698,7 +1784,7 @@ import { resolve } from "node:path";
1698
1784
  // package.json
1699
1785
  var package_default = {
1700
1786
  name: "@rangojs/router",
1701
- version: "0.0.0-experimental.19",
1787
+ version: "0.0.0-experimental.1db96a9e",
1702
1788
  description: "Django-inspired RSC router with composable URL patterns",
1703
1789
  keywords: [
1704
1790
  "react",
@@ -1729,7 +1815,7 @@ var package_default = {
1729
1815
  "!src/**/*.test.tsx",
1730
1816
  "dist",
1731
1817
  "skills",
1732
- "CLAUDE.md",
1818
+ "AGENTS.md",
1733
1819
  "README.md"
1734
1820
  ],
1735
1821
  type: "module",
@@ -1840,7 +1926,7 @@ var package_default = {
1840
1926
  "test:unit:watch": "vitest"
1841
1927
  },
1842
1928
  dependencies: {
1843
- "@vitejs/plugin-rsc": "^0.5.14",
1929
+ "@vitejs/plugin-rsc": "^0.5.19",
1844
1930
  "magic-string": "^0.30.17",
1845
1931
  picomatch: "^4.0.3",
1846
1932
  "rsc-html-stream": "^0.0.7"
@@ -2048,55 +2134,7 @@ declare global {
2048
2134
  }
2049
2135
 
2050
2136
  // src/build/route-types/scan-filter.ts
2051
- import { join, relative } from "node:path";
2052
- import { readdirSync } from "node:fs";
2053
2137
  import picomatch from "picomatch";
2054
- var DEFAULT_EXCLUDE_PATTERNS = [
2055
- "**/__tests__/**",
2056
- "**/__mocks__/**",
2057
- "**/dist/**",
2058
- "**/coverage/**",
2059
- "**/*.test.{ts,tsx,js,jsx}",
2060
- "**/*.spec.{ts,tsx,js,jsx}"
2061
- ];
2062
- function createScanFilter(root, opts) {
2063
- const { include, exclude } = opts;
2064
- const hasInclude = include && include.length > 0;
2065
- const hasCustomExclude = exclude !== void 0;
2066
- if (!hasInclude && !hasCustomExclude) return void 0;
2067
- const effectiveExclude = exclude ?? DEFAULT_EXCLUDE_PATTERNS;
2068
- const includeMatcher = hasInclude ? picomatch(include) : null;
2069
- const excludeMatcher = effectiveExclude.length > 0 ? picomatch(effectiveExclude) : null;
2070
- return (absolutePath) => {
2071
- const rel = relative(root, absolutePath);
2072
- if (excludeMatcher && excludeMatcher(rel)) return false;
2073
- if (includeMatcher) return includeMatcher(rel);
2074
- return true;
2075
- };
2076
- }
2077
- function findTsFiles(dir, filter) {
2078
- const results = [];
2079
- let entries;
2080
- try {
2081
- entries = readdirSync(dir, { withFileTypes: true });
2082
- } catch (err) {
2083
- console.warn(
2084
- `[rsc-router] Failed to scan directory ${dir}: ${err.message}`
2085
- );
2086
- return results;
2087
- }
2088
- for (const entry of entries) {
2089
- const fullPath = join(dir, entry.name);
2090
- if (entry.isDirectory()) {
2091
- if (entry.name === "node_modules" || entry.name.startsWith(".")) continue;
2092
- results.push(...findTsFiles(fullPath, filter));
2093
- } else if ((entry.name.endsWith(".ts") || entry.name.endsWith(".tsx") || entry.name.endsWith(".js") || entry.name.endsWith(".jsx")) && !entry.name.includes(".gen.")) {
2094
- if (filter && !filter(fullPath)) continue;
2095
- results.push(fullPath);
2096
- }
2097
- }
2098
- return results;
2099
- }
2100
2138
 
2101
2139
  // src/build/route-types/per-module-writer.ts
2102
2140
  import ts4 from "typescript";
@@ -2318,7 +2356,7 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
2318
2356
  }
2319
2357
  return routeMap;
2320
2358
  }
2321
- function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut) {
2359
+ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut, inlineBlock) {
2322
2360
  visited = visited ?? /* @__PURE__ */ new Set();
2323
2361
  const realPath = resolve2(filePath);
2324
2362
  const key = variableName ? `${realPath}:${variableName}` : realPath;
@@ -2334,7 +2372,9 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
2334
2372
  return { routes: {}, searchSchemas: {} };
2335
2373
  }
2336
2374
  let block;
2337
- if (variableName) {
2375
+ if (inlineBlock) {
2376
+ block = inlineBlock;
2377
+ } else if (variableName) {
2338
2378
  const extracted = extractUrlsBlockForVariable(source, variableName);
2339
2379
  if (!extracted) return { routes: {}, searchSchemas: {} };
2340
2380
  block = extracted;
@@ -2355,8 +2395,20 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
2355
2395
  }
2356
2396
 
2357
2397
  // src/build/route-types/router-processing.ts
2358
- import { readFileSync as readFileSync2, writeFileSync, existsSync as existsSync3, unlinkSync } from "node:fs";
2359
- import { join as join2, dirname as dirname2, resolve as resolve3, basename as pathBasename } from "node:path";
2398
+ import {
2399
+ readFileSync as readFileSync2,
2400
+ writeFileSync,
2401
+ existsSync as existsSync3,
2402
+ unlinkSync,
2403
+ readdirSync
2404
+ } from "node:fs";
2405
+ import {
2406
+ join,
2407
+ dirname as dirname2,
2408
+ resolve as resolve3,
2409
+ sep,
2410
+ basename as pathBasename
2411
+ } from "node:path";
2360
2412
  import ts5 from "typescript";
2361
2413
  function countPublicRouteEntries(source) {
2362
2414
  const matches = source.matchAll(/^\s+(?:"([^"]+)"|([a-zA-Z_$][^:]*)):\s*["{]/gm) ?? [];
@@ -2369,7 +2421,79 @@ function countPublicRouteEntries(source) {
2369
2421
  }
2370
2422
  return count;
2371
2423
  }
2372
- function extractUrlsVariableFromRouter(code) {
2424
+ var ROUTER_CALL_PATTERN = /\bcreateRouter\s*[<(]/;
2425
+ function isRoutableSourceFile(name) {
2426
+ return (name.endsWith(".ts") || name.endsWith(".tsx") || name.endsWith(".js") || name.endsWith(".jsx")) && !name.includes(".gen.") && !name.includes(".test.") && !name.includes(".spec.");
2427
+ }
2428
+ function findRouterFilesRecursive(dir, filter, results) {
2429
+ let entries;
2430
+ try {
2431
+ entries = readdirSync(dir, { withFileTypes: true });
2432
+ } catch (err) {
2433
+ console.warn(
2434
+ `[rsc-router] Failed to scan directory ${dir}: ${err.message}`
2435
+ );
2436
+ return;
2437
+ }
2438
+ const childDirs = [];
2439
+ const routerFilesInDir = [];
2440
+ for (const entry of entries) {
2441
+ const fullPath = join(dir, entry.name);
2442
+ if (entry.isDirectory()) {
2443
+ if (entry.name === "node_modules" || entry.name === "dist" || entry.name === "coverage" || entry.name === "__tests__" || entry.name === "__mocks__" || entry.name.startsWith("."))
2444
+ continue;
2445
+ childDirs.push(fullPath);
2446
+ continue;
2447
+ }
2448
+ if (!isRoutableSourceFile(entry.name)) continue;
2449
+ if (filter && !filter(fullPath)) continue;
2450
+ try {
2451
+ const source = readFileSync2(fullPath, "utf-8");
2452
+ if (ROUTER_CALL_PATTERN.test(source)) {
2453
+ routerFilesInDir.push(fullPath);
2454
+ }
2455
+ } catch {
2456
+ continue;
2457
+ }
2458
+ }
2459
+ if (routerFilesInDir.length > 0) {
2460
+ results.push(...routerFilesInDir);
2461
+ return;
2462
+ }
2463
+ for (const childDir of childDirs) {
2464
+ findRouterFilesRecursive(childDir, filter, results);
2465
+ }
2466
+ }
2467
+ function findNestedRouterConflict(routerFiles) {
2468
+ const routerDirs = [
2469
+ ...new Set(routerFiles.map((filePath) => dirname2(resolve3(filePath))))
2470
+ ].sort((a, b) => a.length - b.length);
2471
+ for (let i = 0; i < routerDirs.length; i++) {
2472
+ const ancestorDir = routerDirs[i];
2473
+ const prefix = ancestorDir.endsWith(sep) ? ancestorDir : `${ancestorDir}${sep}`;
2474
+ for (let j = i + 1; j < routerDirs.length; j++) {
2475
+ const nestedDir = routerDirs[j];
2476
+ if (!nestedDir.startsWith(prefix)) continue;
2477
+ const ancestorFile = routerFiles.find(
2478
+ (filePath) => dirname2(resolve3(filePath)) === ancestorDir
2479
+ );
2480
+ const nestedFile = routerFiles.find(
2481
+ (filePath) => dirname2(resolve3(filePath)) === nestedDir
2482
+ );
2483
+ if (ancestorFile && nestedFile) {
2484
+ return { ancestor: ancestorFile, nested: nestedFile };
2485
+ }
2486
+ }
2487
+ }
2488
+ return null;
2489
+ }
2490
+ function formatNestedRouterConflictError(conflict, prefix = "[rsc-router]") {
2491
+ return `${prefix} Nested router roots are not supported.
2492
+ Router root: ${conflict.ancestor}
2493
+ Nested router: ${conflict.nested}
2494
+ Move the nested router into a sibling directory or configure it as a separate app root.`;
2495
+ }
2496
+ function extractUrlsFromRouter(code) {
2373
2497
  const sourceFile = ts5.createSourceFile(
2374
2498
  "router.tsx",
2375
2499
  code,
@@ -2383,24 +2507,70 @@ function extractUrlsVariableFromRouter(code) {
2383
2507
  const callee = node.expression;
2384
2508
  return ts5.isIdentifier(callee) && callee.text === "createRouter";
2385
2509
  }
2510
+ function isInlineBuilder(node) {
2511
+ return ts5.isArrowFunction(node) || ts5.isFunctionExpression(node);
2512
+ }
2513
+ function isRoutesOnCreateRouter(node) {
2514
+ if (!ts5.isPropertyAccessExpression(node.expression) || node.expression.name.text !== "routes")
2515
+ return false;
2516
+ let inner = node.expression.expression;
2517
+ while (ts5.isCallExpression(inner) && ts5.isPropertyAccessExpression(inner.expression)) {
2518
+ inner = inner.expression.expression;
2519
+ }
2520
+ return isCreateRouterCall(inner);
2521
+ }
2386
2522
  function visit(node) {
2387
2523
  if (result) return;
2388
- if (ts5.isCallExpression(node) && ts5.isPropertyAccessExpression(node.expression) && node.expression.name.text === "routes" && node.arguments.length >= 1 && ts5.isIdentifier(node.arguments[0])) {
2389
- let inner = node.expression.expression;
2390
- while (ts5.isCallExpression(inner) && ts5.isPropertyAccessExpression(inner.expression)) {
2391
- inner = inner.expression.expression;
2392
- }
2393
- if (isCreateRouterCall(inner)) {
2394
- result = node.arguments[0].text;
2395
- return;
2524
+ if (ts5.isCallExpression(node) && node.arguments.length >= 1 && isRoutesOnCreateRouter(node)) {
2525
+ const arg = node.arguments[0];
2526
+ if (ts5.isIdentifier(arg)) {
2527
+ result = { kind: "variable", name: arg.text };
2528
+ } else if (isInlineBuilder(arg)) {
2529
+ result = { kind: "inline", block: arg.getText(sourceFile) };
2396
2530
  }
2531
+ return;
2397
2532
  }
2398
2533
  if (isCreateRouterCall(node)) {
2399
2534
  const callExpr = node;
2400
- for (const arg of callExpr.arguments) {
2535
+ for (const callArg of callExpr.arguments) {
2536
+ if (ts5.isObjectLiteralExpression(callArg)) {
2537
+ for (const prop of callArg.properties) {
2538
+ if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "urls") {
2539
+ if (ts5.isIdentifier(prop.initializer)) {
2540
+ result = { kind: "variable", name: prop.initializer.text };
2541
+ } else if (isInlineBuilder(prop.initializer)) {
2542
+ result = {
2543
+ kind: "inline",
2544
+ block: prop.initializer.getText(sourceFile)
2545
+ };
2546
+ }
2547
+ return;
2548
+ }
2549
+ }
2550
+ }
2551
+ }
2552
+ }
2553
+ ts5.forEachChild(node, visit);
2554
+ }
2555
+ visit(sourceFile);
2556
+ return result;
2557
+ }
2558
+ function extractBasenameFromRouter(code) {
2559
+ const sourceFile = ts5.createSourceFile(
2560
+ "router.tsx",
2561
+ code,
2562
+ ts5.ScriptTarget.Latest,
2563
+ true,
2564
+ ts5.ScriptKind.TSX
2565
+ );
2566
+ let result;
2567
+ function visit(node) {
2568
+ if (result !== void 0) return;
2569
+ if (ts5.isCallExpression(node) && ts5.isIdentifier(node.expression) && node.expression.text === "createRouter") {
2570
+ for (const arg of node.arguments) {
2401
2571
  if (ts5.isObjectLiteralExpression(arg)) {
2402
2572
  for (const prop of arg.properties) {
2403
- if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "urls" && ts5.isIdentifier(prop.initializer)) {
2573
+ if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "basename" && ts5.isStringLiteral(prop.initializer)) {
2404
2574
  result = prop.initializer.text;
2405
2575
  return;
2406
2576
  }
@@ -2413,6 +2583,19 @@ function extractUrlsVariableFromRouter(code) {
2413
2583
  visit(sourceFile);
2414
2584
  return result;
2415
2585
  }
2586
+ function applyBasenameToRoutes(result, basename3) {
2587
+ const prefixed = {};
2588
+ for (const [name, pattern] of Object.entries(result.routes)) {
2589
+ if (pattern === "/") {
2590
+ prefixed[name] = basename3;
2591
+ } else if (basename3.endsWith("/") && pattern.startsWith("/")) {
2592
+ prefixed[name] = basename3 + pattern.slice(1);
2593
+ } else {
2594
+ prefixed[name] = basename3 + pattern;
2595
+ }
2596
+ }
2597
+ return { routes: prefixed, searchSchemas: result.searchSchemas };
2598
+ }
2416
2599
  function buildCombinedRouteMapForRouterFile(routerFilePath) {
2417
2600
  let routerSource;
2418
2601
  try {
@@ -2420,39 +2603,49 @@ function buildCombinedRouteMapForRouterFile(routerFilePath) {
2420
2603
  } catch {
2421
2604
  return { routes: {}, searchSchemas: {} };
2422
2605
  }
2423
- const urlsVarName = extractUrlsVariableFromRouter(routerSource);
2424
- if (!urlsVarName) {
2606
+ const extraction = extractUrlsFromRouter(routerSource);
2607
+ if (!extraction) {
2425
2608
  return { routes: {}, searchSchemas: {} };
2426
2609
  }
2427
- const imported = resolveImportedVariable(routerSource, urlsVarName);
2428
- if (imported) {
2429
- const targetFile = resolveImportPath(imported.specifier, routerFilePath);
2430
- if (!targetFile) {
2431
- return { routes: {}, searchSchemas: {} };
2610
+ const rawBasename = extractBasenameFromRouter(routerSource);
2611
+ const basename3 = rawBasename ? ("/" + rawBasename.replace(/^\/+|\/+$/g, "")).replace(/^\/$/, "") : void 0;
2612
+ let result;
2613
+ if (extraction.kind === "inline") {
2614
+ result = buildCombinedRouteMapWithSearch(
2615
+ routerFilePath,
2616
+ void 0,
2617
+ void 0,
2618
+ void 0,
2619
+ extraction.block
2620
+ );
2621
+ } else {
2622
+ const imported = resolveImportedVariable(routerSource, extraction.name);
2623
+ if (imported) {
2624
+ const targetFile = resolveImportPath(imported.specifier, routerFilePath);
2625
+ if (!targetFile) {
2626
+ return { routes: {}, searchSchemas: {} };
2627
+ }
2628
+ result = buildCombinedRouteMapWithSearch(
2629
+ targetFile,
2630
+ imported.exportedName
2631
+ );
2632
+ } else {
2633
+ result = buildCombinedRouteMapWithSearch(routerFilePath, extraction.name);
2432
2634
  }
2433
- return buildCombinedRouteMapWithSearch(targetFile, imported.exportedName);
2434
2635
  }
2435
- return buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
2636
+ if (basename3) {
2637
+ result = applyBasenameToRoutes(result, basename3);
2638
+ }
2639
+ return result;
2436
2640
  }
2437
2641
  function findRouterFiles(root, filter) {
2438
- const files = findTsFiles(root, filter);
2439
2642
  const result = [];
2440
- for (const filePath of files) {
2441
- if (filePath.includes(".gen.")) continue;
2442
- try {
2443
- const source = readFileSync2(filePath, "utf-8");
2444
- if (/\bcreateRouter\s*[<(]/.test(source)) {
2445
- result.push(filePath);
2446
- }
2447
- } catch {
2448
- continue;
2449
- }
2450
- }
2643
+ findRouterFilesRecursive(root, filter, result);
2451
2644
  return result;
2452
2645
  }
2453
2646
  function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
2454
2647
  try {
2455
- const oldCombinedPath = join2(root, "src", "named-routes.gen.ts");
2648
+ const oldCombinedPath = join(root, "src", "named-routes.gen.ts");
2456
2649
  if (existsSync3(oldCombinedPath)) {
2457
2650
  unlinkSync(oldCombinedPath);
2458
2651
  console.log(
@@ -2463,32 +2656,26 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
2463
2656
  }
2464
2657
  const routerFilePaths = knownRouterFiles ?? findRouterFiles(root);
2465
2658
  if (routerFilePaths.length === 0) return;
2659
+ const nestedRouterConflict = findNestedRouterConflict(routerFilePaths);
2660
+ if (nestedRouterConflict) {
2661
+ throw new Error(formatNestedRouterConflictError(nestedRouterConflict));
2662
+ }
2466
2663
  for (const routerFilePath of routerFilePaths) {
2467
- let routerSource;
2468
- try {
2469
- routerSource = readFileSync2(routerFilePath, "utf-8");
2470
- } catch {
2471
- continue;
2472
- }
2473
- const urlsVarName = extractUrlsVariableFromRouter(routerSource);
2474
- if (!urlsVarName) continue;
2475
- let result;
2476
- const imported = resolveImportedVariable(routerSource, urlsVarName);
2477
- if (imported) {
2478
- const targetFile = resolveImportPath(imported.specifier, routerFilePath);
2479
- if (!targetFile) continue;
2480
- result = buildCombinedRouteMapWithSearch(
2481
- targetFile,
2482
- imported.exportedName
2483
- );
2484
- } else {
2485
- result = buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
2664
+ const result = buildCombinedRouteMapForRouterFile(routerFilePath);
2665
+ if (Object.keys(result.routes).length === 0 && Object.keys(result.searchSchemas).length === 0) {
2666
+ let routerSource;
2667
+ try {
2668
+ routerSource = readFileSync2(routerFilePath, "utf-8");
2669
+ } catch {
2670
+ continue;
2671
+ }
2672
+ if (!extractUrlsFromRouter(routerSource)) continue;
2486
2673
  }
2487
2674
  const routerBasename = pathBasename(routerFilePath).replace(
2488
2675
  /\.(tsx?|jsx?)$/,
2489
2676
  ""
2490
2677
  );
2491
- const outPath = join2(
2678
+ const outPath = join(
2492
2679
  dirname2(routerFilePath),
2493
2680
  `${routerBasename}.named-routes.gen.ts`
2494
2681
  );
@@ -2618,8 +2805,9 @@ function createVersionPlugin() {
2618
2805
  let isDev = false;
2619
2806
  let server = null;
2620
2807
  const clientModuleSignatures = /* @__PURE__ */ new Map();
2808
+ let versionCounter = 0;
2621
2809
  const bumpVersion = (reason) => {
2622
- currentVersion = Date.now().toString(16);
2810
+ currentVersion = Date.now().toString(16) + String(++versionCounter);
2623
2811
  console.log(`[rsc-router] ${reason}, version updated: ${currentVersion}`);
2624
2812
  const rscEnv = server?.environments?.rsc;
2625
2813
  const versionMod = rscEnv?.moduleGraph?.getModuleById(
@@ -2675,6 +2863,9 @@ function createVersionPlugin() {
2675
2863
  if (!isDev) return;
2676
2864
  const isRscModule = this.environment?.name === "rsc";
2677
2865
  if (!isRscModule) return;
2866
+ if (ctx.modules.length === 1 && ctx.modules[0].id === "\0" + VIRTUAL_IDS.version) {
2867
+ return;
2868
+ }
2678
2869
  if (isCodeModule(ctx.file)) {
2679
2870
  const filePath = normalizeModuleId(ctx.file);
2680
2871
  const previousSignature = clientModuleSignatures.get(filePath);
@@ -2704,6 +2895,68 @@ function createVersionPlugin() {
2704
2895
 
2705
2896
  // src/vite/utils/shared-utils.ts
2706
2897
  import * as Vite from "vite";
2898
+
2899
+ // src/vite/plugins/performance-tracks.ts
2900
+ import { readFile } from "node:fs/promises";
2901
+ var RSDW_PATCH_RE = /((?:var|let|const)\s+\w+\s*=\s*root\._children\s*,\s*(\w+)\s*=\s*root\._debugInfo\s*[;,])/;
2902
+ function buildPatchReplacement(match, debugInfoVar) {
2903
+ return `${match}
2904
+ if (${debugInfoVar} && 0 === ${debugInfoVar}.length && "fulfilled" === root.status) {
2905
+ var _resolved = "function" === typeof resolveLazy ? resolveLazy(root.value) : root.value;
2906
+ if ("object" === typeof _resolved && null !== _resolved && isArrayImpl(_resolved._debugInfo)) {
2907
+ ${debugInfoVar} = _resolved._debugInfo;
2908
+ }
2909
+ }`;
2910
+ }
2911
+ function patchRsdwClientDebugInfoRecovery(code) {
2912
+ const match = code.match(RSDW_PATCH_RE);
2913
+ if (!match) {
2914
+ return { code, debugInfoVar: null };
2915
+ }
2916
+ return {
2917
+ code: code.replace(match[1], buildPatchReplacement(match[1], match[2])),
2918
+ debugInfoVar: match[2]
2919
+ };
2920
+ }
2921
+ function performanceTracksOptimizeDepsPlugin() {
2922
+ return {
2923
+ name: "@rangojs/router:performance-tracks-optimize-deps",
2924
+ setup(build) {
2925
+ build.onLoad(
2926
+ {
2927
+ filter: /react-server-dom-webpack-client\.browser\.(development|production)\.js$/
2928
+ },
2929
+ async (args) => {
2930
+ const code = await readFile(args.path, "utf8");
2931
+ const patched = patchRsdwClientDebugInfoRecovery(code);
2932
+ return {
2933
+ contents: patched.code,
2934
+ loader: "js"
2935
+ };
2936
+ }
2937
+ );
2938
+ }
2939
+ };
2940
+ }
2941
+ function performanceTracksPlugin() {
2942
+ return {
2943
+ name: "@rangojs/router:performance-tracks",
2944
+ transform(code, id) {
2945
+ if (!id.includes("react-server-dom") || !id.includes("client")) return;
2946
+ const patched = patchRsdwClientDebugInfoRecovery(code);
2947
+ if (!patched.debugInfoVar) return;
2948
+ if (process.env.INTERNAL_RANGO_DEBUG)
2949
+ console.log(
2950
+ "[perf-tracks] patched RSDW client (var:",
2951
+ patched.debugInfoVar,
2952
+ ")"
2953
+ );
2954
+ return patched.code;
2955
+ }
2956
+ };
2957
+ }
2958
+
2959
+ // src/vite/utils/shared-utils.ts
2707
2960
  var versionEsbuildPlugin = {
2708
2961
  name: "@rangojs/router-version",
2709
2962
  setup(build) {
@@ -2721,7 +2974,7 @@ var versionEsbuildPlugin = {
2721
2974
  }
2722
2975
  };
2723
2976
  var sharedEsbuildOptions = {
2724
- plugins: [versionEsbuildPlugin]
2977
+ plugins: [versionEsbuildPlugin, performanceTracksOptimizeDepsPlugin()]
2725
2978
  };
2726
2979
  function createVirtualEntriesPlugin(entries, routerPathRef) {
2727
2980
  const virtualModules = {};
@@ -2804,11 +3057,11 @@ ${dim} \u2571${reset} ${bold}\u2554\u2550\u2557${reset}${dim} * \u2
2804
3057
  ${dim} ${reset}${bold}\u2551 \u2551${reset} ${bold}\u2554\u2550\u2557${reset}${dim} * \u2727. \u2571${reset}
2805
3058
  ${dim} ${reset}${bold}\u2554\u2557 \u2551 \u2551 \u2551 \u2551${reset}${dim} * \u2571${reset}
2806
3059
  ${dim} ${reset}${bold}\u2551\u2551 \u2551 \u2551 \u2551 \u2551 \u2566\u2550\u2557\u2554\u2550\u2557\u2554\u2557\u2554\u2554\u2550\u2557\u2554\u2550\u2557${reset}${dim} \u2727 \u2726${reset}
2807
- ${dim} ${reset}${bold}\u2550\u2563\u2551 \u2551 \u2560\u2550\u255D \u2551 \u2560\u2566\u255D\u2560\u2550\u2563\u2551\u2551\u2551\u2551 \u2566\u2551 \u2551${reset}${dim} * \u2727${reset}
3060
+ ${dim} ${reset}${bold}\u2551\u2551 \u2551 \u2560\u2550\u255D \u2551 \u2560\u2566\u255D\u2560\u2550\u2563\u2551\u2551\u2551\u2551 \u2566\u2551 \u2551${reset}${dim} * \u2727${reset}
2808
3061
  ${dim} ${reset}${bold}\u2551\u255A\u2550\u255D \u2554\u2550\u2550\u2550\u255D \u2569\u255A\u2550\u2569 \u2569\u255D\u255A\u255D\u255A\u2550\u255D\u255A\u2550\u255D${reset}${dim} \u2726 . *${reset}
2809
3062
  ${dim} ${reset}${bold}\u255A\u2550\u2550\u2557 \u2551${reset}${dim} * RSC Wrangler \u2727 \u2726${reset}
2810
- ${dim} * ${reset}${bold}\u2551 \u2560\u2550${reset}${dim} * \u2727. \u2571${reset}
2811
- ${bold}\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550${reset}${dim} \u2726 *${reset}
3063
+ ${dim} * ${reset}${bold}\u2551 \u2551${reset}${dim} * \u2727. \u2571${reset}
3064
+ ${dim} ${reset}${bold}\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550${reset}${dim} \u2726 *${reset}
2812
3065
 
2813
3066
  v${version} \xB7 ${preset} \xB7 ${mode}
2814
3067
  `;
@@ -2925,7 +3178,10 @@ function createCjsToEsmPlugin() {
2925
3178
 
2926
3179
  // src/vite/router-discovery.ts
2927
3180
  import { createServer as createViteServer } from "vite";
3181
+ import { resolve as resolve8 } from "node:path";
2928
3182
  import { readFileSync as readFileSync6 } from "node:fs";
3183
+ import { createRequire } from "node:module";
3184
+ import { pathToFileURL } from "node:url";
2929
3185
 
2930
3186
  // src/vite/plugins/virtual-stub-plugin.ts
2931
3187
  function createVirtualStubPlugin() {
@@ -2952,7 +3208,7 @@ function createVirtualStubPlugin() {
2952
3208
  }
2953
3209
 
2954
3210
  // src/vite/plugins/client-ref-hashing.ts
2955
- import { relative as relative2 } from "node:path";
3211
+ import { relative } from "node:path";
2956
3212
  import { createHash as createHash2 } from "node:crypto";
2957
3213
  var CLIENT_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-package-proxy/";
2958
3214
  var CLIENT_IN_SERVER_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-in-server-package-proxy/";
@@ -2965,10 +3221,10 @@ function computeProductionHash(projectRoot, refKey) {
2965
3221
  const absPath = decodeURIComponent(
2966
3222
  refKey.slice(CLIENT_IN_SERVER_PKG_PROXY_PREFIX.length)
2967
3223
  );
2968
- toHash = relative2(projectRoot, absPath).replaceAll("\\", "/");
3224
+ toHash = relative(projectRoot, absPath).replaceAll("\\", "/");
2969
3225
  } else if (refKey.startsWith(FS_PREFIX)) {
2970
3226
  const absPath = refKey.slice(FS_PREFIX.length - 1);
2971
- toHash = relative2(projectRoot, absPath).replaceAll("\\", "/");
3227
+ toHash = relative(projectRoot, absPath).replaceAll("\\", "/");
2972
3228
  } else if (refKey.startsWith("/")) {
2973
3229
  toHash = refKey.slice(1);
2974
3230
  } else {
@@ -3107,10 +3363,10 @@ function createDiscoveryState(entryPath, opts) {
3107
3363
  perRouterTrieMap: /* @__PURE__ */ new Map(),
3108
3364
  perRouterPrecomputedMap: /* @__PURE__ */ new Map(),
3109
3365
  perRouterManifestDataMap: /* @__PURE__ */ new Map(),
3110
- prerenderCollectedData: null,
3111
- staticCollectedData: null,
3112
- handlerChunkInfo: null,
3113
- staticHandlerChunkInfo: null,
3366
+ prerenderManifestEntries: null,
3367
+ staticManifestEntries: null,
3368
+ handlerChunkInfoMap: /* @__PURE__ */ new Map(),
3369
+ staticHandlerChunkInfoMap: /* @__PURE__ */ new Map(),
3114
3370
  rscEntryFileName: null,
3115
3371
  resolvedPrerenderModules: void 0,
3116
3372
  resolvedStaticModules: void 0,
@@ -3193,8 +3449,17 @@ function jsonParseExpression(value) {
3193
3449
  }
3194
3450
 
3195
3451
  // src/context-var.ts
3452
+ var NON_CACHEABLE_KEYS = /* @__PURE__ */ Symbol.for(
3453
+ "rango:non-cacheable-keys"
3454
+ );
3455
+ function getNonCacheableKeys(variables) {
3456
+ if (!variables[NON_CACHEABLE_KEYS]) {
3457
+ variables[NON_CACHEABLE_KEYS] = /* @__PURE__ */ new Set();
3458
+ }
3459
+ return variables[NON_CACHEABLE_KEYS];
3460
+ }
3196
3461
  var FORBIDDEN_KEYS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
3197
- function contextSet(variables, keyOrVar, value) {
3462
+ function contextSet(variables, keyOrVar, value, options) {
3198
3463
  if (typeof keyOrVar === "string") {
3199
3464
  if (FORBIDDEN_KEYS.has(keyOrVar)) {
3200
3465
  throw new Error(
@@ -3202,12 +3467,28 @@ function contextSet(variables, keyOrVar, value) {
3202
3467
  );
3203
3468
  }
3204
3469
  variables[keyOrVar] = value;
3470
+ if (options?.cache === false) {
3471
+ getNonCacheableKeys(variables).add(keyOrVar);
3472
+ }
3205
3473
  } else {
3206
3474
  variables[keyOrVar.key] = value;
3475
+ if (options?.cache === false) {
3476
+ getNonCacheableKeys(variables).add(keyOrVar.key);
3477
+ }
3207
3478
  }
3208
3479
  }
3209
3480
 
3210
3481
  // src/vite/utils/prerender-utils.ts
3482
+ import { createHash as createHash4 } from "node:crypto";
3483
+ import {
3484
+ copyFileSync,
3485
+ existsSync as existsSync4,
3486
+ mkdirSync,
3487
+ rmSync,
3488
+ statSync,
3489
+ writeFileSync as writeFileSync2
3490
+ } from "node:fs";
3491
+ import { resolve as resolve5 } from "node:path";
3211
3492
  function escapeRegExp2(str) {
3212
3493
  return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
3213
3494
  }
@@ -3216,6 +3497,7 @@ function encodePathParam(value) {
3216
3497
  }
3217
3498
  function substituteRouteParams(pattern, params, encode = encodeURIComponent) {
3218
3499
  let result = pattern;
3500
+ let hadOmittedOptional = false;
3219
3501
  for (const [key, value] of Object.entries(params)) {
3220
3502
  const escaped = escapeRegExp2(key);
3221
3503
  result = result.replace(
@@ -3224,6 +3506,15 @@ function substituteRouteParams(pattern, params, encode = encodeURIComponent) {
3224
3506
  );
3225
3507
  result = result.replace(`*${key}`, encode(value));
3226
3508
  }
3509
+ result = result.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)(\([^)]*\))?\?/g, () => {
3510
+ hadOmittedOptional = true;
3511
+ return "";
3512
+ });
3513
+ if (hadOmittedOptional) {
3514
+ const hadTrailingSlash = pattern.length > 1 && pattern.endsWith("/");
3515
+ result = result.replace(/\/\/+/g, "/").replace(/\/+$/, "") || "/";
3516
+ if (hadTrailingSlash && !result.endsWith("/")) result += "/";
3517
+ }
3227
3518
  return result;
3228
3519
  }
3229
3520
  async function runWithConcurrency(items, concurrency, fn) {
@@ -3286,6 +3577,37 @@ function notifyOnError(registry, error, phase, routeKey, pathname, skipped) {
3286
3577
  break;
3287
3578
  }
3288
3579
  }
3580
+ function getStagedAssetDir(projectRoot) {
3581
+ return resolve5(projectRoot, "node_modules/.rangojs-router-build/rsc-assets");
3582
+ }
3583
+ function resetStagedBuildAssets(projectRoot) {
3584
+ rmSync(getStagedAssetDir(projectRoot), { recursive: true, force: true });
3585
+ }
3586
+ function stageBuildAssetModule(projectRoot, prefix, exportValue) {
3587
+ const stagedDir = getStagedAssetDir(projectRoot);
3588
+ mkdirSync(stagedDir, { recursive: true });
3589
+ const contentHash = createHash4("sha256").update(exportValue).digest("hex").slice(0, 8);
3590
+ const fileName = `${prefix}-${contentHash}.js`;
3591
+ const filePath = resolve5(stagedDir, fileName);
3592
+ if (!existsSync4(filePath)) {
3593
+ writeFileSync2(filePath, `export default ${exportValue};
3594
+ `);
3595
+ }
3596
+ return fileName;
3597
+ }
3598
+ function copyStagedBuildAssets(projectRoot, fileNames) {
3599
+ const stagedDir = getStagedAssetDir(projectRoot);
3600
+ const distAssetsDir = resolve5(projectRoot, "dist/rsc/assets");
3601
+ mkdirSync(distAssetsDir, { recursive: true });
3602
+ let totalBytes = 0;
3603
+ for (const fileName of new Set(fileNames)) {
3604
+ const stagedPath = resolve5(stagedDir, fileName);
3605
+ const distPath = resolve5(distAssetsDir, fileName);
3606
+ copyFileSync(stagedPath, distPath);
3607
+ totalBytes += statSync(stagedPath).size;
3608
+ }
3609
+ return totalBytes;
3610
+ }
3289
3611
 
3290
3612
  // src/vite/discovery/prerender-collection.ts
3291
3613
  async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
@@ -3301,14 +3623,33 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3301
3623
  if (!params) return pattern;
3302
3624
  return substituteRouteParams(pattern, params);
3303
3625
  };
3626
+ let resolvedRoutes = 0;
3627
+ let totalDynamic = 0;
3628
+ for (const { manifest } of allManifests) {
3629
+ if (!manifest.prerenderRoutes) continue;
3630
+ for (const routeName of manifest.prerenderRoutes) {
3631
+ const pattern = manifest.routeManifest[routeName];
3632
+ if (pattern && (pattern.includes(":") || pattern.includes("*"))) {
3633
+ totalDynamic++;
3634
+ }
3635
+ }
3636
+ }
3637
+ const paramsStart = performance.now();
3638
+ const progressInterval = totalDynamic > 0 ? setInterval(() => {
3639
+ const elapsed = ((performance.now() - paramsStart) / 1e3).toFixed(1);
3640
+ console.log(
3641
+ `[rsc-router] Resolving prerender params... ${resolvedRoutes}/${totalDynamic} routes (${elapsed}s)`
3642
+ );
3643
+ }, 5e3) : void 0;
3304
3644
  for (const { manifest } of allManifests) {
3305
3645
  if (!manifest.prerenderRoutes) continue;
3306
3646
  const defs = manifest._prerenderDefs || {};
3647
+ const passthroughSet = new Set(manifest.passthroughRoutes || []);
3307
3648
  for (const routeName of manifest.prerenderRoutes) {
3308
3649
  const pattern = manifest.routeManifest[routeName];
3309
3650
  if (!pattern) continue;
3310
3651
  const def = defs[routeName];
3311
- const isPassthroughRoute = !!def?.options?.passthrough;
3652
+ const isPassthroughRoute = passthroughSet.has(routeName);
3312
3653
  const hasDynamic = pattern.includes(":") || pattern.includes("*");
3313
3654
  if (!hasDynamic) {
3314
3655
  entries.push({
@@ -3321,12 +3662,20 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3321
3662
  if (def?.getParams) {
3322
3663
  try {
3323
3664
  const buildVars = {};
3665
+ const buildEnv = state.resolvedBuildEnv;
3324
3666
  const getParamsCtx = {
3325
3667
  build: true,
3668
+ dev: !state.isBuildMode,
3326
3669
  set: ((keyOrVar, value) => {
3327
3670
  contextSet(buildVars, keyOrVar, value);
3328
3671
  }),
3329
- reverse: getParamsReverse
3672
+ reverse: getParamsReverse,
3673
+ get env() {
3674
+ if (buildEnv !== void 0) return buildEnv;
3675
+ throw new Error(
3676
+ "[rsc-router] ctx.env is not available during build-time getParams(). Configure buildEnv in your rango() plugin options to enable build-time env access."
3677
+ );
3678
+ }
3330
3679
  };
3331
3680
  const paramsList = await def.getParams(getParamsCtx);
3332
3681
  const concurrency = def.options?.concurrency ?? 1;
@@ -3351,7 +3700,9 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3351
3700
  isPassthroughRoute
3352
3701
  });
3353
3702
  }
3703
+ resolvedRoutes++;
3354
3704
  } catch (err) {
3705
+ resolvedRoutes++;
3355
3706
  if (err.name === "Skip") {
3356
3707
  console.log(
3357
3708
  `[rsc-router] SKIP route "${routeName}" - ${err.message}`
@@ -3380,6 +3731,7 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3380
3731
  }
3381
3732
  }
3382
3733
  }
3734
+ if (progressInterval) clearInterval(progressInterval);
3383
3735
  if (entries.length === 0) return;
3384
3736
  const maxConcurrency = Math.max(...entries.map((e) => e.concurrency));
3385
3737
  const concurrencyNote = maxConcurrency > 1 ? ` (concurrency: ${maxConcurrency})` : "";
@@ -3387,7 +3739,7 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3387
3739
  `[rsc-router] Pre-rendering ${entries.length} URL(s)${concurrencyNote}...`
3388
3740
  );
3389
3741
  const { hashParams } = await rscEnv.runner.import("@rangojs/router/build");
3390
- const collectedData = {};
3742
+ const manifestEntries = {};
3391
3743
  let doneCount = 0;
3392
3744
  let skipCount = 0;
3393
3745
  const startTotal = performance.now();
@@ -3405,7 +3757,8 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3405
3757
  entry.urlPath,
3406
3758
  {},
3407
3759
  entry.buildVars,
3408
- entry.isPassthroughRoute
3760
+ entry.isPassthroughRoute,
3761
+ state.resolvedBuildEnv
3409
3762
  );
3410
3763
  if (!result) continue;
3411
3764
  if (result.passthrough) {
@@ -3417,18 +3770,30 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3417
3770
  break;
3418
3771
  }
3419
3772
  const paramHash = hashParams(result.params || {});
3420
- collectedData[`${result.routeName}/${paramHash}`] = {
3773
+ const mainKey = `${result.routeName}/${paramHash}`;
3774
+ const mainValue = JSON.stringify({
3421
3775
  segments: result.segments,
3422
3776
  handles: result.handles
3423
- };
3777
+ });
3778
+ manifestEntries[mainKey] = stageBuildAssetModule(
3779
+ state.projectRoot,
3780
+ "__pr",
3781
+ mainValue
3782
+ );
3424
3783
  if (result.interceptSegments?.length) {
3425
- collectedData[`${result.routeName}/${paramHash}/i`] = {
3784
+ const interceptKey = `${result.routeName}/${paramHash}/i`;
3785
+ const interceptValue = JSON.stringify({
3426
3786
  segments: [...result.segments, ...result.interceptSegments],
3427
3787
  handles: {
3428
3788
  ...result.handles,
3429
3789
  ...result.interceptHandles || {}
3430
3790
  }
3431
- };
3791
+ });
3792
+ manifestEntries[interceptKey] = stageBuildAssetModule(
3793
+ state.projectRoot,
3794
+ "__pr",
3795
+ interceptValue
3796
+ );
3432
3797
  }
3433
3798
  const elapsed = (performance.now() - startUrl).toFixed(0);
3434
3799
  console.log(
@@ -3472,7 +3837,7 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3472
3837
  }
3473
3838
  const totalElapsed = (performance.now() - startTotal).toFixed(0);
3474
3839
  if (doneCount > 0) {
3475
- state.prerenderCollectedData = collectedData;
3840
+ state.prerenderManifestEntries = manifestEntries;
3476
3841
  }
3477
3842
  const parts = [`${doneCount} done`];
3478
3843
  if (skipCount > 0) parts.push(`${skipCount} skipped`);
@@ -3483,7 +3848,7 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3483
3848
  async function renderStaticHandlers(state, rscEnv, registry) {
3484
3849
  if (!state.opts?.enableBuildPrerender || !state.isBuildMode || !state.resolvedStaticModules?.size)
3485
3850
  return;
3486
- const collected = {};
3851
+ const manifestEntries = {};
3487
3852
  let staticDone = 0;
3488
3853
  let staticSkip = 0;
3489
3854
  let totalStaticCount = 0;
@@ -3517,10 +3882,18 @@ async function renderStaticHandlers(state, rscEnv, registry) {
3517
3882
  const result = await routerInstance.renderStaticSegment(
3518
3883
  def.handler,
3519
3884
  def.$$id,
3520
- def.$$routePrefix
3885
+ def.$$routePrefix,
3886
+ state.resolvedBuildEnv,
3887
+ !state.isBuildMode
3521
3888
  );
3522
3889
  if (result) {
3523
- collected[def.$$id] = result;
3890
+ const hasHandles = Object.keys(result.handles).length > 0;
3891
+ const exportValue = hasHandles ? JSON.stringify(result) : JSON.stringify(result.encoded);
3892
+ manifestEntries[def.$$id] = stageBuildAssetModule(
3893
+ state.projectRoot,
3894
+ "__st",
3895
+ exportValue
3896
+ );
3524
3897
  const elapsed = (performance.now() - startHandler).toFixed(0);
3525
3898
  console.log(
3526
3899
  `[rsc-router] OK ${name.padEnd(40)} (${elapsed}ms)`
@@ -3557,7 +3930,7 @@ async function renderStaticHandlers(state, rscEnv, registry) {
3557
3930
  }
3558
3931
  const totalStaticElapsed = (performance.now() - startStatic).toFixed(0);
3559
3932
  if (staticDone > 0) {
3560
- state.staticCollectedData = collected;
3933
+ state.staticManifestEntries = manifestEntries;
3561
3934
  }
3562
3935
  const staticParts = [`${staticDone} done`];
3563
3936
  if (staticSkip > 0) staticParts.push(`${staticSkip} skipped`);
@@ -3574,8 +3947,7 @@ async function discoverRouters(state, rscEnv) {
3574
3947
  let registry = serverMod.RouterRegistry;
3575
3948
  if (!registry || registry.size === 0) {
3576
3949
  try {
3577
- const hostMod = await rscEnv.runner.import("@rangojs/router/host");
3578
- const hostRegistry = hostMod.HostRouterRegistry;
3950
+ const hostRegistry = serverMod.HostRouterRegistry;
3579
3951
  if (hostRegistry && hostRegistry.size > 0) {
3580
3952
  console.log(
3581
3953
  `[rsc-router] Found ${hostRegistry.size} host router(s), resolving lazy handlers...`
@@ -3615,6 +3987,14 @@ async function discoverRouters(state, rscEnv) {
3615
3987
  }
3616
3988
  const buildMod = await rscEnv.runner.import("@rangojs/router/build");
3617
3989
  const generateManifestFull = buildMod.generateManifestFull;
3990
+ const nestedRouterConflict = findNestedRouterConflict(
3991
+ [...registry.values()].map((router) => router.__sourceFile).filter(
3992
+ (sourceFile) => typeof sourceFile === "string"
3993
+ )
3994
+ );
3995
+ if (nestedRouterConflict) {
3996
+ throw new Error(formatNestedRouterConflictError(nestedRouterConflict));
3997
+ }
3618
3998
  const newMergedRouteManifest = {};
3619
3999
  const newMergedPrecomputedEntries = [];
3620
4000
  const newPerRouterManifests = [];
@@ -3629,7 +4009,11 @@ async function discoverRouters(state, rscEnv) {
3629
4009
  if (!router.urlpatterns || !generateManifestFull) {
3630
4010
  continue;
3631
4011
  }
3632
- const manifest = generateManifestFull(router.urlpatterns, routerMountIndex);
4012
+ const manifest = generateManifestFull(
4013
+ router.urlpatterns,
4014
+ routerMountIndex,
4015
+ router.__basename ? { urlPrefix: router.__basename } : void 0
4016
+ );
3633
4017
  routerMountIndex++;
3634
4018
  allManifests.push({ id, manifest });
3635
4019
  const routeCount = Object.keys(manifest.routeManifest).length;
@@ -3771,8 +4155,8 @@ async function discoverRouters(state, rscEnv) {
3771
4155
  }
3772
4156
 
3773
4157
  // src/vite/discovery/route-types-writer.ts
3774
- import { dirname as dirname3, basename, join as join3, resolve as resolve5 } from "node:path";
3775
- import { readFileSync as readFileSync4, writeFileSync as writeFileSync2, existsSync as existsSync4, unlinkSync as unlinkSync2 } from "node:fs";
4158
+ import { dirname as dirname3, basename, join as join2, resolve as resolve6 } from "node:path";
4159
+ import { readFileSync as readFileSync4, writeFileSync as writeFileSync3, existsSync as existsSync5, unlinkSync as unlinkSync2 } from "node:fs";
3776
4160
  function filterUserNamedRoutes(manifest) {
3777
4161
  const filtered = {};
3778
4162
  for (const [name, pattern] of Object.entries(manifest)) {
@@ -3792,7 +4176,7 @@ function writeCombinedRouteTypesWithTracking(state, opts) {
3792
4176
  /\.(tsx?|jsx?)$/,
3793
4177
  ""
3794
4178
  );
3795
- const outPath = join3(routerDir, `${routerBasename}.named-routes.gen.ts`);
4179
+ const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
3796
4180
  try {
3797
4181
  preContent.set(outPath, readFileSync4(outPath, "utf-8"));
3798
4182
  } catch {
@@ -3805,8 +4189,8 @@ function writeCombinedRouteTypesWithTracking(state, opts) {
3805
4189
  /\.(tsx?|jsx?)$/,
3806
4190
  ""
3807
4191
  );
3808
- const outPath = join3(routerDir, `${routerBasename}.named-routes.gen.ts`);
3809
- if (!existsSync4(outPath)) continue;
4192
+ const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
4193
+ if (!existsSync5(outPath)) continue;
3810
4194
  try {
3811
4195
  const content = readFileSync4(outPath, "utf-8");
3812
4196
  if (content !== preContent.get(outPath)) {
@@ -3820,10 +4204,10 @@ function writeRouteTypesFiles(state) {
3820
4204
  if (state.perRouterManifests.length === 0) return;
3821
4205
  try {
3822
4206
  const entryDir = dirname3(
3823
- resolve5(state.projectRoot, state.resolvedEntryPath)
4207
+ resolve6(state.projectRoot, state.resolvedEntryPath)
3824
4208
  );
3825
- const oldCombinedPath = join3(entryDir, "named-routes.gen.ts");
3826
- if (existsSync4(oldCombinedPath)) {
4209
+ const oldCombinedPath = join2(entryDir, "named-routes.gen.ts");
4210
+ if (existsSync5(oldCombinedPath)) {
3827
4211
  unlinkSync2(oldCombinedPath);
3828
4212
  console.log(
3829
4213
  `[rsc-router] Removed stale combined route types: ${oldCombinedPath}`
@@ -3847,7 +4231,7 @@ Set an explicit \`id\` on createRouter() or check the call site.`
3847
4231
  }
3848
4232
  const routerDir = dirname3(sourceFile);
3849
4233
  const routerBasename = basename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
3850
- const outPath = join3(routerDir, `${routerBasename}.named-routes.gen.ts`);
4234
+ const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
3851
4235
  const userRoutes = filterUserNamedRoutes(routeManifest);
3852
4236
  let effectiveSearchSchemas = routeSearchSchemas;
3853
4237
  if ((!effectiveSearchSchemas || Object.keys(effectiveSearchSchemas).length === 0) && sourceFile) {
@@ -3867,10 +4251,10 @@ Set an explicit \`id\` on createRouter() or check the call site.`
3867
4251
  userRoutes,
3868
4252
  effectiveSearchSchemas && Object.keys(effectiveSearchSchemas).length > 0 ? effectiveSearchSchemas : void 0
3869
4253
  );
3870
- const existing = existsSync4(outPath) ? readFileSync4(outPath, "utf-8") : null;
4254
+ const existing = existsSync5(outPath) ? readFileSync4(outPath, "utf-8") : null;
3871
4255
  if (existing !== source) {
3872
4256
  markSelfGenWrite(state, outPath, source);
3873
- writeFileSync2(outPath, source);
4257
+ writeFileSync3(outPath, source);
3874
4258
  console.log(`[rsc-router] Generated route types -> ${outPath}`);
3875
4259
  }
3876
4260
  }
@@ -3912,21 +4296,21 @@ function supplementGenFilesWithRuntimeRoutes(state) {
3912
4296
  }
3913
4297
  const routerDir = dirname3(sourceFile);
3914
4298
  const routerBasename = basename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
3915
- const outPath = join3(routerDir, `${routerBasename}.named-routes.gen.ts`);
4299
+ const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
3916
4300
  const source = generateRouteTypesSource(
3917
4301
  mergedRoutes,
3918
4302
  Object.keys(mergedSearchSchemas).length > 0 ? mergedSearchSchemas : void 0
3919
4303
  );
3920
- const existing = existsSync4(outPath) ? readFileSync4(outPath, "utf-8") : null;
4304
+ const existing = existsSync5(outPath) ? readFileSync4(outPath, "utf-8") : null;
3921
4305
  if (existing !== source) {
3922
4306
  markSelfGenWrite(state, outPath, source);
3923
- writeFileSync2(outPath, source);
4307
+ writeFileSync3(outPath, source);
3924
4308
  }
3925
4309
  }
3926
4310
  }
3927
4311
 
3928
4312
  // src/vite/discovery/virtual-module-codegen.ts
3929
- import { dirname as dirname4, basename as basename2, join as join4 } from "node:path";
4313
+ import { dirname as dirname4, basename as basename2, join as join3 } from "node:path";
3930
4314
  function generateRoutesManifestModule(state) {
3931
4315
  const hasManifest = state.mergedRouteManifest && Object.keys(state.mergedRouteManifest).length > 0;
3932
4316
  if (hasManifest) {
@@ -3941,7 +4325,7 @@ function generateRoutesManifestModule(state) {
3941
4325
  /\.(tsx?|jsx?)$/,
3942
4326
  ""
3943
4327
  );
3944
- const genPath = join4(
4328
+ const genPath = join3(
3945
4329
  routerDir,
3946
4330
  `${routerBasename}.named-routes.gen.js`
3947
4331
  ).replaceAll("\\", "/");
@@ -4038,7 +4422,7 @@ function generatePerRouterModule(state, routerId) {
4038
4422
  /\.(tsx?|jsx?)$/,
4039
4423
  ""
4040
4424
  );
4041
- const genPath = join4(
4425
+ const genPath = join3(
4042
4426
  routerDir,
4043
4427
  `${routerBasename}.named-routes.gen.js`
4044
4428
  ).replaceAll("\\", "/");
@@ -4065,100 +4449,90 @@ function generatePerRouterModule(state, routerId) {
4065
4449
  }
4066
4450
 
4067
4451
  // src/vite/discovery/bundle-postprocess.ts
4068
- import { resolve as resolve6 } from "node:path";
4069
- import { createHash as createHash4 } from "node:crypto";
4070
- import { readFileSync as readFileSync5, writeFileSync as writeFileSync3, existsSync as existsSync5, mkdirSync } from "node:fs";
4452
+ import { resolve as resolve7 } from "node:path";
4453
+ import { readFileSync as readFileSync5, writeFileSync as writeFileSync4, existsSync as existsSync6 } from "node:fs";
4071
4454
  function postprocessBundle(state) {
4072
- const hasPrerenderData = state.prerenderCollectedData && Object.keys(state.prerenderCollectedData).length > 0;
4073
- const hasStaticData = state.staticCollectedData && Object.keys(state.staticCollectedData).length > 0;
4455
+ const hasPrerenderData = state.prerenderManifestEntries && Object.keys(state.prerenderManifestEntries).length > 0;
4456
+ const hasStaticData = state.staticManifestEntries && Object.keys(state.staticManifestEntries).length > 0;
4074
4457
  if (!hasPrerenderData && !hasStaticData) return;
4075
- const rscEntryPath = resolve6(
4458
+ const rscEntryPath = resolve7(
4076
4459
  state.projectRoot,
4077
4460
  "dist/rsc",
4078
4461
  state.rscEntryFileName ?? "index.js"
4079
4462
  );
4080
4463
  const evictionTargets = [
4081
4464
  {
4082
- info: state.handlerChunkInfo,
4465
+ infos: state.handlerChunkInfoMap.values(),
4083
4466
  fnName: "Prerender",
4084
4467
  brand: "prerenderHandler",
4085
4468
  label: "handler code from RSC bundle"
4086
4469
  },
4087
4470
  {
4088
- info: state.staticHandlerChunkInfo,
4471
+ infos: state.staticHandlerChunkInfoMap.values(),
4089
4472
  fnName: "Static",
4090
4473
  brand: "staticHandler",
4091
4474
  label: "static handler code"
4092
4475
  }
4093
4476
  ];
4094
4477
  for (const target of evictionTargets) {
4095
- if (!target.info) continue;
4096
- const chunkPath = resolve6(
4097
- state.projectRoot,
4098
- "dist/rsc",
4099
- target.info.fileName
4100
- );
4101
- try {
4102
- const code = readFileSync5(chunkPath, "utf-8");
4103
- const result = evictHandlerCode(
4104
- code,
4105
- target.info.exports,
4106
- target.fnName,
4107
- target.brand
4108
- );
4109
- if (result) {
4110
- writeFileSync3(chunkPath, result.code);
4111
- const savedKB = (result.savedBytes / 1024).toFixed(1);
4112
- console.log(
4113
- `[rsc-router] Evicted ${target.label} (${savedKB} KB saved): ${target.info.fileName}`
4478
+ for (const info of target.infos) {
4479
+ const chunkPath = resolve7(state.projectRoot, "dist/rsc", info.fileName);
4480
+ try {
4481
+ const code = readFileSync5(chunkPath, "utf-8");
4482
+ const result = evictHandlerCode(
4483
+ code,
4484
+ info.exports,
4485
+ target.fnName,
4486
+ target.brand
4487
+ );
4488
+ if (result) {
4489
+ writeFileSync4(chunkPath, result.code);
4490
+ const savedKB = (result.savedBytes / 1024).toFixed(1);
4491
+ console.log(
4492
+ `[rsc-router] Evicted ${target.label} (${savedKB} KB saved): ${info.fileName}`
4493
+ );
4494
+ }
4495
+ } catch (replaceErr) {
4496
+ console.warn(
4497
+ `[rsc-router] Failed to evict ${target.label}: ${replaceErr.message}`
4114
4498
  );
4115
4499
  }
4116
- } catch (replaceErr) {
4117
- console.warn(
4118
- `[rsc-router] Failed to evict ${target.label}: ${replaceErr.message}`
4119
- );
4120
4500
  }
4121
4501
  }
4122
- state.handlerChunkInfo = null;
4123
- state.staticHandlerChunkInfo = null;
4124
- if (hasPrerenderData && existsSync5(rscEntryPath)) {
4502
+ state.handlerChunkInfoMap.clear();
4503
+ state.staticHandlerChunkInfoMap.clear();
4504
+ if (hasPrerenderData && existsSync6(rscEntryPath)) {
4125
4505
  const rscCode = readFileSync5(rscEntryPath, "utf-8");
4126
4506
  if (!rscCode.includes("__prerender-manifest.js")) {
4127
4507
  try {
4128
- const assetsDir = resolve6(state.projectRoot, "dist/rsc/assets");
4129
- mkdirSync(assetsDir, { recursive: true });
4130
- const manifestEntries = [];
4131
- let totalBytes = 0;
4132
- for (const [key, entry] of Object.entries(
4133
- state.prerenderCollectedData
4508
+ let totalBytes = copyStagedBuildAssets(
4509
+ state.projectRoot,
4510
+ Object.values(state.prerenderManifestEntries)
4511
+ );
4512
+ const manifestMap = {};
4513
+ for (const [key, assetFileName] of Object.entries(
4514
+ state.prerenderManifestEntries
4134
4515
  )) {
4135
- const entryJson = JSON.stringify(entry);
4136
- const contentHash = createHash4("sha256").update(entryJson).digest("hex").slice(0, 8);
4137
- const assetFileName = `__pr-${contentHash}.js`;
4138
- const assetPath = resolve6(assetsDir, assetFileName);
4139
- const assetCode = `export default ${entryJson};
4140
- `;
4141
- writeFileSync3(assetPath, assetCode);
4142
- totalBytes += Buffer.byteLength(assetCode);
4143
- manifestEntries.push(
4144
- `${JSON.stringify(key)}:()=>import("./assets/${assetFileName}")`
4145
- );
4516
+ manifestMap[key] = `./assets/${assetFileName}`;
4146
4517
  }
4147
- const manifestCode = `const m={${manifestEntries.join(",")}};export default m;
4148
- `;
4149
- const manifestPath = resolve6(
4518
+ const manifestCode = [
4519
+ `const m=JSON.parse('${JSON.stringify(manifestMap).replace(/'/g, "\\'")}');`,
4520
+ `export function loadPrerenderAsset(s){return import(s)}`,
4521
+ `export default m;`,
4522
+ ""
4523
+ ].join("\n");
4524
+ const manifestPath = resolve7(
4150
4525
  state.projectRoot,
4151
4526
  "dist/rsc/__prerender-manifest.js"
4152
4527
  );
4153
- writeFileSync3(manifestPath, manifestCode);
4528
+ writeFileSync4(manifestPath, manifestCode);
4154
4529
  totalBytes += Buffer.byteLength(manifestCode);
4155
- const injection = `import __pm from "./__prerender-manifest.js";
4156
- globalThis.__PRERENDER_MANIFEST = __pm;
4530
+ const injection = `globalThis.__loadPrerenderManifestModule = () => import("./__prerender-manifest.js");
4157
4531
  `;
4158
- writeFileSync3(rscEntryPath, injection + rscCode);
4532
+ writeFileSync4(rscEntryPath, injection + rscCode);
4159
4533
  const totalKB = (totalBytes / 1024).toFixed(1);
4160
4534
  console.log(
4161
- `[rsc-router] Wrote prerender assets (${totalKB} KB total, ${Object.keys(state.prerenderCollectedData).length} entries)`
4535
+ `[rsc-router] Wrote prerender assets (${totalKB} KB total, ${Object.keys(state.prerenderManifestEntries).length} entries)`
4162
4536
  );
4163
4537
  } catch (err) {
4164
4538
  throw new Error(
@@ -4167,44 +4541,36 @@ globalThis.__PRERENDER_MANIFEST = __pm;
4167
4541
  }
4168
4542
  }
4169
4543
  }
4170
- if (hasStaticData && existsSync5(rscEntryPath)) {
4544
+ if (hasStaticData && existsSync6(rscEntryPath)) {
4171
4545
  const rscCode = readFileSync5(rscEntryPath, "utf-8");
4172
- if (!rscCode.includes("__STATIC_MANIFEST")) {
4546
+ if (!rscCode.includes("__static-manifest.js")) {
4173
4547
  try {
4174
- const assetsDir = resolve6(state.projectRoot, "dist/rsc/assets");
4175
- mkdirSync(assetsDir, { recursive: true });
4176
4548
  const manifestEntries = [];
4177
- let totalBytes = 0;
4178
- for (const [handlerId, { encoded, handles }] of Object.entries(
4179
- state.staticCollectedData
4549
+ let totalBytes = copyStagedBuildAssets(
4550
+ state.projectRoot,
4551
+ Object.values(state.staticManifestEntries)
4552
+ );
4553
+ for (const [handlerId, assetFileName] of Object.entries(
4554
+ state.staticManifestEntries
4180
4555
  )) {
4181
- const hasHandles = Object.keys(handles).length > 0;
4182
- const exportValue = hasHandles ? JSON.stringify({ encoded, handles }) : JSON.stringify(encoded);
4183
- const contentHash = createHash4("sha256").update(exportValue).digest("hex").slice(0, 8);
4184
- const assetFileName = `__st-${contentHash}.js`;
4185
- const assetPath = resolve6(assetsDir, assetFileName);
4186
- const assetCode = `export default ${exportValue};
4187
- `;
4188
- writeFileSync3(assetPath, assetCode);
4189
- totalBytes += Buffer.byteLength(assetCode);
4190
4556
  manifestEntries.push(
4191
4557
  `${JSON.stringify(handlerId)}:()=>import("./assets/${assetFileName}")`
4192
4558
  );
4193
4559
  }
4194
4560
  const manifestCode = `const m={${manifestEntries.join(",")}};globalThis.__STATIC_MANIFEST=m;export default m;
4195
4561
  `;
4196
- const manifestPath = resolve6(
4562
+ const manifestPath = resolve7(
4197
4563
  state.projectRoot,
4198
4564
  "dist/rsc/__static-manifest.js"
4199
4565
  );
4200
- writeFileSync3(manifestPath, manifestCode);
4566
+ writeFileSync4(manifestPath, manifestCode);
4201
4567
  totalBytes += Buffer.byteLength(manifestCode);
4202
4568
  const injection = `import "./__static-manifest.js";
4203
4569
  `;
4204
- writeFileSync3(rscEntryPath, injection + rscCode);
4570
+ writeFileSync4(rscEntryPath, injection + rscCode);
4205
4571
  const totalKB = (totalBytes / 1024).toFixed(1);
4206
4572
  console.log(
4207
- `[rsc-router] Wrote static assets (${totalKB} KB total, ${Object.keys(state.staticCollectedData).length} entries)`
4573
+ `[rsc-router] Wrote static assets (${totalKB} KB total, ${Object.keys(state.staticManifestEntries).length} entries)`
4208
4574
  );
4209
4575
  } catch (err) {
4210
4576
  throw new Error(
@@ -4246,8 +4612,67 @@ async function createTempRscServer(state, options = {}) {
4246
4612
  ]
4247
4613
  });
4248
4614
  }
4615
+ async function resolveBuildEnv(option, factoryCtx) {
4616
+ if (!option) return null;
4617
+ if (option === "auto") {
4618
+ if (factoryCtx.preset !== "cloudflare") {
4619
+ throw new Error(
4620
+ '[rsc-router] buildEnv: "auto" is only supported with preset: "cloudflare". Use a factory function or plain object for other presets.'
4621
+ );
4622
+ }
4623
+ try {
4624
+ const userRequire = createRequire(
4625
+ resolve8(factoryCtx.root, "package.json")
4626
+ );
4627
+ const wranglerPath = userRequire.resolve("wrangler");
4628
+ const { getPlatformProxy } = await import(pathToFileURL(wranglerPath).href);
4629
+ const proxy = await getPlatformProxy();
4630
+ return {
4631
+ env: proxy.env,
4632
+ dispose: proxy.dispose
4633
+ };
4634
+ } catch (err) {
4635
+ throw new Error(
4636
+ `[rsc-router] buildEnv: "auto" requires wrangler to be installed.
4637
+ Install it with: pnpm add -D wrangler
4638
+ ${err.message}`
4639
+ );
4640
+ }
4641
+ }
4642
+ if (typeof option === "function") {
4643
+ return await option(factoryCtx);
4644
+ }
4645
+ return { env: option };
4646
+ }
4647
+ async function acquireBuildEnv(s, command, mode) {
4648
+ const option = s.opts?.buildEnv;
4649
+ if (!option) return false;
4650
+ const result = await resolveBuildEnv(option, {
4651
+ root: s.projectRoot,
4652
+ mode,
4653
+ command,
4654
+ preset: s.opts?.preset ?? "node"
4655
+ });
4656
+ if (!result) return false;
4657
+ s.resolvedBuildEnv = result.env;
4658
+ s.buildEnvDispose = result.dispose ?? null;
4659
+ return true;
4660
+ }
4661
+ async function releaseBuildEnv(s) {
4662
+ if (s.buildEnvDispose) {
4663
+ try {
4664
+ await s.buildEnvDispose();
4665
+ } catch (err) {
4666
+ console.warn(`[rsc-router] buildEnv dispose failed: ${err.message}`);
4667
+ }
4668
+ s.buildEnvDispose = null;
4669
+ }
4670
+ s.resolvedBuildEnv = void 0;
4671
+ }
4249
4672
  function createRouterDiscoveryPlugin(entryPath, opts) {
4250
4673
  const s = createDiscoveryState(entryPath, opts);
4674
+ let viteCommand = "build";
4675
+ let viteMode = "production";
4251
4676
  return {
4252
4677
  name: "@rangojs/router:discovery",
4253
4678
  config() {
@@ -4256,31 +4681,13 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
4256
4681
  __RANGO_DEBUG__: JSON.stringify(!!process.env.INTERNAL_RANGO_DEBUG)
4257
4682
  }
4258
4683
  };
4259
- if (opts?.enableBuildPrerender) {
4260
- config.environments = {
4261
- rsc: {
4262
- build: {
4263
- rollupOptions: {
4264
- output: {
4265
- manualChunks(id) {
4266
- if (s.resolvedPrerenderModules?.has(id)) {
4267
- return "__prerender-handlers";
4268
- }
4269
- if (s.resolvedStaticModules?.has(id)) {
4270
- return "__static-handlers";
4271
- }
4272
- }
4273
- }
4274
- }
4275
- }
4276
- }
4277
- };
4278
- }
4279
4684
  return config;
4280
4685
  },
4281
4686
  configResolved(config) {
4282
4687
  s.projectRoot = config.root;
4283
4688
  s.isBuildMode = config.command === "build";
4689
+ viteCommand = config.command;
4690
+ viteMode = config.mode;
4284
4691
  s.userResolveAlias = config.resolve.alias;
4285
4692
  if (!s.resolvedEntryPath && opts?.routerPathRef?.path) {
4286
4693
  s.resolvedEntryPath = opts.routerPathRef.path;
@@ -4294,12 +4701,6 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
4294
4701
  s.resolvedEntryPath = entries[0];
4295
4702
  }
4296
4703
  }
4297
- if (opts?.include || opts?.exclude) {
4298
- s.scanFilter = createScanFilter(s.projectRoot, {
4299
- include: opts.include,
4300
- exclude: opts.exclude
4301
- });
4302
- }
4303
4704
  if (opts?.staticRouteTypesGeneration !== false) {
4304
4705
  s.cachedRouterFiles = findRouterFiles(s.projectRoot, s.scanFilter);
4305
4706
  writeCombinedRouteTypesWithTracking(s, { preserveIfLarger: true });
@@ -4319,8 +4720,8 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
4319
4720
  if (globalThis.__rscRouterDiscoveryActive) return;
4320
4721
  s.devServer = server;
4321
4722
  let resolveDiscovery;
4322
- const discoveryPromise = new Promise((resolve8) => {
4323
- resolveDiscovery = resolve8;
4723
+ const discoveryPromise = new Promise((resolve10) => {
4724
+ resolveDiscovery = resolve10;
4324
4725
  });
4325
4726
  const getDevServerOrigin = () => server.resolvedUrls?.local?.[0]?.replace(/\/$/, "") || `http://localhost:${server.config.server.port || 5173}`;
4326
4727
  let prerenderTempServer = null;
@@ -4331,6 +4732,8 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
4331
4732
  });
4332
4733
  prerenderTempServer = null;
4333
4734
  }
4735
+ releaseBuildEnv(s).catch(() => {
4736
+ });
4334
4737
  });
4335
4738
  async function getOrCreateTempServer() {
4336
4739
  if (prerenderNodeRegistry) {
@@ -4361,6 +4764,7 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
4361
4764
  if (!rscEnv?.runner) {
4362
4765
  s.devServerOrigin = getDevServerOrigin();
4363
4766
  try {
4767
+ await acquireBuildEnv(s, viteCommand, viteMode);
4364
4768
  const tempRscEnv = await getOrCreateTempServer();
4365
4769
  if (tempRscEnv) {
4366
4770
  await discoverRouters(s, tempRscEnv);
@@ -4376,6 +4780,7 @@ ${err.stack}`
4376
4780
  return;
4377
4781
  }
4378
4782
  try {
4783
+ await acquireBuildEnv(s, viteCommand, viteMode);
4379
4784
  const serverMod = await rscEnv.runner.import(
4380
4785
  "@rangojs/router/server"
4381
4786
  );
@@ -4395,8 +4800,8 @@ ${err.stack}`
4395
4800
  resolveDiscovery();
4396
4801
  }
4397
4802
  };
4398
- s.discoveryDone = new Promise((resolve8) => {
4399
- setTimeout(() => discover().then(resolve8, resolve8), 0);
4803
+ s.discoveryDone = new Promise((resolve10) => {
4804
+ setTimeout(() => discover().then(resolve10, resolve10), 0);
4400
4805
  });
4401
4806
  let mainRegistry = null;
4402
4807
  const propagateDiscoveryState = async (rscEnv) => {
@@ -4440,7 +4845,26 @@ ${err.stack}`
4440
4845
  res.end("Missing pathname");
4441
4846
  return;
4442
4847
  }
4443
- let registry = mainRegistry;
4848
+ const rscEnv = server.environments?.rsc;
4849
+ let registry = null;
4850
+ if (rscEnv?.runner && s.resolvedEntryPath) {
4851
+ try {
4852
+ await rscEnv.runner.import(s.resolvedEntryPath);
4853
+ const serverMod = await rscEnv.runner.import(
4854
+ "@rangojs/router/server"
4855
+ );
4856
+ registry = serverMod.RouterRegistry ?? null;
4857
+ } catch (err) {
4858
+ console.warn(
4859
+ `[rsc-router] Dev prerender module refresh failed: ${err.message}`
4860
+ );
4861
+ res.statusCode = 500;
4862
+ res.end(`Prerender handler error: ${err.message}`);
4863
+ return;
4864
+ }
4865
+ } else {
4866
+ registry = mainRegistry;
4867
+ }
4444
4868
  if (!registry) {
4445
4869
  if (!prerenderNodeRegistry) {
4446
4870
  await getOrCreateTempServer();
@@ -4462,7 +4886,10 @@ ${err.stack}`
4462
4886
  pathname,
4463
4887
  {},
4464
4888
  void 0,
4465
- wantPassthrough
4889
+ wantPassthrough,
4890
+ s.resolvedBuildEnv,
4891
+ true
4892
+ // devMode: check getParams for passthrough routes
4466
4893
  );
4467
4894
  if (!result) continue;
4468
4895
  if (result.passthrough) continue;
@@ -4563,6 +4990,16 @@ ${err.stack}`
4563
4990
  const hasCreateRouter = /\bcreateRouter\s*[<(]/.test(source);
4564
4991
  if (!hasUrls && !hasCreateRouter) return;
4565
4992
  if (hasCreateRouter) {
4993
+ const nestedRouterConflict = findNestedRouterConflict([
4994
+ ...s.cachedRouterFiles ?? [],
4995
+ resolve8(filePath)
4996
+ ]);
4997
+ if (nestedRouterConflict) {
4998
+ server.config.logger.error(
4999
+ formatNestedRouterConflictError(nestedRouterConflict)
5000
+ );
5001
+ return;
5002
+ }
4566
5003
  s.cachedRouterFiles = void 0;
4567
5004
  }
4568
5005
  scheduleRouteRegeneration();
@@ -4585,6 +5022,10 @@ ${err.stack}`
4585
5022
  async buildStart() {
4586
5023
  if (!s.isBuildMode) return;
4587
5024
  if (s.mergedRouteManifest !== null) return;
5025
+ resetStagedBuildAssets(s.projectRoot);
5026
+ s.prerenderManifestEntries = null;
5027
+ s.staticManifestEntries = null;
5028
+ await acquireBuildEnv(s, viteCommand, viteMode);
4588
5029
  let tempServer = null;
4589
5030
  globalThis.__rscRouterDiscoveryActive = true;
4590
5031
  try {
@@ -4624,6 +5065,7 @@ ${details}`
4624
5065
  if (tempServer) {
4625
5066
  await tempServer.close();
4626
5067
  }
5068
+ await releaseBuildEnv(s);
4627
5069
  }
4628
5070
  },
4629
5071
  // Virtual module: provides the pre-generated route manifest as a JS module
@@ -4666,20 +5108,30 @@ ${details}`
4666
5108
  }
4667
5109
  if (!s.resolvedPrerenderModules?.size && !s.resolvedStaticModules?.size)
4668
5110
  return;
5111
+ s.handlerChunkInfoMap.clear();
5112
+ s.staticHandlerChunkInfoMap.clear();
4669
5113
  for (const [fileName, chunk] of Object.entries(bundle)) {
4670
5114
  if (chunk.type !== "chunk") continue;
4671
- if (fileName.includes("__prerender-handlers") && s.resolvedPrerenderModules?.size) {
5115
+ if (s.resolvedPrerenderModules?.size) {
4672
5116
  const handlers = extractHandlerExportsFromChunk(
4673
5117
  chunk.code,
4674
5118
  s.resolvedPrerenderModules,
4675
5119
  "Prerender",
4676
- true
5120
+ false
4677
5121
  );
4678
5122
  if (handlers.length > 0) {
4679
- s.handlerChunkInfo = { fileName, exports: handlers };
5123
+ const existing = s.handlerChunkInfoMap.get(fileName);
5124
+ if (existing) {
5125
+ existing.exports.push(...handlers);
5126
+ } else {
5127
+ s.handlerChunkInfoMap.set(fileName, {
5128
+ fileName,
5129
+ exports: handlers
5130
+ });
5131
+ }
4680
5132
  }
4681
5133
  }
4682
- if (fileName.includes("__static-handlers") && s.resolvedStaticModules?.size) {
5134
+ if (s.resolvedStaticModules?.size) {
4683
5135
  const handlers = extractHandlerExportsFromChunk(
4684
5136
  chunk.code,
4685
5137
  s.resolvedStaticModules,
@@ -4687,7 +5139,15 @@ ${details}`
4687
5139
  false
4688
5140
  );
4689
5141
  if (handlers.length > 0) {
4690
- s.staticHandlerChunkInfo = { fileName, exports: handlers };
5142
+ const existing = s.staticHandlerChunkInfoMap.get(fileName);
5143
+ if (existing) {
5144
+ existing.exports.push(...handlers);
5145
+ } else {
5146
+ s.staticHandlerChunkInfoMap.set(fileName, {
5147
+ fileName,
5148
+ exports: handlers
5149
+ });
5150
+ }
4691
5151
  }
4692
5152
  }
4693
5153
  }
@@ -4714,8 +5174,16 @@ async function rango(options) {
4714
5174
  const showBanner = resolvedOptions.banner ?? true;
4715
5175
  const plugins = [];
4716
5176
  const rangoAliases = getPackageAliases();
4717
- const excludeDeps = getExcludeDeps();
4718
- let rscEntryPath = null;
5177
+ const excludeDeps = [
5178
+ ...getExcludeDeps(),
5179
+ // The public browser entry re-exports the RSDW browser client.
5180
+ // Excluding both keeps Vite from freezing the unpatched bundle into
5181
+ // .vite/deps before our source transforms run.
5182
+ "@vitejs/plugin-rsc/browser",
5183
+ // Keep the browser RSDW client out of Vite's dep optimizer so our
5184
+ // cjs-to-esm transform can patch the real file.
5185
+ "@vitejs/plugin-rsc/vendor/react-server-dom/client.browser"
5186
+ ];
4719
5187
  const routerRef = { path: void 0 };
4720
5188
  const prerenderEnabled = true;
4721
5189
  if (preset === "cloudflare") {
@@ -4811,160 +5279,132 @@ async function rango(options) {
4811
5279
  }
4812
5280
  });
4813
5281
  plugins.push(createVirtualEntriesPlugin(finalEntries));
5282
+ plugins.push(performanceTracksPlugin());
4814
5283
  plugins.push(
4815
5284
  rsc({
4816
5285
  entries: finalEntries,
4817
5286
  serverHandler: false
4818
5287
  })
4819
5288
  );
5289
+ plugins.push(clientRefDedup());
4820
5290
  } else {
4821
- const nodeOptions = resolvedOptions;
4822
- routerRef.path = nodeOptions.router;
4823
- if (!routerRef.path) {
4824
- plugins.push({
4825
- name: "@rangojs/router:auto-discover",
4826
- config(userConfig) {
4827
- if (routerRef.path) return;
4828
- const root = userConfig.root ? resolve7(process.cwd(), userConfig.root) : process.cwd();
4829
- const filter = createScanFilter(root, {
4830
- include: resolvedOptions.include,
4831
- exclude: resolvedOptions.exclude
4832
- });
4833
- const candidates = findRouterFiles(root, filter);
4834
- if (candidates.length === 1) {
4835
- const abs = candidates[0];
4836
- routerRef.path = (abs.startsWith(root) ? "./" + abs.slice(root.length + 1) : abs).replaceAll("\\", "/");
4837
- } else if (candidates.length > 1) {
4838
- const list = candidates.map(
4839
- (f) => " - " + (f.startsWith(root) ? f.slice(root.length + 1) : f)
4840
- ).join("\n");
4841
- throw new Error(
4842
- `[rsc-router] Multiple routers found. Specify \`router\` to choose one:
4843
- ${list}`
4844
- );
4845
- }
5291
+ plugins.push({
5292
+ name: "@rangojs/router:auto-discover",
5293
+ config(userConfig) {
5294
+ if (routerRef.path) return;
5295
+ const root = userConfig.root ? resolve9(process.cwd(), userConfig.root) : process.cwd();
5296
+ const candidates = findRouterFiles(root);
5297
+ if (candidates.length === 1) {
5298
+ const abs = candidates[0];
5299
+ routerRef.path = (abs.startsWith(root) ? "./" + abs.slice(root.length + 1) : abs).replaceAll("\\", "/");
5300
+ } else if (candidates.length > 1) {
5301
+ const list = candidates.map(
5302
+ (f) => " - " + (f.startsWith(root) ? f.slice(root.length + 1) : f)
5303
+ ).join("\n");
5304
+ throw new Error(`[rsc-router] Multiple routers found:
5305
+ ${list}`);
4846
5306
  }
4847
- });
4848
- }
4849
- const rscOption = nodeOptions.rsc ?? true;
4850
- if (rscOption !== false) {
4851
- const { default: rsc } = await import("@vitejs/plugin-rsc");
4852
- const userEntries = typeof rscOption === "boolean" ? {} : rscOption.entries || {};
4853
- const finalEntries = {
4854
- client: userEntries.client ?? VIRTUAL_IDS.browser,
4855
- ssr: userEntries.ssr ?? VIRTUAL_IDS.ssr,
4856
- rsc: userEntries.rsc ?? VIRTUAL_IDS.rsc
4857
- };
4858
- rscEntryPath = userEntries.rsc ?? null;
4859
- let hasWarnedDuplicate = false;
4860
- plugins.push({
4861
- name: "@rangojs/router:rsc-integration",
4862
- enforce: "pre",
4863
- config() {
4864
- const useVirtualClient = finalEntries.client === VIRTUAL_IDS.browser;
4865
- const useVirtualSSR = finalEntries.ssr === VIRTUAL_IDS.ssr;
4866
- const useVirtualRSC = finalEntries.rsc === VIRTUAL_IDS.rsc;
4867
- return {
4868
- // Exclude rsc-router modules from optimization to prevent module duplication
4869
- // This ensures the same Context instance is used by both browser entry and RSC proxy modules
4870
- optimizeDeps: {
4871
- exclude: excludeDeps,
4872
- esbuildOptions: sharedEsbuildOptions
4873
- },
4874
- build: {
4875
- rollupOptions: { onwarn }
4876
- },
4877
- resolve: {
4878
- alias: rangoAliases
4879
- },
4880
- environments: {
4881
- client: {
4882
- build: {
4883
- rollupOptions: {
4884
- output: {
4885
- manualChunks: getManualChunks
4886
- }
4887
- }
4888
- },
4889
- // Always exclude rsc-router modules, conditionally add virtual entry
4890
- optimizeDeps: {
4891
- // Pre-bundle React and rsc-html-stream to prevent late discovery
4892
- // triggering ERR_OUTDATED_OPTIMIZED_DEP on cold starts
4893
- include: [
4894
- "react",
4895
- "react-dom",
4896
- "react/jsx-runtime",
4897
- "react/jsx-dev-runtime",
4898
- "rsc-html-stream/client"
4899
- ],
4900
- exclude: excludeDeps,
4901
- esbuildOptions: sharedEsbuildOptions,
4902
- ...useVirtualClient && {
4903
- // Tell Vite to scan the virtual entry for dependencies
4904
- entries: [VIRTUAL_IDS.browser]
4905
- }
4906
- }
4907
- },
4908
- ...useVirtualSSR && {
4909
- ssr: {
4910
- optimizeDeps: {
4911
- entries: [VIRTUAL_IDS.ssr],
4912
- // Pre-bundle all SSR deps to prevent late discovery triggering ERR_OUTDATED_OPTIMIZED_DEP
4913
- include: [
4914
- "react",
4915
- "react-dom",
4916
- "react-dom/server.edge",
4917
- "react-dom/static.edge",
4918
- "react/jsx-runtime",
4919
- "react/jsx-dev-runtime",
4920
- "@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
4921
- ],
4922
- exclude: excludeDeps,
4923
- esbuildOptions: sharedEsbuildOptions
5307
+ }
5308
+ });
5309
+ const finalEntries = {
5310
+ client: VIRTUAL_IDS.browser,
5311
+ ssr: VIRTUAL_IDS.ssr,
5312
+ rsc: VIRTUAL_IDS.rsc
5313
+ };
5314
+ const { default: rsc } = await import("@vitejs/plugin-rsc");
5315
+ let hasWarnedDuplicate = false;
5316
+ plugins.push({
5317
+ name: "@rangojs/router:rsc-integration",
5318
+ enforce: "pre",
5319
+ config() {
5320
+ return {
5321
+ optimizeDeps: {
5322
+ exclude: excludeDeps,
5323
+ esbuildOptions: sharedEsbuildOptions
5324
+ },
5325
+ build: {
5326
+ rollupOptions: { onwarn }
5327
+ },
5328
+ resolve: {
5329
+ alias: rangoAliases
5330
+ },
5331
+ environments: {
5332
+ client: {
5333
+ build: {
5334
+ rollupOptions: {
5335
+ output: {
5336
+ manualChunks: getManualChunks
4924
5337
  }
4925
5338
  }
4926
5339
  },
4927
- ...useVirtualRSC && {
4928
- rsc: {
4929
- optimizeDeps: {
4930
- entries: [VIRTUAL_IDS.rsc],
4931
- // Pre-bundle all RSC deps to prevent late discovery triggering ERR_OUTDATED_OPTIMIZED_DEP
4932
- include: [
4933
- "react",
4934
- "react/jsx-runtime",
4935
- "react/jsx-dev-runtime",
4936
- "@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
4937
- ],
4938
- esbuildOptions: sharedEsbuildOptions
4939
- }
4940
- }
5340
+ optimizeDeps: {
5341
+ include: [
5342
+ "react",
5343
+ "react-dom",
5344
+ "react/jsx-runtime",
5345
+ "react/jsx-dev-runtime",
5346
+ "rsc-html-stream/client"
5347
+ ],
5348
+ exclude: excludeDeps,
5349
+ esbuildOptions: sharedEsbuildOptions,
5350
+ entries: [VIRTUAL_IDS.browser]
5351
+ }
5352
+ },
5353
+ ssr: {
5354
+ optimizeDeps: {
5355
+ entries: [VIRTUAL_IDS.ssr],
5356
+ include: [
5357
+ "react",
5358
+ "react-dom",
5359
+ "react-dom/server.edge",
5360
+ "react-dom/static.edge",
5361
+ "react/jsx-runtime",
5362
+ "react/jsx-dev-runtime",
5363
+ "@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
5364
+ ],
5365
+ exclude: excludeDeps,
5366
+ esbuildOptions: sharedEsbuildOptions
5367
+ }
5368
+ },
5369
+ rsc: {
5370
+ optimizeDeps: {
5371
+ entries: [VIRTUAL_IDS.rsc],
5372
+ include: [
5373
+ "react",
5374
+ "react/jsx-runtime",
5375
+ "react/jsx-dev-runtime",
5376
+ "@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
5377
+ ],
5378
+ esbuildOptions: sharedEsbuildOptions
4941
5379
  }
4942
5380
  }
4943
- };
4944
- },
4945
- configResolved(config) {
4946
- if (showBanner) {
4947
- const mode = config.command === "serve" ? process.argv.includes("preview") ? "preview" : "dev" : "build";
4948
- printBanner(mode, "node", rangoVersion);
4949
- }
4950
- const rscMinimalCount = config.plugins.filter(
4951
- (p) => p.name === "rsc:minimal"
4952
- ).length;
4953
- if (rscMinimalCount > 1 && !hasWarnedDuplicate) {
4954
- hasWarnedDuplicate = true;
4955
- console.warn(
4956
- "[rsc-router] Duplicate @vitejs/plugin-rsc detected. Remove rsc() from your config or use rango({ rsc: false }) for manual configuration."
4957
- );
4958
5381
  }
5382
+ };
5383
+ },
5384
+ configResolved(config) {
5385
+ if (showBanner) {
5386
+ const mode = config.command === "serve" ? process.argv.includes("preview") ? "preview" : "dev" : "build";
5387
+ printBanner(mode, "node", rangoVersion);
4959
5388
  }
4960
- });
4961
- plugins.push(createVirtualEntriesPlugin(finalEntries, routerRef));
4962
- plugins.push(
4963
- rsc({
4964
- entries: finalEntries
4965
- })
4966
- );
4967
- }
5389
+ const rscMinimalCount = config.plugins.filter(
5390
+ (p) => p.name === "rsc:minimal"
5391
+ ).length;
5392
+ if (rscMinimalCount > 1 && !hasWarnedDuplicate) {
5393
+ hasWarnedDuplicate = true;
5394
+ console.warn(
5395
+ "[rsc-router] Duplicate @vitejs/plugin-rsc detected. Remove rsc() from your vite config \u2014 rango() includes it automatically."
5396
+ );
5397
+ }
5398
+ }
5399
+ });
5400
+ plugins.push(createVirtualEntriesPlugin(finalEntries, routerRef));
5401
+ plugins.push(performanceTracksPlugin());
5402
+ plugins.push(
5403
+ rsc({
5404
+ entries: finalEntries
5405
+ })
5406
+ );
5407
+ plugins.push(clientRefDedup());
4968
5408
  }
4969
5409
  plugins.push({
4970
5410
  name: "@rangojs/router:client-component-hmr",
@@ -4991,22 +5431,102 @@ ${list}`
4991
5431
  plugins.push(createVersionPlugin());
4992
5432
  const discoveryEntryPath = preset !== "cloudflare" ? routerRef.path : void 0;
4993
5433
  const discoveryRouterRef = preset !== "cloudflare" ? routerRef : void 0;
4994
- const injectorEntryPath = rscEntryPath ?? (preset === "cloudflare" ? void 0 : null);
4995
- if (injectorEntryPath !== null) {
4996
- plugins.push(createVersionInjectorPlugin(injectorEntryPath));
5434
+ if (preset === "cloudflare") {
5435
+ plugins.push(createVersionInjectorPlugin(void 0));
4997
5436
  }
4998
5437
  plugins.push(createCjsToEsmPlugin());
4999
5438
  plugins.push(
5000
5439
  createRouterDiscoveryPlugin(discoveryEntryPath, {
5001
5440
  routerPathRef: discoveryRouterRef,
5002
5441
  enableBuildPrerender: prerenderEnabled,
5003
- staticRouteTypesGeneration: resolvedOptions.staticRouteTypesGeneration,
5004
- include: resolvedOptions.include,
5005
- exclude: resolvedOptions.exclude
5442
+ buildEnv: options?.buildEnv,
5443
+ preset
5006
5444
  })
5007
5445
  );
5008
5446
  return plugins;
5009
5447
  }
5448
+
5449
+ // src/vite/plugins/refresh-cmd.ts
5450
+ function poke() {
5451
+ return {
5452
+ name: "vite-plugin-poke",
5453
+ apply: "serve",
5454
+ configureServer(server) {
5455
+ const stdin = process.stdin;
5456
+ const debug = process.env.RANGO_POKE_DEBUG === "1";
5457
+ const triggerReload = (source) => {
5458
+ server.hot.send({ type: "full-reload", path: "*" });
5459
+ server.config.logger.info(` browser reload (${source})`, {
5460
+ timestamp: true
5461
+ });
5462
+ };
5463
+ const toBuffer = (chunk) => {
5464
+ return typeof chunk === "string" ? Buffer.from(chunk, "utf8") : chunk;
5465
+ };
5466
+ const formatChunk = (chunk) => {
5467
+ const data = toBuffer(chunk);
5468
+ const hex = Array.from(data).map((byte) => `0x${byte.toString(16).padStart(2, "0")}`).join(" ");
5469
+ const ascii = Array.from(data).map((byte) => {
5470
+ if (byte >= 32 && byte <= 126) return String.fromCharCode(byte);
5471
+ if (byte === 10) return "\\n";
5472
+ if (byte === 13) return "\\r";
5473
+ if (byte === 9) return "\\t";
5474
+ return ".";
5475
+ }).join("");
5476
+ return `len=${data.length} hex=[${hex}] ascii="${ascii}"`;
5477
+ };
5478
+ const readCtrlR = (chunk) => {
5479
+ const data = typeof chunk === "string" ? Buffer.from(chunk, "utf8") : chunk;
5480
+ return data.length === 1 && data[0] === 18;
5481
+ };
5482
+ const readSubmittedCommands = (chunk) => {
5483
+ const text = toBuffer(chunk).toString("utf8").replace(/\r\n/g, "\n").replace(/\r/g, "\n");
5484
+ if (!text.includes("\n")) return [];
5485
+ const lines = text.split("\n");
5486
+ lines.pop();
5487
+ return lines;
5488
+ };
5489
+ if (debug) {
5490
+ server.config.logger.info(
5491
+ ` poke debug enabled (isTTY=${stdin.isTTY ? "yes" : "no"}, isRaw=${stdin.isTTY ? stdin.isRaw ? "yes" : "no" : "n/a"})`,
5492
+ { timestamp: true }
5493
+ );
5494
+ }
5495
+ if (stdin.isTTY) {
5496
+ server.config.logger.info(
5497
+ " poke ready: press e + enter to reload browser (ctrl+r also works when available)",
5498
+ { timestamp: true }
5499
+ );
5500
+ }
5501
+ const onData = (data) => {
5502
+ if (debug) {
5503
+ server.config.logger.info(` poke stdin ${formatChunk(data)}`, {
5504
+ timestamp: true
5505
+ });
5506
+ }
5507
+ if (readCtrlR(data)) {
5508
+ triggerReload("ctrl+r");
5509
+ return;
5510
+ }
5511
+ for (const command of readSubmittedCommands(data)) {
5512
+ if (command === "e") {
5513
+ triggerReload("e+enter");
5514
+ return;
5515
+ }
5516
+ if (command === "\x1Br") {
5517
+ triggerReload("option+r+enter");
5518
+ return;
5519
+ }
5520
+ }
5521
+ };
5522
+ stdin.on("data", onData);
5523
+ server.httpServer?.on("close", () => {
5524
+ stdin.off("data", onData);
5525
+ });
5526
+ }
5527
+ };
5528
+ }
5010
5529
  export {
5530
+ poke,
5011
5531
  rango
5012
5532
  };