@rangojs/router 0.0.0-experimental.18 → 0.0.0-experimental.1878aa49

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 (1030) hide show
  1. package/{CLAUDE.md → AGENTS.md} +4 -0
  2. package/README.md +91 -19
  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 +348 -80
  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/{src/href-context.ts → dist/href-context.d.ts} +7 -11
  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 +883 -444
  798. package/dist/vite/index.js.map +1 -0
  799. package/dist/vite/index.named-routes.gen.ts +103 -0
  800. package/dist/vite/package-resolution.d.ts +43 -0
  801. package/dist/vite/package-resolution.d.ts.map +1 -0
  802. package/dist/vite/package-resolution.js +112 -0
  803. package/dist/vite/package-resolution.js.map +1 -0
  804. package/dist/vite/virtual-entries.d.ts +25 -0
  805. package/dist/vite/virtual-entries.d.ts.map +1 -0
  806. package/dist/vite/virtual-entries.js +110 -0
  807. package/dist/vite/virtual-entries.js.map +1 -0
  808. package/package.json +17 -16
  809. package/skills/breadcrumbs/SKILL.md +250 -0
  810. package/skills/cache-guide/SKILL.md +32 -0
  811. package/skills/caching/SKILL.md +49 -8
  812. package/skills/document-cache/SKILL.md +2 -2
  813. package/skills/hooks/SKILL.md +34 -32
  814. package/skills/host-router/SKILL.md +218 -0
  815. package/skills/intercept/SKILL.md +79 -0
  816. package/skills/layout/SKILL.md +62 -2
  817. package/skills/links/SKILL.md +3 -1
  818. package/skills/loader/SKILL.md +166 -23
  819. package/skills/middleware/SKILL.md +83 -0
  820. package/skills/parallel/SKILL.md +183 -2
  821. package/skills/prerender/SKILL.md +189 -19
  822. package/skills/rango/SKILL.md +0 -1
  823. package/skills/route/SKILL.md +76 -5
  824. package/skills/router-setup/SKILL.md +172 -5
  825. package/skills/typesafety/SKILL.md +35 -23
  826. package/src/__internal.ts +93 -1
  827. package/src/bin/rango.ts +56 -19
  828. package/src/browser/action-coordinator.ts +97 -0
  829. package/src/browser/app-version.ts +14 -0
  830. package/src/browser/event-controller.ts +30 -27
  831. package/src/browser/history-state.ts +80 -0
  832. package/src/browser/intercept-utils.ts +1 -1
  833. package/src/browser/link-interceptor.ts +4 -3
  834. package/src/browser/merge-segment-loaders.ts +9 -2
  835. package/src/browser/navigation-bridge.ts +160 -31
  836. package/src/browser/navigation-client.ts +141 -88
  837. package/src/browser/navigation-store.ts +44 -39
  838. package/src/browser/navigation-transaction.ts +55 -214
  839. package/src/browser/partial-update.ts +181 -164
  840. package/src/browser/prefetch/cache.ts +206 -0
  841. package/src/browser/prefetch/fetch.ts +150 -0
  842. package/src/browser/prefetch/policy.ts +48 -0
  843. package/src/browser/prefetch/queue.ts +160 -0
  844. package/src/browser/prefetch/resource-ready.ts +77 -0
  845. package/src/browser/react/Link.tsx +97 -36
  846. package/src/browser/react/NavigationProvider.tsx +49 -5
  847. package/src/browser/react/context.ts +7 -2
  848. package/src/browser/react/index.ts +2 -6
  849. package/src/browser/react/location-state-shared.ts +1 -1
  850. package/src/browser/react/location-state.ts +2 -0
  851. package/src/browser/react/nonce-context.ts +23 -0
  852. package/src/browser/react/use-action.ts +9 -1
  853. package/src/browser/react/use-handle.ts +3 -25
  854. package/src/browser/react/use-params.ts +2 -4
  855. package/src/browser/react/use-pathname.ts +2 -3
  856. package/src/browser/react/use-router.ts +22 -9
  857. package/src/browser/react/use-search-params.ts +2 -1
  858. package/src/browser/react/use-segments.ts +7 -60
  859. package/src/browser/response-adapter.ts +73 -0
  860. package/src/browser/rsc-router.tsx +154 -64
  861. package/src/browser/scroll-restoration.ts +37 -37
  862. package/src/browser/segment-reconciler.ts +6 -1
  863. package/src/browser/server-action-bridge.ts +463 -426
  864. package/src/browser/types.ts +61 -36
  865. package/src/browser/validate-redirect-origin.ts +29 -0
  866. package/src/build/generate-manifest.ts +8 -0
  867. package/src/build/generate-route-types.ts +7 -0
  868. package/src/build/route-trie.ts +19 -3
  869. package/src/build/route-types/codegen.ts +13 -4
  870. package/src/build/route-types/include-resolution.ts +21 -1
  871. package/src/build/route-types/per-module-writer.ts +15 -3
  872. package/src/build/route-types/router-processing.ts +391 -90
  873. package/src/build/runtime-discovery.ts +13 -1
  874. package/src/cache/background-task.ts +34 -0
  875. package/src/cache/cache-key-utils.ts +44 -0
  876. package/src/cache/cache-policy.ts +125 -0
  877. package/src/cache/cache-runtime.ts +136 -96
  878. package/src/cache/cache-scope.ts +119 -80
  879. package/src/cache/cf/cf-cache-store.ts +462 -15
  880. package/src/cache/cf/index.ts +5 -1
  881. package/src/cache/document-cache.ts +88 -53
  882. package/src/cache/handle-capture.ts +81 -0
  883. package/src/cache/index.ts +1 -0
  884. package/src/cache/memory-segment-store.ts +18 -7
  885. package/src/cache/profile-registry.ts +43 -8
  886. package/src/cache/read-through-swr.ts +134 -0
  887. package/src/cache/segment-codec.ts +101 -112
  888. package/src/cache/taint.ts +81 -0
  889. package/src/client.rsc.tsx +2 -1
  890. package/src/client.tsx +54 -76
  891. package/src/context-var.ts +72 -2
  892. package/src/debug.ts +2 -2
  893. package/src/errors.ts +6 -1
  894. package/src/handle.ts +1 -1
  895. package/src/handles/MetaTags.tsx +5 -2
  896. package/src/handles/breadcrumbs.ts +66 -0
  897. package/src/handles/index.ts +1 -0
  898. package/src/host/cookie-handler.ts +8 -3
  899. package/src/host/index.ts +0 -3
  900. package/src/host/router.ts +14 -1
  901. package/src/href-client.ts +3 -1
  902. package/src/index.rsc.ts +24 -23
  903. package/src/index.ts +45 -52
  904. package/src/loader.rsc.ts +12 -4
  905. package/src/loader.ts +8 -0
  906. package/src/prerender/store.ts +60 -18
  907. package/src/prerender.ts +76 -18
  908. package/src/reverse.ts +11 -7
  909. package/src/root-error-boundary.tsx +30 -26
  910. package/src/route-definition/dsl-helpers.ts +41 -13
  911. package/src/route-definition/helpers-types.ts +6 -5
  912. package/src/route-definition/index.ts +0 -3
  913. package/src/route-definition/redirect.ts +24 -4
  914. package/src/route-map-builder.ts +45 -3
  915. package/src/route-name.ts +53 -0
  916. package/src/route-types.ts +7 -0
  917. package/src/router/content-negotiation.ts +1 -1
  918. package/src/router/debug-manifest.ts +16 -3
  919. package/src/router/find-match.ts +4 -2
  920. package/src/router/handler-context.ts +159 -34
  921. package/src/router/intercept-resolution.ts +17 -8
  922. package/src/router/lazy-includes.ts +8 -1
  923. package/src/router/loader-resolution.ts +11 -3
  924. package/src/router/logging.ts +104 -4
  925. package/src/router/manifest.ts +45 -7
  926. package/src/router/match-api.ts +62 -8
  927. package/src/router/match-context.ts +3 -0
  928. package/src/router/match-handlers.ts +185 -11
  929. package/src/router/match-middleware/background-revalidation.ts +94 -86
  930. package/src/router/match-middleware/cache-lookup.ts +138 -13
  931. package/src/router/match-middleware/cache-store.ts +55 -10
  932. package/src/router/match-middleware/intercept-resolution.ts +9 -7
  933. package/src/router/match-middleware/segment-resolution.ts +8 -5
  934. package/src/router/match-pipelines.ts +8 -43
  935. package/src/router/match-result.ts +22 -15
  936. package/src/router/metrics.ts +238 -13
  937. package/src/router/middleware-types.ts +60 -12
  938. package/src/router/middleware.ts +214 -42
  939. package/src/router/pattern-matching.ts +61 -10
  940. package/src/router/prerender-match.ts +40 -8
  941. package/src/router/preview-match.ts +7 -1
  942. package/src/router/revalidation.ts +87 -8
  943. package/src/router/router-context.ts +20 -0
  944. package/src/router/router-interfaces.ts +73 -5
  945. package/src/router/router-options.ts +250 -19
  946. package/src/router/segment-resolution/fresh.ts +277 -45
  947. package/src/router/segment-resolution/helpers.ts +49 -25
  948. package/src/router/segment-resolution/loader-cache.ts +38 -146
  949. package/src/router/segment-resolution/revalidation.ts +619 -275
  950. package/src/router/segment-wrappers.ts +5 -0
  951. package/src/router/telemetry-otel.ts +299 -0
  952. package/src/router/telemetry.ts +300 -0
  953. package/src/router/timeout.ts +148 -0
  954. package/src/router/trie-matching.ts +20 -2
  955. package/src/router/types.ts +8 -1
  956. package/src/router.ts +230 -25
  957. package/src/rsc/handler-context.ts +11 -0
  958. package/src/rsc/handler.ts +492 -96
  959. package/src/rsc/helpers.ts +25 -16
  960. package/src/rsc/index.ts +0 -20
  961. package/src/rsc/loader-fetch.ts +84 -42
  962. package/src/rsc/manifest-init.ts +5 -1
  963. package/src/rsc/origin-guard.ts +141 -0
  964. package/src/rsc/progressive-enhancement.ts +249 -19
  965. package/src/rsc/response-route-handler.ts +37 -26
  966. package/src/rsc/rsc-rendering.ts +40 -41
  967. package/src/rsc/runtime-warnings.ts +42 -0
  968. package/src/rsc/server-action.ts +150 -68
  969. package/src/rsc/ssr-setup.ts +128 -0
  970. package/src/rsc/types.ts +18 -1
  971. package/src/search-params.ts +38 -23
  972. package/src/segment-system.tsx +140 -4
  973. package/src/server/context.ts +187 -20
  974. package/src/server/fetchable-loader-store.ts +11 -6
  975. package/src/server/handle-store.ts +66 -9
  976. package/src/server/loader-registry.ts +20 -54
  977. package/src/server/request-context.ts +188 -41
  978. package/src/server.ts +6 -0
  979. package/src/ssr/index.tsx +66 -26
  980. package/src/static-handler.ts +7 -0
  981. package/src/theme/ThemeProvider.tsx +6 -1
  982. package/src/theme/index.ts +4 -18
  983. package/src/theme/theme-context.ts +1 -28
  984. package/src/theme/theme-script.ts +2 -1
  985. package/src/types/cache-types.ts +9 -4
  986. package/src/types/error-types.ts +3 -0
  987. package/src/types/global-namespace.ts +9 -0
  988. package/src/types/handler-context.ts +167 -55
  989. package/src/types/loader-types.ts +11 -5
  990. package/src/types/route-config.ts +17 -8
  991. package/src/types/route-entry.ts +35 -0
  992. package/src/types/segments.ts +2 -5
  993. package/src/urls/include-helper.ts +49 -8
  994. package/src/urls/index.ts +1 -0
  995. package/src/urls/path-helper-types.ts +30 -12
  996. package/src/urls/path-helper.ts +18 -3
  997. package/src/urls/pattern-types.ts +33 -1
  998. package/src/urls/response-types.ts +27 -2
  999. package/src/urls/type-extraction.ts +23 -15
  1000. package/src/use-loader.tsx +12 -4
  1001. package/src/vite/discovery/bundle-postprocess.ts +32 -52
  1002. package/src/vite/discovery/discover-routers.ts +53 -23
  1003. package/src/vite/discovery/prerender-collection.ts +58 -41
  1004. package/src/vite/discovery/route-types-writer.ts +7 -7
  1005. package/src/vite/discovery/state.ts +4 -9
  1006. package/src/vite/discovery/virtual-module-codegen.ts +5 -2
  1007. package/src/vite/index.ts +4 -3
  1008. package/src/vite/plugin-types.ts +0 -83
  1009. package/src/vite/plugins/client-ref-dedup.ts +115 -0
  1010. package/src/vite/plugins/client-ref-hashing.ts +3 -3
  1011. package/src/vite/plugins/expose-action-id.ts +1 -3
  1012. package/src/vite/plugins/performance-tracks.ts +88 -0
  1013. package/src/vite/plugins/refresh-cmd.ts +65 -0
  1014. package/src/vite/plugins/use-cache-transform.ts +91 -3
  1015. package/src/vite/plugins/version-plugin.ts +13 -1
  1016. package/src/vite/rango.ts +172 -210
  1017. package/src/vite/router-discovery.ts +115 -44
  1018. package/src/vite/utils/banner.ts +3 -3
  1019. package/src/vite/utils/prerender-utils.ts +81 -0
  1020. package/src/vite/utils/shared-utils.ts +6 -3
  1021. package/skills/testing/SKILL.md +0 -226
  1022. package/src/browser/prefetch-cache.ts +0 -48
  1023. package/src/browser/prefetch-fetch.ts +0 -109
  1024. package/src/browser/prefetch-queue.ts +0 -81
  1025. package/src/browser/request-controller.ts +0 -164
  1026. package/src/route-definition/route-function.ts +0 -119
  1027. package/src/router.gen.ts +0 -6
  1028. package/src/static-handler.gen.ts +0 -5
  1029. package/src/urls.gen.ts +0 -8
  1030. /package/src/browser/{prefetch-observer.ts → prefetch/observer.ts} +0 -0
@@ -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;
@@ -1454,7 +1454,7 @@ function useCacheTransform() {
1454
1454
  transformWrapExport
1455
1455
  );
1456
1456
  }
1457
- return transformFunctionLevelUseCache(
1457
+ const functionResult = transformFunctionLevelUseCache(
1458
1458
  code,
1459
1459
  ast,
1460
1460
  filePath,
@@ -1462,21 +1462,33 @@ function useCacheTransform() {
1462
1462
  isBuild,
1463
1463
  transformHoistInlineDirective
1464
1464
  );
1465
+ warnOnNearMissDirectives(ast, id, this.warn.bind(this));
1466
+ if (functionResult) return functionResult;
1465
1467
  }
1466
1468
  };
1467
1469
  }
1468
1470
  function transformFileLevelUseCache(code, ast, filePath, sourceId, isBuild, isLayoutOrTemplate, transformWrapExport) {
1471
+ const nonFunctionExports = [];
1469
1472
  const { exportNames, output } = transformWrapExport(code, ast, {
1470
1473
  runtime: (value, name) => {
1471
1474
  const funcId = isBuild ? hashId(filePath, name) : `${filePath}#${name}`;
1472
1475
  return `__rango_registerCachedFunction(${value}, ${JSON.stringify(funcId)}, "default")`;
1473
1476
  },
1474
1477
  rejectNonAsyncFunction: false,
1475
- filter: (name) => {
1478
+ filter: (name, meta) => {
1476
1479
  if (name === "default" && isLayoutOrTemplate) return false;
1480
+ if (meta.isFunction === false) {
1481
+ nonFunctionExports.push(name);
1482
+ return false;
1483
+ }
1477
1484
  return true;
1478
1485
  }
1479
1486
  });
1487
+ if (nonFunctionExports.length > 0) {
1488
+ throw new Error(
1489
+ `[rango:use-cache] File-level "use cache" in ${sourceId} cannot wrap non-function export${nonFunctionExports.length > 1 ? "s" : ""}: ${nonFunctionExports.map((n) => `"${n}"`).join(", ")}. Only function exports can be cached. Either remove "use cache" from the file level and add it inside individual functions, or move the non-function exports to a separate module.`
1490
+ );
1491
+ }
1480
1492
  if (exportNames.length === 0) {
1481
1493
  const s = new MagicString5(code);
1482
1494
  const directive2 = findFileLevelDirective(ast);
@@ -1513,7 +1525,7 @@ function transformFileLevelUseCache(code, ast, filePath, sourceId, isBuild, isLa
1513
1525
  function transformFunctionLevelUseCache(code, ast, filePath, sourceId, isBuild, transformHoistInlineDirective) {
1514
1526
  try {
1515
1527
  const { output, names } = transformHoistInlineDirective(code, ast, {
1516
- directive: /^use cache(:\s*\w+)?$/,
1528
+ directive: /^use cache(:\s*[\w-]+)?$/,
1517
1529
  runtime: (value, name, meta) => {
1518
1530
  const funcId = isBuild ? hashId(filePath, name) : `${filePath}#${name}`;
1519
1531
  const profileMatch = meta.directiveMatch[1];
@@ -1543,6 +1555,82 @@ function findFileLevelDirective(ast) {
1543
1555
  }
1544
1556
  return null;
1545
1557
  }
1558
+ var VALID_DIRECTIVE_RE = /^use cache(:\s*[\w-]+)?$/;
1559
+ var NEAR_MISS_RE = /^use cache:\s*.+$/;
1560
+ function warnOnNearMissDirectives(ast, fileId, warn) {
1561
+ const visit = (node) => {
1562
+ if (!node || typeof node !== "object") return;
1563
+ if (node.type === "ExpressionStatement" && node.expression?.type === "Literal" && typeof node.expression.value === "string") {
1564
+ const value = node.expression.value;
1565
+ if (value.startsWith("use cache") && NEAR_MISS_RE.test(value) && !VALID_DIRECTIVE_RE.test(value)) {
1566
+ const profilePart = value.slice("use cache:".length).trim();
1567
+ warn(
1568
+ `[rango:use-cache] "${value}" in ${fileId} has an invalid profile name "${profilePart}". Profile names must match [a-zA-Z0-9_-]+. This directive will be ignored.`
1569
+ );
1570
+ }
1571
+ }
1572
+ for (const key of Object.keys(node)) {
1573
+ const child = node[key];
1574
+ if (Array.isArray(child)) {
1575
+ for (const item of child) {
1576
+ visit(item);
1577
+ }
1578
+ } else if (child && typeof child === "object" && child.type) {
1579
+ visit(child);
1580
+ }
1581
+ }
1582
+ };
1583
+ for (const node of ast.body ?? []) {
1584
+ visit(node);
1585
+ }
1586
+ }
1587
+
1588
+ // src/vite/plugins/client-ref-dedup.ts
1589
+ var CLIENT_IN_SERVER_PROXY_PREFIX = "virtual:vite-rsc/client-in-server-package-proxy/";
1590
+ function extractPackageName(absolutePath) {
1591
+ const marker = "/node_modules/";
1592
+ const idx = absolutePath.lastIndexOf(marker);
1593
+ if (idx === -1) return null;
1594
+ const afterModules = absolutePath.slice(idx + marker.length);
1595
+ if (afterModules.startsWith("@")) {
1596
+ const parts = afterModules.split("/");
1597
+ if (parts.length < 2 || !parts[1]) return null;
1598
+ return `${parts[0]}/${parts[1]}`;
1599
+ }
1600
+ const name = afterModules.split("/")[0];
1601
+ return name || null;
1602
+ }
1603
+ function clientRefDedup() {
1604
+ let clientExclude = [];
1605
+ return {
1606
+ name: "@rangojs/router:client-ref-dedup",
1607
+ enforce: "pre",
1608
+ apply: "serve",
1609
+ configResolved(config) {
1610
+ const clientEnv = config.environments?.["client"];
1611
+ clientExclude = clientEnv?.optimizeDeps?.exclude ?? config.optimizeDeps?.exclude ?? [];
1612
+ },
1613
+ resolveId(source, importer, options) {
1614
+ if (this.environment?.name !== "client") return;
1615
+ if (!importer?.includes(CLIENT_IN_SERVER_PROXY_PREFIX)) return;
1616
+ if (!source.includes("/node_modules/")) return;
1617
+ if (!importer) return;
1618
+ const packageName = extractPackageName(source);
1619
+ if (!packageName) return;
1620
+ if (clientExclude.includes(packageName)) return;
1621
+ return `\0rango:dedup/${packageName}`;
1622
+ },
1623
+ load(id) {
1624
+ if (!id.startsWith("\0rango:dedup/")) return;
1625
+ const packageName = id.slice("\0rango:dedup/".length);
1626
+ return [
1627
+ `export * from ${JSON.stringify(packageName)};`,
1628
+ `import * as __all__ from ${JSON.stringify(packageName)};`,
1629
+ `export default __all__.default;`
1630
+ ].join("\n");
1631
+ }
1632
+ };
1633
+ }
1546
1634
 
1547
1635
  // src/vite/plugins/virtual-entries.ts
1548
1636
  var VIRTUAL_ENTRY_BROWSER = `
@@ -1657,7 +1745,7 @@ import { resolve } from "node:path";
1657
1745
  // package.json
1658
1746
  var package_default = {
1659
1747
  name: "@rangojs/router",
1660
- version: "0.0.0-experimental.18",
1748
+ version: "0.0.0-experimental.1878aa49",
1661
1749
  description: "Django-inspired RSC router with composable URL patterns",
1662
1750
  keywords: [
1663
1751
  "react",
@@ -1688,7 +1776,7 @@ var package_default = {
1688
1776
  "!src/**/*.test.tsx",
1689
1777
  "dist",
1690
1778
  "skills",
1691
- "CLAUDE.md",
1779
+ "AGENTS.md",
1692
1780
  "README.md"
1693
1781
  ],
1694
1782
  type: "module",
@@ -1799,7 +1887,7 @@ var package_default = {
1799
1887
  "test:unit:watch": "vitest"
1800
1888
  },
1801
1889
  dependencies: {
1802
- "@vitejs/plugin-rsc": "^0.5.14",
1890
+ "@vitejs/plugin-rsc": "^0.5.19",
1803
1891
  "magic-string": "^0.30.17",
1804
1892
  picomatch: "^4.0.3",
1805
1893
  "rsc-html-stream": "^0.0.7"
@@ -1970,15 +2058,27 @@ function extractRouteFromCallExpression(node) {
1970
2058
  };
1971
2059
  }
1972
2060
 
2061
+ // src/route-name.ts
2062
+ var AUTO_GENERATED_ROUTE_PREFIX = "$path_";
2063
+ var INTERNAL_INCLUDE_SCOPE_PREFIX = "$prefix_";
2064
+ function isAutoGeneratedRouteName(name) {
2065
+ return name.split(".").some((segment) => {
2066
+ return segment.startsWith(AUTO_GENERATED_ROUTE_PREFIX) || segment.startsWith(INTERNAL_INCLUDE_SCOPE_PREFIX);
2067
+ });
2068
+ }
2069
+
1973
2070
  // src/build/route-types/codegen.ts
1974
2071
  function generateRouteTypesSource(routeManifest, searchSchemas) {
1975
- const entries = Object.entries(routeManifest).sort(
1976
- ([a], [b]) => a.localeCompare(b)
1977
- );
2072
+ const entries = Object.entries(routeManifest).filter(([name]) => !isAutoGeneratedRouteName(name)).sort(([a], [b]) => a.localeCompare(b));
2073
+ const filteredSearchSchemas = searchSchemas ? Object.fromEntries(
2074
+ Object.entries(searchSchemas).filter(
2075
+ ([name]) => !isAutoGeneratedRouteName(name)
2076
+ )
2077
+ ) : void 0;
1978
2078
  const objectBody = entries.map(([name, pattern]) => {
1979
2079
  const key = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name) ? name : `"${name}"`;
1980
2080
  const params = extractParamsFromPattern(pattern);
1981
- const search = searchSchemas?.[name];
2081
+ const search = filteredSearchSchemas?.[name];
1982
2082
  return formatRouteEntry(key, pattern, params, search);
1983
2083
  }).join("\n");
1984
2084
  return `// Auto-generated by @rangojs/router - do not edit
@@ -1995,55 +2095,7 @@ declare global {
1995
2095
  }
1996
2096
 
1997
2097
  // src/build/route-types/scan-filter.ts
1998
- import { join, relative } from "node:path";
1999
- import { readdirSync } from "node:fs";
2000
2098
  import picomatch from "picomatch";
2001
- var DEFAULT_EXCLUDE_PATTERNS = [
2002
- "**/__tests__/**",
2003
- "**/__mocks__/**",
2004
- "**/dist/**",
2005
- "**/coverage/**",
2006
- "**/*.test.{ts,tsx,js,jsx}",
2007
- "**/*.spec.{ts,tsx,js,jsx}"
2008
- ];
2009
- function createScanFilter(root, opts) {
2010
- const { include, exclude } = opts;
2011
- const hasInclude = include && include.length > 0;
2012
- const hasCustomExclude = exclude !== void 0;
2013
- if (!hasInclude && !hasCustomExclude) return void 0;
2014
- const effectiveExclude = exclude ?? DEFAULT_EXCLUDE_PATTERNS;
2015
- const includeMatcher = hasInclude ? picomatch(include) : null;
2016
- const excludeMatcher = effectiveExclude.length > 0 ? picomatch(effectiveExclude) : null;
2017
- return (absolutePath) => {
2018
- const rel = relative(root, absolutePath);
2019
- if (excludeMatcher && excludeMatcher(rel)) return false;
2020
- if (includeMatcher) return includeMatcher(rel);
2021
- return true;
2022
- };
2023
- }
2024
- function findTsFiles(dir, filter) {
2025
- const results = [];
2026
- let entries;
2027
- try {
2028
- entries = readdirSync(dir, { withFileTypes: true });
2029
- } catch (err) {
2030
- console.warn(
2031
- `[rsc-router] Failed to scan directory ${dir}: ${err.message}`
2032
- );
2033
- return results;
2034
- }
2035
- for (const entry of entries) {
2036
- const fullPath = join(dir, entry.name);
2037
- if (entry.isDirectory()) {
2038
- if (entry.name === "node_modules" || entry.name.startsWith(".")) continue;
2039
- results.push(...findTsFiles(fullPath, filter));
2040
- } else if ((entry.name.endsWith(".ts") || entry.name.endsWith(".tsx") || entry.name.endsWith(".js") || entry.name.endsWith(".jsx")) && !entry.name.includes(".gen.")) {
2041
- if (filter && !filter(fullPath)) continue;
2042
- results.push(fullPath);
2043
- }
2044
- }
2045
- return results;
2046
- }
2047
2099
 
2048
2100
  // src/build/route-types/per-module-writer.ts
2049
2101
  import ts4 from "typescript";
@@ -2244,6 +2296,9 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
2244
2296
  diagnosticsOut
2245
2297
  );
2246
2298
  }
2299
+ if (namePrefix === null) {
2300
+ continue;
2301
+ }
2247
2302
  for (const [name, pattern] of Object.entries(childResult.routes)) {
2248
2303
  const prefixedName = namePrefix ? `${namePrefix}.${name}` : name;
2249
2304
  let prefixedPattern;
@@ -2262,7 +2317,7 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
2262
2317
  }
2263
2318
  return routeMap;
2264
2319
  }
2265
- function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut) {
2320
+ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut, inlineBlock) {
2266
2321
  visited = visited ?? /* @__PURE__ */ new Set();
2267
2322
  const realPath = resolve2(filePath);
2268
2323
  const key = variableName ? `${realPath}:${variableName}` : realPath;
@@ -2278,7 +2333,9 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
2278
2333
  return { routes: {}, searchSchemas: {} };
2279
2334
  }
2280
2335
  let block;
2281
- if (variableName) {
2336
+ if (inlineBlock) {
2337
+ block = inlineBlock;
2338
+ } else if (variableName) {
2282
2339
  const extracted = extractUrlsBlockForVariable(source, variableName);
2283
2340
  if (!extracted) return { routes: {}, searchSchemas: {} };
2284
2341
  block = extracted;
@@ -2294,14 +2351,110 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
2294
2351
  searchSchemas,
2295
2352
  diagnosticsOut
2296
2353
  );
2354
+ visited.delete(key);
2297
2355
  return { routes, searchSchemas };
2298
2356
  }
2299
2357
 
2300
2358
  // src/build/route-types/router-processing.ts
2301
- import { readFileSync as readFileSync2, writeFileSync, existsSync as existsSync3, unlinkSync } from "node:fs";
2302
- import { join as join2, dirname as dirname2, resolve as resolve3, basename as pathBasename } from "node:path";
2359
+ import {
2360
+ readFileSync as readFileSync2,
2361
+ writeFileSync,
2362
+ existsSync as existsSync3,
2363
+ unlinkSync,
2364
+ readdirSync
2365
+ } from "node:fs";
2366
+ import {
2367
+ join,
2368
+ dirname as dirname2,
2369
+ resolve as resolve3,
2370
+ sep,
2371
+ basename as pathBasename
2372
+ } from "node:path";
2303
2373
  import ts5 from "typescript";
2304
- function extractUrlsVariableFromRouter(code) {
2374
+ function countPublicRouteEntries(source) {
2375
+ const matches = source.matchAll(/^\s+(?:"([^"]+)"|([a-zA-Z_$][^:]*)):\s*["{]/gm) ?? [];
2376
+ let count = 0;
2377
+ for (const match of matches) {
2378
+ const routeName = match[1] || match[2];
2379
+ if (routeName && !isAutoGeneratedRouteName(routeName.trim())) {
2380
+ count++;
2381
+ }
2382
+ }
2383
+ return count;
2384
+ }
2385
+ var ROUTER_CALL_PATTERN = /\bcreateRouter\s*[<(]/;
2386
+ function isRoutableSourceFile(name) {
2387
+ return (name.endsWith(".ts") || name.endsWith(".tsx") || name.endsWith(".js") || name.endsWith(".jsx")) && !name.includes(".gen.") && !name.includes(".test.") && !name.includes(".spec.");
2388
+ }
2389
+ function findRouterFilesRecursive(dir, filter, results) {
2390
+ let entries;
2391
+ try {
2392
+ entries = readdirSync(dir, { withFileTypes: true });
2393
+ } catch (err) {
2394
+ console.warn(
2395
+ `[rsc-router] Failed to scan directory ${dir}: ${err.message}`
2396
+ );
2397
+ return;
2398
+ }
2399
+ const childDirs = [];
2400
+ const routerFilesInDir = [];
2401
+ for (const entry of entries) {
2402
+ const fullPath = join(dir, entry.name);
2403
+ if (entry.isDirectory()) {
2404
+ if (entry.name === "node_modules" || entry.name === "dist" || entry.name === "coverage" || entry.name === "__tests__" || entry.name === "__mocks__" || entry.name.startsWith("."))
2405
+ continue;
2406
+ childDirs.push(fullPath);
2407
+ continue;
2408
+ }
2409
+ if (!isRoutableSourceFile(entry.name)) continue;
2410
+ if (filter && !filter(fullPath)) continue;
2411
+ try {
2412
+ const source = readFileSync2(fullPath, "utf-8");
2413
+ if (ROUTER_CALL_PATTERN.test(source)) {
2414
+ routerFilesInDir.push(fullPath);
2415
+ }
2416
+ } catch {
2417
+ continue;
2418
+ }
2419
+ }
2420
+ if (routerFilesInDir.length > 0) {
2421
+ results.push(...routerFilesInDir);
2422
+ return;
2423
+ }
2424
+ for (const childDir of childDirs) {
2425
+ findRouterFilesRecursive(childDir, filter, results);
2426
+ }
2427
+ }
2428
+ function findNestedRouterConflict(routerFiles) {
2429
+ const routerDirs = [
2430
+ ...new Set(routerFiles.map((filePath) => dirname2(resolve3(filePath))))
2431
+ ].sort((a, b) => a.length - b.length);
2432
+ for (let i = 0; i < routerDirs.length; i++) {
2433
+ const ancestorDir = routerDirs[i];
2434
+ const prefix = ancestorDir.endsWith(sep) ? ancestorDir : `${ancestorDir}${sep}`;
2435
+ for (let j = i + 1; j < routerDirs.length; j++) {
2436
+ const nestedDir = routerDirs[j];
2437
+ if (!nestedDir.startsWith(prefix)) continue;
2438
+ const ancestorFile = routerFiles.find(
2439
+ (filePath) => dirname2(resolve3(filePath)) === ancestorDir
2440
+ );
2441
+ const nestedFile = routerFiles.find(
2442
+ (filePath) => dirname2(resolve3(filePath)) === nestedDir
2443
+ );
2444
+ if (ancestorFile && nestedFile) {
2445
+ return { ancestor: ancestorFile, nested: nestedFile };
2446
+ }
2447
+ }
2448
+ }
2449
+ return null;
2450
+ }
2451
+ function formatNestedRouterConflictError(conflict, prefix = "[rsc-router]") {
2452
+ return `${prefix} Nested router roots are not supported.
2453
+ Router root: ${conflict.ancestor}
2454
+ Nested router: ${conflict.nested}
2455
+ Move the nested router into a sibling directory or configure it as a separate app root.`;
2456
+ }
2457
+ function extractUrlsFromRouter(code) {
2305
2458
  const sourceFile = ts5.createSourceFile(
2306
2459
  "router.tsx",
2307
2460
  code,
@@ -2315,24 +2468,70 @@ function extractUrlsVariableFromRouter(code) {
2315
2468
  const callee = node.expression;
2316
2469
  return ts5.isIdentifier(callee) && callee.text === "createRouter";
2317
2470
  }
2471
+ function isInlineBuilder(node) {
2472
+ return ts5.isArrowFunction(node) || ts5.isFunctionExpression(node);
2473
+ }
2474
+ function isRoutesOnCreateRouter(node) {
2475
+ if (!ts5.isPropertyAccessExpression(node.expression) || node.expression.name.text !== "routes")
2476
+ return false;
2477
+ let inner = node.expression.expression;
2478
+ while (ts5.isCallExpression(inner) && ts5.isPropertyAccessExpression(inner.expression)) {
2479
+ inner = inner.expression.expression;
2480
+ }
2481
+ return isCreateRouterCall(inner);
2482
+ }
2318
2483
  function visit(node) {
2319
2484
  if (result) return;
2320
- if (ts5.isCallExpression(node) && ts5.isPropertyAccessExpression(node.expression) && node.expression.name.text === "routes" && node.arguments.length >= 1 && ts5.isIdentifier(node.arguments[0])) {
2321
- let inner = node.expression.expression;
2322
- while (ts5.isCallExpression(inner) && ts5.isPropertyAccessExpression(inner.expression)) {
2323
- inner = inner.expression.expression;
2324
- }
2325
- if (isCreateRouterCall(inner)) {
2326
- result = node.arguments[0].text;
2327
- return;
2485
+ if (ts5.isCallExpression(node) && node.arguments.length >= 1 && isRoutesOnCreateRouter(node)) {
2486
+ const arg = node.arguments[0];
2487
+ if (ts5.isIdentifier(arg)) {
2488
+ result = { kind: "variable", name: arg.text };
2489
+ } else if (isInlineBuilder(arg)) {
2490
+ result = { kind: "inline", block: arg.getText(sourceFile) };
2328
2491
  }
2492
+ return;
2329
2493
  }
2330
2494
  if (isCreateRouterCall(node)) {
2331
2495
  const callExpr = node;
2332
- for (const arg of callExpr.arguments) {
2496
+ for (const callArg of callExpr.arguments) {
2497
+ if (ts5.isObjectLiteralExpression(callArg)) {
2498
+ for (const prop of callArg.properties) {
2499
+ if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "urls") {
2500
+ if (ts5.isIdentifier(prop.initializer)) {
2501
+ result = { kind: "variable", name: prop.initializer.text };
2502
+ } else if (isInlineBuilder(prop.initializer)) {
2503
+ result = {
2504
+ kind: "inline",
2505
+ block: prop.initializer.getText(sourceFile)
2506
+ };
2507
+ }
2508
+ return;
2509
+ }
2510
+ }
2511
+ }
2512
+ }
2513
+ }
2514
+ ts5.forEachChild(node, visit);
2515
+ }
2516
+ visit(sourceFile);
2517
+ return result;
2518
+ }
2519
+ function extractBasenameFromRouter(code) {
2520
+ const sourceFile = ts5.createSourceFile(
2521
+ "router.tsx",
2522
+ code,
2523
+ ts5.ScriptTarget.Latest,
2524
+ true,
2525
+ ts5.ScriptKind.TSX
2526
+ );
2527
+ let result;
2528
+ function visit(node) {
2529
+ if (result !== void 0) return;
2530
+ if (ts5.isCallExpression(node) && ts5.isIdentifier(node.expression) && node.expression.text === "createRouter") {
2531
+ for (const arg of node.arguments) {
2333
2532
  if (ts5.isObjectLiteralExpression(arg)) {
2334
2533
  for (const prop of arg.properties) {
2335
- if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "urls" && ts5.isIdentifier(prop.initializer)) {
2534
+ if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "basename" && ts5.isStringLiteral(prop.initializer)) {
2336
2535
  result = prop.initializer.text;
2337
2536
  return;
2338
2537
  }
@@ -2345,6 +2544,19 @@ function extractUrlsVariableFromRouter(code) {
2345
2544
  visit(sourceFile);
2346
2545
  return result;
2347
2546
  }
2547
+ function applyBasenameToRoutes(result, basename3) {
2548
+ const prefixed = {};
2549
+ for (const [name, pattern] of Object.entries(result.routes)) {
2550
+ if (pattern === "/") {
2551
+ prefixed[name] = basename3;
2552
+ } else if (basename3.endsWith("/") && pattern.startsWith("/")) {
2553
+ prefixed[name] = basename3 + pattern.slice(1);
2554
+ } else {
2555
+ prefixed[name] = basename3 + pattern;
2556
+ }
2557
+ }
2558
+ return { routes: prefixed, searchSchemas: result.searchSchemas };
2559
+ }
2348
2560
  function buildCombinedRouteMapForRouterFile(routerFilePath) {
2349
2561
  let routerSource;
2350
2562
  try {
@@ -2352,39 +2564,49 @@ function buildCombinedRouteMapForRouterFile(routerFilePath) {
2352
2564
  } catch {
2353
2565
  return { routes: {}, searchSchemas: {} };
2354
2566
  }
2355
- const urlsVarName = extractUrlsVariableFromRouter(routerSource);
2356
- if (!urlsVarName) {
2567
+ const extraction = extractUrlsFromRouter(routerSource);
2568
+ if (!extraction) {
2357
2569
  return { routes: {}, searchSchemas: {} };
2358
2570
  }
2359
- const imported = resolveImportedVariable(routerSource, urlsVarName);
2360
- if (imported) {
2361
- const targetFile = resolveImportPath(imported.specifier, routerFilePath);
2362
- if (!targetFile) {
2363
- return { routes: {}, searchSchemas: {} };
2571
+ const rawBasename = extractBasenameFromRouter(routerSource);
2572
+ const basename3 = rawBasename ? ("/" + rawBasename.replace(/^\/+|\/+$/g, "")).replace(/^\/$/, "") : void 0;
2573
+ let result;
2574
+ if (extraction.kind === "inline") {
2575
+ result = buildCombinedRouteMapWithSearch(
2576
+ routerFilePath,
2577
+ void 0,
2578
+ void 0,
2579
+ void 0,
2580
+ extraction.block
2581
+ );
2582
+ } else {
2583
+ const imported = resolveImportedVariable(routerSource, extraction.name);
2584
+ if (imported) {
2585
+ const targetFile = resolveImportPath(imported.specifier, routerFilePath);
2586
+ if (!targetFile) {
2587
+ return { routes: {}, searchSchemas: {} };
2588
+ }
2589
+ result = buildCombinedRouteMapWithSearch(
2590
+ targetFile,
2591
+ imported.exportedName
2592
+ );
2593
+ } else {
2594
+ result = buildCombinedRouteMapWithSearch(routerFilePath, extraction.name);
2364
2595
  }
2365
- return buildCombinedRouteMapWithSearch(targetFile, imported.exportedName);
2366
2596
  }
2367
- return buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
2597
+ if (basename3) {
2598
+ result = applyBasenameToRoutes(result, basename3);
2599
+ }
2600
+ return result;
2368
2601
  }
2369
2602
  function findRouterFiles(root, filter) {
2370
- const files = findTsFiles(root, filter);
2371
2603
  const result = [];
2372
- for (const filePath of files) {
2373
- if (filePath.includes(".gen.")) continue;
2374
- try {
2375
- const source = readFileSync2(filePath, "utf-8");
2376
- if (/\bcreateRouter\s*[<(]/.test(source)) {
2377
- result.push(filePath);
2378
- }
2379
- } catch {
2380
- continue;
2381
- }
2382
- }
2604
+ findRouterFilesRecursive(root, filter, result);
2383
2605
  return result;
2384
2606
  }
2385
2607
  function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
2386
2608
  try {
2387
- const oldCombinedPath = join2(root, "src", "named-routes.gen.ts");
2609
+ const oldCombinedPath = join(root, "src", "named-routes.gen.ts");
2388
2610
  if (existsSync3(oldCombinedPath)) {
2389
2611
  unlinkSync(oldCombinedPath);
2390
2612
  console.log(
@@ -2395,32 +2617,26 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
2395
2617
  }
2396
2618
  const routerFilePaths = knownRouterFiles ?? findRouterFiles(root);
2397
2619
  if (routerFilePaths.length === 0) return;
2620
+ const nestedRouterConflict = findNestedRouterConflict(routerFilePaths);
2621
+ if (nestedRouterConflict) {
2622
+ throw new Error(formatNestedRouterConflictError(nestedRouterConflict));
2623
+ }
2398
2624
  for (const routerFilePath of routerFilePaths) {
2399
- let routerSource;
2400
- try {
2401
- routerSource = readFileSync2(routerFilePath, "utf-8");
2402
- } catch {
2403
- continue;
2404
- }
2405
- const urlsVarName = extractUrlsVariableFromRouter(routerSource);
2406
- if (!urlsVarName) continue;
2407
- let result;
2408
- const imported = resolveImportedVariable(routerSource, urlsVarName);
2409
- if (imported) {
2410
- const targetFile = resolveImportPath(imported.specifier, routerFilePath);
2411
- if (!targetFile) continue;
2412
- result = buildCombinedRouteMapWithSearch(
2413
- targetFile,
2414
- imported.exportedName
2415
- );
2416
- } else {
2417
- result = buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
2625
+ const result = buildCombinedRouteMapForRouterFile(routerFilePath);
2626
+ if (Object.keys(result.routes).length === 0 && Object.keys(result.searchSchemas).length === 0) {
2627
+ let routerSource;
2628
+ try {
2629
+ routerSource = readFileSync2(routerFilePath, "utf-8");
2630
+ } catch {
2631
+ continue;
2632
+ }
2633
+ if (!extractUrlsFromRouter(routerSource)) continue;
2418
2634
  }
2419
2635
  const routerBasename = pathBasename(routerFilePath).replace(
2420
2636
  /\.(tsx?|jsx?)$/,
2421
2637
  ""
2422
2638
  );
2423
- const outPath = join2(
2639
+ const outPath = join(
2424
2640
  dirname2(routerFilePath),
2425
2641
  `${routerBasename}.named-routes.gen.ts`
2426
2642
  );
@@ -2439,8 +2655,10 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
2439
2655
  );
2440
2656
  if (existing !== source) {
2441
2657
  if (opts?.preserveIfLarger && existing) {
2442
- const existingCount = (existing.match(/^\s+["a-zA-Z_$][^:]*:\s*["{]/gm) || []).length;
2443
- const newCount = Object.keys(result.routes).length;
2658
+ const existingCount = countPublicRouteEntries(existing);
2659
+ const newCount = Object.keys(result.routes).filter(
2660
+ (name) => !isAutoGeneratedRouteName(name)
2661
+ ).length;
2444
2662
  if (existingCount > newCount) {
2445
2663
  continue;
2446
2664
  }
@@ -2548,8 +2766,9 @@ function createVersionPlugin() {
2548
2766
  let isDev = false;
2549
2767
  let server = null;
2550
2768
  const clientModuleSignatures = /* @__PURE__ */ new Map();
2769
+ let versionCounter = 0;
2551
2770
  const bumpVersion = (reason) => {
2552
- currentVersion = Date.now().toString(16);
2771
+ currentVersion = Date.now().toString(16) + String(++versionCounter);
2553
2772
  console.log(`[rsc-router] ${reason}, version updated: ${currentVersion}`);
2554
2773
  const rscEnv = server?.environments?.rsc;
2555
2774
  const versionMod = rscEnv?.moduleGraph?.getModuleById(
@@ -2605,6 +2824,9 @@ function createVersionPlugin() {
2605
2824
  if (!isDev) return;
2606
2825
  const isRscModule = this.environment?.name === "rsc";
2607
2826
  if (!isRscModule) return;
2827
+ if (ctx.modules.length === 1 && ctx.modules[0].id === "\0" + VIRTUAL_IDS.version) {
2828
+ return;
2829
+ }
2608
2830
  if (isCodeModule(ctx.file)) {
2609
2831
  const filePath = normalizeModuleId(ctx.file);
2610
2832
  const previousSignature = clientModuleSignatures.get(filePath);
@@ -2634,6 +2856,68 @@ function createVersionPlugin() {
2634
2856
 
2635
2857
  // src/vite/utils/shared-utils.ts
2636
2858
  import * as Vite from "vite";
2859
+
2860
+ // src/vite/plugins/performance-tracks.ts
2861
+ import { readFile } from "node:fs/promises";
2862
+ var RSDW_PATCH_RE = /((?:var|let|const)\s+\w+\s*=\s*root\._children\s*,\s*(\w+)\s*=\s*root\._debugInfo\s*[;,])/;
2863
+ function buildPatchReplacement(match, debugInfoVar) {
2864
+ return `${match}
2865
+ if (${debugInfoVar} && 0 === ${debugInfoVar}.length && "fulfilled" === root.status) {
2866
+ var _resolved = "function" === typeof resolveLazy ? resolveLazy(root.value) : root.value;
2867
+ if ("object" === typeof _resolved && null !== _resolved && isArrayImpl(_resolved._debugInfo)) {
2868
+ ${debugInfoVar} = _resolved._debugInfo;
2869
+ }
2870
+ }`;
2871
+ }
2872
+ function patchRsdwClientDebugInfoRecovery(code) {
2873
+ const match = code.match(RSDW_PATCH_RE);
2874
+ if (!match) {
2875
+ return { code, debugInfoVar: null };
2876
+ }
2877
+ return {
2878
+ code: code.replace(match[1], buildPatchReplacement(match[1], match[2])),
2879
+ debugInfoVar: match[2]
2880
+ };
2881
+ }
2882
+ function performanceTracksOptimizeDepsPlugin() {
2883
+ return {
2884
+ name: "@rangojs/router:performance-tracks-optimize-deps",
2885
+ setup(build) {
2886
+ build.onLoad(
2887
+ {
2888
+ filter: /react-server-dom-webpack-client\.browser\.(development|production)\.js$/
2889
+ },
2890
+ async (args) => {
2891
+ const code = await readFile(args.path, "utf8");
2892
+ const patched = patchRsdwClientDebugInfoRecovery(code);
2893
+ return {
2894
+ contents: patched.code,
2895
+ loader: "js"
2896
+ };
2897
+ }
2898
+ );
2899
+ }
2900
+ };
2901
+ }
2902
+ function performanceTracksPlugin() {
2903
+ return {
2904
+ name: "@rangojs/router:performance-tracks",
2905
+ transform(code, id) {
2906
+ if (!id.includes("react-server-dom") || !id.includes("client")) return;
2907
+ const patched = patchRsdwClientDebugInfoRecovery(code);
2908
+ if (!patched.debugInfoVar) return;
2909
+ if (process.env.INTERNAL_RANGO_DEBUG)
2910
+ console.log(
2911
+ "[perf-tracks] patched RSDW client (var:",
2912
+ patched.debugInfoVar,
2913
+ ")"
2914
+ );
2915
+ return patched.code;
2916
+ }
2917
+ };
2918
+ }
2919
+
2920
+ // src/vite/utils/shared-utils.ts
2637
2921
  var versionEsbuildPlugin = {
2638
2922
  name: "@rangojs/router-version",
2639
2923
  setup(build) {
@@ -2651,7 +2935,7 @@ var versionEsbuildPlugin = {
2651
2935
  }
2652
2936
  };
2653
2937
  var sharedEsbuildOptions = {
2654
- plugins: [versionEsbuildPlugin]
2938
+ plugins: [versionEsbuildPlugin, performanceTracksOptimizeDepsPlugin()]
2655
2939
  };
2656
2940
  function createVirtualEntriesPlugin(entries, routerPathRef) {
2657
2941
  const virtualModules = {};
@@ -2684,7 +2968,8 @@ function createVirtualEntriesPlugin(entries, routerPathRef) {
2684
2968
  return virtualModules[virtualId];
2685
2969
  }
2686
2970
  if (virtualId === VIRTUAL_IDS.rsc && routerPathRef?.path) {
2687
- const absoluteRouterPath = routerPathRef.path.startsWith(".") ? "/" + routerPathRef.path.slice(2) : routerPathRef.path;
2971
+ const raw = routerPathRef.path.startsWith(".") ? "/" + routerPathRef.path.slice(2) : routerPathRef.path;
2972
+ const absoluteRouterPath = raw.replaceAll("\\", "/");
2688
2973
  return getVirtualEntryRSC(absoluteRouterPath);
2689
2974
  }
2690
2975
  }
@@ -2733,11 +3018,11 @@ ${dim} \u2571${reset} ${bold}\u2554\u2550\u2557${reset}${dim} * \u2
2733
3018
  ${dim} ${reset}${bold}\u2551 \u2551${reset} ${bold}\u2554\u2550\u2557${reset}${dim} * \u2727. \u2571${reset}
2734
3019
  ${dim} ${reset}${bold}\u2554\u2557 \u2551 \u2551 \u2551 \u2551${reset}${dim} * \u2571${reset}
2735
3020
  ${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}
2736
- ${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}
3021
+ ${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}
2737
3022
  ${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}
2738
3023
  ${dim} ${reset}${bold}\u255A\u2550\u2550\u2557 \u2551${reset}${dim} * RSC Wrangler \u2727 \u2726${reset}
2739
- ${dim} * ${reset}${bold}\u2551 \u2560\u2550${reset}${dim} * \u2727. \u2571${reset}
2740
- ${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}
3024
+ ${dim} * ${reset}${bold}\u2551 \u2551${reset}${dim} * \u2727. \u2571${reset}
3025
+ ${dim} ${reset}${bold}\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550${reset}${dim} \u2726 *${reset}
2741
3026
 
2742
3027
  v${version} \xB7 ${preset} \xB7 ${mode}
2743
3028
  `;
@@ -2854,6 +3139,7 @@ function createCjsToEsmPlugin() {
2854
3139
 
2855
3140
  // src/vite/router-discovery.ts
2856
3141
  import { createServer as createViteServer } from "vite";
3142
+ import { resolve as resolve8 } from "node:path";
2857
3143
  import { readFileSync as readFileSync6 } from "node:fs";
2858
3144
 
2859
3145
  // src/vite/plugins/virtual-stub-plugin.ts
@@ -2881,7 +3167,7 @@ function createVirtualStubPlugin() {
2881
3167
  }
2882
3168
 
2883
3169
  // src/vite/plugins/client-ref-hashing.ts
2884
- import { relative as relative2, posix } from "node:path";
3170
+ import { relative } from "node:path";
2885
3171
  import { createHash as createHash2 } from "node:crypto";
2886
3172
  var CLIENT_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-package-proxy/";
2887
3173
  var CLIENT_IN_SERVER_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-in-server-package-proxy/";
@@ -2894,10 +3180,10 @@ function computeProductionHash(projectRoot, refKey) {
2894
3180
  const absPath = decodeURIComponent(
2895
3181
  refKey.slice(CLIENT_IN_SERVER_PKG_PROXY_PREFIX.length)
2896
3182
  );
2897
- toHash = posix.normalize(relative2(projectRoot, absPath));
3183
+ toHash = relative(projectRoot, absPath).replaceAll("\\", "/");
2898
3184
  } else if (refKey.startsWith(FS_PREFIX)) {
2899
3185
  const absPath = refKey.slice(FS_PREFIX.length - 1);
2900
- toHash = posix.normalize(relative2(projectRoot, absPath));
3186
+ toHash = relative(projectRoot, absPath).replaceAll("\\", "/");
2901
3187
  } else if (refKey.startsWith("/")) {
2902
3188
  toHash = refKey.slice(1);
2903
3189
  } else {
@@ -3036,8 +3322,8 @@ function createDiscoveryState(entryPath, opts) {
3036
3322
  perRouterTrieMap: /* @__PURE__ */ new Map(),
3037
3323
  perRouterPrecomputedMap: /* @__PURE__ */ new Map(),
3038
3324
  perRouterManifestDataMap: /* @__PURE__ */ new Map(),
3039
- prerenderCollectedData: null,
3040
- staticCollectedData: null,
3325
+ prerenderManifestEntries: null,
3326
+ staticManifestEntries: null,
3041
3327
  handlerChunkInfo: null,
3042
3328
  staticHandlerChunkInfo: null,
3043
3329
  rscEntryFileName: null,
@@ -3122,8 +3408,17 @@ function jsonParseExpression(value) {
3122
3408
  }
3123
3409
 
3124
3410
  // src/context-var.ts
3411
+ var NON_CACHEABLE_KEYS = /* @__PURE__ */ Symbol.for(
3412
+ "rango:non-cacheable-keys"
3413
+ );
3414
+ function getNonCacheableKeys(variables) {
3415
+ if (!variables[NON_CACHEABLE_KEYS]) {
3416
+ variables[NON_CACHEABLE_KEYS] = /* @__PURE__ */ new Set();
3417
+ }
3418
+ return variables[NON_CACHEABLE_KEYS];
3419
+ }
3125
3420
  var FORBIDDEN_KEYS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
3126
- function contextSet(variables, keyOrVar, value) {
3421
+ function contextSet(variables, keyOrVar, value, options) {
3127
3422
  if (typeof keyOrVar === "string") {
3128
3423
  if (FORBIDDEN_KEYS.has(keyOrVar)) {
3129
3424
  throw new Error(
@@ -3131,18 +3426,46 @@ function contextSet(variables, keyOrVar, value) {
3131
3426
  );
3132
3427
  }
3133
3428
  variables[keyOrVar] = value;
3429
+ if (options?.cache === false) {
3430
+ getNonCacheableKeys(variables).add(keyOrVar);
3431
+ }
3134
3432
  } else {
3135
3433
  variables[keyOrVar.key] = value;
3434
+ if (options?.cache === false) {
3435
+ getNonCacheableKeys(variables).add(keyOrVar.key);
3436
+ }
3136
3437
  }
3137
3438
  }
3138
3439
 
3139
3440
  // src/vite/utils/prerender-utils.ts
3441
+ import { createHash as createHash4 } from "node:crypto";
3442
+ import {
3443
+ copyFileSync,
3444
+ existsSync as existsSync4,
3445
+ mkdirSync,
3446
+ rmSync,
3447
+ statSync,
3448
+ writeFileSync as writeFileSync2
3449
+ } from "node:fs";
3450
+ import { resolve as resolve5 } from "node:path";
3140
3451
  function escapeRegExp2(str) {
3141
3452
  return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
3142
3453
  }
3143
3454
  function encodePathParam(value) {
3144
3455
  return String(value).split("/").map((segment) => encodeURIComponent(segment)).join("/");
3145
3456
  }
3457
+ function substituteRouteParams(pattern, params, encode = encodeURIComponent) {
3458
+ let result = pattern;
3459
+ for (const [key, value] of Object.entries(params)) {
3460
+ const escaped = escapeRegExp2(key);
3461
+ result = result.replace(
3462
+ new RegExp(`:${escaped}(\\([^)]*\\))?\\??`),
3463
+ encode(value)
3464
+ );
3465
+ result = result.replace(`*${key}`, encode(value));
3466
+ }
3467
+ return result;
3468
+ }
3146
3469
  async function runWithConcurrency(items, concurrency, fn) {
3147
3470
  const limit = Math.max(1, Math.min(concurrency, items.length));
3148
3471
  if (limit <= 1) {
@@ -3203,6 +3526,37 @@ function notifyOnError(registry, error, phase, routeKey, pathname, skipped) {
3203
3526
  break;
3204
3527
  }
3205
3528
  }
3529
+ function getStagedAssetDir(projectRoot) {
3530
+ return resolve5(projectRoot, "node_modules/.rangojs-router-build/rsc-assets");
3531
+ }
3532
+ function resetStagedBuildAssets(projectRoot) {
3533
+ rmSync(getStagedAssetDir(projectRoot), { recursive: true, force: true });
3534
+ }
3535
+ function stageBuildAssetModule(projectRoot, prefix, exportValue) {
3536
+ const stagedDir = getStagedAssetDir(projectRoot);
3537
+ mkdirSync(stagedDir, { recursive: true });
3538
+ const contentHash = createHash4("sha256").update(exportValue).digest("hex").slice(0, 8);
3539
+ const fileName = `${prefix}-${contentHash}.js`;
3540
+ const filePath = resolve5(stagedDir, fileName);
3541
+ if (!existsSync4(filePath)) {
3542
+ writeFileSync2(filePath, `export default ${exportValue};
3543
+ `);
3544
+ }
3545
+ return fileName;
3546
+ }
3547
+ function copyStagedBuildAssets(projectRoot, fileNames) {
3548
+ const stagedDir = getStagedAssetDir(projectRoot);
3549
+ const distAssetsDir = resolve5(projectRoot, "dist/rsc/assets");
3550
+ mkdirSync(distAssetsDir, { recursive: true });
3551
+ let totalBytes = 0;
3552
+ for (const fileName of new Set(fileNames)) {
3553
+ const stagedPath = resolve5(stagedDir, fileName);
3554
+ const distPath = resolve5(distAssetsDir, fileName);
3555
+ copyFileSync(stagedPath, distPath);
3556
+ totalBytes += statSync(stagedPath).size;
3557
+ }
3558
+ return totalBytes;
3559
+ }
3206
3560
 
3207
3561
  // src/vite/discovery/prerender-collection.ts
3208
3562
  async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
@@ -3215,18 +3569,8 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3215
3569
  const getParamsReverse = (name, params) => {
3216
3570
  const pattern = allRoutes[name];
3217
3571
  if (!pattern) throw new Error(`Unknown route: "${name}"`);
3218
- let result = pattern;
3219
- if (params) {
3220
- for (const [key, value] of Object.entries(params)) {
3221
- const escaped = escapeRegExp2(key);
3222
- result = result.replace(
3223
- new RegExp(`:${escaped}(\\([^)]*\\))?`),
3224
- encodeURIComponent(value)
3225
- );
3226
- result = result.replace(`*${key}`, encodeURIComponent(value));
3227
- }
3228
- }
3229
- return result;
3572
+ if (!params) return pattern;
3573
+ return substituteRouteParams(pattern, params);
3230
3574
  };
3231
3575
  for (const { manifest } of allManifests) {
3232
3576
  if (!manifest.prerenderRoutes) continue;
@@ -3234,15 +3578,17 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3234
3578
  for (const routeName of manifest.prerenderRoutes) {
3235
3579
  const pattern = manifest.routeManifest[routeName];
3236
3580
  if (!pattern) continue;
3581
+ const def = defs[routeName];
3582
+ const isPassthroughRoute = !!def?.options?.passthrough;
3237
3583
  const hasDynamic = pattern.includes(":") || pattern.includes("*");
3238
3584
  if (!hasDynamic) {
3239
3585
  entries.push({
3240
3586
  urlPath: pattern.replace(/\/$/, "") || "/",
3241
3587
  routeName,
3242
- concurrency: 1
3588
+ concurrency: 1,
3589
+ isPassthroughRoute
3243
3590
  });
3244
3591
  } else {
3245
- const def = defs[routeName];
3246
3592
  if (def?.getParams) {
3247
3593
  try {
3248
3594
  const buildVars = {};
@@ -3257,18 +3603,11 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3257
3603
  const concurrency = def.options?.concurrency ?? 1;
3258
3604
  const hasBuildVars = Object.keys(buildVars).length > 0 || Object.getOwnPropertySymbols(buildVars).length > 0;
3259
3605
  for (const params of paramsList) {
3260
- let url = pattern;
3261
- for (const [key, value] of Object.entries(
3262
- params
3263
- )) {
3264
- const encoded = encodePathParam(value);
3265
- const escaped = escapeRegExp2(key);
3266
- url = url.replace(
3267
- new RegExp(`:${escaped}(\\([^)]*\\))?`),
3268
- encoded
3269
- );
3270
- url = url.replace(`*${key}`, encoded);
3271
- }
3606
+ let url = substituteRouteParams(
3607
+ pattern,
3608
+ params,
3609
+ encodePathParam
3610
+ );
3272
3611
  if (url.includes("*")) {
3273
3612
  const wildcardValue = params["*"] ?? params.splat;
3274
3613
  if (wildcardValue !== void 0) {
@@ -3279,7 +3618,8 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3279
3618
  urlPath: url.replace(/\/$/, "") || "/",
3280
3619
  routeName,
3281
3620
  concurrency,
3282
- ...hasBuildVars ? { buildVars } : {}
3621
+ ...hasBuildVars ? { buildVars } : {},
3622
+ isPassthroughRoute
3283
3623
  });
3284
3624
  }
3285
3625
  } catch (err) {
@@ -3318,7 +3658,7 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3318
3658
  `[rsc-router] Pre-rendering ${entries.length} URL(s)${concurrencyNote}...`
3319
3659
  );
3320
3660
  const { hashParams } = await rscEnv.runner.import("@rangojs/router/build");
3321
- const collectedData = {};
3661
+ const manifestEntries = {};
3322
3662
  let doneCount = 0;
3323
3663
  let skipCount = 0;
3324
3664
  const startTotal = performance.now();
@@ -3335,22 +3675,43 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3335
3675
  const result = await routerInstance.matchForPrerender(
3336
3676
  entry.urlPath,
3337
3677
  {},
3338
- entry.buildVars
3678
+ entry.buildVars,
3679
+ entry.isPassthroughRoute
3339
3680
  );
3340
3681
  if (!result) continue;
3682
+ if (result.passthrough) {
3683
+ const elapsed2 = (performance.now() - startUrl).toFixed(0);
3684
+ console.log(
3685
+ `[rsc-router] PASS ${entry.urlPath.padEnd(40)} (${elapsed2}ms) - live fallback`
3686
+ );
3687
+ doneCount++;
3688
+ break;
3689
+ }
3341
3690
  const paramHash = hashParams(result.params || {});
3342
- collectedData[`${result.routeName}/${paramHash}`] = {
3691
+ const mainKey = `${result.routeName}/${paramHash}`;
3692
+ const mainValue = JSON.stringify({
3343
3693
  segments: result.segments,
3344
3694
  handles: result.handles
3345
- };
3695
+ });
3696
+ manifestEntries[mainKey] = stageBuildAssetModule(
3697
+ state.projectRoot,
3698
+ "__pr",
3699
+ mainValue
3700
+ );
3346
3701
  if (result.interceptSegments?.length) {
3347
- collectedData[`${result.routeName}/${paramHash}/i`] = {
3702
+ const interceptKey = `${result.routeName}/${paramHash}/i`;
3703
+ const interceptValue = JSON.stringify({
3348
3704
  segments: [...result.segments, ...result.interceptSegments],
3349
3705
  handles: {
3350
3706
  ...result.handles,
3351
3707
  ...result.interceptHandles || {}
3352
3708
  }
3353
- };
3709
+ });
3710
+ manifestEntries[interceptKey] = stageBuildAssetModule(
3711
+ state.projectRoot,
3712
+ "__pr",
3713
+ interceptValue
3714
+ );
3354
3715
  }
3355
3716
  const elapsed = (performance.now() - startUrl).toFixed(0);
3356
3717
  console.log(
@@ -3394,7 +3755,7 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3394
3755
  }
3395
3756
  const totalElapsed = (performance.now() - startTotal).toFixed(0);
3396
3757
  if (doneCount > 0) {
3397
- state.prerenderCollectedData = collectedData;
3758
+ state.prerenderManifestEntries = manifestEntries;
3398
3759
  }
3399
3760
  const parts = [`${doneCount} done`];
3400
3761
  if (skipCount > 0) parts.push(`${skipCount} skipped`);
@@ -3405,7 +3766,7 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3405
3766
  async function renderStaticHandlers(state, rscEnv, registry) {
3406
3767
  if (!state.opts?.enableBuildPrerender || !state.isBuildMode || !state.resolvedStaticModules?.size)
3407
3768
  return;
3408
- const collected = {};
3769
+ const manifestEntries = {};
3409
3770
  let staticDone = 0;
3410
3771
  let staticSkip = 0;
3411
3772
  let totalStaticCount = 0;
@@ -3442,7 +3803,13 @@ async function renderStaticHandlers(state, rscEnv, registry) {
3442
3803
  def.$$routePrefix
3443
3804
  );
3444
3805
  if (result) {
3445
- collected[def.$$id] = result;
3806
+ const hasHandles = Object.keys(result.handles).length > 0;
3807
+ const exportValue = hasHandles ? JSON.stringify(result) : JSON.stringify(result.encoded);
3808
+ manifestEntries[def.$$id] = stageBuildAssetModule(
3809
+ state.projectRoot,
3810
+ "__st",
3811
+ exportValue
3812
+ );
3446
3813
  const elapsed = (performance.now() - startHandler).toFixed(0);
3447
3814
  console.log(
3448
3815
  `[rsc-router] OK ${name.padEnd(40)} (${elapsed}ms)`
@@ -3479,7 +3846,7 @@ async function renderStaticHandlers(state, rscEnv, registry) {
3479
3846
  }
3480
3847
  const totalStaticElapsed = (performance.now() - startStatic).toFixed(0);
3481
3848
  if (staticDone > 0) {
3482
- state.staticCollectedData = collected;
3849
+ state.staticManifestEntries = manifestEntries;
3483
3850
  }
3484
3851
  const staticParts = [`${staticDone} done`];
3485
3852
  if (staticSkip > 0) staticParts.push(`${staticSkip} skipped`);
@@ -3496,8 +3863,7 @@ async function discoverRouters(state, rscEnv) {
3496
3863
  let registry = serverMod.RouterRegistry;
3497
3864
  if (!registry || registry.size === 0) {
3498
3865
  try {
3499
- const hostMod = await rscEnv.runner.import("@rangojs/router/host");
3500
- const hostRegistry = hostMod.HostRouterRegistry;
3866
+ const hostRegistry = serverMod.HostRouterRegistry;
3501
3867
  if (hostRegistry && hostRegistry.size > 0) {
3502
3868
  console.log(
3503
3869
  `[rsc-router] Found ${hostRegistry.size} host router(s), resolving lazy handlers...`
@@ -3537,12 +3903,20 @@ async function discoverRouters(state, rscEnv) {
3537
3903
  }
3538
3904
  const buildMod = await rscEnv.runner.import("@rangojs/router/build");
3539
3905
  const generateManifestFull = buildMod.generateManifestFull;
3540
- state.mergedRouteManifest = {};
3541
- state.mergedPrecomputedEntries = [];
3542
- state.perRouterManifests = [];
3543
- state.perRouterManifestDataMap = /* @__PURE__ */ new Map();
3544
- state.perRouterPrecomputedMap = /* @__PURE__ */ new Map();
3545
- state.perRouterTrieMap = /* @__PURE__ */ new Map();
3906
+ const nestedRouterConflict = findNestedRouterConflict(
3907
+ [...registry.values()].map((router) => router.__sourceFile).filter(
3908
+ (sourceFile) => typeof sourceFile === "string"
3909
+ )
3910
+ );
3911
+ if (nestedRouterConflict) {
3912
+ throw new Error(formatNestedRouterConflictError(nestedRouterConflict));
3913
+ }
3914
+ const newMergedRouteManifest = {};
3915
+ const newMergedPrecomputedEntries = [];
3916
+ const newPerRouterManifests = [];
3917
+ const newPerRouterManifestDataMap = /* @__PURE__ */ new Map();
3918
+ const newPerRouterPrecomputedMap = /* @__PURE__ */ new Map();
3919
+ const newPerRouterTrieMap = /* @__PURE__ */ new Map();
3546
3920
  let mergedRouteAncestry = {};
3547
3921
  let mergedRouteTrailingSlash = {};
3548
3922
  let routerMountIndex = 0;
@@ -3551,7 +3925,11 @@ async function discoverRouters(state, rscEnv) {
3551
3925
  if (!router.urlpatterns || !generateManifestFull) {
3552
3926
  continue;
3553
3927
  }
3554
- const manifest = generateManifestFull(router.urlpatterns, routerMountIndex);
3928
+ const manifest = generateManifestFull(
3929
+ router.urlpatterns,
3930
+ routerMountIndex,
3931
+ router.__basename ? { urlPrefix: router.__basename } : void 0
3932
+ );
3555
3933
  routerMountIndex++;
3556
3934
  allManifests.push({ id, manifest });
3557
3935
  const routeCount = Object.keys(manifest.routeManifest).length;
@@ -3559,7 +3937,7 @@ async function discoverRouters(state, rscEnv) {
3559
3937
  (p) => !p.includes(":") && !p.includes("*")
3560
3938
  ).length;
3561
3939
  const dynamicRoutes = routeCount - staticRoutes;
3562
- Object.assign(state.mergedRouteManifest, manifest.routeManifest);
3940
+ Object.assign(newMergedRouteManifest, manifest.routeManifest);
3563
3941
  let factoryOnlyPrefixes;
3564
3942
  if (router.__sourceFile) {
3565
3943
  const staticParsed = buildCombinedRouteMapForRouterFile(
@@ -3577,7 +3955,7 @@ async function discoverRouters(state, rscEnv) {
3577
3955
  }
3578
3956
  if (factoryOnlyPrefixes.size === 0) factoryOnlyPrefixes = void 0;
3579
3957
  }
3580
- state.perRouterManifests.push({
3958
+ newPerRouterManifests.push({
3581
3959
  id,
3582
3960
  routeManifest: manifest.routeManifest,
3583
3961
  routeSearchSchemas: manifest.routeSearchSchemas,
@@ -3593,16 +3971,16 @@ async function discoverRouters(state, rscEnv) {
3593
3971
  flattenLeafEntries(
3594
3972
  manifest.prefixTree,
3595
3973
  manifest.routeManifest,
3596
- state.mergedPrecomputedEntries
3974
+ newMergedPrecomputedEntries
3597
3975
  );
3598
- state.perRouterManifestDataMap.set(id, manifest.routeManifest);
3976
+ newPerRouterManifestDataMap.set(id, manifest.routeManifest);
3599
3977
  const routerPrecomputed = [];
3600
3978
  flattenLeafEntries(
3601
3979
  manifest.prefixTree,
3602
3980
  manifest.routeManifest,
3603
3981
  routerPrecomputed
3604
3982
  );
3605
- state.perRouterPrecomputedMap.set(id, routerPrecomputed);
3983
+ newPerRouterPrecomputedMap.set(id, routerPrecomputed);
3606
3984
  console.log(
3607
3985
  `[rsc-router] Router "${id}" -> ${routeCount} routes (${staticRoutes} static, ${dynamicRoutes} dynamic)`
3608
3986
  );
@@ -3617,7 +3995,8 @@ async function discoverRouters(state, rscEnv) {
3617
3995
  );
3618
3996
  }
3619
3997
  }
3620
- if (state.mergedRouteManifest && Object.keys(state.mergedRouteManifest).length > 0) {
3998
+ let newMergedRouteTrie = null;
3999
+ if (Object.keys(newMergedRouteManifest).length > 0) {
3621
4000
  const buildRouteTrie = buildMod.buildRouteTrie;
3622
4001
  if (buildRouteTrie && mergedRouteAncestry) {
3623
4002
  const routeToStaticPrefix = {};
@@ -3647,8 +4026,8 @@ async function discoverRouters(state, rscEnv) {
3647
4026
  Object.assign(mergedResponseTypeRoutes, manifest.responseTypeRoutes);
3648
4027
  }
3649
4028
  }
3650
- state.mergedRouteTrie = buildRouteTrie(
3651
- state.mergedRouteManifest,
4029
+ newMergedRouteTrie = buildRouteTrie(
4030
+ newMergedRouteManifest,
3652
4031
  mergedRouteAncestry,
3653
4032
  routeToStaticPrefix,
3654
4033
  Object.keys(mergedRouteTrailingSlash).length > 0 ? mergedRouteTrailingSlash : void 0,
@@ -3675,22 +4054,29 @@ async function discoverRouters(state, rscEnv) {
3675
4054
  perRouterPassthroughNames && perRouterPassthroughNames.size > 0 ? perRouterPassthroughNames : void 0,
3676
4055
  manifest.responseTypeRoutes && Object.keys(manifest.responseTypeRoutes).length > 0 ? manifest.responseTypeRoutes : void 0
3677
4056
  );
3678
- state.perRouterTrieMap.set(id, perRouterTrie);
4057
+ newPerRouterTrieMap.set(id, perRouterTrie);
3679
4058
  }
3680
4059
  }
3681
4060
  }
4061
+ state.mergedRouteManifest = newMergedRouteManifest;
4062
+ state.mergedPrecomputedEntries = newMergedPrecomputedEntries;
4063
+ state.perRouterManifests = newPerRouterManifests;
4064
+ state.perRouterManifestDataMap = newPerRouterManifestDataMap;
4065
+ state.perRouterPrecomputedMap = newPerRouterPrecomputedMap;
4066
+ state.perRouterTrieMap = newPerRouterTrieMap;
4067
+ state.mergedRouteTrie = newMergedRouteTrie;
3682
4068
  await expandPrerenderRoutes(state, rscEnv, registry, allManifests);
3683
4069
  await renderStaticHandlers(state, rscEnv, registry);
3684
4070
  return serverMod;
3685
4071
  }
3686
4072
 
3687
4073
  // src/vite/discovery/route-types-writer.ts
3688
- import { dirname as dirname3, basename, join as join3, resolve as resolve5 } from "node:path";
3689
- import { readFileSync as readFileSync4, writeFileSync as writeFileSync2, existsSync as existsSync4, unlinkSync as unlinkSync2 } from "node:fs";
4074
+ import { dirname as dirname3, basename, join as join2, resolve as resolve6 } from "node:path";
4075
+ import { readFileSync as readFileSync4, writeFileSync as writeFileSync3, existsSync as existsSync5, unlinkSync as unlinkSync2 } from "node:fs";
3690
4076
  function filterUserNamedRoutes(manifest) {
3691
4077
  const filtered = {};
3692
4078
  for (const [name, pattern] of Object.entries(manifest)) {
3693
- if (!name.startsWith("$")) {
4079
+ if (!isAutoGeneratedRouteName(name)) {
3694
4080
  filtered[name] = pattern;
3695
4081
  }
3696
4082
  }
@@ -3706,7 +4092,7 @@ function writeCombinedRouteTypesWithTracking(state, opts) {
3706
4092
  /\.(tsx?|jsx?)$/,
3707
4093
  ""
3708
4094
  );
3709
- const outPath = join3(routerDir, `${routerBasename}.named-routes.gen.ts`);
4095
+ const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
3710
4096
  try {
3711
4097
  preContent.set(outPath, readFileSync4(outPath, "utf-8"));
3712
4098
  } catch {
@@ -3719,8 +4105,8 @@ function writeCombinedRouteTypesWithTracking(state, opts) {
3719
4105
  /\.(tsx?|jsx?)$/,
3720
4106
  ""
3721
4107
  );
3722
- const outPath = join3(routerDir, `${routerBasename}.named-routes.gen.ts`);
3723
- if (!existsSync4(outPath)) continue;
4108
+ const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
4109
+ if (!existsSync5(outPath)) continue;
3724
4110
  try {
3725
4111
  const content = readFileSync4(outPath, "utf-8");
3726
4112
  if (content !== preContent.get(outPath)) {
@@ -3734,10 +4120,10 @@ function writeRouteTypesFiles(state) {
3734
4120
  if (state.perRouterManifests.length === 0) return;
3735
4121
  try {
3736
4122
  const entryDir = dirname3(
3737
- resolve5(state.projectRoot, state.resolvedEntryPath)
4123
+ resolve6(state.projectRoot, state.resolvedEntryPath)
3738
4124
  );
3739
- const oldCombinedPath = join3(entryDir, "named-routes.gen.ts");
3740
- if (existsSync4(oldCombinedPath)) {
4125
+ const oldCombinedPath = join2(entryDir, "named-routes.gen.ts");
4126
+ if (existsSync5(oldCombinedPath)) {
3741
4127
  unlinkSync2(oldCombinedPath);
3742
4128
  console.log(
3743
4129
  `[rsc-router] Removed stale combined route types: ${oldCombinedPath}`
@@ -3761,7 +4147,7 @@ Set an explicit \`id\` on createRouter() or check the call site.`
3761
4147
  }
3762
4148
  const routerDir = dirname3(sourceFile);
3763
4149
  const routerBasename = basename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
3764
- const outPath = join3(routerDir, `${routerBasename}.named-routes.gen.ts`);
4150
+ const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
3765
4151
  const userRoutes = filterUserNamedRoutes(routeManifest);
3766
4152
  let effectiveSearchSchemas = routeSearchSchemas;
3767
4153
  if ((!effectiveSearchSchemas || Object.keys(effectiveSearchSchemas).length === 0) && sourceFile) {
@@ -3781,10 +4167,10 @@ Set an explicit \`id\` on createRouter() or check the call site.`
3781
4167
  userRoutes,
3782
4168
  effectiveSearchSchemas && Object.keys(effectiveSearchSchemas).length > 0 ? effectiveSearchSchemas : void 0
3783
4169
  );
3784
- const existing = existsSync4(outPath) ? readFileSync4(outPath, "utf-8") : null;
4170
+ const existing = existsSync5(outPath) ? readFileSync4(outPath, "utf-8") : null;
3785
4171
  if (existing !== source) {
3786
4172
  markSelfGenWrite(state, outPath, source);
3787
- writeFileSync2(outPath, source);
4173
+ writeFileSync3(outPath, source);
3788
4174
  console.log(`[rsc-router] Generated route types -> ${outPath}`);
3789
4175
  }
3790
4176
  }
@@ -3813,7 +4199,7 @@ function supplementGenFilesWithRuntimeRoutes(state) {
3813
4199
  ...staticParsed.searchSchemas
3814
4200
  };
3815
4201
  for (const [name, pattern] of Object.entries(routeManifest)) {
3816
- if (name.startsWith("$")) continue;
4202
+ if (isAutoGeneratedRouteName(name)) continue;
3817
4203
  const dotIdx = name.indexOf(".");
3818
4204
  if (dotIdx <= 0) continue;
3819
4205
  const prefix = name.substring(0, dotIdx + 1);
@@ -3826,21 +4212,21 @@ function supplementGenFilesWithRuntimeRoutes(state) {
3826
4212
  }
3827
4213
  const routerDir = dirname3(sourceFile);
3828
4214
  const routerBasename = basename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
3829
- const outPath = join3(routerDir, `${routerBasename}.named-routes.gen.ts`);
4215
+ const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
3830
4216
  const source = generateRouteTypesSource(
3831
4217
  mergedRoutes,
3832
4218
  Object.keys(mergedSearchSchemas).length > 0 ? mergedSearchSchemas : void 0
3833
4219
  );
3834
- const existing = existsSync4(outPath) ? readFileSync4(outPath, "utf-8") : null;
4220
+ const existing = existsSync5(outPath) ? readFileSync4(outPath, "utf-8") : null;
3835
4221
  if (existing !== source) {
3836
4222
  markSelfGenWrite(state, outPath, source);
3837
- writeFileSync2(outPath, source);
4223
+ writeFileSync3(outPath, source);
3838
4224
  }
3839
4225
  }
3840
4226
  }
3841
4227
 
3842
4228
  // src/vite/discovery/virtual-module-codegen.ts
3843
- import { dirname as dirname4, basename as basename2, join as join4 } from "node:path";
4229
+ import { dirname as dirname4, basename as basename2, join as join3 } from "node:path";
3844
4230
  function generateRoutesManifestModule(state) {
3845
4231
  const hasManifest = state.mergedRouteManifest && Object.keys(state.mergedRouteManifest).length > 0;
3846
4232
  if (hasManifest) {
@@ -3855,10 +4241,10 @@ function generateRoutesManifestModule(state) {
3855
4241
  /\.(tsx?|jsx?)$/,
3856
4242
  ""
3857
4243
  );
3858
- const genPath = join4(
4244
+ const genPath = join3(
3859
4245
  routerDir,
3860
4246
  `${routerBasename}.named-routes.gen.js`
3861
- );
4247
+ ).replaceAll("\\", "/");
3862
4248
  const varName = `_r${varIdx++}`;
3863
4249
  genFileImports.push(
3864
4250
  `import { NamedRoutes as ${varName} } from ${JSON.stringify(genPath)};`
@@ -3952,7 +4338,10 @@ function generatePerRouterModule(state, routerId) {
3952
4338
  /\.(tsx?|jsx?)$/,
3953
4339
  ""
3954
4340
  );
3955
- const genPath = join4(routerDir, `${routerBasename}.named-routes.gen.js`);
4341
+ const genPath = join3(
4342
+ routerDir,
4343
+ `${routerBasename}.named-routes.gen.js`
4344
+ ).replaceAll("\\", "/");
3956
4345
  lines.push(`import { NamedRoutes as _r } from ${JSON.stringify(genPath)};`);
3957
4346
  lines.push(
3958
4347
  `function __flat(r) { const o = {}; for (const [k, v] of Object.entries(r)) o[k] = typeof v === "string" ? v : v.path; return o; }`
@@ -3976,14 +4365,13 @@ function generatePerRouterModule(state, routerId) {
3976
4365
  }
3977
4366
 
3978
4367
  // src/vite/discovery/bundle-postprocess.ts
3979
- import { resolve as resolve6 } from "node:path";
3980
- import { createHash as createHash4 } from "node:crypto";
3981
- import { readFileSync as readFileSync5, writeFileSync as writeFileSync3, existsSync as existsSync5, mkdirSync } from "node:fs";
4368
+ import { resolve as resolve7 } from "node:path";
4369
+ import { readFileSync as readFileSync5, writeFileSync as writeFileSync4, existsSync as existsSync6 } from "node:fs";
3982
4370
  function postprocessBundle(state) {
3983
- const hasPrerenderData = state.prerenderCollectedData && Object.keys(state.prerenderCollectedData).length > 0;
3984
- const hasStaticData = state.staticCollectedData && Object.keys(state.staticCollectedData).length > 0;
4371
+ const hasPrerenderData = state.prerenderManifestEntries && Object.keys(state.prerenderManifestEntries).length > 0;
4372
+ const hasStaticData = state.staticManifestEntries && Object.keys(state.staticManifestEntries).length > 0;
3985
4373
  if (!hasPrerenderData && !hasStaticData) return;
3986
- const rscEntryPath = resolve6(
4374
+ const rscEntryPath = resolve7(
3987
4375
  state.projectRoot,
3988
4376
  "dist/rsc",
3989
4377
  state.rscEntryFileName ?? "index.js"
@@ -4004,7 +4392,7 @@ function postprocessBundle(state) {
4004
4392
  ];
4005
4393
  for (const target of evictionTargets) {
4006
4394
  if (!target.info) continue;
4007
- const chunkPath = resolve6(
4395
+ const chunkPath = resolve7(
4008
4396
  state.projectRoot,
4009
4397
  "dist/rsc",
4010
4398
  target.info.fileName
@@ -4018,7 +4406,7 @@ function postprocessBundle(state) {
4018
4406
  target.brand
4019
4407
  );
4020
4408
  if (result) {
4021
- writeFileSync3(chunkPath, result.code);
4409
+ writeFileSync4(chunkPath, result.code);
4022
4410
  const savedKB = (result.savedBytes / 1024).toFixed(1);
4023
4411
  console.log(
4024
4412
  `[rsc-router] Evicted ${target.label} (${savedKB} KB saved): ${target.info.fileName}`
@@ -4032,44 +4420,38 @@ function postprocessBundle(state) {
4032
4420
  }
4033
4421
  state.handlerChunkInfo = null;
4034
4422
  state.staticHandlerChunkInfo = null;
4035
- if (hasPrerenderData && existsSync5(rscEntryPath)) {
4423
+ if (hasPrerenderData && existsSync6(rscEntryPath)) {
4036
4424
  const rscCode = readFileSync5(rscEntryPath, "utf-8");
4037
- if (!rscCode.includes("__PRERENDER_MANIFEST")) {
4425
+ if (!rscCode.includes("__prerender-manifest.js")) {
4038
4426
  try {
4039
- const assetsDir = resolve6(state.projectRoot, "dist/rsc/assets");
4040
- mkdirSync(assetsDir, { recursive: true });
4041
- const manifestEntries = [];
4042
- let totalBytes = 0;
4043
- for (const [key, entry] of Object.entries(
4044
- state.prerenderCollectedData
4427
+ let totalBytes = copyStagedBuildAssets(
4428
+ state.projectRoot,
4429
+ Object.values(state.prerenderManifestEntries)
4430
+ );
4431
+ const manifestMap = {};
4432
+ for (const [key, assetFileName] of Object.entries(
4433
+ state.prerenderManifestEntries
4045
4434
  )) {
4046
- const entryJson = JSON.stringify(entry);
4047
- const contentHash = createHash4("sha256").update(entryJson).digest("hex").slice(0, 8);
4048
- const assetFileName = `__pr-${contentHash}.js`;
4049
- const assetPath = resolve6(assetsDir, assetFileName);
4050
- const assetCode = `export default ${entryJson};
4051
- `;
4052
- writeFileSync3(assetPath, assetCode);
4053
- totalBytes += Buffer.byteLength(assetCode);
4054
- manifestEntries.push(
4055
- `${JSON.stringify(key)}:()=>import("./assets/${assetFileName}")`
4056
- );
4435
+ manifestMap[key] = `./assets/${assetFileName}`;
4057
4436
  }
4058
- const manifestCode = `const m={${manifestEntries.join(",")}};export default m;
4059
- `;
4060
- const manifestPath = resolve6(
4437
+ const manifestCode = [
4438
+ `const m=JSON.parse('${JSON.stringify(manifestMap).replace(/'/g, "\\'")}');`,
4439
+ `export function loadPrerenderAsset(s){return import(s)}`,
4440
+ `export default m;`,
4441
+ ""
4442
+ ].join("\n");
4443
+ const manifestPath = resolve7(
4061
4444
  state.projectRoot,
4062
4445
  "dist/rsc/__prerender-manifest.js"
4063
4446
  );
4064
- writeFileSync3(manifestPath, manifestCode);
4447
+ writeFileSync4(manifestPath, manifestCode);
4065
4448
  totalBytes += Buffer.byteLength(manifestCode);
4066
- const injection = `import __pm from "./__prerender-manifest.js";
4067
- globalThis.__PRERENDER_MANIFEST = __pm;
4449
+ const injection = `globalThis.__loadPrerenderManifestModule = () => import("./__prerender-manifest.js");
4068
4450
  `;
4069
- writeFileSync3(rscEntryPath, injection + rscCode);
4451
+ writeFileSync4(rscEntryPath, injection + rscCode);
4070
4452
  const totalKB = (totalBytes / 1024).toFixed(1);
4071
4453
  console.log(
4072
- `[rsc-router] Wrote prerender assets (${totalKB} KB total, ${Object.keys(state.prerenderCollectedData).length} entries)`
4454
+ `[rsc-router] Wrote prerender assets (${totalKB} KB total, ${Object.keys(state.prerenderManifestEntries).length} entries)`
4073
4455
  );
4074
4456
  } catch (err) {
4075
4457
  throw new Error(
@@ -4078,44 +4460,36 @@ globalThis.__PRERENDER_MANIFEST = __pm;
4078
4460
  }
4079
4461
  }
4080
4462
  }
4081
- if (hasStaticData && existsSync5(rscEntryPath)) {
4463
+ if (hasStaticData && existsSync6(rscEntryPath)) {
4082
4464
  const rscCode = readFileSync5(rscEntryPath, "utf-8");
4083
4465
  if (!rscCode.includes("__STATIC_MANIFEST")) {
4084
4466
  try {
4085
- const assetsDir = resolve6(state.projectRoot, "dist/rsc/assets");
4086
- mkdirSync(assetsDir, { recursive: true });
4087
4467
  const manifestEntries = [];
4088
- let totalBytes = 0;
4089
- for (const [handlerId, { encoded, handles }] of Object.entries(
4090
- state.staticCollectedData
4468
+ let totalBytes = copyStagedBuildAssets(
4469
+ state.projectRoot,
4470
+ Object.values(state.staticManifestEntries)
4471
+ );
4472
+ for (const [handlerId, assetFileName] of Object.entries(
4473
+ state.staticManifestEntries
4091
4474
  )) {
4092
- const contentHash = createHash4("sha256").update(encoded).digest("hex").slice(0, 8);
4093
- const assetFileName = `__st-${contentHash}.js`;
4094
- const assetPath = resolve6(assetsDir, assetFileName);
4095
- const hasHandles = Object.keys(handles).length > 0;
4096
- const exportValue = hasHandles ? JSON.stringify({ encoded, handles }) : JSON.stringify(encoded);
4097
- const assetCode = `export default ${exportValue};
4098
- `;
4099
- writeFileSync3(assetPath, assetCode);
4100
- totalBytes += Buffer.byteLength(assetCode);
4101
4475
  manifestEntries.push(
4102
4476
  `${JSON.stringify(handlerId)}:()=>import("./assets/${assetFileName}")`
4103
4477
  );
4104
4478
  }
4105
4479
  const manifestCode = `const m={${manifestEntries.join(",")}};globalThis.__STATIC_MANIFEST=m;export default m;
4106
4480
  `;
4107
- const manifestPath = resolve6(
4481
+ const manifestPath = resolve7(
4108
4482
  state.projectRoot,
4109
4483
  "dist/rsc/__static-manifest.js"
4110
4484
  );
4111
- writeFileSync3(manifestPath, manifestCode);
4485
+ writeFileSync4(manifestPath, manifestCode);
4112
4486
  totalBytes += Buffer.byteLength(manifestCode);
4113
4487
  const injection = `import "./__static-manifest.js";
4114
4488
  `;
4115
- writeFileSync3(rscEntryPath, injection + rscCode);
4489
+ writeFileSync4(rscEntryPath, injection + rscCode);
4116
4490
  const totalKB = (totalBytes / 1024).toFixed(1);
4117
4491
  console.log(
4118
- `[rsc-router] Wrote static assets (${totalKB} KB total, ${Object.keys(state.staticCollectedData).length} entries)`
4492
+ `[rsc-router] Wrote static assets (${totalKB} KB total, ${Object.keys(state.staticManifestEntries).length} entries)`
4119
4493
  );
4120
4494
  } catch (err) {
4121
4495
  throw new Error(
@@ -4205,12 +4579,6 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
4205
4579
  s.resolvedEntryPath = entries[0];
4206
4580
  }
4207
4581
  }
4208
- if (opts?.include || opts?.exclude) {
4209
- s.scanFilter = createScanFilter(s.projectRoot, {
4210
- include: opts.include,
4211
- exclude: opts.exclude
4212
- });
4213
- }
4214
4582
  if (opts?.staticRouteTypesGeneration !== false) {
4215
4583
  s.cachedRouterFiles = findRouterFiles(s.projectRoot, s.scanFilter);
4216
4584
  writeCombinedRouteTypesWithTracking(s, { preserveIfLarger: true });
@@ -4230,8 +4598,8 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
4230
4598
  if (globalThis.__rscRouterDiscoveryActive) return;
4231
4599
  s.devServer = server;
4232
4600
  let resolveDiscovery;
4233
- const discoveryPromise = new Promise((resolve8) => {
4234
- resolveDiscovery = resolve8;
4601
+ const discoveryPromise = new Promise((resolve10) => {
4602
+ resolveDiscovery = resolve10;
4235
4603
  });
4236
4604
  const getDevServerOrigin = () => server.resolvedUrls?.local?.[0]?.replace(/\/$/, "") || `http://localhost:${server.config.server.port || 5173}`;
4237
4605
  let prerenderTempServer = null;
@@ -4293,34 +4661,10 @@ ${err.stack}`
4293
4661
  if (serverMod?.setManifestReadyPromise) {
4294
4662
  serverMod.setManifestReadyPromise(discoveryPromise);
4295
4663
  }
4296
- const serverModAfterDiscovery = await discoverRouters(s, rscEnv);
4297
- mainRegistry = serverModAfterDiscovery?.RouterRegistry ?? null;
4664
+ await discoverRouters(s, rscEnv);
4298
4665
  s.devServerOrigin = getDevServerOrigin();
4299
4666
  writeRouteTypesFiles(s);
4300
- if (s.mergedRouteManifest && serverMod?.setCachedManifest) {
4301
- serverMod.setCachedManifest(s.mergedRouteManifest);
4302
- }
4303
- if (s.mergedPrecomputedEntries && s.mergedPrecomputedEntries.length > 0 && serverMod?.setPrecomputedEntries) {
4304
- serverMod.setPrecomputedEntries(s.mergedPrecomputedEntries);
4305
- }
4306
- if (s.mergedRouteTrie && serverMod?.setRouteTrie) {
4307
- serverMod.setRouteTrie(s.mergedRouteTrie);
4308
- }
4309
- if (serverMod?.setRouterManifest) {
4310
- for (const [routerId, manifest] of s.perRouterManifestDataMap) {
4311
- serverMod.setRouterManifest(routerId, manifest);
4312
- }
4313
- }
4314
- if (serverMod?.setRouterTrie) {
4315
- for (const [routerId, trie] of s.perRouterTrieMap) {
4316
- serverMod.setRouterTrie(routerId, trie);
4317
- }
4318
- }
4319
- if (serverMod?.setRouterPrecomputedEntries) {
4320
- for (const [routerId, entries] of s.perRouterPrecomputedMap) {
4321
- serverMod.setRouterPrecomputedEntries(routerId, entries);
4322
- }
4323
- }
4667
+ await propagateDiscoveryState(rscEnv);
4324
4668
  } catch (err) {
4325
4669
  console.warn(
4326
4670
  `[rsc-router] Router discovery failed: ${err.message}
@@ -4330,10 +4674,42 @@ ${err.stack}`
4330
4674
  resolveDiscovery();
4331
4675
  }
4332
4676
  };
4333
- s.discoveryDone = new Promise((resolve8) => {
4334
- setTimeout(() => discover().then(resolve8, resolve8), 0);
4677
+ s.discoveryDone = new Promise((resolve10) => {
4678
+ setTimeout(() => discover().then(resolve10, resolve10), 0);
4335
4679
  });
4336
4680
  let mainRegistry = null;
4681
+ const propagateDiscoveryState = async (rscEnv) => {
4682
+ const serverMod = await rscEnv.runner.import("@rangojs/router/server");
4683
+ if (!serverMod) return;
4684
+ if (serverMod.clearAllRouterData) {
4685
+ serverMod.clearAllRouterData();
4686
+ }
4687
+ mainRegistry = serverMod.RouterRegistry ?? null;
4688
+ if (s.mergedRouteManifest && serverMod.setCachedManifest) {
4689
+ serverMod.setCachedManifest(s.mergedRouteManifest);
4690
+ }
4691
+ if (s.mergedPrecomputedEntries && s.mergedPrecomputedEntries.length > 0 && serverMod.setPrecomputedEntries) {
4692
+ serverMod.setPrecomputedEntries(s.mergedPrecomputedEntries);
4693
+ }
4694
+ if (s.mergedRouteTrie && serverMod.setRouteTrie) {
4695
+ serverMod.setRouteTrie(s.mergedRouteTrie);
4696
+ }
4697
+ if (serverMod.setRouterManifest) {
4698
+ for (const [routerId, manifest] of s.perRouterManifestDataMap) {
4699
+ serverMod.setRouterManifest(routerId, manifest);
4700
+ }
4701
+ }
4702
+ if (serverMod.setRouterTrie) {
4703
+ for (const [routerId, trie] of s.perRouterTrieMap) {
4704
+ serverMod.setRouterTrie(routerId, trie);
4705
+ }
4706
+ }
4707
+ if (serverMod.setRouterPrecomputedEntries) {
4708
+ for (const [routerId, entries] of s.perRouterPrecomputedMap) {
4709
+ serverMod.setRouterPrecomputedEntries(routerId, entries);
4710
+ }
4711
+ }
4712
+ };
4337
4713
  server.middlewares.use("/__rsc_prerender", async (req, res) => {
4338
4714
  if (s.discoveryDone) await s.discoveryDone;
4339
4715
  const url = new URL(req.url || "/", "http://localhost");
@@ -4356,11 +4732,20 @@ ${err.stack}`
4356
4732
  return;
4357
4733
  }
4358
4734
  const wantIntercept = url.searchParams.get("intercept") === "1";
4735
+ const wantRouteName = url.searchParams.get("routeName");
4736
+ const wantPassthrough = url.searchParams.get("passthrough") === "1";
4359
4737
  for (const [, routerInstance] of registry) {
4360
4738
  if (!routerInstance.matchForPrerender) continue;
4361
4739
  try {
4362
- const result = await routerInstance.matchForPrerender(pathname, {});
4740
+ const result = await routerInstance.matchForPrerender(
4741
+ pathname,
4742
+ {},
4743
+ void 0,
4744
+ wantPassthrough
4745
+ );
4363
4746
  if (!result) continue;
4747
+ if (result.passthrough) continue;
4748
+ if (wantRouteName && result.routeName !== wantRouteName) continue;
4364
4749
  res.setHeader("content-type", "application/json");
4365
4750
  let payload;
4366
4751
  if (wantIntercept && result.interceptSegments?.length) {
@@ -4397,10 +4782,29 @@ ${err.stack}`
4397
4782
  const maybeHandleGeneratedRouteFileMutation = (filePath) => {
4398
4783
  if (!isGeneratedRouteFile(filePath)) return false;
4399
4784
  if (consumeSelfGenWrite(s, filePath)) return true;
4785
+ const hasRunner = !!server.environments?.rsc?.runner;
4786
+ if (!hasRunner) return true;
4400
4787
  regenerateGeneratedRouteFiles();
4401
4788
  return true;
4402
4789
  };
4403
4790
  let routeChangeTimer;
4791
+ let runtimeRediscoveryInProgress = false;
4792
+ const refreshRuntimeDiscovery = async () => {
4793
+ const rscEnv = server.environments?.rsc;
4794
+ if (!rscEnv?.runner || runtimeRediscoveryInProgress) return;
4795
+ runtimeRediscoveryInProgress = true;
4796
+ try {
4797
+ await discoverRouters(s, rscEnv);
4798
+ writeRouteTypesFiles(s);
4799
+ await propagateDiscoveryState(rscEnv);
4800
+ } catch (err) {
4801
+ console.warn(
4802
+ `[rsc-router] Runtime re-discovery failed: ${err.message}`
4803
+ );
4804
+ } finally {
4805
+ runtimeRediscoveryInProgress = false;
4806
+ }
4807
+ };
4404
4808
  const scheduleRouteRegeneration = () => {
4405
4809
  clearTimeout(routeChangeTimer);
4406
4810
  routeChangeTimer = setTimeout(() => {
@@ -4415,6 +4819,13 @@ ${err.stack}`
4415
4819
  `[rsc-router] Route regeneration error: ${err.message}`
4416
4820
  );
4417
4821
  }
4822
+ if (s.perRouterManifests.length > 0) {
4823
+ refreshRuntimeDiscovery().catch((err) => {
4824
+ console.warn(
4825
+ `[rsc-router] Runtime re-discovery error: ${err.message}`
4826
+ );
4827
+ });
4828
+ }
4418
4829
  }, 100);
4419
4830
  };
4420
4831
  const handleRouteFileChange = (filePath) => {
@@ -4431,6 +4842,16 @@ ${err.stack}`
4431
4842
  const hasCreateRouter = /\bcreateRouter\s*[<(]/.test(source);
4432
4843
  if (!hasUrls && !hasCreateRouter) return;
4433
4844
  if (hasCreateRouter) {
4845
+ const nestedRouterConflict = findNestedRouterConflict([
4846
+ ...s.cachedRouterFiles ?? [],
4847
+ resolve8(filePath)
4848
+ ]);
4849
+ if (nestedRouterConflict) {
4850
+ server.config.logger.error(
4851
+ formatNestedRouterConflictError(nestedRouterConflict)
4852
+ );
4853
+ return;
4854
+ }
4434
4855
  s.cachedRouterFiles = void 0;
4435
4856
  }
4436
4857
  scheduleRouteRegeneration();
@@ -4441,6 +4862,8 @@ ${err.stack}`
4441
4862
  server.watcher.on("change", handleRouteFileChange);
4442
4863
  server.watcher.on("unlink", (filePath) => {
4443
4864
  if (!isGeneratedRouteFile(filePath)) return;
4865
+ const hasRunner = !!server.environments?.rsc?.runner;
4866
+ if (!hasRunner) return;
4444
4867
  regenerateGeneratedRouteFiles();
4445
4868
  });
4446
4869
  }
@@ -4451,6 +4874,9 @@ ${err.stack}`
4451
4874
  async buildStart() {
4452
4875
  if (!s.isBuildMode) return;
4453
4876
  if (s.mergedRouteManifest !== null) return;
4877
+ resetStagedBuildAssets(s.projectRoot);
4878
+ s.prerenderManifestEntries = null;
4879
+ s.staticManifestEntries = null;
4454
4880
  let tempServer = null;
4455
4881
  globalThis.__rscRouterDiscoveryActive = true;
4456
4882
  try {
@@ -4580,8 +5006,16 @@ async function rango(options) {
4580
5006
  const showBanner = resolvedOptions.banner ?? true;
4581
5007
  const plugins = [];
4582
5008
  const rangoAliases = getPackageAliases();
4583
- const excludeDeps = getExcludeDeps();
4584
- let rscEntryPath = null;
5009
+ const excludeDeps = [
5010
+ ...getExcludeDeps(),
5011
+ // The public browser entry re-exports the RSDW browser client.
5012
+ // Excluding both keeps Vite from freezing the unpatched bundle into
5013
+ // .vite/deps before our source transforms run.
5014
+ "@vitejs/plugin-rsc/browser",
5015
+ // Keep the browser RSDW client out of Vite's dep optimizer so our
5016
+ // cjs-to-esm transform can patch the real file.
5017
+ "@vitejs/plugin-rsc/vendor/react-server-dom/client.browser"
5018
+ ];
4585
5019
  const routerRef = { path: void 0 };
4586
5020
  const prerenderEnabled = true;
4587
5021
  if (preset === "cloudflare") {
@@ -4677,160 +5111,132 @@ async function rango(options) {
4677
5111
  }
4678
5112
  });
4679
5113
  plugins.push(createVirtualEntriesPlugin(finalEntries));
5114
+ plugins.push(performanceTracksPlugin());
4680
5115
  plugins.push(
4681
5116
  rsc({
4682
5117
  entries: finalEntries,
4683
5118
  serverHandler: false
4684
5119
  })
4685
5120
  );
5121
+ plugins.push(clientRefDedup());
4686
5122
  } else {
4687
- const nodeOptions = resolvedOptions;
4688
- routerRef.path = nodeOptions.router;
4689
- if (!routerRef.path) {
4690
- plugins.push({
4691
- name: "@rangojs/router:auto-discover",
4692
- config(userConfig) {
4693
- if (routerRef.path) return;
4694
- const root = userConfig.root ? resolve7(process.cwd(), userConfig.root) : process.cwd();
4695
- const filter = createScanFilter(root, {
4696
- include: resolvedOptions.include,
4697
- exclude: resolvedOptions.exclude
4698
- });
4699
- const candidates = findRouterFiles(root, filter);
4700
- if (candidates.length === 1) {
4701
- const abs = candidates[0];
4702
- routerRef.path = abs.startsWith(root) ? "./" + abs.slice(root.length + 1) : abs;
4703
- } else if (candidates.length > 1) {
4704
- const list = candidates.map(
4705
- (f) => " - " + (f.startsWith(root) ? f.slice(root.length + 1) : f)
4706
- ).join("\n");
4707
- throw new Error(
4708
- `[rsc-router] Multiple routers found. Specify \`router\` to choose one:
4709
- ${list}`
4710
- );
4711
- }
5123
+ plugins.push({
5124
+ name: "@rangojs/router:auto-discover",
5125
+ config(userConfig) {
5126
+ if (routerRef.path) return;
5127
+ const root = userConfig.root ? resolve9(process.cwd(), userConfig.root) : process.cwd();
5128
+ const candidates = findRouterFiles(root);
5129
+ if (candidates.length === 1) {
5130
+ const abs = candidates[0];
5131
+ routerRef.path = (abs.startsWith(root) ? "./" + abs.slice(root.length + 1) : abs).replaceAll("\\", "/");
5132
+ } else if (candidates.length > 1) {
5133
+ const list = candidates.map(
5134
+ (f) => " - " + (f.startsWith(root) ? f.slice(root.length + 1) : f)
5135
+ ).join("\n");
5136
+ throw new Error(`[rsc-router] Multiple routers found:
5137
+ ${list}`);
4712
5138
  }
4713
- });
4714
- }
4715
- const rscOption = nodeOptions.rsc ?? true;
4716
- if (rscOption !== false) {
4717
- const { default: rsc } = await import("@vitejs/plugin-rsc");
4718
- const userEntries = typeof rscOption === "boolean" ? {} : rscOption.entries || {};
4719
- const finalEntries = {
4720
- client: userEntries.client ?? VIRTUAL_IDS.browser,
4721
- ssr: userEntries.ssr ?? VIRTUAL_IDS.ssr,
4722
- rsc: userEntries.rsc ?? VIRTUAL_IDS.rsc
4723
- };
4724
- rscEntryPath = userEntries.rsc ?? null;
4725
- let hasWarnedDuplicate = false;
4726
- plugins.push({
4727
- name: "@rangojs/router:rsc-integration",
4728
- enforce: "pre",
4729
- config() {
4730
- const useVirtualClient = finalEntries.client === VIRTUAL_IDS.browser;
4731
- const useVirtualSSR = finalEntries.ssr === VIRTUAL_IDS.ssr;
4732
- const useVirtualRSC = finalEntries.rsc === VIRTUAL_IDS.rsc;
4733
- return {
4734
- // Exclude rsc-router modules from optimization to prevent module duplication
4735
- // This ensures the same Context instance is used by both browser entry and RSC proxy modules
4736
- optimizeDeps: {
4737
- exclude: excludeDeps,
4738
- esbuildOptions: sharedEsbuildOptions
4739
- },
4740
- build: {
4741
- rollupOptions: { onwarn }
4742
- },
4743
- resolve: {
4744
- alias: rangoAliases
4745
- },
4746
- environments: {
4747
- client: {
4748
- build: {
4749
- rollupOptions: {
4750
- output: {
4751
- manualChunks: getManualChunks
4752
- }
4753
- }
4754
- },
4755
- // Always exclude rsc-router modules, conditionally add virtual entry
4756
- optimizeDeps: {
4757
- // Pre-bundle React and rsc-html-stream to prevent late discovery
4758
- // triggering ERR_OUTDATED_OPTIMIZED_DEP on cold starts
4759
- include: [
4760
- "react",
4761
- "react-dom",
4762
- "react/jsx-runtime",
4763
- "react/jsx-dev-runtime",
4764
- "rsc-html-stream/client"
4765
- ],
4766
- exclude: excludeDeps,
4767
- esbuildOptions: sharedEsbuildOptions,
4768
- ...useVirtualClient && {
4769
- // Tell Vite to scan the virtual entry for dependencies
4770
- entries: [VIRTUAL_IDS.browser]
4771
- }
4772
- }
4773
- },
4774
- ...useVirtualSSR && {
4775
- ssr: {
4776
- optimizeDeps: {
4777
- entries: [VIRTUAL_IDS.ssr],
4778
- // Pre-bundle all SSR deps to prevent late discovery triggering ERR_OUTDATED_OPTIMIZED_DEP
4779
- include: [
4780
- "react",
4781
- "react-dom",
4782
- "react-dom/server.edge",
4783
- "react-dom/static.edge",
4784
- "react/jsx-runtime",
4785
- "react/jsx-dev-runtime",
4786
- "@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
4787
- ],
4788
- exclude: excludeDeps,
4789
- esbuildOptions: sharedEsbuildOptions
5139
+ }
5140
+ });
5141
+ const finalEntries = {
5142
+ client: VIRTUAL_IDS.browser,
5143
+ ssr: VIRTUAL_IDS.ssr,
5144
+ rsc: VIRTUAL_IDS.rsc
5145
+ };
5146
+ const { default: rsc } = await import("@vitejs/plugin-rsc");
5147
+ let hasWarnedDuplicate = false;
5148
+ plugins.push({
5149
+ name: "@rangojs/router:rsc-integration",
5150
+ enforce: "pre",
5151
+ config() {
5152
+ return {
5153
+ optimizeDeps: {
5154
+ exclude: excludeDeps,
5155
+ esbuildOptions: sharedEsbuildOptions
5156
+ },
5157
+ build: {
5158
+ rollupOptions: { onwarn }
5159
+ },
5160
+ resolve: {
5161
+ alias: rangoAliases
5162
+ },
5163
+ environments: {
5164
+ client: {
5165
+ build: {
5166
+ rollupOptions: {
5167
+ output: {
5168
+ manualChunks: getManualChunks
4790
5169
  }
4791
5170
  }
4792
5171
  },
4793
- ...useVirtualRSC && {
4794
- rsc: {
4795
- optimizeDeps: {
4796
- entries: [VIRTUAL_IDS.rsc],
4797
- // Pre-bundle all RSC deps to prevent late discovery triggering ERR_OUTDATED_OPTIMIZED_DEP
4798
- include: [
4799
- "react",
4800
- "react/jsx-runtime",
4801
- "react/jsx-dev-runtime",
4802
- "@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
4803
- ],
4804
- esbuildOptions: sharedEsbuildOptions
4805
- }
4806
- }
5172
+ optimizeDeps: {
5173
+ include: [
5174
+ "react",
5175
+ "react-dom",
5176
+ "react/jsx-runtime",
5177
+ "react/jsx-dev-runtime",
5178
+ "rsc-html-stream/client"
5179
+ ],
5180
+ exclude: excludeDeps,
5181
+ esbuildOptions: sharedEsbuildOptions,
5182
+ entries: [VIRTUAL_IDS.browser]
5183
+ }
5184
+ },
5185
+ ssr: {
5186
+ optimizeDeps: {
5187
+ entries: [VIRTUAL_IDS.ssr],
5188
+ include: [
5189
+ "react",
5190
+ "react-dom",
5191
+ "react-dom/server.edge",
5192
+ "react-dom/static.edge",
5193
+ "react/jsx-runtime",
5194
+ "react/jsx-dev-runtime",
5195
+ "@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
5196
+ ],
5197
+ exclude: excludeDeps,
5198
+ esbuildOptions: sharedEsbuildOptions
5199
+ }
5200
+ },
5201
+ rsc: {
5202
+ optimizeDeps: {
5203
+ entries: [VIRTUAL_IDS.rsc],
5204
+ include: [
5205
+ "react",
5206
+ "react/jsx-runtime",
5207
+ "react/jsx-dev-runtime",
5208
+ "@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
5209
+ ],
5210
+ esbuildOptions: sharedEsbuildOptions
4807
5211
  }
4808
5212
  }
4809
- };
4810
- },
4811
- configResolved(config) {
4812
- if (showBanner) {
4813
- const mode = config.command === "serve" ? process.argv.includes("preview") ? "preview" : "dev" : "build";
4814
- printBanner(mode, "node", rangoVersion);
4815
- }
4816
- const rscMinimalCount = config.plugins.filter(
4817
- (p) => p.name === "rsc:minimal"
4818
- ).length;
4819
- if (rscMinimalCount > 1 && !hasWarnedDuplicate) {
4820
- hasWarnedDuplicate = true;
4821
- console.warn(
4822
- "[rsc-router] Duplicate @vitejs/plugin-rsc detected. Remove rsc() from your config or use rango({ rsc: false }) for manual configuration."
4823
- );
4824
5213
  }
5214
+ };
5215
+ },
5216
+ configResolved(config) {
5217
+ if (showBanner) {
5218
+ const mode = config.command === "serve" ? process.argv.includes("preview") ? "preview" : "dev" : "build";
5219
+ printBanner(mode, "node", rangoVersion);
4825
5220
  }
4826
- });
4827
- plugins.push(createVirtualEntriesPlugin(finalEntries, routerRef));
4828
- plugins.push(
4829
- rsc({
4830
- entries: finalEntries
4831
- })
4832
- );
4833
- }
5221
+ const rscMinimalCount = config.plugins.filter(
5222
+ (p) => p.name === "rsc:minimal"
5223
+ ).length;
5224
+ if (rscMinimalCount > 1 && !hasWarnedDuplicate) {
5225
+ hasWarnedDuplicate = true;
5226
+ console.warn(
5227
+ "[rsc-router] Duplicate @vitejs/plugin-rsc detected. Remove rsc() from your vite config \u2014 rango() includes it automatically."
5228
+ );
5229
+ }
5230
+ }
5231
+ });
5232
+ plugins.push(createVirtualEntriesPlugin(finalEntries, routerRef));
5233
+ plugins.push(performanceTracksPlugin());
5234
+ plugins.push(
5235
+ rsc({
5236
+ entries: finalEntries
5237
+ })
5238
+ );
5239
+ plugins.push(clientRefDedup());
4834
5240
  }
4835
5241
  plugins.push({
4836
5242
  name: "@rangojs/router:client-component-hmr",
@@ -4857,22 +5263,55 @@ ${list}`
4857
5263
  plugins.push(createVersionPlugin());
4858
5264
  const discoveryEntryPath = preset !== "cloudflare" ? routerRef.path : void 0;
4859
5265
  const discoveryRouterRef = preset !== "cloudflare" ? routerRef : void 0;
4860
- const injectorEntryPath = rscEntryPath ?? (preset === "cloudflare" ? void 0 : null);
4861
- if (injectorEntryPath !== null) {
4862
- plugins.push(createVersionInjectorPlugin(injectorEntryPath));
5266
+ if (preset === "cloudflare") {
5267
+ plugins.push(createVersionInjectorPlugin(void 0));
4863
5268
  }
4864
5269
  plugins.push(createCjsToEsmPlugin());
4865
5270
  plugins.push(
4866
5271
  createRouterDiscoveryPlugin(discoveryEntryPath, {
4867
5272
  routerPathRef: discoveryRouterRef,
4868
5273
  enableBuildPrerender: prerenderEnabled,
4869
- staticRouteTypesGeneration: resolvedOptions.staticRouteTypesGeneration,
4870
- include: resolvedOptions.include,
4871
- exclude: resolvedOptions.exclude
5274
+ staticRouteTypesGeneration: resolvedOptions.staticRouteTypesGeneration
4872
5275
  })
4873
5276
  );
4874
5277
  return plugins;
4875
5278
  }
5279
+
5280
+ // src/vite/plugins/refresh-cmd.ts
5281
+ function poke() {
5282
+ return {
5283
+ name: "vite-plugin-poke",
5284
+ apply: "serve",
5285
+ configureServer(server) {
5286
+ const stdin = process.stdin;
5287
+ const previousRawMode = stdin.isTTY ? stdin.isRaw : null;
5288
+ if (stdin.isTTY) {
5289
+ stdin.setRawMode(true);
5290
+ }
5291
+ const onData = (data) => {
5292
+ if (data.length !== 1) return;
5293
+ if (data[0] === 3) {
5294
+ process.emit("SIGINT", "SIGINT");
5295
+ return;
5296
+ }
5297
+ if (data[0] === 18) {
5298
+ server.hot.send({ type: "full-reload", path: "*" });
5299
+ server.config.logger.info(" browser reload (ctrl+r)", {
5300
+ timestamp: true
5301
+ });
5302
+ }
5303
+ };
5304
+ stdin.on("data", onData);
5305
+ server.httpServer?.on("close", () => {
5306
+ stdin.off("data", onData);
5307
+ if (stdin.isTTY && previousRawMode !== null) {
5308
+ stdin.setRawMode(previousRawMode);
5309
+ }
5310
+ });
5311
+ }
5312
+ };
5313
+ }
4876
5314
  export {
5315
+ poke,
4877
5316
  rango
4878
5317
  };