@rangojs/router 0.0.0-experimental.15 → 0.0.0-experimental.151

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 (1284) hide show
  1. package/AGENTS.md +13 -0
  2. package/README.md +308 -451
  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 +1844 -237
  82. package/dist/bin/rango.js.map +1 -0
  83. package/dist/browser/event-controller.d.ts +191 -0
  84. package/dist/browser/event-controller.d.ts.map +1 -0
  85. package/dist/browser/event-controller.js +559 -0
  86. package/dist/browser/event-controller.js.map +1 -0
  87. package/dist/browser/index.d.ts +2 -0
  88. package/dist/browser/index.d.ts.map +1 -0
  89. package/dist/browser/index.js +14 -0
  90. package/dist/browser/index.js.map +1 -0
  91. package/dist/browser/link-interceptor.d.ts +38 -0
  92. package/dist/browser/link-interceptor.d.ts.map +1 -0
  93. package/dist/browser/link-interceptor.js +99 -0
  94. package/dist/browser/link-interceptor.js.map +1 -0
  95. package/dist/browser/logging.d.ts +10 -0
  96. package/dist/browser/logging.d.ts.map +1 -0
  97. package/dist/browser/logging.js +29 -0
  98. package/dist/browser/logging.js.map +1 -0
  99. package/dist/browser/lru-cache.d.ts +17 -0
  100. package/dist/browser/lru-cache.d.ts.map +1 -0
  101. package/dist/browser/lru-cache.js +50 -0
  102. package/dist/browser/lru-cache.js.map +1 -0
  103. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  104. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  105. package/dist/browser/merge-segment-loaders.js +102 -0
  106. package/dist/browser/merge-segment-loaders.js.map +1 -0
  107. package/dist/browser/navigation-bridge.d.ts +102 -0
  108. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  109. package/dist/browser/navigation-bridge.js +708 -0
  110. package/dist/browser/navigation-bridge.js.map +1 -0
  111. package/dist/browser/navigation-client.d.ts +25 -0
  112. package/dist/browser/navigation-client.d.ts.map +1 -0
  113. package/dist/browser/navigation-client.js +157 -0
  114. package/dist/browser/navigation-client.js.map +1 -0
  115. package/dist/browser/navigation-store.d.ts +101 -0
  116. package/dist/browser/navigation-store.d.ts.map +1 -0
  117. package/dist/browser/navigation-store.js +625 -0
  118. package/dist/browser/navigation-store.js.map +1 -0
  119. package/dist/browser/partial-update.d.ts +75 -0
  120. package/dist/browser/partial-update.d.ts.map +1 -0
  121. package/dist/browser/partial-update.js +426 -0
  122. package/dist/browser/partial-update.js.map +1 -0
  123. package/dist/browser/react/Link.d.ts +86 -0
  124. package/dist/browser/react/Link.d.ts.map +1 -0
  125. package/dist/browser/react/Link.js +128 -0
  126. package/dist/browser/react/Link.js.map +1 -0
  127. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  128. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  129. package/dist/browser/react/NavigationProvider.js +216 -0
  130. package/dist/browser/react/NavigationProvider.js.map +1 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  132. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  133. package/dist/browser/react/ScrollRestoration.js +57 -0
  134. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  135. package/dist/browser/react/context.d.ts +46 -0
  136. package/dist/browser/react/context.d.ts.map +1 -0
  137. package/dist/browser/react/context.js +10 -0
  138. package/dist/browser/react/context.js.map +1 -0
  139. package/dist/browser/react/index.d.ts +11 -0
  140. package/dist/browser/react/index.d.ts.map +1 -0
  141. package/dist/browser/react/index.js +22 -0
  142. package/dist/browser/react/index.js.map +1 -0
  143. package/dist/browser/react/location-state-shared.d.ts +63 -0
  144. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  145. package/dist/browser/react/location-state-shared.js +81 -0
  146. package/dist/browser/react/location-state-shared.js.map +1 -0
  147. package/dist/browser/react/location-state.d.ts +23 -0
  148. package/dist/browser/react/location-state.d.ts.map +1 -0
  149. package/dist/browser/react/location-state.js +29 -0
  150. package/dist/browser/react/location-state.js.map +1 -0
  151. package/dist/browser/react/mount-context.d.ts +24 -0
  152. package/dist/browser/react/mount-context.d.ts.map +1 -0
  153. package/dist/browser/react/mount-context.js +24 -0
  154. package/dist/browser/react/mount-context.js.map +1 -0
  155. package/dist/browser/react/use-action.d.ts +64 -0
  156. package/dist/browser/react/use-action.d.ts.map +1 -0
  157. package/dist/browser/react/use-action.js +134 -0
  158. package/dist/browser/react/use-action.js.map +1 -0
  159. package/dist/browser/react/use-client-cache.d.ts +41 -0
  160. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  161. package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -26
  162. package/dist/browser/react/use-client-cache.js.map +1 -0
  163. package/dist/browser/react/use-handle.d.ts +31 -0
  164. package/dist/browser/react/use-handle.d.ts.map +1 -0
  165. package/dist/browser/react/use-handle.js +144 -0
  166. package/dist/browser/react/use-handle.js.map +1 -0
  167. package/dist/browser/react/use-href.d.ts +33 -0
  168. package/dist/browser/react/use-href.d.ts.map +1 -0
  169. package/dist/browser/react/use-href.js +39 -0
  170. package/dist/browser/react/use-href.js.map +1 -0
  171. package/dist/browser/react/use-link-status.d.ts +37 -0
  172. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  173. package/dist/browser/react/use-link-status.js +99 -0
  174. package/dist/browser/react/use-link-status.js.map +1 -0
  175. package/dist/browser/react/use-mount.d.ts +25 -0
  176. package/dist/browser/react/use-mount.d.ts.map +1 -0
  177. package/dist/browser/react/use-mount.js +30 -0
  178. package/dist/browser/react/use-mount.js.map +1 -0
  179. package/dist/browser/react/use-navigation.d.ts +27 -0
  180. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  181. package/dist/browser/react/use-navigation.js +87 -0
  182. package/dist/browser/react/use-navigation.js.map +1 -0
  183. package/dist/browser/react/use-segments.d.ts +38 -0
  184. package/dist/browser/react/use-segments.d.ts.map +1 -0
  185. package/dist/browser/react/use-segments.js +130 -0
  186. package/dist/browser/react/use-segments.js.map +1 -0
  187. package/dist/browser/request-controller.d.ts +26 -0
  188. package/dist/browser/request-controller.d.ts.map +1 -0
  189. package/dist/browser/request-controller.js +147 -0
  190. package/dist/browser/request-controller.js.map +1 -0
  191. package/dist/browser/rsc-router.d.ts +129 -0
  192. package/dist/browser/rsc-router.d.ts.map +1 -0
  193. package/dist/browser/rsc-router.js +195 -0
  194. package/dist/browser/rsc-router.js.map +1 -0
  195. package/dist/browser/scroll-restoration.d.ts +93 -0
  196. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  197. package/dist/browser/scroll-restoration.js +321 -0
  198. package/dist/browser/scroll-restoration.js.map +1 -0
  199. package/dist/browser/segment-structure-assert.d.ts +17 -0
  200. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  201. package/dist/browser/segment-structure-assert.js +59 -0
  202. package/dist/browser/segment-structure-assert.js.map +1 -0
  203. package/dist/browser/server-action-bridge.d.ts +26 -0
  204. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  205. package/dist/browser/server-action-bridge.js +668 -0
  206. package/dist/browser/server-action-bridge.js.map +1 -0
  207. package/dist/browser/shallow.d.ts +12 -0
  208. package/dist/browser/shallow.d.ts.map +1 -0
  209. package/dist/browser/shallow.js +34 -0
  210. package/dist/browser/shallow.js.map +1 -0
  211. package/dist/browser/types.d.ts +369 -0
  212. package/dist/browser/types.d.ts.map +1 -0
  213. package/dist/browser/types.js +2 -0
  214. package/dist/browser/types.js.map +1 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  216. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  217. package/dist/build/__tests__/generate-cli.test.js +237 -0
  218. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  220. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  221. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  222. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  224. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  225. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  226. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  228. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  230. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  231. package/dist/build/generate-manifest.d.ts +81 -0
  232. package/dist/build/generate-manifest.d.ts.map +1 -0
  233. package/dist/build/generate-manifest.js +276 -0
  234. package/dist/build/generate-manifest.js.map +1 -0
  235. package/dist/build/generate-route-types.d.ts +115 -0
  236. package/dist/build/generate-route-types.d.ts.map +1 -0
  237. package/dist/build/generate-route-types.js +740 -0
  238. package/dist/build/generate-route-types.js.map +1 -0
  239. package/dist/build/index.d.ts +21 -0
  240. package/dist/build/index.d.ts.map +1 -0
  241. package/dist/build/index.js +21 -0
  242. package/dist/build/index.js.map +1 -0
  243. package/dist/build/route-trie.d.ts +71 -0
  244. package/dist/build/route-trie.d.ts.map +1 -0
  245. package/dist/build/route-trie.js +175 -0
  246. package/dist/build/route-trie.js.map +1 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  248. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  249. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  250. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  252. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  253. package/dist/cache/__tests__/document-cache.test.js +345 -0
  254. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  258. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  260. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  261. package/dist/cache/__tests__/memory-store.test.js +367 -0
  262. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  263. package/dist/cache/cache-scope.d.ts +102 -0
  264. package/dist/cache/cache-scope.d.ts.map +1 -0
  265. package/dist/cache/cache-scope.js +440 -0
  266. package/dist/cache/cache-scope.js.map +1 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  270. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  272. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  273. package/dist/cache/cf/cf-cache-store.js +242 -0
  274. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  275. package/dist/cache/cf/index.d.ts +14 -0
  276. package/dist/cache/cf/index.d.ts.map +1 -0
  277. package/dist/cache/cf/index.js +17 -0
  278. package/dist/cache/cf/index.js.map +1 -0
  279. package/dist/cache/document-cache.d.ts +64 -0
  280. package/dist/cache/document-cache.d.ts.map +1 -0
  281. package/dist/cache/document-cache.js +228 -0
  282. package/dist/cache/document-cache.js.map +1 -0
  283. package/dist/cache/index.d.ts +19 -0
  284. package/dist/cache/index.d.ts.map +1 -0
  285. package/dist/cache/index.js +21 -0
  286. package/dist/cache/index.js.map +1 -0
  287. package/dist/cache/memory-segment-store.d.ts +110 -0
  288. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  289. package/dist/cache/memory-segment-store.js +117 -0
  290. package/dist/cache/memory-segment-store.js.map +1 -0
  291. package/dist/cache/memory-store.d.ts +41 -0
  292. package/dist/cache/memory-store.d.ts.map +1 -0
  293. package/dist/cache/memory-store.js +191 -0
  294. package/dist/cache/memory-store.js.map +1 -0
  295. package/dist/cache/types.d.ts +317 -0
  296. package/dist/cache/types.d.ts.map +1 -0
  297. package/dist/cache/types.js +12 -0
  298. package/dist/cache/types.js.map +1 -0
  299. package/dist/client.d.ts +248 -0
  300. package/dist/client.d.ts.map +1 -0
  301. package/dist/client.js +367 -0
  302. package/dist/client.js.map +1 -0
  303. package/dist/client.rsc.d.ts +26 -0
  304. package/dist/client.rsc.d.ts.map +1 -0
  305. package/dist/client.rsc.js +46 -0
  306. package/dist/client.rsc.js.map +1 -0
  307. package/dist/component-utils.d.ts +36 -0
  308. package/dist/component-utils.d.ts.map +1 -0
  309. package/dist/component-utils.js +61 -0
  310. package/dist/component-utils.js.map +1 -0
  311. package/dist/components/DefaultDocument.d.ts +13 -0
  312. package/dist/components/DefaultDocument.d.ts.map +1 -0
  313. package/dist/components/DefaultDocument.js +15 -0
  314. package/dist/components/DefaultDocument.js.map +1 -0
  315. package/dist/debug.d.ts +58 -0
  316. package/dist/debug.d.ts.map +1 -0
  317. package/dist/debug.js +157 -0
  318. package/dist/debug.js.map +1 -0
  319. package/dist/default-error-boundary.d.ts +11 -0
  320. package/dist/default-error-boundary.d.ts.map +1 -0
  321. package/dist/default-error-boundary.js +45 -0
  322. package/dist/default-error-boundary.js.map +1 -0
  323. package/dist/deps/browser.d.ts +2 -0
  324. package/dist/deps/browser.d.ts.map +1 -0
  325. package/dist/deps/browser.js +3 -0
  326. package/dist/deps/browser.js.map +1 -0
  327. package/dist/deps/html-stream-client.d.ts +2 -0
  328. package/dist/deps/html-stream-client.d.ts.map +1 -0
  329. package/dist/deps/html-stream-client.js +3 -0
  330. package/dist/deps/html-stream-client.js.map +1 -0
  331. package/dist/deps/html-stream-server.d.ts +2 -0
  332. package/dist/deps/html-stream-server.d.ts.map +1 -0
  333. package/dist/deps/html-stream-server.js +3 -0
  334. package/dist/deps/html-stream-server.js.map +1 -0
  335. package/dist/deps/rsc.d.ts +2 -0
  336. package/dist/deps/rsc.d.ts.map +1 -0
  337. package/dist/deps/rsc.js +4 -0
  338. package/dist/deps/rsc.js.map +1 -0
  339. package/dist/deps/ssr.d.ts +2 -0
  340. package/dist/deps/ssr.d.ts.map +1 -0
  341. package/dist/deps/ssr.js +3 -0
  342. package/dist/deps/ssr.js.map +1 -0
  343. package/dist/errors.d.ts +174 -0
  344. package/dist/errors.d.ts.map +1 -0
  345. package/dist/errors.js +241 -0
  346. package/dist/errors.js.map +1 -0
  347. package/dist/handle.d.ts +78 -0
  348. package/dist/handle.d.ts.map +1 -0
  349. package/dist/handle.js +82 -0
  350. package/dist/handle.js.map +1 -0
  351. package/dist/handles/MetaTags.d.ts +14 -0
  352. package/dist/handles/MetaTags.d.ts.map +1 -0
  353. package/dist/handles/MetaTags.js +136 -0
  354. package/dist/handles/MetaTags.js.map +1 -0
  355. package/dist/handles/index.d.ts +6 -0
  356. package/dist/handles/index.d.ts.map +1 -0
  357. package/{src/handles/index.ts → dist/handles/index.js} +1 -1
  358. package/dist/handles/index.js.map +1 -0
  359. package/dist/handles/meta.d.ts +39 -0
  360. package/dist/handles/meta.d.ts.map +1 -0
  361. package/dist/handles/meta.js +202 -0
  362. package/dist/handles/meta.js.map +1 -0
  363. package/dist/host/__tests__/errors.test.d.ts +2 -0
  364. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  365. package/dist/host/__tests__/errors.test.js +76 -0
  366. package/dist/host/__tests__/errors.test.js.map +1 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  370. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  372. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  374. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  375. package/dist/host/__tests__/router.test.d.ts +2 -0
  376. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  377. package/dist/host/__tests__/router.test.js +241 -0
  378. package/dist/host/__tests__/router.test.js.map +1 -0
  379. package/dist/host/__tests__/testing.test.d.ts +2 -0
  380. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  381. package/dist/host/__tests__/testing.test.js +64 -0
  382. package/dist/host/__tests__/testing.test.js.map +1 -0
  383. package/dist/host/__tests__/utils.test.d.ts +2 -0
  384. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  385. package/dist/host/__tests__/utils.test.js +29 -0
  386. package/dist/host/__tests__/utils.test.js.map +1 -0
  387. package/dist/host/cookie-handler.d.ts +34 -0
  388. package/dist/host/cookie-handler.d.ts.map +1 -0
  389. package/dist/host/cookie-handler.js +124 -0
  390. package/dist/host/cookie-handler.js.map +1 -0
  391. package/dist/host/errors.d.ts +56 -0
  392. package/dist/host/errors.d.ts.map +1 -0
  393. package/dist/host/errors.js +79 -0
  394. package/dist/host/errors.js.map +1 -0
  395. package/dist/host/index.d.ts +29 -0
  396. package/dist/host/index.d.ts.map +1 -0
  397. package/dist/host/index.js +32 -0
  398. package/dist/host/index.js.map +1 -0
  399. package/dist/host/pattern-matcher.d.ts +36 -0
  400. package/dist/host/pattern-matcher.d.ts.map +1 -0
  401. package/dist/host/pattern-matcher.js +172 -0
  402. package/dist/host/pattern-matcher.js.map +1 -0
  403. package/dist/host/router.d.ts +26 -0
  404. package/dist/host/router.d.ts.map +1 -0
  405. package/dist/host/router.js +218 -0
  406. package/dist/host/router.js.map +1 -0
  407. package/dist/host/testing.d.ts +36 -0
  408. package/dist/host/testing.d.ts.map +1 -0
  409. package/dist/host/testing.js +55 -0
  410. package/dist/host/testing.js.map +1 -0
  411. package/dist/host/types.d.ts +115 -0
  412. package/dist/host/types.d.ts.map +1 -0
  413. package/dist/host/types.js +7 -0
  414. package/dist/host/types.js.map +1 -0
  415. package/dist/host/utils.d.ts +21 -0
  416. package/dist/host/utils.d.ts.map +1 -0
  417. package/dist/host/utils.js +23 -0
  418. package/dist/host/utils.js.map +1 -0
  419. package/dist/href-client.d.ts +131 -0
  420. package/dist/href-client.d.ts.map +1 -0
  421. package/dist/href-client.js +64 -0
  422. package/dist/href-client.js.map +1 -0
  423. package/{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/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -8
  448. package/dist/network-error-thrower.d.ts.map +1 -0
  449. package/dist/network-error-thrower.js +14 -0
  450. package/dist/network-error-thrower.js.map +1 -0
  451. package/dist/outlet-context.d.ts +13 -0
  452. package/dist/outlet-context.d.ts.map +1 -0
  453. package/dist/outlet-context.js +3 -0
  454. package/dist/outlet-context.js.map +1 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  456. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  457. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  458. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  459. package/dist/prerender/param-hash.d.ts +16 -0
  460. package/dist/prerender/param-hash.d.ts.map +1 -0
  461. package/dist/prerender/param-hash.js +36 -0
  462. package/dist/prerender/param-hash.js.map +1 -0
  463. package/dist/prerender/store.d.ts +38 -0
  464. package/dist/prerender/store.d.ts.map +1 -0
  465. package/dist/prerender/store.js +61 -0
  466. package/dist/prerender/store.js.map +1 -0
  467. package/dist/prerender.d.ts +66 -0
  468. package/dist/prerender.d.ts.map +1 -0
  469. package/dist/prerender.js +57 -0
  470. package/dist/prerender.js.map +1 -0
  471. package/dist/reverse.d.ts +196 -0
  472. package/dist/reverse.d.ts.map +1 -0
  473. package/dist/reverse.js +78 -0
  474. package/dist/reverse.js.map +1 -0
  475. package/dist/root-error-boundary.d.ts +33 -0
  476. package/dist/root-error-boundary.d.ts.map +1 -0
  477. package/dist/root-error-boundary.js +165 -0
  478. package/dist/root-error-boundary.js.map +1 -0
  479. package/dist/route-content-wrapper.d.ts +46 -0
  480. package/dist/route-content-wrapper.d.ts.map +1 -0
  481. package/dist/route-content-wrapper.js +77 -0
  482. package/dist/route-content-wrapper.js.map +1 -0
  483. package/dist/route-definition.d.ts +421 -0
  484. package/dist/route-definition.d.ts.map +1 -0
  485. package/dist/route-definition.js +868 -0
  486. package/dist/route-definition.js.map +1 -0
  487. package/dist/route-map-builder.d.ts +155 -0
  488. package/dist/route-map-builder.d.ts.map +1 -0
  489. package/dist/route-map-builder.js +237 -0
  490. package/dist/route-map-builder.js.map +1 -0
  491. package/dist/route-types.d.ts +165 -0
  492. package/dist/route-types.d.ts.map +1 -0
  493. package/dist/route-types.js +7 -0
  494. package/dist/route-types.js.map +1 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  496. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  497. package/dist/router/__tests__/handler-context.test.js +65 -0
  498. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  502. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  503. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  504. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  505. package/dist/router/__tests__/match-context.test.js +92 -0
  506. package/dist/router/__tests__/match-context.test.js.map +1 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  508. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  509. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  510. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  511. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  512. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  513. package/dist/router/__tests__/match-result.test.js +457 -0
  514. package/dist/router/__tests__/match-result.test.js.map +1 -0
  515. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  516. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  517. package/dist/router/__tests__/on-error.test.js +678 -0
  518. package/dist/router/__tests__/on-error.test.js.map +1 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  520. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  521. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  522. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  526. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  527. package/dist/router/error-handling.d.ts +77 -0
  528. package/dist/router/error-handling.d.ts.map +1 -0
  529. package/dist/router/error-handling.js +202 -0
  530. package/dist/router/error-handling.js.map +1 -0
  531. package/dist/router/handler-context.d.ts +20 -0
  532. package/dist/router/handler-context.d.ts.map +1 -0
  533. package/dist/router/handler-context.js +198 -0
  534. package/dist/router/handler-context.js.map +1 -0
  535. package/dist/router/intercept-resolution.d.ts +66 -0
  536. package/dist/router/intercept-resolution.d.ts.map +1 -0
  537. package/dist/router/intercept-resolution.js +246 -0
  538. package/dist/router/intercept-resolution.js.map +1 -0
  539. package/dist/router/loader-resolution.d.ts +64 -0
  540. package/dist/router/loader-resolution.d.ts.map +1 -0
  541. package/dist/router/loader-resolution.js +284 -0
  542. package/dist/router/loader-resolution.js.map +1 -0
  543. package/dist/router/logging.d.ts +15 -0
  544. package/dist/router/logging.d.ts.map +1 -0
  545. package/dist/router/logging.js +99 -0
  546. package/dist/router/logging.js.map +1 -0
  547. package/dist/router/manifest.d.ts +22 -0
  548. package/dist/router/manifest.d.ts.map +1 -0
  549. package/dist/router/manifest.js +181 -0
  550. package/dist/router/manifest.js.map +1 -0
  551. package/dist/router/match-api.d.ts +35 -0
  552. package/dist/router/match-api.d.ts.map +1 -0
  553. package/dist/router/match-api.js +406 -0
  554. package/dist/router/match-api.js.map +1 -0
  555. package/dist/router/match-context.d.ts +206 -0
  556. package/dist/router/match-context.d.ts.map +1 -0
  557. package/dist/router/match-context.js +17 -0
  558. package/dist/router/match-context.js.map +1 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  560. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  561. package/dist/router/match-middleware/background-revalidation.js +75 -0
  562. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  564. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  565. package/dist/router/match-middleware/cache-lookup.js +257 -0
  566. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  567. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  568. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  569. package/dist/router/match-middleware/cache-store.js +108 -0
  570. package/dist/router/match-middleware/cache-store.js.map +1 -0
  571. package/dist/router/match-middleware/index.d.ts +81 -0
  572. package/dist/router/match-middleware/index.d.ts.map +1 -0
  573. package/dist/router/match-middleware/index.js +80 -0
  574. package/dist/router/match-middleware/index.js.map +1 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  576. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  577. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  578. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  580. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  581. package/dist/router/match-middleware/segment-resolution.js +53 -0
  582. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  583. package/dist/router/match-pipelines.d.ts +147 -0
  584. package/dist/router/match-pipelines.d.ts.map +1 -0
  585. package/dist/router/match-pipelines.js +82 -0
  586. package/dist/router/match-pipelines.js.map +1 -0
  587. package/dist/router/match-result.d.ts +126 -0
  588. package/dist/router/match-result.d.ts.map +1 -0
  589. package/dist/router/match-result.js +93 -0
  590. package/dist/router/match-result.js.map +1 -0
  591. package/dist/router/metrics.d.ts +20 -0
  592. package/dist/router/metrics.d.ts.map +1 -0
  593. package/dist/router/metrics.js +47 -0
  594. package/dist/router/metrics.js.map +1 -0
  595. package/dist/router/middleware.d.ts +249 -0
  596. package/dist/router/middleware.d.ts.map +1 -0
  597. package/dist/router/middleware.js +434 -0
  598. package/dist/router/middleware.js.map +1 -0
  599. package/dist/router/middleware.test.d.ts +2 -0
  600. package/dist/router/middleware.test.d.ts.map +1 -0
  601. package/dist/router/middleware.test.js +816 -0
  602. package/dist/router/middleware.test.js.map +1 -0
  603. package/dist/router/pattern-matching.d.ts +149 -0
  604. package/dist/router/pattern-matching.d.ts.map +1 -0
  605. package/dist/router/pattern-matching.js +349 -0
  606. package/dist/router/pattern-matching.js.map +1 -0
  607. package/dist/router/revalidation.d.ts +44 -0
  608. package/dist/router/revalidation.d.ts.map +1 -0
  609. package/dist/router/revalidation.js +147 -0
  610. package/dist/router/revalidation.js.map +1 -0
  611. package/dist/router/router-context.d.ts +135 -0
  612. package/dist/router/router-context.d.ts.map +1 -0
  613. package/dist/router/router-context.js +36 -0
  614. package/dist/router/router-context.js.map +1 -0
  615. package/dist/router/segment-resolution.d.ts +127 -0
  616. package/dist/router/segment-resolution.d.ts.map +1 -0
  617. package/dist/router/segment-resolution.js +919 -0
  618. package/dist/router/segment-resolution.js.map +1 -0
  619. package/dist/router/trie-matching.d.ts +40 -0
  620. package/dist/router/trie-matching.d.ts.map +1 -0
  621. package/dist/router/trie-matching.js +127 -0
  622. package/dist/router/trie-matching.js.map +1 -0
  623. package/dist/router/types.d.ts +136 -0
  624. package/dist/router/types.d.ts.map +1 -0
  625. package/dist/router/types.js +7 -0
  626. package/dist/router/types.js.map +1 -0
  627. package/dist/router.d.ts +753 -0
  628. package/dist/router.d.ts.map +1 -0
  629. package/dist/router.gen.d.ts +6 -0
  630. package/dist/router.gen.d.ts.map +1 -0
  631. package/dist/router.gen.js +6 -0
  632. package/dist/router.gen.js.map +1 -0
  633. package/dist/router.js +1304 -0
  634. package/dist/router.js.map +1 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  636. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  637. package/dist/rsc/__tests__/helpers.test.js +140 -0
  638. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  639. package/dist/rsc/handler.d.ts +45 -0
  640. package/dist/rsc/handler.d.ts.map +1 -0
  641. package/dist/rsc/handler.js +1172 -0
  642. package/dist/rsc/handler.js.map +1 -0
  643. package/dist/rsc/helpers.d.ts +16 -0
  644. package/dist/rsc/helpers.d.ts.map +1 -0
  645. package/dist/rsc/helpers.js +55 -0
  646. package/dist/rsc/helpers.js.map +1 -0
  647. package/dist/rsc/index.d.ts +22 -0
  648. package/dist/rsc/index.d.ts.map +1 -0
  649. package/dist/rsc/index.js +23 -0
  650. package/dist/rsc/index.js.map +1 -0
  651. package/dist/rsc/nonce.d.ts +9 -0
  652. package/dist/rsc/nonce.d.ts.map +1 -0
  653. package/dist/rsc/nonce.js +18 -0
  654. package/dist/rsc/nonce.js.map +1 -0
  655. package/dist/rsc/types.d.ts +206 -0
  656. package/dist/rsc/types.d.ts.map +1 -0
  657. package/dist/rsc/types.js +8 -0
  658. package/dist/rsc/types.js.map +1 -0
  659. package/dist/search-params.d.ts +103 -0
  660. package/dist/search-params.d.ts.map +1 -0
  661. package/dist/search-params.js +74 -0
  662. package/dist/search-params.js.map +1 -0
  663. package/dist/segment-system.d.ts +75 -0
  664. package/dist/segment-system.d.ts.map +1 -0
  665. package/dist/segment-system.js +336 -0
  666. package/dist/segment-system.js.map +1 -0
  667. package/dist/server/context.d.ts +245 -0
  668. package/dist/server/context.d.ts.map +1 -0
  669. package/dist/server/context.js +197 -0
  670. package/dist/server/context.js.map +1 -0
  671. package/dist/server/fetchable-loader-store.d.ts +18 -0
  672. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  673. package/dist/server/fetchable-loader-store.js +18 -0
  674. package/dist/server/fetchable-loader-store.js.map +1 -0
  675. package/dist/server/handle-store.d.ts +85 -0
  676. package/dist/server/handle-store.d.ts.map +1 -0
  677. package/dist/server/handle-store.js +142 -0
  678. package/dist/server/handle-store.js.map +1 -0
  679. package/dist/server/loader-registry.d.ts +55 -0
  680. package/dist/server/loader-registry.d.ts.map +1 -0
  681. package/dist/server/loader-registry.js +132 -0
  682. package/dist/server/loader-registry.js.map +1 -0
  683. package/dist/server/request-context.d.ts +226 -0
  684. package/dist/server/request-context.d.ts.map +1 -0
  685. package/dist/server/request-context.js +290 -0
  686. package/dist/server/request-context.js.map +1 -0
  687. package/dist/server/root-layout.d.ts +4 -0
  688. package/dist/server/root-layout.d.ts.map +1 -0
  689. package/dist/server/root-layout.js +5 -0
  690. package/dist/server/root-layout.js.map +1 -0
  691. package/dist/server.d.ts +15 -0
  692. package/dist/server.d.ts.map +1 -0
  693. package/dist/server.js +20 -0
  694. package/dist/server.js.map +1 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  698. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  699. package/dist/ssr/index.d.ts +98 -0
  700. package/dist/ssr/index.d.ts.map +1 -0
  701. package/dist/ssr/index.js +158 -0
  702. package/dist/ssr/index.js.map +1 -0
  703. package/dist/static-handler.d.ts +50 -0
  704. package/dist/static-handler.d.ts.map +1 -0
  705. package/dist/static-handler.gen.d.ts +5 -0
  706. package/dist/static-handler.gen.d.ts.map +1 -0
  707. package/dist/static-handler.gen.js +5 -0
  708. package/dist/static-handler.gen.js.map +1 -0
  709. package/dist/static-handler.js +29 -0
  710. package/dist/static-handler.js.map +1 -0
  711. package/dist/testing/vitest.js +82 -0
  712. package/dist/theme/ThemeProvider.d.ts +20 -0
  713. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  714. package/dist/theme/ThemeProvider.js +240 -0
  715. package/dist/theme/ThemeProvider.js.map +1 -0
  716. package/dist/theme/ThemeScript.d.ts +48 -0
  717. package/dist/theme/ThemeScript.d.ts.map +1 -0
  718. package/dist/theme/ThemeScript.js +13 -0
  719. package/dist/theme/ThemeScript.js.map +1 -0
  720. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  721. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  722. package/dist/theme/__tests__/theme.test.js +103 -0
  723. package/dist/theme/__tests__/theme.test.js.map +1 -0
  724. package/dist/theme/constants.d.ts +29 -0
  725. package/dist/theme/constants.d.ts.map +1 -0
  726. package/dist/theme/constants.js +48 -0
  727. package/dist/theme/constants.js.map +1 -0
  728. package/dist/theme/index.d.ts +31 -0
  729. package/dist/theme/index.d.ts.map +1 -0
  730. package/dist/theme/index.js +36 -0
  731. package/dist/theme/index.js.map +1 -0
  732. package/dist/theme/theme-context.d.ts +40 -0
  733. package/dist/theme/theme-context.d.ts.map +1 -0
  734. package/dist/theme/theme-context.js +60 -0
  735. package/dist/theme/theme-context.js.map +1 -0
  736. package/dist/theme/theme-script.d.ts +27 -0
  737. package/dist/theme/theme-script.d.ts.map +1 -0
  738. package/dist/theme/theme-script.js +147 -0
  739. package/dist/theme/theme-script.js.map +1 -0
  740. package/dist/theme/types.d.ts +163 -0
  741. package/dist/theme/types.d.ts.map +1 -0
  742. package/dist/theme/types.js +11 -0
  743. package/dist/theme/types.js.map +1 -0
  744. package/dist/theme/use-theme.d.ts +12 -0
  745. package/dist/theme/use-theme.d.ts.map +1 -0
  746. package/dist/theme/use-theme.js +40 -0
  747. package/dist/theme/use-theme.js.map +1 -0
  748. package/dist/types.d.ts +1479 -0
  749. package/dist/types.d.ts.map +1 -0
  750. package/dist/types.js +10 -0
  751. package/dist/types.js.map +1 -0
  752. package/dist/urls.d.ts +441 -0
  753. package/dist/urls.d.ts.map +1 -0
  754. package/dist/urls.gen.d.ts +8 -0
  755. package/dist/urls.gen.d.ts.map +1 -0
  756. package/dist/urls.gen.js +8 -0
  757. package/dist/urls.gen.js.map +1 -0
  758. package/dist/urls.js +443 -0
  759. package/dist/urls.js.map +1 -0
  760. package/dist/use-loader.d.ts +127 -0
  761. package/dist/use-loader.d.ts.map +1 -0
  762. package/dist/use-loader.js +237 -0
  763. package/dist/use-loader.js.map +1 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  767. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  771. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  775. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  777. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  779. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  780. package/dist/vite/ast-handler-extract.d.ts +49 -0
  781. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  782. package/dist/vite/ast-handler-extract.js +249 -0
  783. package/dist/vite/ast-handler-extract.js.map +1 -0
  784. package/dist/vite/expose-action-id.d.ts +19 -0
  785. package/dist/vite/expose-action-id.d.ts.map +1 -0
  786. package/dist/vite/expose-action-id.js +250 -0
  787. package/dist/vite/expose-action-id.js.map +1 -0
  788. package/dist/vite/expose-id-utils.d.ts +69 -0
  789. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  790. package/dist/vite/expose-id-utils.js +289 -0
  791. package/dist/vite/expose-id-utils.js.map +1 -0
  792. package/dist/vite/expose-internal-ids.d.ts +22 -0
  793. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  794. package/dist/vite/expose-internal-ids.js +886 -0
  795. package/dist/vite/expose-internal-ids.js.map +1 -0
  796. package/dist/vite/index.d.ts +149 -0
  797. package/dist/vite/index.d.ts.map +1 -0
  798. package/dist/vite/index.js +7554 -2070
  799. package/dist/vite/index.js.bak +5448 -0
  800. package/dist/vite/index.js.map +1 -0
  801. package/dist/vite/package-resolution.d.ts +43 -0
  802. package/dist/vite/package-resolution.d.ts.map +1 -0
  803. package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
  804. package/dist/vite/package-resolution.js.map +1 -0
  805. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  806. package/dist/vite/virtual-entries.d.ts +25 -0
  807. package/dist/vite/virtual-entries.d.ts.map +1 -0
  808. package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
  809. package/dist/vite/virtual-entries.js.map +1 -0
  810. package/package.json +142 -61
  811. package/skills/api-client/SKILL.md +211 -0
  812. package/skills/breadcrumbs/SKILL.md +329 -0
  813. package/skills/bundle-analysis/SKILL.md +159 -0
  814. package/skills/cache-guide/SKILL.md +489 -0
  815. package/skills/caching/SKILL.md +413 -26
  816. package/skills/catalog.json +271 -0
  817. package/skills/comparison/SKILL.md +50 -0
  818. package/skills/comparison/agents/openai.yaml +4 -0
  819. package/skills/comparison/references/framework-comparison.md +837 -0
  820. package/skills/composability/SKILL.md +278 -0
  821. package/skills/css/SKILL.md +76 -0
  822. package/skills/debug-manifest/SKILL.md +16 -18
  823. package/skills/defer-hydration/SKILL.md +235 -0
  824. package/skills/document-cache/SKILL.md +96 -63
  825. package/skills/fonts/SKILL.md +7 -5
  826. package/skills/handler-use/SKILL.md +364 -0
  827. package/skills/hooks/SKILL.md +76 -436
  828. package/skills/hooks/data.md +273 -0
  829. package/skills/hooks/handle-and-actions.md +103 -0
  830. package/skills/hooks/navigation.md +110 -0
  831. package/skills/hooks/outlets.md +41 -0
  832. package/skills/hooks/state.md +228 -0
  833. package/skills/hooks/urls.md +135 -0
  834. package/skills/host-router/SKILL.md +320 -0
  835. package/skills/i18n/SKILL.md +276 -0
  836. package/skills/intercept/SKILL.md +215 -16
  837. package/skills/layout/SKILL.md +147 -7
  838. package/skills/links/SKILL.md +304 -25
  839. package/skills/loader/SKILL.md +629 -55
  840. package/skills/middleware/SKILL.md +251 -38
  841. package/skills/migrate-nextjs/SKILL.md +745 -0
  842. package/skills/migrate-react-router/SKILL.md +153 -0
  843. package/skills/migrate-react-router/cloudflare-workers.md +129 -0
  844. package/skills/migrate-react-router/component-migration.md +196 -0
  845. package/skills/migrate-react-router/data-and-actions.md +225 -0
  846. package/skills/migrate-react-router/route-mapping.md +271 -0
  847. package/skills/mime-routes/SKILL.md +60 -21
  848. package/skills/observability/SKILL.md +202 -0
  849. package/skills/parallel/SKILL.md +296 -4
  850. package/skills/ppr/SKILL.md +658 -0
  851. package/skills/prerender/SKILL.md +487 -52
  852. package/skills/rango/SKILL.md +324 -29
  853. package/skills/react-compiler/SKILL.md +168 -0
  854. package/skills/response-routes/SKILL.md +264 -122
  855. package/skills/route/SKILL.md +359 -22
  856. package/skills/router-setup/SKILL.md +247 -34
  857. package/skills/scripts/SKILL.md +179 -0
  858. package/skills/server-actions/SKILL.md +776 -0
  859. package/skills/shell-manifest/SKILL.md +185 -0
  860. package/skills/streams-and-websockets/SKILL.md +283 -0
  861. package/skills/tailwind/SKILL.md +28 -4
  862. package/skills/testing/SKILL.md +126 -222
  863. package/skills/testing/bindings.md +103 -0
  864. package/skills/testing/cache-prerender.md +127 -0
  865. package/skills/testing/client-components.md +124 -0
  866. package/skills/testing/e2e-parity.md +125 -0
  867. package/skills/testing/flight.md +91 -0
  868. package/skills/testing/handles.md +131 -0
  869. package/skills/testing/loader.md +128 -0
  870. package/skills/testing/middleware.md +99 -0
  871. package/skills/testing/render-handler.md +122 -0
  872. package/skills/testing/response-routes.md +95 -0
  873. package/skills/testing/reverse-and-types.md +85 -0
  874. package/skills/testing/server-actions.md +107 -0
  875. package/skills/testing/server-tree.md +128 -0
  876. package/skills/testing/setup.md +123 -0
  877. package/skills/theme/SKILL.md +10 -9
  878. package/skills/typesafety/SKILL.md +45 -496
  879. package/skills/typesafety/env-and-bindings.md +254 -0
  880. package/skills/typesafety/generated-files-and-cli.md +335 -0
  881. package/skills/typesafety/params-and-search.md +153 -0
  882. package/skills/typesafety/route-types.md +209 -0
  883. package/skills/use-cache/SKILL.md +383 -0
  884. package/skills/vercel/SKILL.md +128 -0
  885. package/skills/view-transitions/SKILL.md +337 -0
  886. package/src/__augment-tests__/augment.ts +81 -0
  887. package/src/__augment-tests__/augmented.check.ts +116 -0
  888. package/src/__internal.ts +77 -44
  889. package/src/bin/rango.ts +275 -29
  890. package/src/browser/action-coordinator.ts +114 -0
  891. package/src/browser/action-fence.ts +47 -0
  892. package/src/browser/app-shell.ts +39 -0
  893. package/src/browser/app-version.ts +14 -0
  894. package/src/browser/connection-warmup.ts +134 -0
  895. package/src/browser/cookie-name.ts +140 -0
  896. package/src/browser/event-controller.ts +348 -212
  897. package/src/browser/history-state.ts +101 -0
  898. package/src/browser/index.ts +3 -3
  899. package/src/browser/intercept-utils.ts +52 -0
  900. package/src/browser/invalidate-client-cache.ts +52 -0
  901. package/src/browser/link-interceptor.ts +24 -4
  902. package/src/browser/logging.ts +39 -0
  903. package/src/browser/merge-segment-loaders.ts +23 -13
  904. package/src/browser/navigation-bridge.ts +385 -576
  905. package/src/browser/navigation-client.ts +249 -75
  906. package/src/browser/navigation-store-handle.ts +38 -0
  907. package/src/browser/navigation-store.ts +230 -124
  908. package/src/browser/navigation-transaction.ts +247 -0
  909. package/src/browser/network-error-handler.ts +88 -0
  910. package/src/browser/partial-update.ts +432 -365
  911. package/src/browser/prefetch/cache.ts +381 -0
  912. package/src/browser/prefetch/fetch.ts +462 -0
  913. package/src/browser/prefetch/observer.ts +65 -0
  914. package/src/browser/prefetch/policy.ts +48 -0
  915. package/src/browser/prefetch/queue.ts +209 -0
  916. package/src/browser/prefetch/resource-ready.ts +77 -0
  917. package/src/browser/rango-state.ts +194 -0
  918. package/src/browser/react/Link.tsx +284 -67
  919. package/src/browser/react/NavigationProvider.tsx +267 -109
  920. package/src/browser/react/ScrollRestoration.tsx +10 -6
  921. package/src/browser/react/context.ts +11 -0
  922. package/src/browser/react/filter-segment-order.ts +70 -0
  923. package/src/browser/react/index.ts +0 -48
  924. package/src/browser/react/location-state-shared.ts +272 -60
  925. package/src/browser/react/location-state.ts +90 -20
  926. package/src/browser/react/mount-context.ts +6 -1
  927. package/src/browser/react/nonce-context.ts +23 -0
  928. package/src/browser/react/shallow-equal.ts +27 -0
  929. package/src/browser/react/use-action.ts +35 -66
  930. package/src/browser/react/use-handle.ts +39 -126
  931. package/src/browser/react/use-href.tsx +8 -1
  932. package/src/browser/react/use-link-status.ts +39 -13
  933. package/src/browser/react/use-navigation.ts +53 -69
  934. package/src/browser/react/use-params.ts +75 -0
  935. package/src/browser/react/use-pathname.ts +47 -0
  936. package/src/browser/react/use-reverse.ts +106 -0
  937. package/src/browser/react/use-router.ts +98 -0
  938. package/src/browser/react/use-search-params.ts +51 -0
  939. package/src/browser/react/use-segments.ts +72 -99
  940. package/src/browser/response-adapter.ts +164 -0
  941. package/src/browser/rsc-router.tsx +355 -73
  942. package/src/browser/scroll-restoration.ts +140 -50
  943. package/src/browser/segment-reconciler.ts +253 -0
  944. package/src/browser/segment-structure-assert.ts +17 -1
  945. package/src/browser/server-action-bridge.ts +668 -613
  946. package/src/browser/types.ts +235 -51
  947. package/src/browser/validate-redirect-origin.ts +56 -0
  948. package/src/build/collect-fallback-refs.ts +107 -0
  949. package/src/build/generate-manifest.ts +243 -183
  950. package/src/build/generate-route-types.ts +41 -848
  951. package/src/build/index.ts +12 -7
  952. package/src/build/prefix-tree-utils.ts +123 -0
  953. package/src/build/route-trie.ts +218 -80
  954. package/src/build/route-types/ast-helpers.ts +25 -0
  955. package/src/build/route-types/ast-route-extraction.ts +105 -0
  956. package/src/build/route-types/codegen.ts +113 -0
  957. package/src/build/route-types/include-resolution.ts +812 -0
  958. package/src/build/route-types/param-extraction.ts +51 -0
  959. package/src/build/route-types/per-module-writer.ts +144 -0
  960. package/src/build/route-types/router-processing.ts +695 -0
  961. package/src/build/route-types/scan-filter.ts +85 -0
  962. package/src/build/route-types/source-scan.ts +216 -0
  963. package/src/build/runtime-discovery.ts +223 -0
  964. package/src/cache/background-task.ts +34 -0
  965. package/src/cache/cache-error.ts +104 -0
  966. package/src/cache/cache-key-utils.ts +88 -0
  967. package/src/cache/cache-policy.ts +199 -0
  968. package/src/cache/cache-runtime.ts +695 -0
  969. package/src/cache/cache-scope.ts +324 -335
  970. package/src/cache/cache-tag.ts +149 -0
  971. package/src/cache/cf/cf-base64.ts +33 -0
  972. package/src/cache/cf/cf-cache-constants.ts +127 -0
  973. package/src/cache/cf/cf-cache-store.ts +2602 -156
  974. package/src/cache/cf/cf-cache-types.ts +349 -0
  975. package/src/cache/cf/cf-kv-utils.ts +46 -0
  976. package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
  977. package/src/cache/cf/index.ts +17 -17
  978. package/src/cache/document-cache.ts +226 -102
  979. package/src/cache/handle-capture.ts +81 -0
  980. package/src/cache/handle-snapshot.ts +132 -0
  981. package/src/cache/index.ts +24 -35
  982. package/src/cache/memory-segment-store.ts +446 -30
  983. package/src/cache/profile-registry.ts +88 -0
  984. package/src/cache/read-through-swr.ts +178 -0
  985. package/src/cache/segment-codec.ts +295 -0
  986. package/src/cache/shell-snapshot.ts +464 -0
  987. package/src/cache/tag-invalidation.ts +230 -0
  988. package/src/cache/taint.ts +153 -0
  989. package/src/cache/types.ts +283 -211
  990. package/src/cache/vercel/index.ts +11 -0
  991. package/src/cache/vercel/vercel-cache-store.ts +1201 -0
  992. package/src/client.rsc.tsx +43 -21
  993. package/src/client.tsx +131 -347
  994. package/src/cloudflare/index.ts +11 -0
  995. package/src/cloudflare/tracing.ts +108 -0
  996. package/src/component-utils.ts +23 -4
  997. package/src/components/DefaultDocument.tsx +13 -3
  998. package/src/context-var.ts +168 -0
  999. package/src/debug.ts +19 -9
  1000. package/src/decode-loader-results.ts +52 -0
  1001. package/src/defer.ts +185 -0
  1002. package/src/deps/ssr.ts +4 -2
  1003. package/src/encode-kv.ts +49 -0
  1004. package/src/errors.ts +106 -10
  1005. package/src/escape-script.ts +52 -0
  1006. package/src/handle.ts +110 -35
  1007. package/src/handles/MetaTags.tsx +83 -59
  1008. package/src/handles/Scripts.tsx +183 -0
  1009. package/src/handles/breadcrumbs.ts +93 -0
  1010. package/src/handles/deferred-resolution.ts +127 -0
  1011. package/src/handles/is-thenable.ts +18 -0
  1012. package/src/handles/meta.ts +44 -53
  1013. package/src/handles/script.ts +244 -0
  1014. package/src/host/cookie-handler.ts +20 -65
  1015. package/src/host/errors.ts +21 -30
  1016. package/src/host/index.ts +13 -9
  1017. package/src/host/pattern-matcher.ts +50 -79
  1018. package/src/host/router.ts +151 -121
  1019. package/src/host/testing.ts +45 -32
  1020. package/src/host/types.ts +52 -11
  1021. package/src/host/utils.ts +2 -2
  1022. package/src/href-client.ts +192 -57
  1023. package/src/index.rsc.ts +180 -35
  1024. package/src/index.ts +245 -73
  1025. package/src/internal-debug.ts +9 -2
  1026. package/src/loader-store.ts +500 -0
  1027. package/src/loader.rsc.ts +31 -99
  1028. package/src/loader.ts +30 -12
  1029. package/src/missing-id-error.ts +68 -0
  1030. package/src/outlet-context.ts +1 -1
  1031. package/src/outlet-provider.tsx +41 -0
  1032. package/src/prerender/build-shell-capture.ts +447 -0
  1033. package/src/prerender/param-hash.ts +16 -14
  1034. package/src/prerender/shell-manifest-key.ts +20 -0
  1035. package/src/prerender/store.ts +131 -22
  1036. package/src/prerender.ts +460 -26
  1037. package/src/redirect-origin.ts +114 -0
  1038. package/src/regex-escape.ts +8 -0
  1039. package/src/render-error-thrower.tsx +20 -0
  1040. package/src/response-utils.ts +62 -0
  1041. package/src/reverse.ts +198 -128
  1042. package/src/root-error-boundary.tsx +42 -48
  1043. package/src/route-content-wrapper.tsx +22 -77
  1044. package/src/route-definition/dsl-helpers.ts +1116 -0
  1045. package/src/route-definition/helper-factories.ts +88 -0
  1046. package/src/route-definition/helpers-types.ts +506 -0
  1047. package/src/route-definition/index.ts +54 -0
  1048. package/src/route-definition/redirect.ts +134 -0
  1049. package/src/route-definition/resolve-handler-use.ts +160 -0
  1050. package/src/route-definition/use-item-types.ts +29 -0
  1051. package/src/route-definition.ts +1 -1481
  1052. package/src/route-map-builder.ts +120 -145
  1053. package/src/route-name.ts +53 -0
  1054. package/src/route-types.ts +71 -45
  1055. package/src/router/basename.ts +14 -0
  1056. package/src/router/content-negotiation.ts +305 -0
  1057. package/src/router/debug-manifest.ts +72 -0
  1058. package/src/router/error-handling.ts +54 -27
  1059. package/src/router/find-match.ts +259 -0
  1060. package/src/router/handler-context.ts +385 -125
  1061. package/src/router/instrument.ts +355 -0
  1062. package/src/router/intercept-resolution.ts +88 -28
  1063. package/src/router/lazy-includes.ts +260 -0
  1064. package/src/router/loader-resolution.ts +449 -157
  1065. package/src/router/logging.ts +106 -6
  1066. package/src/router/manifest.ts +144 -62
  1067. package/src/router/match-api.ts +224 -256
  1068. package/src/router/match-context.ts +4 -24
  1069. package/src/router/match-handlers.ts +499 -0
  1070. package/src/router/match-middleware/background-revalidation.ts +117 -93
  1071. package/src/router/match-middleware/cache-lookup.ts +308 -150
  1072. package/src/router/match-middleware/cache-store.ts +123 -51
  1073. package/src/router/match-middleware/intercept-resolution.ts +44 -43
  1074. package/src/router/match-middleware/segment-resolution.ts +64 -22
  1075. package/src/router/match-pipelines.ts +11 -87
  1076. package/src/router/match-result.ts +143 -52
  1077. package/src/router/metrics.ts +235 -29
  1078. package/src/router/middleware-types.ts +110 -0
  1079. package/src/router/middleware.ts +526 -441
  1080. package/src/router/navigation-snapshot.ts +133 -0
  1081. package/src/router/params-util.ts +23 -0
  1082. package/src/router/parse-pattern.ts +115 -0
  1083. package/src/router/pattern-matching.ts +311 -142
  1084. package/src/router/prefetch-cache-ttl.ts +51 -0
  1085. package/src/router/prefetch-limits.ts +37 -0
  1086. package/src/router/prerender-match.ts +575 -0
  1087. package/src/router/preview-match.ts +102 -0
  1088. package/src/router/request-classification.ts +291 -0
  1089. package/src/router/revalidation.ts +203 -62
  1090. package/src/router/route-snapshot.ts +256 -0
  1091. package/src/router/router-context.ts +45 -48
  1092. package/src/router/router-interfaces.ts +564 -0
  1093. package/src/router/router-options.ts +784 -0
  1094. package/src/router/router-registry.ts +21 -0
  1095. package/src/router/segment-resolution/fresh.ts +812 -0
  1096. package/src/router/segment-resolution/helpers.ts +348 -0
  1097. package/src/router/segment-resolution/loader-cache.ts +315 -0
  1098. package/src/router/segment-resolution/loader-mask.ts +60 -0
  1099. package/src/router/segment-resolution/loader-snapshot.ts +259 -0
  1100. package/src/router/segment-resolution/mask-nested.ts +99 -0
  1101. package/src/router/segment-resolution/revalidation.ts +1340 -0
  1102. package/src/router/segment-resolution/static-store.ts +81 -0
  1103. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  1104. package/src/router/segment-resolution/view-transition-default.ts +56 -0
  1105. package/src/router/segment-resolution.ts +25 -1354
  1106. package/src/router/segment-wrappers.ts +292 -0
  1107. package/src/router/state-cookie-name.ts +33 -0
  1108. package/src/router/substitute-pattern-params.ts +75 -0
  1109. package/src/router/telemetry-otel.ts +259 -0
  1110. package/src/router/telemetry.ts +385 -0
  1111. package/src/router/timeout.ts +128 -0
  1112. package/src/router/tracing.ts +215 -0
  1113. package/src/router/trie-matching.ts +240 -61
  1114. package/src/router/types.ts +23 -70
  1115. package/src/router/url-params.ts +57 -0
  1116. package/src/router.ts +795 -2390
  1117. package/src/rsc/capture-queue.ts +67 -0
  1118. package/src/rsc/full-payload.ts +70 -0
  1119. package/src/rsc/handler-context.ts +46 -0
  1120. package/src/rsc/handler.ts +956 -1164
  1121. package/src/rsc/helpers.ts +736 -19
  1122. package/src/rsc/index.ts +2 -25
  1123. package/src/rsc/json-route-result.ts +38 -0
  1124. package/src/rsc/loader-fetch.ts +305 -0
  1125. package/src/rsc/manifest-init.ts +77 -0
  1126. package/src/rsc/nonce.ts +23 -0
  1127. package/src/rsc/origin-guard.ts +155 -0
  1128. package/src/rsc/progressive-enhancement.ts +541 -0
  1129. package/src/rsc/redirect-guard.ts +100 -0
  1130. package/src/rsc/response-cache-serve.ts +238 -0
  1131. package/src/rsc/response-error.ts +104 -0
  1132. package/src/rsc/response-route-handler.ts +257 -0
  1133. package/src/rsc/rsc-rendering.ts +856 -0
  1134. package/src/rsc/runtime-warnings.ts +55 -0
  1135. package/src/rsc/server-action.ts +525 -0
  1136. package/src/rsc/shell-build-manifest.ts +316 -0
  1137. package/src/rsc/shell-capture-constants.ts +27 -0
  1138. package/src/rsc/shell-capture.ts +1716 -0
  1139. package/src/rsc/shell-serve.ts +226 -0
  1140. package/src/rsc/ssr-setup.ts +176 -0
  1141. package/src/rsc/transition-gate.ts +89 -0
  1142. package/src/rsc/types.ts +95 -12
  1143. package/src/runtime-env.ts +18 -0
  1144. package/src/search-params.ts +99 -82
  1145. package/src/segment-content-promise.ts +67 -0
  1146. package/src/segment-fragments.ts +124 -0
  1147. package/src/segment-loader-promise.ts +167 -0
  1148. package/src/segment-system.tsx +464 -135
  1149. package/src/serialize.ts +243 -0
  1150. package/src/server/context.ts +640 -85
  1151. package/src/server/cookie-parse.ts +32 -0
  1152. package/src/server/cookie-store.ts +337 -0
  1153. package/src/server/fetchable-loader-store.ts +11 -6
  1154. package/src/server/handle-store.ts +123 -42
  1155. package/src/server/loader-registry.ts +51 -100
  1156. package/src/server/request-context.ts +1069 -152
  1157. package/src/server.ts +15 -8
  1158. package/src/ssr/index.tsx +661 -140
  1159. package/src/ssr/inject-rsc-eager.ts +167 -0
  1160. package/src/ssr/preinit-client-references.ts +106 -0
  1161. package/src/ssr/ssr-root.tsx +261 -0
  1162. package/src/static-handler.ts +45 -18
  1163. package/src/testing/cache-status.ts +162 -0
  1164. package/src/testing/collect-handle.ts +46 -0
  1165. package/src/testing/dispatch.ts +813 -0
  1166. package/src/testing/dom.entry.ts +22 -0
  1167. package/src/testing/e2e/fixture.ts +188 -0
  1168. package/src/testing/e2e/index.ts +128 -0
  1169. package/src/testing/e2e/matchers.ts +35 -0
  1170. package/src/testing/e2e/page-helpers.ts +272 -0
  1171. package/src/testing/e2e/parity.ts +387 -0
  1172. package/src/testing/e2e/server.ts +195 -0
  1173. package/src/testing/flight-matchers.ts +97 -0
  1174. package/src/testing/flight-normalize.ts +11 -0
  1175. package/src/testing/flight-runtime.d.ts +57 -0
  1176. package/src/testing/flight-tree.ts +682 -0
  1177. package/src/testing/flight.entry.ts +52 -0
  1178. package/src/testing/flight.ts +257 -0
  1179. package/src/testing/generated-routes.ts +199 -0
  1180. package/src/testing/index.ts +105 -0
  1181. package/src/testing/internal/context.ts +380 -0
  1182. package/src/testing/internal/flight-client-globals.ts +30 -0
  1183. package/src/testing/internal/seed-vars.ts +54 -0
  1184. package/src/testing/render-handler.ts +371 -0
  1185. package/src/testing/render-route.tsx +584 -0
  1186. package/src/testing/run-loader.ts +385 -0
  1187. package/src/testing/run-middleware.ts +219 -0
  1188. package/src/testing/run-transition-when.ts +164 -0
  1189. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  1190. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  1191. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  1192. package/src/testing/vitest-stubs/version.ts +5 -0
  1193. package/src/testing/vitest.ts +305 -0
  1194. package/src/theme/ThemeProvider.tsx +76 -98
  1195. package/src/theme/ThemeScript.tsx +12 -14
  1196. package/src/theme/constants.ts +57 -15
  1197. package/src/theme/index.ts +3 -20
  1198. package/src/theme/theme-context.ts +5 -35
  1199. package/src/theme/theme-script.ts +43 -39
  1200. package/src/theme/use-theme.ts +0 -3
  1201. package/src/types/boundaries.ts +123 -0
  1202. package/src/types/cache-types.ts +207 -0
  1203. package/src/types/error-types.ts +132 -0
  1204. package/src/types/global-namespace.ts +113 -0
  1205. package/src/types/handler-context.ts +850 -0
  1206. package/src/types/index.ts +81 -0
  1207. package/src/types/loader-types.ts +212 -0
  1208. package/src/types/request-scope.ts +112 -0
  1209. package/src/types/route-config.ts +138 -0
  1210. package/src/types/route-entry.ts +114 -0
  1211. package/src/types/segments.ts +271 -0
  1212. package/src/types.ts +1 -1795
  1213. package/src/urls/include-helper.ts +162 -0
  1214. package/src/urls/include-provider.ts +71 -0
  1215. package/src/urls/index.ts +44 -0
  1216. package/src/urls/path-helper-types.ts +418 -0
  1217. package/src/urls/path-helper.ts +280 -0
  1218. package/src/urls/pattern-types.ts +189 -0
  1219. package/src/urls/response-types.ts +109 -0
  1220. package/src/urls/type-extraction.ts +316 -0
  1221. package/src/urls/urls-function.ts +80 -0
  1222. package/src/urls.ts +1 -1352
  1223. package/src/use-loader.tsx +406 -141
  1224. package/src/vercel/index.ts +11 -0
  1225. package/src/vercel/tracing.ts +88 -0
  1226. package/src/vite/debug.ts +185 -0
  1227. package/src/vite/discovery/bundle-postprocess.ts +182 -0
  1228. package/src/vite/discovery/dev-prerender-cache.ts +117 -0
  1229. package/src/vite/discovery/discover-routers.ts +408 -0
  1230. package/src/vite/discovery/discovery-errors.ts +255 -0
  1231. package/src/vite/discovery/gate-state.ts +171 -0
  1232. package/src/vite/discovery/prerender-collection.ts +483 -0
  1233. package/src/vite/discovery/route-types-writer.ts +214 -0
  1234. package/src/vite/discovery/self-gen-tracking.ts +73 -0
  1235. package/src/vite/discovery/shell-prerender-phase.ts +397 -0
  1236. package/src/vite/discovery/state.ts +205 -0
  1237. package/src/vite/discovery/virtual-module-codegen.ts +293 -0
  1238. package/src/vite/index.ts +31 -2255
  1239. package/src/vite/inject-client-debug.ts +88 -0
  1240. package/src/vite/plugin-types.ts +336 -0
  1241. package/src/vite/plugins/cjs-to-esm.ts +90 -0
  1242. package/src/vite/plugins/client-ref-dedup.ts +120 -0
  1243. package/src/vite/plugins/client-ref-hashing.ts +118 -0
  1244. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1245. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1246. package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
  1247. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
  1248. package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +89 -79
  1249. package/src/vite/plugins/expose-ids/export-analysis.ts +363 -0
  1250. package/src/vite/plugins/expose-ids/handler-transform.ts +130 -0
  1251. package/src/vite/plugins/expose-ids/loader-transform.ts +64 -0
  1252. package/src/vite/plugins/expose-ids/router-transform.ts +199 -0
  1253. package/src/vite/plugins/expose-ids/types.ts +45 -0
  1254. package/src/vite/plugins/expose-internal-ids.ts +805 -0
  1255. package/src/vite/plugins/performance-tracks.ts +89 -0
  1256. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1257. package/src/vite/plugins/use-cache-transform.ts +313 -0
  1258. package/src/vite/plugins/vercel-output.ts +384 -0
  1259. package/src/vite/plugins/version-injector.ts +94 -0
  1260. package/src/vite/plugins/version-plugin.ts +271 -0
  1261. package/src/vite/plugins/virtual-entries.ts +267 -0
  1262. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  1263. package/src/vite/rango.ts +600 -0
  1264. package/src/vite/router-discovery.ts +2120 -0
  1265. package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +200 -37
  1266. package/src/vite/utils/banner.ts +36 -0
  1267. package/src/vite/utils/bundle-analysis.ts +132 -0
  1268. package/src/vite/utils/client-chunks.ts +184 -0
  1269. package/src/vite/utils/directive-prologue.ts +40 -0
  1270. package/src/vite/utils/forward-user-plugins.ts +171 -0
  1271. package/src/vite/utils/manifest-utils.ts +15 -0
  1272. package/src/vite/utils/package-resolution.ts +89 -0
  1273. package/src/vite/utils/prerender-utils.ts +268 -0
  1274. package/src/vite/utils/shared-utils.ts +271 -0
  1275. package/CLAUDE.md +0 -43
  1276. package/src/browser/lru-cache.ts +0 -69
  1277. package/src/browser/request-controller.ts +0 -164
  1278. package/src/browser/shallow.ts +0 -35
  1279. package/src/cache/memory-store.ts +0 -253
  1280. package/src/router.gen.ts +0 -6
  1281. package/src/static-handler.gen.ts +0 -5
  1282. package/src/urls.gen.ts +0 -8
  1283. package/src/vite/expose-internal-ids.ts +0 -1167
  1284. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
package/dist/bin/rango.js CHANGED
@@ -1,13 +1,44 @@
1
1
  #!/usr/bin/env node
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __esm = (fn, res, err) => function __init() {
5
+ if (err) throw err[0];
6
+ try {
7
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
8
+ } catch (e) {
9
+ throw err = [e], e;
10
+ }
11
+ };
12
+ var __export = (target, all) => {
13
+ for (var name in all)
14
+ __defProp(target, name, { get: all[name], enumerable: true });
15
+ };
2
16
 
3
- // src/bin/rango.ts
4
- import { resolve as resolve2, dirname as dirname2 } from "node:path";
5
- import { readFileSync as readFileSync2, statSync } from "node:fs";
17
+ // src/build/route-types/param-extraction.ts
18
+ function extractParamsFromPattern(pattern) {
19
+ const params = {};
20
+ const regex = /:([a-zA-Z_$][\w$]*)(?:\([^)]+\))?(\?)?/g;
21
+ let match;
22
+ while ((match = regex.exec(pattern)) !== null) {
23
+ params[match[1]] = match[2] ? "string?" : "string";
24
+ }
25
+ return Object.keys(params).length > 0 ? params : void 0;
26
+ }
27
+ function formatRouteEntry(key, pattern, _params, search) {
28
+ const hasSearch = search && Object.keys(search).length > 0;
29
+ if (!hasSearch) {
30
+ return ` ${key}: ${JSON.stringify(pattern)},`;
31
+ }
32
+ const searchBody = Object.entries(search).map(([k, v]) => `${k}: ${JSON.stringify(v)}`).join(", ");
33
+ return ` ${key}: { path: ${JSON.stringify(pattern)}, search: { ${searchBody} } },`;
34
+ }
35
+ var init_param_extraction = __esm({
36
+ "src/build/route-types/param-extraction.ts"() {
37
+ "use strict";
38
+ }
39
+ });
6
40
 
7
- // src/build/generate-route-types.ts
8
- import { readFileSync, writeFileSync, existsSync, readdirSync, unlinkSync } from "node:fs";
9
- import { join, dirname, resolve, relative, basename as pathBasename } from "node:path";
10
- import picomatch from "picomatch";
41
+ // src/build/route-types/ast-helpers.ts
11
42
  import ts from "typescript";
12
43
  function getStringValue(node) {
13
44
  if (ts.isStringLiteral(node)) return node.text;
@@ -25,36 +56,33 @@ function extractObjectStringProperties(node) {
25
56
  }
26
57
  return result;
27
58
  }
28
- function extractParamsFromPattern(pattern) {
29
- const params = {};
30
- const regex = /:([a-zA-Z_$][\w$]*)(?:\([^)]+\))?(\?)?/g;
31
- let match;
32
- while ((match = regex.exec(pattern)) !== null) {
33
- params[match[1]] = match[2] ? "string?" : "string";
34
- }
35
- return Object.keys(params).length > 0 ? params : void 0;
36
- }
37
- function formatRouteEntry(key, pattern, _params, search) {
38
- const hasSearch = search && Object.keys(search).length > 0;
39
- if (!hasSearch) {
40
- return ` ${key}: "${pattern}",`;
59
+ var init_ast_helpers = __esm({
60
+ "src/build/route-types/ast-helpers.ts"() {
61
+ "use strict";
41
62
  }
42
- const searchBody = Object.entries(search).map(([k, v]) => `${k}: "${v}"`).join(", ");
43
- return ` ${key}: { path: "${pattern}", search: { ${searchBody} } },`;
44
- }
45
- function extractRoutesFromSource(code) {
46
- const sourceFile = ts.createSourceFile("input.tsx", code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
63
+ });
64
+
65
+ // src/build/route-types/ast-route-extraction.ts
66
+ import ts2 from "typescript";
67
+ function extractRoutesFromSource(code, sourceFileArg) {
68
+ const sourceFile = sourceFileArg ?? ts2.createSourceFile(
69
+ "input.tsx",
70
+ code,
71
+ ts2.ScriptTarget.Latest,
72
+ true,
73
+ ts2.ScriptKind.TSX
74
+ );
47
75
  const routes = [];
48
76
  function visit(node) {
49
- if (ts.isCallExpression(node)) {
77
+ if (ts2.isCallExpression(node)) {
50
78
  const callee = node.expression;
51
- const isPath = ts.isIdentifier(callee) && callee.text === "path" || ts.isPropertyAccessExpression(callee) && ts.isIdentifier(callee.expression) && callee.expression.text === "path";
79
+ const isPath = ts2.isIdentifier(callee) && callee.text === "path" || ts2.isPropertyAccessExpression(callee) && ts2.isIdentifier(callee.expression) && callee.expression.text === "path";
52
80
  if (isPath && node.arguments.length >= 1) {
53
81
  const route = extractRouteFromCallExpression(node);
54
82
  if (route) routes.push(route);
55
83
  }
56
84
  }
57
- ts.forEachChild(node, visit);
85
+ ts2.forEachChild(node, visit);
58
86
  }
59
87
  visit(sourceFile);
60
88
  return routes;
@@ -67,13 +95,13 @@ function extractRouteFromCallExpression(node) {
67
95
  let search;
68
96
  for (let i = 1; i < node.arguments.length; i++) {
69
97
  const arg = node.arguments[i];
70
- if (ts.isObjectLiteralExpression(arg)) {
98
+ if (ts2.isObjectLiteralExpression(arg)) {
71
99
  for (const prop of arg.properties) {
72
- if (!ts.isPropertyAssignment(prop)) continue;
73
- const propName = ts.isIdentifier(prop.name) ? prop.name.text : null;
100
+ if (!ts2.isPropertyAssignment(prop)) continue;
101
+ const propName = ts2.isIdentifier(prop.name) ? prop.name.text : null;
74
102
  if (propName === "name") {
75
103
  name = getStringValue(prop.initializer);
76
- } else if (propName === "search" && ts.isObjectLiteralExpression(prop.initializer)) {
104
+ } else if (propName === "search" && ts2.isObjectLiteralExpression(prop.initializer)) {
77
105
  search = extractObjectStringProperties(prop.initializer);
78
106
  }
79
107
  }
@@ -88,10 +116,36 @@ function extractRouteFromCallExpression(node) {
88
116
  ...search && Object.keys(search).length > 0 ? { search } : {}
89
117
  };
90
118
  }
119
+ var init_ast_route_extraction = __esm({
120
+ "src/build/route-types/ast-route-extraction.ts"() {
121
+ "use strict";
122
+ init_ast_helpers();
123
+ init_param_extraction();
124
+ }
125
+ });
126
+
127
+ // src/route-name.ts
128
+ function isAutoGeneratedRouteName(name) {
129
+ return name.split(".").some((segment) => {
130
+ return segment.startsWith(AUTO_GENERATED_ROUTE_PREFIX) || segment.startsWith(INTERNAL_INCLUDE_SCOPE_PREFIX);
131
+ });
132
+ }
133
+ var AUTO_GENERATED_ROUTE_PREFIX, INTERNAL_INCLUDE_SCOPE_PREFIX;
134
+ var init_route_name = __esm({
135
+ "src/route-name.ts"() {
136
+ "use strict";
137
+ AUTO_GENERATED_ROUTE_PREFIX = "$path_";
138
+ INTERNAL_INCLUDE_SCOPE_PREFIX = "$prefix_";
139
+ }
140
+ });
141
+
142
+ // src/build/route-types/codegen.ts
91
143
  function generatePerModuleTypesSource(routes) {
92
144
  const valid = routes.filter(({ name }) => {
93
145
  if (!name || /["'\\`\n\r]/.test(name)) {
94
- console.warn(`[rsc-router] Skipping route with invalid name: ${JSON.stringify(name)}`);
146
+ console.warn(
147
+ `[rango] Skipping route with invalid name: ${JSON.stringify(name)}`
148
+ );
95
149
  return false;
96
150
  }
97
151
  return true;
@@ -99,7 +153,9 @@ function generatePerModuleTypesSource(routes) {
99
153
  const deduped = /* @__PURE__ */ new Map();
100
154
  for (const { name, pattern, params, search } of valid) {
101
155
  if (deduped.has(name)) {
102
- console.warn(`[rsc-router] Duplicate route name "${name}" \u2014 keeping first definition`);
156
+ console.warn(
157
+ `[rango] Duplicate route name "${name}" \u2014 keeping first definition`
158
+ );
103
159
  continue;
104
160
  }
105
161
  deduped.set(name, { pattern, params, search });
@@ -117,13 +173,16 @@ export type routes = typeof routes;
117
173
  `;
118
174
  }
119
175
  function generateRouteTypesSource(routeManifest, searchSchemas) {
120
- const entries = Object.entries(routeManifest).sort(
121
- ([a], [b]) => a.localeCompare(b)
122
- );
176
+ const entries = Object.entries(routeManifest).filter(([name]) => !isAutoGeneratedRouteName(name)).sort(([a], [b]) => a.localeCompare(b));
177
+ const filteredSearchSchemas = searchSchemas ? Object.fromEntries(
178
+ Object.entries(searchSchemas).filter(
179
+ ([name]) => !isAutoGeneratedRouteName(name)
180
+ )
181
+ ) : void 0;
123
182
  const objectBody = entries.map(([name, pattern]) => {
124
183
  const key = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name) ? name : `"${name}"`;
125
184
  const params = extractParamsFromPattern(pattern);
126
- const search = searchSchemas?.[name];
185
+ const search = filteredSearchSchemas?.[name];
127
186
  return formatRouteEntry(key, pattern, params, search);
128
187
  }).join("\n");
129
188
  return `// Auto-generated by @rangojs/router - do not edit
@@ -131,124 +190,258 @@ export const NamedRoutes = {
131
190
  ${objectBody}
132
191
  } as const;
133
192
 
193
+ // Aliased so the augmentation below does not pay a homomorphic mapped-type
194
+ // instantiation per route; \`as const\` already makes the members readonly.
195
+ type NamedRoutesShape = typeof NamedRoutes;
196
+
134
197
  declare global {
135
- namespace RSCRouter {
136
- interface GeneratedRouteMap extends Readonly<typeof NamedRoutes> {}
198
+ namespace Rango {
199
+ interface GeneratedRouteMap extends NamedRoutesShape {}
137
200
  }
138
201
  }
139
202
  `;
140
203
  }
204
+ var init_codegen = __esm({
205
+ "src/build/route-types/codegen.ts"() {
206
+ "use strict";
207
+ init_param_extraction();
208
+ init_route_name();
209
+ }
210
+ });
211
+
212
+ // src/build/route-types/scan-filter.ts
213
+ import { join, relative } from "node:path";
214
+ import { readdirSync } from "node:fs";
215
+ import picomatch from "picomatch";
141
216
  function findTsFiles(dir, filter) {
142
217
  const results = [];
143
218
  let entries;
144
219
  try {
145
220
  entries = readdirSync(dir, { withFileTypes: true });
146
221
  } catch (err) {
147
- console.warn(`[rsc-router] Failed to scan directory ${dir}: ${err.message}`);
222
+ console.warn(
223
+ `[rango] Failed to scan directory ${dir}: ${err.message}`
224
+ );
148
225
  return results;
149
226
  }
150
227
  for (const entry of entries) {
151
228
  const fullPath = join(dir, entry.name);
152
229
  if (entry.isDirectory()) {
153
- if (entry.name === "node_modules" || entry.name.startsWith(".")) continue;
230
+ if (entry.name === "node_modules" || entry.name.startsWith(".") || entry.name === "dist" || entry.name === "build" || entry.name === "coverage")
231
+ continue;
154
232
  results.push(...findTsFiles(fullPath, filter));
155
- } else if ((entry.name.endsWith(".ts") || entry.name.endsWith(".tsx")) && !entry.name.includes(".gen.")) {
233
+ } else if ((entry.name.endsWith(".ts") || entry.name.endsWith(".tsx") || entry.name.endsWith(".js") || entry.name.endsWith(".jsx")) && !entry.name.includes(".gen.")) {
156
234
  if (filter && !filter(fullPath)) continue;
157
235
  results.push(fullPath);
158
236
  }
159
237
  }
160
238
  return results;
161
239
  }
162
- function findUrlsVariableNames(code) {
163
- const sourceFile = ts.createSourceFile("input.tsx", code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
164
- const names = [];
165
- function visit(node) {
166
- if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name) && node.initializer && ts.isCallExpression(node.initializer)) {
167
- const callee = node.initializer.expression;
168
- if (ts.isIdentifier(callee) && callee.text === "urls") {
169
- names.push(node.name.text);
240
+ var init_scan_filter = __esm({
241
+ "src/build/route-types/scan-filter.ts"() {
242
+ "use strict";
243
+ }
244
+ });
245
+
246
+ // src/build/route-types/include-resolution.ts
247
+ import { readFileSync, existsSync } from "node:fs";
248
+ import { dirname, resolve } from "node:path";
249
+ import ts3 from "typescript";
250
+ function createScanMemo() {
251
+ return { files: /* @__PURE__ */ new Map(), blockSourceFiles: /* @__PURE__ */ new Map() };
252
+ }
253
+ function parseBlock(memo, block) {
254
+ if (memo) {
255
+ const cached = memo.blockSourceFiles.get(block);
256
+ if (cached) return cached;
257
+ }
258
+ const sf = ts3.createSourceFile(
259
+ "input.tsx",
260
+ block,
261
+ ts3.ScriptTarget.Latest,
262
+ true,
263
+ ts3.ScriptKind.TSX
264
+ );
265
+ if (memo) memo.blockSourceFiles.set(block, sf);
266
+ return sf;
267
+ }
268
+ function readSourceMemoized(memo, realPath) {
269
+ if (memo) {
270
+ const cached = memo.files.get(realPath);
271
+ if (cached !== void 0) return cached;
272
+ }
273
+ const source = readFileSync(realPath, "utf-8");
274
+ if (memo) memo.files.set(realPath, source);
275
+ return source;
276
+ }
277
+ function extractNamePrefixFromInclude(node) {
278
+ if (node.arguments.length >= 3) {
279
+ const thirdArg = node.arguments[2];
280
+ if (ts3.isObjectLiteralExpression(thirdArg)) {
281
+ for (const prop of thirdArg.properties) {
282
+ if (!ts3.isPropertyAssignment(prop)) continue;
283
+ const propName = ts3.isIdentifier(prop.name) ? prop.name.text : null;
284
+ if (propName === "name") {
285
+ return getStringValue(prop.initializer);
286
+ }
170
287
  }
171
288
  }
172
- ts.forEachChild(node, visit);
173
289
  }
174
- visit(sourceFile);
175
- return names;
290
+ return null;
176
291
  }
177
- function writePerModuleRouteTypesForFile(filePath) {
178
- try {
179
- const source = readFileSync(filePath, "utf-8");
180
- if (!source.includes("urls(")) return;
181
- const varNames = findUrlsVariableNames(source);
182
- let routes;
183
- if (varNames.length > 0) {
184
- routes = [];
185
- for (const varName of varNames) {
186
- const { routes: routeMap, searchSchemas } = buildCombinedRouteMapWithSearch(filePath, varName);
187
- for (const [name, pattern] of Object.entries(routeMap)) {
188
- const params = extractParamsFromPattern(pattern);
189
- routes.push({
190
- name,
191
- pattern,
192
- ...params ? { params } : {},
193
- ...searchSchemas[name] ? { search: searchSchemas[name] } : {}
194
- });
195
- }
292
+ function thenSelectsNonDefaultMember(expr) {
293
+ const findThenCall = (e) => {
294
+ if (ts3.isCallExpression(e) && ts3.isPropertyAccessExpression(e.expression) && e.expression.name.text === "then") {
295
+ return e;
296
+ }
297
+ if (ts3.isCallExpression(e) && ts3.isPropertyAccessExpression(e.expression)) {
298
+ return findThenCall(e.expression.expression);
299
+ }
300
+ if (ts3.isPropertyAccessExpression(e)) return findThenCall(e.expression);
301
+ if (ts3.isParenthesizedExpression(e)) return findThenCall(e.expression);
302
+ if (ts3.isAwaitExpression(e)) return findThenCall(e.expression);
303
+ return null;
304
+ };
305
+ const thenCall = findThenCall(expr);
306
+ if (!thenCall || thenCall.arguments.length === 0) return false;
307
+ const cb = thenCall.arguments[0];
308
+ if (!ts3.isArrowFunction(cb) && !ts3.isFunctionExpression(cb)) return false;
309
+ let ret;
310
+ if (ts3.isBlock(cb.body)) {
311
+ for (const stmt of cb.body.statements) {
312
+ if (ts3.isReturnStatement(stmt) && stmt.expression) {
313
+ ret = stmt.expression;
314
+ break;
196
315
  }
197
- } else {
198
- routes = extractRoutesFromSource(source);
199
316
  }
200
- if (routes.length === 0) return;
201
- const genPath = filePath.replace(/\.(tsx?)$/, ".gen.ts");
202
- const genSource = generatePerModuleTypesSource(routes);
203
- const existing = existsSync(genPath) ? readFileSync(genPath, "utf-8") : null;
204
- if (existing !== genSource) {
205
- writeFileSync(genPath, genSource);
206
- console.log(`[rsc-router] Generated route types -> ${genPath}`);
317
+ } else {
318
+ ret = cb.body;
319
+ }
320
+ if (!ret) return false;
321
+ if (ts3.isPropertyAccessExpression(ret)) {
322
+ return ret.name.text !== "default";
323
+ }
324
+ return false;
325
+ }
326
+ function extractDynamicImportSpecifier(node) {
327
+ let body;
328
+ if (ts3.isArrowFunction(node) || ts3.isFunctionExpression(node)) {
329
+ body = node.body;
330
+ }
331
+ if (!body) return null;
332
+ let expr;
333
+ if (ts3.isBlock(body)) {
334
+ for (const stmt of body.statements) {
335
+ if (ts3.isReturnStatement(stmt) && stmt.expression) {
336
+ expr = stmt.expression;
337
+ break;
338
+ }
207
339
  }
208
- } catch (err) {
209
- console.warn(`[rsc-router] Failed to generate route types for ${filePath}: ${err.message}`);
340
+ } else {
341
+ expr = body;
210
342
  }
343
+ if (!expr) return null;
344
+ const findImportCall = (e) => {
345
+ if (ts3.isCallExpression(e) && e.expression.kind === ts3.SyntaxKind.ImportKeyword) {
346
+ return e;
347
+ }
348
+ if (ts3.isCallExpression(e) && ts3.isPropertyAccessExpression(e.expression)) {
349
+ return findImportCall(e.expression.expression);
350
+ }
351
+ if (ts3.isPropertyAccessExpression(e)) return findImportCall(e.expression);
352
+ if (ts3.isParenthesizedExpression(e)) return findImportCall(e.expression);
353
+ if (ts3.isAwaitExpression(e)) return findImportCall(e.expression);
354
+ return null;
355
+ };
356
+ const importCall = findImportCall(expr);
357
+ if (!importCall || importCall.arguments.length === 0) return null;
358
+ if (thenSelectsNonDefaultMember(expr)) return null;
359
+ return getStringValue(importCall.arguments[0]);
211
360
  }
212
- function extractIncludesFromSource(code) {
213
- const sourceFile = ts.createSourceFile("input.tsx", code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
214
- const results = [];
361
+ function resolveDefaultExportTarget(code, sourceFile) {
362
+ let result = null;
215
363
  function visit(node) {
216
- if (ts.isCallExpression(node)) {
217
- const callee = node.expression;
218
- if (ts.isIdentifier(callee) && callee.text === "include") {
219
- const result = extractIncludeFromCallExpression(node);
220
- if (result) results.push(result);
364
+ if (result) return;
365
+ if (ts3.isExportAssignment(node) && !node.isExportEquals) {
366
+ const expr = node.expression;
367
+ if (ts3.isIdentifier(expr)) {
368
+ result = { variableName: expr.text };
369
+ } else if (ts3.isCallExpression(expr)) {
370
+ const callee = expr.expression;
371
+ if (ts3.isIdentifier(callee) && callee.text === "urls") {
372
+ result = { inlineBlock: expr.getText(sourceFile) };
373
+ }
221
374
  }
375
+ return;
222
376
  }
223
- ts.forEachChild(node, visit);
377
+ ts3.forEachChild(node, visit);
224
378
  }
225
379
  visit(sourceFile);
226
- return results;
380
+ return result;
227
381
  }
228
- function extractIncludeFromCallExpression(node) {
229
- if (node.arguments.length < 2) return null;
230
- const pathPrefix = getStringValue(node.arguments[0]);
231
- if (pathPrefix === null) return null;
232
- const secondArg = node.arguments[1];
233
- if (!ts.isIdentifier(secondArg)) return null;
234
- const variableName = secondArg.text;
235
- let namePrefix = null;
236
- if (node.arguments.length >= 3) {
237
- const thirdArg = node.arguments[2];
238
- if (ts.isObjectLiteralExpression(thirdArg)) {
239
- for (const prop of thirdArg.properties) {
240
- if (!ts.isPropertyAssignment(prop)) continue;
241
- const propName = ts.isIdentifier(prop.name) ? prop.name.text : null;
242
- if (propName === "name") {
243
- namePrefix = getStringValue(prop.initializer);
382
+ function extractIncludesWithDiagnostics(code, sourceFileArg) {
383
+ const sourceFile = sourceFileArg ?? ts3.createSourceFile(
384
+ "input.tsx",
385
+ code,
386
+ ts3.ScriptTarget.Latest,
387
+ true,
388
+ ts3.ScriptKind.TSX
389
+ );
390
+ const resolved = [];
391
+ const unresolvable = [];
392
+ function visit(node) {
393
+ if (ts3.isCallExpression(node)) {
394
+ const callee = node.expression;
395
+ if (ts3.isIdentifier(callee) && callee.text === "include") {
396
+ if (node.arguments.length < 2) {
397
+ ts3.forEachChild(node, visit);
398
+ return;
399
+ }
400
+ const pathPrefix = getStringValue(node.arguments[0]);
401
+ if (pathPrefix === null) {
402
+ ts3.forEachChild(node, visit);
403
+ return;
404
+ }
405
+ const secondArg = node.arguments[1];
406
+ const namePrefix = extractNamePrefixFromInclude(node);
407
+ const dynamicImportSpec = extractDynamicImportSpecifier(secondArg);
408
+ if (ts3.isIdentifier(secondArg)) {
409
+ resolved.push({
410
+ pathPrefix,
411
+ variableName: secondArg.text,
412
+ namePrefix
413
+ });
414
+ } else if (dynamicImportSpec !== null) {
415
+ resolved.push({
416
+ pathPrefix,
417
+ moduleSpecifier: dynamicImportSpec,
418
+ namePrefix
419
+ });
420
+ } else if (ts3.isCallExpression(secondArg)) {
421
+ const callText = secondArg.expression.getText(sourceFile);
422
+ unresolvable.push({
423
+ pathPrefix,
424
+ namePrefix,
425
+ reason: "factory-call",
426
+ detail: `${callText}()`
427
+ });
428
+ } else {
429
+ unresolvable.push({
430
+ pathPrefix,
431
+ namePrefix,
432
+ reason: "dynamic-expression",
433
+ detail: secondArg.getText(sourceFile)
434
+ });
244
435
  }
245
436
  }
246
437
  }
438
+ ts3.forEachChild(node, visit);
247
439
  }
248
- return { pathPrefix, variableName, namePrefix };
440
+ visit(sourceFile);
441
+ return { resolved, unresolvable };
249
442
  }
250
443
  function resolveImportedVariable(code, localName) {
251
- const importRegex = /import\s*\{([^}]+)\}\s*from\s*["']([^"']+)["']/g;
444
+ const importRegex = /import\s*(?:[\w$]+\s*,\s*)?\{([^}]+)\}\s*from\s*["']([^"']+)["']/g;
252
445
  let match;
253
446
  while ((match = importRegex.exec(code)) !== null) {
254
447
  const imports = match[1];
@@ -269,57 +462,155 @@ function resolveImportPath(importSpec, fromFile) {
269
462
  let base = importSpec;
270
463
  if (base.endsWith(".js")) base = base.slice(0, -3);
271
464
  else if (base.endsWith(".mjs")) base = base.slice(0, -4);
465
+ else if (base.endsWith(".jsx")) base = base.slice(0, -4);
272
466
  const candidates = [
273
467
  resolve(dir, base + ".ts"),
274
468
  resolve(dir, base + ".tsx"),
469
+ resolve(dir, base + ".js"),
470
+ resolve(dir, base + ".jsx"),
275
471
  resolve(dir, base + "/index.ts"),
276
- resolve(dir, base + "/index.tsx")
472
+ resolve(dir, base + "/index.tsx"),
473
+ resolve(dir, base + "/index.js"),
474
+ resolve(dir, base + "/index.jsx")
277
475
  ];
278
476
  for (const candidate of candidates) {
279
477
  if (existsSync(candidate)) return candidate;
280
478
  }
281
479
  return null;
282
480
  }
283
- function extractUrlsBlockForVariable(code, varName) {
284
- const sourceFile = ts.createSourceFile("input.tsx", code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
481
+ function extractUrlsBlockForVariable(code, varName, sourceFileArg) {
482
+ const sourceFile = sourceFileArg ?? ts3.createSourceFile(
483
+ "input.tsx",
484
+ code,
485
+ ts3.ScriptTarget.Latest,
486
+ true,
487
+ ts3.ScriptKind.TSX
488
+ );
285
489
  let result = null;
286
490
  function visit(node) {
287
491
  if (result) return;
288
- if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name) && node.name.text === varName && node.initializer && ts.isCallExpression(node.initializer)) {
492
+ if (ts3.isVariableDeclaration(node) && ts3.isIdentifier(node.name) && node.name.text === varName && node.initializer && ts3.isCallExpression(node.initializer)) {
289
493
  const callee = node.initializer.expression;
290
- if (ts.isIdentifier(callee) && callee.text === "urls") {
494
+ if (ts3.isIdentifier(callee) && callee.text === "urls") {
291
495
  result = node.initializer.getText(sourceFile);
292
496
  return;
293
497
  }
294
498
  }
295
- ts.forEachChild(node, visit);
499
+ ts3.forEachChild(node, visit);
296
500
  }
297
501
  visit(sourceFile);
298
502
  return result;
299
503
  }
300
- function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSchemasOut) {
504
+ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSchemasOut, diagnosticsOut, memo) {
301
505
  const routeMap = {};
302
- const localRoutes = extractRoutesFromSource(block);
506
+ const blockSourceFile = parseBlock(memo, block);
507
+ const localRoutes = extractRoutesFromSource(block, blockSourceFile);
303
508
  for (const { name, pattern, search } of localRoutes) {
304
509
  routeMap[name] = pattern;
305
510
  if (search && searchSchemasOut) {
306
511
  searchSchemasOut[name] = search;
307
512
  }
308
513
  }
309
- const includes = extractIncludesFromSource(block);
310
- for (const { pathPrefix, variableName, namePrefix } of includes) {
514
+ const { resolved: includes, unresolvable } = extractIncludesWithDiagnostics(
515
+ block,
516
+ blockSourceFile
517
+ );
518
+ if (diagnosticsOut) {
519
+ for (const entry of unresolvable) {
520
+ diagnosticsOut.push({ ...entry, sourceFile: filePath });
521
+ }
522
+ }
523
+ for (const inc of includes) {
524
+ const { pathPrefix, namePrefix } = inc;
311
525
  let childResult;
312
- const imported = resolveImportedVariable(fullSource, variableName);
313
- if (imported) {
314
- const targetFile = resolveImportPath(imported.specifier, filePath);
315
- if (!targetFile) continue;
316
- childResult = buildCombinedRouteMapWithSearch(
317
- targetFile,
318
- imported.exportedName,
319
- visited
526
+ if (inc.moduleSpecifier) {
527
+ const targetFile = resolveImportPath(inc.moduleSpecifier, filePath);
528
+ if (!targetFile) {
529
+ diagnosticsOut?.push({
530
+ pathPrefix,
531
+ namePrefix,
532
+ reason: "file-not-found",
533
+ sourceFile: filePath,
534
+ detail: `import("${inc.moduleSpecifier}") resolved to no file`
535
+ });
536
+ continue;
537
+ }
538
+ let targetSource;
539
+ try {
540
+ targetSource = readSourceMemoized(memo, resolve(targetFile));
541
+ } catch (err) {
542
+ diagnosticsOut?.push({
543
+ pathPrefix,
544
+ namePrefix,
545
+ reason: "file-not-found",
546
+ sourceFile: filePath,
547
+ detail: `import("${inc.moduleSpecifier}") resolved to "${targetFile}" but reading it failed: ${err?.message ?? String(err)}`
548
+ });
549
+ continue;
550
+ }
551
+ const def = resolveDefaultExportTarget(
552
+ targetSource,
553
+ parseBlock(memo, targetSource)
320
554
  );
555
+ if (!def) {
556
+ diagnosticsOut?.push({
557
+ pathPrefix,
558
+ namePrefix,
559
+ reason: "unresolvable-import",
560
+ sourceFile: filePath,
561
+ detail: `import("${inc.moduleSpecifier}") has no resolvable \`export default urls(...)\``
562
+ });
563
+ continue;
564
+ }
565
+ if (def.inlineBlock) {
566
+ childResult = buildCombinedRouteMapWithSearch(
567
+ targetFile,
568
+ void 0,
569
+ visited,
570
+ diagnosticsOut,
571
+ def.inlineBlock,
572
+ memo
573
+ );
574
+ } else {
575
+ const variableName = def.variableName;
576
+ const resolved = resolveIncludedVariable({
577
+ variableName,
578
+ resolutionFile: targetFile,
579
+ resolutionSource: targetSource,
580
+ reportFile: filePath,
581
+ memo,
582
+ visited,
583
+ diagnosticsOut,
584
+ pathPrefix,
585
+ namePrefix,
586
+ fileNotFoundDetail: (specifier) => `import("${inc.moduleSpecifier}") default re-exports "${variableName}" from "${specifier}", which resolved to no file`,
587
+ notFoundDetail: () => `import("${inc.moduleSpecifier}") default "${variableName}" not found in its imports or same-file scope`
588
+ });
589
+ if (!resolved) continue;
590
+ childResult = resolved;
591
+ }
592
+ } else if (inc.variableName) {
593
+ const variableName = inc.variableName;
594
+ const resolved = resolveIncludedVariable({
595
+ variableName,
596
+ resolutionFile: filePath,
597
+ resolutionSource: fullSource,
598
+ reportFile: filePath,
599
+ memo,
600
+ visited,
601
+ diagnosticsOut,
602
+ pathPrefix,
603
+ namePrefix,
604
+ fileNotFoundDetail: (specifier) => `import "${specifier}" resolved to no file`,
605
+ notFoundDetail: () => `variable "${variableName}" not found in imports or same-file scope`
606
+ });
607
+ if (!resolved) continue;
608
+ childResult = resolved;
321
609
  } else {
322
- childResult = buildCombinedRouteMapWithSearch(filePath, variableName, visited);
610
+ continue;
611
+ }
612
+ if (namePrefix === null) {
613
+ continue;
323
614
  }
324
615
  for (const [name, pattern] of Object.entries(childResult.routes)) {
325
616
  const prefixedName = namePrefix ? `${namePrefix}.${name}` : name;
@@ -339,129 +630,1331 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
339
630
  }
340
631
  return routeMap;
341
632
  }
342
- function buildCombinedRouteMapWithSearch(filePath, variableName, visited) {
633
+ function resolveIncludedVariable(opts) {
634
+ const {
635
+ variableName,
636
+ resolutionFile,
637
+ resolutionSource,
638
+ reportFile,
639
+ memo,
640
+ visited,
641
+ diagnosticsOut,
642
+ pathPrefix,
643
+ namePrefix
644
+ } = opts;
645
+ const imported = resolveImportedVariable(resolutionSource, variableName);
646
+ if (imported) {
647
+ const targetFile = resolveImportPath(imported.specifier, resolutionFile);
648
+ if (!targetFile) {
649
+ diagnosticsOut?.push({
650
+ pathPrefix,
651
+ namePrefix,
652
+ reason: "file-not-found",
653
+ sourceFile: reportFile,
654
+ detail: opts.fileNotFoundDetail(imported.specifier)
655
+ });
656
+ return null;
657
+ }
658
+ return buildCombinedRouteMapWithSearch(
659
+ targetFile,
660
+ imported.exportedName,
661
+ visited,
662
+ diagnosticsOut,
663
+ void 0,
664
+ memo
665
+ );
666
+ }
667
+ const sameFileBlock = extractUrlsBlockForVariable(
668
+ resolutionSource,
669
+ variableName,
670
+ parseBlock(memo, resolutionSource)
671
+ );
672
+ if (!sameFileBlock) {
673
+ diagnosticsOut?.push({
674
+ pathPrefix,
675
+ namePrefix,
676
+ reason: "unresolvable-import",
677
+ sourceFile: reportFile,
678
+ detail: opts.notFoundDetail()
679
+ });
680
+ return null;
681
+ }
682
+ return buildCombinedRouteMapWithSearch(
683
+ resolutionFile,
684
+ variableName,
685
+ visited,
686
+ diagnosticsOut,
687
+ void 0,
688
+ memo
689
+ );
690
+ }
691
+ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut, inlineBlock, memo) {
343
692
  visited = visited ?? /* @__PURE__ */ new Set();
693
+ memo = memo ?? createScanMemo();
344
694
  const realPath = resolve(filePath);
345
695
  const key = variableName ? `${realPath}:${variableName}` : realPath;
346
696
  if (visited.has(key)) {
347
- console.warn(`[rsc-router] Circular include detected, skipping: ${key}`);
697
+ console.warn(`[rango] Circular include detected, skipping: ${key}`);
348
698
  return { routes: {}, searchSchemas: {} };
349
699
  }
350
700
  visited.add(key);
351
701
  let source;
352
702
  try {
353
- source = readFileSync(realPath, "utf-8");
703
+ source = readSourceMemoized(memo, realPath);
354
704
  } catch {
355
705
  return { routes: {}, searchSchemas: {} };
356
706
  }
357
707
  let block;
358
- if (variableName) {
359
- const extracted = extractUrlsBlockForVariable(source, variableName);
708
+ if (inlineBlock) {
709
+ block = inlineBlock;
710
+ } else if (variableName) {
711
+ const extracted = extractUrlsBlockForVariable(
712
+ source,
713
+ variableName,
714
+ parseBlock(memo, source)
715
+ );
360
716
  if (!extracted) return { routes: {}, searchSchemas: {} };
361
717
  block = extracted;
362
718
  } else {
363
719
  block = source;
364
720
  }
365
721
  const searchSchemas = {};
366
- const routes = buildRouteMapFromBlock(block, source, realPath, visited, searchSchemas);
722
+ const routes = buildRouteMapFromBlock(
723
+ block,
724
+ source,
725
+ realPath,
726
+ visited,
727
+ searchSchemas,
728
+ diagnosticsOut,
729
+ memo
730
+ );
731
+ visited.delete(key);
367
732
  return { routes, searchSchemas };
368
733
  }
369
- function extractUrlsVariableFromRouter(code) {
370
- const routesCallMatch = code.match(/\.routes\s*\(\s*([a-zA-Z_$][\w$]*)\s*\)/);
371
- if (routesCallMatch) return routesCallMatch[1];
372
- const urlsOptionMatch = code.match(/urls\s*:\s*([a-zA-Z_$][\w$]*)/);
373
- if (urlsOptionMatch) return urlsOptionMatch[1];
374
- return null;
375
- }
376
- function findRouterFiles(root, filter) {
377
- const files = findTsFiles(root, filter);
378
- const result = [];
379
- for (const filePath of files) {
380
- if (filePath.includes(".gen.")) continue;
381
- try {
382
- const source = readFileSync(filePath, "utf-8");
383
- if (/\bcreateRouter\s*[<(]/.test(source)) {
384
- result.push(filePath);
734
+ var init_include_resolution = __esm({
735
+ "src/build/route-types/include-resolution.ts"() {
736
+ "use strict";
737
+ init_ast_helpers();
738
+ init_ast_route_extraction();
739
+ }
740
+ });
741
+
742
+ // src/build/route-types/per-module-writer.ts
743
+ import { readFileSync as readFileSync2, writeFileSync, existsSync as existsSync2 } from "node:fs";
744
+ import ts4 from "typescript";
745
+ function findUrlsVariableNames(code) {
746
+ const sourceFile = ts4.createSourceFile(
747
+ "input.tsx",
748
+ code,
749
+ ts4.ScriptTarget.Latest,
750
+ true,
751
+ ts4.ScriptKind.TSX
752
+ );
753
+ const names = [];
754
+ function visit(node) {
755
+ if (ts4.isVariableDeclaration(node) && ts4.isIdentifier(node.name) && node.initializer && ts4.isCallExpression(node.initializer)) {
756
+ const callee = node.initializer.expression;
757
+ if (ts4.isIdentifier(callee) && callee.text === "urls") {
758
+ names.push(node.name.text);
385
759
  }
386
- } catch {
387
- continue;
388
760
  }
761
+ ts4.forEachChild(node, visit);
389
762
  }
390
- return result;
763
+ visit(sourceFile);
764
+ return names;
391
765
  }
392
- function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
766
+ function writePerModuleRouteTypesForFile(filePath) {
393
767
  try {
394
- const oldCombinedPath = join(root, "src", "named-routes.gen.ts");
395
- if (existsSync(oldCombinedPath)) {
396
- unlinkSync(oldCombinedPath);
397
- console.log(`[rsc-router] Removed stale combined route types: ${oldCombinedPath}`);
398
- }
399
- } catch {
400
- }
401
- const routerFilePaths = knownRouterFiles ?? findRouterFiles(root);
402
- if (routerFilePaths.length === 0) return;
403
- for (const routerFilePath of routerFilePaths) {
404
- let routerSource;
405
- try {
406
- routerSource = readFileSync(routerFilePath, "utf-8");
407
- } catch {
408
- continue;
409
- }
410
- const urlsVarName = extractUrlsVariableFromRouter(routerSource);
411
- if (!urlsVarName) continue;
412
- let result;
413
- const imported = resolveImportedVariable(routerSource, urlsVarName);
414
- if (imported) {
415
- const targetFile = resolveImportPath(imported.specifier, routerFilePath);
416
- if (!targetFile) continue;
417
- result = buildCombinedRouteMapWithSearch(targetFile, imported.exportedName);
768
+ const source = readFileSync2(filePath, "utf-8");
769
+ if (!source.includes("urls(")) return;
770
+ const varNames = findUrlsVariableNames(source);
771
+ let routes;
772
+ if (varNames.length > 0) {
773
+ routes = [];
774
+ const memo = createScanMemo();
775
+ for (const varName of varNames) {
776
+ const { routes: routeMap, searchSchemas } = buildCombinedRouteMapWithSearch(
777
+ filePath,
778
+ varName,
779
+ void 0,
780
+ void 0,
781
+ void 0,
782
+ memo
783
+ );
784
+ for (const [name, pattern] of Object.entries(routeMap)) {
785
+ const params = extractParamsFromPattern(pattern);
786
+ routes.push({
787
+ name,
788
+ pattern,
789
+ ...params ? { params } : {},
790
+ ...searchSchemas[name] ? { search: searchSchemas[name] } : {}
791
+ });
792
+ }
793
+ }
418
794
  } else {
419
- result = buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
795
+ routes = extractRoutesFromSource(source);
420
796
  }
421
- const routerBasename = pathBasename(routerFilePath).replace(/\.(tsx?|jsx?)$/, "");
422
- const outPath = join(dirname(routerFilePath), `${routerBasename}.named-routes.gen.ts`);
423
- const existing = existsSync(outPath) ? readFileSync(outPath, "utf-8") : null;
424
- if (Object.keys(result.routes).length === 0) {
425
- if (!existing) {
426
- const emptySource = generateRouteTypesSource({});
427
- writeFileSync(outPath, emptySource);
797
+ const genPath = filePath.replace(/\.(tsx?|jsx?)$/, ".gen.ts");
798
+ if (routes.length === 0) {
799
+ if (varNames.length > 0 && !existsSync2(genPath)) {
800
+ writeFileSync(genPath, generatePerModuleTypesSource([]));
801
+ console.log(
802
+ `[rango] Generated route types (placeholder) -> ${genPath}`
803
+ );
428
804
  }
429
- continue;
805
+ return;
430
806
  }
431
- const hasSearchSchemas = Object.keys(result.searchSchemas).length > 0;
432
- const source = generateRouteTypesSource(
433
- result.routes,
434
- hasSearchSchemas ? result.searchSchemas : void 0
807
+ const genSource = generatePerModuleTypesSource(routes);
808
+ const existing = existsSync2(genPath) ? readFileSync2(genPath, "utf-8") : null;
809
+ if (existing !== genSource) {
810
+ writeFileSync(genPath, genSource);
811
+ console.log(`[rango] Generated route types -> ${genPath}`);
812
+ }
813
+ } catch (err) {
814
+ console.warn(
815
+ `[rango] Failed to generate route types for ${filePath}: ${err.message}`
435
816
  );
436
- if (existing !== source) {
437
- if (opts?.preserveIfLarger && existing) {
438
- const existingCount = (existing.match(/^\s+["a-zA-Z_$][^:]*:\s*["{]/gm) || []).length;
439
- const newCount = Object.keys(result.routes).length;
440
- if (existingCount > newCount) {
441
- continue;
817
+ }
818
+ }
819
+ var init_per_module_writer = __esm({
820
+ "src/build/route-types/per-module-writer.ts"() {
821
+ "use strict";
822
+ init_param_extraction();
823
+ init_ast_route_extraction();
824
+ init_codegen();
825
+ init_include_resolution();
826
+ init_scan_filter();
827
+ }
828
+ });
829
+
830
+ // src/build/route-types/source-scan.ts
831
+ function isLineTerminator(ch) {
832
+ const c = ch.charCodeAt(0);
833
+ return c === 10 || c === 13 || c === 8232 || c === 8233;
834
+ }
835
+ function isRegexPositionAt(code, slashPos, prevChar) {
836
+ if (prevChar === void 0) return true;
837
+ if (prevChar === ")" || prevChar === "]" || prevChar === "}") return false;
838
+ if (!/[\w$]/.test(prevChar)) return true;
839
+ let k = slashPos - 1;
840
+ while (k >= 0 && /\s/.test(code[k])) k--;
841
+ const wordEnd = k + 1;
842
+ while (k >= 0 && /[\w$]/.test(code[k])) k--;
843
+ return REGEX_PRECEDING_KEYWORDS.has(code.slice(k + 1, wordEnd));
844
+ }
845
+ function makeCodeClassifier(code) {
846
+ const n = code.length;
847
+ let i = 0;
848
+ let skipStart = -1;
849
+ let skipEnd = -1;
850
+ let lastSig;
851
+ return (q) => {
852
+ if (q >= skipStart && q < skipEnd) return false;
853
+ while (i < n && i <= q) {
854
+ const c = code[i];
855
+ const d = i + 1 < n ? code[i + 1] : "";
856
+ let end = -1;
857
+ let transparent = false;
858
+ if (c === "/" && d === "/") {
859
+ let j = i + 2;
860
+ while (j < n && !isLineTerminator(code[j])) j++;
861
+ end = j;
862
+ transparent = true;
863
+ } else if (c === "/" && d === "*") {
864
+ let j = i + 2;
865
+ while (j < n && !(code[j] === "*" && code[j + 1] === "/")) j++;
866
+ end = Math.min(n, j + 2);
867
+ transparent = true;
868
+ } else if (c === '"' || c === "'" || c === "`") {
869
+ let j = i + 1;
870
+ while (j < n) {
871
+ if (code[j] === "\\") {
872
+ j += 2;
873
+ continue;
874
+ }
875
+ if (code[j] === c) {
876
+ j++;
877
+ break;
878
+ }
879
+ j++;
880
+ }
881
+ end = j;
882
+ } else if (c === "/" && d !== "/" && d !== "*" && isRegexPositionAt(code, i, lastSig)) {
883
+ let j = i + 1;
884
+ let inClass = false;
885
+ let closed = false;
886
+ while (j < n && !isLineTerminator(code[j])) {
887
+ const r = code[j];
888
+ if (r === "\\") {
889
+ j += 2;
890
+ continue;
891
+ }
892
+ if (r === "[") inClass = true;
893
+ else if (r === "]") inClass = false;
894
+ else if (r === "/" && !inClass) {
895
+ j++;
896
+ closed = true;
897
+ break;
898
+ }
899
+ j++;
900
+ }
901
+ if (closed) {
902
+ while (j < n && /[a-z]/.test(code[j])) j++;
903
+ end = j;
904
+ }
905
+ }
906
+ if (end >= 0) {
907
+ if (q < end) {
908
+ skipStart = i;
909
+ skipEnd = end;
910
+ return false;
442
911
  }
912
+ i = end;
913
+ if (!transparent) lastSig = "x";
914
+ } else {
915
+ if (!/\s/.test(c)) lastSig = c;
916
+ i++;
443
917
  }
444
- writeFileSync(outPath, source);
445
- console.log(`[rsc-router] Generated route types (${Object.keys(result.routes).length} routes) -> ${outPath}`);
446
918
  }
919
+ return true;
920
+ };
921
+ }
922
+ function firstCodeMatchIndex(code, pattern) {
923
+ const inCode = makeCodeClassifier(code);
924
+ pattern.lastIndex = 0;
925
+ let m;
926
+ while ((m = pattern.exec(code)) !== null) {
927
+ if (inCode(m.index)) return m.index;
928
+ if (pattern.lastIndex <= m.index) pattern.lastIndex = m.index + 1;
447
929
  }
930
+ return -1;
448
931
  }
932
+ var REGEX_PRECEDING_KEYWORDS;
933
+ var init_source_scan = __esm({
934
+ "src/build/route-types/source-scan.ts"() {
935
+ "use strict";
936
+ REGEX_PRECEDING_KEYWORDS = /* @__PURE__ */ new Set([
937
+ "return",
938
+ "typeof",
939
+ "instanceof",
940
+ "in",
941
+ "of",
942
+ "new",
943
+ "delete",
944
+ "void",
945
+ "do",
946
+ "else",
947
+ "yield",
948
+ "await",
949
+ "case",
950
+ "throw"
951
+ ]);
952
+ }
953
+ });
449
954
 
450
- // src/bin/rango.ts
451
- var [command, ...args] = process.argv.slice(2);
452
- if (command === "generate") {
453
- if (args.length === 0) {
454
- console.error("[rango] Usage: rango generate <file|dir> [file2 ...]");
455
- process.exit(1);
955
+ // src/build/route-types/router-processing.ts
956
+ import {
957
+ readFileSync as readFileSync3,
958
+ writeFileSync as writeFileSync2,
959
+ existsSync as existsSync3,
960
+ unlinkSync,
961
+ readdirSync as readdirSync2
962
+ } from "node:fs";
963
+ import {
964
+ join as join2,
965
+ dirname as dirname2,
966
+ resolve as resolve2,
967
+ sep,
968
+ basename as pathBasename
969
+ } from "node:path";
970
+ import ts5 from "typescript";
971
+ function countPublicRouteEntries(source) {
972
+ const matches = source.matchAll(/^\s+(?:"([^"]+)"|([a-zA-Z_$][^:]*)):\s*["{]/gm) ?? [];
973
+ let count = 0;
974
+ for (const match of matches) {
975
+ const routeName = match[1] || match[2];
976
+ if (routeName && !isAutoGeneratedRouteName(routeName.trim())) {
977
+ count++;
978
+ }
456
979
  }
457
- const files = [];
458
- for (const arg of args) {
459
- const resolved = resolve2(arg);
980
+ return count;
981
+ }
982
+ function isRoutableSourceFile(name) {
983
+ return (name.endsWith(".ts") || name.endsWith(".tsx") || name.endsWith(".js") || name.endsWith(".jsx")) && !name.includes(".gen.") && !name.includes(".test.") && !name.includes(".spec.");
984
+ }
985
+ function isExcludedScanDir(name) {
986
+ return name === "node_modules" || name === "dist" || name === "coverage" || name === "__tests__" || name === "__mocks__" || name.startsWith(".");
987
+ }
988
+ function findCallSiteFilesRecursive(dir, pattern, patternG, stopAtMatchDir, filter, results) {
989
+ let entries;
990
+ try {
991
+ entries = readdirSync2(dir, { withFileTypes: true });
992
+ } catch (err) {
993
+ console.warn(
994
+ `[rango] Failed to scan directory ${dir}: ${err.message}`
995
+ );
996
+ return;
997
+ }
998
+ const childDirs = [];
999
+ const matchesInDir = [];
1000
+ for (const entry of entries) {
1001
+ const fullPath = join2(dir, entry.name);
1002
+ if (entry.isDirectory()) {
1003
+ if (!isExcludedScanDir(entry.name)) childDirs.push(fullPath);
1004
+ continue;
1005
+ }
1006
+ if (!isRoutableSourceFile(entry.name)) continue;
1007
+ if (filter && !filter(fullPath)) continue;
460
1008
  try {
461
- if (statSync(resolved).isDirectory()) {
462
- files.push(...findTsFiles(resolved));
463
- } else {
464
- files.push(resolved);
1009
+ const source = readFileSync3(fullPath, "utf-8");
1010
+ if (pattern.test(source) && firstCodeMatchIndex(source, patternG) >= 0) {
1011
+ matchesInDir.push(fullPath);
1012
+ }
1013
+ } catch {
1014
+ continue;
1015
+ }
1016
+ }
1017
+ results.push(...matchesInDir);
1018
+ if (!stopAtMatchDir || matchesInDir.length === 0) {
1019
+ for (const childDir of childDirs) {
1020
+ findCallSiteFilesRecursive(
1021
+ childDir,
1022
+ pattern,
1023
+ patternG,
1024
+ stopAtMatchDir,
1025
+ filter,
1026
+ results
1027
+ );
1028
+ }
1029
+ }
1030
+ }
1031
+ function findNestedRouterConflict(routerFiles) {
1032
+ const routerDirs = [
1033
+ ...new Set(routerFiles.map((filePath) => dirname2(resolve2(filePath))))
1034
+ ].sort((a, b) => a.length - b.length);
1035
+ for (let i = 0; i < routerDirs.length; i++) {
1036
+ const ancestorDir = routerDirs[i];
1037
+ const prefix = ancestorDir.endsWith(sep) ? ancestorDir : `${ancestorDir}${sep}`;
1038
+ for (let j = i + 1; j < routerDirs.length; j++) {
1039
+ const nestedDir = routerDirs[j];
1040
+ if (!nestedDir.startsWith(prefix)) continue;
1041
+ const ancestorFile = routerFiles.find(
1042
+ (filePath) => dirname2(resolve2(filePath)) === ancestorDir
1043
+ );
1044
+ const nestedFile = routerFiles.find(
1045
+ (filePath) => dirname2(resolve2(filePath)) === nestedDir
1046
+ );
1047
+ if (ancestorFile && nestedFile) {
1048
+ return { ancestor: ancestorFile, nested: nestedFile };
1049
+ }
1050
+ }
1051
+ }
1052
+ return null;
1053
+ }
1054
+ function formatNestedRouterConflictError(conflict, prefix = "[rango]") {
1055
+ return `${prefix} Nested router roots are not supported.
1056
+ Router root: ${conflict.ancestor}
1057
+ Nested router: ${conflict.nested}
1058
+ Move the nested router into a sibling directory or configure it as a separate app root.`;
1059
+ }
1060
+ function extractUrlsFromRouter(code) {
1061
+ const sourceFile = ts5.createSourceFile(
1062
+ "router.tsx",
1063
+ code,
1064
+ ts5.ScriptTarget.Latest,
1065
+ true,
1066
+ ts5.ScriptKind.TSX
1067
+ );
1068
+ let result = null;
1069
+ function isCreateRouterCall(node) {
1070
+ if (!ts5.isCallExpression(node)) return false;
1071
+ const callee = node.expression;
1072
+ return ts5.isIdentifier(callee) && callee.text === "createRouter";
1073
+ }
1074
+ function isInlineBuilder(node) {
1075
+ return ts5.isArrowFunction(node) || ts5.isFunctionExpression(node);
1076
+ }
1077
+ function isRoutesOnCreateRouter(node) {
1078
+ if (!ts5.isPropertyAccessExpression(node.expression) || node.expression.name.text !== "routes")
1079
+ return false;
1080
+ let inner = node.expression.expression;
1081
+ while (ts5.isCallExpression(inner) && ts5.isPropertyAccessExpression(inner.expression)) {
1082
+ inner = inner.expression.expression;
1083
+ }
1084
+ return isCreateRouterCall(inner);
1085
+ }
1086
+ function visit(node) {
1087
+ if (result) return;
1088
+ if (ts5.isCallExpression(node) && node.arguments.length >= 1 && isRoutesOnCreateRouter(node)) {
1089
+ const arg = node.arguments[0];
1090
+ if (ts5.isIdentifier(arg)) {
1091
+ result = { kind: "variable", name: arg.text };
1092
+ } else if (isInlineBuilder(arg)) {
1093
+ result = { kind: "inline", block: arg.getText(sourceFile) };
1094
+ }
1095
+ return;
1096
+ }
1097
+ if (isCreateRouterCall(node)) {
1098
+ const callExpr = node;
1099
+ for (const callArg of callExpr.arguments) {
1100
+ if (ts5.isObjectLiteralExpression(callArg)) {
1101
+ for (const prop of callArg.properties) {
1102
+ if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "urls") {
1103
+ if (ts5.isIdentifier(prop.initializer)) {
1104
+ result = { kind: "variable", name: prop.initializer.text };
1105
+ } else if (isInlineBuilder(prop.initializer)) {
1106
+ result = {
1107
+ kind: "inline",
1108
+ block: prop.initializer.getText(sourceFile)
1109
+ };
1110
+ }
1111
+ return;
1112
+ }
1113
+ }
1114
+ }
1115
+ }
1116
+ }
1117
+ ts5.forEachChild(node, visit);
1118
+ }
1119
+ visit(sourceFile);
1120
+ return result;
1121
+ }
1122
+ function extractBasenameFromRouter(code) {
1123
+ const sourceFile = ts5.createSourceFile(
1124
+ "router.tsx",
1125
+ code,
1126
+ ts5.ScriptTarget.Latest,
1127
+ true,
1128
+ ts5.ScriptKind.TSX
1129
+ );
1130
+ let result;
1131
+ function visit(node) {
1132
+ if (result !== void 0) return;
1133
+ if (ts5.isCallExpression(node) && ts5.isIdentifier(node.expression) && node.expression.text === "createRouter") {
1134
+ for (const arg of node.arguments) {
1135
+ if (ts5.isObjectLiteralExpression(arg)) {
1136
+ for (const prop of arg.properties) {
1137
+ if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "basename" && ts5.isStringLiteral(prop.initializer)) {
1138
+ result = prop.initializer.text;
1139
+ return;
1140
+ }
1141
+ }
1142
+ }
1143
+ }
1144
+ }
1145
+ ts5.forEachChild(node, visit);
1146
+ }
1147
+ visit(sourceFile);
1148
+ return result;
1149
+ }
1150
+ function applyBasenameToRoutes(result, basename) {
1151
+ const prefixed = {};
1152
+ for (const [name, pattern] of Object.entries(result.routes)) {
1153
+ if (pattern === "/") {
1154
+ prefixed[name] = basename;
1155
+ } else if (basename.endsWith("/") && pattern.startsWith("/")) {
1156
+ prefixed[name] = basename + pattern.slice(1);
1157
+ } else {
1158
+ prefixed[name] = basename + pattern;
1159
+ }
1160
+ }
1161
+ return { routes: prefixed, searchSchemas: result.searchSchemas };
1162
+ }
1163
+ function genFileTsPath(sourceFile) {
1164
+ const base = pathBasename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
1165
+ return join2(dirname2(sourceFile), `${base}.named-routes.gen.ts`);
1166
+ }
1167
+ function resolveSearchSchemas(publicRouteNames, runtimeSchemas, sourceFile) {
1168
+ if (runtimeSchemas && Object.keys(runtimeSchemas).length > 0) {
1169
+ return runtimeSchemas;
1170
+ }
1171
+ const staticParsed = buildCombinedRouteMapForRouterFile(sourceFile);
1172
+ if (Object.keys(staticParsed.searchSchemas).length === 0) {
1173
+ return runtimeSchemas;
1174
+ }
1175
+ const filtered = {};
1176
+ for (const name of publicRouteNames) {
1177
+ const schema = staticParsed.searchSchemas[name];
1178
+ if (schema) filtered[name] = schema;
1179
+ }
1180
+ return Object.keys(filtered).length > 0 ? filtered : runtimeSchemas;
1181
+ }
1182
+ function buildCombinedRouteMapForRouterFile(routerFilePath) {
1183
+ let routerSource;
1184
+ try {
1185
+ routerSource = readFileSync3(routerFilePath, "utf-8");
1186
+ } catch {
1187
+ return { routes: {}, searchSchemas: {} };
1188
+ }
1189
+ const extraction = extractUrlsFromRouter(routerSource);
1190
+ if (!extraction) {
1191
+ return { routes: {}, searchSchemas: {} };
1192
+ }
1193
+ const rawBasename = extractBasenameFromRouter(routerSource);
1194
+ const basename = rawBasename ? ("/" + rawBasename.replace(/^\/+|\/+$/g, "")).replace(/^\/$/, "") : void 0;
1195
+ let result;
1196
+ if (extraction.kind === "inline") {
1197
+ result = buildCombinedRouteMapWithSearch(
1198
+ routerFilePath,
1199
+ void 0,
1200
+ void 0,
1201
+ void 0,
1202
+ extraction.block
1203
+ );
1204
+ } else {
1205
+ const imported = resolveImportedVariable(routerSource, extraction.name);
1206
+ if (imported) {
1207
+ const targetFile = resolveImportPath(imported.specifier, routerFilePath);
1208
+ if (!targetFile) {
1209
+ return { routes: {}, searchSchemas: {} };
1210
+ }
1211
+ result = buildCombinedRouteMapWithSearch(
1212
+ targetFile,
1213
+ imported.exportedName
1214
+ );
1215
+ } else {
1216
+ result = buildCombinedRouteMapWithSearch(routerFilePath, extraction.name);
1217
+ }
1218
+ }
1219
+ if (basename) {
1220
+ result = applyBasenameToRoutes(result, basename);
1221
+ }
1222
+ return result;
1223
+ }
1224
+ function detectUnresolvableIncludes(routerFilePath) {
1225
+ const realPath = resolve2(routerFilePath);
1226
+ let source;
1227
+ try {
1228
+ source = readFileSync3(realPath, "utf-8");
1229
+ } catch {
1230
+ return [];
1231
+ }
1232
+ const extraction = extractUrlsFromRouter(source);
1233
+ if (!extraction) return [];
1234
+ const diagnostics = [];
1235
+ if (extraction.kind === "inline") {
1236
+ buildCombinedRouteMapWithSearch(
1237
+ realPath,
1238
+ void 0,
1239
+ /* @__PURE__ */ new Set(),
1240
+ diagnostics,
1241
+ extraction.block
1242
+ );
1243
+ return diagnostics;
1244
+ }
1245
+ const imported = resolveImportedVariable(source, extraction.name);
1246
+ let targetFile;
1247
+ let exportedName;
1248
+ if (imported) {
1249
+ const resolved = resolveImportPath(imported.specifier, realPath);
1250
+ if (!resolved) {
1251
+ return [
1252
+ {
1253
+ pathPrefix: "/",
1254
+ namePrefix: null,
1255
+ reason: "file-not-found",
1256
+ sourceFile: realPath,
1257
+ detail: `import "${imported.specifier}" resolved to no file`
1258
+ }
1259
+ ];
1260
+ }
1261
+ targetFile = resolved;
1262
+ exportedName = imported.exportedName;
1263
+ } else {
1264
+ targetFile = realPath;
1265
+ exportedName = extraction.name;
1266
+ }
1267
+ buildCombinedRouteMapWithSearch(
1268
+ targetFile,
1269
+ exportedName,
1270
+ /* @__PURE__ */ new Set(),
1271
+ diagnostics
1272
+ );
1273
+ return diagnostics;
1274
+ }
1275
+ function detectUnresolvableIncludesForUrlsFile(filePath) {
1276
+ const realPath = resolve2(filePath);
1277
+ let source;
1278
+ try {
1279
+ source = readFileSync3(realPath, "utf-8");
1280
+ } catch {
1281
+ return [];
1282
+ }
1283
+ const varNames = findUrlsVariableNames(source);
1284
+ if (varNames.length === 0) return [];
1285
+ const diagnostics = [];
1286
+ for (const varName of varNames) {
1287
+ buildCombinedRouteMapWithSearch(realPath, varName, /* @__PURE__ */ new Set(), diagnostics);
1288
+ }
1289
+ return diagnostics;
1290
+ }
1291
+ function findRouterFiles(root, filter) {
1292
+ const result = [];
1293
+ findCallSiteFilesRecursive(
1294
+ root,
1295
+ ROUTER_CALL_PATTERN,
1296
+ ROUTER_CALL_PATTERN_G,
1297
+ true,
1298
+ filter,
1299
+ result
1300
+ );
1301
+ return result;
1302
+ }
1303
+ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
1304
+ try {
1305
+ const oldCombinedPath = join2(root, "src", "named-routes.gen.ts");
1306
+ if (existsSync3(oldCombinedPath)) {
1307
+ unlinkSync(oldCombinedPath);
1308
+ console.log(
1309
+ `[rango] Removed stale combined route types: ${oldCombinedPath}`
1310
+ );
1311
+ }
1312
+ } catch {
1313
+ }
1314
+ const routerFilePaths = knownRouterFiles ?? findRouterFiles(root);
1315
+ if (routerFilePaths.length === 0) return;
1316
+ const nestedRouterConflict = findNestedRouterConflict(routerFilePaths);
1317
+ if (nestedRouterConflict) {
1318
+ throw new Error(formatNestedRouterConflictError(nestedRouterConflict));
1319
+ }
1320
+ for (const routerFilePath of routerFilePaths) {
1321
+ const result = buildCombinedRouteMapForRouterFile(routerFilePath);
1322
+ if (Object.keys(result.routes).length === 0 && Object.keys(result.searchSchemas).length === 0) {
1323
+ let routerSource;
1324
+ try {
1325
+ routerSource = readFileSync3(routerFilePath, "utf-8");
1326
+ } catch {
1327
+ continue;
1328
+ }
1329
+ if (!extractUrlsFromRouter(routerSource)) continue;
1330
+ }
1331
+ const outPath = genFileTsPath(routerFilePath);
1332
+ const existing = existsSync3(outPath) ? readFileSync3(outPath, "utf-8") : null;
1333
+ if (Object.keys(result.routes).length === 0) {
1334
+ if (!existing) {
1335
+ const emptySource = generateRouteTypesSource({});
1336
+ opts?.onWrite?.(outPath, emptySource);
1337
+ writeFileSync2(outPath, emptySource);
1338
+ }
1339
+ continue;
1340
+ }
1341
+ const hasSearchSchemas = Object.keys(result.searchSchemas).length > 0;
1342
+ const source = generateRouteTypesSource(
1343
+ result.routes,
1344
+ hasSearchSchemas ? result.searchSchemas : void 0
1345
+ );
1346
+ if (existing !== source) {
1347
+ if (opts?.preserveIfLarger && existing) {
1348
+ const existingCount = countPublicRouteEntries(existing);
1349
+ const newCount = Object.keys(result.routes).filter(
1350
+ (name) => !isAutoGeneratedRouteName(name)
1351
+ ).length;
1352
+ if (existingCount > newCount) {
1353
+ continue;
1354
+ }
1355
+ }
1356
+ opts?.onWrite?.(outPath, source);
1357
+ writeFileSync2(outPath, source);
1358
+ console.log(
1359
+ `[rango] Generated route types (${Object.keys(result.routes).length} routes) -> ${outPath}`
1360
+ );
1361
+ }
1362
+ }
1363
+ }
1364
+ var ROUTER_CALL_PATTERN, ROUTER_CALL_PATTERN_G;
1365
+ var init_router_processing = __esm({
1366
+ "src/build/route-types/router-processing.ts"() {
1367
+ "use strict";
1368
+ init_codegen();
1369
+ init_source_scan();
1370
+ init_include_resolution();
1371
+ init_per_module_writer();
1372
+ init_route_name();
1373
+ ROUTER_CALL_PATTERN = /\bcreateRouter\s*[<(]/;
1374
+ ROUTER_CALL_PATTERN_G = /\bcreateRouter\s*[<(]/g;
1375
+ }
1376
+ });
1377
+
1378
+ // src/build/generate-route-types.ts
1379
+ var init_generate_route_types = __esm({
1380
+ "src/build/generate-route-types.ts"() {
1381
+ "use strict";
1382
+ init_param_extraction();
1383
+ init_ast_route_extraction();
1384
+ init_codegen();
1385
+ init_scan_filter();
1386
+ init_per_module_writer();
1387
+ init_include_resolution();
1388
+ init_router_processing();
1389
+ init_per_module_writer();
1390
+ }
1391
+ });
1392
+
1393
+ // src/vite/plugins/virtual-entries.ts
1394
+ function getVirtualVersionContent(version) {
1395
+ return `export const VERSION = ${JSON.stringify(version)};`;
1396
+ }
1397
+ var VIRTUAL_ENTRY_BROWSER, VIRTUAL_IDS;
1398
+ var init_virtual_entries = __esm({
1399
+ "src/vite/plugins/virtual-entries.ts"() {
1400
+ "use strict";
1401
+ VIRTUAL_ENTRY_BROWSER = `
1402
+ import {
1403
+ createFromReadableStream,
1404
+ createFromFetch,
1405
+ setServerCallback,
1406
+ encodeReply,
1407
+ createTemporaryReferenceSet,
1408
+ } from "@rangojs/router/internal/deps/browser";
1409
+ import { createElement, StrictMode } from "react";
1410
+ import { hydrateRoot } from "react-dom/client";
1411
+ import { rscStream } from "@rangojs/router/internal/deps/html-stream-client";
1412
+ import { initBrowserApp, Rango } from "@rangojs/router/browser";
1413
+
1414
+ async function initializeApp() {
1415
+ const deps = {
1416
+ createFromFetch,
1417
+ createFromReadableStream,
1418
+ encodeReply,
1419
+ setServerCallback,
1420
+ createTemporaryReferenceSet,
1421
+ };
1422
+
1423
+ // initBrowserApp resolves the initial payload and returns the browser app
1424
+ // context, including strictMode (default true) from createRouter. StrictMode
1425
+ // is the default; createRouter({ strictMode: false }) ships the opt-out in the
1426
+ // payload metadata. StrictMode emits no DOM, so toggling never changes markup.
1427
+ const { strictMode } = await initBrowserApp({ rscStream, deps });
1428
+
1429
+ const app = createElement(Rango);
1430
+ hydrateRoot(
1431
+ document,
1432
+ strictMode === false ? app : createElement(StrictMode, null, app)
1433
+ );
1434
+ }
1435
+
1436
+ initializeApp().catch(console.error);
1437
+ `.trim();
1438
+ VIRTUAL_IDS = {
1439
+ browser: "virtual:rsc-router/entry.browser.js",
1440
+ ssr: "virtual:rsc-router/entry.ssr.js",
1441
+ rsc: "virtual:rsc-router/entry.rsc.js",
1442
+ version: "@rangojs/router:version"
1443
+ };
1444
+ }
1445
+ });
1446
+
1447
+ // src/vite/utils/directive-prologue.ts
1448
+ import { parseAst } from "vite";
1449
+ function hasUseClientDirective(source) {
1450
+ let program;
1451
+ try {
1452
+ program = parseAst(source, { lang: "tsx" });
1453
+ } catch {
1454
+ return false;
1455
+ }
1456
+ for (const node of program.body ?? []) {
1457
+ if (node?.type === "ExpressionStatement" && node.expression?.type === "Literal" && typeof node.expression.value === "string") {
1458
+ if (node.expression.value === "use client") return true;
1459
+ continue;
1460
+ }
1461
+ break;
1462
+ }
1463
+ return false;
1464
+ }
1465
+ var init_directive_prologue = __esm({
1466
+ "src/vite/utils/directive-prologue.ts"() {
1467
+ "use strict";
1468
+ }
1469
+ });
1470
+
1471
+ // src/vite/plugins/version-plugin.ts
1472
+ var version_plugin_exports = {};
1473
+ __export(version_plugin_exports, {
1474
+ createVersionPlugin: () => createVersionPlugin,
1475
+ isViteDepCachePath: () => isViteDepCachePath
1476
+ });
1477
+ import { parseAst as parseAst2 } from "vite";
1478
+ function isCodeModule(id) {
1479
+ return /\.(tsx?|jsx?)($|\?)/.test(id);
1480
+ }
1481
+ function normalizeModuleId(id) {
1482
+ return id.split("?", 1)[0];
1483
+ }
1484
+ function getClientModuleSignature(source) {
1485
+ if (!hasUseClientDirective(source)) return void 0;
1486
+ let program;
1487
+ try {
1488
+ program = parseAst2(source, { lang: "tsx" });
1489
+ } catch {
1490
+ return void 0;
1491
+ }
1492
+ const exports = /* @__PURE__ */ new Set();
1493
+ let hasDefault = false;
1494
+ let hasExportAll = false;
1495
+ const collectBindingNames = (pattern) => {
1496
+ if (!pattern) return;
1497
+ if (pattern.type === "Identifier") {
1498
+ exports.add(pattern.name);
1499
+ } else if (pattern.type === "ObjectPattern") {
1500
+ for (const prop of pattern.properties ?? []) {
1501
+ if (prop?.type === "RestElement") {
1502
+ collectBindingNames(prop.argument);
1503
+ } else {
1504
+ collectBindingNames(prop?.value);
1505
+ }
1506
+ }
1507
+ } else if (pattern.type === "ArrayPattern") {
1508
+ for (const el of pattern.elements ?? []) {
1509
+ if (el?.type === "RestElement") {
1510
+ collectBindingNames(el.argument);
1511
+ } else {
1512
+ collectBindingNames(el);
1513
+ }
1514
+ }
1515
+ }
1516
+ };
1517
+ const collectDeclarationNames = (declaration) => {
1518
+ if (!declaration) return;
1519
+ if (declaration.type === "VariableDeclaration") {
1520
+ for (const decl of declaration.declarations ?? []) {
1521
+ collectBindingNames(decl?.id);
1522
+ }
1523
+ return;
1524
+ }
1525
+ collectBindingNames(declaration.id);
1526
+ };
1527
+ for (const node of program.body ?? []) {
1528
+ if (node?.type === "ExportDefaultDeclaration") {
1529
+ hasDefault = true;
1530
+ continue;
1531
+ }
1532
+ if (node?.type === "ExportAllDeclaration") {
1533
+ hasExportAll = true;
1534
+ continue;
1535
+ }
1536
+ if (node?.type !== "ExportNamedDeclaration") continue;
1537
+ collectDeclarationNames(node.declaration);
1538
+ for (const specifier of node.specifiers ?? []) {
1539
+ const exportedName = specifier?.exported?.name ?? specifier?.exported?.value;
1540
+ if (exportedName === "default") {
1541
+ hasDefault = true;
1542
+ } else if (typeof exportedName === "string") {
1543
+ exports.add(exportedName);
1544
+ }
1545
+ }
1546
+ }
1547
+ return {
1548
+ key: JSON.stringify({
1549
+ default: hasDefault,
1550
+ exportAll: hasExportAll,
1551
+ exports: [...exports].sort()
1552
+ })
1553
+ };
1554
+ }
1555
+ function createVersionPlugin() {
1556
+ const buildVersion = Date.now().toString(16);
1557
+ let currentVersion = buildVersion;
1558
+ let isDev = false;
1559
+ let server = null;
1560
+ let resolvedCacheDir;
1561
+ const clientModuleSignatures = /* @__PURE__ */ new Map();
1562
+ let versionCounter = 0;
1563
+ const bumpVersion = (reason) => {
1564
+ currentVersion = Date.now().toString(16) + String(++versionCounter);
1565
+ console.log(`[rango] ${reason}, version updated: ${currentVersion}`);
1566
+ const rscEnv = server?.environments?.rsc;
1567
+ const versionMod = rscEnv?.moduleGraph?.getModuleById(
1568
+ "\0" + VIRTUAL_IDS.version
1569
+ );
1570
+ if (versionMod) {
1571
+ rscEnv.moduleGraph.invalidateModule(versionMod);
1572
+ }
1573
+ };
1574
+ return {
1575
+ name: "@rangojs/router:version",
1576
+ enforce: "pre",
1577
+ // The build-time shell capture phase (producer B, #699) stamps entries
1578
+ // with THIS instance's version — the value folded into the shipped worker
1579
+ // — never the discovery temp server's own version-plugin value (a
1580
+ // different Date.now() stamp that would fail the serve-side gate).
1581
+ api: {
1582
+ getBuildVersion: () => currentVersion
1583
+ },
1584
+ configResolved(config) {
1585
+ isDev = config.command === "serve";
1586
+ resolvedCacheDir = config.cacheDir ? String(config.cacheDir).replace(/\\/g, "/") : void 0;
1587
+ },
1588
+ configureServer(devServer) {
1589
+ server = devServer;
1590
+ devServer.watcher.on("unlink", (filePath) => {
1591
+ if (!isDev) return;
1592
+ if (!clientModuleSignatures.has(filePath)) return;
1593
+ clientModuleSignatures.delete(filePath);
1594
+ bumpVersion("Client module removed");
1595
+ });
1596
+ },
1597
+ resolveId(id) {
1598
+ if (id === VIRTUAL_IDS.version) {
1599
+ return "\0" + id;
1600
+ }
1601
+ return null;
1602
+ },
1603
+ load(id) {
1604
+ if (id === "\0" + VIRTUAL_IDS.version) {
1605
+ return getVirtualVersionContent(currentVersion);
1606
+ }
1607
+ return null;
1608
+ },
1609
+ transform(code, id) {
1610
+ if (!isDev || !isCodeModule(id)) return null;
1611
+ const normalizedId = normalizeModuleId(id);
1612
+ if (!code.includes("use client") && !clientModuleSignatures.has(normalizedId)) {
1613
+ return null;
1614
+ }
1615
+ const signature = getClientModuleSignature(code);
1616
+ if (signature) {
1617
+ clientModuleSignatures.set(normalizedId, signature);
1618
+ } else {
1619
+ clientModuleSignatures.delete(normalizedId);
1620
+ }
1621
+ return null;
1622
+ },
1623
+ async hotUpdate(ctx) {
1624
+ if (!isDev) return;
1625
+ const isRscModule = this.environment?.name === "rsc";
1626
+ if (!isRscModule) return;
1627
+ if (isViteDepCachePath(ctx.file, resolvedCacheDir)) return;
1628
+ if (ctx.modules.length === 1 && ctx.modules[0].id === "\0" + VIRTUAL_IDS.version) {
1629
+ return;
1630
+ }
1631
+ if (isCodeModule(ctx.file)) {
1632
+ const filePath = normalizeModuleId(ctx.file);
1633
+ const previousSignature = clientModuleSignatures.get(filePath);
1634
+ try {
1635
+ const source = await ctx.read();
1636
+ const nextSignature = getClientModuleSignature(source);
1637
+ if (nextSignature) {
1638
+ clientModuleSignatures.set(filePath, nextSignature);
1639
+ if (previousSignature && previousSignature.key === nextSignature.key) {
1640
+ return;
1641
+ }
1642
+ } else {
1643
+ clientModuleSignatures.delete(filePath);
1644
+ if (!previousSignature) {
1645
+ if (ctx.modules.length === 0) return;
1646
+ }
1647
+ }
1648
+ } catch {
1649
+ }
1650
+ } else {
1651
+ if (ctx.modules.length === 0) return;
1652
+ }
1653
+ bumpVersion("RSC module changed");
1654
+ }
1655
+ };
1656
+ }
1657
+ function isViteDepCachePath(filePath, cacheDir) {
1658
+ if (!filePath) return false;
1659
+ const normalized = filePath.replace(/\\/g, "/");
1660
+ if (cacheDir) {
1661
+ const normalizedCacheDir = cacheDir.replace(/\\/g, "/").replace(/\/+$/, "");
1662
+ if (normalized === normalizedCacheDir || normalized.startsWith(normalizedCacheDir + "/")) {
1663
+ return true;
1664
+ }
1665
+ }
1666
+ return /\/node_modules\/\.vite[^/]*\//.test(normalized) || normalized.includes("/.vite-isolated/");
1667
+ }
1668
+ var init_version_plugin = __esm({
1669
+ "src/vite/plugins/version-plugin.ts"() {
1670
+ "use strict";
1671
+ init_virtual_entries();
1672
+ init_directive_prologue();
1673
+ }
1674
+ });
1675
+
1676
+ // src/vite/plugins/virtual-stub-plugin.ts
1677
+ var virtual_stub_plugin_exports = {};
1678
+ __export(virtual_stub_plugin_exports, {
1679
+ createVirtualStubPlugin: () => createVirtualStubPlugin
1680
+ });
1681
+ function createVirtualStubPlugin() {
1682
+ const STUB_PREFIXES = [
1683
+ "virtual:rsc-router/",
1684
+ "virtual:entry-",
1685
+ "virtual:vite-rsc/"
1686
+ ];
1687
+ return {
1688
+ name: "@rangojs/router:virtual-stubs",
1689
+ resolveId(id) {
1690
+ if (STUB_PREFIXES.some((p) => id.startsWith(p))) {
1691
+ return "\0stub:" + id;
1692
+ }
1693
+ return null;
1694
+ },
1695
+ load(id) {
1696
+ if (id.startsWith("\0stub:")) {
1697
+ return "export default {}";
1698
+ }
1699
+ return null;
1700
+ }
1701
+ };
1702
+ }
1703
+ var init_virtual_stub_plugin = __esm({
1704
+ "src/vite/plugins/virtual-stub-plugin.ts"() {
1705
+ "use strict";
1706
+ }
1707
+ });
1708
+
1709
+ // src/build/runtime-discovery.ts
1710
+ var runtime_discovery_exports = {};
1711
+ __export(runtime_discovery_exports, {
1712
+ discoverAndWriteRouteTypes: () => discoverAndWriteRouteTypes
1713
+ });
1714
+ import { resolve as resolve3 } from "node:path";
1715
+ import { existsSync as existsSync4, readFileSync as readFileSync4, writeFileSync as writeFileSync3 } from "node:fs";
1716
+ async function discoverAndWriteRouteTypes(opts) {
1717
+ let createViteServer;
1718
+ let loadConfigFromFile;
1719
+ let rsc;
1720
+ try {
1721
+ const vite = await import("vite");
1722
+ createViteServer = vite.createServer;
1723
+ loadConfigFromFile = vite.loadConfigFromFile;
1724
+ } catch {
1725
+ throw new Error(
1726
+ "Runtime discovery requires 'vite'. Install it with: pnpm add -D vite"
1727
+ );
1728
+ }
1729
+ try {
1730
+ const rscMod = await import("@vitejs/plugin-rsc");
1731
+ rsc = rscMod.default;
1732
+ } catch {
1733
+ throw new Error(
1734
+ "Runtime discovery requires '@vitejs/plugin-rsc'. Install it with: pnpm add -D @vitejs/plugin-rsc"
1735
+ );
1736
+ }
1737
+ const { createVersionPlugin: createVersionPlugin2 } = await Promise.resolve().then(() => (init_version_plugin(), version_plugin_exports));
1738
+ const { createVirtualStubPlugin: createVirtualStubPlugin2 } = await Promise.resolve().then(() => (init_virtual_stub_plugin(), virtual_stub_plugin_exports));
1739
+ let userResolveAlias = opts.resolveAlias;
1740
+ if (!userResolveAlias) {
1741
+ const configPath = opts.configFile;
1742
+ try {
1743
+ const loaded = await loadConfigFromFile(
1744
+ { command: "serve", mode: "development" },
1745
+ configPath,
1746
+ opts.root
1747
+ );
1748
+ if (loaded?.config?.resolve?.alias) {
1749
+ userResolveAlias = loaded.config.resolve.alias;
1750
+ }
1751
+ } catch {
1752
+ }
1753
+ }
1754
+ const entryPath = resolve3(opts.entry);
1755
+ let tempServer = null;
1756
+ try {
1757
+ tempServer = await createViteServer({
1758
+ root: opts.root,
1759
+ configFile: false,
1760
+ server: { middlewareMode: true },
1761
+ appType: "custom",
1762
+ logLevel: "silent",
1763
+ cacheDir: "node_modules/.vite_rango_generate",
1764
+ resolve: userResolveAlias ? { alias: userResolveAlias } : void 0,
1765
+ esbuild: { jsx: "automatic", jsxImportSource: "react" },
1766
+ plugins: [
1767
+ rsc({
1768
+ entries: {
1769
+ client: "virtual:entry-client",
1770
+ ssr: "virtual:entry-ssr",
1771
+ rsc: entryPath
1772
+ }
1773
+ }),
1774
+ createVersionPlugin2(),
1775
+ createVirtualStubPlugin2()
1776
+ ]
1777
+ });
1778
+ const rscEnv = tempServer.environments?.rsc;
1779
+ if (!rscEnv?.runner) {
1780
+ throw new Error("RSC environment runner not available");
1781
+ }
1782
+ await rscEnv.runner.import(entryPath);
1783
+ const serverMod = await rscEnv.runner.import("@rangojs/router/server");
1784
+ const registry = serverMod.RouterRegistry;
1785
+ if (!registry || registry.size === 0) {
1786
+ throw new Error(
1787
+ `No routers found in registry after importing ${opts.entry}`
1788
+ );
1789
+ }
1790
+ const buildMod = await rscEnv.runner.import("@rangojs/router/build");
1791
+ const generateManifest = buildMod.generateManifest;
1792
+ if (!generateManifest) {
1793
+ throw new Error("generateManifest not found in @rangojs/router/build");
1794
+ }
1795
+ const outputFiles = [];
1796
+ let totalRouteCount = 0;
1797
+ let routerMountIndex = 0;
1798
+ for (const [id, router] of registry) {
1799
+ if (!router.urlpatterns) continue;
1800
+ const manifest = await generateManifest(
1801
+ router.urlpatterns,
1802
+ routerMountIndex
1803
+ );
1804
+ routerMountIndex++;
1805
+ const rawManifest = manifest.routeManifest;
1806
+ const routeManifest = {};
1807
+ for (const [name, pattern] of Object.entries(rawManifest)) {
1808
+ if (!isAutoGeneratedRouteName(name)) {
1809
+ routeManifest[name] = pattern;
1810
+ }
1811
+ }
1812
+ let routeSearchSchemas = manifest.routeSearchSchemas;
1813
+ const sourceFile = router.__sourceFile;
1814
+ if (!sourceFile) {
1815
+ console.warn(
1816
+ `[rango] Router "${id}" has no __sourceFile, skipping gen file`
1817
+ );
1818
+ continue;
1819
+ }
1820
+ if (sourceFile.includes("node_modules")) {
1821
+ throw new Error(
1822
+ `[rango] Router "${id}" has sourceFile inside node_modules: ${sourceFile}
1823
+ This means createRouter() stack trace parsing matched an internal frame.
1824
+ Set an explicit \`id\` on createRouter() or check the call site.`
1825
+ );
1826
+ }
1827
+ routeSearchSchemas = resolveSearchSchemas(
1828
+ Object.keys(routeManifest),
1829
+ routeSearchSchemas,
1830
+ sourceFile
1831
+ );
1832
+ const outPath = genFileTsPath(sourceFile);
1833
+ const source = generateRouteTypesSource(
1834
+ routeManifest,
1835
+ routeSearchSchemas && Object.keys(routeSearchSchemas).length > 0 ? routeSearchSchemas : void 0
1836
+ );
1837
+ const existing = existsSync4(outPath) ? readFileSync4(outPath, "utf-8") : null;
1838
+ if (existing !== source) {
1839
+ writeFileSync3(outPath, source);
1840
+ }
1841
+ const routeCount = Object.keys(routeManifest).length;
1842
+ totalRouteCount += routeCount;
1843
+ outputFiles.push(outPath);
1844
+ console.log(
1845
+ `[rango] Generated route types (${routeCount} routes) -> ${outPath}`
1846
+ );
1847
+ }
1848
+ return {
1849
+ routerCount: routerMountIndex,
1850
+ routeCount: totalRouteCount,
1851
+ outputFiles
1852
+ };
1853
+ } finally {
1854
+ if (tempServer) {
1855
+ await tempServer.close();
1856
+ }
1857
+ }
1858
+ }
1859
+ var init_runtime_discovery = __esm({
1860
+ "src/build/runtime-discovery.ts"() {
1861
+ "use strict";
1862
+ init_generate_route_types();
1863
+ init_route_name();
1864
+ }
1865
+ });
1866
+
1867
+ // src/bin/rango.ts
1868
+ init_generate_route_types();
1869
+ import { resolve as resolve4, dirname as dirname3 } from "node:path";
1870
+ import { readFileSync as readFileSync5, statSync, existsSync as existsSync5 } from "node:fs";
1871
+ var [command, ...rawArgs] = process.argv.slice(2);
1872
+ if (command === "generate") {
1873
+ let mode = "default";
1874
+ let configFile;
1875
+ const positionalArgs = [];
1876
+ for (let i = 0; i < rawArgs.length; i++) {
1877
+ const arg = rawArgs[i];
1878
+ if (arg === "--runtime") {
1879
+ mode = "runtime";
1880
+ } else if (arg === "--static") {
1881
+ mode = "static";
1882
+ } else if (arg === "--config") {
1883
+ configFile = rawArgs[++i];
1884
+ if (!configFile) {
1885
+ console.error("[rango] --config requires a path argument");
1886
+ process.exit(1);
1887
+ }
1888
+ } else if (arg.startsWith("--")) {
1889
+ console.error(`[rango] Unknown flag: ${arg}`);
1890
+ process.exit(1);
1891
+ } else {
1892
+ positionalArgs.push(arg);
1893
+ }
1894
+ }
1895
+ if (positionalArgs.length === 0) {
1896
+ console.error(
1897
+ "[rango] Usage: rango generate <file|dir> [file2 ...] [--runtime|--static] [--config <path>]"
1898
+ );
1899
+ process.exit(1);
1900
+ }
1901
+ if (configFile && mode !== "runtime") {
1902
+ console.warn("[rango] --config is only used with --runtime, ignoring");
1903
+ }
1904
+ if (mode === "runtime") {
1905
+ runRuntimeDiscovery(positionalArgs, configFile).catch((err) => {
1906
+ console.error(`[rango] Runtime discovery failed: ${err.message}`);
1907
+ process.exit(1);
1908
+ });
1909
+ } else {
1910
+ runStaticGeneration(positionalArgs, mode);
1911
+ }
1912
+ } else {
1913
+ if (command && command !== "help" && command !== "--help" && command !== "-h") {
1914
+ console.error(`[rango] Unknown command: ${command}
1915
+ `);
1916
+ }
1917
+ console.log(`Usage: rango generate <file|dir> [file2 ...] [--runtime|--static] [--config <path>]
1918
+
1919
+ Auto-detects file type (createRouter, urls) and generates
1920
+ the appropriate .gen.ts route type files.
1921
+
1922
+ Modes:
1923
+ (default) Static parser with error on unresolvable includes
1924
+ --runtime Vite-based runtime discovery (100% coverage)
1925
+ Requires vite and @vitejs/plugin-rsc
1926
+ --static Static parser, accept partial output with warnings
1927
+
1928
+ Options:
1929
+ --config <path> Path to vite.config.ts (--runtime only, auto-detected if omitted)
1930
+
1931
+ Examples:
1932
+ rango generate src/router.tsx
1933
+ rango generate src/router.tsx --runtime
1934
+ rango generate src/ --static`);
1935
+ process.exit(
1936
+ command && command !== "help" && command !== "--help" && command !== "-h" ? 1 : 0
1937
+ );
1938
+ }
1939
+ function findProjectRoot(fromPath) {
1940
+ let dir = dirname3(resolve4(fromPath));
1941
+ while (dir !== dirname3(dir)) {
1942
+ if (existsSync5(resolve4(dir, "package.json")) || existsSync5(resolve4(dir, "vite.config.ts")) || existsSync5(resolve4(dir, "vite.config.js"))) {
1943
+ return dir;
1944
+ }
1945
+ dir = dirname3(dir);
1946
+ }
1947
+ return process.cwd();
1948
+ }
1949
+ function runStaticGeneration(args, mode) {
1950
+ const files = [];
1951
+ for (const arg of args) {
1952
+ const resolved = resolve4(arg);
1953
+ try {
1954
+ if (statSync(resolved).isDirectory()) {
1955
+ files.push(...findTsFiles(resolved));
1956
+ } else {
1957
+ files.push(resolved);
465
1958
  }
466
1959
  } catch {
467
1960
  console.warn(`[rango] Skipping ${arg}: not found`);
@@ -472,37 +1965,151 @@ if (command === "generate") {
472
1965
  process.exit(0);
473
1966
  }
474
1967
  const routerFiles = [];
1968
+ const urlsFiles = [];
475
1969
  for (const filePath of files) {
476
1970
  try {
477
- const source = readFileSync2(filePath, "utf-8");
478
- const isRouter = /\bcreateRouter\s*[<(]/.test(source);
479
- const isUrls = source.includes("urls(");
480
- if (isRouter) {
1971
+ const source = readFileSync5(filePath, "utf-8");
1972
+ if (/\bcreateRouter\s*[<(]/.test(source)) {
481
1973
  routerFiles.push(filePath);
482
1974
  }
483
- if (isUrls) {
484
- writePerModuleRouteTypesForFile(filePath);
1975
+ if (source.includes("urls(")) {
1976
+ urlsFiles.push(filePath);
485
1977
  }
486
1978
  } catch (err) {
487
- console.warn(`[rango] Failed to process ${filePath}: ${err.message}`);
1979
+ console.warn(
1980
+ `[rango] Failed to process ${filePath}: ${err.message}`
1981
+ );
488
1982
  }
489
1983
  }
1984
+ const allDiagnostics = [];
490
1985
  for (const routerFile of routerFiles) {
491
- writeCombinedRouteTypes(dirname2(routerFile), [routerFile]);
1986
+ const diagnostics = detectUnresolvableIncludes(routerFile);
1987
+ for (const d of diagnostics) {
1988
+ allDiagnostics.push({ ...d, routerFile });
1989
+ }
1990
+ }
1991
+ const routerFileSet = new Set(routerFiles);
1992
+ for (const urlsFile of urlsFiles) {
1993
+ if (routerFileSet.has(urlsFile)) continue;
1994
+ const diagnostics = detectUnresolvableIncludesForUrlsFile(urlsFile);
1995
+ for (const d of diagnostics) {
1996
+ allDiagnostics.push({ ...d, routerFile: urlsFile });
1997
+ }
1998
+ }
1999
+ const seen = /* @__PURE__ */ new Set();
2000
+ const uniqueDiagnostics = allDiagnostics.filter((d) => {
2001
+ const key = `${d.sourceFile}:${d.pathPrefix}:${d.reason}`;
2002
+ if (seen.has(key)) return false;
2003
+ seen.add(key);
2004
+ return true;
2005
+ });
2006
+ if (uniqueDiagnostics.length > 0 && mode === "default") {
2007
+ console.error("\n[rango] Unresolvable includes detected:\n");
2008
+ formatDiagnostics(uniqueDiagnostics);
2009
+ console.error(
2010
+ "\nThe static parser cannot resolve these includes because they use factory functions or dynamic expressions.\n\nOptions:\n rango generate <path> --runtime Use Vite-based discovery (requires vite)\n rango generate <path> --static Accept partial output (missing routes above)\n"
2011
+ );
2012
+ process.exit(1);
2013
+ }
2014
+ if (uniqueDiagnostics.length > 0 && mode === "static") {
2015
+ console.warn(
2016
+ "\n[rango] Warning: partial output (unresolvable includes):\n"
2017
+ );
2018
+ formatDiagnostics(uniqueDiagnostics);
2019
+ console.warn("");
492
2020
  }
493
- console.log(`[rango] Processed ${files.length} file(s)${routerFiles.length ? ` (${routerFiles.length} router)` : ""}`);
2021
+ const nestedRouterConflict = findNestedRouterConflict(routerFiles);
2022
+ if (nestedRouterConflict) {
2023
+ console.error(
2024
+ `
2025
+ ${formatNestedRouterConflictError(nestedRouterConflict, "[rango]")}
2026
+ `
2027
+ );
2028
+ process.exit(1);
2029
+ }
2030
+ for (const urlsFile of urlsFiles) {
2031
+ writePerModuleRouteTypesForFile(urlsFile);
2032
+ }
2033
+ for (const routerFile of routerFiles) {
2034
+ const projectRoot = findProjectRoot(routerFile);
2035
+ writeCombinedRouteTypes(projectRoot, [routerFile]);
2036
+ }
2037
+ console.log(
2038
+ `[rango] Processed ${files.length} file(s)${routerFiles.length ? ` (${routerFiles.length} router)` : ""}`
2039
+ );
494
2040
  process.exit(0);
495
- } else {
496
- console.log(`Usage: rango generate <file|dir> [file2 ...]
497
-
498
- Auto-detects file type (createRouter, urls) and generates
499
- the appropriate .gen.ts route type files.
500
-
501
- Pass files, directories, or a mix of both.
502
-
503
- Examples:
504
- rango generate src/urls.tsx
505
- rango generate src/router.tsx src/urls.tsx
506
- rango generate src/`);
507
- process.exit(command ? 1 : 0);
2041
+ }
2042
+ async function runRuntimeDiscovery(args, configFile) {
2043
+ const files = [];
2044
+ for (const arg of args) {
2045
+ const resolved = resolve4(arg);
2046
+ try {
2047
+ if (statSync(resolved).isDirectory()) {
2048
+ files.push(...findTsFiles(resolved));
2049
+ } else {
2050
+ files.push(resolved);
2051
+ }
2052
+ } catch {
2053
+ console.warn(`[rango] Skipping ${arg}: not found`);
2054
+ }
2055
+ }
2056
+ const routerEntries = [];
2057
+ for (const filePath of files) {
2058
+ try {
2059
+ const source = readFileSync5(filePath, "utf-8");
2060
+ if (/\bcreateRouter\s*[<(]/.test(source)) {
2061
+ routerEntries.push(filePath);
2062
+ }
2063
+ if (source.includes("urls(")) {
2064
+ writePerModuleRouteTypesForFile(filePath);
2065
+ }
2066
+ } catch {
2067
+ }
2068
+ }
2069
+ if (routerEntries.length === 0) {
2070
+ console.error("[rango] No router files found in the provided paths");
2071
+ process.exit(1);
2072
+ }
2073
+ const nestedRouterConflict = findNestedRouterConflict(routerEntries);
2074
+ if (nestedRouterConflict) {
2075
+ console.error(
2076
+ `
2077
+ ${formatNestedRouterConflictError(nestedRouterConflict, "[rango]")}
2078
+ `
2079
+ );
2080
+ process.exit(1);
2081
+ }
2082
+ let discoverAndWriteRouteTypes2;
2083
+ try {
2084
+ const mod = await Promise.resolve().then(() => (init_runtime_discovery(), runtime_discovery_exports));
2085
+ discoverAndWriteRouteTypes2 = mod.discoverAndWriteRouteTypes;
2086
+ } catch (err) {
2087
+ if (err.code === "ERR_MODULE_NOT_FOUND" || err.code === "MODULE_NOT_FOUND") {
2088
+ console.error(
2089
+ "[rango] Runtime discovery requires 'vite' and '@vitejs/plugin-rsc'.\nInstall them with: pnpm add -D vite @vitejs/plugin-rsc"
2090
+ );
2091
+ } else {
2092
+ console.error(`[rango] Failed to load runtime discovery: ${err.message}`);
2093
+ }
2094
+ process.exit(1);
2095
+ }
2096
+ for (const entry of routerEntries) {
2097
+ const projectRoot = findProjectRoot(entry);
2098
+ const result = await discoverAndWriteRouteTypes2({
2099
+ root: projectRoot,
2100
+ configFile,
2101
+ entry
2102
+ });
2103
+ console.log(
2104
+ `[rango] Runtime discovery: ${result.routerCount} router(s), ${result.routeCount} route(s)`
2105
+ );
2106
+ }
2107
+ }
2108
+ function formatDiagnostics(diagnostics) {
2109
+ for (const d of diagnostics) {
2110
+ const prefix = d.namePrefix ? `${d.namePrefix}.*` : `${d.pathPrefix}*`;
2111
+ console.error(` ${prefix}`);
2112
+ console.error(` Reason: ${d.reason} -- ${d.detail}`);
2113
+ console.error(` Source: ${d.sourceFile}`);
2114
+ }
508
2115
  }