@rangojs/router 0.0.0-experimental.9c9afef3 → 0.0.0-experimental.9eb4192e

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 (955) hide show
  1. package/README.md +126 -38
  2. package/dist/bin/rango.js +130 -47
  3. package/dist/vite/index.js +1543 -574
  4. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  5. package/package.json +7 -5
  6. package/skills/breadcrumbs/SKILL.md +3 -1
  7. package/skills/handler-use/SKILL.md +362 -0
  8. package/skills/hooks/SKILL.md +28 -20
  9. package/skills/intercept/SKILL.md +20 -0
  10. package/skills/layout/SKILL.md +22 -0
  11. package/skills/links/SKILL.md +91 -17
  12. package/skills/loader/SKILL.md +35 -2
  13. package/skills/middleware/SKILL.md +34 -3
  14. package/skills/migrate-nextjs/SKILL.md +560 -0
  15. package/skills/migrate-react-router/SKILL.md +765 -0
  16. package/skills/parallel/SKILL.md +59 -0
  17. package/skills/prerender/SKILL.md +110 -68
  18. package/skills/rango/SKILL.md +24 -22
  19. package/skills/response-routes/SKILL.md +8 -0
  20. package/skills/route/SKILL.md +24 -0
  21. package/skills/router-setup/SKILL.md +35 -0
  22. package/skills/streams-and-websockets/SKILL.md +283 -0
  23. package/skills/typesafety/SKILL.md +3 -1
  24. package/src/__internal.ts +1 -1
  25. package/src/browser/app-shell.ts +52 -0
  26. package/src/browser/app-version.ts +14 -0
  27. package/src/browser/navigation-bridge.ts +87 -6
  28. package/src/browser/navigation-client.ts +128 -68
  29. package/src/browser/navigation-store.ts +68 -9
  30. package/src/browser/partial-update.ts +60 -7
  31. package/src/browser/prefetch/cache.ts +129 -21
  32. package/src/browser/prefetch/fetch.ts +156 -18
  33. package/src/browser/prefetch/queue.ts +36 -5
  34. package/src/browser/rango-state.ts +53 -13
  35. package/src/browser/react/Link.tsx +72 -8
  36. package/src/browser/react/NavigationProvider.tsx +57 -11
  37. package/src/browser/react/context.ts +7 -2
  38. package/src/browser/react/use-handle.ts +9 -58
  39. package/src/browser/react/use-navigation.ts +22 -2
  40. package/src/browser/react/use-params.ts +11 -1
  41. package/src/browser/react/use-router.ts +29 -9
  42. package/src/browser/rsc-router.tsx +60 -9
  43. package/src/browser/scroll-restoration.ts +10 -8
  44. package/src/browser/segment-reconciler.ts +36 -14
  45. package/src/browser/server-action-bridge.ts +8 -17
  46. package/src/browser/types.ts +37 -5
  47. package/src/build/generate-manifest.ts +6 -6
  48. package/src/build/generate-route-types.ts +3 -0
  49. package/src/build/route-trie.ts +50 -24
  50. package/src/build/route-types/include-resolution.ts +8 -1
  51. package/src/build/route-types/router-processing.ts +211 -72
  52. package/src/build/route-types/scan-filter.ts +8 -1
  53. package/src/cache/cf/cf-cache-store.ts +5 -7
  54. package/src/client.tsx +84 -230
  55. package/src/handle.ts +40 -0
  56. package/src/index.rsc.ts +6 -1
  57. package/src/index.ts +49 -6
  58. package/src/outlet-context.ts +1 -1
  59. package/src/prerender/store.ts +5 -4
  60. package/src/prerender.ts +138 -77
  61. package/src/response-utils.ts +28 -0
  62. package/src/reverse.ts +27 -2
  63. package/src/route-definition/dsl-helpers.ts +210 -35
  64. package/src/route-definition/helpers-types.ts +61 -14
  65. package/src/route-definition/index.ts +3 -0
  66. package/src/route-definition/redirect.ts +9 -1
  67. package/src/route-definition/resolve-handler-use.ts +155 -0
  68. package/src/route-types.ts +18 -0
  69. package/src/router/content-negotiation.ts +100 -1
  70. package/src/router/handler-context.ts +70 -17
  71. package/src/router/intercept-resolution.ts +9 -4
  72. package/src/router/lazy-includes.ts +6 -6
  73. package/src/router/loader-resolution.ts +153 -21
  74. package/src/router/manifest.ts +22 -13
  75. package/src/router/match-api.ts +127 -192
  76. package/src/router/match-middleware/cache-lookup.ts +28 -8
  77. package/src/router/match-middleware/segment-resolution.ts +53 -0
  78. package/src/router/match-result.ts +82 -4
  79. package/src/router/middleware-types.ts +2 -28
  80. package/src/router/middleware.ts +32 -7
  81. package/src/router/navigation-snapshot.ts +182 -0
  82. package/src/router/pattern-matching.ts +60 -9
  83. package/src/router/prerender-match.ts +110 -10
  84. package/src/router/preview-match.ts +30 -102
  85. package/src/router/request-classification.ts +310 -0
  86. package/src/router/route-snapshot.ts +245 -0
  87. package/src/router/router-interfaces.ts +36 -4
  88. package/src/router/router-options.ts +37 -11
  89. package/src/router/segment-resolution/fresh.ts +70 -5
  90. package/src/router/segment-resolution/revalidation.ts +87 -9
  91. package/src/router/trie-matching.ts +10 -4
  92. package/src/router/url-params.ts +49 -0
  93. package/src/router.ts +54 -7
  94. package/src/rsc/handler.ts +478 -395
  95. package/src/rsc/helpers.ts +69 -41
  96. package/src/rsc/loader-fetch.ts +18 -3
  97. package/src/rsc/manifest-init.ts +5 -1
  98. package/src/rsc/progressive-enhancement.ts +14 -3
  99. package/src/rsc/response-route-handler.ts +14 -1
  100. package/src/rsc/rsc-rendering.ts +15 -2
  101. package/src/rsc/server-action.ts +10 -2
  102. package/src/rsc/ssr-setup.ts +2 -2
  103. package/src/rsc/types.ts +6 -4
  104. package/src/segment-content-promise.ts +67 -0
  105. package/src/segment-loader-promise.ts +122 -0
  106. package/src/segment-system.tsx +11 -61
  107. package/src/server/context.ts +65 -5
  108. package/src/server/handle-store.ts +19 -0
  109. package/src/server/loader-registry.ts +9 -8
  110. package/src/server/request-context.ts +142 -55
  111. package/src/ssr/index.tsx +3 -0
  112. package/src/static-handler.ts +18 -6
  113. package/src/types/cache-types.ts +4 -4
  114. package/src/types/handler-context.ts +17 -43
  115. package/src/types/loader-types.ts +37 -11
  116. package/src/types/request-scope.ts +126 -0
  117. package/src/types/route-entry.ts +12 -1
  118. package/src/types/segments.ts +1 -1
  119. package/src/urls/include-helper.ts +24 -14
  120. package/src/urls/path-helper-types.ts +39 -6
  121. package/src/urls/path-helper.ts +47 -12
  122. package/src/urls/pattern-types.ts +12 -0
  123. package/src/urls/response-types.ts +18 -16
  124. package/src/use-loader.tsx +77 -5
  125. package/src/vite/debug.ts +140 -0
  126. package/src/vite/discovery/bundle-postprocess.ts +30 -33
  127. package/src/vite/discovery/discover-routers.ts +36 -4
  128. package/src/vite/discovery/prerender-collection.ts +175 -74
  129. package/src/vite/discovery/state.ts +13 -4
  130. package/src/vite/index.ts +4 -0
  131. package/src/vite/plugin-types.ts +60 -5
  132. package/src/vite/plugins/cjs-to-esm.ts +11 -0
  133. package/src/vite/plugins/client-ref-dedup.ts +21 -0
  134. package/src/vite/plugins/client-ref-hashing.ts +16 -4
  135. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  136. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  137. package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
  138. package/src/vite/plugins/expose-action-id.ts +52 -28
  139. package/src/vite/plugins/expose-id-utils.ts +12 -0
  140. package/src/vite/plugins/expose-ids/handler-transform.ts +30 -0
  141. package/src/vite/plugins/expose-ids/router-transform.ts +20 -3
  142. package/src/vite/plugins/expose-internal-ids.ts +563 -316
  143. package/src/vite/plugins/performance-tracks.ts +71 -170
  144. package/src/vite/plugins/refresh-cmd.ts +88 -26
  145. package/src/vite/plugins/use-cache-transform.ts +57 -43
  146. package/src/vite/rango.ts +62 -14
  147. package/src/vite/router-discovery.ts +389 -59
  148. package/src/vite/utils/banner.ts +1 -1
  149. package/src/vite/utils/package-resolution.ts +41 -1
  150. package/src/vite/utils/prerender-utils.ts +37 -5
  151. package/src/vite/utils/shared-utils.ts +3 -2
  152. package/dist/__internal.d.ts +0 -83
  153. package/dist/__internal.d.ts.map +0 -1
  154. package/dist/__internal.js +0 -19
  155. package/dist/__internal.js.map +0 -1
  156. package/dist/__mocks__/version.d.ts +0 -7
  157. package/dist/__mocks__/version.d.ts.map +0 -1
  158. package/dist/__mocks__/version.js +0 -7
  159. package/dist/__mocks__/version.js.map +0 -1
  160. package/dist/__tests__/client-href.test.d.ts +0 -2
  161. package/dist/__tests__/client-href.test.d.ts.map +0 -1
  162. package/dist/__tests__/client-href.test.js +0 -74
  163. package/dist/__tests__/client-href.test.js.map +0 -1
  164. package/dist/__tests__/component-utils.test.d.ts +0 -2
  165. package/dist/__tests__/component-utils.test.d.ts.map +0 -1
  166. package/dist/__tests__/component-utils.test.js +0 -51
  167. package/dist/__tests__/component-utils.test.js.map +0 -1
  168. package/dist/__tests__/event-controller.test.d.ts +0 -2
  169. package/dist/__tests__/event-controller.test.d.ts.map +0 -1
  170. package/dist/__tests__/event-controller.test.js +0 -538
  171. package/dist/__tests__/event-controller.test.js.map +0 -1
  172. package/dist/__tests__/helpers/route-tree.d.ts +0 -118
  173. package/dist/__tests__/helpers/route-tree.d.ts.map +0 -1
  174. package/dist/__tests__/helpers/route-tree.js +0 -374
  175. package/dist/__tests__/helpers/route-tree.js.map +0 -1
  176. package/dist/__tests__/match-result.test.d.ts +0 -2
  177. package/dist/__tests__/match-result.test.d.ts.map +0 -1
  178. package/dist/__tests__/match-result.test.js +0 -154
  179. package/dist/__tests__/match-result.test.js.map +0 -1
  180. package/dist/__tests__/navigation-store.test.d.ts +0 -2
  181. package/dist/__tests__/navigation-store.test.d.ts.map +0 -1
  182. package/dist/__tests__/navigation-store.test.js +0 -440
  183. package/dist/__tests__/navigation-store.test.js.map +0 -1
  184. package/dist/__tests__/partial-update.test.d.ts +0 -2
  185. package/dist/__tests__/partial-update.test.d.ts.map +0 -1
  186. package/dist/__tests__/partial-update.test.js +0 -1009
  187. package/dist/__tests__/partial-update.test.js.map +0 -1
  188. package/dist/__tests__/reverse-types.test.d.ts +0 -8
  189. package/dist/__tests__/reverse-types.test.d.ts.map +0 -1
  190. package/dist/__tests__/reverse-types.test.js +0 -656
  191. package/dist/__tests__/reverse-types.test.js.map +0 -1
  192. package/dist/__tests__/route-definition.test.d.ts +0 -2
  193. package/dist/__tests__/route-definition.test.d.ts.map +0 -1
  194. package/dist/__tests__/route-definition.test.js +0 -55
  195. package/dist/__tests__/route-definition.test.js.map +0 -1
  196. package/dist/__tests__/router-helpers.test.d.ts +0 -2
  197. package/dist/__tests__/router-helpers.test.d.ts.map +0 -1
  198. package/dist/__tests__/router-helpers.test.js +0 -377
  199. package/dist/__tests__/router-helpers.test.js.map +0 -1
  200. package/dist/__tests__/router-integration-2.test.d.ts +0 -2
  201. package/dist/__tests__/router-integration-2.test.d.ts.map +0 -1
  202. package/dist/__tests__/router-integration-2.test.js +0 -426
  203. package/dist/__tests__/router-integration-2.test.js.map +0 -1
  204. package/dist/__tests__/router-integration.test.d.ts +0 -2
  205. package/dist/__tests__/router-integration.test.d.ts.map +0 -1
  206. package/dist/__tests__/router-integration.test.js +0 -1051
  207. package/dist/__tests__/router-integration.test.js.map +0 -1
  208. package/dist/__tests__/search-params.test.d.ts +0 -5
  209. package/dist/__tests__/search-params.test.d.ts.map +0 -1
  210. package/dist/__tests__/search-params.test.js +0 -306
  211. package/dist/__tests__/search-params.test.js.map +0 -1
  212. package/dist/__tests__/segment-system.test.d.ts +0 -2
  213. package/dist/__tests__/segment-system.test.d.ts.map +0 -1
  214. package/dist/__tests__/segment-system.test.js +0 -627
  215. package/dist/__tests__/segment-system.test.js.map +0 -1
  216. package/dist/__tests__/static-handler-types.test.d.ts +0 -8
  217. package/dist/__tests__/static-handler-types.test.d.ts.map +0 -1
  218. package/dist/__tests__/static-handler-types.test.js +0 -63
  219. package/dist/__tests__/static-handler-types.test.js.map +0 -1
  220. package/dist/__tests__/urls.test.d.ts +0 -2
  221. package/dist/__tests__/urls.test.d.ts.map +0 -1
  222. package/dist/__tests__/urls.test.js +0 -421
  223. package/dist/__tests__/urls.test.js.map +0 -1
  224. package/dist/__tests__/use-mount.test.d.ts +0 -2
  225. package/dist/__tests__/use-mount.test.d.ts.map +0 -1
  226. package/dist/__tests__/use-mount.test.js +0 -35
  227. package/dist/__tests__/use-mount.test.js.map +0 -1
  228. package/dist/bin/rango.d.ts +0 -2
  229. package/dist/bin/rango.d.ts.map +0 -1
  230. package/dist/bin/rango.js.map +0 -1
  231. package/dist/browser/event-controller.d.ts +0 -191
  232. package/dist/browser/event-controller.d.ts.map +0 -1
  233. package/dist/browser/event-controller.js +0 -559
  234. package/dist/browser/event-controller.js.map +0 -1
  235. package/dist/browser/index.d.ts +0 -2
  236. package/dist/browser/index.d.ts.map +0 -1
  237. package/dist/browser/index.js +0 -14
  238. package/dist/browser/index.js.map +0 -1
  239. package/dist/browser/link-interceptor.d.ts +0 -38
  240. package/dist/browser/link-interceptor.d.ts.map +0 -1
  241. package/dist/browser/link-interceptor.js +0 -99
  242. package/dist/browser/link-interceptor.js.map +0 -1
  243. package/dist/browser/logging.d.ts +0 -10
  244. package/dist/browser/logging.d.ts.map +0 -1
  245. package/dist/browser/logging.js +0 -29
  246. package/dist/browser/logging.js.map +0 -1
  247. package/dist/browser/lru-cache.d.ts +0 -17
  248. package/dist/browser/lru-cache.d.ts.map +0 -1
  249. package/dist/browser/lru-cache.js +0 -50
  250. package/dist/browser/lru-cache.js.map +0 -1
  251. package/dist/browser/merge-segment-loaders.d.ts +0 -39
  252. package/dist/browser/merge-segment-loaders.d.ts.map +0 -1
  253. package/dist/browser/merge-segment-loaders.js +0 -102
  254. package/dist/browser/merge-segment-loaders.js.map +0 -1
  255. package/dist/browser/navigation-bridge.d.ts +0 -102
  256. package/dist/browser/navigation-bridge.d.ts.map +0 -1
  257. package/dist/browser/navigation-bridge.js +0 -708
  258. package/dist/browser/navigation-bridge.js.map +0 -1
  259. package/dist/browser/navigation-client.d.ts +0 -25
  260. package/dist/browser/navigation-client.d.ts.map +0 -1
  261. package/dist/browser/navigation-client.js +0 -157
  262. package/dist/browser/navigation-client.js.map +0 -1
  263. package/dist/browser/navigation-store.d.ts +0 -101
  264. package/dist/browser/navigation-store.d.ts.map +0 -1
  265. package/dist/browser/navigation-store.js +0 -625
  266. package/dist/browser/navigation-store.js.map +0 -1
  267. package/dist/browser/partial-update.d.ts +0 -75
  268. package/dist/browser/partial-update.d.ts.map +0 -1
  269. package/dist/browser/partial-update.js +0 -426
  270. package/dist/browser/partial-update.js.map +0 -1
  271. package/dist/browser/react/Link.d.ts +0 -86
  272. package/dist/browser/react/Link.d.ts.map +0 -1
  273. package/dist/browser/react/Link.js +0 -128
  274. package/dist/browser/react/Link.js.map +0 -1
  275. package/dist/browser/react/NavigationProvider.d.ts +0 -63
  276. package/dist/browser/react/NavigationProvider.d.ts.map +0 -1
  277. package/dist/browser/react/NavigationProvider.js +0 -216
  278. package/dist/browser/react/NavigationProvider.js.map +0 -1
  279. package/dist/browser/react/ScrollRestoration.d.ts +0 -75
  280. package/dist/browser/react/ScrollRestoration.d.ts.map +0 -1
  281. package/dist/browser/react/ScrollRestoration.js +0 -57
  282. package/dist/browser/react/ScrollRestoration.js.map +0 -1
  283. package/dist/browser/react/context.d.ts +0 -46
  284. package/dist/browser/react/context.d.ts.map +0 -1
  285. package/dist/browser/react/context.js +0 -10
  286. package/dist/browser/react/context.js.map +0 -1
  287. package/dist/browser/react/index.d.ts +0 -11
  288. package/dist/browser/react/index.d.ts.map +0 -1
  289. package/dist/browser/react/index.js +0 -22
  290. package/dist/browser/react/index.js.map +0 -1
  291. package/dist/browser/react/location-state-shared.d.ts +0 -63
  292. package/dist/browser/react/location-state-shared.d.ts.map +0 -1
  293. package/dist/browser/react/location-state-shared.js +0 -81
  294. package/dist/browser/react/location-state-shared.js.map +0 -1
  295. package/dist/browser/react/location-state.d.ts +0 -23
  296. package/dist/browser/react/location-state.d.ts.map +0 -1
  297. package/dist/browser/react/location-state.js +0 -29
  298. package/dist/browser/react/location-state.js.map +0 -1
  299. package/dist/browser/react/mount-context.d.ts +0 -24
  300. package/dist/browser/react/mount-context.d.ts.map +0 -1
  301. package/dist/browser/react/mount-context.js +0 -24
  302. package/dist/browser/react/mount-context.js.map +0 -1
  303. package/dist/browser/react/use-action.d.ts +0 -64
  304. package/dist/browser/react/use-action.d.ts.map +0 -1
  305. package/dist/browser/react/use-action.js +0 -134
  306. package/dist/browser/react/use-action.js.map +0 -1
  307. package/dist/browser/react/use-client-cache.d.ts +0 -41
  308. package/dist/browser/react/use-client-cache.d.ts.map +0 -1
  309. package/dist/browser/react/use-client-cache.js +0 -39
  310. package/dist/browser/react/use-client-cache.js.map +0 -1
  311. package/dist/browser/react/use-handle.d.ts +0 -31
  312. package/dist/browser/react/use-handle.d.ts.map +0 -1
  313. package/dist/browser/react/use-handle.js +0 -144
  314. package/dist/browser/react/use-handle.js.map +0 -1
  315. package/dist/browser/react/use-href.d.ts +0 -33
  316. package/dist/browser/react/use-href.d.ts.map +0 -1
  317. package/dist/browser/react/use-href.js +0 -39
  318. package/dist/browser/react/use-href.js.map +0 -1
  319. package/dist/browser/react/use-link-status.d.ts +0 -37
  320. package/dist/browser/react/use-link-status.d.ts.map +0 -1
  321. package/dist/browser/react/use-link-status.js +0 -99
  322. package/dist/browser/react/use-link-status.js.map +0 -1
  323. package/dist/browser/react/use-mount.d.ts +0 -25
  324. package/dist/browser/react/use-mount.d.ts.map +0 -1
  325. package/dist/browser/react/use-mount.js +0 -30
  326. package/dist/browser/react/use-mount.js.map +0 -1
  327. package/dist/browser/react/use-navigation.d.ts +0 -27
  328. package/dist/browser/react/use-navigation.d.ts.map +0 -1
  329. package/dist/browser/react/use-navigation.js +0 -87
  330. package/dist/browser/react/use-navigation.js.map +0 -1
  331. package/dist/browser/react/use-segments.d.ts +0 -38
  332. package/dist/browser/react/use-segments.d.ts.map +0 -1
  333. package/dist/browser/react/use-segments.js +0 -130
  334. package/dist/browser/react/use-segments.js.map +0 -1
  335. package/dist/browser/request-controller.d.ts +0 -26
  336. package/dist/browser/request-controller.d.ts.map +0 -1
  337. package/dist/browser/request-controller.js +0 -147
  338. package/dist/browser/request-controller.js.map +0 -1
  339. package/dist/browser/rsc-router.d.ts +0 -129
  340. package/dist/browser/rsc-router.d.ts.map +0 -1
  341. package/dist/browser/rsc-router.js +0 -195
  342. package/dist/browser/rsc-router.js.map +0 -1
  343. package/dist/browser/scroll-restoration.d.ts +0 -93
  344. package/dist/browser/scroll-restoration.d.ts.map +0 -1
  345. package/dist/browser/scroll-restoration.js +0 -321
  346. package/dist/browser/scroll-restoration.js.map +0 -1
  347. package/dist/browser/segment-structure-assert.d.ts +0 -17
  348. package/dist/browser/segment-structure-assert.d.ts.map +0 -1
  349. package/dist/browser/segment-structure-assert.js +0 -59
  350. package/dist/browser/segment-structure-assert.js.map +0 -1
  351. package/dist/browser/server-action-bridge.d.ts +0 -26
  352. package/dist/browser/server-action-bridge.d.ts.map +0 -1
  353. package/dist/browser/server-action-bridge.js +0 -668
  354. package/dist/browser/server-action-bridge.js.map +0 -1
  355. package/dist/browser/shallow.d.ts +0 -12
  356. package/dist/browser/shallow.d.ts.map +0 -1
  357. package/dist/browser/shallow.js +0 -34
  358. package/dist/browser/shallow.js.map +0 -1
  359. package/dist/browser/types.d.ts +0 -369
  360. package/dist/browser/types.d.ts.map +0 -1
  361. package/dist/browser/types.js +0 -2
  362. package/dist/browser/types.js.map +0 -1
  363. package/dist/build/__tests__/generate-cli.test.d.ts +0 -2
  364. package/dist/build/__tests__/generate-cli.test.d.ts.map +0 -1
  365. package/dist/build/__tests__/generate-cli.test.js +0 -237
  366. package/dist/build/__tests__/generate-cli.test.js.map +0 -1
  367. package/dist/build/__tests__/generate-manifest.test.d.ts +0 -2
  368. package/dist/build/__tests__/generate-manifest.test.d.ts.map +0 -1
  369. package/dist/build/__tests__/generate-manifest.test.js +0 -119
  370. package/dist/build/__tests__/generate-manifest.test.js.map +0 -1
  371. package/dist/build/__tests__/generate-route-types.test.d.ts +0 -2
  372. package/dist/build/__tests__/generate-route-types.test.d.ts.map +0 -1
  373. package/dist/build/__tests__/generate-route-types.test.js +0 -620
  374. package/dist/build/__tests__/generate-route-types.test.js.map +0 -1
  375. package/dist/build/__tests__/per-router-manifest.test.d.ts +0 -2
  376. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +0 -1
  377. package/dist/build/__tests__/per-router-manifest.test.js +0 -308
  378. package/dist/build/__tests__/per-router-manifest.test.js.map +0 -1
  379. package/dist/build/generate-manifest.d.ts +0 -81
  380. package/dist/build/generate-manifest.d.ts.map +0 -1
  381. package/dist/build/generate-manifest.js +0 -276
  382. package/dist/build/generate-manifest.js.map +0 -1
  383. package/dist/build/generate-route-types.d.ts +0 -115
  384. package/dist/build/generate-route-types.d.ts.map +0 -1
  385. package/dist/build/generate-route-types.js +0 -740
  386. package/dist/build/generate-route-types.js.map +0 -1
  387. package/dist/build/index.d.ts +0 -21
  388. package/dist/build/index.d.ts.map +0 -1
  389. package/dist/build/index.js +0 -21
  390. package/dist/build/index.js.map +0 -1
  391. package/dist/build/route-trie.d.ts +0 -71
  392. package/dist/build/route-trie.d.ts.map +0 -1
  393. package/dist/build/route-trie.js +0 -175
  394. package/dist/build/route-trie.js.map +0 -1
  395. package/dist/cache/__tests__/cache-scope.test.d.ts +0 -2
  396. package/dist/cache/__tests__/cache-scope.test.d.ts.map +0 -1
  397. package/dist/cache/__tests__/cache-scope.test.js +0 -208
  398. package/dist/cache/__tests__/cache-scope.test.js.map +0 -1
  399. package/dist/cache/__tests__/document-cache.test.d.ts +0 -2
  400. package/dist/cache/__tests__/document-cache.test.d.ts.map +0 -1
  401. package/dist/cache/__tests__/document-cache.test.js +0 -345
  402. package/dist/cache/__tests__/document-cache.test.js.map +0 -1
  403. package/dist/cache/__tests__/memory-segment-store.test.d.ts +0 -2
  404. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +0 -1
  405. package/dist/cache/__tests__/memory-segment-store.test.js +0 -425
  406. package/dist/cache/__tests__/memory-segment-store.test.js.map +0 -1
  407. package/dist/cache/__tests__/memory-store.test.d.ts +0 -2
  408. package/dist/cache/__tests__/memory-store.test.d.ts.map +0 -1
  409. package/dist/cache/__tests__/memory-store.test.js +0 -367
  410. package/dist/cache/__tests__/memory-store.test.js.map +0 -1
  411. package/dist/cache/cache-scope.d.ts +0 -102
  412. package/dist/cache/cache-scope.d.ts.map +0 -1
  413. package/dist/cache/cache-scope.js +0 -440
  414. package/dist/cache/cache-scope.js.map +0 -1
  415. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +0 -2
  416. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +0 -1
  417. package/dist/cache/cf/__tests__/cf-cache-store.test.js +0 -330
  418. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +0 -1
  419. package/dist/cache/cf/cf-cache-store.d.ts +0 -165
  420. package/dist/cache/cf/cf-cache-store.d.ts.map +0 -1
  421. package/dist/cache/cf/cf-cache-store.js +0 -242
  422. package/dist/cache/cf/cf-cache-store.js.map +0 -1
  423. package/dist/cache/cf/index.d.ts +0 -14
  424. package/dist/cache/cf/index.d.ts.map +0 -1
  425. package/dist/cache/cf/index.js +0 -17
  426. package/dist/cache/cf/index.js.map +0 -1
  427. package/dist/cache/document-cache.d.ts +0 -64
  428. package/dist/cache/document-cache.d.ts.map +0 -1
  429. package/dist/cache/document-cache.js +0 -228
  430. package/dist/cache/document-cache.js.map +0 -1
  431. package/dist/cache/index.d.ts +0 -19
  432. package/dist/cache/index.d.ts.map +0 -1
  433. package/dist/cache/index.js +0 -21
  434. package/dist/cache/index.js.map +0 -1
  435. package/dist/cache/memory-segment-store.d.ts +0 -110
  436. package/dist/cache/memory-segment-store.d.ts.map +0 -1
  437. package/dist/cache/memory-segment-store.js +0 -117
  438. package/dist/cache/memory-segment-store.js.map +0 -1
  439. package/dist/cache/memory-store.d.ts +0 -41
  440. package/dist/cache/memory-store.d.ts.map +0 -1
  441. package/dist/cache/memory-store.js +0 -191
  442. package/dist/cache/memory-store.js.map +0 -1
  443. package/dist/cache/types.d.ts +0 -317
  444. package/dist/cache/types.d.ts.map +0 -1
  445. package/dist/cache/types.js +0 -12
  446. package/dist/cache/types.js.map +0 -1
  447. package/dist/client.d.ts +0 -248
  448. package/dist/client.d.ts.map +0 -1
  449. package/dist/client.js +0 -367
  450. package/dist/client.js.map +0 -1
  451. package/dist/client.rsc.d.ts +0 -26
  452. package/dist/client.rsc.d.ts.map +0 -1
  453. package/dist/client.rsc.js +0 -46
  454. package/dist/client.rsc.js.map +0 -1
  455. package/dist/component-utils.d.ts +0 -36
  456. package/dist/component-utils.d.ts.map +0 -1
  457. package/dist/component-utils.js +0 -61
  458. package/dist/component-utils.js.map +0 -1
  459. package/dist/components/DefaultDocument.d.ts +0 -13
  460. package/dist/components/DefaultDocument.d.ts.map +0 -1
  461. package/dist/components/DefaultDocument.js +0 -15
  462. package/dist/components/DefaultDocument.js.map +0 -1
  463. package/dist/debug.d.ts +0 -58
  464. package/dist/debug.d.ts.map +0 -1
  465. package/dist/debug.js +0 -157
  466. package/dist/debug.js.map +0 -1
  467. package/dist/default-error-boundary.d.ts +0 -11
  468. package/dist/default-error-boundary.d.ts.map +0 -1
  469. package/dist/default-error-boundary.js +0 -45
  470. package/dist/default-error-boundary.js.map +0 -1
  471. package/dist/deps/browser.d.ts +0 -2
  472. package/dist/deps/browser.d.ts.map +0 -1
  473. package/dist/deps/browser.js +0 -3
  474. package/dist/deps/browser.js.map +0 -1
  475. package/dist/deps/html-stream-client.d.ts +0 -2
  476. package/dist/deps/html-stream-client.d.ts.map +0 -1
  477. package/dist/deps/html-stream-client.js +0 -3
  478. package/dist/deps/html-stream-client.js.map +0 -1
  479. package/dist/deps/html-stream-server.d.ts +0 -2
  480. package/dist/deps/html-stream-server.d.ts.map +0 -1
  481. package/dist/deps/html-stream-server.js +0 -3
  482. package/dist/deps/html-stream-server.js.map +0 -1
  483. package/dist/deps/rsc.d.ts +0 -2
  484. package/dist/deps/rsc.d.ts.map +0 -1
  485. package/dist/deps/rsc.js +0 -4
  486. package/dist/deps/rsc.js.map +0 -1
  487. package/dist/deps/ssr.d.ts +0 -2
  488. package/dist/deps/ssr.d.ts.map +0 -1
  489. package/dist/deps/ssr.js +0 -3
  490. package/dist/deps/ssr.js.map +0 -1
  491. package/dist/errors.d.ts +0 -174
  492. package/dist/errors.d.ts.map +0 -1
  493. package/dist/errors.js +0 -241
  494. package/dist/errors.js.map +0 -1
  495. package/dist/handle.d.ts +0 -78
  496. package/dist/handle.d.ts.map +0 -1
  497. package/dist/handle.js +0 -82
  498. package/dist/handle.js.map +0 -1
  499. package/dist/handles/MetaTags.d.ts +0 -14
  500. package/dist/handles/MetaTags.d.ts.map +0 -1
  501. package/dist/handles/MetaTags.js +0 -136
  502. package/dist/handles/MetaTags.js.map +0 -1
  503. package/dist/handles/index.d.ts +0 -6
  504. package/dist/handles/index.d.ts.map +0 -1
  505. package/dist/handles/index.js +0 -6
  506. package/dist/handles/index.js.map +0 -1
  507. package/dist/handles/meta.d.ts +0 -39
  508. package/dist/handles/meta.d.ts.map +0 -1
  509. package/dist/handles/meta.js +0 -202
  510. package/dist/handles/meta.js.map +0 -1
  511. package/dist/host/__tests__/errors.test.d.ts +0 -2
  512. package/dist/host/__tests__/errors.test.d.ts.map +0 -1
  513. package/dist/host/__tests__/errors.test.js +0 -76
  514. package/dist/host/__tests__/errors.test.js.map +0 -1
  515. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +0 -2
  516. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +0 -1
  517. package/dist/host/__tests__/pattern-comprehensive.test.js +0 -732
  518. package/dist/host/__tests__/pattern-comprehensive.test.js.map +0 -1
  519. package/dist/host/__tests__/pattern-matcher.test.d.ts +0 -2
  520. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +0 -1
  521. package/dist/host/__tests__/pattern-matcher.test.js +0 -251
  522. package/dist/host/__tests__/pattern-matcher.test.js.map +0 -1
  523. package/dist/host/__tests__/router.test.d.ts +0 -2
  524. package/dist/host/__tests__/router.test.d.ts.map +0 -1
  525. package/dist/host/__tests__/router.test.js +0 -241
  526. package/dist/host/__tests__/router.test.js.map +0 -1
  527. package/dist/host/__tests__/testing.test.d.ts +0 -2
  528. package/dist/host/__tests__/testing.test.d.ts.map +0 -1
  529. package/dist/host/__tests__/testing.test.js +0 -64
  530. package/dist/host/__tests__/testing.test.js.map +0 -1
  531. package/dist/host/__tests__/utils.test.d.ts +0 -2
  532. package/dist/host/__tests__/utils.test.d.ts.map +0 -1
  533. package/dist/host/__tests__/utils.test.js +0 -29
  534. package/dist/host/__tests__/utils.test.js.map +0 -1
  535. package/dist/host/cookie-handler.d.ts +0 -34
  536. package/dist/host/cookie-handler.d.ts.map +0 -1
  537. package/dist/host/cookie-handler.js +0 -124
  538. package/dist/host/cookie-handler.js.map +0 -1
  539. package/dist/host/errors.d.ts +0 -56
  540. package/dist/host/errors.d.ts.map +0 -1
  541. package/dist/host/errors.js +0 -79
  542. package/dist/host/errors.js.map +0 -1
  543. package/dist/host/index.d.ts +0 -29
  544. package/dist/host/index.d.ts.map +0 -1
  545. package/dist/host/index.js +0 -32
  546. package/dist/host/index.js.map +0 -1
  547. package/dist/host/pattern-matcher.d.ts +0 -36
  548. package/dist/host/pattern-matcher.d.ts.map +0 -1
  549. package/dist/host/pattern-matcher.js +0 -172
  550. package/dist/host/pattern-matcher.js.map +0 -1
  551. package/dist/host/router.d.ts +0 -26
  552. package/dist/host/router.d.ts.map +0 -1
  553. package/dist/host/router.js +0 -218
  554. package/dist/host/router.js.map +0 -1
  555. package/dist/host/testing.d.ts +0 -36
  556. package/dist/host/testing.d.ts.map +0 -1
  557. package/dist/host/testing.js +0 -55
  558. package/dist/host/testing.js.map +0 -1
  559. package/dist/host/types.d.ts +0 -115
  560. package/dist/host/types.d.ts.map +0 -1
  561. package/dist/host/types.js +0 -7
  562. package/dist/host/types.js.map +0 -1
  563. package/dist/host/utils.d.ts +0 -21
  564. package/dist/host/utils.d.ts.map +0 -1
  565. package/dist/host/utils.js +0 -23
  566. package/dist/host/utils.js.map +0 -1
  567. package/dist/href-client.d.ts +0 -131
  568. package/dist/href-client.d.ts.map +0 -1
  569. package/dist/href-client.js +0 -64
  570. package/dist/href-client.js.map +0 -1
  571. package/dist/href-context.d.ts +0 -29
  572. package/dist/href-context.d.ts.map +0 -1
  573. package/dist/href-context.js +0 -21
  574. package/dist/href-context.js.map +0 -1
  575. package/dist/index.d.ts +0 -73
  576. package/dist/index.d.ts.map +0 -1
  577. package/dist/index.js +0 -91
  578. package/dist/index.js.map +0 -1
  579. package/dist/index.rsc.d.ts +0 -32
  580. package/dist/index.rsc.d.ts.map +0 -1
  581. package/dist/index.rsc.js +0 -40
  582. package/dist/index.rsc.js.map +0 -1
  583. package/dist/internal-debug.d.ts +0 -2
  584. package/dist/internal-debug.d.ts.map +0 -1
  585. package/dist/internal-debug.js +0 -5
  586. package/dist/internal-debug.js.map +0 -1
  587. package/dist/loader.d.ts +0 -14
  588. package/dist/loader.d.ts.map +0 -1
  589. package/dist/loader.js +0 -20
  590. package/dist/loader.js.map +0 -1
  591. package/dist/loader.rsc.d.ts +0 -19
  592. package/dist/loader.rsc.d.ts.map +0 -1
  593. package/dist/loader.rsc.js +0 -99
  594. package/dist/loader.rsc.js.map +0 -1
  595. package/dist/network-error-thrower.d.ts +0 -17
  596. package/dist/network-error-thrower.d.ts.map +0 -1
  597. package/dist/network-error-thrower.js +0 -14
  598. package/dist/network-error-thrower.js.map +0 -1
  599. package/dist/outlet-context.d.ts +0 -13
  600. package/dist/outlet-context.d.ts.map +0 -1
  601. package/dist/outlet-context.js +0 -3
  602. package/dist/outlet-context.js.map +0 -1
  603. package/dist/prerender/__tests__/param-hash.test.d.ts +0 -2
  604. package/dist/prerender/__tests__/param-hash.test.d.ts.map +0 -1
  605. package/dist/prerender/__tests__/param-hash.test.js +0 -148
  606. package/dist/prerender/__tests__/param-hash.test.js.map +0 -1
  607. package/dist/prerender/param-hash.d.ts +0 -16
  608. package/dist/prerender/param-hash.d.ts.map +0 -1
  609. package/dist/prerender/param-hash.js +0 -36
  610. package/dist/prerender/param-hash.js.map +0 -1
  611. package/dist/prerender/store.d.ts +0 -38
  612. package/dist/prerender/store.d.ts.map +0 -1
  613. package/dist/prerender/store.js +0 -61
  614. package/dist/prerender/store.js.map +0 -1
  615. package/dist/prerender.d.ts +0 -66
  616. package/dist/prerender.d.ts.map +0 -1
  617. package/dist/prerender.js +0 -57
  618. package/dist/prerender.js.map +0 -1
  619. package/dist/reverse.d.ts +0 -196
  620. package/dist/reverse.d.ts.map +0 -1
  621. package/dist/reverse.js +0 -78
  622. package/dist/reverse.js.map +0 -1
  623. package/dist/root-error-boundary.d.ts +0 -33
  624. package/dist/root-error-boundary.d.ts.map +0 -1
  625. package/dist/root-error-boundary.js +0 -165
  626. package/dist/root-error-boundary.js.map +0 -1
  627. package/dist/route-content-wrapper.d.ts +0 -46
  628. package/dist/route-content-wrapper.d.ts.map +0 -1
  629. package/dist/route-content-wrapper.js +0 -77
  630. package/dist/route-content-wrapper.js.map +0 -1
  631. package/dist/route-definition.d.ts +0 -421
  632. package/dist/route-definition.d.ts.map +0 -1
  633. package/dist/route-definition.js +0 -868
  634. package/dist/route-definition.js.map +0 -1
  635. package/dist/route-map-builder.d.ts +0 -155
  636. package/dist/route-map-builder.d.ts.map +0 -1
  637. package/dist/route-map-builder.js +0 -237
  638. package/dist/route-map-builder.js.map +0 -1
  639. package/dist/route-types.d.ts +0 -165
  640. package/dist/route-types.d.ts.map +0 -1
  641. package/dist/route-types.js +0 -7
  642. package/dist/route-types.js.map +0 -1
  643. package/dist/router/__tests__/handler-context.test.d.ts +0 -2
  644. package/dist/router/__tests__/handler-context.test.d.ts.map +0 -1
  645. package/dist/router/__tests__/handler-context.test.js +0 -65
  646. package/dist/router/__tests__/handler-context.test.js.map +0 -1
  647. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +0 -2
  648. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +0 -1
  649. package/dist/router/__tests__/loader-cycle-detection.test.js +0 -221
  650. package/dist/router/__tests__/loader-cycle-detection.test.js.map +0 -1
  651. package/dist/router/__tests__/match-context.test.d.ts +0 -2
  652. package/dist/router/__tests__/match-context.test.d.ts.map +0 -1
  653. package/dist/router/__tests__/match-context.test.js +0 -92
  654. package/dist/router/__tests__/match-context.test.js.map +0 -1
  655. package/dist/router/__tests__/match-pipelines.test.d.ts +0 -2
  656. package/dist/router/__tests__/match-pipelines.test.d.ts.map +0 -1
  657. package/dist/router/__tests__/match-pipelines.test.js +0 -417
  658. package/dist/router/__tests__/match-pipelines.test.js.map +0 -1
  659. package/dist/router/__tests__/match-result.test.d.ts +0 -2
  660. package/dist/router/__tests__/match-result.test.d.ts.map +0 -1
  661. package/dist/router/__tests__/match-result.test.js +0 -457
  662. package/dist/router/__tests__/match-result.test.js.map +0 -1
  663. package/dist/router/__tests__/on-error.test.d.ts +0 -2
  664. package/dist/router/__tests__/on-error.test.d.ts.map +0 -1
  665. package/dist/router/__tests__/on-error.test.js +0 -678
  666. package/dist/router/__tests__/on-error.test.js.map +0 -1
  667. package/dist/router/__tests__/pattern-matching.test.d.ts +0 -2
  668. package/dist/router/__tests__/pattern-matching.test.d.ts.map +0 -1
  669. package/dist/router/__tests__/pattern-matching.test.js +0 -629
  670. package/dist/router/__tests__/pattern-matching.test.js.map +0 -1
  671. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +0 -2
  672. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +0 -1
  673. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +0 -155
  674. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +0 -1
  675. package/dist/router/error-handling.d.ts +0 -77
  676. package/dist/router/error-handling.d.ts.map +0 -1
  677. package/dist/router/error-handling.js +0 -202
  678. package/dist/router/error-handling.js.map +0 -1
  679. package/dist/router/handler-context.d.ts +0 -20
  680. package/dist/router/handler-context.d.ts.map +0 -1
  681. package/dist/router/handler-context.js +0 -198
  682. package/dist/router/handler-context.js.map +0 -1
  683. package/dist/router/intercept-resolution.d.ts +0 -66
  684. package/dist/router/intercept-resolution.d.ts.map +0 -1
  685. package/dist/router/intercept-resolution.js +0 -246
  686. package/dist/router/intercept-resolution.js.map +0 -1
  687. package/dist/router/loader-resolution.d.ts +0 -64
  688. package/dist/router/loader-resolution.d.ts.map +0 -1
  689. package/dist/router/loader-resolution.js +0 -284
  690. package/dist/router/loader-resolution.js.map +0 -1
  691. package/dist/router/logging.d.ts +0 -15
  692. package/dist/router/logging.d.ts.map +0 -1
  693. package/dist/router/logging.js +0 -99
  694. package/dist/router/logging.js.map +0 -1
  695. package/dist/router/manifest.d.ts +0 -22
  696. package/dist/router/manifest.d.ts.map +0 -1
  697. package/dist/router/manifest.js +0 -181
  698. package/dist/router/manifest.js.map +0 -1
  699. package/dist/router/match-api.d.ts +0 -35
  700. package/dist/router/match-api.d.ts.map +0 -1
  701. package/dist/router/match-api.js +0 -406
  702. package/dist/router/match-api.js.map +0 -1
  703. package/dist/router/match-context.d.ts +0 -206
  704. package/dist/router/match-context.d.ts.map +0 -1
  705. package/dist/router/match-context.js +0 -17
  706. package/dist/router/match-context.js.map +0 -1
  707. package/dist/router/match-middleware/background-revalidation.d.ts +0 -127
  708. package/dist/router/match-middleware/background-revalidation.d.ts.map +0 -1
  709. package/dist/router/match-middleware/background-revalidation.js +0 -75
  710. package/dist/router/match-middleware/background-revalidation.js.map +0 -1
  711. package/dist/router/match-middleware/cache-lookup.d.ts +0 -112
  712. package/dist/router/match-middleware/cache-lookup.d.ts.map +0 -1
  713. package/dist/router/match-middleware/cache-lookup.js +0 -257
  714. package/dist/router/match-middleware/cache-lookup.js.map +0 -1
  715. package/dist/router/match-middleware/cache-store.d.ts +0 -113
  716. package/dist/router/match-middleware/cache-store.d.ts.map +0 -1
  717. package/dist/router/match-middleware/cache-store.js +0 -108
  718. package/dist/router/match-middleware/cache-store.js.map +0 -1
  719. package/dist/router/match-middleware/index.d.ts +0 -81
  720. package/dist/router/match-middleware/index.d.ts.map +0 -1
  721. package/dist/router/match-middleware/index.js +0 -80
  722. package/dist/router/match-middleware/index.js.map +0 -1
  723. package/dist/router/match-middleware/intercept-resolution.d.ts +0 -117
  724. package/dist/router/match-middleware/intercept-resolution.d.ts.map +0 -1
  725. package/dist/router/match-middleware/intercept-resolution.js +0 -134
  726. package/dist/router/match-middleware/intercept-resolution.js.map +0 -1
  727. package/dist/router/match-middleware/segment-resolution.d.ts +0 -99
  728. package/dist/router/match-middleware/segment-resolution.d.ts.map +0 -1
  729. package/dist/router/match-middleware/segment-resolution.js +0 -53
  730. package/dist/router/match-middleware/segment-resolution.js.map +0 -1
  731. package/dist/router/match-pipelines.d.ts +0 -147
  732. package/dist/router/match-pipelines.d.ts.map +0 -1
  733. package/dist/router/match-pipelines.js +0 -82
  734. package/dist/router/match-pipelines.js.map +0 -1
  735. package/dist/router/match-result.d.ts +0 -126
  736. package/dist/router/match-result.d.ts.map +0 -1
  737. package/dist/router/match-result.js +0 -93
  738. package/dist/router/match-result.js.map +0 -1
  739. package/dist/router/metrics.d.ts +0 -20
  740. package/dist/router/metrics.d.ts.map +0 -1
  741. package/dist/router/metrics.js +0 -47
  742. package/dist/router/metrics.js.map +0 -1
  743. package/dist/router/middleware.d.ts +0 -249
  744. package/dist/router/middleware.d.ts.map +0 -1
  745. package/dist/router/middleware.js +0 -434
  746. package/dist/router/middleware.js.map +0 -1
  747. package/dist/router/middleware.test.d.ts +0 -2
  748. package/dist/router/middleware.test.d.ts.map +0 -1
  749. package/dist/router/middleware.test.js +0 -816
  750. package/dist/router/middleware.test.js.map +0 -1
  751. package/dist/router/pattern-matching.d.ts +0 -149
  752. package/dist/router/pattern-matching.d.ts.map +0 -1
  753. package/dist/router/pattern-matching.js +0 -349
  754. package/dist/router/pattern-matching.js.map +0 -1
  755. package/dist/router/revalidation.d.ts +0 -44
  756. package/dist/router/revalidation.d.ts.map +0 -1
  757. package/dist/router/revalidation.js +0 -147
  758. package/dist/router/revalidation.js.map +0 -1
  759. package/dist/router/router-context.d.ts +0 -135
  760. package/dist/router/router-context.d.ts.map +0 -1
  761. package/dist/router/router-context.js +0 -36
  762. package/dist/router/router-context.js.map +0 -1
  763. package/dist/router/segment-resolution.d.ts +0 -127
  764. package/dist/router/segment-resolution.d.ts.map +0 -1
  765. package/dist/router/segment-resolution.js +0 -919
  766. package/dist/router/segment-resolution.js.map +0 -1
  767. package/dist/router/trie-matching.d.ts +0 -40
  768. package/dist/router/trie-matching.d.ts.map +0 -1
  769. package/dist/router/trie-matching.js +0 -127
  770. package/dist/router/trie-matching.js.map +0 -1
  771. package/dist/router/types.d.ts +0 -136
  772. package/dist/router/types.d.ts.map +0 -1
  773. package/dist/router/types.js +0 -7
  774. package/dist/router/types.js.map +0 -1
  775. package/dist/router.d.ts +0 -753
  776. package/dist/router.d.ts.map +0 -1
  777. package/dist/router.gen.d.ts +0 -6
  778. package/dist/router.gen.d.ts.map +0 -1
  779. package/dist/router.gen.js +0 -6
  780. package/dist/router.gen.js.map +0 -1
  781. package/dist/router.js +0 -1304
  782. package/dist/router.js.map +0 -1
  783. package/dist/rsc/__tests__/helpers.test.d.ts +0 -2
  784. package/dist/rsc/__tests__/helpers.test.d.ts.map +0 -1
  785. package/dist/rsc/__tests__/helpers.test.js +0 -140
  786. package/dist/rsc/__tests__/helpers.test.js.map +0 -1
  787. package/dist/rsc/handler.d.ts +0 -45
  788. package/dist/rsc/handler.d.ts.map +0 -1
  789. package/dist/rsc/handler.js +0 -1172
  790. package/dist/rsc/handler.js.map +0 -1
  791. package/dist/rsc/helpers.d.ts +0 -16
  792. package/dist/rsc/helpers.d.ts.map +0 -1
  793. package/dist/rsc/helpers.js +0 -55
  794. package/dist/rsc/helpers.js.map +0 -1
  795. package/dist/rsc/index.d.ts +0 -22
  796. package/dist/rsc/index.d.ts.map +0 -1
  797. package/dist/rsc/index.js +0 -23
  798. package/dist/rsc/index.js.map +0 -1
  799. package/dist/rsc/nonce.d.ts +0 -9
  800. package/dist/rsc/nonce.d.ts.map +0 -1
  801. package/dist/rsc/nonce.js +0 -18
  802. package/dist/rsc/nonce.js.map +0 -1
  803. package/dist/rsc/types.d.ts +0 -206
  804. package/dist/rsc/types.d.ts.map +0 -1
  805. package/dist/rsc/types.js +0 -8
  806. package/dist/rsc/types.js.map +0 -1
  807. package/dist/search-params.d.ts +0 -103
  808. package/dist/search-params.d.ts.map +0 -1
  809. package/dist/search-params.js +0 -74
  810. package/dist/search-params.js.map +0 -1
  811. package/dist/segment-system.d.ts +0 -75
  812. package/dist/segment-system.d.ts.map +0 -1
  813. package/dist/segment-system.js +0 -336
  814. package/dist/segment-system.js.map +0 -1
  815. package/dist/server/context.d.ts +0 -245
  816. package/dist/server/context.d.ts.map +0 -1
  817. package/dist/server/context.js +0 -197
  818. package/dist/server/context.js.map +0 -1
  819. package/dist/server/fetchable-loader-store.d.ts +0 -18
  820. package/dist/server/fetchable-loader-store.d.ts.map +0 -1
  821. package/dist/server/fetchable-loader-store.js +0 -18
  822. package/dist/server/fetchable-loader-store.js.map +0 -1
  823. package/dist/server/handle-store.d.ts +0 -85
  824. package/dist/server/handle-store.d.ts.map +0 -1
  825. package/dist/server/handle-store.js +0 -142
  826. package/dist/server/handle-store.js.map +0 -1
  827. package/dist/server/loader-registry.d.ts +0 -55
  828. package/dist/server/loader-registry.d.ts.map +0 -1
  829. package/dist/server/loader-registry.js +0 -132
  830. package/dist/server/loader-registry.js.map +0 -1
  831. package/dist/server/request-context.d.ts +0 -226
  832. package/dist/server/request-context.d.ts.map +0 -1
  833. package/dist/server/request-context.js +0 -290
  834. package/dist/server/request-context.js.map +0 -1
  835. package/dist/server/root-layout.d.ts +0 -4
  836. package/dist/server/root-layout.d.ts.map +0 -1
  837. package/dist/server/root-layout.js +0 -5
  838. package/dist/server/root-layout.js.map +0 -1
  839. package/dist/server.d.ts +0 -15
  840. package/dist/server.d.ts.map +0 -1
  841. package/dist/server.js +0 -20
  842. package/dist/server.js.map +0 -1
  843. package/dist/ssr/__tests__/ssr-handler.test.d.ts +0 -2
  844. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +0 -1
  845. package/dist/ssr/__tests__/ssr-handler.test.js +0 -132
  846. package/dist/ssr/__tests__/ssr-handler.test.js.map +0 -1
  847. package/dist/ssr/index.d.ts +0 -98
  848. package/dist/ssr/index.d.ts.map +0 -1
  849. package/dist/ssr/index.js +0 -158
  850. package/dist/ssr/index.js.map +0 -1
  851. package/dist/static-handler.d.ts +0 -50
  852. package/dist/static-handler.d.ts.map +0 -1
  853. package/dist/static-handler.gen.d.ts +0 -5
  854. package/dist/static-handler.gen.d.ts.map +0 -1
  855. package/dist/static-handler.gen.js +0 -5
  856. package/dist/static-handler.gen.js.map +0 -1
  857. package/dist/static-handler.js +0 -29
  858. package/dist/static-handler.js.map +0 -1
  859. package/dist/theme/ThemeProvider.d.ts +0 -20
  860. package/dist/theme/ThemeProvider.d.ts.map +0 -1
  861. package/dist/theme/ThemeProvider.js +0 -240
  862. package/dist/theme/ThemeProvider.js.map +0 -1
  863. package/dist/theme/ThemeScript.d.ts +0 -48
  864. package/dist/theme/ThemeScript.d.ts.map +0 -1
  865. package/dist/theme/ThemeScript.js +0 -13
  866. package/dist/theme/ThemeScript.js.map +0 -1
  867. package/dist/theme/__tests__/theme.test.d.ts +0 -2
  868. package/dist/theme/__tests__/theme.test.d.ts.map +0 -1
  869. package/dist/theme/__tests__/theme.test.js +0 -103
  870. package/dist/theme/__tests__/theme.test.js.map +0 -1
  871. package/dist/theme/constants.d.ts +0 -29
  872. package/dist/theme/constants.d.ts.map +0 -1
  873. package/dist/theme/constants.js +0 -48
  874. package/dist/theme/constants.js.map +0 -1
  875. package/dist/theme/index.d.ts +0 -31
  876. package/dist/theme/index.d.ts.map +0 -1
  877. package/dist/theme/index.js +0 -36
  878. package/dist/theme/index.js.map +0 -1
  879. package/dist/theme/theme-context.d.ts +0 -40
  880. package/dist/theme/theme-context.d.ts.map +0 -1
  881. package/dist/theme/theme-context.js +0 -60
  882. package/dist/theme/theme-context.js.map +0 -1
  883. package/dist/theme/theme-script.d.ts +0 -27
  884. package/dist/theme/theme-script.d.ts.map +0 -1
  885. package/dist/theme/theme-script.js +0 -147
  886. package/dist/theme/theme-script.js.map +0 -1
  887. package/dist/theme/types.d.ts +0 -163
  888. package/dist/theme/types.d.ts.map +0 -1
  889. package/dist/theme/types.js +0 -11
  890. package/dist/theme/types.js.map +0 -1
  891. package/dist/theme/use-theme.d.ts +0 -12
  892. package/dist/theme/use-theme.d.ts.map +0 -1
  893. package/dist/theme/use-theme.js +0 -40
  894. package/dist/theme/use-theme.js.map +0 -1
  895. package/dist/types.d.ts +0 -1479
  896. package/dist/types.d.ts.map +0 -1
  897. package/dist/types.js +0 -10
  898. package/dist/types.js.map +0 -1
  899. package/dist/urls.d.ts +0 -441
  900. package/dist/urls.d.ts.map +0 -1
  901. package/dist/urls.gen.d.ts +0 -8
  902. package/dist/urls.gen.d.ts.map +0 -1
  903. package/dist/urls.gen.js +0 -8
  904. package/dist/urls.gen.js.map +0 -1
  905. package/dist/urls.js +0 -443
  906. package/dist/urls.js.map +0 -1
  907. package/dist/use-loader.d.ts +0 -127
  908. package/dist/use-loader.d.ts.map +0 -1
  909. package/dist/use-loader.js +0 -237
  910. package/dist/use-loader.js.map +0 -1
  911. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +0 -2
  912. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +0 -1
  913. package/dist/vite/__tests__/ast-handler-extract.test.js +0 -294
  914. package/dist/vite/__tests__/ast-handler-extract.test.js.map +0 -1
  915. package/dist/vite/__tests__/expose-id-utils.test.d.ts +0 -2
  916. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +0 -1
  917. package/dist/vite/__tests__/expose-id-utils.test.js +0 -224
  918. package/dist/vite/__tests__/expose-id-utils.test.js.map +0 -1
  919. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +0 -2
  920. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +0 -1
  921. package/dist/vite/__tests__/expose-internal-ids.test.js +0 -647
  922. package/dist/vite/__tests__/expose-internal-ids.test.js.map +0 -1
  923. package/dist/vite/__tests__/expose-router-id.test.d.ts +0 -2
  924. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +0 -1
  925. package/dist/vite/__tests__/expose-router-id.test.js +0 -39
  926. package/dist/vite/__tests__/expose-router-id.test.js.map +0 -1
  927. package/dist/vite/ast-handler-extract.d.ts +0 -49
  928. package/dist/vite/ast-handler-extract.d.ts.map +0 -1
  929. package/dist/vite/ast-handler-extract.js +0 -249
  930. package/dist/vite/ast-handler-extract.js.map +0 -1
  931. package/dist/vite/expose-action-id.d.ts +0 -19
  932. package/dist/vite/expose-action-id.d.ts.map +0 -1
  933. package/dist/vite/expose-action-id.js +0 -250
  934. package/dist/vite/expose-action-id.js.map +0 -1
  935. package/dist/vite/expose-id-utils.d.ts +0 -69
  936. package/dist/vite/expose-id-utils.d.ts.map +0 -1
  937. package/dist/vite/expose-id-utils.js +0 -289
  938. package/dist/vite/expose-id-utils.js.map +0 -1
  939. package/dist/vite/expose-internal-ids.d.ts +0 -22
  940. package/dist/vite/expose-internal-ids.d.ts.map +0 -1
  941. package/dist/vite/expose-internal-ids.js +0 -886
  942. package/dist/vite/expose-internal-ids.js.map +0 -1
  943. package/dist/vite/index.d.ts +0 -149
  944. package/dist/vite/index.d.ts.map +0 -1
  945. package/dist/vite/index.js.map +0 -1
  946. package/dist/vite/index.named-routes.gen.ts +0 -103
  947. package/dist/vite/package-resolution.d.ts +0 -43
  948. package/dist/vite/package-resolution.d.ts.map +0 -1
  949. package/dist/vite/package-resolution.js +0 -112
  950. package/dist/vite/package-resolution.js.map +0 -1
  951. package/dist/vite/virtual-entries.d.ts +0 -25
  952. package/dist/vite/virtual-entries.d.ts.map +0 -1
  953. package/dist/vite/virtual-entries.js +0 -110
  954. package/dist/vite/virtual-entries.js.map +0 -1
  955. package/src/browser/debug-channel.ts +0 -93
@@ -9,18 +9,21 @@ import fs from "node:fs";
9
9
 
10
10
  // src/vite/plugins/expose-id-utils.ts
11
11
  import path from "node:path";
12
- import crypto2 from "node:crypto";
12
+ import crypto from "node:crypto";
13
13
  function normalizePath(p) {
14
14
  return p.split(path.sep).join("/");
15
15
  }
16
16
  function hashId(filePath, exportName) {
17
17
  const input = `${filePath}#${exportName}`;
18
- const hash = crypto2.createHash("sha256").update(input).digest("hex");
18
+ const hash = crypto.createHash("sha256").update(input).digest("hex");
19
19
  return `${hash.slice(0, 8)}#${exportName}`;
20
20
  }
21
+ function makeStubId(filePath, exportName, isBuild) {
22
+ return isBuild ? hashId(filePath, exportName) : `${filePath}#${exportName}`;
23
+ }
21
24
  function hashInlineId(filePath, lineNumber, index) {
22
25
  const input = index !== void 0 && index > 0 ? `${filePath}:${lineNumber}:${index}` : `${filePath}:${lineNumber}`;
23
- return crypto2.createHash("sha256").update(input).digest("hex").slice(0, 8);
26
+ return crypto.createHash("sha256").update(input).digest("hex").slice(0, 8);
24
27
  }
25
28
  function buildExportMap(program) {
26
29
  const exportMap = /* @__PURE__ */ new Map();
@@ -188,7 +191,71 @@ function escapeRegExp(input) {
188
191
  return input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
189
192
  }
190
193
 
194
+ // src/vite/debug.ts
195
+ import debugFactory from "debug";
196
+ if (process.env.INTERNAL_RANGO_DEBUG) {
197
+ const existing = debugFactory.disable();
198
+ debugFactory.enable(existing ? `${existing},rango:*` : "rango:*");
199
+ }
200
+ function createRangoDebugger(namespace) {
201
+ const primary = debugFactory(namespace);
202
+ const shadow = debugFactory(`vite:${namespace}`);
203
+ if (primary.enabled) return primary;
204
+ if (shadow.enabled) return shadow;
205
+ return void 0;
206
+ }
207
+ async function timed(debug11, label, fn) {
208
+ if (!debug11) return await fn();
209
+ const start = performance.now();
210
+ try {
211
+ return await fn();
212
+ } finally {
213
+ debug11("%s (%sms)", label, (performance.now() - start).toFixed(1));
214
+ }
215
+ }
216
+ function timedSync(debug11, label, fn) {
217
+ if (!debug11) return fn();
218
+ const start = performance.now();
219
+ try {
220
+ return fn();
221
+ } finally {
222
+ debug11("%s (%sms)", label, (performance.now() - start).toFixed(1));
223
+ }
224
+ }
225
+ function createCounter(debug11, label) {
226
+ if (!debug11) return void 0;
227
+ let n = 0;
228
+ let totalMs = 0;
229
+ let slowestMs = 0;
230
+ let slowestFile = "";
231
+ let flushed = false;
232
+ return {
233
+ record(file, ms) {
234
+ n++;
235
+ totalMs += ms;
236
+ if (ms > slowestMs) {
237
+ slowestMs = ms;
238
+ slowestFile = file;
239
+ }
240
+ },
241
+ flush() {
242
+ if (flushed) return;
243
+ flushed = true;
244
+ if (n === 0) return;
245
+ debug11(
246
+ "%s: %d files, %sms total, slowest %sms %s",
247
+ label,
248
+ n,
249
+ totalMs.toFixed(1),
250
+ slowestMs.toFixed(1),
251
+ slowestFile
252
+ );
253
+ }
254
+ };
255
+ }
256
+
191
257
  // src/vite/plugins/expose-action-id.ts
258
+ var debug = createRangoDebugger("rango:transform");
192
259
  function getRscPluginApi(config) {
193
260
  let plugin = config.plugins.find((p) => p.name === "rsc:minimal");
194
261
  if (!plugin) {
@@ -277,6 +344,8 @@ function exposeActionId() {
277
344
  let isBuild = false;
278
345
  let hashToFileMap;
279
346
  let rscPluginApi;
347
+ const counterTransform = createCounter(debug, "expose-action-id transform");
348
+ const counterRender = createCounter(debug, "expose-action-id renderChunk");
280
349
  return {
281
350
  name: "@rangojs/router:expose-action-id",
282
351
  // Run after all other plugins (including RSC plugin's transforms)
@@ -286,6 +355,10 @@ function exposeActionId() {
286
355
  isBuild = config.command === "build";
287
356
  rscPluginApi = getRscPluginApi(config);
288
357
  },
358
+ buildEnd() {
359
+ counterTransform?.flush();
360
+ counterRender?.flush();
361
+ },
289
362
  buildStart() {
290
363
  if (!rscPluginApi) {
291
364
  rscPluginApi = getRscPluginApi(config);
@@ -322,28 +395,42 @@ function exposeActionId() {
322
395
  if (id.includes("/node_modules/")) {
323
396
  return;
324
397
  }
325
- return transformServerReferences(code, id);
398
+ const start = counterTransform ? performance.now() : 0;
399
+ try {
400
+ return transformServerReferences(code, id);
401
+ } finally {
402
+ counterTransform?.record(id, performance.now() - start);
403
+ }
326
404
  },
327
405
  // Build mode: renderChunk runs after all transforms and bundling complete
328
406
  renderChunk(code, chunk) {
329
- const isRscEnv = this.environment?.name === "rsc";
330
- const effectiveMap = isRscEnv ? hashToFileMap : void 0;
331
- if (isRscEnv && hashToFileMap) {
332
- const s = new MagicString(code);
333
- const changed1 = applyServerReferenceWrapping(code, s, effectiveMap);
334
- const changed2 = applyRegisterReferenceWrapping(code, s, hashToFileMap);
335
- if (changed1 || changed2) {
336
- return {
337
- code: s.toString(),
338
- map: s.generateMap({
339
- source: chunk.fileName,
340
- includeContent: true
341
- })
342
- };
407
+ const start = counterRender ? performance.now() : 0;
408
+ try {
409
+ const isRscEnv = this.environment?.name === "rsc";
410
+ const effectiveMap = isRscEnv ? hashToFileMap : void 0;
411
+ if (isRscEnv && hashToFileMap) {
412
+ const s = new MagicString(code);
413
+ const changed1 = applyServerReferenceWrapping(code, s, effectiveMap);
414
+ const changed2 = applyRegisterReferenceWrapping(
415
+ code,
416
+ s,
417
+ hashToFileMap
418
+ );
419
+ if (changed1 || changed2) {
420
+ return {
421
+ code: s.toString(),
422
+ map: s.generateMap({
423
+ source: chunk.fileName,
424
+ includeContent: true
425
+ })
426
+ };
427
+ }
428
+ return null;
343
429
  }
344
- return null;
430
+ return transformServerReferences(code, chunk.fileName, effectiveMap);
431
+ } finally {
432
+ counterRender?.record(chunk.fileName, performance.now() - start);
345
433
  }
346
- return transformServerReferences(code, chunk.fileName, effectiveMap);
347
434
  }
348
435
  };
349
436
  }
@@ -910,9 +997,7 @@ function generateWholeFileStubs(cfg, bindings, code, filePath, isBuild) {
910
997
  });
911
998
  return { code: stubs.join("\n") + "\n", map: null };
912
999
  }
913
- function generateExprStubs(cfg, bindings, code, filePath, sourceId, isBuild) {
914
- if (bindings.length === 0) return null;
915
- const s = new MagicString2(code);
1000
+ function stubHandlerExprs(cfg, bindings, s, filePath, isBuild) {
916
1001
  let hasChanges = false;
917
1002
  for (const binding of bindings) {
918
1003
  const exportName = binding.exportNames[0];
@@ -924,15 +1009,7 @@ function generateExprStubs(cfg, bindings, code, filePath, sourceId, isBuild) {
924
1009
  );
925
1010
  hasChanges = true;
926
1011
  }
927
- if (!hasChanges) return null;
928
- return {
929
- code: s.toString(),
930
- map: s.generateMap({
931
- source: sourceId,
932
- includeContent: true,
933
- hires: "boundary"
934
- })
935
- };
1012
+ return hasChanges;
936
1013
  }
937
1014
  function transformHandlerIds(cfg, bindings, s, filePath, isBuild) {
938
1015
  let hasChanges = false;
@@ -960,6 +1037,7 @@ ${binding.localName}.$$id = "${handlerId}";`;
960
1037
  import MagicString3 from "magic-string";
961
1038
  import path3 from "node:path";
962
1039
  import { createHash } from "node:crypto";
1040
+ var debug2 = createRangoDebugger("rango:transform");
963
1041
  function transformRouter(code, filePath, routerFnNames, absolutePath) {
964
1042
  const pat = new RegExp(
965
1043
  `\\b(?:${routerFnNames.map((n) => n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|")})\\s*(?:<[^>]*>)?\\s*\\(`,
@@ -1002,11 +1080,15 @@ function transformRouter(code, filePath, routerFnNames, absolutePath) {
1002
1080
  }
1003
1081
  function exposeRouterId() {
1004
1082
  let projectRoot = "";
1083
+ const counter = createCounter(debug2, "expose-router-id");
1005
1084
  return {
1006
1085
  name: "@rangojs/router:expose-router-id",
1007
1086
  configResolved(config) {
1008
1087
  projectRoot = config.root;
1009
1088
  },
1089
+ buildEnd() {
1090
+ counter?.flush();
1091
+ },
1010
1092
  transform(code, id) {
1011
1093
  if (!code.includes("createRouter")) return null;
1012
1094
  if (!/import\s*\{[^}]*\bcreateRouter\b[^}]*\}\s*from\s*["']@rangojs\/router(?:\/server)?["']/.test(
@@ -1015,14 +1097,25 @@ function exposeRouterId() {
1015
1097
  return null;
1016
1098
  }
1017
1099
  if (id.includes("node_modules")) return null;
1018
- const filePath = normalizePath(path3.relative(projectRoot, id));
1019
- const routerFnNames = getImportedFnNames(code, "createRouter");
1020
- return transformRouter(code, filePath, routerFnNames, normalizePath(id));
1100
+ const start = counter ? performance.now() : 0;
1101
+ try {
1102
+ const filePath = normalizePath(path3.relative(projectRoot, id));
1103
+ const routerFnNames = getImportedFnNames(code, "createRouter");
1104
+ return transformRouter(
1105
+ code,
1106
+ filePath,
1107
+ routerFnNames,
1108
+ normalizePath(id)
1109
+ );
1110
+ } finally {
1111
+ counter?.record(id, performance.now() - start);
1112
+ }
1021
1113
  }
1022
1114
  };
1023
1115
  }
1024
1116
 
1025
1117
  // src/vite/plugins/expose-internal-ids.ts
1118
+ var debug3 = createRangoDebugger("rango:transform");
1026
1119
  var VIRTUAL_LOADER_MANIFEST = "virtual:rsc-router/loader-manifest";
1027
1120
  var RESOLVED_VIRTUAL_LOADER_MANIFEST = "\0" + VIRTUAL_LOADER_MANIFEST;
1028
1121
  var VIRTUAL_HANDLER_PREFIX = "virtual:handler-extract:";
@@ -1035,9 +1128,13 @@ function exposeInternalIds(options) {
1035
1128
  const staticHandlerModules = /* @__PURE__ */ new Map();
1036
1129
  const virtualHandlers = /* @__PURE__ */ new Map();
1037
1130
  const unsupportedShapeWarnings = /* @__PURE__ */ new Set();
1131
+ const counter = createCounter(debug3, "expose-internal-ids");
1038
1132
  return {
1039
1133
  name: "@rangojs/router:expose-internal-ids",
1040
1134
  enforce: "post",
1135
+ buildEnd() {
1136
+ counter?.flush();
1137
+ },
1041
1138
  api: {
1042
1139
  prerenderHandlerModules,
1043
1140
  staticHandlerModules
@@ -1151,11 +1248,13 @@ ${lazyImports.join(",\n")}
1151
1248
  // --------------- Unified transform ---------------
1152
1249
  transform(code, id) {
1153
1250
  if (id.includes("/node_modules/")) return;
1154
- const filePath = normalizePath(path4.relative(projectRoot, id));
1155
- const isRscEnv = this.environment?.name === "rsc";
1156
- if (id.includes(".named-routes.gen.") && !isRscEnv && this.environment?.name === "client") {
1157
- this.warn(
1158
- `
1251
+ const __t0 = counter ? performance.now() : 0;
1252
+ try {
1253
+ const filePath = normalizePath(path4.relative(projectRoot, id));
1254
+ const isRscEnv = this.environment?.name === "rsc";
1255
+ if (id.includes(".named-routes.gen.") && !isRscEnv && this.environment?.name === "client") {
1256
+ this.warn(
1257
+ `
1159
1258
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1160
1259
  !! !!
1161
1260
  !! WARNING: NamedRoutes imported in a CLIENT component! !!
@@ -1175,228 +1274,373 @@ ${lazyImports.join(",\n")}
1175
1274
  !! !!
1176
1275
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1177
1276
  `
1178
- );
1179
- }
1180
- if (!code.includes("@rangojs/router")) return;
1181
- const has = detectImports(code);
1182
- const hasLoaderCode = has.loader && code.includes("createLoader");
1183
- const hasHandleCode = has.handle && code.includes("createHandle");
1184
- const hasLocationStateCode = has.locationState && code.includes("createLocationState");
1185
- const hasPrerenderHandlerCode = has.prerenderHandler && code.includes("Prerender");
1186
- const hasStaticHandlerCode = has.staticHandler && code.includes("Static");
1187
- if (!hasLoaderCode && !hasHandleCode && !hasLocationStateCode && !hasPrerenderHandlerCode && !hasStaticHandlerCode) {
1188
- return;
1189
- }
1190
- const _fnNamesCache = /* @__PURE__ */ new Map();
1191
- const _bindingsCache = /* @__PURE__ */ new Map();
1192
- let _cachedAst;
1193
- let _astParseFailed = false;
1194
- let _astCodeRef = code;
1195
- const getFnNames = (canonicalName) => {
1196
- let result = _fnNamesCache.get(canonicalName);
1197
- if (!result) {
1198
- result = getImportedFnNames(code, canonicalName);
1199
- _fnNamesCache.set(canonicalName, result);
1277
+ );
1200
1278
  }
1201
- return result;
1202
- };
1203
- const lazyAst = () => {
1204
- if (code !== _astCodeRef) {
1205
- _cachedAst = void 0;
1206
- _astParseFailed = false;
1207
- _astCodeRef = code;
1279
+ if (!code.includes("@rangojs/router")) return;
1280
+ const has = detectImports(code);
1281
+ const hasLoaderCode = has.loader && code.includes("createLoader");
1282
+ const hasHandleCode = has.handle && code.includes("createHandle");
1283
+ const hasLocationStateCode = has.locationState && code.includes("createLocationState");
1284
+ const hasPrerenderHandlerCode = has.prerenderHandler && code.includes("Prerender");
1285
+ const hasStaticHandlerCode = has.staticHandler && code.includes("Static");
1286
+ if (!hasLoaderCode && !hasHandleCode && !hasLocationStateCode && !hasPrerenderHandlerCode && !hasStaticHandlerCode) {
1287
+ return;
1208
1288
  }
1209
- if (_cachedAst !== void 0 || _astParseFailed) return _cachedAst;
1210
- try {
1211
- _cachedAst = parseAst2(code, { jsx: true });
1212
- } catch {
1213
- _astParseFailed = true;
1289
+ const _fnNamesCache = /* @__PURE__ */ new Map();
1290
+ const _bindingsCache = /* @__PURE__ */ new Map();
1291
+ let _cachedAst;
1292
+ let _astParseFailed = false;
1293
+ let _astCodeRef = code;
1294
+ const getFnNames = (canonicalName) => {
1295
+ let result = _fnNamesCache.get(canonicalName);
1296
+ if (!result) {
1297
+ result = getImportedFnNames(code, canonicalName);
1298
+ _fnNamesCache.set(canonicalName, result);
1299
+ }
1300
+ return result;
1301
+ };
1302
+ const lazyAst = () => {
1303
+ if (code !== _astCodeRef) {
1304
+ _cachedAst = void 0;
1305
+ _astParseFailed = false;
1306
+ _astCodeRef = code;
1307
+ }
1308
+ if (_cachedAst !== void 0 || _astParseFailed) return _cachedAst;
1309
+ try {
1310
+ _cachedAst = parseAst2(code, { jsx: true });
1311
+ } catch {
1312
+ _astParseFailed = true;
1313
+ }
1314
+ return _cachedAst;
1315
+ };
1316
+ const getBindings = (currentCode, fnNames) => {
1317
+ const key = fnNames.join("\0");
1318
+ let result = _bindingsCache.get(key);
1319
+ if (!result) {
1320
+ result = collectCreateExportBindings(
1321
+ currentCode,
1322
+ fnNames,
1323
+ lazyAst()
1324
+ );
1325
+ _bindingsCache.set(key, result);
1326
+ }
1327
+ return result;
1328
+ };
1329
+ for (const cfg of STRICT_CREATE_CONFIGS) {
1330
+ const hasCode = cfg.fnName === "createLoader" ? hasLoaderCode : cfg.fnName === "createHandle" ? hasHandleCode : hasLocationStateCode;
1331
+ if (!hasCode) continue;
1332
+ const fnNames = getFnNames(cfg.fnName);
1333
+ const totalCalls = countCreateCallsForNames(code, fnNames);
1334
+ const supportedBindings = getBindings(code, fnNames).length;
1335
+ if (totalCalls <= supportedBindings) continue;
1336
+ const warnKey = `${id}::${cfg.fnName}`;
1337
+ if (unsupportedShapeWarnings.has(warnKey)) continue;
1338
+ unsupportedShapeWarnings.add(warnKey);
1339
+ this.warn(buildUnsupportedShapeWarning(filePath, cfg.fnName));
1214
1340
  }
1215
- return _cachedAst;
1216
- };
1217
- const getBindings = (currentCode, fnNames) => {
1218
- const key = fnNames.join("\0");
1219
- let result = _bindingsCache.get(key);
1220
- if (!result) {
1221
- result = collectCreateExportBindings(currentCode, fnNames, lazyAst());
1222
- _bindingsCache.set(key, result);
1341
+ if (hasLoaderCode && isRscEnv) {
1342
+ const fnNames = getFnNames("createLoader");
1343
+ const bindings = getBindings(code, fnNames);
1344
+ for (const binding of bindings) {
1345
+ const exportName = binding.exportNames[0];
1346
+ const hashedId = hashId(filePath, exportName);
1347
+ loaderRegistry.set(hashedId, {
1348
+ filePath,
1349
+ exportName
1350
+ });
1351
+ }
1223
1352
  }
1224
- return result;
1225
- };
1226
- for (const cfg of STRICT_CREATE_CONFIGS) {
1227
- const hasCode = cfg.fnName === "createLoader" ? hasLoaderCode : cfg.fnName === "createHandle" ? hasHandleCode : hasLocationStateCode;
1228
- if (!hasCode) continue;
1229
- const fnNames = getFnNames(cfg.fnName);
1230
- const totalCalls = countCreateCallsForNames(code, fnNames);
1231
- const supportedBindings = getBindings(code, fnNames).length;
1232
- if (totalCalls <= supportedBindings) continue;
1233
- const warnKey = `${id}::${cfg.fnName}`;
1234
- if (unsupportedShapeWarnings.has(warnKey)) continue;
1235
- unsupportedShapeWarnings.add(warnKey);
1236
- this.warn(buildUnsupportedShapeWarning(filePath, cfg.fnName));
1237
- }
1238
- if (hasLoaderCode && isRscEnv) {
1239
- const fnNames = getFnNames("createLoader");
1240
- const bindings = getBindings(code, fnNames);
1241
- for (const binding of bindings) {
1242
- const exportName = binding.exportNames[0];
1243
- const hashedId = hashId(filePath, exportName);
1244
- loaderRegistry.set(hashedId, {
1353
+ if (hasLoaderCode && !isRscEnv) {
1354
+ const fnNames = getFnNames("createLoader");
1355
+ const bindings = getBindings(code, fnNames);
1356
+ const stubResult = generateClientLoaderStubs(
1357
+ bindings,
1358
+ code,
1245
1359
  filePath,
1246
- exportName
1247
- });
1360
+ isBuild
1361
+ );
1362
+ if (stubResult) return stubResult;
1248
1363
  }
1249
- }
1250
- if (hasLoaderCode && !isRscEnv) {
1251
- const fnNames = getFnNames("createLoader");
1252
- const bindings = getBindings(code, fnNames);
1253
- const stubResult = generateClientLoaderStubs(
1254
- bindings,
1255
- code,
1256
- filePath,
1257
- isBuild
1258
- );
1259
- if (stubResult) return stubResult;
1260
- }
1261
- if (hasPrerenderHandlerCode && !isRscEnv) {
1262
- const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
1263
- const bindings = getBindings(code, fnNames);
1264
- const wholeFile = generateWholeFileStubs(
1265
- PRERENDER_CONFIG,
1266
- bindings,
1267
- code,
1268
- filePath,
1269
- isBuild
1270
- );
1271
- if (wholeFile) return wholeFile;
1272
- const exprStubs = generateExprStubs(
1273
- PRERENDER_CONFIG,
1274
- bindings,
1275
- code,
1276
- filePath,
1277
- id,
1278
- isBuild
1279
- );
1280
- if (exprStubs) return exprStubs;
1281
- }
1282
- if (hasPrerenderHandlerCode && isRscEnv && isBuild) {
1283
- const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
1284
- const exportNames = getBindings(code, fnNames).map(
1285
- (b) => b.exportNames[0]
1286
- );
1287
- if (exportNames.length > 0) {
1288
- prerenderHandlerModules.set(id, exportNames);
1364
+ if (hasPrerenderHandlerCode && !isRscEnv) {
1365
+ const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
1366
+ const bindings = getBindings(code, fnNames);
1367
+ const wholeFile = generateWholeFileStubs(
1368
+ PRERENDER_CONFIG,
1369
+ bindings,
1370
+ code,
1371
+ filePath,
1372
+ isBuild
1373
+ );
1374
+ if (wholeFile) return wholeFile;
1289
1375
  }
1290
- }
1291
- let changed = false;
1292
- const handlerConfigs = [
1293
- hasStaticHandlerCode && STATIC_CONFIG,
1294
- hasPrerenderHandlerCode && PRERENDER_CONFIG
1295
- ].filter((c) => !!c).map((cfg) => {
1296
- const fnNames = getFnNames(cfg.fnName);
1297
- return { cfg, fnNames };
1298
- });
1299
- for (const { cfg, fnNames } of handlerConfigs) {
1300
- const totalCalls = countCreateCallsForNames(code, fnNames);
1301
- const supportedBindings = getBindings(code, fnNames).length;
1302
- if (totalCalls > supportedBindings) {
1303
- const iterS = new MagicString4(code);
1304
- const result = transformInlineHandlers(
1305
- cfg.fnName,
1306
- VIRTUAL_HANDLER_PREFIX,
1307
- iterS,
1376
+ if (hasPrerenderHandlerCode && isRscEnv && isBuild) {
1377
+ const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
1378
+ const exportNames = getBindings(code, fnNames).map(
1379
+ (b) => b.exportNames[0]
1380
+ );
1381
+ if (exportNames.length > 0) {
1382
+ prerenderHandlerModules.set(id, exportNames);
1383
+ }
1384
+ }
1385
+ let changed = false;
1386
+ const handlerConfigs = [
1387
+ hasStaticHandlerCode && STATIC_CONFIG,
1388
+ hasPrerenderHandlerCode && PRERENDER_CONFIG
1389
+ ].filter((c) => !!c).map((cfg) => {
1390
+ const fnNames = getFnNames(cfg.fnName);
1391
+ return { cfg, fnNames };
1392
+ });
1393
+ for (const { cfg, fnNames } of handlerConfigs) {
1394
+ const totalCalls = countCreateCallsForNames(code, fnNames);
1395
+ const supportedBindings = getBindings(code, fnNames).length;
1396
+ if (totalCalls > supportedBindings) {
1397
+ const iterS = new MagicString4(code);
1398
+ const result = transformInlineHandlers(
1399
+ cfg.fnName,
1400
+ VIRTUAL_HANDLER_PREFIX,
1401
+ iterS,
1402
+ code,
1403
+ filePath,
1404
+ virtualHandlers,
1405
+ id,
1406
+ parseAst2
1407
+ );
1408
+ if (result) {
1409
+ changed = true;
1410
+ code = iterS.toString();
1411
+ _bindingsCache.clear();
1412
+ }
1413
+ }
1414
+ }
1415
+ if (hasStaticHandlerCode && !isRscEnv) {
1416
+ const fnNames = getFnNames(STATIC_CONFIG.fnName);
1417
+ const bindings = getBindings(code, fnNames);
1418
+ const wholeFile = generateWholeFileStubs(
1419
+ STATIC_CONFIG,
1420
+ bindings,
1308
1421
  code,
1309
1422
  filePath,
1310
- virtualHandlers,
1311
- id,
1312
- parseAst2
1423
+ isBuild
1313
1424
  );
1314
- if (result) {
1315
- changed = true;
1316
- code = iterS.toString();
1317
- _bindingsCache.clear();
1425
+ if (wholeFile) return wholeFile;
1426
+ }
1427
+ if (!isRscEnv && (hasPrerenderHandlerCode || hasStaticHandlerCode)) {
1428
+ const prerenderFnNames = hasPrerenderHandlerCode ? getFnNames(PRERENDER_CONFIG.fnName) : [];
1429
+ const staticFnNames = hasStaticHandlerCode ? getFnNames(STATIC_CONFIG.fnName) : [];
1430
+ const loaderFnNames = hasLoaderCode ? getFnNames("createLoader") : [];
1431
+ const handleFnNames = hasHandleCode ? getFnNames("createHandle") : [];
1432
+ const lsFnNames = hasLocationStateCode ? getFnNames("createLocationState") : [];
1433
+ const allBindings = [];
1434
+ for (const fnNames of [
1435
+ prerenderFnNames,
1436
+ staticFnNames,
1437
+ loaderFnNames,
1438
+ handleFnNames,
1439
+ lsFnNames
1440
+ ]) {
1441
+ if (fnNames.length > 0) {
1442
+ allBindings.push(...getBindings(code, fnNames));
1443
+ }
1444
+ }
1445
+ let canStubWholeFile = allBindings.length > 0 && isExportOnlyFile(code, allBindings);
1446
+ if (canStubWholeFile && (handleFnNames.length > 0 || lsFnNames.length > 0)) {
1447
+ const exportedLocals = new Set(allBindings.map((b) => b.localName));
1448
+ const strippedBindings = [];
1449
+ const localDeclPattern = /(?:^|;|\n)\s*(?:const|let|var|function)\s+(\w+)/g;
1450
+ let declMatch;
1451
+ while ((declMatch = localDeclPattern.exec(code)) !== null) {
1452
+ const name = declMatch[1];
1453
+ if (!exportedLocals.has(name) && !/^_c\d*$/.test(name)) {
1454
+ strippedBindings.push(name);
1455
+ }
1456
+ }
1457
+ const importPattern = /import\s*\{([^}]*)\}\s*from\s*["'](?!@rangojs\/router)[^"']*["']/g;
1458
+ let importMatch;
1459
+ while ((importMatch = importPattern.exec(code)) !== null) {
1460
+ for (const spec of importMatch[1].split(",")) {
1461
+ const m = spec.trim().match(/^[A-Za-z_$][\w$]*(?:\s+as\s+([A-Za-z_$][\w$]*))?$/);
1462
+ if (m)
1463
+ strippedBindings.push(m[1] || m[0].trim().split(/\s/)[0]);
1464
+ }
1465
+ }
1466
+ const defaultImportPattern = /import\s+([A-Za-z_$][\w$]*)\s+from\s*["'](?!@rangojs\/router)[^"']*["']/g;
1467
+ while ((importMatch = defaultImportPattern.exec(code)) !== null) {
1468
+ strippedBindings.push(importMatch[1]);
1469
+ }
1470
+ const nsImportPattern = /import\s+\*\s+as\s+([A-Za-z_$][\w$]*)\s+from\s*["'](?!@rangojs\/router)[^"']*["']/g;
1471
+ while ((importMatch = nsImportPattern.exec(code)) !== null) {
1472
+ strippedBindings.push(importMatch[1]);
1473
+ }
1474
+ if (strippedBindings.length > 0) {
1475
+ const preservedBindings = allBindings.filter((b) => {
1476
+ const fc = code.slice(b.callExprStart, b.callOpenParenPos + 1);
1477
+ return handleFnNames.some((n) => fc.includes(n)) || lsFnNames.some((n) => fc.includes(n));
1478
+ });
1479
+ const strippedRe = new RegExp(
1480
+ `\\b(?:${strippedBindings.join("|")})\\b`
1481
+ );
1482
+ canStubWholeFile = !preservedBindings.some((b) => {
1483
+ const expr = code.slice(
1484
+ b.callExprStart,
1485
+ b.callCloseParenPos + 1
1486
+ );
1487
+ return strippedRe.test(expr);
1488
+ });
1489
+ }
1490
+ }
1491
+ if (canStubWholeFile) {
1492
+ const lines = [];
1493
+ const neededImports = [];
1494
+ if (handleFnNames.length > 0) neededImports.push("createHandle");
1495
+ if (lsFnNames.length > 0) neededImports.push("createLocationState");
1496
+ if (neededImports.length > 0) {
1497
+ lines.push(
1498
+ `import { ${neededImports.join(", ")} } from "@rangojs/router";`
1499
+ );
1500
+ }
1501
+ for (const binding of allBindings) {
1502
+ const fnCall = code.slice(
1503
+ binding.callExprStart,
1504
+ binding.callOpenParenPos + 1
1505
+ );
1506
+ const isHandle = handleFnNames.some((n) => fnCall.includes(n));
1507
+ const isLocationState = lsFnNames.some((n) => fnCall.includes(n));
1508
+ const primaryName = binding.exportNames[0];
1509
+ const stubId = makeStubId(filePath, primaryName, isBuild);
1510
+ if (isHandle || isLocationState) {
1511
+ const rawArgs = code.slice(
1512
+ binding.callOpenParenPos + 1,
1513
+ binding.callCloseParenPos
1514
+ ).replace(/\b_c\d*\s*=\s*/g, "");
1515
+ const canonicalName = isHandle ? "createHandle" : "createLocationState";
1516
+ const activeFnNames = isHandle ? handleFnNames : lsFnNames;
1517
+ let rawCallee = code.slice(
1518
+ binding.callExprStart,
1519
+ binding.callOpenParenPos
1520
+ );
1521
+ for (const alias of activeFnNames) {
1522
+ if (alias !== canonicalName && rawCallee.startsWith(alias)) {
1523
+ rawCallee = canonicalName + rawCallee.slice(alias.length);
1524
+ break;
1525
+ }
1526
+ }
1527
+ if (isHandle) {
1528
+ const idParam = binding.argCount === 0 ? `undefined, "${stubId}"` : `, "${stubId}"`;
1529
+ lines.push(
1530
+ `export const ${primaryName} = ${rawCallee}(${rawArgs}${idParam});`
1531
+ );
1532
+ lines.push(`${primaryName}.$$id = "${stubId}";`);
1533
+ } else {
1534
+ lines.push(
1535
+ `export const ${primaryName} = ${rawCallee}(${rawArgs});`
1536
+ );
1537
+ lines.push(
1538
+ `${primaryName}.__rsc_ls_key = "__rsc_ls_${stubId}";`
1539
+ );
1540
+ }
1541
+ for (const name of binding.exportNames.slice(1)) {
1542
+ lines.push(`export const ${name} = ${primaryName};`);
1543
+ }
1544
+ } else {
1545
+ let brand = "loader";
1546
+ if (prerenderFnNames.some((n) => fnCall.includes(n))) {
1547
+ brand = PRERENDER_CONFIG.brand;
1548
+ } else if (staticFnNames.some((n) => fnCall.includes(n))) {
1549
+ brand = STATIC_CONFIG.brand;
1550
+ }
1551
+ lines.push(
1552
+ `export const ${primaryName} = { __brand: "${brand}", $$id: "${stubId}" };`
1553
+ );
1554
+ for (const name of binding.exportNames.slice(1)) {
1555
+ lines.push(`export const ${name} = ${primaryName};`);
1556
+ }
1557
+ }
1558
+ }
1559
+ return { code: lines.join("\n") + "\n", map: null };
1318
1560
  }
1319
1561
  }
1320
- }
1321
- if (hasStaticHandlerCode && !isRscEnv) {
1322
- const fnNames = getFnNames(STATIC_CONFIG.fnName);
1323
- const bindings = getBindings(code, fnNames);
1324
- const wholeFile = generateWholeFileStubs(
1325
- STATIC_CONFIG,
1326
- bindings,
1327
- code,
1328
- filePath,
1329
- isBuild
1330
- );
1331
- if (wholeFile) return wholeFile;
1332
- const exprStubs = generateExprStubs(
1333
- STATIC_CONFIG,
1334
- bindings,
1335
- code,
1336
- filePath,
1337
- id,
1338
- isBuild
1339
- );
1340
- if (exprStubs) return exprStubs;
1341
- }
1342
- if (hasStaticHandlerCode && isRscEnv && isBuild) {
1343
- const fnNames = getFnNames(STATIC_CONFIG.fnName);
1344
- const exportNames = getBindings(code, fnNames).map(
1345
- (b) => b.exportNames[0]
1346
- );
1347
- if (exportNames.length > 0) {
1348
- staticHandlerModules.set(id, exportNames);
1562
+ if (hasStaticHandlerCode && isRscEnv && isBuild) {
1563
+ const fnNames = getFnNames(STATIC_CONFIG.fnName);
1564
+ const exportNames = getBindings(code, fnNames).map(
1565
+ (b) => b.exportNames[0]
1566
+ );
1567
+ if (exportNames.length > 0) {
1568
+ staticHandlerModules.set(id, exportNames);
1569
+ }
1349
1570
  }
1571
+ const s = new MagicString4(code);
1572
+ if (hasLoaderCode) {
1573
+ const fnNames = getFnNames("createLoader");
1574
+ changed = transformLoaders(
1575
+ getBindings(code, fnNames),
1576
+ s,
1577
+ filePath,
1578
+ isBuild
1579
+ ) || changed;
1580
+ }
1581
+ if (hasHandleCode) {
1582
+ const fnNames = getFnNames("createHandle");
1583
+ changed = transformHandles(
1584
+ getBindings(code, fnNames),
1585
+ s,
1586
+ code,
1587
+ filePath,
1588
+ isBuild
1589
+ ) || changed;
1590
+ }
1591
+ if (hasLocationStateCode) {
1592
+ const fnNames = getFnNames("createLocationState");
1593
+ changed = transformLocationState(
1594
+ getBindings(code, fnNames),
1595
+ s,
1596
+ filePath,
1597
+ isBuild
1598
+ ) || changed;
1599
+ }
1600
+ if (hasPrerenderHandlerCode) {
1601
+ const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
1602
+ const bindings = getBindings(code, fnNames);
1603
+ if (isRscEnv) {
1604
+ changed = transformHandlerIds(
1605
+ PRERENDER_CONFIG,
1606
+ bindings,
1607
+ s,
1608
+ filePath,
1609
+ isBuild
1610
+ ) || changed;
1611
+ } else {
1612
+ changed = stubHandlerExprs(
1613
+ PRERENDER_CONFIG,
1614
+ bindings,
1615
+ s,
1616
+ filePath,
1617
+ isBuild
1618
+ ) || changed;
1619
+ }
1620
+ }
1621
+ if (hasStaticHandlerCode) {
1622
+ const fnNames = getFnNames(STATIC_CONFIG.fnName);
1623
+ const bindings = getBindings(code, fnNames);
1624
+ if (isRscEnv) {
1625
+ changed = transformHandlerIds(
1626
+ STATIC_CONFIG,
1627
+ bindings,
1628
+ s,
1629
+ filePath,
1630
+ isBuild
1631
+ ) || changed;
1632
+ } else {
1633
+ changed = stubHandlerExprs(STATIC_CONFIG, bindings, s, filePath, isBuild) || changed;
1634
+ }
1635
+ }
1636
+ if (!changed) return;
1637
+ return {
1638
+ code: s.toString(),
1639
+ map: s.generateMap({ source: id, includeContent: true })
1640
+ };
1641
+ } finally {
1642
+ counter?.record(id, performance.now() - __t0);
1350
1643
  }
1351
- const s = new MagicString4(code);
1352
- if (hasLoaderCode) {
1353
- const fnNames = getFnNames("createLoader");
1354
- changed = transformLoaders(getBindings(code, fnNames), s, filePath, isBuild) || changed;
1355
- }
1356
- if (hasHandleCode) {
1357
- const fnNames = getFnNames("createHandle");
1358
- changed = transformHandles(
1359
- getBindings(code, fnNames),
1360
- s,
1361
- code,
1362
- filePath,
1363
- isBuild
1364
- ) || changed;
1365
- }
1366
- if (hasLocationStateCode) {
1367
- const fnNames = getFnNames("createLocationState");
1368
- changed = transformLocationState(
1369
- getBindings(code, fnNames),
1370
- s,
1371
- filePath,
1372
- isBuild
1373
- ) || changed;
1374
- }
1375
- if (hasPrerenderHandlerCode && isRscEnv) {
1376
- const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
1377
- changed = transformHandlerIds(
1378
- PRERENDER_CONFIG,
1379
- getBindings(code, fnNames),
1380
- s,
1381
- filePath,
1382
- isBuild
1383
- ) || changed;
1384
- }
1385
- if (hasStaticHandlerCode && isRscEnv) {
1386
- const fnNames = getFnNames(STATIC_CONFIG.fnName);
1387
- changed = transformHandlerIds(
1388
- STATIC_CONFIG,
1389
- getBindings(code, fnNames),
1390
- s,
1391
- filePath,
1392
- isBuild
1393
- ) || changed;
1394
- }
1395
- if (!changed) return;
1396
- return {
1397
- code: s.toString(),
1398
- map: s.generateMap({ source: id, includeContent: true })
1399
- };
1400
1644
  }
1401
1645
  };
1402
1646
  }
@@ -1404,12 +1648,14 @@ ${lazyImports.join(",\n")}
1404
1648
  // src/vite/plugins/use-cache-transform.ts
1405
1649
  import path5 from "node:path";
1406
1650
  import MagicString5 from "magic-string";
1651
+ var debug4 = createRangoDebugger("rango:transform");
1407
1652
  var CACHE_RUNTIME_IMPORT = "@rangojs/router/cache-runtime";
1408
1653
  var LAYOUT_TEMPLATE_PATTERN = /\/(layout|template)\.(tsx?|jsx?)$/;
1409
1654
  function useCacheTransform() {
1410
1655
  let projectRoot = "";
1411
1656
  let isBuild = false;
1412
1657
  let rscTransforms = null;
1658
+ const counter = createCounter(debug4, "use-cache");
1413
1659
  return {
1414
1660
  name: "@rangojs/router:use-cache",
1415
1661
  enforce: "post",
@@ -1417,53 +1663,61 @@ function useCacheTransform() {
1417
1663
  projectRoot = config.root;
1418
1664
  isBuild = config.command === "build";
1419
1665
  },
1666
+ buildEnd() {
1667
+ counter?.flush();
1668
+ },
1420
1669
  async transform(code, id) {
1421
1670
  if (this.environment?.name !== "rsc") return;
1422
1671
  if (!code.includes("use cache")) return;
1423
1672
  if (id.includes("/node_modules/") || id.startsWith("\0")) return;
1424
1673
  if (!/\.(tsx?|jsx?|mjs)$/.test(id)) return;
1425
- if (!rscTransforms) {
1674
+ const start = counter ? performance.now() : 0;
1675
+ try {
1676
+ if (!rscTransforms) {
1677
+ try {
1678
+ rscTransforms = await import("@vitejs/plugin-rsc/transforms");
1679
+ } catch {
1680
+ return;
1681
+ }
1682
+ }
1683
+ const {
1684
+ hasDirective,
1685
+ transformWrapExport,
1686
+ transformHoistInlineDirective
1687
+ } = rscTransforms;
1688
+ let ast;
1426
1689
  try {
1427
- rscTransforms = await import("@vitejs/plugin-rsc/transforms");
1690
+ const { parseAst: parseAst4 } = await import("vite");
1691
+ ast = parseAst4(code);
1428
1692
  } catch {
1429
1693
  return;
1430
1694
  }
1431
- }
1432
- const {
1433
- hasDirective,
1434
- transformWrapExport,
1435
- transformHoistInlineDirective
1436
- } = rscTransforms;
1437
- let ast;
1438
- try {
1439
- const { parseAst: parseAst4 } = await import("vite");
1440
- ast = parseAst4(code);
1441
- } catch {
1442
- return;
1443
- }
1444
- const filePath = normalizePath(path5.relative(projectRoot, id));
1445
- const isLayoutOrTemplate = LAYOUT_TEMPLATE_PATTERN.test(id);
1446
- if (hasDirective(ast.body, "use cache")) {
1447
- return transformFileLevelUseCache(
1695
+ const filePath = normalizePath(path5.relative(projectRoot, id));
1696
+ const isLayoutOrTemplate = LAYOUT_TEMPLATE_PATTERN.test(id);
1697
+ if (hasDirective(ast.body, "use cache")) {
1698
+ return transformFileLevelUseCache(
1699
+ code,
1700
+ ast,
1701
+ filePath,
1702
+ id,
1703
+ isBuild,
1704
+ isLayoutOrTemplate,
1705
+ transformWrapExport
1706
+ );
1707
+ }
1708
+ const functionResult = transformFunctionLevelUseCache(
1448
1709
  code,
1449
1710
  ast,
1450
1711
  filePath,
1451
1712
  id,
1452
1713
  isBuild,
1453
- isLayoutOrTemplate,
1454
- transformWrapExport
1714
+ transformHoistInlineDirective
1455
1715
  );
1716
+ warnOnNearMissDirectives(ast, id, this.warn.bind(this));
1717
+ if (functionResult) return functionResult;
1718
+ } finally {
1719
+ counter?.record(id, performance.now() - start);
1456
1720
  }
1457
- const functionResult = transformFunctionLevelUseCache(
1458
- code,
1459
- ast,
1460
- filePath,
1461
- id,
1462
- isBuild,
1463
- transformHoistInlineDirective
1464
- );
1465
- warnOnNearMissDirectives(ast, id, this.warn.bind(this));
1466
- if (functionResult) return functionResult;
1467
1721
  }
1468
1722
  };
1469
1723
  }
@@ -1586,6 +1840,7 @@ function warnOnNearMissDirectives(ast, fileId, warn) {
1586
1840
  }
1587
1841
 
1588
1842
  // src/vite/plugins/client-ref-dedup.ts
1843
+ var debug5 = createRangoDebugger("rango:transform");
1589
1844
  var CLIENT_IN_SERVER_PROXY_PREFIX = "virtual:vite-rsc/client-in-server-package-proxy/";
1590
1845
  function extractPackageName(absolutePath) {
1591
1846
  const marker = "/node_modules/";
@@ -1602,6 +1857,8 @@ function extractPackageName(absolutePath) {
1602
1857
  }
1603
1858
  function clientRefDedup() {
1604
1859
  let clientExclude = [];
1860
+ let hits = 0;
1861
+ const dedupedPackages = /* @__PURE__ */ new Set();
1605
1862
  return {
1606
1863
  name: "@rangojs/router:client-ref-dedup",
1607
1864
  enforce: "pre",
@@ -1610,6 +1867,16 @@ function clientRefDedup() {
1610
1867
  const clientEnv = config.environments?.["client"];
1611
1868
  clientExclude = clientEnv?.optimizeDeps?.exclude ?? config.optimizeDeps?.exclude ?? [];
1612
1869
  },
1870
+ buildEnd() {
1871
+ if (debug5 && hits > 0) {
1872
+ debug5(
1873
+ "client-ref-dedup: %d redirects across %d packages (%s)",
1874
+ hits,
1875
+ dedupedPackages.size,
1876
+ [...dedupedPackages].join(",")
1877
+ );
1878
+ }
1879
+ },
1613
1880
  resolveId(source, importer, options) {
1614
1881
  if (this.environment?.name !== "client") return;
1615
1882
  if (!importer?.includes(CLIENT_IN_SERVER_PROXY_PREFIX)) return;
@@ -1618,6 +1885,10 @@ function clientRefDedup() {
1618
1885
  const packageName = extractPackageName(source);
1619
1886
  if (!packageName) return;
1620
1887
  if (clientExclude.includes(packageName)) return;
1888
+ if (debug5) {
1889
+ hits++;
1890
+ dedupedPackages.add(packageName);
1891
+ }
1621
1892
  return `\0rango:dedup/${packageName}`;
1622
1893
  },
1623
1894
  load(id) {
@@ -1740,12 +2011,13 @@ function getVirtualVersionContent(version) {
1740
2011
 
1741
2012
  // src/vite/utils/package-resolution.ts
1742
2013
  import { existsSync } from "node:fs";
2014
+ import { createRequire } from "node:module";
1743
2015
  import { resolve } from "node:path";
1744
2016
 
1745
2017
  // package.json
1746
2018
  var package_default = {
1747
2019
  name: "@rangojs/router",
1748
- version: "0.0.0-experimental.9c9afef3",
2020
+ version: "0.0.0-experimental.9eb4192e",
1749
2021
  description: "Django-inspired RSC router with composable URL patterns",
1750
2022
  keywords: [
1751
2023
  "react",
@@ -1878,22 +2150,24 @@ var package_default = {
1878
2150
  tag: "experimental"
1879
2151
  },
1880
2152
  scripts: {
1881
- build: "pnpm dlx esbuild src/vite/index.ts --bundle --format=esm --outfile=dist/vite/index.js --platform=node --packages=external && pnpm dlx esbuild src/bin/rango.ts --bundle --format=esm --outfile=dist/bin/rango.js --platform=node --packages=external --banner:js='#!/usr/bin/env node' && chmod +x dist/bin/rango.js",
2153
+ build: "pnpm dlx esbuild src/vite/index.ts --bundle --format=esm --outfile=dist/vite/index.js --platform=node --packages=external && mkdir -p dist/vite/plugins && cp src/vite/plugins/cloudflare-protocol-loader-hook.mjs dist/vite/plugins/cloudflare-protocol-loader-hook.mjs && pnpm dlx esbuild src/bin/rango.ts --bundle --format=esm --outfile=dist/bin/rango.js --platform=node --packages=external --banner:js='#!/usr/bin/env node' && chmod +x dist/bin/rango.js",
1882
2154
  prepublishOnly: "pnpm build",
1883
- typecheck: "tsc --noEmit",
2155
+ typecheck: "tsc --noEmit && tsc -p tsconfig.strict-check.json --noEmit",
1884
2156
  test: "playwright test",
1885
2157
  "test:ui": "playwright test --ui",
1886
2158
  "test:unit": "vitest run",
1887
2159
  "test:unit:watch": "vitest"
1888
2160
  },
1889
2161
  dependencies: {
1890
- "@vitejs/plugin-rsc": "^0.5.14",
2162
+ "@vitejs/plugin-rsc": "^0.5.23",
2163
+ debug: "^4.4.1",
1891
2164
  "magic-string": "^0.30.17",
1892
2165
  picomatch: "^4.0.3",
1893
2166
  "rsc-html-stream": "^0.0.7"
1894
2167
  },
1895
2168
  devDependencies: {
1896
2169
  "@playwright/test": "^1.49.1",
2170
+ "@types/debug": "^4.1.12",
1897
2171
  "@types/node": "^24.10.1",
1898
2172
  "@types/react": "catalog:",
1899
2173
  "@types/react-dom": "catalog:",
@@ -1907,7 +2181,7 @@ var package_default = {
1907
2181
  },
1908
2182
  peerDependencies: {
1909
2183
  "@cloudflare/vite-plugin": "^1.25.0",
1910
- "@vitejs/plugin-rsc": "^0.5.14",
2184
+ "@vitejs/plugin-rsc": "^0.5.23",
1911
2185
  react: "^18.0.0 || ^19.0.0",
1912
2186
  vite: "^7.3.0"
1913
2187
  },
@@ -1922,6 +2196,7 @@ var package_default = {
1922
2196
  };
1923
2197
 
1924
2198
  // src/vite/utils/package-resolution.ts
2199
+ var require2 = createRequire(import.meta.url);
1925
2200
  var VIRTUAL_PACKAGE_NAME = "@rangojs/router";
1926
2201
  function getPublishedPackageName() {
1927
2202
  return package_default.name;
@@ -1962,6 +2237,20 @@ function getPackageAliases() {
1962
2237
  }
1963
2238
  return aliases;
1964
2239
  }
2240
+ function getVendorAliases() {
2241
+ const specs = [
2242
+ "@vitejs/plugin-rsc/vendor/react-server-dom/client.edge",
2243
+ "@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
2244
+ ];
2245
+ const aliases = {};
2246
+ for (const spec of specs) {
2247
+ try {
2248
+ aliases[spec] = require2.resolve(spec);
2249
+ } catch {
2250
+ }
2251
+ }
2252
+ return aliases;
2253
+ }
1965
2254
 
1966
2255
  // src/build/route-types/param-extraction.ts
1967
2256
  function extractParamsFromPattern(pattern) {
@@ -2317,7 +2606,7 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
2317
2606
  }
2318
2607
  return routeMap;
2319
2608
  }
2320
- function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut) {
2609
+ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut, inlineBlock) {
2321
2610
  visited = visited ?? /* @__PURE__ */ new Set();
2322
2611
  const realPath = resolve2(filePath);
2323
2612
  const key = variableName ? `${realPath}:${variableName}` : realPath;
@@ -2333,7 +2622,9 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
2333
2622
  return { routes: {}, searchSchemas: {} };
2334
2623
  }
2335
2624
  let block;
2336
- if (variableName) {
2625
+ if (inlineBlock) {
2626
+ block = inlineBlock;
2627
+ } else if (variableName) {
2337
2628
  const extracted = extractUrlsBlockForVariable(source, variableName);
2338
2629
  if (!extracted) return { routes: {}, searchSchemas: {} };
2339
2630
  block = extracted;
@@ -2452,7 +2743,7 @@ Router root: ${conflict.ancestor}
2452
2743
  Nested router: ${conflict.nested}
2453
2744
  Move the nested router into a sibling directory or configure it as a separate app root.`;
2454
2745
  }
2455
- function extractUrlsVariableFromRouter(code) {
2746
+ function extractUrlsFromRouter(code) {
2456
2747
  const sourceFile = ts5.createSourceFile(
2457
2748
  "router.tsx",
2458
2749
  code,
@@ -2466,24 +2757,70 @@ function extractUrlsVariableFromRouter(code) {
2466
2757
  const callee = node.expression;
2467
2758
  return ts5.isIdentifier(callee) && callee.text === "createRouter";
2468
2759
  }
2760
+ function isInlineBuilder(node) {
2761
+ return ts5.isArrowFunction(node) || ts5.isFunctionExpression(node);
2762
+ }
2763
+ function isRoutesOnCreateRouter(node) {
2764
+ if (!ts5.isPropertyAccessExpression(node.expression) || node.expression.name.text !== "routes")
2765
+ return false;
2766
+ let inner = node.expression.expression;
2767
+ while (ts5.isCallExpression(inner) && ts5.isPropertyAccessExpression(inner.expression)) {
2768
+ inner = inner.expression.expression;
2769
+ }
2770
+ return isCreateRouterCall(inner);
2771
+ }
2469
2772
  function visit(node) {
2470
2773
  if (result) return;
2471
- if (ts5.isCallExpression(node) && ts5.isPropertyAccessExpression(node.expression) && node.expression.name.text === "routes" && node.arguments.length >= 1 && ts5.isIdentifier(node.arguments[0])) {
2472
- let inner = node.expression.expression;
2473
- while (ts5.isCallExpression(inner) && ts5.isPropertyAccessExpression(inner.expression)) {
2474
- inner = inner.expression.expression;
2475
- }
2476
- if (isCreateRouterCall(inner)) {
2477
- result = node.arguments[0].text;
2478
- return;
2774
+ if (ts5.isCallExpression(node) && node.arguments.length >= 1 && isRoutesOnCreateRouter(node)) {
2775
+ const arg = node.arguments[0];
2776
+ if (ts5.isIdentifier(arg)) {
2777
+ result = { kind: "variable", name: arg.text };
2778
+ } else if (isInlineBuilder(arg)) {
2779
+ result = { kind: "inline", block: arg.getText(sourceFile) };
2479
2780
  }
2781
+ return;
2480
2782
  }
2481
2783
  if (isCreateRouterCall(node)) {
2482
2784
  const callExpr = node;
2483
- for (const arg of callExpr.arguments) {
2785
+ for (const callArg of callExpr.arguments) {
2786
+ if (ts5.isObjectLiteralExpression(callArg)) {
2787
+ for (const prop of callArg.properties) {
2788
+ if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "urls") {
2789
+ if (ts5.isIdentifier(prop.initializer)) {
2790
+ result = { kind: "variable", name: prop.initializer.text };
2791
+ } else if (isInlineBuilder(prop.initializer)) {
2792
+ result = {
2793
+ kind: "inline",
2794
+ block: prop.initializer.getText(sourceFile)
2795
+ };
2796
+ }
2797
+ return;
2798
+ }
2799
+ }
2800
+ }
2801
+ }
2802
+ }
2803
+ ts5.forEachChild(node, visit);
2804
+ }
2805
+ visit(sourceFile);
2806
+ return result;
2807
+ }
2808
+ function extractBasenameFromRouter(code) {
2809
+ const sourceFile = ts5.createSourceFile(
2810
+ "router.tsx",
2811
+ code,
2812
+ ts5.ScriptTarget.Latest,
2813
+ true,
2814
+ ts5.ScriptKind.TSX
2815
+ );
2816
+ let result;
2817
+ function visit(node) {
2818
+ if (result !== void 0) return;
2819
+ if (ts5.isCallExpression(node) && ts5.isIdentifier(node.expression) && node.expression.text === "createRouter") {
2820
+ for (const arg of node.arguments) {
2484
2821
  if (ts5.isObjectLiteralExpression(arg)) {
2485
2822
  for (const prop of arg.properties) {
2486
- if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "urls" && ts5.isIdentifier(prop.initializer)) {
2823
+ if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "basename" && ts5.isStringLiteral(prop.initializer)) {
2487
2824
  result = prop.initializer.text;
2488
2825
  return;
2489
2826
  }
@@ -2496,6 +2833,19 @@ function extractUrlsVariableFromRouter(code) {
2496
2833
  visit(sourceFile);
2497
2834
  return result;
2498
2835
  }
2836
+ function applyBasenameToRoutes(result, basename3) {
2837
+ const prefixed = {};
2838
+ for (const [name, pattern] of Object.entries(result.routes)) {
2839
+ if (pattern === "/") {
2840
+ prefixed[name] = basename3;
2841
+ } else if (basename3.endsWith("/") && pattern.startsWith("/")) {
2842
+ prefixed[name] = basename3 + pattern.slice(1);
2843
+ } else {
2844
+ prefixed[name] = basename3 + pattern;
2845
+ }
2846
+ }
2847
+ return { routes: prefixed, searchSchemas: result.searchSchemas };
2848
+ }
2499
2849
  function buildCombinedRouteMapForRouterFile(routerFilePath) {
2500
2850
  let routerSource;
2501
2851
  try {
@@ -2503,19 +2853,40 @@ function buildCombinedRouteMapForRouterFile(routerFilePath) {
2503
2853
  } catch {
2504
2854
  return { routes: {}, searchSchemas: {} };
2505
2855
  }
2506
- const urlsVarName = extractUrlsVariableFromRouter(routerSource);
2507
- if (!urlsVarName) {
2856
+ const extraction = extractUrlsFromRouter(routerSource);
2857
+ if (!extraction) {
2508
2858
  return { routes: {}, searchSchemas: {} };
2509
2859
  }
2510
- const imported = resolveImportedVariable(routerSource, urlsVarName);
2511
- if (imported) {
2512
- const targetFile = resolveImportPath(imported.specifier, routerFilePath);
2513
- if (!targetFile) {
2514
- return { routes: {}, searchSchemas: {} };
2860
+ const rawBasename = extractBasenameFromRouter(routerSource);
2861
+ const basename3 = rawBasename ? ("/" + rawBasename.replace(/^\/+|\/+$/g, "")).replace(/^\/$/, "") : void 0;
2862
+ let result;
2863
+ if (extraction.kind === "inline") {
2864
+ result = buildCombinedRouteMapWithSearch(
2865
+ routerFilePath,
2866
+ void 0,
2867
+ void 0,
2868
+ void 0,
2869
+ extraction.block
2870
+ );
2871
+ } else {
2872
+ const imported = resolveImportedVariable(routerSource, extraction.name);
2873
+ if (imported) {
2874
+ const targetFile = resolveImportPath(imported.specifier, routerFilePath);
2875
+ if (!targetFile) {
2876
+ return { routes: {}, searchSchemas: {} };
2877
+ }
2878
+ result = buildCombinedRouteMapWithSearch(
2879
+ targetFile,
2880
+ imported.exportedName
2881
+ );
2882
+ } else {
2883
+ result = buildCombinedRouteMapWithSearch(routerFilePath, extraction.name);
2515
2884
  }
2516
- return buildCombinedRouteMapWithSearch(targetFile, imported.exportedName);
2517
2885
  }
2518
- return buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
2886
+ if (basename3) {
2887
+ result = applyBasenameToRoutes(result, basename3);
2888
+ }
2889
+ return result;
2519
2890
  }
2520
2891
  function findRouterFiles(root, filter) {
2521
2892
  const result = [];
@@ -2540,25 +2911,15 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
2540
2911
  throw new Error(formatNestedRouterConflictError(nestedRouterConflict));
2541
2912
  }
2542
2913
  for (const routerFilePath of routerFilePaths) {
2543
- let routerSource;
2544
- try {
2545
- routerSource = readFileSync2(routerFilePath, "utf-8");
2546
- } catch {
2547
- continue;
2548
- }
2549
- const urlsVarName = extractUrlsVariableFromRouter(routerSource);
2550
- if (!urlsVarName) continue;
2551
- let result;
2552
- const imported = resolveImportedVariable(routerSource, urlsVarName);
2553
- if (imported) {
2554
- const targetFile = resolveImportPath(imported.specifier, routerFilePath);
2555
- if (!targetFile) continue;
2556
- result = buildCombinedRouteMapWithSearch(
2557
- targetFile,
2558
- imported.exportedName
2559
- );
2560
- } else {
2561
- result = buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
2914
+ const result = buildCombinedRouteMapForRouterFile(routerFilePath);
2915
+ if (Object.keys(result.routes).length === 0 && Object.keys(result.searchSchemas).length === 0) {
2916
+ let routerSource;
2917
+ try {
2918
+ routerSource = readFileSync2(routerFilePath, "utf-8");
2919
+ } catch {
2920
+ continue;
2921
+ }
2922
+ if (!extractUrlsFromRouter(routerSource)) continue;
2562
2923
  }
2563
2924
  const routerBasename = pathBasename(routerFilePath).replace(
2564
2925
  /\.(tsx?|jsx?)$/,
@@ -2712,9 +3073,9 @@ function createVersionPlugin() {
2712
3073
  configResolved(config) {
2713
3074
  isDev = config.command === "serve";
2714
3075
  },
2715
- configureServer(devServer2) {
2716
- server = devServer2;
2717
- devServer2.watcher.on("unlink", (filePath) => {
3076
+ configureServer(devServer) {
3077
+ server = devServer;
3078
+ devServer.watcher.on("unlink", (filePath) => {
2718
3079
  if (!isDev) return;
2719
3080
  if (!clientModuleSignatures.has(filePath)) return;
2720
3081
  clientModuleSignatures.delete(filePath);
@@ -2784,6 +3145,73 @@ function createVersionPlugin() {
2784
3145
 
2785
3146
  // src/vite/utils/shared-utils.ts
2786
3147
  import * as Vite from "vite";
3148
+
3149
+ // src/vite/plugins/performance-tracks.ts
3150
+ import { readFile } from "node:fs/promises";
3151
+ var debug6 = createRangoDebugger("rango:transform");
3152
+ var RSDW_PATCH_RE = /((?:var|let|const)\s+\w+\s*=\s*root\._children\s*,\s*(\w+)\s*=\s*root\._debugInfo\s*[;,])/;
3153
+ function buildPatchReplacement(match, debugInfoVar) {
3154
+ return `${match}
3155
+ if (${debugInfoVar} && 0 === ${debugInfoVar}.length && "fulfilled" === root.status) {
3156
+ var _resolved = "function" === typeof resolveLazy ? resolveLazy(root.value) : root.value;
3157
+ if ("object" === typeof _resolved && null !== _resolved && isArrayImpl(_resolved._debugInfo)) {
3158
+ ${debugInfoVar} = _resolved._debugInfo;
3159
+ }
3160
+ }`;
3161
+ }
3162
+ function patchRsdwClientDebugInfoRecovery(code) {
3163
+ const match = code.match(RSDW_PATCH_RE);
3164
+ if (!match) {
3165
+ return { code, debugInfoVar: null };
3166
+ }
3167
+ return {
3168
+ code: code.replace(match[1], buildPatchReplacement(match[1], match[2])),
3169
+ debugInfoVar: match[2]
3170
+ };
3171
+ }
3172
+ function performanceTracksOptimizeDepsPlugin() {
3173
+ return {
3174
+ name: "@rangojs/router:performance-tracks-optimize-deps",
3175
+ setup(build) {
3176
+ build.onLoad(
3177
+ {
3178
+ filter: /react-server-dom-webpack-client\.browser\.(development|production)\.js$/
3179
+ },
3180
+ async (args) => {
3181
+ const code = await readFile(args.path, "utf8");
3182
+ const patched = patchRsdwClientDebugInfoRecovery(code);
3183
+ return {
3184
+ contents: patched.code,
3185
+ loader: "js"
3186
+ };
3187
+ }
3188
+ );
3189
+ }
3190
+ };
3191
+ }
3192
+ function performanceTracksPlugin() {
3193
+ const counter = createCounter(debug6, "performance-tracks");
3194
+ return {
3195
+ name: "@rangojs/router:performance-tracks",
3196
+ buildEnd() {
3197
+ counter?.flush();
3198
+ },
3199
+ transform(code, id) {
3200
+ if (!id.includes("react-server-dom") || !id.includes("client")) return;
3201
+ const start = counter ? performance.now() : 0;
3202
+ try {
3203
+ const patched = patchRsdwClientDebugInfoRecovery(code);
3204
+ if (!patched.debugInfoVar) return;
3205
+ debug6?.("patched RSDW client (var: %s)", patched.debugInfoVar);
3206
+ return patched.code;
3207
+ } finally {
3208
+ counter?.record(id, performance.now() - start);
3209
+ }
3210
+ }
3211
+ };
3212
+ }
3213
+
3214
+ // src/vite/utils/shared-utils.ts
2787
3215
  var versionEsbuildPlugin = {
2788
3216
  name: "@rangojs/router-version",
2789
3217
  setup(build) {
@@ -2801,7 +3229,7 @@ var versionEsbuildPlugin = {
2801
3229
  }
2802
3230
  };
2803
3231
  var sharedEsbuildOptions = {
2804
- plugins: [versionEsbuildPlugin]
3232
+ plugins: [versionEsbuildPlugin, performanceTracksOptimizeDepsPlugin()]
2805
3233
  };
2806
3234
  function createVirtualEntriesPlugin(entries, routerPathRef) {
2807
3235
  const virtualModules = {};
@@ -2949,15 +3377,22 @@ function createVersionInjectorPlugin(rscEntryPath) {
2949
3377
  }
2950
3378
 
2951
3379
  // src/vite/plugins/cjs-to-esm.ts
3380
+ var debug7 = createRangoDebugger("rango:transform");
2952
3381
  function createCjsToEsmPlugin() {
3382
+ const counter = createCounter(debug7, "cjs-to-esm");
2953
3383
  return {
2954
3384
  name: "@rangojs/router:cjs-to-esm",
2955
3385
  enforce: "pre",
3386
+ buildEnd() {
3387
+ counter?.flush();
3388
+ },
2956
3389
  transform(code, id) {
2957
3390
  const cleanId = id.split("?")[0];
3391
+ const __t0 = counter ? performance.now() : 0;
2958
3392
  if (cleanId.includes("vendor/react-server-dom/client.browser.js") || cleanId.includes("vendor\\react-server-dom\\client.browser.js")) {
2959
3393
  const isProd = process.env.NODE_ENV === "production";
2960
3394
  const cjsFile = isProd ? "./cjs/react-server-dom-webpack-client.browser.production.js" : "./cjs/react-server-dom-webpack-client.browser.development.js";
3395
+ counter?.record(id, performance.now() - __t0);
2961
3396
  return {
2962
3397
  code: `export * from "${cjsFile}";`,
2963
3398
  map: null
@@ -2993,6 +3428,7 @@ function createCjsToEsmPlugin() {
2993
3428
  "export const $1 ="
2994
3429
  );
2995
3430
  transformed = license + "\n" + transformed;
3431
+ counter?.record(id, performance.now() - __t0);
2996
3432
  return {
2997
3433
  code: transformed,
2998
3434
  map: null
@@ -3007,6 +3443,8 @@ function createCjsToEsmPlugin() {
3007
3443
  import { createServer as createViteServer } from "vite";
3008
3444
  import { resolve as resolve8 } from "node:path";
3009
3445
  import { readFileSync as readFileSync6 } from "node:fs";
3446
+ import { createRequire as createRequire2, register } from "node:module";
3447
+ import { pathToFileURL } from "node:url";
3010
3448
 
3011
3449
  // src/vite/plugins/virtual-stub-plugin.ts
3012
3450
  function createVirtualStubPlugin() {
@@ -3032,9 +3470,117 @@ function createVirtualStubPlugin() {
3032
3470
  };
3033
3471
  }
3034
3472
 
3473
+ // src/vite/plugins/cloudflare-protocol-stub.ts
3474
+ var VIRTUAL_PREFIX = "virtual:rango-cloudflare-stub-";
3475
+ var NULL_PREFIX = "\0" + VIRTUAL_PREFIX;
3476
+ var CF_PREFIX = "cloudflare:";
3477
+ var BUILD_ENV_GLOBAL_KEY = "__rango_build_env__";
3478
+ var SOURCE_EXT_RE = /\.[mc]?[jt]sx?$/;
3479
+ var IMPORT_NODE_TYPES = /* @__PURE__ */ new Set([
3480
+ "ImportDeclaration",
3481
+ "ImportExpression",
3482
+ "ExportNamedDeclaration",
3483
+ "ExportAllDeclaration"
3484
+ ]);
3485
+ var STUBS = {
3486
+ "cloudflare:workers": `
3487
+ export class DurableObject { constructor(_ctx, _env) {} }
3488
+ export class WorkerEntrypoint { constructor(_ctx, _env) {} }
3489
+ export class WorkflowEntrypoint { constructor(_ctx, _env) {} }
3490
+ export class RpcTarget {}
3491
+ export const env = globalThis[${JSON.stringify(BUILD_ENV_GLOBAL_KEY)}] ?? {};
3492
+ export default {};
3493
+ `,
3494
+ "cloudflare:email": `
3495
+ export class EmailMessage { constructor(_from, _to, _raw) {} }
3496
+ export default {};
3497
+ `,
3498
+ "cloudflare:sockets": `
3499
+ export function connect() { return {}; }
3500
+ export default {};
3501
+ `,
3502
+ "cloudflare:workflows": `
3503
+ export class NonRetryableError extends Error {
3504
+ constructor(message, name) { super(message); this.name = name ?? "NonRetryableError"; }
3505
+ }
3506
+ export default {};
3507
+ `
3508
+ };
3509
+ var FALLBACK_STUB = `export default {};
3510
+ `;
3511
+ function createCloudflareProtocolStubPlugin() {
3512
+ return {
3513
+ name: "@rangojs/router:cloudflare-protocol-stub",
3514
+ transform(code, id) {
3515
+ const cleanId = id.split("?")[0] ?? id;
3516
+ if (!SOURCE_EXT_RE.test(cleanId)) return null;
3517
+ if (!code.includes(CF_PREFIX)) return null;
3518
+ let ast;
3519
+ try {
3520
+ ast = this.parse(code);
3521
+ } catch {
3522
+ return null;
3523
+ }
3524
+ const hits = [];
3525
+ walk(ast, (node) => {
3526
+ if (!IMPORT_NODE_TYPES.has(node.type)) return;
3527
+ const source = node.source;
3528
+ if (!source || source.type !== "Literal") return;
3529
+ if (typeof source.value !== "string") return;
3530
+ if (!source.value.startsWith(CF_PREFIX)) return;
3531
+ if (typeof source.start !== "number" || typeof source.end !== "number")
3532
+ return;
3533
+ hits.push({
3534
+ start: source.start,
3535
+ end: source.end,
3536
+ value: source.value
3537
+ });
3538
+ });
3539
+ if (hits.length === 0) return null;
3540
+ hits.sort((a, b) => b.start - a.start);
3541
+ let out = code;
3542
+ for (const hit of hits) {
3543
+ const submodule = hit.value.slice(CF_PREFIX.length);
3544
+ const quote = code[hit.start] === "'" ? "'" : '"';
3545
+ out = out.slice(0, hit.start) + quote + VIRTUAL_PREFIX + submodule + quote + out.slice(hit.end);
3546
+ }
3547
+ return { code: out, map: null };
3548
+ },
3549
+ resolveId(id) {
3550
+ if (id.startsWith(VIRTUAL_PREFIX)) {
3551
+ return "\0" + id;
3552
+ }
3553
+ return null;
3554
+ },
3555
+ load(id) {
3556
+ if (!id.startsWith(NULL_PREFIX)) return null;
3557
+ const submodule = id.slice(NULL_PREFIX.length);
3558
+ const specifier = CF_PREFIX + submodule;
3559
+ return STUBS[specifier] ?? FALLBACK_STUB;
3560
+ }
3561
+ };
3562
+ }
3563
+ function walk(node, visit) {
3564
+ if (!node || typeof node !== "object") return;
3565
+ if (Array.isArray(node)) {
3566
+ for (const child of node) walk(child, visit);
3567
+ return;
3568
+ }
3569
+ const n = node;
3570
+ if (typeof n.type !== "string") return;
3571
+ visit(n);
3572
+ for (const key in n) {
3573
+ if (key === "loc" || key === "start" || key === "end" || key === "range") {
3574
+ continue;
3575
+ }
3576
+ walk(n[key], visit);
3577
+ }
3578
+ }
3579
+
3035
3580
  // src/vite/plugins/client-ref-hashing.ts
3036
3581
  import { relative } from "node:path";
3037
3582
  import { createHash as createHash2 } from "node:crypto";
3583
+ var debug8 = createRangoDebugger("rango:transform");
3038
3584
  var CLIENT_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-package-proxy/";
3039
3585
  var CLIENT_IN_SERVER_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-in-server-package-proxy/";
3040
3586
  var FS_PREFIX = "/@fs/";
@@ -3073,6 +3619,7 @@ function transformClientRefs(code, projectRoot) {
3073
3619
  return hasReplacement ? result : null;
3074
3620
  }
3075
3621
  function hashClientRefs(projectRoot) {
3622
+ const counter = createCounter(debug8, "hash-client-refs");
3076
3623
  return {
3077
3624
  name: "@rangojs/router:hash-client-refs",
3078
3625
  // Run after the RSC plugin's transform (default enforce is normal)
@@ -3080,10 +3627,18 @@ function hashClientRefs(projectRoot) {
3080
3627
  applyToEnvironment(env) {
3081
3628
  return env.name === "rsc";
3082
3629
  },
3083
- transform(code, _id) {
3084
- const result = transformClientRefs(code, projectRoot);
3085
- if (result === null) return;
3086
- return { code: result, map: null };
3630
+ buildEnd() {
3631
+ counter?.flush();
3632
+ },
3633
+ transform(code, id) {
3634
+ const start = counter ? performance.now() : 0;
3635
+ try {
3636
+ const result = transformClientRefs(code, projectRoot);
3637
+ if (result === null) return;
3638
+ return { code: result, map: null };
3639
+ } finally {
3640
+ counter?.record(id, performance.now() - start);
3641
+ }
3087
3642
  }
3088
3643
  };
3089
3644
  }
@@ -3190,8 +3745,8 @@ function createDiscoveryState(entryPath, opts) {
3190
3745
  perRouterManifestDataMap: /* @__PURE__ */ new Map(),
3191
3746
  prerenderManifestEntries: null,
3192
3747
  staticManifestEntries: null,
3193
- handlerChunkInfo: null,
3194
- staticHandlerChunkInfo: null,
3748
+ handlerChunkInfoMap: /* @__PURE__ */ new Map(),
3749
+ staticHandlerChunkInfoMap: /* @__PURE__ */ new Map(),
3195
3750
  rscEntryFileName: null,
3196
3751
  resolvedPrerenderModules: void 0,
3197
3752
  resolvedStaticModules: void 0,
@@ -3322,13 +3877,31 @@ function encodePathParam(value) {
3322
3877
  }
3323
3878
  function substituteRouteParams(pattern, params, encode = encodeURIComponent) {
3324
3879
  let result = pattern;
3880
+ let hadOmittedOptional = false;
3325
3881
  for (const [key, value] of Object.entries(params)) {
3326
3882
  const escaped = escapeRegExp2(key);
3327
- result = result.replace(
3328
- new RegExp(`:${escaped}(\\([^)]*\\))?\\??`),
3329
- encode(value)
3330
- );
3331
- result = result.replace(`*${key}`, encode(value));
3883
+ if (value === "") {
3884
+ result = result.replace(
3885
+ new RegExp(`:${escaped}(\\([^)]*\\))?(?!\\?)`),
3886
+ ""
3887
+ );
3888
+ result = result.replace(`*${key}`, "");
3889
+ } else {
3890
+ result = result.replace(
3891
+ new RegExp(`:${escaped}(\\([^)]*\\))?\\??`),
3892
+ encode(value)
3893
+ );
3894
+ result = result.replace(`*${key}`, encode(value));
3895
+ }
3896
+ }
3897
+ result = result.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)(\([^)]*\))?\?/g, () => {
3898
+ hadOmittedOptional = true;
3899
+ return "";
3900
+ });
3901
+ if (hadOmittedOptional) {
3902
+ const hadTrailingSlash = pattern.length > 1 && pattern.endsWith("/");
3903
+ result = result.replace(/\/\/+/g, "/").replace(/\/+$/, "") || "/";
3904
+ if (hadTrailingSlash && !result.endsWith("/")) result += "/";
3332
3905
  }
3333
3906
  return result;
3334
3907
  }
@@ -3425,8 +3998,14 @@ function copyStagedBuildAssets(projectRoot, fileNames) {
3425
3998
  }
3426
3999
 
3427
4000
  // src/vite/discovery/prerender-collection.ts
4001
+ var debug9 = createRangoDebugger("rango:prerender");
3428
4002
  async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3429
4003
  if (!state.opts?.enableBuildPrerender || !state.isBuildMode) return;
4004
+ const overallStart = debug9 ? performance.now() : 0;
4005
+ debug9?.(
4006
+ "expandPrerenderRoutes: start (%d router manifest(s))",
4007
+ allManifests.length
4008
+ );
3430
4009
  const entries = [];
3431
4010
  const allRoutes = {};
3432
4011
  for (const { manifest: m } of allManifests) {
@@ -3438,91 +4017,151 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3438
4017
  if (!params) return pattern;
3439
4018
  return substituteRouteParams(pattern, params);
3440
4019
  };
4020
+ let resolvedRoutes = 0;
4021
+ let totalDynamic = 0;
3441
4022
  for (const { manifest } of allManifests) {
3442
4023
  if (!manifest.prerenderRoutes) continue;
3443
- const defs = manifest._prerenderDefs || {};
3444
4024
  for (const routeName of manifest.prerenderRoutes) {
3445
4025
  const pattern = manifest.routeManifest[routeName];
3446
- if (!pattern) continue;
3447
- const def = defs[routeName];
3448
- const isPassthroughRoute = !!def?.options?.passthrough;
3449
- const hasDynamic = pattern.includes(":") || pattern.includes("*");
3450
- if (!hasDynamic) {
3451
- entries.push({
3452
- urlPath: pattern.replace(/\/$/, "") || "/",
3453
- routeName,
3454
- concurrency: 1,
3455
- isPassthroughRoute
3456
- });
3457
- } else {
3458
- if (def?.getParams) {
3459
- try {
3460
- const buildVars = {};
3461
- const getParamsCtx = {
3462
- build: true,
3463
- set: ((keyOrVar, value) => {
3464
- contextSet(buildVars, keyOrVar, value);
3465
- }),
3466
- reverse: getParamsReverse
3467
- };
3468
- const paramsList = await def.getParams(getParamsCtx);
3469
- const concurrency = def.options?.concurrency ?? 1;
3470
- const hasBuildVars = Object.keys(buildVars).length > 0 || Object.getOwnPropertySymbols(buildVars).length > 0;
3471
- for (const params of paramsList) {
3472
- let url = substituteRouteParams(
3473
- pattern,
3474
- params,
3475
- encodePathParam
3476
- );
3477
- if (url.includes("*")) {
3478
- const wildcardValue = params["*"] ?? params.splat;
3479
- if (wildcardValue !== void 0) {
3480
- url = url.replace(/\*[^/]*$/, encodePathParam(wildcardValue));
4026
+ if (pattern && (pattern.includes(":") || pattern.includes("*"))) {
4027
+ totalDynamic++;
4028
+ }
4029
+ }
4030
+ }
4031
+ const paramsStart = performance.now();
4032
+ const progressInterval = totalDynamic > 0 ? setInterval(() => {
4033
+ const elapsed = ((performance.now() - paramsStart) / 1e3).toFixed(1);
4034
+ console.log(
4035
+ `[rsc-router] Resolving prerender params... ${resolvedRoutes}/${totalDynamic} routes (${elapsed}s)`
4036
+ );
4037
+ }, 5e3) : void 0;
4038
+ try {
4039
+ for (const { manifest } of allManifests) {
4040
+ if (!manifest.prerenderRoutes) continue;
4041
+ const defs = manifest._prerenderDefs || {};
4042
+ const passthroughSet = new Set(manifest.passthroughRoutes || []);
4043
+ for (const routeName of manifest.prerenderRoutes) {
4044
+ const pattern = manifest.routeManifest[routeName];
4045
+ if (!pattern) continue;
4046
+ const def = defs[routeName];
4047
+ const isPassthroughRoute = passthroughSet.has(routeName);
4048
+ const hasDynamic = pattern.includes(":") || pattern.includes("*");
4049
+ if (!hasDynamic) {
4050
+ entries.push({
4051
+ urlPath: pattern.replace(/\/$/, "") || "/",
4052
+ routeName,
4053
+ concurrency: 1,
4054
+ isPassthroughRoute
4055
+ });
4056
+ } else {
4057
+ if (def?.getParams) {
4058
+ const getParamsStart = debug9 ? performance.now() : 0;
4059
+ try {
4060
+ const buildVars = {};
4061
+ const buildEnv = state.resolvedBuildEnv;
4062
+ const getParamsCtx = {
4063
+ build: true,
4064
+ dev: !state.isBuildMode,
4065
+ set: ((keyOrVar, value) => {
4066
+ contextSet(buildVars, keyOrVar, value);
4067
+ }),
4068
+ reverse: getParamsReverse,
4069
+ get env() {
4070
+ if (buildEnv !== void 0) return buildEnv;
4071
+ throw new Error(
4072
+ "[rsc-router] ctx.env is not available during build-time getParams(). Configure buildEnv in your rango() plugin options to enable build-time env access."
4073
+ );
3481
4074
  }
3482
- }
3483
- entries.push({
3484
- urlPath: url.replace(/\/$/, "") || "/",
4075
+ };
4076
+ const paramsList = await def.getParams(getParamsCtx);
4077
+ debug9?.(
4078
+ "getParams %s -> %d params (%sms)",
3485
4079
  routeName,
3486
- concurrency,
3487
- ...hasBuildVars ? { buildVars } : {},
3488
- isPassthroughRoute
3489
- });
3490
- }
3491
- } catch (err) {
3492
- if (err.name === "Skip") {
3493
- console.log(
3494
- `[rsc-router] SKIP route "${routeName}" - ${err.message}`
4080
+ paramsList.length,
4081
+ (performance.now() - getParamsStart).toFixed(1)
3495
4082
  );
3496
- notifyOnError(
3497
- registry,
3498
- err,
3499
- "prerender",
3500
- routeName,
3501
- void 0,
3502
- true
4083
+ const concurrency = def.options?.concurrency ?? 1;
4084
+ const hasBuildVars = Object.keys(buildVars).length > 0 || Object.getOwnPropertySymbols(buildVars).length > 0;
4085
+ for (const params of paramsList) {
4086
+ let url = substituteRouteParams(
4087
+ pattern,
4088
+ params,
4089
+ encodePathParam
4090
+ );
4091
+ if (url.includes("*")) {
4092
+ const wildcardValue = params["*"] ?? params.splat;
4093
+ if (wildcardValue !== void 0) {
4094
+ url = url.replace(
4095
+ /\*[^/]*$/,
4096
+ encodePathParam(wildcardValue)
4097
+ );
4098
+ }
4099
+ }
4100
+ entries.push({
4101
+ urlPath: url.replace(/\/$/, "") || "/",
4102
+ routeName,
4103
+ concurrency,
4104
+ ...hasBuildVars ? { buildVars } : {},
4105
+ isPassthroughRoute
4106
+ });
4107
+ }
4108
+ resolvedRoutes++;
4109
+ } catch (err) {
4110
+ resolvedRoutes++;
4111
+ if (err.name === "Skip") {
4112
+ console.log(
4113
+ `[rsc-router] SKIP route "${routeName}" - ${err.message}`
4114
+ );
4115
+ notifyOnError(
4116
+ registry,
4117
+ err,
4118
+ "prerender",
4119
+ routeName,
4120
+ void 0,
4121
+ true
4122
+ );
4123
+ continue;
4124
+ }
4125
+ console.error(
4126
+ `[rsc-router] Failed to get params for prerender route "${routeName}": ${err.message}`
3503
4127
  );
3504
- continue;
4128
+ notifyOnError(registry, err, "prerender", routeName);
4129
+ throw err;
3505
4130
  }
3506
- console.error(
3507
- `[rsc-router] Failed to get params for prerender route "${routeName}": ${err.message}`
4131
+ } else {
4132
+ console.warn(
4133
+ `[rsc-router] Dynamic prerender route "${routeName}" has no getParams(), skipping`
3508
4134
  );
3509
- notifyOnError(registry, err, "prerender", routeName);
3510
- throw err;
3511
4135
  }
3512
- } else {
3513
- console.warn(
3514
- `[rsc-router] Dynamic prerender route "${routeName}" has no getParams(), skipping`
3515
- );
3516
4136
  }
3517
4137
  }
3518
4138
  }
4139
+ } finally {
4140
+ if (progressInterval) {
4141
+ clearInterval(progressInterval);
4142
+ const elapsed = ((performance.now() - paramsStart) / 1e3).toFixed(1);
4143
+ console.log(
4144
+ `[rsc-router] Resolved prerender params: ${resolvedRoutes}/${totalDynamic} routes (${elapsed}s)`
4145
+ );
4146
+ }
4147
+ }
4148
+ if (entries.length === 0) {
4149
+ debug9?.(
4150
+ "no prerender entries (done in %sms)",
4151
+ (performance.now() - overallStart).toFixed(1)
4152
+ );
4153
+ return;
3519
4154
  }
3520
- if (entries.length === 0) return;
3521
4155
  const maxConcurrency = Math.max(...entries.map((e) => e.concurrency));
3522
4156
  const concurrencyNote = maxConcurrency > 1 ? ` (concurrency: ${maxConcurrency})` : "";
3523
4157
  console.log(
3524
4158
  `[rsc-router] Pre-rendering ${entries.length} URL(s)${concurrencyNote}...`
3525
4159
  );
4160
+ debug9?.(
4161
+ "prerender loop: %d entries, max concurrency %d",
4162
+ entries.length,
4163
+ maxConcurrency
4164
+ );
3526
4165
  const { hashParams } = await rscEnv.runner.import("@rangojs/router/build");
3527
4166
  const manifestEntries = {};
3528
4167
  let doneCount = 0;
@@ -3542,7 +4181,8 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3542
4181
  entry.urlPath,
3543
4182
  {},
3544
4183
  entry.buildVars,
3545
- entry.isPassthroughRoute
4184
+ entry.isPassthroughRoute,
4185
+ state.resolvedBuildEnv
3546
4186
  );
3547
4187
  if (!result) continue;
3548
4188
  if (result.passthrough) {
@@ -3628,10 +4268,22 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3628
4268
  console.log(
3629
4269
  `[rsc-router] Pre-render complete: ${parts.join(", ")} (${totalElapsed}ms total)`
3630
4270
  );
4271
+ debug9?.(
4272
+ "expandPrerenderRoutes done: %d done, %d skipped, %sms (overall %sms)",
4273
+ doneCount,
4274
+ skipCount,
4275
+ totalElapsed,
4276
+ (performance.now() - overallStart).toFixed(1)
4277
+ );
3631
4278
  }
3632
4279
  async function renderStaticHandlers(state, rscEnv, registry) {
3633
4280
  if (!state.opts?.enableBuildPrerender || !state.isBuildMode || !state.resolvedStaticModules?.size)
3634
4281
  return;
4282
+ const overallStart = debug9 ? performance.now() : 0;
4283
+ debug9?.(
4284
+ "renderStaticHandlers: start (%d static module(s))",
4285
+ state.resolvedStaticModules.size
4286
+ );
3635
4287
  const manifestEntries = {};
3636
4288
  let staticDone = 0;
3637
4289
  let staticSkip = 0;
@@ -3666,7 +4318,9 @@ async function renderStaticHandlers(state, rscEnv, registry) {
3666
4318
  const result = await routerInstance.renderStaticSegment(
3667
4319
  def.handler,
3668
4320
  def.$$id,
3669
- def.$$routePrefix
4321
+ def.$$routePrefix,
4322
+ state.resolvedBuildEnv,
4323
+ !state.isBuildMode
3670
4324
  );
3671
4325
  if (result) {
3672
4326
  const hasHandles = Object.keys(result.handles).length > 0;
@@ -3719,13 +4373,29 @@ async function renderStaticHandlers(state, rscEnv, registry) {
3719
4373
  console.log(
3720
4374
  `[rsc-router] Static render complete: ${staticParts.join(", ")} (${totalStaticElapsed}ms total)`
3721
4375
  );
4376
+ debug9?.(
4377
+ "renderStaticHandlers done: %d done, %d skipped, %sms (overall %sms)",
4378
+ staticDone,
4379
+ staticSkip,
4380
+ totalStaticElapsed,
4381
+ (performance.now() - overallStart).toFixed(1)
4382
+ );
3722
4383
  }
3723
4384
 
3724
4385
  // src/vite/discovery/discover-routers.ts
4386
+ var debug10 = createRangoDebugger("rango:discovery");
3725
4387
  async function discoverRouters(state, rscEnv) {
3726
4388
  if (!state.resolvedEntryPath) return;
3727
- await rscEnv.runner.import(state.resolvedEntryPath);
3728
- const serverMod = await rscEnv.runner.import("@rangojs/router/server");
4389
+ await timed(
4390
+ debug10,
4391
+ "inner: import entry",
4392
+ () => rscEnv.runner.import(state.resolvedEntryPath)
4393
+ );
4394
+ const serverMod = await timed(
4395
+ debug10,
4396
+ "inner: import @rangojs/router/server",
4397
+ () => rscEnv.runner.import("@rangojs/router/server")
4398
+ );
3729
4399
  let registry = serverMod.RouterRegistry;
3730
4400
  if (!registry || registry.size === 0) {
3731
4401
  try {
@@ -3767,8 +4437,13 @@ async function discoverRouters(state, rscEnv) {
3767
4437
  );
3768
4438
  }
3769
4439
  }
3770
- const buildMod = await rscEnv.runner.import("@rangojs/router/build");
4440
+ const buildMod = await timed(
4441
+ debug10,
4442
+ "inner: import @rangojs/router/build",
4443
+ () => rscEnv.runner.import("@rangojs/router/build")
4444
+ );
3771
4445
  const generateManifestFull = buildMod.generateManifestFull;
4446
+ debug10?.("inner: found %d router(s) in registry", registry.size);
3772
4447
  const nestedRouterConflict = findNestedRouterConflict(
3773
4448
  [...registry.values()].map((router) => router.__sourceFile).filter(
3774
4449
  (sourceFile) => typeof sourceFile === "string"
@@ -3787,11 +4462,16 @@ async function discoverRouters(state, rscEnv) {
3787
4462
  let mergedRouteTrailingSlash = {};
3788
4463
  let routerMountIndex = 0;
3789
4464
  const allManifests = [];
4465
+ const manifestGenStart = debug10 ? performance.now() : 0;
3790
4466
  for (const [id, router] of registry) {
3791
4467
  if (!router.urlpatterns || !generateManifestFull) {
3792
4468
  continue;
3793
4469
  }
3794
- const manifest = generateManifestFull(router.urlpatterns, routerMountIndex);
4470
+ const manifest = generateManifestFull(
4471
+ router.urlpatterns,
4472
+ routerMountIndex,
4473
+ router.__basename ? { urlPrefix: router.__basename } : void 0
4474
+ );
3795
4475
  routerMountIndex++;
3796
4476
  allManifests.push({ id, manifest });
3797
4477
  const routeCount = Object.keys(manifest.routeManifest).length;
@@ -3857,7 +4537,13 @@ async function discoverRouters(state, rscEnv) {
3857
4537
  );
3858
4538
  }
3859
4539
  }
4540
+ debug10?.(
4541
+ "inner: generated manifests for %d router(s) (%sms)",
4542
+ allManifests.length,
4543
+ (performance.now() - manifestGenStart).toFixed(1)
4544
+ );
3860
4545
  let newMergedRouteTrie = null;
4546
+ const trieStart = debug10 ? performance.now() : 0;
3861
4547
  if (Object.keys(newMergedRouteManifest).length > 0) {
3862
4548
  const buildRouteTrie = buildMod.buildRouteTrie;
3863
4549
  if (buildRouteTrie && mergedRouteAncestry) {
@@ -3920,6 +4606,10 @@ async function discoverRouters(state, rscEnv) {
3920
4606
  }
3921
4607
  }
3922
4608
  }
4609
+ debug10?.(
4610
+ "inner: trie build done (%sms)",
4611
+ (performance.now() - trieStart).toFixed(1)
4612
+ );
3923
4613
  state.mergedRouteManifest = newMergedRouteManifest;
3924
4614
  state.mergedPrecomputedEntries = newMergedPrecomputedEntries;
3925
4615
  state.perRouterManifests = newPerRouterManifests;
@@ -4240,48 +4930,45 @@ function postprocessBundle(state) {
4240
4930
  );
4241
4931
  const evictionTargets = [
4242
4932
  {
4243
- info: state.handlerChunkInfo,
4933
+ infos: state.handlerChunkInfoMap.values(),
4244
4934
  fnName: "Prerender",
4245
4935
  brand: "prerenderHandler",
4246
4936
  label: "handler code from RSC bundle"
4247
4937
  },
4248
4938
  {
4249
- info: state.staticHandlerChunkInfo,
4939
+ infos: state.staticHandlerChunkInfoMap.values(),
4250
4940
  fnName: "Static",
4251
4941
  brand: "staticHandler",
4252
4942
  label: "static handler code"
4253
4943
  }
4254
4944
  ];
4255
4945
  for (const target of evictionTargets) {
4256
- if (!target.info) continue;
4257
- const chunkPath = resolve7(
4258
- state.projectRoot,
4259
- "dist/rsc",
4260
- target.info.fileName
4261
- );
4262
- try {
4263
- const code = readFileSync5(chunkPath, "utf-8");
4264
- const result = evictHandlerCode(
4265
- code,
4266
- target.info.exports,
4267
- target.fnName,
4268
- target.brand
4269
- );
4270
- if (result) {
4271
- writeFileSync4(chunkPath, result.code);
4272
- const savedKB = (result.savedBytes / 1024).toFixed(1);
4273
- console.log(
4274
- `[rsc-router] Evicted ${target.label} (${savedKB} KB saved): ${target.info.fileName}`
4946
+ for (const info of target.infos) {
4947
+ const chunkPath = resolve7(state.projectRoot, "dist/rsc", info.fileName);
4948
+ try {
4949
+ const code = readFileSync5(chunkPath, "utf-8");
4950
+ const result = evictHandlerCode(
4951
+ code,
4952
+ info.exports,
4953
+ target.fnName,
4954
+ target.brand
4955
+ );
4956
+ if (result) {
4957
+ writeFileSync4(chunkPath, result.code);
4958
+ const savedKB = (result.savedBytes / 1024).toFixed(1);
4959
+ console.log(
4960
+ `[rsc-router] Evicted ${target.label} (${savedKB} KB saved): ${info.fileName}`
4961
+ );
4962
+ }
4963
+ } catch (replaceErr) {
4964
+ console.warn(
4965
+ `[rsc-router] Failed to evict ${target.label}: ${replaceErr.message}`
4275
4966
  );
4276
4967
  }
4277
- } catch (replaceErr) {
4278
- console.warn(
4279
- `[rsc-router] Failed to evict ${target.label}: ${replaceErr.message}`
4280
- );
4281
4968
  }
4282
4969
  }
4283
- state.handlerChunkInfo = null;
4284
- state.staticHandlerChunkInfo = null;
4970
+ state.handlerChunkInfoMap.clear();
4971
+ state.staticHandlerChunkInfoMap.clear();
4285
4972
  if (hasPrerenderData && existsSync6(rscEntryPath)) {
4286
4973
  const rscCode = readFileSync5(rscEntryPath, "utf-8");
4287
4974
  if (!rscCode.includes("__prerender-manifest.js")) {
@@ -4324,7 +5011,7 @@ function postprocessBundle(state) {
4324
5011
  }
4325
5012
  if (hasStaticData && existsSync6(rscEntryPath)) {
4326
5013
  const rscCode = readFileSync5(rscEntryPath, "utf-8");
4327
- if (!rscCode.includes("__STATIC_MANIFEST")) {
5014
+ if (!rscCode.includes("__static-manifest.js")) {
4328
5015
  try {
4329
5016
  const manifestEntries = [];
4330
5017
  let totalBytes = copyStagedBuildAssets(
@@ -4363,7 +5050,26 @@ function postprocessBundle(state) {
4363
5050
  }
4364
5051
 
4365
5052
  // src/vite/router-discovery.ts
5053
+ var debugDiscovery = createRangoDebugger("rango:discovery");
5054
+ var debugRoutes = createRangoDebugger("rango:routes");
5055
+ var debugBuild = createRangoDebugger("rango:build");
5056
+ var debugDev = createRangoDebugger("rango:dev");
5057
+ var loaderHookRegistered = false;
5058
+ function ensureCloudflareProtocolLoaderRegistered() {
5059
+ if (loaderHookRegistered) return;
5060
+ loaderHookRegistered = true;
5061
+ try {
5062
+ register(
5063
+ new URL("./plugins/cloudflare-protocol-loader-hook.mjs", import.meta.url)
5064
+ );
5065
+ } catch (err) {
5066
+ console.warn(
5067
+ `[rsc-router] Could not register Node ESM loader hook for cloudflare:* imports (${err?.message ?? err}). Falling back to Vite transform only.`
5068
+ );
5069
+ }
5070
+ }
4366
5071
  async function createTempRscServer(state, options = {}) {
5072
+ ensureCloudflareProtocolLoaderRegistered();
4367
5073
  const { default: rsc } = await import("@vitejs/plugin-rsc");
4368
5074
  return createViteServer({
4369
5075
  root: state.projectRoot,
@@ -4386,6 +5092,7 @@ async function createTempRscServer(state, options = {}) {
4386
5092
  ...options.forceBuild ? [hashClientRefs(state.projectRoot)] : [],
4387
5093
  createVersionPlugin(),
4388
5094
  createVirtualStubPlugin(),
5095
+ createCloudflareProtocolStubPlugin(),
4389
5096
  // Dev prerender must use dev-mode IDs (path-based) to match the workerd
4390
5097
  // runtime. forceBuild produces hashed IDs for production bundle consistency.
4391
5098
  exposeInternalIds(options.forceBuild ? { forceBuild: true } : void 0),
@@ -4393,8 +5100,69 @@ async function createTempRscServer(state, options = {}) {
4393
5100
  ]
4394
5101
  });
4395
5102
  }
5103
+ async function resolveBuildEnv(option, factoryCtx) {
5104
+ if (!option) return null;
5105
+ if (option === "auto") {
5106
+ if (factoryCtx.preset !== "cloudflare") {
5107
+ throw new Error(
5108
+ '[rsc-router] buildEnv: "auto" is only supported with preset: "cloudflare". Use a factory function or plain object for other presets.'
5109
+ );
5110
+ }
5111
+ try {
5112
+ const userRequire = createRequire2(
5113
+ resolve8(factoryCtx.root, "package.json")
5114
+ );
5115
+ const wranglerPath = userRequire.resolve("wrangler");
5116
+ const { getPlatformProxy } = await import(pathToFileURL(wranglerPath).href);
5117
+ const proxy = await getPlatformProxy();
5118
+ return {
5119
+ env: proxy.env,
5120
+ dispose: proxy.dispose
5121
+ };
5122
+ } catch (err) {
5123
+ throw new Error(
5124
+ `[rsc-router] buildEnv: "auto" requires wrangler to be installed.
5125
+ Install it with: pnpm add -D wrangler
5126
+ ${err.message}`
5127
+ );
5128
+ }
5129
+ }
5130
+ if (typeof option === "function") {
5131
+ return await option(factoryCtx);
5132
+ }
5133
+ return { env: option };
5134
+ }
5135
+ async function acquireBuildEnv(s, command, mode) {
5136
+ const option = s.opts?.buildEnv;
5137
+ if (!option) return false;
5138
+ const result = await resolveBuildEnv(option, {
5139
+ root: s.projectRoot,
5140
+ mode,
5141
+ command,
5142
+ preset: s.opts?.preset ?? "node"
5143
+ });
5144
+ if (!result) return false;
5145
+ s.resolvedBuildEnv = result.env;
5146
+ s.buildEnvDispose = result.dispose ?? null;
5147
+ globalThis[BUILD_ENV_GLOBAL_KEY] = result.env;
5148
+ return true;
5149
+ }
5150
+ async function releaseBuildEnv(s) {
5151
+ if (s.buildEnvDispose) {
5152
+ try {
5153
+ await s.buildEnvDispose();
5154
+ } catch (err) {
5155
+ console.warn(`[rsc-router] buildEnv dispose failed: ${err.message}`);
5156
+ }
5157
+ s.buildEnvDispose = null;
5158
+ }
5159
+ s.resolvedBuildEnv = void 0;
5160
+ delete globalThis[BUILD_ENV_GLOBAL_KEY];
5161
+ }
4396
5162
  function createRouterDiscoveryPlugin(entryPath, opts) {
4397
5163
  const s = createDiscoveryState(entryPath, opts);
5164
+ let viteCommand = "build";
5165
+ let viteMode = "production";
4398
5166
  return {
4399
5167
  name: "@rangojs/router:discovery",
4400
5168
  config() {
@@ -4403,31 +5171,13 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
4403
5171
  __RANGO_DEBUG__: JSON.stringify(!!process.env.INTERNAL_RANGO_DEBUG)
4404
5172
  }
4405
5173
  };
4406
- if (opts?.enableBuildPrerender) {
4407
- config.environments = {
4408
- rsc: {
4409
- build: {
4410
- rollupOptions: {
4411
- output: {
4412
- manualChunks(id) {
4413
- if (s.resolvedPrerenderModules?.has(id)) {
4414
- return "__prerender-handlers";
4415
- }
4416
- if (s.resolvedStaticModules?.has(id)) {
4417
- return "__static-handlers";
4418
- }
4419
- }
4420
- }
4421
- }
4422
- }
4423
- }
4424
- };
4425
- }
4426
5174
  return config;
4427
5175
  },
4428
5176
  configResolved(config) {
4429
5177
  s.projectRoot = config.root;
4430
5178
  s.isBuildMode = config.command === "build";
5179
+ viteCommand = config.command;
5180
+ viteMode = config.mode;
4431
5181
  s.userResolveAlias = config.resolve.alias;
4432
5182
  if (!s.resolvedEntryPath && opts?.routerPathRef?.path) {
4433
5183
  s.resolvedEntryPath = opts.routerPathRef.path;
@@ -4472,6 +5222,8 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
4472
5222
  });
4473
5223
  prerenderTempServer = null;
4474
5224
  }
5225
+ releaseBuildEnv(s).catch(() => {
5226
+ });
4475
5227
  });
4476
5228
  async function getOrCreateTempServer() {
4477
5229
  if (prerenderNodeRegistry) {
@@ -4498,14 +5250,33 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
4498
5250
  return null;
4499
5251
  }
4500
5252
  const discover = async () => {
5253
+ const discoverStart = performance.now();
4501
5254
  const rscEnv = server.environments?.rsc;
4502
5255
  if (!rscEnv?.runner) {
5256
+ debugDiscovery?.("dev: no rsc runner (cloudflare path)");
4503
5257
  s.devServerOrigin = getDevServerOrigin();
4504
5258
  try {
4505
- const tempRscEnv = await getOrCreateTempServer();
5259
+ await timed(
5260
+ debugDiscovery,
5261
+ "acquireBuildEnv",
5262
+ () => acquireBuildEnv(s, viteCommand, viteMode)
5263
+ );
5264
+ const tempRscEnv = await timed(
5265
+ debugDiscovery,
5266
+ "getOrCreateTempServer",
5267
+ () => getOrCreateTempServer()
5268
+ );
4506
5269
  if (tempRscEnv) {
4507
- await discoverRouters(s, tempRscEnv);
4508
- writeRouteTypesFiles(s);
5270
+ await timed(
5271
+ debugDiscovery,
5272
+ "discoverRouters (cloudflare)",
5273
+ () => discoverRouters(s, tempRscEnv)
5274
+ );
5275
+ timedSync(
5276
+ debugDiscovery,
5277
+ "writeRouteTypesFiles",
5278
+ () => writeRouteTypesFiles(s)
5279
+ );
4509
5280
  }
4510
5281
  } catch (err) {
4511
5282
  console.warn(
@@ -4513,26 +5284,54 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
4513
5284
  ${err.stack}`
4514
5285
  );
4515
5286
  }
5287
+ debugDiscovery?.(
5288
+ "dev discovery done (%sms)",
5289
+ (performance.now() - discoverStart).toFixed(1)
5290
+ );
4516
5291
  resolveDiscovery();
4517
5292
  return;
4518
5293
  }
4519
5294
  try {
4520
- const serverMod = await rscEnv.runner.import(
4521
- "@rangojs/router/server"
5295
+ debugDiscovery?.("dev: node path start");
5296
+ await timed(
5297
+ debugDiscovery,
5298
+ "acquireBuildEnv",
5299
+ () => acquireBuildEnv(s, viteCommand, viteMode)
5300
+ );
5301
+ const serverMod = await timed(
5302
+ debugDiscovery,
5303
+ "import @rangojs/router/server",
5304
+ () => rscEnv.runner.import("@rangojs/router/server")
4522
5305
  );
4523
5306
  if (serverMod?.setManifestReadyPromise) {
4524
5307
  serverMod.setManifestReadyPromise(discoveryPromise);
4525
5308
  }
4526
- await discoverRouters(s, rscEnv);
5309
+ await timed(
5310
+ debugDiscovery,
5311
+ "discoverRouters",
5312
+ () => discoverRouters(s, rscEnv)
5313
+ );
4527
5314
  s.devServerOrigin = getDevServerOrigin();
4528
- writeRouteTypesFiles(s);
4529
- await propagateDiscoveryState(rscEnv);
5315
+ timedSync(
5316
+ debugDiscovery,
5317
+ "writeRouteTypesFiles",
5318
+ () => writeRouteTypesFiles(s)
5319
+ );
5320
+ await timed(
5321
+ debugDiscovery,
5322
+ "propagateDiscoveryState",
5323
+ () => propagateDiscoveryState(rscEnv)
5324
+ );
4530
5325
  } catch (err) {
4531
5326
  console.warn(
4532
5327
  `[rsc-router] Router discovery failed: ${err.message}
4533
5328
  ${err.stack}`
4534
5329
  );
4535
5330
  } finally {
5331
+ debugDiscovery?.(
5332
+ "dev discovery done (%sms)",
5333
+ (performance.now() - discoverStart).toFixed(1)
5334
+ );
4536
5335
  resolveDiscovery();
4537
5336
  }
4538
5337
  };
@@ -4573,15 +5372,46 @@ ${err.stack}`
4573
5372
  }
4574
5373
  };
4575
5374
  server.middlewares.use("/__rsc_prerender", async (req, res) => {
5375
+ const reqStart = debugDev ? performance.now() : 0;
5376
+ const logResult = (status, note) => {
5377
+ debugDev?.(
5378
+ "/__rsc_prerender %s -> %d %s (%sms)",
5379
+ req.url,
5380
+ status,
5381
+ note,
5382
+ (performance.now() - reqStart).toFixed(1)
5383
+ );
5384
+ };
4576
5385
  if (s.discoveryDone) await s.discoveryDone;
4577
5386
  const url = new URL(req.url || "/", "http://localhost");
4578
5387
  const pathname = url.searchParams.get("pathname");
4579
5388
  if (!pathname) {
4580
5389
  res.statusCode = 400;
4581
5390
  res.end("Missing pathname");
5391
+ logResult(400, "missing pathname");
4582
5392
  return;
4583
5393
  }
4584
- let registry = mainRegistry;
5394
+ const rscEnv = server.environments?.rsc;
5395
+ let registry = null;
5396
+ if (rscEnv?.runner && s.resolvedEntryPath) {
5397
+ try {
5398
+ await rscEnv.runner.import(s.resolvedEntryPath);
5399
+ const serverMod = await rscEnv.runner.import(
5400
+ "@rangojs/router/server"
5401
+ );
5402
+ registry = serverMod.RouterRegistry ?? null;
5403
+ } catch (err) {
5404
+ console.warn(
5405
+ `[rsc-router] Dev prerender module refresh failed: ${err.message}`
5406
+ );
5407
+ res.statusCode = 500;
5408
+ res.end(`Prerender handler error: ${err.message}`);
5409
+ logResult(500, "module refresh failed");
5410
+ return;
5411
+ }
5412
+ } else {
5413
+ registry = mainRegistry;
5414
+ }
4585
5415
  if (!registry) {
4586
5416
  if (!prerenderNodeRegistry) {
4587
5417
  await getOrCreateTempServer();
@@ -4591,6 +5421,7 @@ ${err.stack}`
4591
5421
  if (!registry || registry.size === 0) {
4592
5422
  res.statusCode = 503;
4593
5423
  res.end("Prerender runner not available");
5424
+ logResult(503, "no registry");
4594
5425
  return;
4595
5426
  }
4596
5427
  const wantIntercept = url.searchParams.get("intercept") === "1";
@@ -4603,7 +5434,10 @@ ${err.stack}`
4603
5434
  pathname,
4604
5435
  {},
4605
5436
  void 0,
4606
- wantPassthrough
5437
+ wantPassthrough,
5438
+ s.resolvedBuildEnv,
5439
+ true
5440
+ // devMode: check getParams for passthrough routes
4607
5441
  );
4608
5442
  if (!result) continue;
4609
5443
  if (result.passthrough) continue;
@@ -4622,6 +5456,7 @@ ${err.stack}`
4622
5456
  payload = { segments: result.segments, handles: result.handles };
4623
5457
  }
4624
5458
  res.end(JSON.stringify(payload));
5459
+ logResult(200, `match ${result.routeName}`);
4625
5460
  return;
4626
5461
  } catch (err) {
4627
5462
  console.warn(
@@ -4631,6 +5466,7 @@ ${err.stack}`
4631
5466
  }
4632
5467
  res.statusCode = 404;
4633
5468
  res.end("No prerender match");
5469
+ logResult(404, "no match");
4634
5470
  });
4635
5471
  if (opts?.staticRouteTypesGeneration !== false) {
4636
5472
  const isGeneratedRouteFile = (filePath) => filePath.endsWith(".gen.ts") && (filePath.includes("named-routes.gen.ts") || filePath.includes("urls.gen.ts"));
@@ -4655,15 +5491,32 @@ ${err.stack}`
4655
5491
  const rscEnv = server.environments?.rsc;
4656
5492
  if (!rscEnv?.runner || runtimeRediscoveryInProgress) return;
4657
5493
  runtimeRediscoveryInProgress = true;
5494
+ const hmrStart = performance.now();
4658
5495
  try {
4659
- await discoverRouters(s, rscEnv);
4660
- writeRouteTypesFiles(s);
4661
- await propagateDiscoveryState(rscEnv);
5496
+ await timed(
5497
+ debugDiscovery,
5498
+ "hmr discoverRouters",
5499
+ () => discoverRouters(s, rscEnv)
5500
+ );
5501
+ timedSync(
5502
+ debugDiscovery,
5503
+ "hmr writeRouteTypesFiles",
5504
+ () => writeRouteTypesFiles(s)
5505
+ );
5506
+ await timed(
5507
+ debugDiscovery,
5508
+ "hmr propagateDiscoveryState",
5509
+ () => propagateDiscoveryState(rscEnv)
5510
+ );
4662
5511
  } catch (err) {
4663
5512
  console.warn(
4664
5513
  `[rsc-router] Runtime re-discovery failed: ${err.message}`
4665
5514
  );
4666
5515
  } finally {
5516
+ debugDiscovery?.(
5517
+ "hmr re-discovery done (%sms)",
5518
+ (performance.now() - hmrStart).toFixed(1)
5519
+ );
4667
5520
  runtimeRediscoveryInProgress = false;
4668
5521
  }
4669
5522
  };
@@ -4671,6 +5524,7 @@ ${err.stack}`
4671
5524
  clearTimeout(routeChangeTimer);
4672
5525
  routeChangeTimer = setTimeout(() => {
4673
5526
  routeChangeTimer = void 0;
5527
+ const regenStart = debugDiscovery ? performance.now() : 0;
4674
5528
  try {
4675
5529
  writeCombinedRouteTypesWithTracking(s);
4676
5530
  if (s.perRouterManifests.length > 0) {
@@ -4681,6 +5535,10 @@ ${err.stack}`
4681
5535
  `[rsc-router] Route regeneration error: ${err.message}`
4682
5536
  );
4683
5537
  }
5538
+ debugDiscovery?.(
5539
+ "watcher: regenerated gen files (%sms)",
5540
+ (performance.now() - regenStart).toFixed(1)
5541
+ );
4684
5542
  if (s.perRouterManifests.length > 0) {
4685
5543
  refreshRuntimeDiscovery().catch((err) => {
4686
5544
  console.warn(
@@ -4703,6 +5561,12 @@ ${err.stack}`
4703
5561
  const hasUrls = source.includes("urls(");
4704
5562
  const hasCreateRouter = /\bcreateRouter\s*[<(]/.test(source);
4705
5563
  if (!hasUrls && !hasCreateRouter) return;
5564
+ debugDiscovery?.(
5565
+ "watcher: %s matches (urls=%s, router=%s)",
5566
+ filePath,
5567
+ hasUrls,
5568
+ hasCreateRouter
5569
+ );
4706
5570
  if (hasCreateRouter) {
4707
5571
  const nestedRouterConflict = findNestedRouterConflict([
4708
5572
  ...s.cachedRouterFiles ?? [],
@@ -4735,14 +5599,31 @@ ${err.stack}`
4735
5599
  // The manifest data is stored for the virtual module's load hook.
4736
5600
  async buildStart() {
4737
5601
  if (!s.isBuildMode) return;
4738
- if (s.mergedRouteManifest !== null) return;
5602
+ if (s.mergedRouteManifest !== null) {
5603
+ debugDiscovery?.(
5604
+ "build: skip (already discovered, env=%s)",
5605
+ this.environment?.name ?? "?"
5606
+ );
5607
+ return;
5608
+ }
5609
+ const buildStartTime = performance.now();
5610
+ debugDiscovery?.("build: start (env=%s)", this.environment?.name ?? "?");
4739
5611
  resetStagedBuildAssets(s.projectRoot);
4740
5612
  s.prerenderManifestEntries = null;
4741
5613
  s.staticManifestEntries = null;
5614
+ await timed(
5615
+ debugDiscovery,
5616
+ "build acquireBuildEnv",
5617
+ () => acquireBuildEnv(s, viteCommand, viteMode)
5618
+ );
4742
5619
  let tempServer = null;
4743
5620
  globalThis.__rscRouterDiscoveryActive = true;
4744
5621
  try {
4745
- tempServer = await createTempRscServer(s, { forceBuild: true });
5622
+ tempServer = await timed(
5623
+ debugDiscovery,
5624
+ "build createTempRscServer",
5625
+ () => createTempRscServer(s, { forceBuild: true })
5626
+ );
4746
5627
  const rscEnv = tempServer.environments?.rsc;
4747
5628
  if (!rscEnv?.runner) {
4748
5629
  console.warn(
@@ -4756,8 +5637,16 @@ ${err.stack}`
4756
5637
  if (tempIdsPlugin?.api?.staticHandlerModules) {
4757
5638
  s.resolvedStaticModules = tempIdsPlugin.api.staticHandlerModules;
4758
5639
  }
4759
- await discoverRouters(s, rscEnv);
4760
- writeRouteTypesFiles(s);
5640
+ await timed(
5641
+ debugDiscovery,
5642
+ "build discoverRouters",
5643
+ () => discoverRouters(s, rscEnv)
5644
+ );
5645
+ timedSync(
5646
+ debugDiscovery,
5647
+ "build writeRouteTypesFiles",
5648
+ () => writeRouteTypesFiles(s)
5649
+ );
4761
5650
  } catch (err) {
4762
5651
  const sourceFile = err.stack?.split("\n").find(
4763
5652
  (line) => line.includes(s.projectRoot) && !line.includes("node_modules")
@@ -4776,8 +5665,17 @@ ${details}`
4776
5665
  } finally {
4777
5666
  delete globalThis.__rscRouterDiscoveryActive;
4778
5667
  if (tempServer) {
4779
- await tempServer.close();
5668
+ await timed(
5669
+ debugDiscovery,
5670
+ "build tempServer.close",
5671
+ () => tempServer.close()
5672
+ );
4780
5673
  }
5674
+ await releaseBuildEnv(s);
5675
+ debugDiscovery?.(
5676
+ "build discovery done (%sms)",
5677
+ (performance.now() - buildStartTime).toFixed(1)
5678
+ );
4781
5679
  }
4782
5680
  },
4783
5681
  // Virtual module: provides the pre-generated route manifest as a JS module
@@ -4794,17 +5692,36 @@ ${details}`
4794
5692
  async load(id) {
4795
5693
  if (id === "\0" + VIRTUAL_ROUTES_MANIFEST_ID) {
4796
5694
  if (s.discoveryDone) {
4797
- await s.discoveryDone;
5695
+ await timed(
5696
+ debugRoutes,
5697
+ "await discoveryDone (manifest)",
5698
+ () => Promise.resolve(s.discoveryDone)
5699
+ );
4798
5700
  }
4799
- return generateRoutesManifestModule(s);
5701
+ const code = await timed(
5702
+ debugRoutes,
5703
+ "generateRoutesManifestModule",
5704
+ () => generateRoutesManifestModule(s)
5705
+ );
5706
+ debugRoutes?.("manifest module emitted (%d bytes)", code?.length ?? 0);
5707
+ return code;
4800
5708
  }
4801
5709
  const perRouterPrefix = "\0" + VIRTUAL_ROUTES_MANIFEST_ID + "/";
4802
5710
  if (id.startsWith(perRouterPrefix)) {
4803
5711
  if (s.discoveryDone) {
4804
- await s.discoveryDone;
5712
+ await timed(
5713
+ debugRoutes,
5714
+ "await discoveryDone (per-router)",
5715
+ () => Promise.resolve(s.discoveryDone)
5716
+ );
4805
5717
  }
4806
5718
  const routerId = id.slice(perRouterPrefix.length);
4807
- return generatePerRouterModule(s, routerId);
5719
+ const code = await timed(
5720
+ debugRoutes,
5721
+ `generatePerRouterModule ${routerId}`,
5722
+ () => generatePerRouterModule(s, routerId)
5723
+ );
5724
+ return code;
4808
5725
  }
4809
5726
  return null;
4810
5727
  },
@@ -4812,28 +5729,44 @@ ${details}`
4812
5729
  // Used by closeBundle for handler code eviction and prerender data injection.
4813
5730
  generateBundle(_options, bundle) {
4814
5731
  if (this.environment?.name !== "rsc") return;
5732
+ const genStart = debugBuild ? performance.now() : 0;
4815
5733
  for (const [fileName, chunk] of Object.entries(bundle)) {
4816
5734
  if (chunk.type === "chunk" && chunk.isEntry) {
4817
5735
  s.rscEntryFileName = fileName;
4818
5736
  break;
4819
5737
  }
4820
5738
  }
4821
- if (!s.resolvedPrerenderModules?.size && !s.resolvedStaticModules?.size)
5739
+ if (!s.resolvedPrerenderModules?.size && !s.resolvedStaticModules?.size) {
5740
+ debugBuild?.(
5741
+ "generateBundle (rsc): no handlers to scan (%sms)",
5742
+ (performance.now() - genStart).toFixed(1)
5743
+ );
4822
5744
  return;
5745
+ }
5746
+ s.handlerChunkInfoMap.clear();
5747
+ s.staticHandlerChunkInfoMap.clear();
4823
5748
  for (const [fileName, chunk] of Object.entries(bundle)) {
4824
5749
  if (chunk.type !== "chunk") continue;
4825
- if (fileName.includes("__prerender-handlers") && s.resolvedPrerenderModules?.size) {
5750
+ if (s.resolvedPrerenderModules?.size) {
4826
5751
  const handlers = extractHandlerExportsFromChunk(
4827
5752
  chunk.code,
4828
5753
  s.resolvedPrerenderModules,
4829
5754
  "Prerender",
4830
- true
5755
+ false
4831
5756
  );
4832
5757
  if (handlers.length > 0) {
4833
- s.handlerChunkInfo = { fileName, exports: handlers };
5758
+ const existing = s.handlerChunkInfoMap.get(fileName);
5759
+ if (existing) {
5760
+ existing.exports.push(...handlers);
5761
+ } else {
5762
+ s.handlerChunkInfoMap.set(fileName, {
5763
+ fileName,
5764
+ exports: handlers
5765
+ });
5766
+ }
4834
5767
  }
4835
5768
  }
4836
- if (fileName.includes("__static-handlers") && s.resolvedStaticModules?.size) {
5769
+ if (s.resolvedStaticModules?.size) {
4837
5770
  const handlers = extractHandlerExportsFromChunk(
4838
5771
  chunk.code,
4839
5772
  s.resolvedStaticModules,
@@ -4841,10 +5774,25 @@ ${details}`
4841
5774
  false
4842
5775
  );
4843
5776
  if (handlers.length > 0) {
4844
- s.staticHandlerChunkInfo = { fileName, exports: handlers };
5777
+ const existing = s.staticHandlerChunkInfoMap.get(fileName);
5778
+ if (existing) {
5779
+ existing.exports.push(...handlers);
5780
+ } else {
5781
+ s.staticHandlerChunkInfoMap.set(fileName, {
5782
+ fileName,
5783
+ exports: handlers
5784
+ });
5785
+ }
4845
5786
  }
4846
5787
  }
4847
5788
  }
5789
+ debugBuild?.(
5790
+ "generateBundle (rsc): scanned %d chunks, %d prerender chunk(s), %d static chunk(s) (%sms)",
5791
+ Object.keys(bundle).length,
5792
+ s.handlerChunkInfoMap.size,
5793
+ s.staticHandlerChunkInfoMap.size,
5794
+ (performance.now() - genStart).toFixed(1)
5795
+ );
4848
5796
  },
4849
5797
  // Build-time pre-rendering: evict handler code and inject collected prerender data.
4850
5798
  // Collection now happens in-process during discoverRouters() via RSC runner.
@@ -4855,82 +5803,41 @@ ${details}`
4855
5803
  async handler() {
4856
5804
  if (!s.isBuildMode) return;
4857
5805
  if (this.environment && this.environment.name !== "rsc") return;
4858
- postprocessBundle(s);
5806
+ timedSync(
5807
+ debugBuild,
5808
+ "closeBundle postprocessBundle",
5809
+ () => postprocessBundle(s)
5810
+ );
4859
5811
  }
4860
5812
  }
4861
5813
  };
4862
5814
  }
4863
5815
 
4864
- // src/vite/plugins/performance-tracks.ts
4865
- var DEBUG_ID_HEADER = "X-RSC-Debug-Id";
4866
- var DEBUG_C2S_EVENT = "rango:perf-c2s";
4867
- var base64ToBytes = (base64) => new Uint8Array(Buffer.from(base64, "base64"));
4868
- var devServer = null;
4869
- var sessions = /* @__PURE__ */ new Map();
4870
- function performanceTracksPlugin() {
4871
- return {
4872
- name: "@rangojs/router:performance-tracks",
4873
- apply: "serve",
4874
- configureServer(server) {
4875
- devServer = server;
4876
- const hot = server.environments.client.hot;
4877
- hot.on(DEBUG_C2S_EVENT, (payload) => {
4878
- const session = sessions.get(payload.i);
4879
- if ("d" in payload) {
4880
- if (session?.cmdController) {
4881
- try {
4882
- session.cmdController.close();
4883
- } catch {
4884
- }
4885
- delete session.cmdController;
4886
- }
4887
- return;
4888
- }
4889
- if ("b" in payload) {
4890
- if (session?.cmdController) {
4891
- try {
4892
- session.cmdController.enqueue(base64ToBytes(payload.b));
4893
- } catch {
4894
- delete session.cmdController;
4895
- }
4896
- }
4897
- return;
4898
- }
4899
- });
4900
- return () => {
4901
- server.middlewares.use((req, _res, next) => {
4902
- const existingId = req.headers[DEBUG_ID_HEADER.toLowerCase()];
4903
- const isHtml = req.headers.accept?.includes("text/html");
4904
- if (!existingId && !isHtml) {
4905
- next();
4906
- return;
4907
- }
4908
- const debugId = existingId || crypto.randomUUID();
4909
- if (!existingId) {
4910
- const lowerName = DEBUG_ID_HEADER.toLowerCase();
4911
- req.headers[lowerName] = debugId;
4912
- if (req.rawHeaders) {
4913
- req.rawHeaders.push(DEBUG_ID_HEADER, debugId);
4914
- }
4915
- }
4916
- if (!sessions.has(debugId)) {
4917
- sessions.set(debugId, { pendingChunks: [], ended: false });
4918
- }
4919
- next();
4920
- });
4921
- };
4922
- }
4923
- };
4924
- }
4925
-
4926
5816
  // src/vite/rango.ts
5817
+ var debugConfig = createRangoDebugger("rango:config");
4927
5818
  async function rango(options) {
5819
+ const rangoStart = performance.now();
4928
5820
  const resolvedOptions = options ?? { preset: "node" };
4929
5821
  const preset = resolvedOptions.preset ?? "node";
4930
5822
  const showBanner = resolvedOptions.banner ?? true;
5823
+ debugConfig?.("rango(%s) setup start", preset);
4931
5824
  const plugins = [];
4932
- const rangoAliases = getPackageAliases();
4933
- const excludeDeps = getExcludeDeps();
5825
+ const rangoAliases = { ...getPackageAliases(), ...getVendorAliases() };
5826
+ const excludeDeps = [
5827
+ ...getExcludeDeps(),
5828
+ // plugin-rsc itself injects these into the client env's
5829
+ // optimizeDeps.include, which overrides exclude for the dep's own
5830
+ // pre-bundle entry. What exclude still controls is how *other*
5831
+ // pre-bundled deps treat imports of these specs (external vs inlined)
5832
+ // via esbuildCjsExternalPlugin. The cjs-to-esm transform in
5833
+ // plugins/cjs-to-esm.ts is the fallback for strict-pnpm consumers,
5834
+ // where client.browser's bare include fails to resolve and Vite ends up
5835
+ // serving the raw CJS file at dev-serve time.
5836
+ "@vitejs/plugin-rsc/browser",
5837
+ "@vitejs/plugin-rsc/vendor/react-server-dom/client.browser"
5838
+ ];
5839
+ const pkg = getPublishedPackageName();
5840
+ const nested = (spec) => `${pkg} > ${spec}`;
4934
5841
  const routerRef = { path: void 0 };
4935
5842
  const prerenderEnabled = true;
4936
5843
  if (preset === "cloudflare") {
@@ -4968,7 +5875,7 @@ async function rango(options) {
4968
5875
  // Pre-bundle rsc-html-stream to prevent discovery during first request
4969
5876
  // Exclude rsc-router modules to ensure same Context instance
4970
5877
  optimizeDeps: {
4971
- include: ["rsc-html-stream/client"],
5878
+ include: [nested("rsc-html-stream/client")],
4972
5879
  exclude: excludeDeps,
4973
5880
  esbuildOptions: sharedEsbuildOptions
4974
5881
  }
@@ -4993,8 +5900,10 @@ async function rango(options) {
4993
5900
  "react-dom/static.edge",
4994
5901
  "react/jsx-runtime",
4995
5902
  "react/jsx-dev-runtime",
4996
- "rsc-html-stream/server",
4997
- "@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
5903
+ nested("rsc-html-stream/server"),
5904
+ nested(
5905
+ "@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
5906
+ )
4998
5907
  ],
4999
5908
  exclude: excludeDeps,
5000
5909
  esbuildOptions: sharedEsbuildOptions
@@ -5009,7 +5918,9 @@ async function rango(options) {
5009
5918
  "react",
5010
5919
  "react/jsx-runtime",
5011
5920
  "react/jsx-dev-runtime",
5012
- "@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
5921
+ nested(
5922
+ "@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
5923
+ )
5013
5924
  ],
5014
5925
  exclude: excludeDeps,
5015
5926
  esbuildOptions: sharedEsbuildOptions
@@ -5026,6 +5937,7 @@ async function rango(options) {
5026
5937
  }
5027
5938
  });
5028
5939
  plugins.push(createVirtualEntriesPlugin(finalEntries));
5940
+ plugins.push(performanceTracksPlugin());
5029
5941
  plugins.push(
5030
5942
  rsc({
5031
5943
  entries: finalEntries,
@@ -5089,7 +6001,7 @@ ${list}`);
5089
6001
  "react-dom",
5090
6002
  "react/jsx-runtime",
5091
6003
  "react/jsx-dev-runtime",
5092
- "rsc-html-stream/client"
6004
+ nested("rsc-html-stream/client")
5093
6005
  ],
5094
6006
  exclude: excludeDeps,
5095
6007
  esbuildOptions: sharedEsbuildOptions,
@@ -5106,7 +6018,9 @@ ${list}`);
5106
6018
  "react-dom/static.edge",
5107
6019
  "react/jsx-runtime",
5108
6020
  "react/jsx-dev-runtime",
5109
- "@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
6021
+ nested(
6022
+ "@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
6023
+ )
5110
6024
  ],
5111
6025
  exclude: excludeDeps,
5112
6026
  esbuildOptions: sharedEsbuildOptions
@@ -5119,7 +6033,9 @@ ${list}`);
5119
6033
  "react",
5120
6034
  "react/jsx-runtime",
5121
6035
  "react/jsx-dev-runtime",
5122
- "@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
6036
+ nested(
6037
+ "@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
6038
+ )
5123
6039
  ],
5124
6040
  esbuildOptions: sharedEsbuildOptions
5125
6041
  }
@@ -5144,6 +6060,7 @@ ${list}`);
5144
6060
  }
5145
6061
  });
5146
6062
  plugins.push(createVirtualEntriesPlugin(finalEntries, routerRef));
6063
+ plugins.push(performanceTracksPlugin());
5147
6064
  plugins.push(
5148
6065
  rsc({
5149
6066
  entries: finalEntries
@@ -5184,10 +6101,16 @@ ${list}`);
5184
6101
  createRouterDiscoveryPlugin(discoveryEntryPath, {
5185
6102
  routerPathRef: discoveryRouterRef,
5186
6103
  enableBuildPrerender: prerenderEnabled,
5187
- staticRouteTypesGeneration: resolvedOptions.staticRouteTypesGeneration
6104
+ buildEnv: options?.buildEnv,
6105
+ preset
5188
6106
  })
5189
6107
  );
5190
- plugins.push(performanceTracksPlugin());
6108
+ debugConfig?.(
6109
+ "rango(%s) setup done: %d plugin(s) (%sms)",
6110
+ preset,
6111
+ plugins.length,
6112
+ (performance.now() - rangoStart).toFixed(1)
6113
+ );
5191
6114
  return plugins;
5192
6115
  }
5193
6116
 
@@ -5198,29 +6121,75 @@ function poke() {
5198
6121
  apply: "serve",
5199
6122
  configureServer(server) {
5200
6123
  const stdin = process.stdin;
5201
- const previousRawMode = stdin.isTTY ? stdin.isRaw : null;
6124
+ const debug11 = process.env.RANGO_POKE_DEBUG === "1";
6125
+ const triggerReload = (source) => {
6126
+ server.hot.send({ type: "full-reload", path: "*" });
6127
+ server.config.logger.info(` browser reload (${source})`, {
6128
+ timestamp: true
6129
+ });
6130
+ };
6131
+ const toBuffer = (chunk) => {
6132
+ return typeof chunk === "string" ? Buffer.from(chunk, "utf8") : chunk;
6133
+ };
6134
+ const formatChunk = (chunk) => {
6135
+ const data = toBuffer(chunk);
6136
+ const hex = Array.from(data).map((byte) => `0x${byte.toString(16).padStart(2, "0")}`).join(" ");
6137
+ const ascii = Array.from(data).map((byte) => {
6138
+ if (byte >= 32 && byte <= 126) return String.fromCharCode(byte);
6139
+ if (byte === 10) return "\\n";
6140
+ if (byte === 13) return "\\r";
6141
+ if (byte === 9) return "\\t";
6142
+ return ".";
6143
+ }).join("");
6144
+ return `len=${data.length} hex=[${hex}] ascii="${ascii}"`;
6145
+ };
6146
+ const readCtrlR = (chunk) => {
6147
+ const data = typeof chunk === "string" ? Buffer.from(chunk, "utf8") : chunk;
6148
+ return data.length === 1 && data[0] === 18;
6149
+ };
6150
+ const readSubmittedCommands = (chunk) => {
6151
+ const text = toBuffer(chunk).toString("utf8").replace(/\r\n/g, "\n").replace(/\r/g, "\n");
6152
+ if (!text.includes("\n")) return [];
6153
+ const lines = text.split("\n");
6154
+ lines.pop();
6155
+ return lines;
6156
+ };
6157
+ if (debug11) {
6158
+ server.config.logger.info(
6159
+ ` poke debug enabled (isTTY=${stdin.isTTY ? "yes" : "no"}, isRaw=${stdin.isTTY ? stdin.isRaw ? "yes" : "no" : "n/a"})`,
6160
+ { timestamp: true }
6161
+ );
6162
+ }
5202
6163
  if (stdin.isTTY) {
5203
- stdin.setRawMode(true);
6164
+ server.config.logger.info(
6165
+ " poke ready: press e + enter to reload browser (ctrl+r also works when available)",
6166
+ { timestamp: true }
6167
+ );
5204
6168
  }
5205
6169
  const onData = (data) => {
5206
- if (data.length !== 1) return;
5207
- if (data[0] === 3) {
5208
- process.emit("SIGINT", "SIGINT");
5209
- return;
5210
- }
5211
- if (data[0] === 18) {
5212
- server.hot.send({ type: "full-reload", path: "*" });
5213
- server.config.logger.info(" browser reload (ctrl+r)", {
6170
+ if (debug11) {
6171
+ server.config.logger.info(` poke stdin ${formatChunk(data)}`, {
5214
6172
  timestamp: true
5215
6173
  });
5216
6174
  }
6175
+ if (readCtrlR(data)) {
6176
+ triggerReload("ctrl+r");
6177
+ return;
6178
+ }
6179
+ for (const command of readSubmittedCommands(data)) {
6180
+ if (command === "e") {
6181
+ triggerReload("e+enter");
6182
+ return;
6183
+ }
6184
+ if (command === "\x1Br") {
6185
+ triggerReload("option+r+enter");
6186
+ return;
6187
+ }
6188
+ }
5217
6189
  };
5218
6190
  stdin.on("data", onData);
5219
6191
  server.httpServer?.on("close", () => {
5220
6192
  stdin.off("data", onData);
5221
- if (stdin.isTTY && previousRawMode !== null) {
5222
- stdin.setRawMode(previousRawMode);
5223
- }
5224
6193
  });
5225
6194
  }
5226
6195
  };