@rangojs/router 0.0.0-experimental.32 → 0.0.0-experimental.3232cd17

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 (376) hide show
  1. package/AGENTS.md +4 -0
  2. package/README.md +198 -44
  3. package/dist/bin/rango.js +287 -105
  4. package/dist/testing/vitest.js +82 -0
  5. package/dist/vite/index.js +3248 -1117
  6. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  7. package/package.json +73 -21
  8. package/skills/api-client/SKILL.md +211 -0
  9. package/skills/breadcrumbs/SKILL.md +107 -1
  10. package/skills/bundle-analysis/SKILL.md +159 -0
  11. package/skills/cache-guide/SKILL.md +245 -21
  12. package/skills/caching/SKILL.md +302 -6
  13. package/skills/composability/SKILL.md +27 -2
  14. package/skills/css/SKILL.md +76 -0
  15. package/skills/document-cache/SKILL.md +78 -55
  16. package/skills/handler-use/SKILL.md +364 -0
  17. package/skills/hooks/SKILL.md +270 -30
  18. package/skills/host-router/SKILL.md +82 -22
  19. package/skills/i18n/SKILL.md +276 -0
  20. package/skills/intercept/SKILL.md +49 -5
  21. package/skills/layout/SKILL.md +35 -9
  22. package/skills/links/SKILL.md +249 -17
  23. package/skills/loader/SKILL.md +294 -30
  24. package/skills/middleware/SKILL.md +52 -13
  25. package/skills/migrate-nextjs/SKILL.md +584 -0
  26. package/skills/migrate-react-router/SKILL.md +769 -0
  27. package/skills/mime-routes/SKILL.md +27 -0
  28. package/skills/observability/SKILL.md +137 -0
  29. package/skills/parallel/SKILL.md +203 -7
  30. package/skills/prerender/SKILL.md +123 -100
  31. package/skills/rango/SKILL.md +250 -22
  32. package/skills/react-compiler/SKILL.md +168 -0
  33. package/skills/response-routes/SKILL.md +122 -47
  34. package/skills/route/SKILL.md +97 -5
  35. package/skills/router-setup/SKILL.md +90 -5
  36. package/skills/server-actions/SKILL.md +775 -0
  37. package/skills/streams-and-websockets/SKILL.md +283 -0
  38. package/skills/tailwind/SKILL.md +27 -3
  39. package/skills/testing/SKILL.md +129 -0
  40. package/skills/testing/bindings.md +89 -0
  41. package/skills/testing/cache-prerender.md +124 -0
  42. package/skills/testing/client-components.md +122 -0
  43. package/skills/testing/e2e-parity.md +125 -0
  44. package/skills/testing/flight.md +92 -0
  45. package/skills/testing/handles.md +129 -0
  46. package/skills/testing/loader.md +128 -0
  47. package/skills/testing/middleware.md +99 -0
  48. package/skills/testing/render-handler.md +121 -0
  49. package/skills/testing/response-routes.md +95 -0
  50. package/skills/testing/reverse-and-types.md +84 -0
  51. package/skills/testing/server-actions.md +107 -0
  52. package/skills/testing/server-tree.md +128 -0
  53. package/skills/testing/setup.md +120 -0
  54. package/skills/typesafety/SKILL.md +329 -27
  55. package/skills/use-cache/SKILL.md +36 -5
  56. package/skills/view-transitions/SKILL.md +294 -0
  57. package/src/__augment-tests__/augment.ts +81 -0
  58. package/src/__augment-tests__/augmented.check.ts +116 -0
  59. package/src/__internal.ts +67 -40
  60. package/src/browser/action-coordinator.ts +53 -36
  61. package/src/browser/action-fence.ts +47 -0
  62. package/src/browser/app-shell.ts +39 -0
  63. package/src/browser/app-version.ts +14 -0
  64. package/src/browser/cookie-name.ts +140 -0
  65. package/src/browser/event-controller.ts +86 -147
  66. package/src/browser/history-state.ts +21 -0
  67. package/src/browser/index.ts +3 -3
  68. package/src/browser/invalidate-client-cache.ts +52 -0
  69. package/src/browser/link-interceptor.ts +4 -0
  70. package/src/browser/navigation-bridge.ts +148 -19
  71. package/src/browser/navigation-client.ts +187 -67
  72. package/src/browser/navigation-store-handle.ts +38 -0
  73. package/src/browser/navigation-store.ts +76 -67
  74. package/src/browser/navigation-transaction.ts +18 -66
  75. package/src/browser/partial-update.ts +123 -94
  76. package/src/browser/prefetch/cache.ts +214 -36
  77. package/src/browser/prefetch/fetch.ts +260 -38
  78. package/src/browser/prefetch/policy.ts +6 -0
  79. package/src/browser/prefetch/queue.ts +126 -20
  80. package/src/browser/prefetch/resource-ready.ts +77 -0
  81. package/src/browser/rango-state.ts +158 -76
  82. package/src/browser/react/Link.tsx +93 -11
  83. package/src/browser/react/NavigationProvider.tsx +115 -34
  84. package/src/browser/react/ScrollRestoration.tsx +10 -6
  85. package/src/browser/react/context.ts +7 -2
  86. package/src/browser/react/filter-segment-order.ts +49 -7
  87. package/src/browser/react/index.ts +0 -48
  88. package/src/browser/react/location-state-shared.ts +166 -8
  89. package/src/browser/react/location-state.ts +39 -14
  90. package/src/browser/react/use-action.ts +6 -15
  91. package/src/browser/react/use-handle.ts +23 -69
  92. package/src/browser/react/use-link-status.ts +0 -4
  93. package/src/browser/react/use-navigation.ts +22 -5
  94. package/src/browser/react/use-params.ts +20 -10
  95. package/src/browser/react/use-reverse.ts +106 -0
  96. package/src/browser/react/use-router.ts +46 -11
  97. package/src/browser/react/use-search-params.ts +0 -5
  98. package/src/browser/react/use-segments.ts +11 -21
  99. package/src/browser/response-adapter.ts +52 -1
  100. package/src/browser/rsc-router.tsx +215 -76
  101. package/src/browser/scroll-restoration.ts +46 -39
  102. package/src/browser/segment-reconciler.ts +36 -9
  103. package/src/browser/segment-structure-assert.ts +2 -2
  104. package/src/browser/server-action-bridge.ts +176 -50
  105. package/src/browser/types.ts +95 -11
  106. package/src/browser/validate-redirect-origin.ts +43 -16
  107. package/src/build/collect-fallback-refs.ts +107 -0
  108. package/src/build/generate-manifest.ts +65 -40
  109. package/src/build/generate-route-types.ts +5 -0
  110. package/src/build/index.ts +8 -2
  111. package/src/build/prefix-tree-utils.ts +123 -0
  112. package/src/build/route-trie.ts +137 -32
  113. package/src/build/route-types/codegen.ts +4 -4
  114. package/src/build/route-types/include-resolution.ts +9 -2
  115. package/src/build/route-types/param-extraction.ts +6 -3
  116. package/src/build/route-types/per-module-writer.ts +7 -4
  117. package/src/build/route-types/router-processing.ts +278 -96
  118. package/src/build/route-types/scan-filter.ts +9 -2
  119. package/src/build/route-types/source-scan.ts +118 -0
  120. package/src/build/runtime-discovery.ts +9 -20
  121. package/src/cache/cache-error.ts +104 -0
  122. package/src/cache/cache-policy.ts +68 -28
  123. package/src/cache/cache-runtime.ts +149 -43
  124. package/src/cache/cache-scope.ts +148 -81
  125. package/src/cache/cache-tag.ts +98 -0
  126. package/src/cache/cf/cf-cache-store.ts +2550 -93
  127. package/src/cache/cf/index.ts +11 -17
  128. package/src/cache/document-cache.ts +78 -27
  129. package/src/cache/handle-snapshot.ts +63 -0
  130. package/src/cache/index.ts +23 -20
  131. package/src/cache/memory-segment-store.ts +136 -37
  132. package/src/cache/profile-registry.ts +6 -30
  133. package/src/cache/read-through-swr.ts +41 -11
  134. package/src/cache/segment-codec.ts +0 -16
  135. package/src/cache/tag-invalidation.ts +230 -0
  136. package/src/cache/taint.ts +55 -0
  137. package/src/cache/types.ts +33 -100
  138. package/src/cache/vercel/index.ts +11 -0
  139. package/src/cache/vercel/vercel-cache-store.ts +799 -0
  140. package/src/client.rsc.tsx +6 -21
  141. package/src/client.tsx +108 -290
  142. package/src/component-utils.ts +19 -0
  143. package/src/context-var.ts +84 -2
  144. package/src/debug.ts +2 -2
  145. package/src/decode-loader-results.ts +36 -0
  146. package/src/defer.ts +196 -0
  147. package/src/deps/ssr.ts +0 -1
  148. package/src/errors.ts +30 -4
  149. package/src/handle.ts +70 -22
  150. package/src/handles/MetaTags.tsx +0 -14
  151. package/src/handles/breadcrumbs.ts +16 -5
  152. package/src/handles/meta.ts +0 -39
  153. package/src/host/cookie-handler.ts +0 -36
  154. package/src/host/errors.ts +0 -24
  155. package/src/host/index.ts +8 -2
  156. package/src/host/pattern-matcher.ts +7 -50
  157. package/src/host/router.ts +107 -99
  158. package/src/host/testing.ts +40 -27
  159. package/src/host/types.ts +37 -4
  160. package/src/host/utils.ts +1 -1
  161. package/src/href-client.ts +137 -22
  162. package/src/index.rsc.ts +52 -26
  163. package/src/index.ts +100 -38
  164. package/src/internal-debug.ts +2 -4
  165. package/src/loader-store.ts +500 -0
  166. package/src/loader.rsc.ts +20 -13
  167. package/src/loader.ts +12 -11
  168. package/src/missing-id-error.ts +68 -0
  169. package/src/network-error-thrower.tsx +1 -6
  170. package/src/outlet-context.ts +1 -1
  171. package/src/outlet-provider.tsx +1 -5
  172. package/src/prerender/param-hash.ts +10 -11
  173. package/src/prerender/store.ts +37 -41
  174. package/src/prerender.ts +198 -82
  175. package/src/redirect-origin.ts +100 -0
  176. package/src/response-utils.ts +37 -0
  177. package/src/reverse.ts +65 -15
  178. package/src/root-error-boundary.tsx +1 -19
  179. package/src/route-content-wrapper.tsx +7 -72
  180. package/src/route-definition/dsl-helpers.ts +437 -274
  181. package/src/route-definition/helper-factories.ts +29 -139
  182. package/src/route-definition/helpers-types.ts +113 -37
  183. package/src/route-definition/index.ts +3 -0
  184. package/src/route-definition/redirect.ts +52 -10
  185. package/src/route-definition/resolve-handler-use.ts +161 -0
  186. package/src/route-definition/use-item-types.ts +32 -0
  187. package/src/route-map-builder.ts +7 -17
  188. package/src/route-types.ts +37 -41
  189. package/src/router/basename.ts +14 -0
  190. package/src/router/content-negotiation.ts +108 -9
  191. package/src/router/error-handling.ts +13 -17
  192. package/src/router/find-match.ts +45 -22
  193. package/src/router/handler-context.ts +83 -41
  194. package/src/router/intercept-resolution.ts +25 -23
  195. package/src/router/lazy-includes.ts +19 -53
  196. package/src/router/loader-resolution.ts +213 -30
  197. package/src/router/logging.ts +5 -8
  198. package/src/router/manifest.ts +49 -45
  199. package/src/router/match-api.ts +120 -204
  200. package/src/router/match-context.ts +0 -22
  201. package/src/router/match-handlers.ts +58 -58
  202. package/src/router/match-middleware/background-revalidation.ts +27 -6
  203. package/src/router/match-middleware/cache-lookup.ts +205 -249
  204. package/src/router/match-middleware/cache-store.ts +45 -32
  205. package/src/router/match-middleware/intercept-resolution.ts +8 -28
  206. package/src/router/match-middleware/segment-resolution.ts +52 -18
  207. package/src/router/match-pipelines.ts +1 -42
  208. package/src/router/match-result.ts +104 -40
  209. package/src/router/metrics.ts +5 -34
  210. package/src/router/middleware-types.ts +13 -142
  211. package/src/router/middleware.ts +173 -143
  212. package/src/router/navigation-snapshot.ts +131 -0
  213. package/src/router/params-util.ts +23 -0
  214. package/src/router/pattern-matching.ts +109 -63
  215. package/src/router/prerender-match.ts +190 -54
  216. package/src/router/preview-match.ts +32 -102
  217. package/src/router/request-classification.ts +276 -0
  218. package/src/router/revalidation.ts +63 -55
  219. package/src/router/route-snapshot.ts +244 -0
  220. package/src/router/router-context.ts +6 -28
  221. package/src/router/router-interfaces.ts +100 -35
  222. package/src/router/router-options.ts +91 -11
  223. package/src/router/router-registry.ts +2 -5
  224. package/src/router/segment-resolution/fresh.ts +242 -75
  225. package/src/router/segment-resolution/helpers.ts +63 -24
  226. package/src/router/segment-resolution/loader-cache.ts +41 -37
  227. package/src/router/segment-resolution/revalidation.ts +456 -372
  228. package/src/router/segment-resolution/static-store.ts +19 -5
  229. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  230. package/src/router/segment-resolution/view-transition-default.ts +36 -0
  231. package/src/router/segment-resolution.ts +4 -1
  232. package/src/router/segment-wrappers.ts +2 -3
  233. package/src/router/state-cookie-name.ts +33 -0
  234. package/src/router/substitute-pattern-params.ts +56 -0
  235. package/src/router/telemetry-otel.ts +0 -20
  236. package/src/router/telemetry.ts +96 -19
  237. package/src/router/timeout.ts +0 -20
  238. package/src/router/trie-matching.ts +91 -46
  239. package/src/router/types.ts +10 -63
  240. package/src/router/url-params.ts +44 -0
  241. package/src/router.ts +134 -43
  242. package/src/rsc/handler-context.ts +3 -2
  243. package/src/rsc/handler.ts +492 -383
  244. package/src/rsc/helpers.ts +162 -46
  245. package/src/rsc/index.ts +1 -1
  246. package/src/rsc/json-route-result.ts +38 -0
  247. package/src/rsc/loader-fetch.ts +23 -3
  248. package/src/rsc/manifest-init.ts +33 -42
  249. package/src/rsc/origin-guard.ts +39 -25
  250. package/src/rsc/progressive-enhancement.ts +30 -3
  251. package/src/rsc/redirect-guard.ts +99 -0
  252. package/src/rsc/response-error.ts +79 -12
  253. package/src/rsc/response-route-handler.ts +90 -63
  254. package/src/rsc/rsc-rendering.ts +56 -54
  255. package/src/rsc/runtime-warnings.ts +23 -10
  256. package/src/rsc/server-action.ts +74 -67
  257. package/src/rsc/ssr-setup.ts +18 -2
  258. package/src/rsc/types.ts +25 -6
  259. package/src/runtime-env.ts +18 -0
  260. package/src/search-params.ts +4 -20
  261. package/src/segment-content-promise.ts +67 -0
  262. package/src/segment-loader-promise.ts +134 -0
  263. package/src/segment-system.tsx +272 -129
  264. package/src/serialize.ts +243 -0
  265. package/src/server/context.ts +309 -61
  266. package/src/server/cookie-store.ts +80 -5
  267. package/src/server/handle-store.ts +26 -24
  268. package/src/server/loader-registry.ts +10 -28
  269. package/src/server/request-context.ts +338 -126
  270. package/src/ssr/index.tsx +23 -15
  271. package/src/static-handler.ts +27 -18
  272. package/src/testing/cache-status.ts +162 -0
  273. package/src/testing/collect-handle.ts +40 -0
  274. package/src/testing/dispatch.ts +618 -0
  275. package/src/testing/dom.entry.ts +22 -0
  276. package/src/testing/e2e/fixture.ts +188 -0
  277. package/src/testing/e2e/index.ts +128 -0
  278. package/src/testing/e2e/matchers.ts +35 -0
  279. package/src/testing/e2e/page-helpers.ts +272 -0
  280. package/src/testing/e2e/parity.ts +387 -0
  281. package/src/testing/e2e/server.ts +195 -0
  282. package/src/testing/flight-matchers.ts +97 -0
  283. package/src/testing/flight-normalize.ts +11 -0
  284. package/src/testing/flight-runtime.d.ts +57 -0
  285. package/src/testing/flight-tree.ts +682 -0
  286. package/src/testing/flight.entry.ts +52 -0
  287. package/src/testing/flight.ts +232 -0
  288. package/src/testing/generated-routes.ts +183 -0
  289. package/src/testing/index.ts +99 -0
  290. package/src/testing/internal/context.ts +348 -0
  291. package/src/testing/internal/flight-client-globals.ts +30 -0
  292. package/src/testing/internal/seed-vars.ts +54 -0
  293. package/src/testing/render-handler.ts +330 -0
  294. package/src/testing/render-route.tsx +566 -0
  295. package/src/testing/run-loader.ts +378 -0
  296. package/src/testing/run-middleware.ts +205 -0
  297. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  298. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  299. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  300. package/src/testing/vitest-stubs/version.ts +5 -0
  301. package/src/testing/vitest.ts +305 -0
  302. package/src/theme/ThemeProvider.tsx +0 -52
  303. package/src/theme/ThemeScript.tsx +0 -6
  304. package/src/theme/constants.ts +0 -12
  305. package/src/theme/index.ts +0 -7
  306. package/src/theme/theme-context.ts +1 -5
  307. package/src/theme/theme-script.ts +0 -14
  308. package/src/theme/use-theme.ts +0 -3
  309. package/src/types/boundaries.ts +0 -35
  310. package/src/types/cache-types.ts +17 -8
  311. package/src/types/error-types.ts +30 -90
  312. package/src/types/global-namespace.ts +54 -41
  313. package/src/types/handler-context.ts +233 -81
  314. package/src/types/index.ts +1 -10
  315. package/src/types/loader-types.ts +44 -15
  316. package/src/types/request-scope.ts +107 -0
  317. package/src/types/route-config.ts +6 -50
  318. package/src/types/route-entry.ts +19 -7
  319. package/src/types/segments.ts +37 -14
  320. package/src/urls/include-helper.ts +33 -70
  321. package/src/urls/index.ts +1 -11
  322. package/src/urls/path-helper-types.ts +58 -11
  323. package/src/urls/path-helper.ts +57 -111
  324. package/src/urls/pattern-types.ts +48 -19
  325. package/src/urls/response-types.ts +25 -22
  326. package/src/urls/type-extraction.ts +58 -139
  327. package/src/urls/urls-function.ts +1 -18
  328. package/src/use-loader.tsx +346 -89
  329. package/src/vite/debug.ts +185 -0
  330. package/src/vite/discovery/bundle-postprocess.ts +36 -38
  331. package/src/vite/discovery/discover-routers.ts +130 -85
  332. package/src/vite/discovery/discovery-errors.ts +194 -0
  333. package/src/vite/discovery/gate-state.ts +171 -0
  334. package/src/vite/discovery/prerender-collection.ts +192 -99
  335. package/src/vite/discovery/route-types-writer.ts +40 -84
  336. package/src/vite/discovery/self-gen-tracking.ts +27 -1
  337. package/src/vite/discovery/state.ts +51 -6
  338. package/src/vite/discovery/virtual-module-codegen.ts +14 -34
  339. package/src/vite/index.ts +8 -0
  340. package/src/vite/plugin-types.ts +187 -69
  341. package/src/vite/plugins/cjs-to-esm.ts +8 -18
  342. package/src/vite/plugins/client-ref-dedup.ts +16 -11
  343. package/src/vite/plugins/client-ref-hashing.ts +28 -15
  344. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  345. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  346. package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
  347. package/src/vite/plugins/expose-action-id.ts +49 -98
  348. package/src/vite/plugins/expose-id-utils.ts +11 -50
  349. package/src/vite/plugins/expose-ids/export-analysis.ts +76 -34
  350. package/src/vite/plugins/expose-ids/handler-transform.ts +10 -48
  351. package/src/vite/plugins/expose-ids/loader-transform.ts +3 -20
  352. package/src/vite/plugins/expose-ids/router-transform.ts +20 -16
  353. package/src/vite/plugins/expose-internal-ids.ts +554 -317
  354. package/src/vite/plugins/performance-tracks.ts +89 -0
  355. package/src/vite/plugins/refresh-cmd.ts +89 -27
  356. package/src/vite/plugins/use-cache-transform.ts +73 -83
  357. package/src/vite/plugins/vercel-output.ts +258 -0
  358. package/src/vite/plugins/version-injector.ts +21 -25
  359. package/src/vite/plugins/version-plugin.ts +41 -20
  360. package/src/vite/plugins/virtual-entries.ts +2 -17
  361. package/src/vite/rango.ts +257 -289
  362. package/src/vite/router-discovery.ts +930 -140
  363. package/src/vite/utils/ast-handler-extract.ts +15 -31
  364. package/src/vite/utils/banner.ts +4 -4
  365. package/src/vite/utils/bundle-analysis.ts +10 -15
  366. package/src/vite/utils/client-chunks.ts +184 -0
  367. package/src/vite/utils/forward-user-plugins.ts +171 -0
  368. package/src/vite/utils/manifest-utils.ts +4 -59
  369. package/src/vite/utils/package-resolution.ts +20 -52
  370. package/src/vite/utils/prerender-utils.ts +27 -29
  371. package/src/vite/utils/shared-utils.ts +92 -42
  372. package/src/browser/action-response-classifier.ts +0 -99
  373. package/src/browser/react/use-client-cache.ts +0 -58
  374. package/src/browser/shallow.ts +0 -40
  375. package/src/handles/index.ts +0 -7
  376. package/src/router/middleware-cookies.ts +0 -55
package/dist/bin/rango.js CHANGED
@@ -1,8 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  var __defProp = Object.defineProperty;
3
3
  var __getOwnPropNames = Object.getOwnPropertyNames;
4
- var __esm = (fn, res) => function __init() {
5
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
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
+ }
6
11
  };
7
12
  var __export = (target, all) => {
8
13
  for (var name in all)
@@ -22,10 +27,10 @@ function extractParamsFromPattern(pattern) {
22
27
  function formatRouteEntry(key, pattern, _params, search) {
23
28
  const hasSearch = search && Object.keys(search).length > 0;
24
29
  if (!hasSearch) {
25
- return ` ${key}: "${pattern}",`;
30
+ return ` ${key}: ${JSON.stringify(pattern)},`;
26
31
  }
27
- const searchBody = Object.entries(search).map(([k, v]) => `${k}: "${v}"`).join(", ");
28
- return ` ${key}: { path: "${pattern}", search: { ${searchBody} } },`;
32
+ const searchBody = Object.entries(search).map(([k, v]) => `${k}: ${JSON.stringify(v)}`).join(", ");
33
+ return ` ${key}: { path: ${JSON.stringify(pattern)}, search: { ${searchBody} } },`;
29
34
  }
30
35
  var init_param_extraction = __esm({
31
36
  "src/build/route-types/param-extraction.ts"() {
@@ -139,7 +144,7 @@ function generatePerModuleTypesSource(routes) {
139
144
  const valid = routes.filter(({ name }) => {
140
145
  if (!name || /["'\\`\n\r]/.test(name)) {
141
146
  console.warn(
142
- `[rsc-router] Skipping route with invalid name: ${JSON.stringify(name)}`
147
+ `[rango] Skipping route with invalid name: ${JSON.stringify(name)}`
143
148
  );
144
149
  return false;
145
150
  }
@@ -149,7 +154,7 @@ function generatePerModuleTypesSource(routes) {
149
154
  for (const { name, pattern, params, search } of valid) {
150
155
  if (deduped.has(name)) {
151
156
  console.warn(
152
- `[rsc-router] Duplicate route name "${name}" \u2014 keeping first definition`
157
+ `[rango] Duplicate route name "${name}" \u2014 keeping first definition`
153
158
  );
154
159
  continue;
155
160
  }
@@ -186,7 +191,7 @@ ${objectBody}
186
191
  } as const;
187
192
 
188
193
  declare global {
189
- namespace RSCRouter {
194
+ namespace Rango {
190
195
  interface GeneratedRouteMap extends Readonly<typeof NamedRoutes> {}
191
196
  }
192
197
  }
@@ -211,14 +216,15 @@ function findTsFiles(dir, filter) {
211
216
  entries = readdirSync(dir, { withFileTypes: true });
212
217
  } catch (err) {
213
218
  console.warn(
214
- `[rsc-router] Failed to scan directory ${dir}: ${err.message}`
219
+ `[rango] Failed to scan directory ${dir}: ${err.message}`
215
220
  );
216
221
  return results;
217
222
  }
218
223
  for (const entry of entries) {
219
224
  const fullPath = join(dir, entry.name);
220
225
  if (entry.isDirectory()) {
221
- if (entry.name === "node_modules" || entry.name.startsWith(".")) continue;
226
+ if (entry.name === "node_modules" || entry.name.startsWith(".") || entry.name === "dist" || entry.name === "build" || entry.name === "coverage")
227
+ continue;
222
228
  results.push(...findTsFiles(fullPath, filter));
223
229
  } else if ((entry.name.endsWith(".ts") || entry.name.endsWith(".tsx") || entry.name.endsWith(".js") || entry.name.endsWith(".jsx")) && !entry.name.includes(".gen.")) {
224
230
  if (filter && !filter(fullPath)) continue;
@@ -450,12 +456,12 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
450
456
  }
451
457
  return routeMap;
452
458
  }
453
- function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut) {
459
+ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut, inlineBlock) {
454
460
  visited = visited ?? /* @__PURE__ */ new Set();
455
461
  const realPath = resolve(filePath);
456
462
  const key = variableName ? `${realPath}:${variableName}` : realPath;
457
463
  if (visited.has(key)) {
458
- console.warn(`[rsc-router] Circular include detected, skipping: ${key}`);
464
+ console.warn(`[rango] Circular include detected, skipping: ${key}`);
459
465
  return { routes: {}, searchSchemas: {} };
460
466
  }
461
467
  visited.add(key);
@@ -466,7 +472,9 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
466
472
  return { routes: {}, searchSchemas: {} };
467
473
  }
468
474
  let block;
469
- if (variableName) {
475
+ if (inlineBlock) {
476
+ block = inlineBlock;
477
+ } else if (variableName) {
470
478
  const extracted = extractUrlsBlockForVariable(source, variableName);
471
479
  if (!extracted) return { routes: {}, searchSchemas: {} };
472
480
  block = extracted;
@@ -540,12 +548,12 @@ function writePerModuleRouteTypesForFile(filePath) {
540
548
  } else {
541
549
  routes = extractRoutesFromSource(source);
542
550
  }
543
- const genPath = filePath.replace(/\.(tsx?)$/, ".gen.ts");
551
+ const genPath = filePath.replace(/\.(tsx?|jsx?)$/, ".gen.ts");
544
552
  if (routes.length === 0) {
545
553
  if (varNames.length > 0 && !existsSync2(genPath)) {
546
554
  writeFileSync(genPath, generatePerModuleTypesSource([]));
547
555
  console.log(
548
- `[rsc-router] Generated route types (placeholder) -> ${genPath}`
556
+ `[rango] Generated route types (placeholder) -> ${genPath}`
549
557
  );
550
558
  }
551
559
  return;
@@ -554,11 +562,11 @@ function writePerModuleRouteTypesForFile(filePath) {
554
562
  const existing = existsSync2(genPath) ? readFileSync2(genPath, "utf-8") : null;
555
563
  if (existing !== genSource) {
556
564
  writeFileSync(genPath, genSource);
557
- console.log(`[rsc-router] Generated route types -> ${genPath}`);
565
+ console.log(`[rango] Generated route types -> ${genPath}`);
558
566
  }
559
567
  } catch (err) {
560
568
  console.warn(
561
- `[rsc-router] Failed to generate route types for ${filePath}: ${err.message}`
569
+ `[rango] Failed to generate route types for ${filePath}: ${err.message}`
562
570
  );
563
571
  }
564
572
  }
@@ -573,6 +581,75 @@ var init_per_module_writer = __esm({
573
581
  }
574
582
  });
575
583
 
584
+ // src/build/route-types/source-scan.ts
585
+ function isLineTerminator(ch) {
586
+ const c = ch.charCodeAt(0);
587
+ return c === 10 || c === 13 || c === 8232 || c === 8233;
588
+ }
589
+ function makeCodeClassifier(code) {
590
+ const n = code.length;
591
+ let i = 0;
592
+ let skipStart = -1;
593
+ let skipEnd = -1;
594
+ return (q) => {
595
+ if (q >= skipStart && q < skipEnd) return false;
596
+ while (i < n && i <= q) {
597
+ const c = code[i];
598
+ const d = i + 1 < n ? code[i + 1] : "";
599
+ let end = -1;
600
+ if (c === "/" && d === "/") {
601
+ let j = i + 2;
602
+ while (j < n && !isLineTerminator(code[j])) j++;
603
+ end = j;
604
+ } else if (c === "/" && d === "*") {
605
+ let j = i + 2;
606
+ while (j < n && !(code[j] === "*" && code[j + 1] === "/")) j++;
607
+ end = Math.min(n, j + 2);
608
+ } else if (c === '"' || c === "'" || c === "`") {
609
+ let j = i + 1;
610
+ while (j < n) {
611
+ if (code[j] === "\\") {
612
+ j += 2;
613
+ continue;
614
+ }
615
+ if (code[j] === c) {
616
+ j++;
617
+ break;
618
+ }
619
+ j++;
620
+ }
621
+ end = j;
622
+ }
623
+ if (end >= 0) {
624
+ if (q < end) {
625
+ skipStart = i;
626
+ skipEnd = end;
627
+ return false;
628
+ }
629
+ i = end;
630
+ } else {
631
+ i++;
632
+ }
633
+ }
634
+ return true;
635
+ };
636
+ }
637
+ function firstCodeMatchIndex(code, pattern) {
638
+ const inCode = makeCodeClassifier(code);
639
+ pattern.lastIndex = 0;
640
+ let m;
641
+ while ((m = pattern.exec(code)) !== null) {
642
+ if (inCode(m.index)) return m.index;
643
+ if (pattern.lastIndex <= m.index) pattern.lastIndex = m.index + 1;
644
+ }
645
+ return -1;
646
+ }
647
+ var init_source_scan = __esm({
648
+ "src/build/route-types/source-scan.ts"() {
649
+ "use strict";
650
+ }
651
+ });
652
+
576
653
  // src/build/route-types/router-processing.ts
577
654
  import {
578
655
  readFileSync as readFileSync3,
@@ -601,7 +678,7 @@ function countPublicRouteEntries(source) {
601
678
  return count;
602
679
  }
603
680
  function isRoutableSourceFile(name) {
604
- return (name.endsWith(".ts") || name.endsWith(".tsx") || name.endsWith(".js") || name.endsWith(".jsx")) && !name.includes(".gen.");
681
+ return (name.endsWith(".ts") || name.endsWith(".tsx") || name.endsWith(".js") || name.endsWith(".jsx")) && !name.includes(".gen.") && !name.includes(".test.") && !name.includes(".spec.");
605
682
  }
606
683
  function findRouterFilesRecursive(dir, filter, results) {
607
684
  let entries;
@@ -609,7 +686,7 @@ function findRouterFilesRecursive(dir, filter, results) {
609
686
  entries = readdirSync2(dir, { withFileTypes: true });
610
687
  } catch (err) {
611
688
  console.warn(
612
- `[rsc-router] Failed to scan directory ${dir}: ${err.message}`
689
+ `[rango] Failed to scan directory ${dir}: ${err.message}`
613
690
  );
614
691
  return;
615
692
  }
@@ -618,7 +695,8 @@ function findRouterFilesRecursive(dir, filter, results) {
618
695
  for (const entry of entries) {
619
696
  const fullPath = join2(dir, entry.name);
620
697
  if (entry.isDirectory()) {
621
- if (entry.name === "node_modules" || entry.name.startsWith(".")) continue;
698
+ if (entry.name === "node_modules" || entry.name === "dist" || entry.name === "coverage" || entry.name === "__tests__" || entry.name === "__mocks__" || entry.name.startsWith("."))
699
+ continue;
622
700
  childDirs.push(fullPath);
623
701
  continue;
624
702
  }
@@ -626,7 +704,7 @@ function findRouterFilesRecursive(dir, filter, results) {
626
704
  if (filter && !filter(fullPath)) continue;
627
705
  try {
628
706
  const source = readFileSync3(fullPath, "utf-8");
629
- if (ROUTER_CALL_PATTERN.test(source)) {
707
+ if (ROUTER_CALL_PATTERN.test(source) && firstCodeMatchIndex(source, ROUTER_CALL_PATTERN_G) >= 0) {
630
708
  routerFilesInDir.push(fullPath);
631
709
  }
632
710
  } catch {
@@ -664,13 +742,13 @@ function findNestedRouterConflict(routerFiles) {
664
742
  }
665
743
  return null;
666
744
  }
667
- function formatNestedRouterConflictError(conflict, prefix = "[rsc-router]") {
745
+ function formatNestedRouterConflictError(conflict, prefix = "[rango]") {
668
746
  return `${prefix} Nested router roots are not supported.
669
747
  Router root: ${conflict.ancestor}
670
748
  Nested router: ${conflict.nested}
671
749
  Move the nested router into a sibling directory or configure it as a separate app root.`;
672
750
  }
673
- function extractUrlsVariableFromRouter(code) {
751
+ function extractUrlsFromRouter(code) {
674
752
  const sourceFile = ts5.createSourceFile(
675
753
  "router.tsx",
676
754
  code,
@@ -684,24 +762,70 @@ function extractUrlsVariableFromRouter(code) {
684
762
  const callee = node.expression;
685
763
  return ts5.isIdentifier(callee) && callee.text === "createRouter";
686
764
  }
765
+ function isInlineBuilder(node) {
766
+ return ts5.isArrowFunction(node) || ts5.isFunctionExpression(node);
767
+ }
768
+ function isRoutesOnCreateRouter(node) {
769
+ if (!ts5.isPropertyAccessExpression(node.expression) || node.expression.name.text !== "routes")
770
+ return false;
771
+ let inner = node.expression.expression;
772
+ while (ts5.isCallExpression(inner) && ts5.isPropertyAccessExpression(inner.expression)) {
773
+ inner = inner.expression.expression;
774
+ }
775
+ return isCreateRouterCall(inner);
776
+ }
687
777
  function visit(node) {
688
778
  if (result) return;
689
- if (ts5.isCallExpression(node) && ts5.isPropertyAccessExpression(node.expression) && node.expression.name.text === "routes" && node.arguments.length >= 1 && ts5.isIdentifier(node.arguments[0])) {
690
- let inner = node.expression.expression;
691
- while (ts5.isCallExpression(inner) && ts5.isPropertyAccessExpression(inner.expression)) {
692
- inner = inner.expression.expression;
693
- }
694
- if (isCreateRouterCall(inner)) {
695
- result = node.arguments[0].text;
696
- return;
779
+ if (ts5.isCallExpression(node) && node.arguments.length >= 1 && isRoutesOnCreateRouter(node)) {
780
+ const arg = node.arguments[0];
781
+ if (ts5.isIdentifier(arg)) {
782
+ result = { kind: "variable", name: arg.text };
783
+ } else if (isInlineBuilder(arg)) {
784
+ result = { kind: "inline", block: arg.getText(sourceFile) };
697
785
  }
786
+ return;
698
787
  }
699
788
  if (isCreateRouterCall(node)) {
700
789
  const callExpr = node;
701
- for (const arg of callExpr.arguments) {
790
+ for (const callArg of callExpr.arguments) {
791
+ if (ts5.isObjectLiteralExpression(callArg)) {
792
+ for (const prop of callArg.properties) {
793
+ if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "urls") {
794
+ if (ts5.isIdentifier(prop.initializer)) {
795
+ result = { kind: "variable", name: prop.initializer.text };
796
+ } else if (isInlineBuilder(prop.initializer)) {
797
+ result = {
798
+ kind: "inline",
799
+ block: prop.initializer.getText(sourceFile)
800
+ };
801
+ }
802
+ return;
803
+ }
804
+ }
805
+ }
806
+ }
807
+ }
808
+ ts5.forEachChild(node, visit);
809
+ }
810
+ visit(sourceFile);
811
+ return result;
812
+ }
813
+ function extractBasenameFromRouter(code) {
814
+ const sourceFile = ts5.createSourceFile(
815
+ "router.tsx",
816
+ code,
817
+ ts5.ScriptTarget.Latest,
818
+ true,
819
+ ts5.ScriptKind.TSX
820
+ );
821
+ let result;
822
+ function visit(node) {
823
+ if (result !== void 0) return;
824
+ if (ts5.isCallExpression(node) && ts5.isIdentifier(node.expression) && node.expression.text === "createRouter") {
825
+ for (const arg of node.arguments) {
702
826
  if (ts5.isObjectLiteralExpression(arg)) {
703
827
  for (const prop of arg.properties) {
704
- if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "urls" && ts5.isIdentifier(prop.initializer)) {
828
+ if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "basename" && ts5.isStringLiteral(prop.initializer)) {
705
829
  result = prop.initializer.text;
706
830
  return;
707
831
  }
@@ -714,6 +838,38 @@ function extractUrlsVariableFromRouter(code) {
714
838
  visit(sourceFile);
715
839
  return result;
716
840
  }
841
+ function applyBasenameToRoutes(result, basename) {
842
+ const prefixed = {};
843
+ for (const [name, pattern] of Object.entries(result.routes)) {
844
+ if (pattern === "/") {
845
+ prefixed[name] = basename;
846
+ } else if (basename.endsWith("/") && pattern.startsWith("/")) {
847
+ prefixed[name] = basename + pattern.slice(1);
848
+ } else {
849
+ prefixed[name] = basename + pattern;
850
+ }
851
+ }
852
+ return { routes: prefixed, searchSchemas: result.searchSchemas };
853
+ }
854
+ function genFileTsPath(sourceFile) {
855
+ const base = pathBasename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
856
+ return join2(dirname2(sourceFile), `${base}.named-routes.gen.ts`);
857
+ }
858
+ function resolveSearchSchemas(publicRouteNames, runtimeSchemas, sourceFile) {
859
+ if (runtimeSchemas && Object.keys(runtimeSchemas).length > 0) {
860
+ return runtimeSchemas;
861
+ }
862
+ const staticParsed = buildCombinedRouteMapForRouterFile(sourceFile);
863
+ if (Object.keys(staticParsed.searchSchemas).length === 0) {
864
+ return runtimeSchemas;
865
+ }
866
+ const filtered = {};
867
+ for (const name of publicRouteNames) {
868
+ const schema = staticParsed.searchSchemas[name];
869
+ if (schema) filtered[name] = schema;
870
+ }
871
+ return Object.keys(filtered).length > 0 ? filtered : runtimeSchemas;
872
+ }
717
873
  function buildCombinedRouteMapForRouterFile(routerFilePath) {
718
874
  let routerSource;
719
875
  try {
@@ -721,19 +877,40 @@ function buildCombinedRouteMapForRouterFile(routerFilePath) {
721
877
  } catch {
722
878
  return { routes: {}, searchSchemas: {} };
723
879
  }
724
- const urlsVarName = extractUrlsVariableFromRouter(routerSource);
725
- if (!urlsVarName) {
880
+ const extraction = extractUrlsFromRouter(routerSource);
881
+ if (!extraction) {
726
882
  return { routes: {}, searchSchemas: {} };
727
883
  }
728
- const imported = resolveImportedVariable(routerSource, urlsVarName);
729
- if (imported) {
730
- const targetFile = resolveImportPath(imported.specifier, routerFilePath);
731
- if (!targetFile) {
732
- return { routes: {}, searchSchemas: {} };
884
+ const rawBasename = extractBasenameFromRouter(routerSource);
885
+ const basename = rawBasename ? ("/" + rawBasename.replace(/^\/+|\/+$/g, "")).replace(/^\/$/, "") : void 0;
886
+ let result;
887
+ if (extraction.kind === "inline") {
888
+ result = buildCombinedRouteMapWithSearch(
889
+ routerFilePath,
890
+ void 0,
891
+ void 0,
892
+ void 0,
893
+ extraction.block
894
+ );
895
+ } else {
896
+ const imported = resolveImportedVariable(routerSource, extraction.name);
897
+ if (imported) {
898
+ const targetFile = resolveImportPath(imported.specifier, routerFilePath);
899
+ if (!targetFile) {
900
+ return { routes: {}, searchSchemas: {} };
901
+ }
902
+ result = buildCombinedRouteMapWithSearch(
903
+ targetFile,
904
+ imported.exportedName
905
+ );
906
+ } else {
907
+ result = buildCombinedRouteMapWithSearch(routerFilePath, extraction.name);
733
908
  }
734
- return buildCombinedRouteMapWithSearch(targetFile, imported.exportedName);
735
909
  }
736
- return buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
910
+ if (basename) {
911
+ result = applyBasenameToRoutes(result, basename);
912
+ }
913
+ return result;
737
914
  }
738
915
  function detectUnresolvableIncludes(routerFilePath) {
739
916
  const realPath = resolve2(routerFilePath);
@@ -743,9 +920,20 @@ function detectUnresolvableIncludes(routerFilePath) {
743
920
  } catch {
744
921
  return [];
745
922
  }
746
- const urlsVarName = extractUrlsVariableFromRouter(source);
747
- if (!urlsVarName) return [];
748
- const imported = resolveImportedVariable(source, urlsVarName);
923
+ const extraction = extractUrlsFromRouter(source);
924
+ if (!extraction) return [];
925
+ const diagnostics = [];
926
+ if (extraction.kind === "inline") {
927
+ buildCombinedRouteMapWithSearch(
928
+ realPath,
929
+ void 0,
930
+ /* @__PURE__ */ new Set(),
931
+ diagnostics,
932
+ extraction.block
933
+ );
934
+ return diagnostics;
935
+ }
936
+ const imported = resolveImportedVariable(source, extraction.name);
749
937
  let targetFile;
750
938
  let exportedName;
751
939
  if (imported) {
@@ -765,9 +953,8 @@ function detectUnresolvableIncludes(routerFilePath) {
765
953
  exportedName = imported.exportedName;
766
954
  } else {
767
955
  targetFile = realPath;
768
- exportedName = urlsVarName;
956
+ exportedName = extraction.name;
769
957
  }
770
- const diagnostics = [];
771
958
  buildCombinedRouteMapWithSearch(
772
959
  targetFile,
773
960
  exportedName,
@@ -803,7 +990,7 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
803
990
  if (existsSync3(oldCombinedPath)) {
804
991
  unlinkSync(oldCombinedPath);
805
992
  console.log(
806
- `[rsc-router] Removed stale combined route types: ${oldCombinedPath}`
993
+ `[rango] Removed stale combined route types: ${oldCombinedPath}`
807
994
  );
808
995
  }
809
996
  } catch {
@@ -815,38 +1002,22 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
815
1002
  throw new Error(formatNestedRouterConflictError(nestedRouterConflict));
816
1003
  }
817
1004
  for (const routerFilePath of routerFilePaths) {
818
- let routerSource;
819
- try {
820
- routerSource = readFileSync3(routerFilePath, "utf-8");
821
- } catch {
822
- continue;
823
- }
824
- const urlsVarName = extractUrlsVariableFromRouter(routerSource);
825
- if (!urlsVarName) continue;
826
- let result;
827
- const imported = resolveImportedVariable(routerSource, urlsVarName);
828
- if (imported) {
829
- const targetFile = resolveImportPath(imported.specifier, routerFilePath);
830
- if (!targetFile) continue;
831
- result = buildCombinedRouteMapWithSearch(
832
- targetFile,
833
- imported.exportedName
834
- );
835
- } else {
836
- result = buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
1005
+ const result = buildCombinedRouteMapForRouterFile(routerFilePath);
1006
+ if (Object.keys(result.routes).length === 0 && Object.keys(result.searchSchemas).length === 0) {
1007
+ let routerSource;
1008
+ try {
1009
+ routerSource = readFileSync3(routerFilePath, "utf-8");
1010
+ } catch {
1011
+ continue;
1012
+ }
1013
+ if (!extractUrlsFromRouter(routerSource)) continue;
837
1014
  }
838
- const routerBasename = pathBasename(routerFilePath).replace(
839
- /\.(tsx?|jsx?)$/,
840
- ""
841
- );
842
- const outPath = join2(
843
- dirname2(routerFilePath),
844
- `${routerBasename}.named-routes.gen.ts`
845
- );
1015
+ const outPath = genFileTsPath(routerFilePath);
846
1016
  const existing = existsSync3(outPath) ? readFileSync3(outPath, "utf-8") : null;
847
1017
  if (Object.keys(result.routes).length === 0) {
848
1018
  if (!existing) {
849
1019
  const emptySource = generateRouteTypesSource({});
1020
+ opts?.onWrite?.(outPath, emptySource);
850
1021
  writeFileSync2(outPath, emptySource);
851
1022
  }
852
1023
  continue;
@@ -866,22 +1037,25 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
866
1037
  continue;
867
1038
  }
868
1039
  }
1040
+ opts?.onWrite?.(outPath, source);
869
1041
  writeFileSync2(outPath, source);
870
1042
  console.log(
871
- `[rsc-router] Generated route types (${Object.keys(result.routes).length} routes) -> ${outPath}`
1043
+ `[rango] Generated route types (${Object.keys(result.routes).length} routes) -> ${outPath}`
872
1044
  );
873
1045
  }
874
1046
  }
875
1047
  }
876
- var ROUTER_CALL_PATTERN;
1048
+ var ROUTER_CALL_PATTERN, ROUTER_CALL_PATTERN_G;
877
1049
  var init_router_processing = __esm({
878
1050
  "src/build/route-types/router-processing.ts"() {
879
1051
  "use strict";
880
1052
  init_codegen();
1053
+ init_source_scan();
881
1054
  init_include_resolution();
882
1055
  init_per_module_writer();
883
1056
  init_route_name();
884
1057
  ROUTER_CALL_PATTERN = /\bcreateRouter\s*[<(]/;
1058
+ ROUTER_CALL_PATTERN_G = /\bcreateRouter\s*[<(]/g;
885
1059
  }
886
1060
  });
887
1061
 
@@ -919,7 +1093,7 @@ import {
919
1093
  import { createElement, StrictMode } from "react";
920
1094
  import { hydrateRoot } from "react-dom/client";
921
1095
  import { rscStream } from "@rangojs/router/internal/deps/html-stream-client";
922
- import { initBrowserApp, RSCRouter } from "@rangojs/router/browser";
1096
+ import { initBrowserApp, Rango } from "@rangojs/router/browser";
923
1097
 
924
1098
  async function initializeApp() {
925
1099
  const deps = {
@@ -934,7 +1108,7 @@ async function initializeApp() {
934
1108
 
935
1109
  hydrateRoot(
936
1110
  document,
937
- createElement(StrictMode, null, createElement(RSCRouter))
1111
+ createElement(StrictMode, null, createElement(Rango))
938
1112
  );
939
1113
  }
940
1114
 
@@ -966,7 +1140,8 @@ export const renderHTML = createSSRHandler({
966
1140
  // src/vite/plugins/version-plugin.ts
967
1141
  var version_plugin_exports = {};
968
1142
  __export(version_plugin_exports, {
969
- createVersionPlugin: () => createVersionPlugin
1143
+ createVersionPlugin: () => createVersionPlugin,
1144
+ isViteDepCachePath: () => isViteDepCachePath
970
1145
  });
971
1146
  import { parseAst } from "vite";
972
1147
  function isCodeModule(id) {
@@ -978,7 +1153,7 @@ function normalizeModuleId(id) {
978
1153
  function getClientModuleSignature(source) {
979
1154
  let program;
980
1155
  try {
981
- program = parseAst(source, { jsx: true });
1156
+ program = parseAst(source, { lang: "tsx" });
982
1157
  } catch {
983
1158
  return void 0;
984
1159
  }
@@ -1061,10 +1236,12 @@ function createVersionPlugin() {
1061
1236
  let currentVersion = buildVersion;
1062
1237
  let isDev = false;
1063
1238
  let server = null;
1239
+ let resolvedCacheDir;
1064
1240
  const clientModuleSignatures = /* @__PURE__ */ new Map();
1241
+ let versionCounter = 0;
1065
1242
  const bumpVersion = (reason) => {
1066
- currentVersion = Date.now().toString(16);
1067
- console.log(`[rsc-router] ${reason}, version updated: ${currentVersion}`);
1243
+ currentVersion = Date.now().toString(16) + String(++versionCounter);
1244
+ console.log(`[rango] ${reason}, version updated: ${currentVersion}`);
1068
1245
  const rscEnv = server?.environments?.rsc;
1069
1246
  const versionMod = rscEnv?.moduleGraph?.getModuleById(
1070
1247
  "\0" + VIRTUAL_IDS.version
@@ -1078,6 +1255,7 @@ function createVersionPlugin() {
1078
1255
  enforce: "pre",
1079
1256
  configResolved(config) {
1080
1257
  isDev = config.command === "serve";
1258
+ resolvedCacheDir = config.cacheDir ? String(config.cacheDir).replace(/\\/g, "/") : void 0;
1081
1259
  },
1082
1260
  configureServer(devServer) {
1083
1261
  server = devServer;
@@ -1114,11 +1292,14 @@ function createVersionPlugin() {
1114
1292
  }
1115
1293
  return null;
1116
1294
  },
1117
- // Track RSC module changes and update version
1118
1295
  async hotUpdate(ctx) {
1119
1296
  if (!isDev) return;
1120
1297
  const isRscModule = this.environment?.name === "rsc";
1121
1298
  if (!isRscModule) return;
1299
+ if (isViteDepCachePath(ctx.file, resolvedCacheDir)) return;
1300
+ if (ctx.modules.length === 1 && ctx.modules[0].id === "\0" + VIRTUAL_IDS.version) {
1301
+ return;
1302
+ }
1122
1303
  if (isCodeModule(ctx.file)) {
1123
1304
  const filePath = normalizeModuleId(ctx.file);
1124
1305
  const previousSignature = clientModuleSignatures.get(filePath);
@@ -1145,6 +1326,17 @@ function createVersionPlugin() {
1145
1326
  }
1146
1327
  };
1147
1328
  }
1329
+ function isViteDepCachePath(filePath, cacheDir) {
1330
+ if (!filePath) return false;
1331
+ const normalized = filePath.replace(/\\/g, "/");
1332
+ if (cacheDir) {
1333
+ const normalizedCacheDir = cacheDir.replace(/\\/g, "/").replace(/\/+$/, "");
1334
+ if (normalized === normalizedCacheDir || normalized.startsWith(normalizedCacheDir + "/")) {
1335
+ return true;
1336
+ }
1337
+ }
1338
+ return /\/node_modules\/\.vite[^/]*\//.test(normalized) || normalized.includes("/.vite-isolated/");
1339
+ }
1148
1340
  var init_version_plugin = __esm({
1149
1341
  "src/vite/plugins/version-plugin.ts"() {
1150
1342
  "use strict";
@@ -1190,7 +1382,7 @@ var runtime_discovery_exports = {};
1190
1382
  __export(runtime_discovery_exports, {
1191
1383
  discoverAndWriteRouteTypes: () => discoverAndWriteRouteTypes
1192
1384
  });
1193
- import { dirname as dirname3, join as join3, basename, resolve as resolve3 } from "node:path";
1385
+ import { resolve as resolve3 } from "node:path";
1194
1386
  import { existsSync as existsSync4, readFileSync as readFileSync4, writeFileSync as writeFileSync3 } from "node:fs";
1195
1387
  async function discoverAndWriteRouteTypes(opts) {
1196
1388
  let createViteServer;
@@ -1300,22 +1492,12 @@ This means createRouter() stack trace parsing matched an internal frame.
1300
1492
  Set an explicit \`id\` on createRouter() or check the call site.`
1301
1493
  );
1302
1494
  }
1303
- if (!routeSearchSchemas || Object.keys(routeSearchSchemas).length === 0) {
1304
- const staticParsed = buildCombinedRouteMapForRouterFile(sourceFile);
1305
- if (Object.keys(staticParsed.searchSchemas).length > 0) {
1306
- const filtered = {};
1307
- for (const name of Object.keys(routeManifest)) {
1308
- const schema = staticParsed.searchSchemas[name];
1309
- if (schema) filtered[name] = schema;
1310
- }
1311
- if (Object.keys(filtered).length > 0) {
1312
- routeSearchSchemas = filtered;
1313
- }
1314
- }
1315
- }
1316
- const routerDir = dirname3(sourceFile);
1317
- const routerBasename = basename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
1318
- const outPath = join3(routerDir, `${routerBasename}.named-routes.gen.ts`);
1495
+ routeSearchSchemas = resolveSearchSchemas(
1496
+ Object.keys(routeManifest),
1497
+ routeSearchSchemas,
1498
+ sourceFile
1499
+ );
1500
+ const outPath = genFileTsPath(sourceFile);
1319
1501
  const source = generateRouteTypesSource(
1320
1502
  routeManifest,
1321
1503
  routeSearchSchemas && Object.keys(routeSearchSchemas).length > 0 ? routeSearchSchemas : void 0
@@ -1352,7 +1534,7 @@ var init_runtime_discovery = __esm({
1352
1534
 
1353
1535
  // src/bin/rango.ts
1354
1536
  init_generate_route_types();
1355
- import { resolve as resolve4, dirname as dirname4 } from "node:path";
1537
+ import { resolve as resolve4, dirname as dirname3 } from "node:path";
1356
1538
  import { readFileSync as readFileSync5, statSync, existsSync as existsSync5 } from "node:fs";
1357
1539
  var [command, ...rawArgs] = process.argv.slice(2);
1358
1540
  if (command === "generate") {
@@ -1423,12 +1605,12 @@ Examples:
1423
1605
  );
1424
1606
  }
1425
1607
  function findProjectRoot(fromPath) {
1426
- let dir = dirname4(resolve4(fromPath));
1427
- while (dir !== dirname4(dir)) {
1608
+ let dir = dirname3(resolve4(fromPath));
1609
+ while (dir !== dirname3(dir)) {
1428
1610
  if (existsSync5(resolve4(dir, "package.json")) || existsSync5(resolve4(dir, "vite.config.ts")) || existsSync5(resolve4(dir, "vite.config.js"))) {
1429
1611
  return dir;
1430
1612
  }
1431
- dir = dirname4(dir);
1613
+ dir = dirname3(dir);
1432
1614
  }
1433
1615
  return process.cwd();
1434
1616
  }