@rangojs/router 0.0.0-experimental.f2337aef → 0.0.0-experimental.f2d1a2f1

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 (972) hide show
  1. package/README.md +126 -38
  2. package/dist/bin/rango.js +138 -50
  3. package/dist/vite/index.js +1183 -461
  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/cache-guide/SKILL.md +32 -0
  8. package/skills/caching/SKILL.md +45 -4
  9. package/skills/handler-use/SKILL.md +362 -0
  10. package/skills/hooks/SKILL.md +28 -20
  11. package/skills/intercept/SKILL.md +20 -0
  12. package/skills/layout/SKILL.md +22 -0
  13. package/skills/links/SKILL.md +91 -17
  14. package/skills/loader/SKILL.md +88 -45
  15. package/skills/middleware/SKILL.md +34 -3
  16. package/skills/migrate-nextjs/SKILL.md +560 -0
  17. package/skills/migrate-react-router/SKILL.md +765 -0
  18. package/skills/parallel/SKILL.md +185 -0
  19. package/skills/prerender/SKILL.md +110 -68
  20. package/skills/rango/SKILL.md +24 -22
  21. package/skills/response-routes/SKILL.md +8 -0
  22. package/skills/route/SKILL.md +55 -0
  23. package/skills/router-setup/SKILL.md +87 -2
  24. package/skills/streams-and-websockets/SKILL.md +283 -0
  25. package/skills/typesafety/SKILL.md +13 -1
  26. package/src/__internal.ts +1 -1
  27. package/src/browser/app-shell.ts +52 -0
  28. package/src/browser/app-version.ts +14 -0
  29. package/src/browser/event-controller.ts +5 -0
  30. package/src/browser/navigation-bridge.ts +88 -9
  31. package/src/browser/navigation-client.ts +167 -59
  32. package/src/browser/navigation-store.ts +68 -9
  33. package/src/browser/navigation-transaction.ts +11 -9
  34. package/src/browser/partial-update.ts +109 -15
  35. package/src/browser/prefetch/cache.ts +175 -15
  36. package/src/browser/prefetch/fetch.ts +180 -33
  37. package/src/browser/prefetch/queue.ts +123 -20
  38. package/src/browser/prefetch/resource-ready.ts +77 -0
  39. package/src/browser/rango-state.ts +53 -13
  40. package/src/browser/react/Link.tsx +81 -9
  41. package/src/browser/react/NavigationProvider.tsx +89 -14
  42. package/src/browser/react/context.ts +7 -2
  43. package/src/browser/react/use-handle.ts +9 -58
  44. package/src/browser/react/use-navigation.ts +22 -2
  45. package/src/browser/react/use-params.ts +11 -1
  46. package/src/browser/react/use-router.ts +29 -9
  47. package/src/browser/rsc-router.tsx +168 -65
  48. package/src/browser/scroll-restoration.ts +30 -15
  49. package/src/browser/segment-reconciler.ts +36 -9
  50. package/src/browser/server-action-bridge.ts +8 -6
  51. package/src/browser/types.ts +49 -5
  52. package/src/build/generate-manifest.ts +6 -6
  53. package/src/build/generate-route-types.ts +3 -0
  54. package/src/build/route-trie.ts +50 -24
  55. package/src/build/route-types/include-resolution.ts +8 -1
  56. package/src/build/route-types/router-processing.ts +223 -74
  57. package/src/build/route-types/scan-filter.ts +8 -1
  58. package/src/cache/cache-runtime.ts +15 -11
  59. package/src/cache/cache-scope.ts +48 -7
  60. package/src/cache/cf/cf-cache-store.ts +455 -15
  61. package/src/cache/cf/index.ts +5 -1
  62. package/src/cache/document-cache.ts +17 -7
  63. package/src/cache/index.ts +1 -0
  64. package/src/cache/taint.ts +55 -0
  65. package/src/client.tsx +84 -230
  66. package/src/context-var.ts +72 -2
  67. package/src/debug.ts +2 -2
  68. package/src/handle.ts +40 -0
  69. package/src/index.rsc.ts +6 -1
  70. package/src/index.ts +49 -6
  71. package/src/outlet-context.ts +1 -1
  72. package/src/prerender/store.ts +5 -4
  73. package/src/prerender.ts +138 -77
  74. package/src/response-utils.ts +28 -0
  75. package/src/reverse.ts +27 -2
  76. package/src/route-definition/dsl-helpers.ts +240 -40
  77. package/src/route-definition/helpers-types.ts +67 -19
  78. package/src/route-definition/index.ts +3 -0
  79. package/src/route-definition/redirect.ts +11 -3
  80. package/src/route-definition/resolve-handler-use.ts +155 -0
  81. package/src/route-types.ts +18 -0
  82. package/src/router/content-negotiation.ts +100 -1
  83. package/src/router/handler-context.ts +101 -25
  84. package/src/router/intercept-resolution.ts +9 -4
  85. package/src/router/lazy-includes.ts +10 -7
  86. package/src/router/loader-resolution.ts +159 -21
  87. package/src/router/logging.ts +1 -1
  88. package/src/router/manifest.ts +31 -16
  89. package/src/router/match-api.ts +127 -192
  90. package/src/router/match-middleware/background-revalidation.ts +30 -2
  91. package/src/router/match-middleware/cache-lookup.ts +94 -17
  92. package/src/router/match-middleware/cache-store.ts +53 -10
  93. package/src/router/match-middleware/intercept-resolution.ts +9 -7
  94. package/src/router/match-middleware/segment-resolution.ts +60 -5
  95. package/src/router/match-result.ts +104 -10
  96. package/src/router/metrics.ts +6 -1
  97. package/src/router/middleware-types.ts +8 -30
  98. package/src/router/middleware.ts +36 -10
  99. package/src/router/navigation-snapshot.ts +182 -0
  100. package/src/router/pattern-matching.ts +60 -9
  101. package/src/router/prerender-match.ts +110 -10
  102. package/src/router/preview-match.ts +30 -102
  103. package/src/router/request-classification.ts +310 -0
  104. package/src/router/route-snapshot.ts +245 -0
  105. package/src/router/router-context.ts +1 -0
  106. package/src/router/router-interfaces.ts +36 -4
  107. package/src/router/router-options.ts +37 -11
  108. package/src/router/segment-resolution/fresh.ts +198 -20
  109. package/src/router/segment-resolution/helpers.ts +29 -24
  110. package/src/router/segment-resolution/loader-cache.ts +1 -0
  111. package/src/router/segment-resolution/revalidation.ts +433 -296
  112. package/src/router/trie-matching.ts +10 -4
  113. package/src/router/types.ts +1 -0
  114. package/src/router/url-params.ts +49 -0
  115. package/src/router.ts +60 -8
  116. package/src/rsc/handler.ts +478 -374
  117. package/src/rsc/helpers.ts +69 -41
  118. package/src/rsc/loader-fetch.ts +23 -3
  119. package/src/rsc/manifest-init.ts +5 -1
  120. package/src/rsc/progressive-enhancement.ts +16 -2
  121. package/src/rsc/response-route-handler.ts +14 -1
  122. package/src/rsc/rsc-rendering.ts +17 -1
  123. package/src/rsc/server-action.ts +10 -0
  124. package/src/rsc/ssr-setup.ts +2 -2
  125. package/src/rsc/types.ts +9 -1
  126. package/src/segment-content-promise.ts +67 -0
  127. package/src/segment-loader-promise.ts +122 -0
  128. package/src/segment-system.tsx +109 -23
  129. package/src/server/context.ts +166 -17
  130. package/src/server/handle-store.ts +19 -0
  131. package/src/server/loader-registry.ts +9 -8
  132. package/src/server/request-context.ts +194 -60
  133. package/src/ssr/index.tsx +4 -0
  134. package/src/static-handler.ts +18 -6
  135. package/src/types/cache-types.ts +4 -4
  136. package/src/types/handler-context.ts +137 -65
  137. package/src/types/loader-types.ts +41 -15
  138. package/src/types/request-scope.ts +126 -0
  139. package/src/types/route-entry.ts +19 -1
  140. package/src/types/segments.ts +2 -0
  141. package/src/urls/include-helper.ts +24 -14
  142. package/src/urls/path-helper-types.ts +39 -6
  143. package/src/urls/path-helper.ts +48 -13
  144. package/src/urls/pattern-types.ts +12 -0
  145. package/src/urls/response-types.ts +18 -16
  146. package/src/use-loader.tsx +77 -5
  147. package/src/vite/debug.ts +86 -0
  148. package/src/vite/discovery/bundle-postprocess.ts +30 -33
  149. package/src/vite/discovery/discover-routers.ts +5 -1
  150. package/src/vite/discovery/prerender-collection.ts +128 -74
  151. package/src/vite/discovery/state.ts +13 -6
  152. package/src/vite/index.ts +4 -0
  153. package/src/vite/plugin-types.ts +51 -79
  154. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  155. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  156. package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
  157. package/src/vite/plugins/expose-action-id.ts +1 -3
  158. package/src/vite/plugins/expose-id-utils.ts +12 -0
  159. package/src/vite/plugins/expose-ids/handler-transform.ts +30 -0
  160. package/src/vite/plugins/expose-internal-ids.ts +257 -40
  161. package/src/vite/plugins/performance-tracks.ts +86 -0
  162. package/src/vite/plugins/refresh-cmd.ts +88 -26
  163. package/src/vite/plugins/version-plugin.ts +13 -1
  164. package/src/vite/rango.ts +204 -217
  165. package/src/vite/router-discovery.ts +335 -64
  166. package/src/vite/utils/banner.ts +4 -4
  167. package/src/vite/utils/package-resolution.ts +41 -1
  168. package/src/vite/utils/prerender-utils.ts +37 -5
  169. package/src/vite/utils/shared-utils.ts +3 -2
  170. package/dist/__internal.d.ts +0 -83
  171. package/dist/__internal.d.ts.map +0 -1
  172. package/dist/__internal.js +0 -19
  173. package/dist/__internal.js.map +0 -1
  174. package/dist/__mocks__/version.d.ts +0 -7
  175. package/dist/__mocks__/version.d.ts.map +0 -1
  176. package/dist/__mocks__/version.js +0 -7
  177. package/dist/__mocks__/version.js.map +0 -1
  178. package/dist/__tests__/client-href.test.d.ts +0 -2
  179. package/dist/__tests__/client-href.test.d.ts.map +0 -1
  180. package/dist/__tests__/client-href.test.js +0 -74
  181. package/dist/__tests__/client-href.test.js.map +0 -1
  182. package/dist/__tests__/component-utils.test.d.ts +0 -2
  183. package/dist/__tests__/component-utils.test.d.ts.map +0 -1
  184. package/dist/__tests__/component-utils.test.js +0 -51
  185. package/dist/__tests__/component-utils.test.js.map +0 -1
  186. package/dist/__tests__/event-controller.test.d.ts +0 -2
  187. package/dist/__tests__/event-controller.test.d.ts.map +0 -1
  188. package/dist/__tests__/event-controller.test.js +0 -538
  189. package/dist/__tests__/event-controller.test.js.map +0 -1
  190. package/dist/__tests__/helpers/route-tree.d.ts +0 -118
  191. package/dist/__tests__/helpers/route-tree.d.ts.map +0 -1
  192. package/dist/__tests__/helpers/route-tree.js +0 -374
  193. package/dist/__tests__/helpers/route-tree.js.map +0 -1
  194. package/dist/__tests__/match-result.test.d.ts +0 -2
  195. package/dist/__tests__/match-result.test.d.ts.map +0 -1
  196. package/dist/__tests__/match-result.test.js +0 -154
  197. package/dist/__tests__/match-result.test.js.map +0 -1
  198. package/dist/__tests__/navigation-store.test.d.ts +0 -2
  199. package/dist/__tests__/navigation-store.test.d.ts.map +0 -1
  200. package/dist/__tests__/navigation-store.test.js +0 -440
  201. package/dist/__tests__/navigation-store.test.js.map +0 -1
  202. package/dist/__tests__/partial-update.test.d.ts +0 -2
  203. package/dist/__tests__/partial-update.test.d.ts.map +0 -1
  204. package/dist/__tests__/partial-update.test.js +0 -1009
  205. package/dist/__tests__/partial-update.test.js.map +0 -1
  206. package/dist/__tests__/reverse-types.test.d.ts +0 -8
  207. package/dist/__tests__/reverse-types.test.d.ts.map +0 -1
  208. package/dist/__tests__/reverse-types.test.js +0 -656
  209. package/dist/__tests__/reverse-types.test.js.map +0 -1
  210. package/dist/__tests__/route-definition.test.d.ts +0 -2
  211. package/dist/__tests__/route-definition.test.d.ts.map +0 -1
  212. package/dist/__tests__/route-definition.test.js +0 -55
  213. package/dist/__tests__/route-definition.test.js.map +0 -1
  214. package/dist/__tests__/router-helpers.test.d.ts +0 -2
  215. package/dist/__tests__/router-helpers.test.d.ts.map +0 -1
  216. package/dist/__tests__/router-helpers.test.js +0 -377
  217. package/dist/__tests__/router-helpers.test.js.map +0 -1
  218. package/dist/__tests__/router-integration-2.test.d.ts +0 -2
  219. package/dist/__tests__/router-integration-2.test.d.ts.map +0 -1
  220. package/dist/__tests__/router-integration-2.test.js +0 -426
  221. package/dist/__tests__/router-integration-2.test.js.map +0 -1
  222. package/dist/__tests__/router-integration.test.d.ts +0 -2
  223. package/dist/__tests__/router-integration.test.d.ts.map +0 -1
  224. package/dist/__tests__/router-integration.test.js +0 -1051
  225. package/dist/__tests__/router-integration.test.js.map +0 -1
  226. package/dist/__tests__/search-params.test.d.ts +0 -5
  227. package/dist/__tests__/search-params.test.d.ts.map +0 -1
  228. package/dist/__tests__/search-params.test.js +0 -306
  229. package/dist/__tests__/search-params.test.js.map +0 -1
  230. package/dist/__tests__/segment-system.test.d.ts +0 -2
  231. package/dist/__tests__/segment-system.test.d.ts.map +0 -1
  232. package/dist/__tests__/segment-system.test.js +0 -627
  233. package/dist/__tests__/segment-system.test.js.map +0 -1
  234. package/dist/__tests__/static-handler-types.test.d.ts +0 -8
  235. package/dist/__tests__/static-handler-types.test.d.ts.map +0 -1
  236. package/dist/__tests__/static-handler-types.test.js +0 -63
  237. package/dist/__tests__/static-handler-types.test.js.map +0 -1
  238. package/dist/__tests__/urls.test.d.ts +0 -2
  239. package/dist/__tests__/urls.test.d.ts.map +0 -1
  240. package/dist/__tests__/urls.test.js +0 -421
  241. package/dist/__tests__/urls.test.js.map +0 -1
  242. package/dist/__tests__/use-mount.test.d.ts +0 -2
  243. package/dist/__tests__/use-mount.test.d.ts.map +0 -1
  244. package/dist/__tests__/use-mount.test.js +0 -35
  245. package/dist/__tests__/use-mount.test.js.map +0 -1
  246. package/dist/bin/rango.d.ts +0 -2
  247. package/dist/bin/rango.d.ts.map +0 -1
  248. package/dist/bin/rango.js.map +0 -1
  249. package/dist/browser/event-controller.d.ts +0 -191
  250. package/dist/browser/event-controller.d.ts.map +0 -1
  251. package/dist/browser/event-controller.js +0 -559
  252. package/dist/browser/event-controller.js.map +0 -1
  253. package/dist/browser/index.d.ts +0 -2
  254. package/dist/browser/index.d.ts.map +0 -1
  255. package/dist/browser/index.js +0 -14
  256. package/dist/browser/index.js.map +0 -1
  257. package/dist/browser/link-interceptor.d.ts +0 -38
  258. package/dist/browser/link-interceptor.d.ts.map +0 -1
  259. package/dist/browser/link-interceptor.js +0 -99
  260. package/dist/browser/link-interceptor.js.map +0 -1
  261. package/dist/browser/logging.d.ts +0 -10
  262. package/dist/browser/logging.d.ts.map +0 -1
  263. package/dist/browser/logging.js +0 -29
  264. package/dist/browser/logging.js.map +0 -1
  265. package/dist/browser/lru-cache.d.ts +0 -17
  266. package/dist/browser/lru-cache.d.ts.map +0 -1
  267. package/dist/browser/lru-cache.js +0 -50
  268. package/dist/browser/lru-cache.js.map +0 -1
  269. package/dist/browser/merge-segment-loaders.d.ts +0 -39
  270. package/dist/browser/merge-segment-loaders.d.ts.map +0 -1
  271. package/dist/browser/merge-segment-loaders.js +0 -102
  272. package/dist/browser/merge-segment-loaders.js.map +0 -1
  273. package/dist/browser/navigation-bridge.d.ts +0 -102
  274. package/dist/browser/navigation-bridge.d.ts.map +0 -1
  275. package/dist/browser/navigation-bridge.js +0 -708
  276. package/dist/browser/navigation-bridge.js.map +0 -1
  277. package/dist/browser/navigation-client.d.ts +0 -25
  278. package/dist/browser/navigation-client.d.ts.map +0 -1
  279. package/dist/browser/navigation-client.js +0 -157
  280. package/dist/browser/navigation-client.js.map +0 -1
  281. package/dist/browser/navigation-store.d.ts +0 -101
  282. package/dist/browser/navigation-store.d.ts.map +0 -1
  283. package/dist/browser/navigation-store.js +0 -625
  284. package/dist/browser/navigation-store.js.map +0 -1
  285. package/dist/browser/partial-update.d.ts +0 -75
  286. package/dist/browser/partial-update.d.ts.map +0 -1
  287. package/dist/browser/partial-update.js +0 -426
  288. package/dist/browser/partial-update.js.map +0 -1
  289. package/dist/browser/react/Link.d.ts +0 -86
  290. package/dist/browser/react/Link.d.ts.map +0 -1
  291. package/dist/browser/react/Link.js +0 -128
  292. package/dist/browser/react/Link.js.map +0 -1
  293. package/dist/browser/react/NavigationProvider.d.ts +0 -63
  294. package/dist/browser/react/NavigationProvider.d.ts.map +0 -1
  295. package/dist/browser/react/NavigationProvider.js +0 -216
  296. package/dist/browser/react/NavigationProvider.js.map +0 -1
  297. package/dist/browser/react/ScrollRestoration.d.ts +0 -75
  298. package/dist/browser/react/ScrollRestoration.d.ts.map +0 -1
  299. package/dist/browser/react/ScrollRestoration.js +0 -57
  300. package/dist/browser/react/ScrollRestoration.js.map +0 -1
  301. package/dist/browser/react/context.d.ts +0 -46
  302. package/dist/browser/react/context.d.ts.map +0 -1
  303. package/dist/browser/react/context.js +0 -10
  304. package/dist/browser/react/context.js.map +0 -1
  305. package/dist/browser/react/index.d.ts +0 -11
  306. package/dist/browser/react/index.d.ts.map +0 -1
  307. package/dist/browser/react/index.js +0 -22
  308. package/dist/browser/react/index.js.map +0 -1
  309. package/dist/browser/react/location-state-shared.d.ts +0 -63
  310. package/dist/browser/react/location-state-shared.d.ts.map +0 -1
  311. package/dist/browser/react/location-state-shared.js +0 -81
  312. package/dist/browser/react/location-state-shared.js.map +0 -1
  313. package/dist/browser/react/location-state.d.ts +0 -23
  314. package/dist/browser/react/location-state.d.ts.map +0 -1
  315. package/dist/browser/react/location-state.js +0 -29
  316. package/dist/browser/react/location-state.js.map +0 -1
  317. package/dist/browser/react/mount-context.d.ts +0 -24
  318. package/dist/browser/react/mount-context.d.ts.map +0 -1
  319. package/dist/browser/react/mount-context.js +0 -24
  320. package/dist/browser/react/mount-context.js.map +0 -1
  321. package/dist/browser/react/use-action.d.ts +0 -64
  322. package/dist/browser/react/use-action.d.ts.map +0 -1
  323. package/dist/browser/react/use-action.js +0 -134
  324. package/dist/browser/react/use-action.js.map +0 -1
  325. package/dist/browser/react/use-client-cache.d.ts +0 -41
  326. package/dist/browser/react/use-client-cache.d.ts.map +0 -1
  327. package/dist/browser/react/use-client-cache.js +0 -39
  328. package/dist/browser/react/use-client-cache.js.map +0 -1
  329. package/dist/browser/react/use-handle.d.ts +0 -31
  330. package/dist/browser/react/use-handle.d.ts.map +0 -1
  331. package/dist/browser/react/use-handle.js +0 -144
  332. package/dist/browser/react/use-handle.js.map +0 -1
  333. package/dist/browser/react/use-href.d.ts +0 -33
  334. package/dist/browser/react/use-href.d.ts.map +0 -1
  335. package/dist/browser/react/use-href.js +0 -39
  336. package/dist/browser/react/use-href.js.map +0 -1
  337. package/dist/browser/react/use-link-status.d.ts +0 -37
  338. package/dist/browser/react/use-link-status.d.ts.map +0 -1
  339. package/dist/browser/react/use-link-status.js +0 -99
  340. package/dist/browser/react/use-link-status.js.map +0 -1
  341. package/dist/browser/react/use-mount.d.ts +0 -25
  342. package/dist/browser/react/use-mount.d.ts.map +0 -1
  343. package/dist/browser/react/use-mount.js +0 -30
  344. package/dist/browser/react/use-mount.js.map +0 -1
  345. package/dist/browser/react/use-navigation.d.ts +0 -27
  346. package/dist/browser/react/use-navigation.d.ts.map +0 -1
  347. package/dist/browser/react/use-navigation.js +0 -87
  348. package/dist/browser/react/use-navigation.js.map +0 -1
  349. package/dist/browser/react/use-segments.d.ts +0 -38
  350. package/dist/browser/react/use-segments.d.ts.map +0 -1
  351. package/dist/browser/react/use-segments.js +0 -130
  352. package/dist/browser/react/use-segments.js.map +0 -1
  353. package/dist/browser/request-controller.d.ts +0 -26
  354. package/dist/browser/request-controller.d.ts.map +0 -1
  355. package/dist/browser/request-controller.js +0 -147
  356. package/dist/browser/request-controller.js.map +0 -1
  357. package/dist/browser/rsc-router.d.ts +0 -129
  358. package/dist/browser/rsc-router.d.ts.map +0 -1
  359. package/dist/browser/rsc-router.js +0 -195
  360. package/dist/browser/rsc-router.js.map +0 -1
  361. package/dist/browser/scroll-restoration.d.ts +0 -93
  362. package/dist/browser/scroll-restoration.d.ts.map +0 -1
  363. package/dist/browser/scroll-restoration.js +0 -321
  364. package/dist/browser/scroll-restoration.js.map +0 -1
  365. package/dist/browser/segment-structure-assert.d.ts +0 -17
  366. package/dist/browser/segment-structure-assert.d.ts.map +0 -1
  367. package/dist/browser/segment-structure-assert.js +0 -59
  368. package/dist/browser/segment-structure-assert.js.map +0 -1
  369. package/dist/browser/server-action-bridge.d.ts +0 -26
  370. package/dist/browser/server-action-bridge.d.ts.map +0 -1
  371. package/dist/browser/server-action-bridge.js +0 -668
  372. package/dist/browser/server-action-bridge.js.map +0 -1
  373. package/dist/browser/shallow.d.ts +0 -12
  374. package/dist/browser/shallow.d.ts.map +0 -1
  375. package/dist/browser/shallow.js +0 -34
  376. package/dist/browser/shallow.js.map +0 -1
  377. package/dist/browser/types.d.ts +0 -369
  378. package/dist/browser/types.d.ts.map +0 -1
  379. package/dist/browser/types.js +0 -2
  380. package/dist/browser/types.js.map +0 -1
  381. package/dist/build/__tests__/generate-cli.test.d.ts +0 -2
  382. package/dist/build/__tests__/generate-cli.test.d.ts.map +0 -1
  383. package/dist/build/__tests__/generate-cli.test.js +0 -237
  384. package/dist/build/__tests__/generate-cli.test.js.map +0 -1
  385. package/dist/build/__tests__/generate-manifest.test.d.ts +0 -2
  386. package/dist/build/__tests__/generate-manifest.test.d.ts.map +0 -1
  387. package/dist/build/__tests__/generate-manifest.test.js +0 -119
  388. package/dist/build/__tests__/generate-manifest.test.js.map +0 -1
  389. package/dist/build/__tests__/generate-route-types.test.d.ts +0 -2
  390. package/dist/build/__tests__/generate-route-types.test.d.ts.map +0 -1
  391. package/dist/build/__tests__/generate-route-types.test.js +0 -620
  392. package/dist/build/__tests__/generate-route-types.test.js.map +0 -1
  393. package/dist/build/__tests__/per-router-manifest.test.d.ts +0 -2
  394. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +0 -1
  395. package/dist/build/__tests__/per-router-manifest.test.js +0 -308
  396. package/dist/build/__tests__/per-router-manifest.test.js.map +0 -1
  397. package/dist/build/generate-manifest.d.ts +0 -81
  398. package/dist/build/generate-manifest.d.ts.map +0 -1
  399. package/dist/build/generate-manifest.js +0 -276
  400. package/dist/build/generate-manifest.js.map +0 -1
  401. package/dist/build/generate-route-types.d.ts +0 -115
  402. package/dist/build/generate-route-types.d.ts.map +0 -1
  403. package/dist/build/generate-route-types.js +0 -740
  404. package/dist/build/generate-route-types.js.map +0 -1
  405. package/dist/build/index.d.ts +0 -21
  406. package/dist/build/index.d.ts.map +0 -1
  407. package/dist/build/index.js +0 -21
  408. package/dist/build/index.js.map +0 -1
  409. package/dist/build/route-trie.d.ts +0 -71
  410. package/dist/build/route-trie.d.ts.map +0 -1
  411. package/dist/build/route-trie.js +0 -175
  412. package/dist/build/route-trie.js.map +0 -1
  413. package/dist/cache/__tests__/cache-scope.test.d.ts +0 -2
  414. package/dist/cache/__tests__/cache-scope.test.d.ts.map +0 -1
  415. package/dist/cache/__tests__/cache-scope.test.js +0 -208
  416. package/dist/cache/__tests__/cache-scope.test.js.map +0 -1
  417. package/dist/cache/__tests__/document-cache.test.d.ts +0 -2
  418. package/dist/cache/__tests__/document-cache.test.d.ts.map +0 -1
  419. package/dist/cache/__tests__/document-cache.test.js +0 -345
  420. package/dist/cache/__tests__/document-cache.test.js.map +0 -1
  421. package/dist/cache/__tests__/memory-segment-store.test.d.ts +0 -2
  422. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +0 -1
  423. package/dist/cache/__tests__/memory-segment-store.test.js +0 -425
  424. package/dist/cache/__tests__/memory-segment-store.test.js.map +0 -1
  425. package/dist/cache/__tests__/memory-store.test.d.ts +0 -2
  426. package/dist/cache/__tests__/memory-store.test.d.ts.map +0 -1
  427. package/dist/cache/__tests__/memory-store.test.js +0 -367
  428. package/dist/cache/__tests__/memory-store.test.js.map +0 -1
  429. package/dist/cache/cache-scope.d.ts +0 -102
  430. package/dist/cache/cache-scope.d.ts.map +0 -1
  431. package/dist/cache/cache-scope.js +0 -440
  432. package/dist/cache/cache-scope.js.map +0 -1
  433. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +0 -2
  434. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +0 -1
  435. package/dist/cache/cf/__tests__/cf-cache-store.test.js +0 -330
  436. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +0 -1
  437. package/dist/cache/cf/cf-cache-store.d.ts +0 -165
  438. package/dist/cache/cf/cf-cache-store.d.ts.map +0 -1
  439. package/dist/cache/cf/cf-cache-store.js +0 -242
  440. package/dist/cache/cf/cf-cache-store.js.map +0 -1
  441. package/dist/cache/cf/index.d.ts +0 -14
  442. package/dist/cache/cf/index.d.ts.map +0 -1
  443. package/dist/cache/cf/index.js +0 -17
  444. package/dist/cache/cf/index.js.map +0 -1
  445. package/dist/cache/document-cache.d.ts +0 -64
  446. package/dist/cache/document-cache.d.ts.map +0 -1
  447. package/dist/cache/document-cache.js +0 -228
  448. package/dist/cache/document-cache.js.map +0 -1
  449. package/dist/cache/index.d.ts +0 -19
  450. package/dist/cache/index.d.ts.map +0 -1
  451. package/dist/cache/index.js +0 -21
  452. package/dist/cache/index.js.map +0 -1
  453. package/dist/cache/memory-segment-store.d.ts +0 -110
  454. package/dist/cache/memory-segment-store.d.ts.map +0 -1
  455. package/dist/cache/memory-segment-store.js +0 -117
  456. package/dist/cache/memory-segment-store.js.map +0 -1
  457. package/dist/cache/memory-store.d.ts +0 -41
  458. package/dist/cache/memory-store.d.ts.map +0 -1
  459. package/dist/cache/memory-store.js +0 -191
  460. package/dist/cache/memory-store.js.map +0 -1
  461. package/dist/cache/types.d.ts +0 -317
  462. package/dist/cache/types.d.ts.map +0 -1
  463. package/dist/cache/types.js +0 -12
  464. package/dist/cache/types.js.map +0 -1
  465. package/dist/client.d.ts +0 -248
  466. package/dist/client.d.ts.map +0 -1
  467. package/dist/client.js +0 -367
  468. package/dist/client.js.map +0 -1
  469. package/dist/client.rsc.d.ts +0 -26
  470. package/dist/client.rsc.d.ts.map +0 -1
  471. package/dist/client.rsc.js +0 -46
  472. package/dist/client.rsc.js.map +0 -1
  473. package/dist/component-utils.d.ts +0 -36
  474. package/dist/component-utils.d.ts.map +0 -1
  475. package/dist/component-utils.js +0 -61
  476. package/dist/component-utils.js.map +0 -1
  477. package/dist/components/DefaultDocument.d.ts +0 -13
  478. package/dist/components/DefaultDocument.d.ts.map +0 -1
  479. package/dist/components/DefaultDocument.js +0 -15
  480. package/dist/components/DefaultDocument.js.map +0 -1
  481. package/dist/debug.d.ts +0 -58
  482. package/dist/debug.d.ts.map +0 -1
  483. package/dist/debug.js +0 -157
  484. package/dist/debug.js.map +0 -1
  485. package/dist/default-error-boundary.d.ts +0 -11
  486. package/dist/default-error-boundary.d.ts.map +0 -1
  487. package/dist/default-error-boundary.js +0 -45
  488. package/dist/default-error-boundary.js.map +0 -1
  489. package/dist/deps/browser.d.ts +0 -2
  490. package/dist/deps/browser.d.ts.map +0 -1
  491. package/dist/deps/browser.js +0 -3
  492. package/dist/deps/browser.js.map +0 -1
  493. package/dist/deps/html-stream-client.d.ts +0 -2
  494. package/dist/deps/html-stream-client.d.ts.map +0 -1
  495. package/dist/deps/html-stream-client.js +0 -3
  496. package/dist/deps/html-stream-client.js.map +0 -1
  497. package/dist/deps/html-stream-server.d.ts +0 -2
  498. package/dist/deps/html-stream-server.d.ts.map +0 -1
  499. package/dist/deps/html-stream-server.js +0 -3
  500. package/dist/deps/html-stream-server.js.map +0 -1
  501. package/dist/deps/rsc.d.ts +0 -2
  502. package/dist/deps/rsc.d.ts.map +0 -1
  503. package/dist/deps/rsc.js +0 -4
  504. package/dist/deps/rsc.js.map +0 -1
  505. package/dist/deps/ssr.d.ts +0 -2
  506. package/dist/deps/ssr.d.ts.map +0 -1
  507. package/dist/deps/ssr.js +0 -3
  508. package/dist/deps/ssr.js.map +0 -1
  509. package/dist/errors.d.ts +0 -174
  510. package/dist/errors.d.ts.map +0 -1
  511. package/dist/errors.js +0 -241
  512. package/dist/errors.js.map +0 -1
  513. package/dist/handle.d.ts +0 -78
  514. package/dist/handle.d.ts.map +0 -1
  515. package/dist/handle.js +0 -82
  516. package/dist/handle.js.map +0 -1
  517. package/dist/handles/MetaTags.d.ts +0 -14
  518. package/dist/handles/MetaTags.d.ts.map +0 -1
  519. package/dist/handles/MetaTags.js +0 -136
  520. package/dist/handles/MetaTags.js.map +0 -1
  521. package/dist/handles/index.d.ts +0 -6
  522. package/dist/handles/index.d.ts.map +0 -1
  523. package/dist/handles/index.js +0 -6
  524. package/dist/handles/index.js.map +0 -1
  525. package/dist/handles/meta.d.ts +0 -39
  526. package/dist/handles/meta.d.ts.map +0 -1
  527. package/dist/handles/meta.js +0 -202
  528. package/dist/handles/meta.js.map +0 -1
  529. package/dist/host/__tests__/errors.test.d.ts +0 -2
  530. package/dist/host/__tests__/errors.test.d.ts.map +0 -1
  531. package/dist/host/__tests__/errors.test.js +0 -76
  532. package/dist/host/__tests__/errors.test.js.map +0 -1
  533. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +0 -2
  534. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +0 -1
  535. package/dist/host/__tests__/pattern-comprehensive.test.js +0 -732
  536. package/dist/host/__tests__/pattern-comprehensive.test.js.map +0 -1
  537. package/dist/host/__tests__/pattern-matcher.test.d.ts +0 -2
  538. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +0 -1
  539. package/dist/host/__tests__/pattern-matcher.test.js +0 -251
  540. package/dist/host/__tests__/pattern-matcher.test.js.map +0 -1
  541. package/dist/host/__tests__/router.test.d.ts +0 -2
  542. package/dist/host/__tests__/router.test.d.ts.map +0 -1
  543. package/dist/host/__tests__/router.test.js +0 -241
  544. package/dist/host/__tests__/router.test.js.map +0 -1
  545. package/dist/host/__tests__/testing.test.d.ts +0 -2
  546. package/dist/host/__tests__/testing.test.d.ts.map +0 -1
  547. package/dist/host/__tests__/testing.test.js +0 -64
  548. package/dist/host/__tests__/testing.test.js.map +0 -1
  549. package/dist/host/__tests__/utils.test.d.ts +0 -2
  550. package/dist/host/__tests__/utils.test.d.ts.map +0 -1
  551. package/dist/host/__tests__/utils.test.js +0 -29
  552. package/dist/host/__tests__/utils.test.js.map +0 -1
  553. package/dist/host/cookie-handler.d.ts +0 -34
  554. package/dist/host/cookie-handler.d.ts.map +0 -1
  555. package/dist/host/cookie-handler.js +0 -124
  556. package/dist/host/cookie-handler.js.map +0 -1
  557. package/dist/host/errors.d.ts +0 -56
  558. package/dist/host/errors.d.ts.map +0 -1
  559. package/dist/host/errors.js +0 -79
  560. package/dist/host/errors.js.map +0 -1
  561. package/dist/host/index.d.ts +0 -29
  562. package/dist/host/index.d.ts.map +0 -1
  563. package/dist/host/index.js +0 -32
  564. package/dist/host/index.js.map +0 -1
  565. package/dist/host/pattern-matcher.d.ts +0 -36
  566. package/dist/host/pattern-matcher.d.ts.map +0 -1
  567. package/dist/host/pattern-matcher.js +0 -172
  568. package/dist/host/pattern-matcher.js.map +0 -1
  569. package/dist/host/router.d.ts +0 -26
  570. package/dist/host/router.d.ts.map +0 -1
  571. package/dist/host/router.js +0 -218
  572. package/dist/host/router.js.map +0 -1
  573. package/dist/host/testing.d.ts +0 -36
  574. package/dist/host/testing.d.ts.map +0 -1
  575. package/dist/host/testing.js +0 -55
  576. package/dist/host/testing.js.map +0 -1
  577. package/dist/host/types.d.ts +0 -115
  578. package/dist/host/types.d.ts.map +0 -1
  579. package/dist/host/types.js +0 -7
  580. package/dist/host/types.js.map +0 -1
  581. package/dist/host/utils.d.ts +0 -21
  582. package/dist/host/utils.d.ts.map +0 -1
  583. package/dist/host/utils.js +0 -23
  584. package/dist/host/utils.js.map +0 -1
  585. package/dist/href-client.d.ts +0 -131
  586. package/dist/href-client.d.ts.map +0 -1
  587. package/dist/href-client.js +0 -64
  588. package/dist/href-client.js.map +0 -1
  589. package/dist/href-context.d.ts +0 -29
  590. package/dist/href-context.d.ts.map +0 -1
  591. package/dist/href-context.js +0 -21
  592. package/dist/href-context.js.map +0 -1
  593. package/dist/index.d.ts +0 -73
  594. package/dist/index.d.ts.map +0 -1
  595. package/dist/index.js +0 -91
  596. package/dist/index.js.map +0 -1
  597. package/dist/index.rsc.d.ts +0 -32
  598. package/dist/index.rsc.d.ts.map +0 -1
  599. package/dist/index.rsc.js +0 -40
  600. package/dist/index.rsc.js.map +0 -1
  601. package/dist/internal-debug.d.ts +0 -2
  602. package/dist/internal-debug.d.ts.map +0 -1
  603. package/dist/internal-debug.js +0 -5
  604. package/dist/internal-debug.js.map +0 -1
  605. package/dist/loader.d.ts +0 -14
  606. package/dist/loader.d.ts.map +0 -1
  607. package/dist/loader.js +0 -20
  608. package/dist/loader.js.map +0 -1
  609. package/dist/loader.rsc.d.ts +0 -19
  610. package/dist/loader.rsc.d.ts.map +0 -1
  611. package/dist/loader.rsc.js +0 -99
  612. package/dist/loader.rsc.js.map +0 -1
  613. package/dist/network-error-thrower.d.ts +0 -17
  614. package/dist/network-error-thrower.d.ts.map +0 -1
  615. package/dist/network-error-thrower.js +0 -14
  616. package/dist/network-error-thrower.js.map +0 -1
  617. package/dist/outlet-context.d.ts +0 -13
  618. package/dist/outlet-context.d.ts.map +0 -1
  619. package/dist/outlet-context.js +0 -3
  620. package/dist/outlet-context.js.map +0 -1
  621. package/dist/prerender/__tests__/param-hash.test.d.ts +0 -2
  622. package/dist/prerender/__tests__/param-hash.test.d.ts.map +0 -1
  623. package/dist/prerender/__tests__/param-hash.test.js +0 -148
  624. package/dist/prerender/__tests__/param-hash.test.js.map +0 -1
  625. package/dist/prerender/param-hash.d.ts +0 -16
  626. package/dist/prerender/param-hash.d.ts.map +0 -1
  627. package/dist/prerender/param-hash.js +0 -36
  628. package/dist/prerender/param-hash.js.map +0 -1
  629. package/dist/prerender/store.d.ts +0 -38
  630. package/dist/prerender/store.d.ts.map +0 -1
  631. package/dist/prerender/store.js +0 -61
  632. package/dist/prerender/store.js.map +0 -1
  633. package/dist/prerender.d.ts +0 -66
  634. package/dist/prerender.d.ts.map +0 -1
  635. package/dist/prerender.js +0 -57
  636. package/dist/prerender.js.map +0 -1
  637. package/dist/reverse.d.ts +0 -196
  638. package/dist/reverse.d.ts.map +0 -1
  639. package/dist/reverse.js +0 -78
  640. package/dist/reverse.js.map +0 -1
  641. package/dist/root-error-boundary.d.ts +0 -33
  642. package/dist/root-error-boundary.d.ts.map +0 -1
  643. package/dist/root-error-boundary.js +0 -165
  644. package/dist/root-error-boundary.js.map +0 -1
  645. package/dist/route-content-wrapper.d.ts +0 -46
  646. package/dist/route-content-wrapper.d.ts.map +0 -1
  647. package/dist/route-content-wrapper.js +0 -77
  648. package/dist/route-content-wrapper.js.map +0 -1
  649. package/dist/route-definition.d.ts +0 -421
  650. package/dist/route-definition.d.ts.map +0 -1
  651. package/dist/route-definition.js +0 -868
  652. package/dist/route-definition.js.map +0 -1
  653. package/dist/route-map-builder.d.ts +0 -155
  654. package/dist/route-map-builder.d.ts.map +0 -1
  655. package/dist/route-map-builder.js +0 -237
  656. package/dist/route-map-builder.js.map +0 -1
  657. package/dist/route-types.d.ts +0 -165
  658. package/dist/route-types.d.ts.map +0 -1
  659. package/dist/route-types.js +0 -7
  660. package/dist/route-types.js.map +0 -1
  661. package/dist/router/__tests__/handler-context.test.d.ts +0 -2
  662. package/dist/router/__tests__/handler-context.test.d.ts.map +0 -1
  663. package/dist/router/__tests__/handler-context.test.js +0 -65
  664. package/dist/router/__tests__/handler-context.test.js.map +0 -1
  665. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +0 -2
  666. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +0 -1
  667. package/dist/router/__tests__/loader-cycle-detection.test.js +0 -221
  668. package/dist/router/__tests__/loader-cycle-detection.test.js.map +0 -1
  669. package/dist/router/__tests__/match-context.test.d.ts +0 -2
  670. package/dist/router/__tests__/match-context.test.d.ts.map +0 -1
  671. package/dist/router/__tests__/match-context.test.js +0 -92
  672. package/dist/router/__tests__/match-context.test.js.map +0 -1
  673. package/dist/router/__tests__/match-pipelines.test.d.ts +0 -2
  674. package/dist/router/__tests__/match-pipelines.test.d.ts.map +0 -1
  675. package/dist/router/__tests__/match-pipelines.test.js +0 -417
  676. package/dist/router/__tests__/match-pipelines.test.js.map +0 -1
  677. package/dist/router/__tests__/match-result.test.d.ts +0 -2
  678. package/dist/router/__tests__/match-result.test.d.ts.map +0 -1
  679. package/dist/router/__tests__/match-result.test.js +0 -457
  680. package/dist/router/__tests__/match-result.test.js.map +0 -1
  681. package/dist/router/__tests__/on-error.test.d.ts +0 -2
  682. package/dist/router/__tests__/on-error.test.d.ts.map +0 -1
  683. package/dist/router/__tests__/on-error.test.js +0 -678
  684. package/dist/router/__tests__/on-error.test.js.map +0 -1
  685. package/dist/router/__tests__/pattern-matching.test.d.ts +0 -2
  686. package/dist/router/__tests__/pattern-matching.test.d.ts.map +0 -1
  687. package/dist/router/__tests__/pattern-matching.test.js +0 -629
  688. package/dist/router/__tests__/pattern-matching.test.js.map +0 -1
  689. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +0 -2
  690. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +0 -1
  691. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +0 -155
  692. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +0 -1
  693. package/dist/router/error-handling.d.ts +0 -77
  694. package/dist/router/error-handling.d.ts.map +0 -1
  695. package/dist/router/error-handling.js +0 -202
  696. package/dist/router/error-handling.js.map +0 -1
  697. package/dist/router/handler-context.d.ts +0 -20
  698. package/dist/router/handler-context.d.ts.map +0 -1
  699. package/dist/router/handler-context.js +0 -198
  700. package/dist/router/handler-context.js.map +0 -1
  701. package/dist/router/intercept-resolution.d.ts +0 -66
  702. package/dist/router/intercept-resolution.d.ts.map +0 -1
  703. package/dist/router/intercept-resolution.js +0 -246
  704. package/dist/router/intercept-resolution.js.map +0 -1
  705. package/dist/router/loader-resolution.d.ts +0 -64
  706. package/dist/router/loader-resolution.d.ts.map +0 -1
  707. package/dist/router/loader-resolution.js +0 -284
  708. package/dist/router/loader-resolution.js.map +0 -1
  709. package/dist/router/logging.d.ts +0 -15
  710. package/dist/router/logging.d.ts.map +0 -1
  711. package/dist/router/logging.js +0 -99
  712. package/dist/router/logging.js.map +0 -1
  713. package/dist/router/manifest.d.ts +0 -22
  714. package/dist/router/manifest.d.ts.map +0 -1
  715. package/dist/router/manifest.js +0 -181
  716. package/dist/router/manifest.js.map +0 -1
  717. package/dist/router/match-api.d.ts +0 -35
  718. package/dist/router/match-api.d.ts.map +0 -1
  719. package/dist/router/match-api.js +0 -406
  720. package/dist/router/match-api.js.map +0 -1
  721. package/dist/router/match-context.d.ts +0 -206
  722. package/dist/router/match-context.d.ts.map +0 -1
  723. package/dist/router/match-context.js +0 -17
  724. package/dist/router/match-context.js.map +0 -1
  725. package/dist/router/match-middleware/background-revalidation.d.ts +0 -127
  726. package/dist/router/match-middleware/background-revalidation.d.ts.map +0 -1
  727. package/dist/router/match-middleware/background-revalidation.js +0 -75
  728. package/dist/router/match-middleware/background-revalidation.js.map +0 -1
  729. package/dist/router/match-middleware/cache-lookup.d.ts +0 -112
  730. package/dist/router/match-middleware/cache-lookup.d.ts.map +0 -1
  731. package/dist/router/match-middleware/cache-lookup.js +0 -257
  732. package/dist/router/match-middleware/cache-lookup.js.map +0 -1
  733. package/dist/router/match-middleware/cache-store.d.ts +0 -113
  734. package/dist/router/match-middleware/cache-store.d.ts.map +0 -1
  735. package/dist/router/match-middleware/cache-store.js +0 -108
  736. package/dist/router/match-middleware/cache-store.js.map +0 -1
  737. package/dist/router/match-middleware/index.d.ts +0 -81
  738. package/dist/router/match-middleware/index.d.ts.map +0 -1
  739. package/dist/router/match-middleware/index.js +0 -80
  740. package/dist/router/match-middleware/index.js.map +0 -1
  741. package/dist/router/match-middleware/intercept-resolution.d.ts +0 -117
  742. package/dist/router/match-middleware/intercept-resolution.d.ts.map +0 -1
  743. package/dist/router/match-middleware/intercept-resolution.js +0 -134
  744. package/dist/router/match-middleware/intercept-resolution.js.map +0 -1
  745. package/dist/router/match-middleware/segment-resolution.d.ts +0 -99
  746. package/dist/router/match-middleware/segment-resolution.d.ts.map +0 -1
  747. package/dist/router/match-middleware/segment-resolution.js +0 -53
  748. package/dist/router/match-middleware/segment-resolution.js.map +0 -1
  749. package/dist/router/match-pipelines.d.ts +0 -147
  750. package/dist/router/match-pipelines.d.ts.map +0 -1
  751. package/dist/router/match-pipelines.js +0 -82
  752. package/dist/router/match-pipelines.js.map +0 -1
  753. package/dist/router/match-result.d.ts +0 -126
  754. package/dist/router/match-result.d.ts.map +0 -1
  755. package/dist/router/match-result.js +0 -93
  756. package/dist/router/match-result.js.map +0 -1
  757. package/dist/router/metrics.d.ts +0 -20
  758. package/dist/router/metrics.d.ts.map +0 -1
  759. package/dist/router/metrics.js +0 -47
  760. package/dist/router/metrics.js.map +0 -1
  761. package/dist/router/middleware.d.ts +0 -249
  762. package/dist/router/middleware.d.ts.map +0 -1
  763. package/dist/router/middleware.js +0 -434
  764. package/dist/router/middleware.js.map +0 -1
  765. package/dist/router/middleware.test.d.ts +0 -2
  766. package/dist/router/middleware.test.d.ts.map +0 -1
  767. package/dist/router/middleware.test.js +0 -816
  768. package/dist/router/middleware.test.js.map +0 -1
  769. package/dist/router/pattern-matching.d.ts +0 -149
  770. package/dist/router/pattern-matching.d.ts.map +0 -1
  771. package/dist/router/pattern-matching.js +0 -349
  772. package/dist/router/pattern-matching.js.map +0 -1
  773. package/dist/router/revalidation.d.ts +0 -44
  774. package/dist/router/revalidation.d.ts.map +0 -1
  775. package/dist/router/revalidation.js +0 -147
  776. package/dist/router/revalidation.js.map +0 -1
  777. package/dist/router/router-context.d.ts +0 -135
  778. package/dist/router/router-context.d.ts.map +0 -1
  779. package/dist/router/router-context.js +0 -36
  780. package/dist/router/router-context.js.map +0 -1
  781. package/dist/router/segment-resolution.d.ts +0 -127
  782. package/dist/router/segment-resolution.d.ts.map +0 -1
  783. package/dist/router/segment-resolution.js +0 -919
  784. package/dist/router/segment-resolution.js.map +0 -1
  785. package/dist/router/trie-matching.d.ts +0 -40
  786. package/dist/router/trie-matching.d.ts.map +0 -1
  787. package/dist/router/trie-matching.js +0 -127
  788. package/dist/router/trie-matching.js.map +0 -1
  789. package/dist/router/types.d.ts +0 -136
  790. package/dist/router/types.d.ts.map +0 -1
  791. package/dist/router/types.js +0 -7
  792. package/dist/router/types.js.map +0 -1
  793. package/dist/router.d.ts +0 -753
  794. package/dist/router.d.ts.map +0 -1
  795. package/dist/router.gen.d.ts +0 -6
  796. package/dist/router.gen.d.ts.map +0 -1
  797. package/dist/router.gen.js +0 -6
  798. package/dist/router.gen.js.map +0 -1
  799. package/dist/router.js +0 -1304
  800. package/dist/router.js.map +0 -1
  801. package/dist/rsc/__tests__/helpers.test.d.ts +0 -2
  802. package/dist/rsc/__tests__/helpers.test.d.ts.map +0 -1
  803. package/dist/rsc/__tests__/helpers.test.js +0 -140
  804. package/dist/rsc/__tests__/helpers.test.js.map +0 -1
  805. package/dist/rsc/handler.d.ts +0 -45
  806. package/dist/rsc/handler.d.ts.map +0 -1
  807. package/dist/rsc/handler.js +0 -1172
  808. package/dist/rsc/handler.js.map +0 -1
  809. package/dist/rsc/helpers.d.ts +0 -16
  810. package/dist/rsc/helpers.d.ts.map +0 -1
  811. package/dist/rsc/helpers.js +0 -55
  812. package/dist/rsc/helpers.js.map +0 -1
  813. package/dist/rsc/index.d.ts +0 -22
  814. package/dist/rsc/index.d.ts.map +0 -1
  815. package/dist/rsc/index.js +0 -23
  816. package/dist/rsc/index.js.map +0 -1
  817. package/dist/rsc/nonce.d.ts +0 -9
  818. package/dist/rsc/nonce.d.ts.map +0 -1
  819. package/dist/rsc/nonce.js +0 -18
  820. package/dist/rsc/nonce.js.map +0 -1
  821. package/dist/rsc/types.d.ts +0 -206
  822. package/dist/rsc/types.d.ts.map +0 -1
  823. package/dist/rsc/types.js +0 -8
  824. package/dist/rsc/types.js.map +0 -1
  825. package/dist/search-params.d.ts +0 -103
  826. package/dist/search-params.d.ts.map +0 -1
  827. package/dist/search-params.js +0 -74
  828. package/dist/search-params.js.map +0 -1
  829. package/dist/segment-system.d.ts +0 -75
  830. package/dist/segment-system.d.ts.map +0 -1
  831. package/dist/segment-system.js +0 -336
  832. package/dist/segment-system.js.map +0 -1
  833. package/dist/server/context.d.ts +0 -245
  834. package/dist/server/context.d.ts.map +0 -1
  835. package/dist/server/context.js +0 -197
  836. package/dist/server/context.js.map +0 -1
  837. package/dist/server/fetchable-loader-store.d.ts +0 -18
  838. package/dist/server/fetchable-loader-store.d.ts.map +0 -1
  839. package/dist/server/fetchable-loader-store.js +0 -18
  840. package/dist/server/fetchable-loader-store.js.map +0 -1
  841. package/dist/server/handle-store.d.ts +0 -85
  842. package/dist/server/handle-store.d.ts.map +0 -1
  843. package/dist/server/handle-store.js +0 -142
  844. package/dist/server/handle-store.js.map +0 -1
  845. package/dist/server/loader-registry.d.ts +0 -55
  846. package/dist/server/loader-registry.d.ts.map +0 -1
  847. package/dist/server/loader-registry.js +0 -132
  848. package/dist/server/loader-registry.js.map +0 -1
  849. package/dist/server/request-context.d.ts +0 -226
  850. package/dist/server/request-context.d.ts.map +0 -1
  851. package/dist/server/request-context.js +0 -290
  852. package/dist/server/request-context.js.map +0 -1
  853. package/dist/server/root-layout.d.ts +0 -4
  854. package/dist/server/root-layout.d.ts.map +0 -1
  855. package/dist/server/root-layout.js +0 -5
  856. package/dist/server/root-layout.js.map +0 -1
  857. package/dist/server.d.ts +0 -15
  858. package/dist/server.d.ts.map +0 -1
  859. package/dist/server.js +0 -20
  860. package/dist/server.js.map +0 -1
  861. package/dist/ssr/__tests__/ssr-handler.test.d.ts +0 -2
  862. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +0 -1
  863. package/dist/ssr/__tests__/ssr-handler.test.js +0 -132
  864. package/dist/ssr/__tests__/ssr-handler.test.js.map +0 -1
  865. package/dist/ssr/index.d.ts +0 -98
  866. package/dist/ssr/index.d.ts.map +0 -1
  867. package/dist/ssr/index.js +0 -158
  868. package/dist/ssr/index.js.map +0 -1
  869. package/dist/static-handler.d.ts +0 -50
  870. package/dist/static-handler.d.ts.map +0 -1
  871. package/dist/static-handler.gen.d.ts +0 -5
  872. package/dist/static-handler.gen.d.ts.map +0 -1
  873. package/dist/static-handler.gen.js +0 -5
  874. package/dist/static-handler.gen.js.map +0 -1
  875. package/dist/static-handler.js +0 -29
  876. package/dist/static-handler.js.map +0 -1
  877. package/dist/theme/ThemeProvider.d.ts +0 -20
  878. package/dist/theme/ThemeProvider.d.ts.map +0 -1
  879. package/dist/theme/ThemeProvider.js +0 -240
  880. package/dist/theme/ThemeProvider.js.map +0 -1
  881. package/dist/theme/ThemeScript.d.ts +0 -48
  882. package/dist/theme/ThemeScript.d.ts.map +0 -1
  883. package/dist/theme/ThemeScript.js +0 -13
  884. package/dist/theme/ThemeScript.js.map +0 -1
  885. package/dist/theme/__tests__/theme.test.d.ts +0 -2
  886. package/dist/theme/__tests__/theme.test.d.ts.map +0 -1
  887. package/dist/theme/__tests__/theme.test.js +0 -103
  888. package/dist/theme/__tests__/theme.test.js.map +0 -1
  889. package/dist/theme/constants.d.ts +0 -29
  890. package/dist/theme/constants.d.ts.map +0 -1
  891. package/dist/theme/constants.js +0 -48
  892. package/dist/theme/constants.js.map +0 -1
  893. package/dist/theme/index.d.ts +0 -31
  894. package/dist/theme/index.d.ts.map +0 -1
  895. package/dist/theme/index.js +0 -36
  896. package/dist/theme/index.js.map +0 -1
  897. package/dist/theme/theme-context.d.ts +0 -40
  898. package/dist/theme/theme-context.d.ts.map +0 -1
  899. package/dist/theme/theme-context.js +0 -60
  900. package/dist/theme/theme-context.js.map +0 -1
  901. package/dist/theme/theme-script.d.ts +0 -27
  902. package/dist/theme/theme-script.d.ts.map +0 -1
  903. package/dist/theme/theme-script.js +0 -147
  904. package/dist/theme/theme-script.js.map +0 -1
  905. package/dist/theme/types.d.ts +0 -163
  906. package/dist/theme/types.d.ts.map +0 -1
  907. package/dist/theme/types.js +0 -11
  908. package/dist/theme/types.js.map +0 -1
  909. package/dist/theme/use-theme.d.ts +0 -12
  910. package/dist/theme/use-theme.d.ts.map +0 -1
  911. package/dist/theme/use-theme.js +0 -40
  912. package/dist/theme/use-theme.js.map +0 -1
  913. package/dist/types.d.ts +0 -1479
  914. package/dist/types.d.ts.map +0 -1
  915. package/dist/types.js +0 -10
  916. package/dist/types.js.map +0 -1
  917. package/dist/urls.d.ts +0 -441
  918. package/dist/urls.d.ts.map +0 -1
  919. package/dist/urls.gen.d.ts +0 -8
  920. package/dist/urls.gen.d.ts.map +0 -1
  921. package/dist/urls.gen.js +0 -8
  922. package/dist/urls.gen.js.map +0 -1
  923. package/dist/urls.js +0 -443
  924. package/dist/urls.js.map +0 -1
  925. package/dist/use-loader.d.ts +0 -127
  926. package/dist/use-loader.d.ts.map +0 -1
  927. package/dist/use-loader.js +0 -237
  928. package/dist/use-loader.js.map +0 -1
  929. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +0 -2
  930. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +0 -1
  931. package/dist/vite/__tests__/ast-handler-extract.test.js +0 -294
  932. package/dist/vite/__tests__/ast-handler-extract.test.js.map +0 -1
  933. package/dist/vite/__tests__/expose-id-utils.test.d.ts +0 -2
  934. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +0 -1
  935. package/dist/vite/__tests__/expose-id-utils.test.js +0 -224
  936. package/dist/vite/__tests__/expose-id-utils.test.js.map +0 -1
  937. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +0 -2
  938. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +0 -1
  939. package/dist/vite/__tests__/expose-internal-ids.test.js +0 -647
  940. package/dist/vite/__tests__/expose-internal-ids.test.js.map +0 -1
  941. package/dist/vite/__tests__/expose-router-id.test.d.ts +0 -2
  942. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +0 -1
  943. package/dist/vite/__tests__/expose-router-id.test.js +0 -39
  944. package/dist/vite/__tests__/expose-router-id.test.js.map +0 -1
  945. package/dist/vite/ast-handler-extract.d.ts +0 -49
  946. package/dist/vite/ast-handler-extract.d.ts.map +0 -1
  947. package/dist/vite/ast-handler-extract.js +0 -249
  948. package/dist/vite/ast-handler-extract.js.map +0 -1
  949. package/dist/vite/expose-action-id.d.ts +0 -19
  950. package/dist/vite/expose-action-id.d.ts.map +0 -1
  951. package/dist/vite/expose-action-id.js +0 -250
  952. package/dist/vite/expose-action-id.js.map +0 -1
  953. package/dist/vite/expose-id-utils.d.ts +0 -69
  954. package/dist/vite/expose-id-utils.d.ts.map +0 -1
  955. package/dist/vite/expose-id-utils.js +0 -289
  956. package/dist/vite/expose-id-utils.js.map +0 -1
  957. package/dist/vite/expose-internal-ids.d.ts +0 -22
  958. package/dist/vite/expose-internal-ids.d.ts.map +0 -1
  959. package/dist/vite/expose-internal-ids.js +0 -886
  960. package/dist/vite/expose-internal-ids.js.map +0 -1
  961. package/dist/vite/index.d.ts +0 -149
  962. package/dist/vite/index.d.ts.map +0 -1
  963. package/dist/vite/index.js.map +0 -1
  964. package/dist/vite/index.named-routes.gen.ts +0 -103
  965. package/dist/vite/package-resolution.d.ts +0 -43
  966. package/dist/vite/package-resolution.d.ts.map +0 -1
  967. package/dist/vite/package-resolution.js +0 -112
  968. package/dist/vite/package-resolution.js.map +0 -1
  969. package/dist/vite/virtual-entries.d.ts +0 -25
  970. package/dist/vite/virtual-entries.d.ts.map +0 -1
  971. package/dist/vite/virtual-entries.js +0 -110
  972. package/dist/vite/virtual-entries.js.map +0 -1
@@ -18,6 +18,9 @@ function hashId(filePath, exportName) {
18
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
26
  return crypto.createHash("sha256").update(input).digest("hex").slice(0, 8);
@@ -292,7 +295,7 @@ function exposeActionId() {
292
295
  }
293
296
  if (!rscPluginApi) {
294
297
  throw new Error(
295
- "[rsc-router] Could not find @vitejs/plugin-rsc. @rangojs/router requires the Vite RSC plugin.\nThe RSC plugin should be included automatically. If you disabled it with\nrango({ rsc: false }), add rsc() before rango() in your config."
298
+ "[rsc-router] Could not find @vitejs/plugin-rsc. @rangojs/router requires the Vite RSC plugin, which is included automatically by rango()."
296
299
  );
297
300
  }
298
301
  if (!isBuild) return;
@@ -910,9 +913,7 @@ function generateWholeFileStubs(cfg, bindings, code, filePath, isBuild) {
910
913
  });
911
914
  return { code: stubs.join("\n") + "\n", map: null };
912
915
  }
913
- function generateExprStubs(cfg, bindings, code, filePath, sourceId, isBuild) {
914
- if (bindings.length === 0) return null;
915
- const s = new MagicString2(code);
916
+ function stubHandlerExprs(cfg, bindings, s, filePath, isBuild) {
916
917
  let hasChanges = false;
917
918
  for (const binding of bindings) {
918
919
  const exportName = binding.exportNames[0];
@@ -924,15 +925,7 @@ function generateExprStubs(cfg, bindings, code, filePath, sourceId, isBuild) {
924
925
  );
925
926
  hasChanges = true;
926
927
  }
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
- };
928
+ return hasChanges;
936
929
  }
937
930
  function transformHandlerIds(cfg, bindings, s, filePath, isBuild) {
938
931
  let hasChanges = false;
@@ -1269,15 +1262,6 @@ ${lazyImports.join(",\n")}
1269
1262
  isBuild
1270
1263
  );
1271
1264
  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
1265
  }
1282
1266
  if (hasPrerenderHandlerCode && isRscEnv && isBuild) {
1283
1267
  const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
@@ -1329,15 +1313,134 @@ ${lazyImports.join(",\n")}
1329
1313
  isBuild
1330
1314
  );
1331
1315
  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;
1316
+ }
1317
+ if (!isRscEnv && (hasPrerenderHandlerCode || hasStaticHandlerCode)) {
1318
+ const prerenderFnNames = hasPrerenderHandlerCode ? getFnNames(PRERENDER_CONFIG.fnName) : [];
1319
+ const staticFnNames = hasStaticHandlerCode ? getFnNames(STATIC_CONFIG.fnName) : [];
1320
+ const loaderFnNames = hasLoaderCode ? getFnNames("createLoader") : [];
1321
+ const handleFnNames = hasHandleCode ? getFnNames("createHandle") : [];
1322
+ const lsFnNames = hasLocationStateCode ? getFnNames("createLocationState") : [];
1323
+ const allBindings = [];
1324
+ for (const fnNames of [
1325
+ prerenderFnNames,
1326
+ staticFnNames,
1327
+ loaderFnNames,
1328
+ handleFnNames,
1329
+ lsFnNames
1330
+ ]) {
1331
+ if (fnNames.length > 0) {
1332
+ allBindings.push(...getBindings(code, fnNames));
1333
+ }
1334
+ }
1335
+ let canStubWholeFile = allBindings.length > 0 && isExportOnlyFile(code, allBindings);
1336
+ if (canStubWholeFile && (handleFnNames.length > 0 || lsFnNames.length > 0)) {
1337
+ const exportedLocals = new Set(allBindings.map((b) => b.localName));
1338
+ const strippedBindings = [];
1339
+ const localDeclPattern = /(?:^|;|\n)\s*(?:const|let|var|function)\s+(\w+)/g;
1340
+ let declMatch;
1341
+ while ((declMatch = localDeclPattern.exec(code)) !== null) {
1342
+ const name = declMatch[1];
1343
+ if (!exportedLocals.has(name) && !/^_c\d*$/.test(name)) {
1344
+ strippedBindings.push(name);
1345
+ }
1346
+ }
1347
+ const importPattern = /import\s*\{([^}]*)\}\s*from\s*["'](?!@rangojs\/router)[^"']*["']/g;
1348
+ let importMatch;
1349
+ while ((importMatch = importPattern.exec(code)) !== null) {
1350
+ for (const spec of importMatch[1].split(",")) {
1351
+ const m = spec.trim().match(/^[A-Za-z_$][\w$]*(?:\s+as\s+([A-Za-z_$][\w$]*))?$/);
1352
+ if (m) strippedBindings.push(m[1] || m[0].trim().split(/\s/)[0]);
1353
+ }
1354
+ }
1355
+ const defaultImportPattern = /import\s+([A-Za-z_$][\w$]*)\s+from\s*["'](?!@rangojs\/router)[^"']*["']/g;
1356
+ while ((importMatch = defaultImportPattern.exec(code)) !== null) {
1357
+ strippedBindings.push(importMatch[1]);
1358
+ }
1359
+ const nsImportPattern = /import\s+\*\s+as\s+([A-Za-z_$][\w$]*)\s+from\s*["'](?!@rangojs\/router)[^"']*["']/g;
1360
+ while ((importMatch = nsImportPattern.exec(code)) !== null) {
1361
+ strippedBindings.push(importMatch[1]);
1362
+ }
1363
+ if (strippedBindings.length > 0) {
1364
+ const preservedBindings = allBindings.filter((b) => {
1365
+ const fc = code.slice(b.callExprStart, b.callOpenParenPos + 1);
1366
+ return handleFnNames.some((n) => fc.includes(n)) || lsFnNames.some((n) => fc.includes(n));
1367
+ });
1368
+ const strippedRe = new RegExp(
1369
+ `\\b(?:${strippedBindings.join("|")})\\b`
1370
+ );
1371
+ canStubWholeFile = !preservedBindings.some((b) => {
1372
+ const expr = code.slice(b.callExprStart, b.callCloseParenPos + 1);
1373
+ return strippedRe.test(expr);
1374
+ });
1375
+ }
1376
+ }
1377
+ if (canStubWholeFile) {
1378
+ const lines = [];
1379
+ const neededImports = [];
1380
+ if (handleFnNames.length > 0) neededImports.push("createHandle");
1381
+ if (lsFnNames.length > 0) neededImports.push("createLocationState");
1382
+ if (neededImports.length > 0) {
1383
+ lines.push(
1384
+ `import { ${neededImports.join(", ")} } from "@rangojs/router";`
1385
+ );
1386
+ }
1387
+ for (const binding of allBindings) {
1388
+ const fnCall = code.slice(
1389
+ binding.callExprStart,
1390
+ binding.callOpenParenPos + 1
1391
+ );
1392
+ const isHandle = handleFnNames.some((n) => fnCall.includes(n));
1393
+ const isLocationState = lsFnNames.some((n) => fnCall.includes(n));
1394
+ const primaryName = binding.exportNames[0];
1395
+ const stubId = makeStubId(filePath, primaryName, isBuild);
1396
+ if (isHandle || isLocationState) {
1397
+ const rawArgs = code.slice(binding.callOpenParenPos + 1, binding.callCloseParenPos).replace(/\b_c\d*\s*=\s*/g, "");
1398
+ const canonicalName = isHandle ? "createHandle" : "createLocationState";
1399
+ const activeFnNames = isHandle ? handleFnNames : lsFnNames;
1400
+ let rawCallee = code.slice(
1401
+ binding.callExprStart,
1402
+ binding.callOpenParenPos
1403
+ );
1404
+ for (const alias of activeFnNames) {
1405
+ if (alias !== canonicalName && rawCallee.startsWith(alias)) {
1406
+ rawCallee = canonicalName + rawCallee.slice(alias.length);
1407
+ break;
1408
+ }
1409
+ }
1410
+ if (isHandle) {
1411
+ const idParam = binding.argCount === 0 ? `undefined, "${stubId}"` : `, "${stubId}"`;
1412
+ lines.push(
1413
+ `export const ${primaryName} = ${rawCallee}(${rawArgs}${idParam});`
1414
+ );
1415
+ lines.push(`${primaryName}.$$id = "${stubId}";`);
1416
+ } else {
1417
+ lines.push(
1418
+ `export const ${primaryName} = ${rawCallee}(${rawArgs});`
1419
+ );
1420
+ lines.push(
1421
+ `${primaryName}.__rsc_ls_key = "__rsc_ls_${stubId}";`
1422
+ );
1423
+ }
1424
+ for (const name of binding.exportNames.slice(1)) {
1425
+ lines.push(`export const ${name} = ${primaryName};`);
1426
+ }
1427
+ } else {
1428
+ let brand = "loader";
1429
+ if (prerenderFnNames.some((n) => fnCall.includes(n))) {
1430
+ brand = PRERENDER_CONFIG.brand;
1431
+ } else if (staticFnNames.some((n) => fnCall.includes(n))) {
1432
+ brand = STATIC_CONFIG.brand;
1433
+ }
1434
+ lines.push(
1435
+ `export const ${primaryName} = { __brand: "${brand}", $$id: "${stubId}" };`
1436
+ );
1437
+ for (const name of binding.exportNames.slice(1)) {
1438
+ lines.push(`export const ${name} = ${primaryName};`);
1439
+ }
1440
+ }
1441
+ }
1442
+ return { code: lines.join("\n") + "\n", map: null };
1443
+ }
1341
1444
  }
1342
1445
  if (hasStaticHandlerCode && isRscEnv && isBuild) {
1343
1446
  const fnNames = getFnNames(STATIC_CONFIG.fnName);
@@ -1372,25 +1475,41 @@ ${lazyImports.join(",\n")}
1372
1475
  isBuild
1373
1476
  ) || changed;
1374
1477
  }
1375
- if (hasPrerenderHandlerCode && isRscEnv) {
1478
+ if (hasPrerenderHandlerCode) {
1376
1479
  const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
1377
- changed = transformHandlerIds(
1378
- PRERENDER_CONFIG,
1379
- getBindings(code, fnNames),
1380
- s,
1381
- filePath,
1382
- isBuild
1383
- ) || changed;
1480
+ const bindings = getBindings(code, fnNames);
1481
+ if (isRscEnv) {
1482
+ changed = transformHandlerIds(
1483
+ PRERENDER_CONFIG,
1484
+ bindings,
1485
+ s,
1486
+ filePath,
1487
+ isBuild
1488
+ ) || changed;
1489
+ } else {
1490
+ changed = stubHandlerExprs(
1491
+ PRERENDER_CONFIG,
1492
+ bindings,
1493
+ s,
1494
+ filePath,
1495
+ isBuild
1496
+ ) || changed;
1497
+ }
1384
1498
  }
1385
- if (hasStaticHandlerCode && isRscEnv) {
1499
+ if (hasStaticHandlerCode) {
1386
1500
  const fnNames = getFnNames(STATIC_CONFIG.fnName);
1387
- changed = transformHandlerIds(
1388
- STATIC_CONFIG,
1389
- getBindings(code, fnNames),
1390
- s,
1391
- filePath,
1392
- isBuild
1393
- ) || changed;
1501
+ const bindings = getBindings(code, fnNames);
1502
+ if (isRscEnv) {
1503
+ changed = transformHandlerIds(
1504
+ STATIC_CONFIG,
1505
+ bindings,
1506
+ s,
1507
+ filePath,
1508
+ isBuild
1509
+ ) || changed;
1510
+ } else {
1511
+ changed = stubHandlerExprs(STATIC_CONFIG, bindings, s, filePath, isBuild) || changed;
1512
+ }
1394
1513
  }
1395
1514
  if (!changed) return;
1396
1515
  return {
@@ -1740,12 +1859,13 @@ function getVirtualVersionContent(version) {
1740
1859
 
1741
1860
  // src/vite/utils/package-resolution.ts
1742
1861
  import { existsSync } from "node:fs";
1862
+ import { createRequire } from "node:module";
1743
1863
  import { resolve } from "node:path";
1744
1864
 
1745
1865
  // package.json
1746
1866
  var package_default = {
1747
1867
  name: "@rangojs/router",
1748
- version: "0.0.0-experimental.f2337aef",
1868
+ version: "0.0.0-experimental.f2d1a2f1",
1749
1869
  description: "Django-inspired RSC router with composable URL patterns",
1750
1870
  keywords: [
1751
1871
  "react",
@@ -1878,22 +1998,24 @@ var package_default = {
1878
1998
  tag: "experimental"
1879
1999
  },
1880
2000
  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",
2001
+ 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
2002
  prepublishOnly: "pnpm build",
1883
- typecheck: "tsc --noEmit",
2003
+ typecheck: "tsc --noEmit && tsc -p tsconfig.strict-check.json --noEmit",
1884
2004
  test: "playwright test",
1885
2005
  "test:ui": "playwright test --ui",
1886
2006
  "test:unit": "vitest run",
1887
2007
  "test:unit:watch": "vitest"
1888
2008
  },
1889
2009
  dependencies: {
1890
- "@vitejs/plugin-rsc": "^0.5.14",
2010
+ "@vitejs/plugin-rsc": "^0.5.23",
2011
+ debug: "^4.4.1",
1891
2012
  "magic-string": "^0.30.17",
1892
2013
  picomatch: "^4.0.3",
1893
2014
  "rsc-html-stream": "^0.0.7"
1894
2015
  },
1895
2016
  devDependencies: {
1896
2017
  "@playwright/test": "^1.49.1",
2018
+ "@types/debug": "^4.1.12",
1897
2019
  "@types/node": "^24.10.1",
1898
2020
  "@types/react": "catalog:",
1899
2021
  "@types/react-dom": "catalog:",
@@ -1907,7 +2029,7 @@ var package_default = {
1907
2029
  },
1908
2030
  peerDependencies: {
1909
2031
  "@cloudflare/vite-plugin": "^1.25.0",
1910
- "@vitejs/plugin-rsc": "^0.5.14",
2032
+ "@vitejs/plugin-rsc": "^0.5.23",
1911
2033
  react: "^18.0.0 || ^19.0.0",
1912
2034
  vite: "^7.3.0"
1913
2035
  },
@@ -1922,6 +2044,7 @@ var package_default = {
1922
2044
  };
1923
2045
 
1924
2046
  // src/vite/utils/package-resolution.ts
2047
+ var require2 = createRequire(import.meta.url);
1925
2048
  var VIRTUAL_PACKAGE_NAME = "@rangojs/router";
1926
2049
  function getPublishedPackageName() {
1927
2050
  return package_default.name;
@@ -1962,6 +2085,20 @@ function getPackageAliases() {
1962
2085
  }
1963
2086
  return aliases;
1964
2087
  }
2088
+ function getVendorAliases() {
2089
+ const specs = [
2090
+ "@vitejs/plugin-rsc/vendor/react-server-dom/client.edge",
2091
+ "@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
2092
+ ];
2093
+ const aliases = {};
2094
+ for (const spec of specs) {
2095
+ try {
2096
+ aliases[spec] = require2.resolve(spec);
2097
+ } catch {
2098
+ }
2099
+ }
2100
+ return aliases;
2101
+ }
1965
2102
 
1966
2103
  // src/build/route-types/param-extraction.ts
1967
2104
  function extractParamsFromPattern(pattern) {
@@ -2095,31 +2232,7 @@ declare global {
2095
2232
  }
2096
2233
 
2097
2234
  // src/build/route-types/scan-filter.ts
2098
- import { join, relative } from "node:path";
2099
2235
  import picomatch from "picomatch";
2100
- var DEFAULT_EXCLUDE_PATTERNS = [
2101
- "**/__tests__/**",
2102
- "**/__mocks__/**",
2103
- "**/dist/**",
2104
- "**/coverage/**",
2105
- "**/*.test.{ts,tsx,js,jsx}",
2106
- "**/*.spec.{ts,tsx,js,jsx}"
2107
- ];
2108
- function createScanFilter(root, opts) {
2109
- const { include, exclude } = opts;
2110
- const hasInclude = include && include.length > 0;
2111
- const hasCustomExclude = exclude !== void 0;
2112
- if (!hasInclude && !hasCustomExclude) return void 0;
2113
- const effectiveExclude = exclude ?? DEFAULT_EXCLUDE_PATTERNS;
2114
- const includeMatcher = hasInclude ? picomatch(include) : null;
2115
- const excludeMatcher = effectiveExclude.length > 0 ? picomatch(effectiveExclude) : null;
2116
- return (absolutePath) => {
2117
- const rel = relative(root, absolutePath);
2118
- if (excludeMatcher && excludeMatcher(rel)) return false;
2119
- if (includeMatcher) return includeMatcher(rel);
2120
- return true;
2121
- };
2122
- }
2123
2236
 
2124
2237
  // src/build/route-types/per-module-writer.ts
2125
2238
  import ts4 from "typescript";
@@ -2341,7 +2454,7 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
2341
2454
  }
2342
2455
  return routeMap;
2343
2456
  }
2344
- function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut) {
2457
+ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut, inlineBlock) {
2345
2458
  visited = visited ?? /* @__PURE__ */ new Set();
2346
2459
  const realPath = resolve2(filePath);
2347
2460
  const key = variableName ? `${realPath}:${variableName}` : realPath;
@@ -2357,7 +2470,9 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
2357
2470
  return { routes: {}, searchSchemas: {} };
2358
2471
  }
2359
2472
  let block;
2360
- if (variableName) {
2473
+ if (inlineBlock) {
2474
+ block = inlineBlock;
2475
+ } else if (variableName) {
2361
2476
  const extracted = extractUrlsBlockForVariable(source, variableName);
2362
2477
  if (!extracted) return { routes: {}, searchSchemas: {} };
2363
2478
  block = extracted;
@@ -2386,7 +2501,7 @@ import {
2386
2501
  readdirSync
2387
2502
  } from "node:fs";
2388
2503
  import {
2389
- join as join2,
2504
+ join,
2390
2505
  dirname as dirname2,
2391
2506
  resolve as resolve3,
2392
2507
  sep,
@@ -2406,7 +2521,7 @@ function countPublicRouteEntries(source) {
2406
2521
  }
2407
2522
  var ROUTER_CALL_PATTERN = /\bcreateRouter\s*[<(]/;
2408
2523
  function isRoutableSourceFile(name) {
2409
- return (name.endsWith(".ts") || name.endsWith(".tsx") || name.endsWith(".js") || name.endsWith(".jsx")) && !name.includes(".gen.");
2524
+ return (name.endsWith(".ts") || name.endsWith(".tsx") || name.endsWith(".js") || name.endsWith(".jsx")) && !name.includes(".gen.") && !name.includes(".test.") && !name.includes(".spec.");
2410
2525
  }
2411
2526
  function findRouterFilesRecursive(dir, filter, results) {
2412
2527
  let entries;
@@ -2421,9 +2536,10 @@ function findRouterFilesRecursive(dir, filter, results) {
2421
2536
  const childDirs = [];
2422
2537
  const routerFilesInDir = [];
2423
2538
  for (const entry of entries) {
2424
- const fullPath = join2(dir, entry.name);
2539
+ const fullPath = join(dir, entry.name);
2425
2540
  if (entry.isDirectory()) {
2426
- if (entry.name === "node_modules" || entry.name.startsWith(".")) continue;
2541
+ if (entry.name === "node_modules" || entry.name === "dist" || entry.name === "coverage" || entry.name === "__tests__" || entry.name === "__mocks__" || entry.name.startsWith("."))
2542
+ continue;
2427
2543
  childDirs.push(fullPath);
2428
2544
  continue;
2429
2545
  }
@@ -2475,7 +2591,7 @@ Router root: ${conflict.ancestor}
2475
2591
  Nested router: ${conflict.nested}
2476
2592
  Move the nested router into a sibling directory or configure it as a separate app root.`;
2477
2593
  }
2478
- function extractUrlsVariableFromRouter(code) {
2594
+ function extractUrlsFromRouter(code) {
2479
2595
  const sourceFile = ts5.createSourceFile(
2480
2596
  "router.tsx",
2481
2597
  code,
@@ -2489,24 +2605,70 @@ function extractUrlsVariableFromRouter(code) {
2489
2605
  const callee = node.expression;
2490
2606
  return ts5.isIdentifier(callee) && callee.text === "createRouter";
2491
2607
  }
2608
+ function isInlineBuilder(node) {
2609
+ return ts5.isArrowFunction(node) || ts5.isFunctionExpression(node);
2610
+ }
2611
+ function isRoutesOnCreateRouter(node) {
2612
+ if (!ts5.isPropertyAccessExpression(node.expression) || node.expression.name.text !== "routes")
2613
+ return false;
2614
+ let inner = node.expression.expression;
2615
+ while (ts5.isCallExpression(inner) && ts5.isPropertyAccessExpression(inner.expression)) {
2616
+ inner = inner.expression.expression;
2617
+ }
2618
+ return isCreateRouterCall(inner);
2619
+ }
2492
2620
  function visit(node) {
2493
2621
  if (result) return;
2494
- if (ts5.isCallExpression(node) && ts5.isPropertyAccessExpression(node.expression) && node.expression.name.text === "routes" && node.arguments.length >= 1 && ts5.isIdentifier(node.arguments[0])) {
2495
- let inner = node.expression.expression;
2496
- while (ts5.isCallExpression(inner) && ts5.isPropertyAccessExpression(inner.expression)) {
2497
- inner = inner.expression.expression;
2498
- }
2499
- if (isCreateRouterCall(inner)) {
2500
- result = node.arguments[0].text;
2501
- return;
2622
+ if (ts5.isCallExpression(node) && node.arguments.length >= 1 && isRoutesOnCreateRouter(node)) {
2623
+ const arg = node.arguments[0];
2624
+ if (ts5.isIdentifier(arg)) {
2625
+ result = { kind: "variable", name: arg.text };
2626
+ } else if (isInlineBuilder(arg)) {
2627
+ result = { kind: "inline", block: arg.getText(sourceFile) };
2502
2628
  }
2629
+ return;
2503
2630
  }
2504
2631
  if (isCreateRouterCall(node)) {
2505
2632
  const callExpr = node;
2506
- for (const arg of callExpr.arguments) {
2633
+ for (const callArg of callExpr.arguments) {
2634
+ if (ts5.isObjectLiteralExpression(callArg)) {
2635
+ for (const prop of callArg.properties) {
2636
+ if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "urls") {
2637
+ if (ts5.isIdentifier(prop.initializer)) {
2638
+ result = { kind: "variable", name: prop.initializer.text };
2639
+ } else if (isInlineBuilder(prop.initializer)) {
2640
+ result = {
2641
+ kind: "inline",
2642
+ block: prop.initializer.getText(sourceFile)
2643
+ };
2644
+ }
2645
+ return;
2646
+ }
2647
+ }
2648
+ }
2649
+ }
2650
+ }
2651
+ ts5.forEachChild(node, visit);
2652
+ }
2653
+ visit(sourceFile);
2654
+ return result;
2655
+ }
2656
+ function extractBasenameFromRouter(code) {
2657
+ const sourceFile = ts5.createSourceFile(
2658
+ "router.tsx",
2659
+ code,
2660
+ ts5.ScriptTarget.Latest,
2661
+ true,
2662
+ ts5.ScriptKind.TSX
2663
+ );
2664
+ let result;
2665
+ function visit(node) {
2666
+ if (result !== void 0) return;
2667
+ if (ts5.isCallExpression(node) && ts5.isIdentifier(node.expression) && node.expression.text === "createRouter") {
2668
+ for (const arg of node.arguments) {
2507
2669
  if (ts5.isObjectLiteralExpression(arg)) {
2508
2670
  for (const prop of arg.properties) {
2509
- if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "urls" && ts5.isIdentifier(prop.initializer)) {
2671
+ if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "basename" && ts5.isStringLiteral(prop.initializer)) {
2510
2672
  result = prop.initializer.text;
2511
2673
  return;
2512
2674
  }
@@ -2519,6 +2681,19 @@ function extractUrlsVariableFromRouter(code) {
2519
2681
  visit(sourceFile);
2520
2682
  return result;
2521
2683
  }
2684
+ function applyBasenameToRoutes(result, basename3) {
2685
+ const prefixed = {};
2686
+ for (const [name, pattern] of Object.entries(result.routes)) {
2687
+ if (pattern === "/") {
2688
+ prefixed[name] = basename3;
2689
+ } else if (basename3.endsWith("/") && pattern.startsWith("/")) {
2690
+ prefixed[name] = basename3 + pattern.slice(1);
2691
+ } else {
2692
+ prefixed[name] = basename3 + pattern;
2693
+ }
2694
+ }
2695
+ return { routes: prefixed, searchSchemas: result.searchSchemas };
2696
+ }
2522
2697
  function buildCombinedRouteMapForRouterFile(routerFilePath) {
2523
2698
  let routerSource;
2524
2699
  try {
@@ -2526,19 +2701,40 @@ function buildCombinedRouteMapForRouterFile(routerFilePath) {
2526
2701
  } catch {
2527
2702
  return { routes: {}, searchSchemas: {} };
2528
2703
  }
2529
- const urlsVarName = extractUrlsVariableFromRouter(routerSource);
2530
- if (!urlsVarName) {
2704
+ const extraction = extractUrlsFromRouter(routerSource);
2705
+ if (!extraction) {
2531
2706
  return { routes: {}, searchSchemas: {} };
2532
2707
  }
2533
- const imported = resolveImportedVariable(routerSource, urlsVarName);
2534
- if (imported) {
2535
- const targetFile = resolveImportPath(imported.specifier, routerFilePath);
2536
- if (!targetFile) {
2537
- return { routes: {}, searchSchemas: {} };
2708
+ const rawBasename = extractBasenameFromRouter(routerSource);
2709
+ const basename3 = rawBasename ? ("/" + rawBasename.replace(/^\/+|\/+$/g, "")).replace(/^\/$/, "") : void 0;
2710
+ let result;
2711
+ if (extraction.kind === "inline") {
2712
+ result = buildCombinedRouteMapWithSearch(
2713
+ routerFilePath,
2714
+ void 0,
2715
+ void 0,
2716
+ void 0,
2717
+ extraction.block
2718
+ );
2719
+ } else {
2720
+ const imported = resolveImportedVariable(routerSource, extraction.name);
2721
+ if (imported) {
2722
+ const targetFile = resolveImportPath(imported.specifier, routerFilePath);
2723
+ if (!targetFile) {
2724
+ return { routes: {}, searchSchemas: {} };
2725
+ }
2726
+ result = buildCombinedRouteMapWithSearch(
2727
+ targetFile,
2728
+ imported.exportedName
2729
+ );
2730
+ } else {
2731
+ result = buildCombinedRouteMapWithSearch(routerFilePath, extraction.name);
2538
2732
  }
2539
- return buildCombinedRouteMapWithSearch(targetFile, imported.exportedName);
2540
2733
  }
2541
- return buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
2734
+ if (basename3) {
2735
+ result = applyBasenameToRoutes(result, basename3);
2736
+ }
2737
+ return result;
2542
2738
  }
2543
2739
  function findRouterFiles(root, filter) {
2544
2740
  const result = [];
@@ -2547,7 +2743,7 @@ function findRouterFiles(root, filter) {
2547
2743
  }
2548
2744
  function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
2549
2745
  try {
2550
- const oldCombinedPath = join2(root, "src", "named-routes.gen.ts");
2746
+ const oldCombinedPath = join(root, "src", "named-routes.gen.ts");
2551
2747
  if (existsSync3(oldCombinedPath)) {
2552
2748
  unlinkSync(oldCombinedPath);
2553
2749
  console.log(
@@ -2563,31 +2759,21 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
2563
2759
  throw new Error(formatNestedRouterConflictError(nestedRouterConflict));
2564
2760
  }
2565
2761
  for (const routerFilePath of routerFilePaths) {
2566
- let routerSource;
2567
- try {
2568
- routerSource = readFileSync2(routerFilePath, "utf-8");
2569
- } catch {
2570
- continue;
2571
- }
2572
- const urlsVarName = extractUrlsVariableFromRouter(routerSource);
2573
- if (!urlsVarName) continue;
2574
- let result;
2575
- const imported = resolveImportedVariable(routerSource, urlsVarName);
2576
- if (imported) {
2577
- const targetFile = resolveImportPath(imported.specifier, routerFilePath);
2578
- if (!targetFile) continue;
2579
- result = buildCombinedRouteMapWithSearch(
2580
- targetFile,
2581
- imported.exportedName
2582
- );
2583
- } else {
2584
- result = buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
2762
+ const result = buildCombinedRouteMapForRouterFile(routerFilePath);
2763
+ if (Object.keys(result.routes).length === 0 && Object.keys(result.searchSchemas).length === 0) {
2764
+ let routerSource;
2765
+ try {
2766
+ routerSource = readFileSync2(routerFilePath, "utf-8");
2767
+ } catch {
2768
+ continue;
2769
+ }
2770
+ if (!extractUrlsFromRouter(routerSource)) continue;
2585
2771
  }
2586
2772
  const routerBasename = pathBasename(routerFilePath).replace(
2587
2773
  /\.(tsx?|jsx?)$/,
2588
2774
  ""
2589
2775
  );
2590
- const outPath = join2(
2776
+ const outPath = join(
2591
2777
  dirname2(routerFilePath),
2592
2778
  `${routerBasename}.named-routes.gen.ts`
2593
2779
  );
@@ -2717,8 +2903,9 @@ function createVersionPlugin() {
2717
2903
  let isDev = false;
2718
2904
  let server = null;
2719
2905
  const clientModuleSignatures = /* @__PURE__ */ new Map();
2906
+ let versionCounter = 0;
2720
2907
  const bumpVersion = (reason) => {
2721
- currentVersion = Date.now().toString(16);
2908
+ currentVersion = Date.now().toString(16) + String(++versionCounter);
2722
2909
  console.log(`[rsc-router] ${reason}, version updated: ${currentVersion}`);
2723
2910
  const rscEnv = server?.environments?.rsc;
2724
2911
  const versionMod = rscEnv?.moduleGraph?.getModuleById(
@@ -2774,6 +2961,9 @@ function createVersionPlugin() {
2774
2961
  if (!isDev) return;
2775
2962
  const isRscModule = this.environment?.name === "rsc";
2776
2963
  if (!isRscModule) return;
2964
+ if (ctx.modules.length === 1 && ctx.modules[0].id === "\0" + VIRTUAL_IDS.version) {
2965
+ return;
2966
+ }
2777
2967
  if (isCodeModule(ctx.file)) {
2778
2968
  const filePath = normalizeModuleId(ctx.file);
2779
2969
  const previousSignature = clientModuleSignatures.get(filePath);
@@ -2803,6 +2993,98 @@ function createVersionPlugin() {
2803
2993
 
2804
2994
  // src/vite/utils/shared-utils.ts
2805
2995
  import * as Vite from "vite";
2996
+
2997
+ // src/vite/plugins/performance-tracks.ts
2998
+ import { readFile } from "node:fs/promises";
2999
+
3000
+ // src/vite/debug.ts
3001
+ import debugFactory from "debug";
3002
+ if (process.env.INTERNAL_RANGO_DEBUG) {
3003
+ const existing = debugFactory.disable();
3004
+ debugFactory.enable(existing ? `${existing},rango:*` : "rango:*");
3005
+ }
3006
+ function createRangoDebugger(namespace) {
3007
+ const primary = debugFactory(namespace);
3008
+ const shadow = debugFactory(`vite:${namespace}`);
3009
+ if (primary.enabled) return primary;
3010
+ if (shadow.enabled) return shadow;
3011
+ return void 0;
3012
+ }
3013
+ async function timed(debug2, label, fn) {
3014
+ if (!debug2) return await fn();
3015
+ const start = performance.now();
3016
+ try {
3017
+ return await fn();
3018
+ } finally {
3019
+ debug2("%s (%sms)", label, (performance.now() - start).toFixed(1));
3020
+ }
3021
+ }
3022
+ function timedSync(debug2, label, fn) {
3023
+ if (!debug2) return fn();
3024
+ const start = performance.now();
3025
+ try {
3026
+ return fn();
3027
+ } finally {
3028
+ debug2("%s (%sms)", label, (performance.now() - start).toFixed(1));
3029
+ }
3030
+ }
3031
+
3032
+ // src/vite/plugins/performance-tracks.ts
3033
+ var debug = createRangoDebugger("rango:transform");
3034
+ var RSDW_PATCH_RE = /((?:var|let|const)\s+\w+\s*=\s*root\._children\s*,\s*(\w+)\s*=\s*root\._debugInfo\s*[;,])/;
3035
+ function buildPatchReplacement(match, debugInfoVar) {
3036
+ return `${match}
3037
+ if (${debugInfoVar} && 0 === ${debugInfoVar}.length && "fulfilled" === root.status) {
3038
+ var _resolved = "function" === typeof resolveLazy ? resolveLazy(root.value) : root.value;
3039
+ if ("object" === typeof _resolved && null !== _resolved && isArrayImpl(_resolved._debugInfo)) {
3040
+ ${debugInfoVar} = _resolved._debugInfo;
3041
+ }
3042
+ }`;
3043
+ }
3044
+ function patchRsdwClientDebugInfoRecovery(code) {
3045
+ const match = code.match(RSDW_PATCH_RE);
3046
+ if (!match) {
3047
+ return { code, debugInfoVar: null };
3048
+ }
3049
+ return {
3050
+ code: code.replace(match[1], buildPatchReplacement(match[1], match[2])),
3051
+ debugInfoVar: match[2]
3052
+ };
3053
+ }
3054
+ function performanceTracksOptimizeDepsPlugin() {
3055
+ return {
3056
+ name: "@rangojs/router:performance-tracks-optimize-deps",
3057
+ setup(build) {
3058
+ build.onLoad(
3059
+ {
3060
+ filter: /react-server-dom-webpack-client\.browser\.(development|production)\.js$/
3061
+ },
3062
+ async (args) => {
3063
+ const code = await readFile(args.path, "utf8");
3064
+ const patched = patchRsdwClientDebugInfoRecovery(code);
3065
+ return {
3066
+ contents: patched.code,
3067
+ loader: "js"
3068
+ };
3069
+ }
3070
+ );
3071
+ }
3072
+ };
3073
+ }
3074
+ function performanceTracksPlugin() {
3075
+ return {
3076
+ name: "@rangojs/router:performance-tracks",
3077
+ transform(code, id) {
3078
+ if (!id.includes("react-server-dom") || !id.includes("client")) return;
3079
+ const patched = patchRsdwClientDebugInfoRecovery(code);
3080
+ if (!patched.debugInfoVar) return;
3081
+ debug?.("patched RSDW client (var: %s)", patched.debugInfoVar);
3082
+ return patched.code;
3083
+ }
3084
+ };
3085
+ }
3086
+
3087
+ // src/vite/utils/shared-utils.ts
2806
3088
  var versionEsbuildPlugin = {
2807
3089
  name: "@rangojs/router-version",
2808
3090
  setup(build) {
@@ -2820,7 +3102,7 @@ var versionEsbuildPlugin = {
2820
3102
  }
2821
3103
  };
2822
3104
  var sharedEsbuildOptions = {
2823
- plugins: [versionEsbuildPlugin]
3105
+ plugins: [versionEsbuildPlugin, performanceTracksOptimizeDepsPlugin()]
2824
3106
  };
2825
3107
  function createVirtualEntriesPlugin(entries, routerPathRef) {
2826
3108
  const virtualModules = {};
@@ -2903,11 +3185,11 @@ ${dim} \u2571${reset} ${bold}\u2554\u2550\u2557${reset}${dim} * \u2
2903
3185
  ${dim} ${reset}${bold}\u2551 \u2551${reset} ${bold}\u2554\u2550\u2557${reset}${dim} * \u2727. \u2571${reset}
2904
3186
  ${dim} ${reset}${bold}\u2554\u2557 \u2551 \u2551 \u2551 \u2551${reset}${dim} * \u2571${reset}
2905
3187
  ${dim} ${reset}${bold}\u2551\u2551 \u2551 \u2551 \u2551 \u2551 \u2566\u2550\u2557\u2554\u2550\u2557\u2554\u2557\u2554\u2554\u2550\u2557\u2554\u2550\u2557${reset}${dim} \u2727 \u2726${reset}
2906
- ${dim} ${reset}${bold}\u2550\u2563\u2551 \u2551 \u2560\u2550\u255D \u2551 \u2560\u2566\u255D\u2560\u2550\u2563\u2551\u2551\u2551\u2551 \u2566\u2551 \u2551${reset}${dim} * \u2727${reset}
3188
+ ${dim} ${reset}${bold}\u2551\u2551 \u2551 \u2560\u2550\u255D \u2551 \u2560\u2566\u255D\u2560\u2550\u2563\u2551\u2551\u2551\u2551 \u2566\u2551 \u2551${reset}${dim} * \u2727${reset}
2907
3189
  ${dim} ${reset}${bold}\u2551\u255A\u2550\u255D \u2554\u2550\u2550\u2550\u255D \u2569\u255A\u2550\u2569 \u2569\u255D\u255A\u255D\u255A\u2550\u255D\u255A\u2550\u255D${reset}${dim} \u2726 . *${reset}
2908
3190
  ${dim} ${reset}${bold}\u255A\u2550\u2550\u2557 \u2551${reset}${dim} * RSC Wrangler \u2727 \u2726${reset}
2909
- ${dim} * ${reset}${bold}\u2551 \u2560\u2550${reset}${dim} * \u2727. \u2571${reset}
2910
- ${bold}\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550${reset}${dim} \u2726 *${reset}
3191
+ ${dim} * ${reset}${bold}\u2551 \u2551${reset}${dim} * \u2727. \u2571${reset}
3192
+ ${dim} ${reset}${bold}\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550${reset}${dim} \u2726 *${reset}
2911
3193
 
2912
3194
  v${version} \xB7 ${preset} \xB7 ${mode}
2913
3195
  `;
@@ -3026,6 +3308,8 @@ function createCjsToEsmPlugin() {
3026
3308
  import { createServer as createViteServer } from "vite";
3027
3309
  import { resolve as resolve8 } from "node:path";
3028
3310
  import { readFileSync as readFileSync6 } from "node:fs";
3311
+ import { createRequire as createRequire2, register } from "node:module";
3312
+ import { pathToFileURL } from "node:url";
3029
3313
 
3030
3314
  // src/vite/plugins/virtual-stub-plugin.ts
3031
3315
  function createVirtualStubPlugin() {
@@ -3051,8 +3335,115 @@ function createVirtualStubPlugin() {
3051
3335
  };
3052
3336
  }
3053
3337
 
3338
+ // src/vite/plugins/cloudflare-protocol-stub.ts
3339
+ var VIRTUAL_PREFIX = "virtual:rango-cloudflare-stub-";
3340
+ var NULL_PREFIX = "\0" + VIRTUAL_PREFIX;
3341
+ var CF_PREFIX = "cloudflare:";
3342
+ var BUILD_ENV_GLOBAL_KEY = "__rango_build_env__";
3343
+ var SOURCE_EXT_RE = /\.[mc]?[jt]sx?$/;
3344
+ var IMPORT_NODE_TYPES = /* @__PURE__ */ new Set([
3345
+ "ImportDeclaration",
3346
+ "ImportExpression",
3347
+ "ExportNamedDeclaration",
3348
+ "ExportAllDeclaration"
3349
+ ]);
3350
+ var STUBS = {
3351
+ "cloudflare:workers": `
3352
+ export class DurableObject { constructor(_ctx, _env) {} }
3353
+ export class WorkerEntrypoint { constructor(_ctx, _env) {} }
3354
+ export class WorkflowEntrypoint { constructor(_ctx, _env) {} }
3355
+ export class RpcTarget {}
3356
+ export const env = globalThis[${JSON.stringify(BUILD_ENV_GLOBAL_KEY)}] ?? {};
3357
+ export default {};
3358
+ `,
3359
+ "cloudflare:email": `
3360
+ export class EmailMessage { constructor(_from, _to, _raw) {} }
3361
+ export default {};
3362
+ `,
3363
+ "cloudflare:sockets": `
3364
+ export function connect() { return {}; }
3365
+ export default {};
3366
+ `,
3367
+ "cloudflare:workflows": `
3368
+ export class NonRetryableError extends Error {
3369
+ constructor(message, name) { super(message); this.name = name ?? "NonRetryableError"; }
3370
+ }
3371
+ export default {};
3372
+ `
3373
+ };
3374
+ var FALLBACK_STUB = `export default {};
3375
+ `;
3376
+ function createCloudflareProtocolStubPlugin() {
3377
+ return {
3378
+ name: "@rangojs/router:cloudflare-protocol-stub",
3379
+ transform(code, id) {
3380
+ const cleanId = id.split("?")[0] ?? id;
3381
+ if (!SOURCE_EXT_RE.test(cleanId)) return null;
3382
+ if (!code.includes(CF_PREFIX)) return null;
3383
+ let ast;
3384
+ try {
3385
+ ast = this.parse(code);
3386
+ } catch {
3387
+ return null;
3388
+ }
3389
+ const hits = [];
3390
+ walk(ast, (node) => {
3391
+ if (!IMPORT_NODE_TYPES.has(node.type)) return;
3392
+ const source = node.source;
3393
+ if (!source || source.type !== "Literal") return;
3394
+ if (typeof source.value !== "string") return;
3395
+ if (!source.value.startsWith(CF_PREFIX)) return;
3396
+ if (typeof source.start !== "number" || typeof source.end !== "number")
3397
+ return;
3398
+ hits.push({
3399
+ start: source.start,
3400
+ end: source.end,
3401
+ value: source.value
3402
+ });
3403
+ });
3404
+ if (hits.length === 0) return null;
3405
+ hits.sort((a, b) => b.start - a.start);
3406
+ let out = code;
3407
+ for (const hit of hits) {
3408
+ const submodule = hit.value.slice(CF_PREFIX.length);
3409
+ const quote = code[hit.start] === "'" ? "'" : '"';
3410
+ out = out.slice(0, hit.start) + quote + VIRTUAL_PREFIX + submodule + quote + out.slice(hit.end);
3411
+ }
3412
+ return { code: out, map: null };
3413
+ },
3414
+ resolveId(id) {
3415
+ if (id.startsWith(VIRTUAL_PREFIX)) {
3416
+ return "\0" + id;
3417
+ }
3418
+ return null;
3419
+ },
3420
+ load(id) {
3421
+ if (!id.startsWith(NULL_PREFIX)) return null;
3422
+ const submodule = id.slice(NULL_PREFIX.length);
3423
+ const specifier = CF_PREFIX + submodule;
3424
+ return STUBS[specifier] ?? FALLBACK_STUB;
3425
+ }
3426
+ };
3427
+ }
3428
+ function walk(node, visit) {
3429
+ if (!node || typeof node !== "object") return;
3430
+ if (Array.isArray(node)) {
3431
+ for (const child of node) walk(child, visit);
3432
+ return;
3433
+ }
3434
+ const n = node;
3435
+ if (typeof n.type !== "string") return;
3436
+ visit(n);
3437
+ for (const key in n) {
3438
+ if (key === "loc" || key === "start" || key === "end" || key === "range") {
3439
+ continue;
3440
+ }
3441
+ walk(n[key], visit);
3442
+ }
3443
+ }
3444
+
3054
3445
  // src/vite/plugins/client-ref-hashing.ts
3055
- import { relative as relative2 } from "node:path";
3446
+ import { relative } from "node:path";
3056
3447
  import { createHash as createHash2 } from "node:crypto";
3057
3448
  var CLIENT_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-package-proxy/";
3058
3449
  var CLIENT_IN_SERVER_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-in-server-package-proxy/";
@@ -3065,10 +3456,10 @@ function computeProductionHash(projectRoot, refKey) {
3065
3456
  const absPath = decodeURIComponent(
3066
3457
  refKey.slice(CLIENT_IN_SERVER_PKG_PROXY_PREFIX.length)
3067
3458
  );
3068
- toHash = relative2(projectRoot, absPath).replaceAll("\\", "/");
3459
+ toHash = relative(projectRoot, absPath).replaceAll("\\", "/");
3069
3460
  } else if (refKey.startsWith(FS_PREFIX)) {
3070
3461
  const absPath = refKey.slice(FS_PREFIX.length - 1);
3071
- toHash = relative2(projectRoot, absPath).replaceAll("\\", "/");
3462
+ toHash = relative(projectRoot, absPath).replaceAll("\\", "/");
3072
3463
  } else if (refKey.startsWith("/")) {
3073
3464
  toHash = refKey.slice(1);
3074
3465
  } else {
@@ -3209,8 +3600,8 @@ function createDiscoveryState(entryPath, opts) {
3209
3600
  perRouterManifestDataMap: /* @__PURE__ */ new Map(),
3210
3601
  prerenderManifestEntries: null,
3211
3602
  staticManifestEntries: null,
3212
- handlerChunkInfo: null,
3213
- staticHandlerChunkInfo: null,
3603
+ handlerChunkInfoMap: /* @__PURE__ */ new Map(),
3604
+ staticHandlerChunkInfoMap: /* @__PURE__ */ new Map(),
3214
3605
  rscEntryFileName: null,
3215
3606
  resolvedPrerenderModules: void 0,
3216
3607
  resolvedStaticModules: void 0,
@@ -3293,8 +3684,17 @@ function jsonParseExpression(value) {
3293
3684
  }
3294
3685
 
3295
3686
  // src/context-var.ts
3687
+ var NON_CACHEABLE_KEYS = /* @__PURE__ */ Symbol.for(
3688
+ "rango:non-cacheable-keys"
3689
+ );
3690
+ function getNonCacheableKeys(variables) {
3691
+ if (!variables[NON_CACHEABLE_KEYS]) {
3692
+ variables[NON_CACHEABLE_KEYS] = /* @__PURE__ */ new Set();
3693
+ }
3694
+ return variables[NON_CACHEABLE_KEYS];
3695
+ }
3296
3696
  var FORBIDDEN_KEYS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
3297
- function contextSet(variables, keyOrVar, value) {
3697
+ function contextSet(variables, keyOrVar, value, options) {
3298
3698
  if (typeof keyOrVar === "string") {
3299
3699
  if (FORBIDDEN_KEYS.has(keyOrVar)) {
3300
3700
  throw new Error(
@@ -3302,8 +3702,14 @@ function contextSet(variables, keyOrVar, value) {
3302
3702
  );
3303
3703
  }
3304
3704
  variables[keyOrVar] = value;
3705
+ if (options?.cache === false) {
3706
+ getNonCacheableKeys(variables).add(keyOrVar);
3707
+ }
3305
3708
  } else {
3306
3709
  variables[keyOrVar.key] = value;
3710
+ if (options?.cache === false) {
3711
+ getNonCacheableKeys(variables).add(keyOrVar.key);
3712
+ }
3307
3713
  }
3308
3714
  }
3309
3715
 
@@ -3326,13 +3732,31 @@ function encodePathParam(value) {
3326
3732
  }
3327
3733
  function substituteRouteParams(pattern, params, encode = encodeURIComponent) {
3328
3734
  let result = pattern;
3735
+ let hadOmittedOptional = false;
3329
3736
  for (const [key, value] of Object.entries(params)) {
3330
3737
  const escaped = escapeRegExp2(key);
3331
- result = result.replace(
3332
- new RegExp(`:${escaped}(\\([^)]*\\))?\\??`),
3333
- encode(value)
3334
- );
3335
- result = result.replace(`*${key}`, encode(value));
3738
+ if (value === "") {
3739
+ result = result.replace(
3740
+ new RegExp(`:${escaped}(\\([^)]*\\))?(?!\\?)`),
3741
+ ""
3742
+ );
3743
+ result = result.replace(`*${key}`, "");
3744
+ } else {
3745
+ result = result.replace(
3746
+ new RegExp(`:${escaped}(\\([^)]*\\))?\\??`),
3747
+ encode(value)
3748
+ );
3749
+ result = result.replace(`*${key}`, encode(value));
3750
+ }
3751
+ }
3752
+ result = result.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)(\([^)]*\))?\?/g, () => {
3753
+ hadOmittedOptional = true;
3754
+ return "";
3755
+ });
3756
+ if (hadOmittedOptional) {
3757
+ const hadTrailingSlash = pattern.length > 1 && pattern.endsWith("/");
3758
+ result = result.replace(/\/\/+/g, "/").replace(/\/+$/, "") || "/";
3759
+ if (hadTrailingSlash && !result.endsWith("/")) result += "/";
3336
3760
  }
3337
3761
  return result;
3338
3762
  }
@@ -3442,84 +3866,126 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3442
3866
  if (!params) return pattern;
3443
3867
  return substituteRouteParams(pattern, params);
3444
3868
  };
3869
+ let resolvedRoutes = 0;
3870
+ let totalDynamic = 0;
3445
3871
  for (const { manifest } of allManifests) {
3446
3872
  if (!manifest.prerenderRoutes) continue;
3447
- const defs = manifest._prerenderDefs || {};
3448
3873
  for (const routeName of manifest.prerenderRoutes) {
3449
3874
  const pattern = manifest.routeManifest[routeName];
3450
- if (!pattern) continue;
3451
- const def = defs[routeName];
3452
- const isPassthroughRoute = !!def?.options?.passthrough;
3453
- const hasDynamic = pattern.includes(":") || pattern.includes("*");
3454
- if (!hasDynamic) {
3455
- entries.push({
3456
- urlPath: pattern.replace(/\/$/, "") || "/",
3457
- routeName,
3458
- concurrency: 1,
3459
- isPassthroughRoute
3460
- });
3461
- } else {
3462
- if (def?.getParams) {
3463
- try {
3464
- const buildVars = {};
3465
- const getParamsCtx = {
3466
- build: true,
3467
- set: ((keyOrVar, value) => {
3468
- contextSet(buildVars, keyOrVar, value);
3469
- }),
3470
- reverse: getParamsReverse
3471
- };
3472
- const paramsList = await def.getParams(getParamsCtx);
3473
- const concurrency = def.options?.concurrency ?? 1;
3474
- const hasBuildVars = Object.keys(buildVars).length > 0 || Object.getOwnPropertySymbols(buildVars).length > 0;
3475
- for (const params of paramsList) {
3476
- let url = substituteRouteParams(
3477
- pattern,
3478
- params,
3479
- encodePathParam
3480
- );
3481
- if (url.includes("*")) {
3482
- const wildcardValue = params["*"] ?? params.splat;
3483
- if (wildcardValue !== void 0) {
3484
- url = url.replace(/\*[^/]*$/, encodePathParam(wildcardValue));
3875
+ if (pattern && (pattern.includes(":") || pattern.includes("*"))) {
3876
+ totalDynamic++;
3877
+ }
3878
+ }
3879
+ }
3880
+ const paramsStart = performance.now();
3881
+ const progressInterval = totalDynamic > 0 ? setInterval(() => {
3882
+ const elapsed = ((performance.now() - paramsStart) / 1e3).toFixed(1);
3883
+ console.log(
3884
+ `[rsc-router] Resolving prerender params... ${resolvedRoutes}/${totalDynamic} routes (${elapsed}s)`
3885
+ );
3886
+ }, 5e3) : void 0;
3887
+ try {
3888
+ for (const { manifest } of allManifests) {
3889
+ if (!manifest.prerenderRoutes) continue;
3890
+ const defs = manifest._prerenderDefs || {};
3891
+ const passthroughSet = new Set(manifest.passthroughRoutes || []);
3892
+ for (const routeName of manifest.prerenderRoutes) {
3893
+ const pattern = manifest.routeManifest[routeName];
3894
+ if (!pattern) continue;
3895
+ const def = defs[routeName];
3896
+ const isPassthroughRoute = passthroughSet.has(routeName);
3897
+ const hasDynamic = pattern.includes(":") || pattern.includes("*");
3898
+ if (!hasDynamic) {
3899
+ entries.push({
3900
+ urlPath: pattern.replace(/\/$/, "") || "/",
3901
+ routeName,
3902
+ concurrency: 1,
3903
+ isPassthroughRoute
3904
+ });
3905
+ } else {
3906
+ if (def?.getParams) {
3907
+ try {
3908
+ const buildVars = {};
3909
+ const buildEnv = state.resolvedBuildEnv;
3910
+ const getParamsCtx = {
3911
+ build: true,
3912
+ dev: !state.isBuildMode,
3913
+ set: ((keyOrVar, value) => {
3914
+ contextSet(buildVars, keyOrVar, value);
3915
+ }),
3916
+ reverse: getParamsReverse,
3917
+ get env() {
3918
+ if (buildEnv !== void 0) return buildEnv;
3919
+ throw new Error(
3920
+ "[rsc-router] ctx.env is not available during build-time getParams(). Configure buildEnv in your rango() plugin options to enable build-time env access."
3921
+ );
3485
3922
  }
3923
+ };
3924
+ const paramsList = await def.getParams(getParamsCtx);
3925
+ const concurrency = def.options?.concurrency ?? 1;
3926
+ const hasBuildVars = Object.keys(buildVars).length > 0 || Object.getOwnPropertySymbols(buildVars).length > 0;
3927
+ for (const params of paramsList) {
3928
+ let url = substituteRouteParams(
3929
+ pattern,
3930
+ params,
3931
+ encodePathParam
3932
+ );
3933
+ if (url.includes("*")) {
3934
+ const wildcardValue = params["*"] ?? params.splat;
3935
+ if (wildcardValue !== void 0) {
3936
+ url = url.replace(
3937
+ /\*[^/]*$/,
3938
+ encodePathParam(wildcardValue)
3939
+ );
3940
+ }
3941
+ }
3942
+ entries.push({
3943
+ urlPath: url.replace(/\/$/, "") || "/",
3944
+ routeName,
3945
+ concurrency,
3946
+ ...hasBuildVars ? { buildVars } : {},
3947
+ isPassthroughRoute
3948
+ });
3486
3949
  }
3487
- entries.push({
3488
- urlPath: url.replace(/\/$/, "") || "/",
3489
- routeName,
3490
- concurrency,
3491
- ...hasBuildVars ? { buildVars } : {},
3492
- isPassthroughRoute
3493
- });
3494
- }
3495
- } catch (err) {
3496
- if (err.name === "Skip") {
3497
- console.log(
3498
- `[rsc-router] SKIP route "${routeName}" - ${err.message}`
3499
- );
3500
- notifyOnError(
3501
- registry,
3502
- err,
3503
- "prerender",
3504
- routeName,
3505
- void 0,
3506
- true
3950
+ resolvedRoutes++;
3951
+ } catch (err) {
3952
+ resolvedRoutes++;
3953
+ if (err.name === "Skip") {
3954
+ console.log(
3955
+ `[rsc-router] SKIP route "${routeName}" - ${err.message}`
3956
+ );
3957
+ notifyOnError(
3958
+ registry,
3959
+ err,
3960
+ "prerender",
3961
+ routeName,
3962
+ void 0,
3963
+ true
3964
+ );
3965
+ continue;
3966
+ }
3967
+ console.error(
3968
+ `[rsc-router] Failed to get params for prerender route "${routeName}": ${err.message}`
3507
3969
  );
3508
- continue;
3970
+ notifyOnError(registry, err, "prerender", routeName);
3971
+ throw err;
3509
3972
  }
3510
- console.error(
3511
- `[rsc-router] Failed to get params for prerender route "${routeName}": ${err.message}`
3973
+ } else {
3974
+ console.warn(
3975
+ `[rsc-router] Dynamic prerender route "${routeName}" has no getParams(), skipping`
3512
3976
  );
3513
- notifyOnError(registry, err, "prerender", routeName);
3514
- throw err;
3515
3977
  }
3516
- } else {
3517
- console.warn(
3518
- `[rsc-router] Dynamic prerender route "${routeName}" has no getParams(), skipping`
3519
- );
3520
3978
  }
3521
3979
  }
3522
3980
  }
3981
+ } finally {
3982
+ if (progressInterval) {
3983
+ clearInterval(progressInterval);
3984
+ const elapsed = ((performance.now() - paramsStart) / 1e3).toFixed(1);
3985
+ console.log(
3986
+ `[rsc-router] Resolved prerender params: ${resolvedRoutes}/${totalDynamic} routes (${elapsed}s)`
3987
+ );
3988
+ }
3523
3989
  }
3524
3990
  if (entries.length === 0) return;
3525
3991
  const maxConcurrency = Math.max(...entries.map((e) => e.concurrency));
@@ -3546,7 +4012,8 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
3546
4012
  entry.urlPath,
3547
4013
  {},
3548
4014
  entry.buildVars,
3549
- entry.isPassthroughRoute
4015
+ entry.isPassthroughRoute,
4016
+ state.resolvedBuildEnv
3550
4017
  );
3551
4018
  if (!result) continue;
3552
4019
  if (result.passthrough) {
@@ -3670,7 +4137,9 @@ async function renderStaticHandlers(state, rscEnv, registry) {
3670
4137
  const result = await routerInstance.renderStaticSegment(
3671
4138
  def.handler,
3672
4139
  def.$$id,
3673
- def.$$routePrefix
4140
+ def.$$routePrefix,
4141
+ state.resolvedBuildEnv,
4142
+ !state.isBuildMode
3674
4143
  );
3675
4144
  if (result) {
3676
4145
  const hasHandles = Object.keys(result.handles).length > 0;
@@ -3795,7 +4264,11 @@ async function discoverRouters(state, rscEnv) {
3795
4264
  if (!router.urlpatterns || !generateManifestFull) {
3796
4265
  continue;
3797
4266
  }
3798
- const manifest = generateManifestFull(router.urlpatterns, routerMountIndex);
4267
+ const manifest = generateManifestFull(
4268
+ router.urlpatterns,
4269
+ routerMountIndex,
4270
+ router.__basename ? { urlPrefix: router.__basename } : void 0
4271
+ );
3799
4272
  routerMountIndex++;
3800
4273
  allManifests.push({ id, manifest });
3801
4274
  const routeCount = Object.keys(manifest.routeManifest).length;
@@ -3937,7 +4410,7 @@ async function discoverRouters(state, rscEnv) {
3937
4410
  }
3938
4411
 
3939
4412
  // src/vite/discovery/route-types-writer.ts
3940
- import { dirname as dirname3, basename, join as join3, resolve as resolve6 } from "node:path";
4413
+ import { dirname as dirname3, basename, join as join2, resolve as resolve6 } from "node:path";
3941
4414
  import { readFileSync as readFileSync4, writeFileSync as writeFileSync3, existsSync as existsSync5, unlinkSync as unlinkSync2 } from "node:fs";
3942
4415
  function filterUserNamedRoutes(manifest) {
3943
4416
  const filtered = {};
@@ -3958,7 +4431,7 @@ function writeCombinedRouteTypesWithTracking(state, opts) {
3958
4431
  /\.(tsx?|jsx?)$/,
3959
4432
  ""
3960
4433
  );
3961
- const outPath = join3(routerDir, `${routerBasename}.named-routes.gen.ts`);
4434
+ const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
3962
4435
  try {
3963
4436
  preContent.set(outPath, readFileSync4(outPath, "utf-8"));
3964
4437
  } catch {
@@ -3971,7 +4444,7 @@ function writeCombinedRouteTypesWithTracking(state, opts) {
3971
4444
  /\.(tsx?|jsx?)$/,
3972
4445
  ""
3973
4446
  );
3974
- const outPath = join3(routerDir, `${routerBasename}.named-routes.gen.ts`);
4447
+ const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
3975
4448
  if (!existsSync5(outPath)) continue;
3976
4449
  try {
3977
4450
  const content = readFileSync4(outPath, "utf-8");
@@ -3988,7 +4461,7 @@ function writeRouteTypesFiles(state) {
3988
4461
  const entryDir = dirname3(
3989
4462
  resolve6(state.projectRoot, state.resolvedEntryPath)
3990
4463
  );
3991
- const oldCombinedPath = join3(entryDir, "named-routes.gen.ts");
4464
+ const oldCombinedPath = join2(entryDir, "named-routes.gen.ts");
3992
4465
  if (existsSync5(oldCombinedPath)) {
3993
4466
  unlinkSync2(oldCombinedPath);
3994
4467
  console.log(
@@ -4013,7 +4486,7 @@ Set an explicit \`id\` on createRouter() or check the call site.`
4013
4486
  }
4014
4487
  const routerDir = dirname3(sourceFile);
4015
4488
  const routerBasename = basename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
4016
- const outPath = join3(routerDir, `${routerBasename}.named-routes.gen.ts`);
4489
+ const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
4017
4490
  const userRoutes = filterUserNamedRoutes(routeManifest);
4018
4491
  let effectiveSearchSchemas = routeSearchSchemas;
4019
4492
  if ((!effectiveSearchSchemas || Object.keys(effectiveSearchSchemas).length === 0) && sourceFile) {
@@ -4078,7 +4551,7 @@ function supplementGenFilesWithRuntimeRoutes(state) {
4078
4551
  }
4079
4552
  const routerDir = dirname3(sourceFile);
4080
4553
  const routerBasename = basename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
4081
- const outPath = join3(routerDir, `${routerBasename}.named-routes.gen.ts`);
4554
+ const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
4082
4555
  const source = generateRouteTypesSource(
4083
4556
  mergedRoutes,
4084
4557
  Object.keys(mergedSearchSchemas).length > 0 ? mergedSearchSchemas : void 0
@@ -4092,7 +4565,7 @@ function supplementGenFilesWithRuntimeRoutes(state) {
4092
4565
  }
4093
4566
 
4094
4567
  // src/vite/discovery/virtual-module-codegen.ts
4095
- import { dirname as dirname4, basename as basename2, join as join4 } from "node:path";
4568
+ import { dirname as dirname4, basename as basename2, join as join3 } from "node:path";
4096
4569
  function generateRoutesManifestModule(state) {
4097
4570
  const hasManifest = state.mergedRouteManifest && Object.keys(state.mergedRouteManifest).length > 0;
4098
4571
  if (hasManifest) {
@@ -4107,7 +4580,7 @@ function generateRoutesManifestModule(state) {
4107
4580
  /\.(tsx?|jsx?)$/,
4108
4581
  ""
4109
4582
  );
4110
- const genPath = join4(
4583
+ const genPath = join3(
4111
4584
  routerDir,
4112
4585
  `${routerBasename}.named-routes.gen.js`
4113
4586
  ).replaceAll("\\", "/");
@@ -4204,7 +4677,7 @@ function generatePerRouterModule(state, routerId) {
4204
4677
  /\.(tsx?|jsx?)$/,
4205
4678
  ""
4206
4679
  );
4207
- const genPath = join4(
4680
+ const genPath = join3(
4208
4681
  routerDir,
4209
4682
  `${routerBasename}.named-routes.gen.js`
4210
4683
  ).replaceAll("\\", "/");
@@ -4244,48 +4717,45 @@ function postprocessBundle(state) {
4244
4717
  );
4245
4718
  const evictionTargets = [
4246
4719
  {
4247
- info: state.handlerChunkInfo,
4720
+ infos: state.handlerChunkInfoMap.values(),
4248
4721
  fnName: "Prerender",
4249
4722
  brand: "prerenderHandler",
4250
4723
  label: "handler code from RSC bundle"
4251
4724
  },
4252
4725
  {
4253
- info: state.staticHandlerChunkInfo,
4726
+ infos: state.staticHandlerChunkInfoMap.values(),
4254
4727
  fnName: "Static",
4255
4728
  brand: "staticHandler",
4256
4729
  label: "static handler code"
4257
4730
  }
4258
4731
  ];
4259
4732
  for (const target of evictionTargets) {
4260
- if (!target.info) continue;
4261
- const chunkPath = resolve7(
4262
- state.projectRoot,
4263
- "dist/rsc",
4264
- target.info.fileName
4265
- );
4266
- try {
4267
- const code = readFileSync5(chunkPath, "utf-8");
4268
- const result = evictHandlerCode(
4269
- code,
4270
- target.info.exports,
4271
- target.fnName,
4272
- target.brand
4273
- );
4274
- if (result) {
4275
- writeFileSync4(chunkPath, result.code);
4276
- const savedKB = (result.savedBytes / 1024).toFixed(1);
4277
- console.log(
4278
- `[rsc-router] Evicted ${target.label} (${savedKB} KB saved): ${target.info.fileName}`
4733
+ for (const info of target.infos) {
4734
+ const chunkPath = resolve7(state.projectRoot, "dist/rsc", info.fileName);
4735
+ try {
4736
+ const code = readFileSync5(chunkPath, "utf-8");
4737
+ const result = evictHandlerCode(
4738
+ code,
4739
+ info.exports,
4740
+ target.fnName,
4741
+ target.brand
4742
+ );
4743
+ if (result) {
4744
+ writeFileSync4(chunkPath, result.code);
4745
+ const savedKB = (result.savedBytes / 1024).toFixed(1);
4746
+ console.log(
4747
+ `[rsc-router] Evicted ${target.label} (${savedKB} KB saved): ${info.fileName}`
4748
+ );
4749
+ }
4750
+ } catch (replaceErr) {
4751
+ console.warn(
4752
+ `[rsc-router] Failed to evict ${target.label}: ${replaceErr.message}`
4279
4753
  );
4280
4754
  }
4281
- } catch (replaceErr) {
4282
- console.warn(
4283
- `[rsc-router] Failed to evict ${target.label}: ${replaceErr.message}`
4284
- );
4285
4755
  }
4286
4756
  }
4287
- state.handlerChunkInfo = null;
4288
- state.staticHandlerChunkInfo = null;
4757
+ state.handlerChunkInfoMap.clear();
4758
+ state.staticHandlerChunkInfoMap.clear();
4289
4759
  if (hasPrerenderData && existsSync6(rscEntryPath)) {
4290
4760
  const rscCode = readFileSync5(rscEntryPath, "utf-8");
4291
4761
  if (!rscCode.includes("__prerender-manifest.js")) {
@@ -4328,7 +4798,7 @@ function postprocessBundle(state) {
4328
4798
  }
4329
4799
  if (hasStaticData && existsSync6(rscEntryPath)) {
4330
4800
  const rscCode = readFileSync5(rscEntryPath, "utf-8");
4331
- if (!rscCode.includes("__STATIC_MANIFEST")) {
4801
+ if (!rscCode.includes("__static-manifest.js")) {
4332
4802
  try {
4333
4803
  const manifestEntries = [];
4334
4804
  let totalBytes = copyStagedBuildAssets(
@@ -4367,7 +4837,24 @@ function postprocessBundle(state) {
4367
4837
  }
4368
4838
 
4369
4839
  // src/vite/router-discovery.ts
4840
+ var debugDiscovery = createRangoDebugger("rango:discovery");
4841
+ var debugRoutes = createRangoDebugger("rango:routes");
4842
+ var loaderHookRegistered = false;
4843
+ function ensureCloudflareProtocolLoaderRegistered() {
4844
+ if (loaderHookRegistered) return;
4845
+ loaderHookRegistered = true;
4846
+ try {
4847
+ register(
4848
+ new URL("./plugins/cloudflare-protocol-loader-hook.mjs", import.meta.url)
4849
+ );
4850
+ } catch (err) {
4851
+ console.warn(
4852
+ `[rsc-router] Could not register Node ESM loader hook for cloudflare:* imports (${err?.message ?? err}). Falling back to Vite transform only.`
4853
+ );
4854
+ }
4855
+ }
4370
4856
  async function createTempRscServer(state, options = {}) {
4857
+ ensureCloudflareProtocolLoaderRegistered();
4371
4858
  const { default: rsc } = await import("@vitejs/plugin-rsc");
4372
4859
  return createViteServer({
4373
4860
  root: state.projectRoot,
@@ -4390,6 +4877,7 @@ async function createTempRscServer(state, options = {}) {
4390
4877
  ...options.forceBuild ? [hashClientRefs(state.projectRoot)] : [],
4391
4878
  createVersionPlugin(),
4392
4879
  createVirtualStubPlugin(),
4880
+ createCloudflareProtocolStubPlugin(),
4393
4881
  // Dev prerender must use dev-mode IDs (path-based) to match the workerd
4394
4882
  // runtime. forceBuild produces hashed IDs for production bundle consistency.
4395
4883
  exposeInternalIds(options.forceBuild ? { forceBuild: true } : void 0),
@@ -4397,8 +4885,69 @@ async function createTempRscServer(state, options = {}) {
4397
4885
  ]
4398
4886
  });
4399
4887
  }
4888
+ async function resolveBuildEnv(option, factoryCtx) {
4889
+ if (!option) return null;
4890
+ if (option === "auto") {
4891
+ if (factoryCtx.preset !== "cloudflare") {
4892
+ throw new Error(
4893
+ '[rsc-router] buildEnv: "auto" is only supported with preset: "cloudflare". Use a factory function or plain object for other presets.'
4894
+ );
4895
+ }
4896
+ try {
4897
+ const userRequire = createRequire2(
4898
+ resolve8(factoryCtx.root, "package.json")
4899
+ );
4900
+ const wranglerPath = userRequire.resolve("wrangler");
4901
+ const { getPlatformProxy } = await import(pathToFileURL(wranglerPath).href);
4902
+ const proxy = await getPlatformProxy();
4903
+ return {
4904
+ env: proxy.env,
4905
+ dispose: proxy.dispose
4906
+ };
4907
+ } catch (err) {
4908
+ throw new Error(
4909
+ `[rsc-router] buildEnv: "auto" requires wrangler to be installed.
4910
+ Install it with: pnpm add -D wrangler
4911
+ ${err.message}`
4912
+ );
4913
+ }
4914
+ }
4915
+ if (typeof option === "function") {
4916
+ return await option(factoryCtx);
4917
+ }
4918
+ return { env: option };
4919
+ }
4920
+ async function acquireBuildEnv(s, command, mode) {
4921
+ const option = s.opts?.buildEnv;
4922
+ if (!option) return false;
4923
+ const result = await resolveBuildEnv(option, {
4924
+ root: s.projectRoot,
4925
+ mode,
4926
+ command,
4927
+ preset: s.opts?.preset ?? "node"
4928
+ });
4929
+ if (!result) return false;
4930
+ s.resolvedBuildEnv = result.env;
4931
+ s.buildEnvDispose = result.dispose ?? null;
4932
+ globalThis[BUILD_ENV_GLOBAL_KEY] = result.env;
4933
+ return true;
4934
+ }
4935
+ async function releaseBuildEnv(s) {
4936
+ if (s.buildEnvDispose) {
4937
+ try {
4938
+ await s.buildEnvDispose();
4939
+ } catch (err) {
4940
+ console.warn(`[rsc-router] buildEnv dispose failed: ${err.message}`);
4941
+ }
4942
+ s.buildEnvDispose = null;
4943
+ }
4944
+ s.resolvedBuildEnv = void 0;
4945
+ delete globalThis[BUILD_ENV_GLOBAL_KEY];
4946
+ }
4400
4947
  function createRouterDiscoveryPlugin(entryPath, opts) {
4401
4948
  const s = createDiscoveryState(entryPath, opts);
4949
+ let viteCommand = "build";
4950
+ let viteMode = "production";
4402
4951
  return {
4403
4952
  name: "@rangojs/router:discovery",
4404
4953
  config() {
@@ -4407,31 +4956,13 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
4407
4956
  __RANGO_DEBUG__: JSON.stringify(!!process.env.INTERNAL_RANGO_DEBUG)
4408
4957
  }
4409
4958
  };
4410
- if (opts?.enableBuildPrerender) {
4411
- config.environments = {
4412
- rsc: {
4413
- build: {
4414
- rollupOptions: {
4415
- output: {
4416
- manualChunks(id) {
4417
- if (s.resolvedPrerenderModules?.has(id)) {
4418
- return "__prerender-handlers";
4419
- }
4420
- if (s.resolvedStaticModules?.has(id)) {
4421
- return "__static-handlers";
4422
- }
4423
- }
4424
- }
4425
- }
4426
- }
4427
- }
4428
- };
4429
- }
4430
4959
  return config;
4431
4960
  },
4432
4961
  configResolved(config) {
4433
4962
  s.projectRoot = config.root;
4434
4963
  s.isBuildMode = config.command === "build";
4964
+ viteCommand = config.command;
4965
+ viteMode = config.mode;
4435
4966
  s.userResolveAlias = config.resolve.alias;
4436
4967
  if (!s.resolvedEntryPath && opts?.routerPathRef?.path) {
4437
4968
  s.resolvedEntryPath = opts.routerPathRef.path;
@@ -4445,12 +4976,6 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
4445
4976
  s.resolvedEntryPath = entries[0];
4446
4977
  }
4447
4978
  }
4448
- if (opts?.include || opts?.exclude) {
4449
- s.scanFilter = createScanFilter(s.projectRoot, {
4450
- include: opts.include,
4451
- exclude: opts.exclude
4452
- });
4453
- }
4454
4979
  if (opts?.staticRouteTypesGeneration !== false) {
4455
4980
  s.cachedRouterFiles = findRouterFiles(s.projectRoot, s.scanFilter);
4456
4981
  writeCombinedRouteTypesWithTracking(s, { preserveIfLarger: true });
@@ -4482,6 +5007,8 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
4482
5007
  });
4483
5008
  prerenderTempServer = null;
4484
5009
  }
5010
+ releaseBuildEnv(s).catch(() => {
5011
+ });
4485
5012
  });
4486
5013
  async function getOrCreateTempServer() {
4487
5014
  if (prerenderNodeRegistry) {
@@ -4508,14 +5035,33 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
4508
5035
  return null;
4509
5036
  }
4510
5037
  const discover = async () => {
5038
+ const discoverStart = performance.now();
4511
5039
  const rscEnv = server.environments?.rsc;
4512
5040
  if (!rscEnv?.runner) {
5041
+ debugDiscovery?.("dev: no rsc runner (cloudflare path)");
4513
5042
  s.devServerOrigin = getDevServerOrigin();
4514
5043
  try {
4515
- const tempRscEnv = await getOrCreateTempServer();
5044
+ await timed(
5045
+ debugDiscovery,
5046
+ "acquireBuildEnv",
5047
+ () => acquireBuildEnv(s, viteCommand, viteMode)
5048
+ );
5049
+ const tempRscEnv = await timed(
5050
+ debugDiscovery,
5051
+ "getOrCreateTempServer",
5052
+ () => getOrCreateTempServer()
5053
+ );
4516
5054
  if (tempRscEnv) {
4517
- await discoverRouters(s, tempRscEnv);
4518
- writeRouteTypesFiles(s);
5055
+ await timed(
5056
+ debugDiscovery,
5057
+ "discoverRouters (cloudflare)",
5058
+ () => discoverRouters(s, tempRscEnv)
5059
+ );
5060
+ timedSync(
5061
+ debugDiscovery,
5062
+ "writeRouteTypesFiles",
5063
+ () => writeRouteTypesFiles(s)
5064
+ );
4519
5065
  }
4520
5066
  } catch (err) {
4521
5067
  console.warn(
@@ -4523,26 +5069,54 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
4523
5069
  ${err.stack}`
4524
5070
  );
4525
5071
  }
5072
+ debugDiscovery?.(
5073
+ "dev discovery done (%sms)",
5074
+ (performance.now() - discoverStart).toFixed(1)
5075
+ );
4526
5076
  resolveDiscovery();
4527
5077
  return;
4528
5078
  }
4529
5079
  try {
4530
- const serverMod = await rscEnv.runner.import(
4531
- "@rangojs/router/server"
5080
+ debugDiscovery?.("dev: node path start");
5081
+ await timed(
5082
+ debugDiscovery,
5083
+ "acquireBuildEnv",
5084
+ () => acquireBuildEnv(s, viteCommand, viteMode)
5085
+ );
5086
+ const serverMod = await timed(
5087
+ debugDiscovery,
5088
+ "import @rangojs/router/server",
5089
+ () => rscEnv.runner.import("@rangojs/router/server")
4532
5090
  );
4533
5091
  if (serverMod?.setManifestReadyPromise) {
4534
5092
  serverMod.setManifestReadyPromise(discoveryPromise);
4535
5093
  }
4536
- await discoverRouters(s, rscEnv);
5094
+ await timed(
5095
+ debugDiscovery,
5096
+ "discoverRouters",
5097
+ () => discoverRouters(s, rscEnv)
5098
+ );
4537
5099
  s.devServerOrigin = getDevServerOrigin();
4538
- writeRouteTypesFiles(s);
4539
- await propagateDiscoveryState(rscEnv);
5100
+ timedSync(
5101
+ debugDiscovery,
5102
+ "writeRouteTypesFiles",
5103
+ () => writeRouteTypesFiles(s)
5104
+ );
5105
+ await timed(
5106
+ debugDiscovery,
5107
+ "propagateDiscoveryState",
5108
+ () => propagateDiscoveryState(rscEnv)
5109
+ );
4540
5110
  } catch (err) {
4541
5111
  console.warn(
4542
5112
  `[rsc-router] Router discovery failed: ${err.message}
4543
5113
  ${err.stack}`
4544
5114
  );
4545
5115
  } finally {
5116
+ debugDiscovery?.(
5117
+ "dev discovery done (%sms)",
5118
+ (performance.now() - discoverStart).toFixed(1)
5119
+ );
4546
5120
  resolveDiscovery();
4547
5121
  }
4548
5122
  };
@@ -4591,7 +5165,26 @@ ${err.stack}`
4591
5165
  res.end("Missing pathname");
4592
5166
  return;
4593
5167
  }
4594
- let registry = mainRegistry;
5168
+ const rscEnv = server.environments?.rsc;
5169
+ let registry = null;
5170
+ if (rscEnv?.runner && s.resolvedEntryPath) {
5171
+ try {
5172
+ await rscEnv.runner.import(s.resolvedEntryPath);
5173
+ const serverMod = await rscEnv.runner.import(
5174
+ "@rangojs/router/server"
5175
+ );
5176
+ registry = serverMod.RouterRegistry ?? null;
5177
+ } catch (err) {
5178
+ console.warn(
5179
+ `[rsc-router] Dev prerender module refresh failed: ${err.message}`
5180
+ );
5181
+ res.statusCode = 500;
5182
+ res.end(`Prerender handler error: ${err.message}`);
5183
+ return;
5184
+ }
5185
+ } else {
5186
+ registry = mainRegistry;
5187
+ }
4595
5188
  if (!registry) {
4596
5189
  if (!prerenderNodeRegistry) {
4597
5190
  await getOrCreateTempServer();
@@ -4613,7 +5206,10 @@ ${err.stack}`
4613
5206
  pathname,
4614
5207
  {},
4615
5208
  void 0,
4616
- wantPassthrough
5209
+ wantPassthrough,
5210
+ s.resolvedBuildEnv,
5211
+ true
5212
+ // devMode: check getParams for passthrough routes
4617
5213
  );
4618
5214
  if (!result) continue;
4619
5215
  if (result.passthrough) continue;
@@ -4665,15 +5261,32 @@ ${err.stack}`
4665
5261
  const rscEnv = server.environments?.rsc;
4666
5262
  if (!rscEnv?.runner || runtimeRediscoveryInProgress) return;
4667
5263
  runtimeRediscoveryInProgress = true;
5264
+ const hmrStart = performance.now();
4668
5265
  try {
4669
- await discoverRouters(s, rscEnv);
4670
- writeRouteTypesFiles(s);
4671
- await propagateDiscoveryState(rscEnv);
5266
+ await timed(
5267
+ debugDiscovery,
5268
+ "hmr discoverRouters",
5269
+ () => discoverRouters(s, rscEnv)
5270
+ );
5271
+ timedSync(
5272
+ debugDiscovery,
5273
+ "hmr writeRouteTypesFiles",
5274
+ () => writeRouteTypesFiles(s)
5275
+ );
5276
+ await timed(
5277
+ debugDiscovery,
5278
+ "hmr propagateDiscoveryState",
5279
+ () => propagateDiscoveryState(rscEnv)
5280
+ );
4672
5281
  } catch (err) {
4673
5282
  console.warn(
4674
5283
  `[rsc-router] Runtime re-discovery failed: ${err.message}`
4675
5284
  );
4676
5285
  } finally {
5286
+ debugDiscovery?.(
5287
+ "hmr re-discovery done (%sms)",
5288
+ (performance.now() - hmrStart).toFixed(1)
5289
+ );
4677
5290
  runtimeRediscoveryInProgress = false;
4678
5291
  }
4679
5292
  };
@@ -4746,13 +5359,24 @@ ${err.stack}`
4746
5359
  async buildStart() {
4747
5360
  if (!s.isBuildMode) return;
4748
5361
  if (s.mergedRouteManifest !== null) return;
5362
+ const buildStartTime = performance.now();
5363
+ debugDiscovery?.("build: start");
4749
5364
  resetStagedBuildAssets(s.projectRoot);
4750
5365
  s.prerenderManifestEntries = null;
4751
5366
  s.staticManifestEntries = null;
5367
+ await timed(
5368
+ debugDiscovery,
5369
+ "build acquireBuildEnv",
5370
+ () => acquireBuildEnv(s, viteCommand, viteMode)
5371
+ );
4752
5372
  let tempServer = null;
4753
5373
  globalThis.__rscRouterDiscoveryActive = true;
4754
5374
  try {
4755
- tempServer = await createTempRscServer(s, { forceBuild: true });
5375
+ tempServer = await timed(
5376
+ debugDiscovery,
5377
+ "build createTempRscServer",
5378
+ () => createTempRscServer(s, { forceBuild: true })
5379
+ );
4756
5380
  const rscEnv = tempServer.environments?.rsc;
4757
5381
  if (!rscEnv?.runner) {
4758
5382
  console.warn(
@@ -4766,8 +5390,16 @@ ${err.stack}`
4766
5390
  if (tempIdsPlugin?.api?.staticHandlerModules) {
4767
5391
  s.resolvedStaticModules = tempIdsPlugin.api.staticHandlerModules;
4768
5392
  }
4769
- await discoverRouters(s, rscEnv);
4770
- writeRouteTypesFiles(s);
5393
+ await timed(
5394
+ debugDiscovery,
5395
+ "build discoverRouters",
5396
+ () => discoverRouters(s, rscEnv)
5397
+ );
5398
+ timedSync(
5399
+ debugDiscovery,
5400
+ "build writeRouteTypesFiles",
5401
+ () => writeRouteTypesFiles(s)
5402
+ );
4771
5403
  } catch (err) {
4772
5404
  const sourceFile = err.stack?.split("\n").find(
4773
5405
  (line) => line.includes(s.projectRoot) && !line.includes("node_modules")
@@ -4786,8 +5418,17 @@ ${details}`
4786
5418
  } finally {
4787
5419
  delete globalThis.__rscRouterDiscoveryActive;
4788
5420
  if (tempServer) {
4789
- await tempServer.close();
5421
+ await timed(
5422
+ debugDiscovery,
5423
+ "build tempServer.close",
5424
+ () => tempServer.close()
5425
+ );
4790
5426
  }
5427
+ await releaseBuildEnv(s);
5428
+ debugDiscovery?.(
5429
+ "build discovery done (%sms)",
5430
+ (performance.now() - buildStartTime).toFixed(1)
5431
+ );
4791
5432
  }
4792
5433
  },
4793
5434
  // Virtual module: provides the pre-generated route manifest as a JS module
@@ -4804,17 +5445,36 @@ ${details}`
4804
5445
  async load(id) {
4805
5446
  if (id === "\0" + VIRTUAL_ROUTES_MANIFEST_ID) {
4806
5447
  if (s.discoveryDone) {
4807
- await s.discoveryDone;
5448
+ await timed(
5449
+ debugRoutes,
5450
+ "await discoveryDone (manifest)",
5451
+ () => Promise.resolve(s.discoveryDone)
5452
+ );
4808
5453
  }
4809
- return generateRoutesManifestModule(s);
5454
+ const code = await timed(
5455
+ debugRoutes,
5456
+ "generateRoutesManifestModule",
5457
+ () => generateRoutesManifestModule(s)
5458
+ );
5459
+ debugRoutes?.("manifest module emitted (%d bytes)", code?.length ?? 0);
5460
+ return code;
4810
5461
  }
4811
5462
  const perRouterPrefix = "\0" + VIRTUAL_ROUTES_MANIFEST_ID + "/";
4812
5463
  if (id.startsWith(perRouterPrefix)) {
4813
5464
  if (s.discoveryDone) {
4814
- await s.discoveryDone;
5465
+ await timed(
5466
+ debugRoutes,
5467
+ "await discoveryDone (per-router)",
5468
+ () => Promise.resolve(s.discoveryDone)
5469
+ );
4815
5470
  }
4816
5471
  const routerId = id.slice(perRouterPrefix.length);
4817
- return generatePerRouterModule(s, routerId);
5472
+ const code = await timed(
5473
+ debugRoutes,
5474
+ `generatePerRouterModule ${routerId}`,
5475
+ () => generatePerRouterModule(s, routerId)
5476
+ );
5477
+ return code;
4818
5478
  }
4819
5479
  return null;
4820
5480
  },
@@ -4830,20 +5490,30 @@ ${details}`
4830
5490
  }
4831
5491
  if (!s.resolvedPrerenderModules?.size && !s.resolvedStaticModules?.size)
4832
5492
  return;
5493
+ s.handlerChunkInfoMap.clear();
5494
+ s.staticHandlerChunkInfoMap.clear();
4833
5495
  for (const [fileName, chunk] of Object.entries(bundle)) {
4834
5496
  if (chunk.type !== "chunk") continue;
4835
- if (fileName.includes("__prerender-handlers") && s.resolvedPrerenderModules?.size) {
5497
+ if (s.resolvedPrerenderModules?.size) {
4836
5498
  const handlers = extractHandlerExportsFromChunk(
4837
5499
  chunk.code,
4838
5500
  s.resolvedPrerenderModules,
4839
5501
  "Prerender",
4840
- true
5502
+ false
4841
5503
  );
4842
5504
  if (handlers.length > 0) {
4843
- s.handlerChunkInfo = { fileName, exports: handlers };
5505
+ const existing = s.handlerChunkInfoMap.get(fileName);
5506
+ if (existing) {
5507
+ existing.exports.push(...handlers);
5508
+ } else {
5509
+ s.handlerChunkInfoMap.set(fileName, {
5510
+ fileName,
5511
+ exports: handlers
5512
+ });
5513
+ }
4844
5514
  }
4845
5515
  }
4846
- if (fileName.includes("__static-handlers") && s.resolvedStaticModules?.size) {
5516
+ if (s.resolvedStaticModules?.size) {
4847
5517
  const handlers = extractHandlerExportsFromChunk(
4848
5518
  chunk.code,
4849
5519
  s.resolvedStaticModules,
@@ -4851,7 +5521,15 @@ ${details}`
4851
5521
  false
4852
5522
  );
4853
5523
  if (handlers.length > 0) {
4854
- s.staticHandlerChunkInfo = { fileName, exports: handlers };
5524
+ const existing = s.staticHandlerChunkInfoMap.get(fileName);
5525
+ if (existing) {
5526
+ existing.exports.push(...handlers);
5527
+ } else {
5528
+ s.staticHandlerChunkInfoMap.set(fileName, {
5529
+ fileName,
5530
+ exports: handlers
5531
+ });
5532
+ }
4855
5533
  }
4856
5534
  }
4857
5535
  }
@@ -4872,14 +5550,30 @@ ${details}`
4872
5550
  }
4873
5551
 
4874
5552
  // src/vite/rango.ts
5553
+ var debugConfig = createRangoDebugger("rango:config");
4875
5554
  async function rango(options) {
5555
+ const rangoStart = performance.now();
4876
5556
  const resolvedOptions = options ?? { preset: "node" };
4877
5557
  const preset = resolvedOptions.preset ?? "node";
4878
5558
  const showBanner = resolvedOptions.banner ?? true;
5559
+ debugConfig?.("rango(%s) setup start", preset);
4879
5560
  const plugins = [];
4880
- const rangoAliases = getPackageAliases();
4881
- const excludeDeps = getExcludeDeps();
4882
- let rscEntryPath = null;
5561
+ const rangoAliases = { ...getPackageAliases(), ...getVendorAliases() };
5562
+ const excludeDeps = [
5563
+ ...getExcludeDeps(),
5564
+ // plugin-rsc itself injects these into the client env's
5565
+ // optimizeDeps.include, which overrides exclude for the dep's own
5566
+ // pre-bundle entry. What exclude still controls is how *other*
5567
+ // pre-bundled deps treat imports of these specs (external vs inlined)
5568
+ // via esbuildCjsExternalPlugin. The cjs-to-esm transform in
5569
+ // plugins/cjs-to-esm.ts is the fallback for strict-pnpm consumers,
5570
+ // where client.browser's bare include fails to resolve and Vite ends up
5571
+ // serving the raw CJS file at dev-serve time.
5572
+ "@vitejs/plugin-rsc/browser",
5573
+ "@vitejs/plugin-rsc/vendor/react-server-dom/client.browser"
5574
+ ];
5575
+ const pkg = getPublishedPackageName();
5576
+ const nested = (spec) => `${pkg} > ${spec}`;
4883
5577
  const routerRef = { path: void 0 };
4884
5578
  const prerenderEnabled = true;
4885
5579
  if (preset === "cloudflare") {
@@ -4917,7 +5611,7 @@ async function rango(options) {
4917
5611
  // Pre-bundle rsc-html-stream to prevent discovery during first request
4918
5612
  // Exclude rsc-router modules to ensure same Context instance
4919
5613
  optimizeDeps: {
4920
- include: ["rsc-html-stream/client"],
5614
+ include: [nested("rsc-html-stream/client")],
4921
5615
  exclude: excludeDeps,
4922
5616
  esbuildOptions: sharedEsbuildOptions
4923
5617
  }
@@ -4942,8 +5636,10 @@ async function rango(options) {
4942
5636
  "react-dom/static.edge",
4943
5637
  "react/jsx-runtime",
4944
5638
  "react/jsx-dev-runtime",
4945
- "rsc-html-stream/server",
4946
- "@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
5639
+ nested("rsc-html-stream/server"),
5640
+ nested(
5641
+ "@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
5642
+ )
4947
5643
  ],
4948
5644
  exclude: excludeDeps,
4949
5645
  esbuildOptions: sharedEsbuildOptions
@@ -4958,7 +5654,9 @@ async function rango(options) {
4958
5654
  "react",
4959
5655
  "react/jsx-runtime",
4960
5656
  "react/jsx-dev-runtime",
4961
- "@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
5657
+ nested(
5658
+ "@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
5659
+ )
4962
5660
  ],
4963
5661
  exclude: excludeDeps,
4964
5662
  esbuildOptions: sharedEsbuildOptions
@@ -4975,6 +5673,7 @@ async function rango(options) {
4975
5673
  }
4976
5674
  });
4977
5675
  plugins.push(createVirtualEntriesPlugin(finalEntries));
5676
+ plugins.push(performanceTracksPlugin());
4978
5677
  plugins.push(
4979
5678
  rsc({
4980
5679
  entries: finalEntries,
@@ -4983,153 +5682,126 @@ async function rango(options) {
4983
5682
  );
4984
5683
  plugins.push(clientRefDedup());
4985
5684
  } else {
4986
- const nodeOptions = resolvedOptions;
4987
- routerRef.path = nodeOptions.router;
4988
- if (!routerRef.path) {
4989
- plugins.push({
4990
- name: "@rangojs/router:auto-discover",
4991
- config(userConfig) {
4992
- if (routerRef.path) return;
4993
- const root = userConfig.root ? resolve9(process.cwd(), userConfig.root) : process.cwd();
4994
- const filter = createScanFilter(root, {
4995
- include: resolvedOptions.include,
4996
- exclude: resolvedOptions.exclude
4997
- });
4998
- const candidates = findRouterFiles(root, filter);
4999
- if (candidates.length === 1) {
5000
- const abs = candidates[0];
5001
- routerRef.path = (abs.startsWith(root) ? "./" + abs.slice(root.length + 1) : abs).replaceAll("\\", "/");
5002
- } else if (candidates.length > 1) {
5003
- const list = candidates.map(
5004
- (f) => " - " + (f.startsWith(root) ? f.slice(root.length + 1) : f)
5005
- ).join("\n");
5006
- throw new Error(
5007
- `[rsc-router] Multiple routers found. Specify \`router\` to choose one:
5008
- ${list}`
5009
- );
5010
- }
5685
+ plugins.push({
5686
+ name: "@rangojs/router:auto-discover",
5687
+ config(userConfig) {
5688
+ if (routerRef.path) return;
5689
+ const root = userConfig.root ? resolve9(process.cwd(), userConfig.root) : process.cwd();
5690
+ const candidates = findRouterFiles(root);
5691
+ if (candidates.length === 1) {
5692
+ const abs = candidates[0];
5693
+ routerRef.path = (abs.startsWith(root) ? "./" + abs.slice(root.length + 1) : abs).replaceAll("\\", "/");
5694
+ } else if (candidates.length > 1) {
5695
+ const list = candidates.map(
5696
+ (f) => " - " + (f.startsWith(root) ? f.slice(root.length + 1) : f)
5697
+ ).join("\n");
5698
+ throw new Error(`[rsc-router] Multiple routers found:
5699
+ ${list}`);
5011
5700
  }
5012
- });
5013
- }
5014
- const rscOption = nodeOptions.rsc ?? true;
5015
- if (rscOption !== false) {
5016
- const { default: rsc } = await import("@vitejs/plugin-rsc");
5017
- const userEntries = typeof rscOption === "boolean" ? {} : rscOption.entries || {};
5018
- const finalEntries = {
5019
- client: userEntries.client ?? VIRTUAL_IDS.browser,
5020
- ssr: userEntries.ssr ?? VIRTUAL_IDS.ssr,
5021
- rsc: userEntries.rsc ?? VIRTUAL_IDS.rsc
5022
- };
5023
- rscEntryPath = userEntries.rsc ?? null;
5024
- let hasWarnedDuplicate = false;
5025
- plugins.push({
5026
- name: "@rangojs/router:rsc-integration",
5027
- enforce: "pre",
5028
- config() {
5029
- const useVirtualClient = finalEntries.client === VIRTUAL_IDS.browser;
5030
- const useVirtualSSR = finalEntries.ssr === VIRTUAL_IDS.ssr;
5031
- const useVirtualRSC = finalEntries.rsc === VIRTUAL_IDS.rsc;
5032
- return {
5033
- // Exclude rsc-router modules from optimization to prevent module duplication
5034
- // This ensures the same Context instance is used by both browser entry and RSC proxy modules
5035
- optimizeDeps: {
5036
- exclude: excludeDeps,
5037
- esbuildOptions: sharedEsbuildOptions
5038
- },
5039
- build: {
5040
- rollupOptions: { onwarn }
5041
- },
5042
- resolve: {
5043
- alias: rangoAliases
5044
- },
5045
- environments: {
5046
- client: {
5047
- build: {
5048
- rollupOptions: {
5049
- output: {
5050
- manualChunks: getManualChunks
5051
- }
5052
- }
5053
- },
5054
- // Always exclude rsc-router modules, conditionally add virtual entry
5055
- optimizeDeps: {
5056
- // Pre-bundle React and rsc-html-stream to prevent late discovery
5057
- // triggering ERR_OUTDATED_OPTIMIZED_DEP on cold starts
5058
- include: [
5059
- "react",
5060
- "react-dom",
5061
- "react/jsx-runtime",
5062
- "react/jsx-dev-runtime",
5063
- "rsc-html-stream/client"
5064
- ],
5065
- exclude: excludeDeps,
5066
- esbuildOptions: sharedEsbuildOptions,
5067
- ...useVirtualClient && {
5068
- // Tell Vite to scan the virtual entry for dependencies
5069
- entries: [VIRTUAL_IDS.browser]
5070
- }
5071
- }
5072
- },
5073
- ...useVirtualSSR && {
5074
- ssr: {
5075
- optimizeDeps: {
5076
- entries: [VIRTUAL_IDS.ssr],
5077
- // Pre-bundle all SSR deps to prevent late discovery triggering ERR_OUTDATED_OPTIMIZED_DEP
5078
- include: [
5079
- "react",
5080
- "react-dom",
5081
- "react-dom/server.edge",
5082
- "react-dom/static.edge",
5083
- "react/jsx-runtime",
5084
- "react/jsx-dev-runtime",
5085
- "@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
5086
- ],
5087
- exclude: excludeDeps,
5088
- esbuildOptions: sharedEsbuildOptions
5701
+ }
5702
+ });
5703
+ const finalEntries = {
5704
+ client: VIRTUAL_IDS.browser,
5705
+ ssr: VIRTUAL_IDS.ssr,
5706
+ rsc: VIRTUAL_IDS.rsc
5707
+ };
5708
+ const { default: rsc } = await import("@vitejs/plugin-rsc");
5709
+ let hasWarnedDuplicate = false;
5710
+ plugins.push({
5711
+ name: "@rangojs/router:rsc-integration",
5712
+ enforce: "pre",
5713
+ config() {
5714
+ return {
5715
+ optimizeDeps: {
5716
+ exclude: excludeDeps,
5717
+ esbuildOptions: sharedEsbuildOptions
5718
+ },
5719
+ build: {
5720
+ rollupOptions: { onwarn }
5721
+ },
5722
+ resolve: {
5723
+ alias: rangoAliases
5724
+ },
5725
+ environments: {
5726
+ client: {
5727
+ build: {
5728
+ rollupOptions: {
5729
+ output: {
5730
+ manualChunks: getManualChunks
5089
5731
  }
5090
5732
  }
5091
5733
  },
5092
- ...useVirtualRSC && {
5093
- rsc: {
5094
- optimizeDeps: {
5095
- entries: [VIRTUAL_IDS.rsc],
5096
- // Pre-bundle all RSC deps to prevent late discovery triggering ERR_OUTDATED_OPTIMIZED_DEP
5097
- include: [
5098
- "react",
5099
- "react/jsx-runtime",
5100
- "react/jsx-dev-runtime",
5101
- "@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
5102
- ],
5103
- esbuildOptions: sharedEsbuildOptions
5104
- }
5105
- }
5734
+ optimizeDeps: {
5735
+ include: [
5736
+ "react",
5737
+ "react-dom",
5738
+ "react/jsx-runtime",
5739
+ "react/jsx-dev-runtime",
5740
+ nested("rsc-html-stream/client")
5741
+ ],
5742
+ exclude: excludeDeps,
5743
+ esbuildOptions: sharedEsbuildOptions,
5744
+ entries: [VIRTUAL_IDS.browser]
5745
+ }
5746
+ },
5747
+ ssr: {
5748
+ optimizeDeps: {
5749
+ entries: [VIRTUAL_IDS.ssr],
5750
+ include: [
5751
+ "react",
5752
+ "react-dom",
5753
+ "react-dom/server.edge",
5754
+ "react-dom/static.edge",
5755
+ "react/jsx-runtime",
5756
+ "react/jsx-dev-runtime",
5757
+ nested(
5758
+ "@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
5759
+ )
5760
+ ],
5761
+ exclude: excludeDeps,
5762
+ esbuildOptions: sharedEsbuildOptions
5763
+ }
5764
+ },
5765
+ rsc: {
5766
+ optimizeDeps: {
5767
+ entries: [VIRTUAL_IDS.rsc],
5768
+ include: [
5769
+ "react",
5770
+ "react/jsx-runtime",
5771
+ "react/jsx-dev-runtime",
5772
+ nested(
5773
+ "@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
5774
+ )
5775
+ ],
5776
+ esbuildOptions: sharedEsbuildOptions
5106
5777
  }
5107
5778
  }
5108
- };
5109
- },
5110
- configResolved(config) {
5111
- if (showBanner) {
5112
- const mode = config.command === "serve" ? process.argv.includes("preview") ? "preview" : "dev" : "build";
5113
- printBanner(mode, "node", rangoVersion);
5114
- }
5115
- const rscMinimalCount = config.plugins.filter(
5116
- (p) => p.name === "rsc:minimal"
5117
- ).length;
5118
- if (rscMinimalCount > 1 && !hasWarnedDuplicate) {
5119
- hasWarnedDuplicate = true;
5120
- console.warn(
5121
- "[rsc-router] Duplicate @vitejs/plugin-rsc detected. Remove rsc() from your config or use rango({ rsc: false }) for manual configuration."
5122
- );
5123
5779
  }
5780
+ };
5781
+ },
5782
+ configResolved(config) {
5783
+ if (showBanner) {
5784
+ const mode = config.command === "serve" ? process.argv.includes("preview") ? "preview" : "dev" : "build";
5785
+ printBanner(mode, "node", rangoVersion);
5124
5786
  }
5125
- });
5126
- plugins.push(createVirtualEntriesPlugin(finalEntries, routerRef));
5127
- plugins.push(
5128
- rsc({
5129
- entries: finalEntries
5130
- })
5131
- );
5132
- }
5787
+ const rscMinimalCount = config.plugins.filter(
5788
+ (p) => p.name === "rsc:minimal"
5789
+ ).length;
5790
+ if (rscMinimalCount > 1 && !hasWarnedDuplicate) {
5791
+ hasWarnedDuplicate = true;
5792
+ console.warn(
5793
+ "[rsc-router] Duplicate @vitejs/plugin-rsc detected. Remove rsc() from your vite config \u2014 rango() includes it automatically."
5794
+ );
5795
+ }
5796
+ }
5797
+ });
5798
+ plugins.push(createVirtualEntriesPlugin(finalEntries, routerRef));
5799
+ plugins.push(performanceTracksPlugin());
5800
+ plugins.push(
5801
+ rsc({
5802
+ entries: finalEntries
5803
+ })
5804
+ );
5133
5805
  plugins.push(clientRefDedup());
5134
5806
  }
5135
5807
  plugins.push({
@@ -5157,20 +5829,24 @@ ${list}`
5157
5829
  plugins.push(createVersionPlugin());
5158
5830
  const discoveryEntryPath = preset !== "cloudflare" ? routerRef.path : void 0;
5159
5831
  const discoveryRouterRef = preset !== "cloudflare" ? routerRef : void 0;
5160
- const injectorEntryPath = rscEntryPath ?? (preset === "cloudflare" ? void 0 : null);
5161
- if (injectorEntryPath !== null) {
5162
- plugins.push(createVersionInjectorPlugin(injectorEntryPath));
5832
+ if (preset === "cloudflare") {
5833
+ plugins.push(createVersionInjectorPlugin(void 0));
5163
5834
  }
5164
5835
  plugins.push(createCjsToEsmPlugin());
5165
5836
  plugins.push(
5166
5837
  createRouterDiscoveryPlugin(discoveryEntryPath, {
5167
5838
  routerPathRef: discoveryRouterRef,
5168
5839
  enableBuildPrerender: prerenderEnabled,
5169
- staticRouteTypesGeneration: resolvedOptions.staticRouteTypesGeneration,
5170
- include: resolvedOptions.include,
5171
- exclude: resolvedOptions.exclude
5840
+ buildEnv: options?.buildEnv,
5841
+ preset
5172
5842
  })
5173
5843
  );
5844
+ debugConfig?.(
5845
+ "rango(%s) setup done: %d plugin(s) (%sms)",
5846
+ preset,
5847
+ plugins.length,
5848
+ (performance.now() - rangoStart).toFixed(1)
5849
+ );
5174
5850
  return plugins;
5175
5851
  }
5176
5852
 
@@ -5181,29 +5857,75 @@ function poke() {
5181
5857
  apply: "serve",
5182
5858
  configureServer(server) {
5183
5859
  const stdin = process.stdin;
5184
- const previousRawMode = stdin.isTTY ? stdin.isRaw : null;
5860
+ const debug2 = process.env.RANGO_POKE_DEBUG === "1";
5861
+ const triggerReload = (source) => {
5862
+ server.hot.send({ type: "full-reload", path: "*" });
5863
+ server.config.logger.info(` browser reload (${source})`, {
5864
+ timestamp: true
5865
+ });
5866
+ };
5867
+ const toBuffer = (chunk) => {
5868
+ return typeof chunk === "string" ? Buffer.from(chunk, "utf8") : chunk;
5869
+ };
5870
+ const formatChunk = (chunk) => {
5871
+ const data = toBuffer(chunk);
5872
+ const hex = Array.from(data).map((byte) => `0x${byte.toString(16).padStart(2, "0")}`).join(" ");
5873
+ const ascii = Array.from(data).map((byte) => {
5874
+ if (byte >= 32 && byte <= 126) return String.fromCharCode(byte);
5875
+ if (byte === 10) return "\\n";
5876
+ if (byte === 13) return "\\r";
5877
+ if (byte === 9) return "\\t";
5878
+ return ".";
5879
+ }).join("");
5880
+ return `len=${data.length} hex=[${hex}] ascii="${ascii}"`;
5881
+ };
5882
+ const readCtrlR = (chunk) => {
5883
+ const data = typeof chunk === "string" ? Buffer.from(chunk, "utf8") : chunk;
5884
+ return data.length === 1 && data[0] === 18;
5885
+ };
5886
+ const readSubmittedCommands = (chunk) => {
5887
+ const text = toBuffer(chunk).toString("utf8").replace(/\r\n/g, "\n").replace(/\r/g, "\n");
5888
+ if (!text.includes("\n")) return [];
5889
+ const lines = text.split("\n");
5890
+ lines.pop();
5891
+ return lines;
5892
+ };
5893
+ if (debug2) {
5894
+ server.config.logger.info(
5895
+ ` poke debug enabled (isTTY=${stdin.isTTY ? "yes" : "no"}, isRaw=${stdin.isTTY ? stdin.isRaw ? "yes" : "no" : "n/a"})`,
5896
+ { timestamp: true }
5897
+ );
5898
+ }
5185
5899
  if (stdin.isTTY) {
5186
- stdin.setRawMode(true);
5900
+ server.config.logger.info(
5901
+ " poke ready: press e + enter to reload browser (ctrl+r also works when available)",
5902
+ { timestamp: true }
5903
+ );
5187
5904
  }
5188
5905
  const onData = (data) => {
5189
- if (data.length !== 1) return;
5190
- if (data[0] === 3) {
5191
- process.emit("SIGINT", "SIGINT");
5192
- return;
5193
- }
5194
- if (data[0] === 18) {
5195
- server.hot.send({ type: "full-reload", path: "*" });
5196
- server.config.logger.info(" browser reload (ctrl+r)", {
5906
+ if (debug2) {
5907
+ server.config.logger.info(` poke stdin ${formatChunk(data)}`, {
5197
5908
  timestamp: true
5198
5909
  });
5199
5910
  }
5911
+ if (readCtrlR(data)) {
5912
+ triggerReload("ctrl+r");
5913
+ return;
5914
+ }
5915
+ for (const command of readSubmittedCommands(data)) {
5916
+ if (command === "e") {
5917
+ triggerReload("e+enter");
5918
+ return;
5919
+ }
5920
+ if (command === "\x1Br") {
5921
+ triggerReload("option+r+enter");
5922
+ return;
5923
+ }
5924
+ }
5200
5925
  };
5201
5926
  stdin.on("data", onData);
5202
5927
  server.httpServer?.on("close", () => {
5203
5928
  stdin.off("data", onData);
5204
- if (stdin.isTTY && previousRawMode !== null) {
5205
- stdin.setRawMode(previousRawMode);
5206
- }
5207
5929
  });
5208
5930
  }
5209
5931
  };