@rangojs/router 0.0.0-experimental.a769fbe7 → 0.0.0-experimental.ac99d918

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 (374) hide show
  1. package/README.md +211 -43
  2. package/dist/bin/rango.js +279 -102
  3. package/dist/testing/vitest.js +82 -0
  4. package/dist/vite/index.js +3313 -1160
  5. package/dist/vite/index.js.bak +5448 -0
  6. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  7. package/package.json +62 -11
  8. package/skills/api-client/SKILL.md +211 -0
  9. package/skills/breadcrumbs/SKILL.md +63 -1
  10. package/skills/bundle-analysis/SKILL.md +159 -0
  11. package/skills/cache-guide/SKILL.md +222 -30
  12. package/skills/caching/SKILL.md +263 -8
  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 +250 -30
  18. package/skills/host-router/SKILL.md +124 -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 +223 -9
  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 +77 -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 +66 -5
  35. package/skills/router-setup/SKILL.md +38 -3
  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 +319 -27
  55. package/skills/use-cache/SKILL.md +36 -5
  56. package/skills/vercel/SKILL.md +107 -0
  57. package/skills/view-transitions/SKILL.md +294 -0
  58. package/src/__augment-tests__/augment.ts +81 -0
  59. package/src/__augment-tests__/augmented.check.ts +116 -0
  60. package/src/__internal.ts +1 -66
  61. package/src/browser/action-coordinator.ts +53 -36
  62. package/src/browser/action-fence.ts +47 -0
  63. package/src/browser/app-shell.ts +39 -0
  64. package/src/browser/app-version.ts +14 -0
  65. package/src/browser/cookie-name.ts +140 -0
  66. package/src/browser/event-controller.ts +81 -147
  67. package/src/browser/history-state.ts +21 -0
  68. package/src/browser/index.ts +3 -3
  69. package/src/browser/invalidate-client-cache.ts +52 -0
  70. package/src/browser/navigation-bridge.ts +66 -14
  71. package/src/browser/navigation-client.ts +172 -109
  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 +9 -59
  75. package/src/browser/partial-update.ts +79 -93
  76. package/src/browser/prefetch/cache.ts +180 -62
  77. package/src/browser/prefetch/fetch.ts +252 -39
  78. package/src/browser/prefetch/queue.ts +42 -8
  79. package/src/browser/rango-state.ts +158 -76
  80. package/src/browser/react/Link.tsx +72 -10
  81. package/src/browser/react/NavigationProvider.tsx +83 -31
  82. package/src/browser/react/ScrollRestoration.tsx +10 -6
  83. package/src/browser/react/context.ts +7 -2
  84. package/src/browser/react/filter-segment-order.ts +49 -7
  85. package/src/browser/react/index.ts +0 -48
  86. package/src/browser/react/location-state-shared.ts +166 -8
  87. package/src/browser/react/location-state.ts +39 -14
  88. package/src/browser/react/use-action.ts +6 -15
  89. package/src/browser/react/use-handle.ts +23 -69
  90. package/src/browser/react/use-link-status.ts +0 -4
  91. package/src/browser/react/use-navigation.ts +22 -5
  92. package/src/browser/react/use-params.ts +20 -10
  93. package/src/browser/react/use-reverse.ts +106 -0
  94. package/src/browser/react/use-router.ts +46 -11
  95. package/src/browser/react/use-search-params.ts +0 -5
  96. package/src/browser/react/use-segments.ts +11 -21
  97. package/src/browser/response-adapter.ts +52 -1
  98. package/src/browser/rsc-router.tsx +111 -24
  99. package/src/browser/scroll-restoration.ts +29 -19
  100. package/src/browser/segment-reconciler.ts +36 -14
  101. package/src/browser/segment-structure-assert.ts +2 -2
  102. package/src/browser/server-action-bridge.ts +176 -62
  103. package/src/browser/types.ts +60 -11
  104. package/src/browser/validate-redirect-origin.ts +43 -16
  105. package/src/build/collect-fallback-refs.ts +107 -0
  106. package/src/build/generate-manifest.ts +65 -40
  107. package/src/build/generate-route-types.ts +6 -0
  108. package/src/build/index.ts +8 -2
  109. package/src/build/prefix-tree-utils.ts +123 -0
  110. package/src/build/route-trie.ts +137 -32
  111. package/src/build/route-types/codegen.ts +4 -4
  112. package/src/build/route-types/include-resolution.ts +9 -2
  113. package/src/build/route-types/param-extraction.ts +6 -3
  114. package/src/build/route-types/per-module-writer.ts +7 -4
  115. package/src/build/route-types/router-processing.ts +333 -94
  116. package/src/build/route-types/scan-filter.ts +9 -2
  117. package/src/build/route-types/source-scan.ts +118 -0
  118. package/src/build/runtime-discovery.ts +9 -20
  119. package/src/cache/cache-error.ts +104 -0
  120. package/src/cache/cache-policy.ts +68 -28
  121. package/src/cache/cache-runtime.ts +134 -32
  122. package/src/cache/cache-scope.ts +100 -74
  123. package/src/cache/cache-tag.ts +98 -0
  124. package/src/cache/cf/cf-cache-store.ts +2256 -241
  125. package/src/cache/cf/index.ts +6 -16
  126. package/src/cache/document-cache.ts +61 -20
  127. package/src/cache/handle-snapshot.ts +63 -0
  128. package/src/cache/index.ts +22 -20
  129. package/src/cache/memory-segment-store.ts +136 -37
  130. package/src/cache/profile-registry.ts +6 -30
  131. package/src/cache/read-through-swr.ts +41 -11
  132. package/src/cache/segment-codec.ts +0 -16
  133. package/src/cache/tag-invalidation.ts +230 -0
  134. package/src/cache/types.ts +33 -100
  135. package/src/cache/vercel/index.ts +11 -0
  136. package/src/cache/vercel/vercel-cache-store.ts +799 -0
  137. package/src/client.rsc.tsx +6 -21
  138. package/src/client.tsx +108 -290
  139. package/src/component-utils.ts +19 -0
  140. package/src/context-var.ts +17 -5
  141. package/src/decode-loader-results.ts +36 -0
  142. package/src/defer.ts +196 -0
  143. package/src/deps/browser.ts +0 -1
  144. package/src/deps/ssr.ts +0 -1
  145. package/src/errors.ts +30 -4
  146. package/src/handle.ts +70 -22
  147. package/src/handles/MetaTags.tsx +0 -14
  148. package/src/handles/breadcrumbs.ts +16 -5
  149. package/src/handles/meta.ts +0 -39
  150. package/src/host/cookie-handler.ts +0 -36
  151. package/src/host/errors.ts +0 -24
  152. package/src/host/index.ts +8 -2
  153. package/src/host/pattern-matcher.ts +7 -50
  154. package/src/host/router.ts +107 -99
  155. package/src/host/testing.ts +40 -27
  156. package/src/host/types.ts +37 -4
  157. package/src/host/utils.ts +1 -1
  158. package/src/href-client.ts +137 -22
  159. package/src/index.rsc.ts +69 -10
  160. package/src/index.ts +112 -14
  161. package/src/internal-debug.ts +2 -4
  162. package/src/loader-store.ts +500 -0
  163. package/src/loader.rsc.ts +20 -13
  164. package/src/loader.ts +12 -11
  165. package/src/missing-id-error.ts +68 -0
  166. package/src/network-error-thrower.tsx +1 -6
  167. package/src/outlet-context.ts +1 -1
  168. package/src/outlet-provider.tsx +1 -5
  169. package/src/prerender/param-hash.ts +10 -11
  170. package/src/prerender/store.ts +37 -41
  171. package/src/prerender.ts +198 -82
  172. package/src/redirect-origin.ts +100 -0
  173. package/src/response-utils.ts +37 -0
  174. package/src/reverse.ts +65 -15
  175. package/src/root-error-boundary.tsx +1 -19
  176. package/src/route-content-wrapper.tsx +7 -72
  177. package/src/route-definition/dsl-helpers.ts +413 -275
  178. package/src/route-definition/helper-factories.ts +29 -139
  179. package/src/route-definition/helpers-types.ts +107 -32
  180. package/src/route-definition/index.ts +3 -0
  181. package/src/route-definition/redirect.ts +50 -8
  182. package/src/route-definition/resolve-handler-use.ts +161 -0
  183. package/src/route-definition/use-item-types.ts +32 -0
  184. package/src/route-map-builder.ts +0 -16
  185. package/src/route-types.ts +37 -41
  186. package/src/router/basename.ts +14 -0
  187. package/src/router/content-negotiation.ts +108 -9
  188. package/src/router/error-handling.ts +13 -17
  189. package/src/router/find-match.ts +44 -23
  190. package/src/router/handler-context.ts +46 -30
  191. package/src/router/intercept-resolution.ts +23 -23
  192. package/src/router/lazy-includes.ts +15 -52
  193. package/src/router/loader-resolution.ts +207 -30
  194. package/src/router/logging.ts +0 -6
  195. package/src/router/manifest.ts +40 -42
  196. package/src/router/match-api.ts +120 -204
  197. package/src/router/match-context.ts +0 -22
  198. package/src/router/match-handlers.ts +58 -58
  199. package/src/router/match-middleware/background-revalidation.ts +0 -7
  200. package/src/router/match-middleware/cache-lookup.ts +161 -262
  201. package/src/router/match-middleware/cache-store.ts +3 -33
  202. package/src/router/match-middleware/intercept-resolution.ts +0 -22
  203. package/src/router/match-middleware/segment-resolution.ts +45 -14
  204. package/src/router/match-pipelines.ts +1 -42
  205. package/src/router/match-result.ts +87 -39
  206. package/src/router/metrics.ts +0 -34
  207. package/src/router/middleware-types.ts +7 -140
  208. package/src/router/middleware.ts +169 -140
  209. package/src/router/navigation-snapshot.ts +131 -0
  210. package/src/router/params-util.ts +23 -0
  211. package/src/router/pattern-matching.ts +109 -63
  212. package/src/router/prerender-match.ts +190 -54
  213. package/src/router/preview-match.ts +32 -102
  214. package/src/router/request-classification.ts +276 -0
  215. package/src/router/revalidation.ts +63 -55
  216. package/src/router/route-snapshot.ts +244 -0
  217. package/src/router/router-context.ts +0 -27
  218. package/src/router/router-interfaces.ts +100 -35
  219. package/src/router/router-options.ts +91 -11
  220. package/src/router/router-registry.ts +2 -5
  221. package/src/router/segment-resolution/fresh.ts +119 -65
  222. package/src/router/segment-resolution/helpers.ts +34 -0
  223. package/src/router/segment-resolution/loader-cache.ts +40 -37
  224. package/src/router/segment-resolution/revalidation.ts +329 -305
  225. package/src/router/segment-resolution/static-store.ts +19 -5
  226. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  227. package/src/router/segment-resolution/view-transition-default.ts +36 -0
  228. package/src/router/segment-resolution.ts +4 -1
  229. package/src/router/segment-wrappers.ts +0 -3
  230. package/src/router/state-cookie-name.ts +33 -0
  231. package/src/router/substitute-pattern-params.ts +56 -0
  232. package/src/router/telemetry-otel.ts +0 -20
  233. package/src/router/telemetry.ts +96 -19
  234. package/src/router/timeout.ts +0 -20
  235. package/src/router/trie-matching.ts +91 -46
  236. package/src/router/types.ts +9 -63
  237. package/src/router/url-params.ts +44 -0
  238. package/src/router.ts +128 -42
  239. package/src/rsc/handler-context.ts +3 -2
  240. package/src/rsc/handler.ts +492 -409
  241. package/src/rsc/helpers.ts +162 -46
  242. package/src/rsc/index.ts +1 -1
  243. package/src/rsc/json-route-result.ts +38 -0
  244. package/src/rsc/loader-fetch.ts +18 -3
  245. package/src/rsc/manifest-init.ts +33 -42
  246. package/src/rsc/origin-guard.ts +39 -25
  247. package/src/rsc/progressive-enhancement.ts +28 -4
  248. package/src/rsc/redirect-guard.ts +99 -0
  249. package/src/rsc/response-error.ts +79 -12
  250. package/src/rsc/response-route-handler.ts +90 -63
  251. package/src/rsc/rsc-rendering.ts +53 -56
  252. package/src/rsc/runtime-warnings.ts +23 -10
  253. package/src/rsc/server-action.ts +74 -69
  254. package/src/rsc/ssr-setup.ts +18 -2
  255. package/src/rsc/types.ts +22 -9
  256. package/src/runtime-env.ts +18 -0
  257. package/src/search-params.ts +4 -20
  258. package/src/segment-content-promise.ts +67 -0
  259. package/src/segment-loader-promise.ts +134 -0
  260. package/src/segment-system.tsx +208 -201
  261. package/src/serialize.ts +243 -0
  262. package/src/server/context.ts +211 -52
  263. package/src/server/cookie-store.ts +80 -5
  264. package/src/server/handle-store.ts +26 -24
  265. package/src/server/loader-registry.ts +10 -28
  266. package/src/server/request-context.ts +289 -124
  267. package/src/ssr/index.tsx +22 -15
  268. package/src/static-handler.ts +27 -18
  269. package/src/testing/cache-status.ts +162 -0
  270. package/src/testing/collect-handle.ts +40 -0
  271. package/src/testing/dispatch.ts +618 -0
  272. package/src/testing/dom.entry.ts +22 -0
  273. package/src/testing/e2e/fixture.ts +188 -0
  274. package/src/testing/e2e/index.ts +128 -0
  275. package/src/testing/e2e/matchers.ts +35 -0
  276. package/src/testing/e2e/page-helpers.ts +272 -0
  277. package/src/testing/e2e/parity.ts +387 -0
  278. package/src/testing/e2e/server.ts +195 -0
  279. package/src/testing/flight-matchers.ts +97 -0
  280. package/src/testing/flight-normalize.ts +11 -0
  281. package/src/testing/flight-runtime.d.ts +57 -0
  282. package/src/testing/flight-tree.ts +682 -0
  283. package/src/testing/flight.entry.ts +52 -0
  284. package/src/testing/flight.ts +232 -0
  285. package/src/testing/generated-routes.ts +183 -0
  286. package/src/testing/index.ts +99 -0
  287. package/src/testing/internal/context.ts +348 -0
  288. package/src/testing/internal/flight-client-globals.ts +30 -0
  289. package/src/testing/internal/seed-vars.ts +54 -0
  290. package/src/testing/render-handler.ts +330 -0
  291. package/src/testing/render-route.tsx +566 -0
  292. package/src/testing/run-loader.ts +378 -0
  293. package/src/testing/run-middleware.ts +205 -0
  294. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  295. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  296. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  297. package/src/testing/vitest-stubs/version.ts +5 -0
  298. package/src/testing/vitest.ts +305 -0
  299. package/src/theme/ThemeProvider.tsx +0 -52
  300. package/src/theme/ThemeScript.tsx +0 -6
  301. package/src/theme/constants.ts +0 -12
  302. package/src/theme/index.ts +0 -7
  303. package/src/theme/theme-context.ts +1 -5
  304. package/src/theme/theme-script.ts +0 -14
  305. package/src/theme/use-theme.ts +0 -3
  306. package/src/types/boundaries.ts +0 -35
  307. package/src/types/cache-types.ts +17 -8
  308. package/src/types/error-types.ts +30 -90
  309. package/src/types/global-namespace.ts +54 -41
  310. package/src/types/handler-context.ts +124 -70
  311. package/src/types/index.ts +1 -10
  312. package/src/types/loader-types.ts +40 -11
  313. package/src/types/request-scope.ts +107 -0
  314. package/src/types/route-config.ts +6 -50
  315. package/src/types/route-entry.ts +12 -7
  316. package/src/types/segments.ts +36 -15
  317. package/src/urls/include-helper.ts +33 -70
  318. package/src/urls/index.ts +1 -11
  319. package/src/urls/path-helper-types.ts +58 -11
  320. package/src/urls/path-helper.ts +57 -111
  321. package/src/urls/pattern-types.ts +48 -19
  322. package/src/urls/response-types.ts +25 -22
  323. package/src/urls/type-extraction.ts +58 -139
  324. package/src/urls/urls-function.ts +1 -18
  325. package/src/use-loader.tsx +346 -89
  326. package/src/vite/debug.ts +185 -0
  327. package/src/vite/discovery/bundle-postprocess.ts +36 -38
  328. package/src/vite/discovery/discover-routers.ts +130 -85
  329. package/src/vite/discovery/discovery-errors.ts +194 -0
  330. package/src/vite/discovery/gate-state.ts +171 -0
  331. package/src/vite/discovery/prerender-collection.ts +192 -99
  332. package/src/vite/discovery/route-types-writer.ts +40 -84
  333. package/src/vite/discovery/self-gen-tracking.ts +27 -1
  334. package/src/vite/discovery/state.ts +51 -4
  335. package/src/vite/discovery/virtual-module-codegen.ts +14 -34
  336. package/src/vite/index.ts +8 -0
  337. package/src/vite/plugin-types.ts +236 -6
  338. package/src/vite/plugins/cjs-to-esm.ts +8 -18
  339. package/src/vite/plugins/client-ref-dedup.ts +16 -11
  340. package/src/vite/plugins/client-ref-hashing.ts +28 -15
  341. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  342. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  343. package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
  344. package/src/vite/plugins/expose-action-id.ts +48 -95
  345. package/src/vite/plugins/expose-id-utils.ts +11 -50
  346. package/src/vite/plugins/expose-ids/export-analysis.ts +76 -34
  347. package/src/vite/plugins/expose-ids/handler-transform.ts +10 -48
  348. package/src/vite/plugins/expose-ids/loader-transform.ts +3 -20
  349. package/src/vite/plugins/expose-ids/router-transform.ts +20 -16
  350. package/src/vite/plugins/expose-internal-ids.ts +554 -317
  351. package/src/vite/plugins/performance-tracks.ts +65 -207
  352. package/src/vite/plugins/refresh-cmd.ts +89 -27
  353. package/src/vite/plugins/use-cache-transform.ts +73 -83
  354. package/src/vite/plugins/vercel-output.ts +258 -0
  355. package/src/vite/plugins/version-injector.ts +21 -25
  356. package/src/vite/plugins/version-plugin.ts +32 -23
  357. package/src/vite/plugins/virtual-entries.ts +46 -17
  358. package/src/vite/rango.ts +207 -125
  359. package/src/vite/router-discovery.ts +931 -133
  360. package/src/vite/utils/ast-handler-extract.ts +15 -31
  361. package/src/vite/utils/banner.ts +1 -1
  362. package/src/vite/utils/bundle-analysis.ts +10 -15
  363. package/src/vite/utils/client-chunks.ts +184 -0
  364. package/src/vite/utils/forward-user-plugins.ts +171 -0
  365. package/src/vite/utils/manifest-utils.ts +4 -59
  366. package/src/vite/utils/package-resolution.ts +20 -52
  367. package/src/vite/utils/prerender-utils.ts +27 -29
  368. package/src/vite/utils/shared-utils.ts +97 -44
  369. package/src/browser/action-response-classifier.ts +0 -99
  370. package/src/browser/debug-channel.ts +0 -93
  371. package/src/browser/react/use-client-cache.ts +0 -58
  372. package/src/browser/shallow.ts +0 -40
  373. package/src/handles/index.ts +0 -7
  374. 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,
@@ -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
  }
@@ -627,7 +704,7 @@ function findRouterFilesRecursive(dir, filter, results) {
627
704
  if (filter && !filter(fullPath)) continue;
628
705
  try {
629
706
  const source = readFileSync3(fullPath, "utf-8");
630
- if (ROUTER_CALL_PATTERN.test(source)) {
707
+ if (ROUTER_CALL_PATTERN.test(source) && firstCodeMatchIndex(source, ROUTER_CALL_PATTERN_G) >= 0) {
631
708
  routerFilesInDir.push(fullPath);
632
709
  }
633
710
  } catch {
@@ -665,13 +742,13 @@ function findNestedRouterConflict(routerFiles) {
665
742
  }
666
743
  return null;
667
744
  }
668
- function formatNestedRouterConflictError(conflict, prefix = "[rsc-router]") {
745
+ function formatNestedRouterConflictError(conflict, prefix = "[rango]") {
669
746
  return `${prefix} Nested router roots are not supported.
670
747
  Router root: ${conflict.ancestor}
671
748
  Nested router: ${conflict.nested}
672
749
  Move the nested router into a sibling directory or configure it as a separate app root.`;
673
750
  }
674
- function extractUrlsVariableFromRouter(code) {
751
+ function extractUrlsFromRouter(code) {
675
752
  const sourceFile = ts5.createSourceFile(
676
753
  "router.tsx",
677
754
  code,
@@ -685,24 +762,70 @@ function extractUrlsVariableFromRouter(code) {
685
762
  const callee = node.expression;
686
763
  return ts5.isIdentifier(callee) && callee.text === "createRouter";
687
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
+ }
688
777
  function visit(node) {
689
778
  if (result) return;
690
- if (ts5.isCallExpression(node) && ts5.isPropertyAccessExpression(node.expression) && node.expression.name.text === "routes" && node.arguments.length >= 1 && ts5.isIdentifier(node.arguments[0])) {
691
- let inner = node.expression.expression;
692
- while (ts5.isCallExpression(inner) && ts5.isPropertyAccessExpression(inner.expression)) {
693
- inner = inner.expression.expression;
694
- }
695
- if (isCreateRouterCall(inner)) {
696
- result = node.arguments[0].text;
697
- 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) };
698
785
  }
786
+ return;
699
787
  }
700
788
  if (isCreateRouterCall(node)) {
701
789
  const callExpr = node;
702
- 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) {
703
826
  if (ts5.isObjectLiteralExpression(arg)) {
704
827
  for (const prop of arg.properties) {
705
- 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)) {
706
829
  result = prop.initializer.text;
707
830
  return;
708
831
  }
@@ -715,6 +838,38 @@ function extractUrlsVariableFromRouter(code) {
715
838
  visit(sourceFile);
716
839
  return result;
717
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
+ }
718
873
  function buildCombinedRouteMapForRouterFile(routerFilePath) {
719
874
  let routerSource;
720
875
  try {
@@ -722,19 +877,40 @@ function buildCombinedRouteMapForRouterFile(routerFilePath) {
722
877
  } catch {
723
878
  return { routes: {}, searchSchemas: {} };
724
879
  }
725
- const urlsVarName = extractUrlsVariableFromRouter(routerSource);
726
- if (!urlsVarName) {
880
+ const extraction = extractUrlsFromRouter(routerSource);
881
+ if (!extraction) {
727
882
  return { routes: {}, searchSchemas: {} };
728
883
  }
729
- const imported = resolveImportedVariable(routerSource, urlsVarName);
730
- if (imported) {
731
- const targetFile = resolveImportPath(imported.specifier, routerFilePath);
732
- if (!targetFile) {
733
- 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);
734
908
  }
735
- return buildCombinedRouteMapWithSearch(targetFile, imported.exportedName);
736
909
  }
737
- return buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
910
+ if (basename) {
911
+ result = applyBasenameToRoutes(result, basename);
912
+ }
913
+ return result;
738
914
  }
739
915
  function detectUnresolvableIncludes(routerFilePath) {
740
916
  const realPath = resolve2(routerFilePath);
@@ -744,9 +920,20 @@ function detectUnresolvableIncludes(routerFilePath) {
744
920
  } catch {
745
921
  return [];
746
922
  }
747
- const urlsVarName = extractUrlsVariableFromRouter(source);
748
- if (!urlsVarName) return [];
749
- 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);
750
937
  let targetFile;
751
938
  let exportedName;
752
939
  if (imported) {
@@ -766,9 +953,8 @@ function detectUnresolvableIncludes(routerFilePath) {
766
953
  exportedName = imported.exportedName;
767
954
  } else {
768
955
  targetFile = realPath;
769
- exportedName = urlsVarName;
956
+ exportedName = extraction.name;
770
957
  }
771
- const diagnostics = [];
772
958
  buildCombinedRouteMapWithSearch(
773
959
  targetFile,
774
960
  exportedName,
@@ -804,7 +990,7 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
804
990
  if (existsSync3(oldCombinedPath)) {
805
991
  unlinkSync(oldCombinedPath);
806
992
  console.log(
807
- `[rsc-router] Removed stale combined route types: ${oldCombinedPath}`
993
+ `[rango] Removed stale combined route types: ${oldCombinedPath}`
808
994
  );
809
995
  }
810
996
  } catch {
@@ -816,38 +1002,22 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
816
1002
  throw new Error(formatNestedRouterConflictError(nestedRouterConflict));
817
1003
  }
818
1004
  for (const routerFilePath of routerFilePaths) {
819
- let routerSource;
820
- try {
821
- routerSource = readFileSync3(routerFilePath, "utf-8");
822
- } catch {
823
- continue;
824
- }
825
- const urlsVarName = extractUrlsVariableFromRouter(routerSource);
826
- if (!urlsVarName) continue;
827
- let result;
828
- const imported = resolveImportedVariable(routerSource, urlsVarName);
829
- if (imported) {
830
- const targetFile = resolveImportPath(imported.specifier, routerFilePath);
831
- if (!targetFile) continue;
832
- result = buildCombinedRouteMapWithSearch(
833
- targetFile,
834
- imported.exportedName
835
- );
836
- } else {
837
- 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;
838
1014
  }
839
- const routerBasename = pathBasename(routerFilePath).replace(
840
- /\.(tsx?|jsx?)$/,
841
- ""
842
- );
843
- const outPath = join2(
844
- dirname2(routerFilePath),
845
- `${routerBasename}.named-routes.gen.ts`
846
- );
1015
+ const outPath = genFileTsPath(routerFilePath);
847
1016
  const existing = existsSync3(outPath) ? readFileSync3(outPath, "utf-8") : null;
848
1017
  if (Object.keys(result.routes).length === 0) {
849
1018
  if (!existing) {
850
1019
  const emptySource = generateRouteTypesSource({});
1020
+ opts?.onWrite?.(outPath, emptySource);
851
1021
  writeFileSync2(outPath, emptySource);
852
1022
  }
853
1023
  continue;
@@ -867,22 +1037,25 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
867
1037
  continue;
868
1038
  }
869
1039
  }
1040
+ opts?.onWrite?.(outPath, source);
870
1041
  writeFileSync2(outPath, source);
871
1042
  console.log(
872
- `[rsc-router] Generated route types (${Object.keys(result.routes).length} routes) -> ${outPath}`
1043
+ `[rango] Generated route types (${Object.keys(result.routes).length} routes) -> ${outPath}`
873
1044
  );
874
1045
  }
875
1046
  }
876
1047
  }
877
- var ROUTER_CALL_PATTERN;
1048
+ var ROUTER_CALL_PATTERN, ROUTER_CALL_PATTERN_G;
878
1049
  var init_router_processing = __esm({
879
1050
  "src/build/route-types/router-processing.ts"() {
880
1051
  "use strict";
881
1052
  init_codegen();
1053
+ init_source_scan();
882
1054
  init_include_resolution();
883
1055
  init_per_module_writer();
884
1056
  init_route_name();
885
1057
  ROUTER_CALL_PATTERN = /\bcreateRouter\s*[<(]/;
1058
+ ROUTER_CALL_PATTERN_G = /\bcreateRouter\s*[<(]/g;
886
1059
  }
887
1060
  });
888
1061
 
@@ -920,7 +1093,7 @@ import {
920
1093
  import { createElement, StrictMode } from "react";
921
1094
  import { hydrateRoot } from "react-dom/client";
922
1095
  import { rscStream } from "@rangojs/router/internal/deps/html-stream-client";
923
- import { initBrowserApp, RSCRouter } from "@rangojs/router/browser";
1096
+ import { initBrowserApp, Rango } from "@rangojs/router/browser";
924
1097
 
925
1098
  async function initializeApp() {
926
1099
  const deps = {
@@ -935,7 +1108,7 @@ async function initializeApp() {
935
1108
 
936
1109
  hydrateRoot(
937
1110
  document,
938
- createElement(StrictMode, null, createElement(RSCRouter))
1111
+ createElement(StrictMode, null, createElement(Rango))
939
1112
  );
940
1113
  }
941
1114
 
@@ -967,7 +1140,8 @@ export const renderHTML = createSSRHandler({
967
1140
  // src/vite/plugins/version-plugin.ts
968
1141
  var version_plugin_exports = {};
969
1142
  __export(version_plugin_exports, {
970
- createVersionPlugin: () => createVersionPlugin
1143
+ createVersionPlugin: () => createVersionPlugin,
1144
+ isViteDepCachePath: () => isViteDepCachePath
971
1145
  });
972
1146
  import { parseAst } from "vite";
973
1147
  function isCodeModule(id) {
@@ -979,7 +1153,7 @@ function normalizeModuleId(id) {
979
1153
  function getClientModuleSignature(source) {
980
1154
  let program;
981
1155
  try {
982
- program = parseAst(source, { jsx: true });
1156
+ program = parseAst(source, { lang: "tsx" });
983
1157
  } catch {
984
1158
  return void 0;
985
1159
  }
@@ -1062,11 +1236,12 @@ function createVersionPlugin() {
1062
1236
  let currentVersion = buildVersion;
1063
1237
  let isDev = false;
1064
1238
  let server = null;
1239
+ let resolvedCacheDir;
1065
1240
  const clientModuleSignatures = /* @__PURE__ */ new Map();
1066
1241
  let versionCounter = 0;
1067
1242
  const bumpVersion = (reason) => {
1068
1243
  currentVersion = Date.now().toString(16) + String(++versionCounter);
1069
- console.log(`[rsc-router] ${reason}, version updated: ${currentVersion}`);
1244
+ console.log(`[rango] ${reason}, version updated: ${currentVersion}`);
1070
1245
  const rscEnv = server?.environments?.rsc;
1071
1246
  const versionMod = rscEnv?.moduleGraph?.getModuleById(
1072
1247
  "\0" + VIRTUAL_IDS.version
@@ -1080,6 +1255,7 @@ function createVersionPlugin() {
1080
1255
  enforce: "pre",
1081
1256
  configResolved(config) {
1082
1257
  isDev = config.command === "serve";
1258
+ resolvedCacheDir = config.cacheDir ? String(config.cacheDir).replace(/\\/g, "/") : void 0;
1083
1259
  },
1084
1260
  configureServer(devServer) {
1085
1261
  server = devServer;
@@ -1116,11 +1292,11 @@ function createVersionPlugin() {
1116
1292
  }
1117
1293
  return null;
1118
1294
  },
1119
- // Track RSC module changes and update version
1120
1295
  async hotUpdate(ctx) {
1121
1296
  if (!isDev) return;
1122
1297
  const isRscModule = this.environment?.name === "rsc";
1123
1298
  if (!isRscModule) return;
1299
+ if (isViteDepCachePath(ctx.file, resolvedCacheDir)) return;
1124
1300
  if (ctx.modules.length === 1 && ctx.modules[0].id === "\0" + VIRTUAL_IDS.version) {
1125
1301
  return;
1126
1302
  }
@@ -1150,6 +1326,17 @@ function createVersionPlugin() {
1150
1326
  }
1151
1327
  };
1152
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
+ }
1153
1340
  var init_version_plugin = __esm({
1154
1341
  "src/vite/plugins/version-plugin.ts"() {
1155
1342
  "use strict";
@@ -1195,7 +1382,7 @@ var runtime_discovery_exports = {};
1195
1382
  __export(runtime_discovery_exports, {
1196
1383
  discoverAndWriteRouteTypes: () => discoverAndWriteRouteTypes
1197
1384
  });
1198
- import { dirname as dirname3, join as join3, basename, resolve as resolve3 } from "node:path";
1385
+ import { resolve as resolve3 } from "node:path";
1199
1386
  import { existsSync as existsSync4, readFileSync as readFileSync4, writeFileSync as writeFileSync3 } from "node:fs";
1200
1387
  async function discoverAndWriteRouteTypes(opts) {
1201
1388
  let createViteServer;
@@ -1305,22 +1492,12 @@ This means createRouter() stack trace parsing matched an internal frame.
1305
1492
  Set an explicit \`id\` on createRouter() or check the call site.`
1306
1493
  );
1307
1494
  }
1308
- if (!routeSearchSchemas || Object.keys(routeSearchSchemas).length === 0) {
1309
- const staticParsed = buildCombinedRouteMapForRouterFile(sourceFile);
1310
- if (Object.keys(staticParsed.searchSchemas).length > 0) {
1311
- const filtered = {};
1312
- for (const name of Object.keys(routeManifest)) {
1313
- const schema = staticParsed.searchSchemas[name];
1314
- if (schema) filtered[name] = schema;
1315
- }
1316
- if (Object.keys(filtered).length > 0) {
1317
- routeSearchSchemas = filtered;
1318
- }
1319
- }
1320
- }
1321
- const routerDir = dirname3(sourceFile);
1322
- const routerBasename = basename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
1323
- 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);
1324
1501
  const source = generateRouteTypesSource(
1325
1502
  routeManifest,
1326
1503
  routeSearchSchemas && Object.keys(routeSearchSchemas).length > 0 ? routeSearchSchemas : void 0
@@ -1357,7 +1534,7 @@ var init_runtime_discovery = __esm({
1357
1534
 
1358
1535
  // src/bin/rango.ts
1359
1536
  init_generate_route_types();
1360
- import { resolve as resolve4, dirname as dirname4 } from "node:path";
1537
+ import { resolve as resolve4, dirname as dirname3 } from "node:path";
1361
1538
  import { readFileSync as readFileSync5, statSync, existsSync as existsSync5 } from "node:fs";
1362
1539
  var [command, ...rawArgs] = process.argv.slice(2);
1363
1540
  if (command === "generate") {
@@ -1428,12 +1605,12 @@ Examples:
1428
1605
  );
1429
1606
  }
1430
1607
  function findProjectRoot(fromPath) {
1431
- let dir = dirname4(resolve4(fromPath));
1432
- while (dir !== dirname4(dir)) {
1608
+ let dir = dirname3(resolve4(fromPath));
1609
+ while (dir !== dirname3(dir)) {
1433
1610
  if (existsSync5(resolve4(dir, "package.json")) || existsSync5(resolve4(dir, "vite.config.ts")) || existsSync5(resolve4(dir, "vite.config.js"))) {
1434
1611
  return dir;
1435
1612
  }
1436
- dir = dirname4(dir);
1613
+ dir = dirname3(dir);
1437
1614
  }
1438
1615
  return process.cwd();
1439
1616
  }