@rangojs/router 0.0.0-experimental.e16b7c00 → 0.0.0-experimental.e9c0b2f2

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 (1155) hide show
  1. package/AGENTS.md +8 -0
  2. package/README.md +64 -6
  3. package/dist/__internal.d.ts +83 -0
  4. package/dist/__internal.d.ts.map +1 -0
  5. package/dist/__internal.js +19 -0
  6. package/dist/__internal.js.map +1 -0
  7. package/dist/__mocks__/version.d.ts +7 -0
  8. package/dist/__mocks__/version.d.ts.map +1 -0
  9. package/dist/__mocks__/version.js +7 -0
  10. package/dist/__mocks__/version.js.map +1 -0
  11. package/dist/__tests__/client-href.test.d.ts +2 -0
  12. package/dist/__tests__/client-href.test.d.ts.map +1 -0
  13. package/dist/__tests__/client-href.test.js +74 -0
  14. package/dist/__tests__/client-href.test.js.map +1 -0
  15. package/dist/__tests__/component-utils.test.d.ts +2 -0
  16. package/dist/__tests__/component-utils.test.d.ts.map +1 -0
  17. package/dist/__tests__/component-utils.test.js +51 -0
  18. package/dist/__tests__/component-utils.test.js.map +1 -0
  19. package/dist/__tests__/event-controller.test.d.ts +2 -0
  20. package/dist/__tests__/event-controller.test.d.ts.map +1 -0
  21. package/dist/__tests__/event-controller.test.js +538 -0
  22. package/dist/__tests__/event-controller.test.js.map +1 -0
  23. package/dist/__tests__/helpers/route-tree.d.ts +118 -0
  24. package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
  25. package/dist/__tests__/helpers/route-tree.js +374 -0
  26. package/dist/__tests__/helpers/route-tree.js.map +1 -0
  27. package/dist/__tests__/match-result.test.d.ts +2 -0
  28. package/dist/__tests__/match-result.test.d.ts.map +1 -0
  29. package/dist/__tests__/match-result.test.js +154 -0
  30. package/dist/__tests__/match-result.test.js.map +1 -0
  31. package/dist/__tests__/navigation-store.test.d.ts +2 -0
  32. package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
  33. package/dist/__tests__/navigation-store.test.js +440 -0
  34. package/dist/__tests__/navigation-store.test.js.map +1 -0
  35. package/dist/__tests__/partial-update.test.d.ts +2 -0
  36. package/dist/__tests__/partial-update.test.d.ts.map +1 -0
  37. package/dist/__tests__/partial-update.test.js +1009 -0
  38. package/dist/__tests__/partial-update.test.js.map +1 -0
  39. package/dist/__tests__/reverse-types.test.d.ts +8 -0
  40. package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
  41. package/dist/__tests__/reverse-types.test.js +656 -0
  42. package/dist/__tests__/reverse-types.test.js.map +1 -0
  43. package/dist/__tests__/route-definition.test.d.ts +2 -0
  44. package/dist/__tests__/route-definition.test.d.ts.map +1 -0
  45. package/dist/__tests__/route-definition.test.js +55 -0
  46. package/dist/__tests__/route-definition.test.js.map +1 -0
  47. package/dist/__tests__/router-helpers.test.d.ts +2 -0
  48. package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
  49. package/dist/__tests__/router-helpers.test.js +377 -0
  50. package/dist/__tests__/router-helpers.test.js.map +1 -0
  51. package/dist/__tests__/router-integration-2.test.d.ts +2 -0
  52. package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
  53. package/dist/__tests__/router-integration-2.test.js +426 -0
  54. package/dist/__tests__/router-integration-2.test.js.map +1 -0
  55. package/dist/__tests__/router-integration.test.d.ts +2 -0
  56. package/dist/__tests__/router-integration.test.d.ts.map +1 -0
  57. package/dist/__tests__/router-integration.test.js +1051 -0
  58. package/dist/__tests__/router-integration.test.js.map +1 -0
  59. package/dist/__tests__/search-params.test.d.ts +5 -0
  60. package/dist/__tests__/search-params.test.d.ts.map +1 -0
  61. package/dist/__tests__/search-params.test.js +306 -0
  62. package/dist/__tests__/search-params.test.js.map +1 -0
  63. package/dist/__tests__/segment-system.test.d.ts +2 -0
  64. package/dist/__tests__/segment-system.test.d.ts.map +1 -0
  65. package/dist/__tests__/segment-system.test.js +627 -0
  66. package/dist/__tests__/segment-system.test.js.map +1 -0
  67. package/dist/__tests__/static-handler-types.test.d.ts +8 -0
  68. package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
  69. package/dist/__tests__/static-handler-types.test.js +63 -0
  70. package/dist/__tests__/static-handler-types.test.js.map +1 -0
  71. package/dist/__tests__/urls.test.d.ts +2 -0
  72. package/dist/__tests__/urls.test.d.ts.map +1 -0
  73. package/dist/__tests__/urls.test.js +421 -0
  74. package/dist/__tests__/urls.test.js.map +1 -0
  75. package/dist/__tests__/use-mount.test.d.ts +2 -0
  76. package/dist/__tests__/use-mount.test.d.ts.map +1 -0
  77. package/dist/__tests__/use-mount.test.js +35 -0
  78. package/dist/__tests__/use-mount.test.js.map +1 -0
  79. package/dist/bin/rango.d.ts +2 -0
  80. package/dist/bin/rango.d.ts.map +1 -0
  81. package/dist/bin/rango.js +195 -52
  82. package/dist/bin/rango.js.map +1 -0
  83. package/dist/browser/event-controller.d.ts +191 -0
  84. package/dist/browser/event-controller.d.ts.map +1 -0
  85. package/dist/browser/event-controller.js +559 -0
  86. package/dist/browser/event-controller.js.map +1 -0
  87. package/dist/browser/index.d.ts +2 -0
  88. package/dist/browser/index.d.ts.map +1 -0
  89. package/dist/browser/index.js +14 -0
  90. package/dist/browser/index.js.map +1 -0
  91. package/dist/browser/link-interceptor.d.ts +38 -0
  92. package/dist/browser/link-interceptor.d.ts.map +1 -0
  93. package/dist/browser/link-interceptor.js +99 -0
  94. package/dist/browser/link-interceptor.js.map +1 -0
  95. package/dist/browser/logging.d.ts +10 -0
  96. package/dist/browser/logging.d.ts.map +1 -0
  97. package/dist/browser/logging.js +29 -0
  98. package/dist/browser/logging.js.map +1 -0
  99. package/dist/browser/lru-cache.d.ts +17 -0
  100. package/dist/browser/lru-cache.d.ts.map +1 -0
  101. package/dist/browser/lru-cache.js +50 -0
  102. package/dist/browser/lru-cache.js.map +1 -0
  103. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  104. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  105. package/dist/browser/merge-segment-loaders.js +102 -0
  106. package/dist/browser/merge-segment-loaders.js.map +1 -0
  107. package/dist/browser/navigation-bridge.d.ts +102 -0
  108. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  109. package/dist/browser/navigation-bridge.js +708 -0
  110. package/dist/browser/navigation-bridge.js.map +1 -0
  111. package/dist/browser/navigation-client.d.ts +25 -0
  112. package/dist/browser/navigation-client.d.ts.map +1 -0
  113. package/dist/browser/navigation-client.js +157 -0
  114. package/dist/browser/navigation-client.js.map +1 -0
  115. package/dist/browser/navigation-store.d.ts +101 -0
  116. package/dist/browser/navigation-store.d.ts.map +1 -0
  117. package/dist/browser/navigation-store.js +625 -0
  118. package/dist/browser/navigation-store.js.map +1 -0
  119. package/dist/browser/partial-update.d.ts +75 -0
  120. package/dist/browser/partial-update.d.ts.map +1 -0
  121. package/dist/browser/partial-update.js +426 -0
  122. package/dist/browser/partial-update.js.map +1 -0
  123. package/dist/browser/react/Link.d.ts +86 -0
  124. package/dist/browser/react/Link.d.ts.map +1 -0
  125. package/dist/browser/react/Link.js +128 -0
  126. package/dist/browser/react/Link.js.map +1 -0
  127. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  128. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  129. package/dist/browser/react/NavigationProvider.js +216 -0
  130. package/dist/browser/react/NavigationProvider.js.map +1 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  132. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  133. package/dist/browser/react/ScrollRestoration.js +57 -0
  134. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  135. package/dist/browser/react/context.d.ts +46 -0
  136. package/dist/browser/react/context.d.ts.map +1 -0
  137. package/dist/browser/react/context.js +10 -0
  138. package/dist/browser/react/context.js.map +1 -0
  139. package/dist/browser/react/index.d.ts +11 -0
  140. package/dist/browser/react/index.d.ts.map +1 -0
  141. package/dist/browser/react/index.js +22 -0
  142. package/dist/browser/react/index.js.map +1 -0
  143. package/dist/browser/react/location-state-shared.d.ts +63 -0
  144. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  145. package/dist/browser/react/location-state-shared.js +81 -0
  146. package/dist/browser/react/location-state-shared.js.map +1 -0
  147. package/dist/browser/react/location-state.d.ts +23 -0
  148. package/dist/browser/react/location-state.d.ts.map +1 -0
  149. package/dist/browser/react/location-state.js +29 -0
  150. package/dist/browser/react/location-state.js.map +1 -0
  151. package/dist/browser/react/mount-context.d.ts +24 -0
  152. package/dist/browser/react/mount-context.d.ts.map +1 -0
  153. package/dist/browser/react/mount-context.js +24 -0
  154. package/dist/browser/react/mount-context.js.map +1 -0
  155. package/dist/browser/react/use-action.d.ts +64 -0
  156. package/dist/browser/react/use-action.d.ts.map +1 -0
  157. package/dist/browser/react/use-action.js +134 -0
  158. package/dist/browser/react/use-action.js.map +1 -0
  159. package/dist/browser/react/use-client-cache.d.ts +41 -0
  160. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  161. package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -28
  162. package/dist/browser/react/use-client-cache.js.map +1 -0
  163. package/dist/browser/react/use-handle.d.ts +31 -0
  164. package/dist/browser/react/use-handle.d.ts.map +1 -0
  165. package/dist/browser/react/use-handle.js +144 -0
  166. package/dist/browser/react/use-handle.js.map +1 -0
  167. package/dist/browser/react/use-href.d.ts +33 -0
  168. package/dist/browser/react/use-href.d.ts.map +1 -0
  169. package/dist/browser/react/use-href.js +39 -0
  170. package/dist/browser/react/use-href.js.map +1 -0
  171. package/dist/browser/react/use-link-status.d.ts +37 -0
  172. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  173. package/dist/browser/react/use-link-status.js +99 -0
  174. package/dist/browser/react/use-link-status.js.map +1 -0
  175. package/dist/browser/react/use-mount.d.ts +25 -0
  176. package/dist/browser/react/use-mount.d.ts.map +1 -0
  177. package/dist/browser/react/use-mount.js +30 -0
  178. package/dist/browser/react/use-mount.js.map +1 -0
  179. package/dist/browser/react/use-navigation.d.ts +27 -0
  180. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  181. package/dist/browser/react/use-navigation.js +87 -0
  182. package/dist/browser/react/use-navigation.js.map +1 -0
  183. package/dist/browser/react/use-segments.d.ts +38 -0
  184. package/dist/browser/react/use-segments.d.ts.map +1 -0
  185. package/dist/browser/react/use-segments.js +130 -0
  186. package/dist/browser/react/use-segments.js.map +1 -0
  187. package/dist/browser/request-controller.d.ts +26 -0
  188. package/dist/browser/request-controller.d.ts.map +1 -0
  189. package/dist/browser/request-controller.js +147 -0
  190. package/dist/browser/request-controller.js.map +1 -0
  191. package/dist/browser/rsc-router.d.ts +129 -0
  192. package/dist/browser/rsc-router.d.ts.map +1 -0
  193. package/dist/browser/rsc-router.js +195 -0
  194. package/dist/browser/rsc-router.js.map +1 -0
  195. package/dist/browser/scroll-restoration.d.ts +93 -0
  196. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  197. package/dist/browser/scroll-restoration.js +321 -0
  198. package/dist/browser/scroll-restoration.js.map +1 -0
  199. package/dist/browser/segment-structure-assert.d.ts +17 -0
  200. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  201. package/dist/browser/segment-structure-assert.js +59 -0
  202. package/dist/browser/segment-structure-assert.js.map +1 -0
  203. package/dist/browser/server-action-bridge.d.ts +26 -0
  204. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  205. package/dist/browser/server-action-bridge.js +668 -0
  206. package/dist/browser/server-action-bridge.js.map +1 -0
  207. package/dist/browser/shallow.d.ts +12 -0
  208. package/dist/browser/shallow.d.ts.map +1 -0
  209. package/dist/browser/shallow.js +34 -0
  210. package/dist/browser/shallow.js.map +1 -0
  211. package/dist/browser/types.d.ts +369 -0
  212. package/dist/browser/types.d.ts.map +1 -0
  213. package/dist/browser/types.js +2 -0
  214. package/dist/browser/types.js.map +1 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  216. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  217. package/dist/build/__tests__/generate-cli.test.js +237 -0
  218. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  220. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  221. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  222. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  224. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  225. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  226. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  228. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  230. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  231. package/dist/build/generate-manifest.d.ts +81 -0
  232. package/dist/build/generate-manifest.d.ts.map +1 -0
  233. package/dist/build/generate-manifest.js +276 -0
  234. package/dist/build/generate-manifest.js.map +1 -0
  235. package/dist/build/generate-route-types.d.ts +115 -0
  236. package/dist/build/generate-route-types.d.ts.map +1 -0
  237. package/dist/build/generate-route-types.js +740 -0
  238. package/dist/build/generate-route-types.js.map +1 -0
  239. package/dist/build/index.d.ts +21 -0
  240. package/dist/build/index.d.ts.map +1 -0
  241. package/dist/build/index.js +21 -0
  242. package/dist/build/index.js.map +1 -0
  243. package/dist/build/route-trie.d.ts +71 -0
  244. package/dist/build/route-trie.d.ts.map +1 -0
  245. package/dist/build/route-trie.js +175 -0
  246. package/dist/build/route-trie.js.map +1 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  248. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  249. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  250. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  252. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  253. package/dist/cache/__tests__/document-cache.test.js +345 -0
  254. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  258. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  260. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  261. package/dist/cache/__tests__/memory-store.test.js +367 -0
  262. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  263. package/dist/cache/cache-scope.d.ts +102 -0
  264. package/dist/cache/cache-scope.d.ts.map +1 -0
  265. package/dist/cache/cache-scope.js +440 -0
  266. package/dist/cache/cache-scope.js.map +1 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  270. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  272. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  273. package/dist/cache/cf/cf-cache-store.js +242 -0
  274. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  275. package/dist/cache/cf/index.d.ts +14 -0
  276. package/dist/cache/cf/index.d.ts.map +1 -0
  277. package/dist/cache/cf/index.js +17 -0
  278. package/dist/cache/cf/index.js.map +1 -0
  279. package/dist/cache/document-cache.d.ts +64 -0
  280. package/dist/cache/document-cache.d.ts.map +1 -0
  281. package/dist/cache/document-cache.js +228 -0
  282. package/dist/cache/document-cache.js.map +1 -0
  283. package/dist/cache/index.d.ts +19 -0
  284. package/dist/cache/index.d.ts.map +1 -0
  285. package/dist/cache/index.js +21 -0
  286. package/dist/cache/index.js.map +1 -0
  287. package/dist/cache/memory-segment-store.d.ts +110 -0
  288. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  289. package/dist/cache/memory-segment-store.js +117 -0
  290. package/dist/cache/memory-segment-store.js.map +1 -0
  291. package/dist/cache/memory-store.d.ts +41 -0
  292. package/dist/cache/memory-store.d.ts.map +1 -0
  293. package/dist/cache/memory-store.js +191 -0
  294. package/dist/cache/memory-store.js.map +1 -0
  295. package/dist/cache/types.d.ts +317 -0
  296. package/dist/cache/types.d.ts.map +1 -0
  297. package/dist/cache/types.js +12 -0
  298. package/dist/cache/types.js.map +1 -0
  299. package/dist/client.d.ts +248 -0
  300. package/dist/client.d.ts.map +1 -0
  301. package/dist/client.js +367 -0
  302. package/dist/client.js.map +1 -0
  303. package/dist/client.rsc.d.ts +26 -0
  304. package/dist/client.rsc.d.ts.map +1 -0
  305. package/dist/client.rsc.js +46 -0
  306. package/dist/client.rsc.js.map +1 -0
  307. package/dist/component-utils.d.ts +36 -0
  308. package/dist/component-utils.d.ts.map +1 -0
  309. package/dist/component-utils.js +61 -0
  310. package/dist/component-utils.js.map +1 -0
  311. package/dist/components/DefaultDocument.d.ts +13 -0
  312. package/dist/components/DefaultDocument.d.ts.map +1 -0
  313. package/dist/components/DefaultDocument.js +15 -0
  314. package/dist/components/DefaultDocument.js.map +1 -0
  315. package/dist/debug.d.ts +58 -0
  316. package/dist/debug.d.ts.map +1 -0
  317. package/dist/debug.js +157 -0
  318. package/dist/debug.js.map +1 -0
  319. package/dist/default-error-boundary.d.ts +11 -0
  320. package/dist/default-error-boundary.d.ts.map +1 -0
  321. package/dist/default-error-boundary.js +45 -0
  322. package/dist/default-error-boundary.js.map +1 -0
  323. package/dist/deps/browser.d.ts +2 -0
  324. package/dist/deps/browser.d.ts.map +1 -0
  325. package/dist/deps/browser.js +3 -0
  326. package/dist/deps/browser.js.map +1 -0
  327. package/dist/deps/html-stream-client.d.ts +2 -0
  328. package/dist/deps/html-stream-client.d.ts.map +1 -0
  329. package/dist/deps/html-stream-client.js +3 -0
  330. package/dist/deps/html-stream-client.js.map +1 -0
  331. package/dist/deps/html-stream-server.d.ts +2 -0
  332. package/dist/deps/html-stream-server.d.ts.map +1 -0
  333. package/dist/deps/html-stream-server.js +3 -0
  334. package/dist/deps/html-stream-server.js.map +1 -0
  335. package/dist/deps/rsc.d.ts +2 -0
  336. package/dist/deps/rsc.d.ts.map +1 -0
  337. package/dist/deps/rsc.js +4 -0
  338. package/dist/deps/rsc.js.map +1 -0
  339. package/dist/deps/ssr.d.ts +2 -0
  340. package/dist/deps/ssr.d.ts.map +1 -0
  341. package/dist/deps/ssr.js +3 -0
  342. package/dist/deps/ssr.js.map +1 -0
  343. package/dist/errors.d.ts +174 -0
  344. package/dist/errors.d.ts.map +1 -0
  345. package/dist/errors.js +241 -0
  346. package/dist/errors.js.map +1 -0
  347. package/dist/handle.d.ts +78 -0
  348. package/dist/handle.d.ts.map +1 -0
  349. package/dist/handle.js +82 -0
  350. package/dist/handle.js.map +1 -0
  351. package/dist/handles/MetaTags.d.ts +14 -0
  352. package/dist/handles/MetaTags.d.ts.map +1 -0
  353. package/dist/handles/MetaTags.js +136 -0
  354. package/dist/handles/MetaTags.js.map +1 -0
  355. package/{src/handles/index.ts → dist/handles/index.d.ts} +1 -2
  356. package/dist/handles/index.d.ts.map +1 -0
  357. package/dist/handles/index.js +6 -0
  358. package/dist/handles/index.js.map +1 -0
  359. package/dist/handles/meta.d.ts +39 -0
  360. package/dist/handles/meta.d.ts.map +1 -0
  361. package/dist/handles/meta.js +202 -0
  362. package/dist/handles/meta.js.map +1 -0
  363. package/dist/host/__tests__/errors.test.d.ts +2 -0
  364. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  365. package/dist/host/__tests__/errors.test.js +76 -0
  366. package/dist/host/__tests__/errors.test.js.map +1 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  370. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  372. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  374. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  375. package/dist/host/__tests__/router.test.d.ts +2 -0
  376. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  377. package/dist/host/__tests__/router.test.js +241 -0
  378. package/dist/host/__tests__/router.test.js.map +1 -0
  379. package/dist/host/__tests__/testing.test.d.ts +2 -0
  380. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  381. package/dist/host/__tests__/testing.test.js +64 -0
  382. package/dist/host/__tests__/testing.test.js.map +1 -0
  383. package/dist/host/__tests__/utils.test.d.ts +2 -0
  384. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  385. package/dist/host/__tests__/utils.test.js +29 -0
  386. package/dist/host/__tests__/utils.test.js.map +1 -0
  387. package/dist/host/cookie-handler.d.ts +34 -0
  388. package/dist/host/cookie-handler.d.ts.map +1 -0
  389. package/dist/host/cookie-handler.js +124 -0
  390. package/dist/host/cookie-handler.js.map +1 -0
  391. package/dist/host/errors.d.ts +56 -0
  392. package/dist/host/errors.d.ts.map +1 -0
  393. package/dist/host/errors.js +79 -0
  394. package/dist/host/errors.js.map +1 -0
  395. package/dist/host/index.d.ts +29 -0
  396. package/dist/host/index.d.ts.map +1 -0
  397. package/dist/host/index.js +32 -0
  398. package/dist/host/index.js.map +1 -0
  399. package/dist/host/pattern-matcher.d.ts +36 -0
  400. package/dist/host/pattern-matcher.d.ts.map +1 -0
  401. package/dist/host/pattern-matcher.js +172 -0
  402. package/dist/host/pattern-matcher.js.map +1 -0
  403. package/dist/host/router.d.ts +26 -0
  404. package/dist/host/router.d.ts.map +1 -0
  405. package/dist/host/router.js +218 -0
  406. package/dist/host/router.js.map +1 -0
  407. package/dist/host/testing.d.ts +36 -0
  408. package/dist/host/testing.d.ts.map +1 -0
  409. package/dist/host/testing.js +55 -0
  410. package/dist/host/testing.js.map +1 -0
  411. package/dist/host/types.d.ts +115 -0
  412. package/dist/host/types.d.ts.map +1 -0
  413. package/dist/host/types.js +7 -0
  414. package/dist/host/types.js.map +1 -0
  415. package/dist/host/utils.d.ts +21 -0
  416. package/dist/host/utils.d.ts.map +1 -0
  417. package/dist/host/utils.js +23 -0
  418. package/dist/host/utils.js.map +1 -0
  419. package/dist/href-client.d.ts +131 -0
  420. package/dist/href-client.d.ts.map +1 -0
  421. package/dist/href-client.js +64 -0
  422. package/dist/href-client.js.map +1 -0
  423. package/dist/href-context.d.ts +29 -0
  424. package/dist/href-context.d.ts.map +1 -0
  425. package/dist/href-context.js +21 -0
  426. package/dist/href-context.js.map +1 -0
  427. package/dist/index.d.ts +73 -0
  428. package/dist/index.d.ts.map +1 -0
  429. package/dist/index.js +91 -0
  430. package/dist/index.js.map +1 -0
  431. package/dist/index.rsc.d.ts +32 -0
  432. package/dist/index.rsc.d.ts.map +1 -0
  433. package/dist/index.rsc.js +40 -0
  434. package/dist/index.rsc.js.map +1 -0
  435. package/dist/internal-debug.d.ts +2 -0
  436. package/dist/internal-debug.d.ts.map +1 -0
  437. package/dist/internal-debug.js +5 -0
  438. package/dist/internal-debug.js.map +1 -0
  439. package/dist/loader.d.ts +14 -0
  440. package/dist/loader.d.ts.map +1 -0
  441. package/dist/loader.js +20 -0
  442. package/dist/loader.js.map +1 -0
  443. package/dist/loader.rsc.d.ts +19 -0
  444. package/dist/loader.rsc.d.ts.map +1 -0
  445. package/dist/loader.rsc.js +99 -0
  446. package/dist/loader.rsc.js.map +1 -0
  447. package/dist/network-error-thrower.d.ts +17 -0
  448. package/dist/network-error-thrower.d.ts.map +1 -0
  449. package/dist/network-error-thrower.js +14 -0
  450. package/dist/network-error-thrower.js.map +1 -0
  451. package/dist/outlet-context.d.ts +13 -0
  452. package/dist/outlet-context.d.ts.map +1 -0
  453. package/dist/outlet-context.js +3 -0
  454. package/dist/outlet-context.js.map +1 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  456. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  457. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  458. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  459. package/dist/prerender/param-hash.d.ts +16 -0
  460. package/dist/prerender/param-hash.d.ts.map +1 -0
  461. package/dist/prerender/param-hash.js +36 -0
  462. package/dist/prerender/param-hash.js.map +1 -0
  463. package/dist/prerender/store.d.ts +38 -0
  464. package/dist/prerender/store.d.ts.map +1 -0
  465. package/dist/prerender/store.js +61 -0
  466. package/dist/prerender/store.js.map +1 -0
  467. package/dist/prerender.d.ts +66 -0
  468. package/dist/prerender.d.ts.map +1 -0
  469. package/dist/prerender.js +57 -0
  470. package/dist/prerender.js.map +1 -0
  471. package/dist/reverse.d.ts +196 -0
  472. package/dist/reverse.d.ts.map +1 -0
  473. package/dist/reverse.js +78 -0
  474. package/dist/reverse.js.map +1 -0
  475. package/dist/root-error-boundary.d.ts +33 -0
  476. package/dist/root-error-boundary.d.ts.map +1 -0
  477. package/dist/root-error-boundary.js +165 -0
  478. package/dist/root-error-boundary.js.map +1 -0
  479. package/dist/route-content-wrapper.d.ts +46 -0
  480. package/dist/route-content-wrapper.d.ts.map +1 -0
  481. package/dist/route-content-wrapper.js +77 -0
  482. package/dist/route-content-wrapper.js.map +1 -0
  483. package/dist/route-definition.d.ts +421 -0
  484. package/dist/route-definition.d.ts.map +1 -0
  485. package/dist/route-definition.js +868 -0
  486. package/dist/route-definition.js.map +1 -0
  487. package/dist/route-map-builder.d.ts +155 -0
  488. package/dist/route-map-builder.d.ts.map +1 -0
  489. package/dist/route-map-builder.js +237 -0
  490. package/dist/route-map-builder.js.map +1 -0
  491. package/dist/route-types.d.ts +165 -0
  492. package/dist/route-types.d.ts.map +1 -0
  493. package/dist/route-types.js +7 -0
  494. package/dist/route-types.js.map +1 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  496. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  497. package/dist/router/__tests__/handler-context.test.js +65 -0
  498. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  502. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  503. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  504. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  505. package/dist/router/__tests__/match-context.test.js +92 -0
  506. package/dist/router/__tests__/match-context.test.js.map +1 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  508. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  509. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  510. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  511. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  512. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  513. package/dist/router/__tests__/match-result.test.js +457 -0
  514. package/dist/router/__tests__/match-result.test.js.map +1 -0
  515. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  516. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  517. package/dist/router/__tests__/on-error.test.js +678 -0
  518. package/dist/router/__tests__/on-error.test.js.map +1 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  520. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  521. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  522. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  526. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  527. package/dist/router/error-handling.d.ts +77 -0
  528. package/dist/router/error-handling.d.ts.map +1 -0
  529. package/dist/router/error-handling.js +202 -0
  530. package/dist/router/error-handling.js.map +1 -0
  531. package/dist/router/handler-context.d.ts +20 -0
  532. package/dist/router/handler-context.d.ts.map +1 -0
  533. package/dist/router/handler-context.js +198 -0
  534. package/dist/router/handler-context.js.map +1 -0
  535. package/dist/router/intercept-resolution.d.ts +66 -0
  536. package/dist/router/intercept-resolution.d.ts.map +1 -0
  537. package/dist/router/intercept-resolution.js +246 -0
  538. package/dist/router/intercept-resolution.js.map +1 -0
  539. package/dist/router/loader-resolution.d.ts +64 -0
  540. package/dist/router/loader-resolution.d.ts.map +1 -0
  541. package/dist/router/loader-resolution.js +284 -0
  542. package/dist/router/loader-resolution.js.map +1 -0
  543. package/dist/router/logging.d.ts +15 -0
  544. package/dist/router/logging.d.ts.map +1 -0
  545. package/dist/router/logging.js +99 -0
  546. package/dist/router/logging.js.map +1 -0
  547. package/dist/router/manifest.d.ts +22 -0
  548. package/dist/router/manifest.d.ts.map +1 -0
  549. package/dist/router/manifest.js +181 -0
  550. package/dist/router/manifest.js.map +1 -0
  551. package/dist/router/match-api.d.ts +35 -0
  552. package/dist/router/match-api.d.ts.map +1 -0
  553. package/dist/router/match-api.js +406 -0
  554. package/dist/router/match-api.js.map +1 -0
  555. package/dist/router/match-context.d.ts +206 -0
  556. package/dist/router/match-context.d.ts.map +1 -0
  557. package/dist/router/match-context.js +17 -0
  558. package/dist/router/match-context.js.map +1 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  560. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  561. package/dist/router/match-middleware/background-revalidation.js +75 -0
  562. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  564. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  565. package/dist/router/match-middleware/cache-lookup.js +257 -0
  566. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  567. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  568. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  569. package/dist/router/match-middleware/cache-store.js +108 -0
  570. package/dist/router/match-middleware/cache-store.js.map +1 -0
  571. package/dist/router/match-middleware/index.d.ts +81 -0
  572. package/dist/router/match-middleware/index.d.ts.map +1 -0
  573. package/dist/router/match-middleware/index.js +80 -0
  574. package/dist/router/match-middleware/index.js.map +1 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  576. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  577. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  578. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  580. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  581. package/dist/router/match-middleware/segment-resolution.js +53 -0
  582. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  583. package/dist/router/match-pipelines.d.ts +147 -0
  584. package/dist/router/match-pipelines.d.ts.map +1 -0
  585. package/dist/router/match-pipelines.js +82 -0
  586. package/dist/router/match-pipelines.js.map +1 -0
  587. package/dist/router/match-result.d.ts +126 -0
  588. package/dist/router/match-result.d.ts.map +1 -0
  589. package/dist/router/match-result.js +93 -0
  590. package/dist/router/match-result.js.map +1 -0
  591. package/dist/router/metrics.d.ts +20 -0
  592. package/dist/router/metrics.d.ts.map +1 -0
  593. package/dist/router/metrics.js +47 -0
  594. package/dist/router/metrics.js.map +1 -0
  595. package/dist/router/middleware.d.ts +249 -0
  596. package/dist/router/middleware.d.ts.map +1 -0
  597. package/dist/router/middleware.js +434 -0
  598. package/dist/router/middleware.js.map +1 -0
  599. package/dist/router/middleware.test.d.ts +2 -0
  600. package/dist/router/middleware.test.d.ts.map +1 -0
  601. package/dist/router/middleware.test.js +816 -0
  602. package/dist/router/middleware.test.js.map +1 -0
  603. package/dist/router/pattern-matching.d.ts +149 -0
  604. package/dist/router/pattern-matching.d.ts.map +1 -0
  605. package/dist/router/pattern-matching.js +349 -0
  606. package/dist/router/pattern-matching.js.map +1 -0
  607. package/dist/router/revalidation.d.ts +44 -0
  608. package/dist/router/revalidation.d.ts.map +1 -0
  609. package/dist/router/revalidation.js +147 -0
  610. package/dist/router/revalidation.js.map +1 -0
  611. package/dist/router/router-context.d.ts +135 -0
  612. package/dist/router/router-context.d.ts.map +1 -0
  613. package/dist/router/router-context.js +36 -0
  614. package/dist/router/router-context.js.map +1 -0
  615. package/dist/router/segment-resolution.d.ts +127 -0
  616. package/dist/router/segment-resolution.d.ts.map +1 -0
  617. package/dist/router/segment-resolution.js +919 -0
  618. package/dist/router/segment-resolution.js.map +1 -0
  619. package/dist/router/trie-matching.d.ts +40 -0
  620. package/dist/router/trie-matching.d.ts.map +1 -0
  621. package/dist/router/trie-matching.js +127 -0
  622. package/dist/router/trie-matching.js.map +1 -0
  623. package/dist/router/types.d.ts +136 -0
  624. package/dist/router/types.d.ts.map +1 -0
  625. package/dist/router/types.js +7 -0
  626. package/dist/router/types.js.map +1 -0
  627. package/dist/router.d.ts +753 -0
  628. package/dist/router.d.ts.map +1 -0
  629. package/dist/router.gen.d.ts +6 -0
  630. package/dist/router.gen.d.ts.map +1 -0
  631. package/dist/router.gen.js +6 -0
  632. package/dist/router.gen.js.map +1 -0
  633. package/dist/router.js +1304 -0
  634. package/dist/router.js.map +1 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  636. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  637. package/dist/rsc/__tests__/helpers.test.js +140 -0
  638. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  639. package/dist/rsc/handler.d.ts +45 -0
  640. package/dist/rsc/handler.d.ts.map +1 -0
  641. package/dist/rsc/handler.js +1172 -0
  642. package/dist/rsc/handler.js.map +1 -0
  643. package/dist/rsc/helpers.d.ts +16 -0
  644. package/dist/rsc/helpers.d.ts.map +1 -0
  645. package/dist/rsc/helpers.js +55 -0
  646. package/dist/rsc/helpers.js.map +1 -0
  647. package/dist/rsc/index.d.ts +22 -0
  648. package/dist/rsc/index.d.ts.map +1 -0
  649. package/dist/rsc/index.js +23 -0
  650. package/dist/rsc/index.js.map +1 -0
  651. package/dist/rsc/nonce.d.ts +9 -0
  652. package/dist/rsc/nonce.d.ts.map +1 -0
  653. package/dist/rsc/nonce.js +18 -0
  654. package/dist/rsc/nonce.js.map +1 -0
  655. package/dist/rsc/types.d.ts +206 -0
  656. package/dist/rsc/types.d.ts.map +1 -0
  657. package/dist/rsc/types.js +8 -0
  658. package/dist/rsc/types.js.map +1 -0
  659. package/dist/search-params.d.ts +103 -0
  660. package/dist/search-params.d.ts.map +1 -0
  661. package/dist/search-params.js +74 -0
  662. package/dist/search-params.js.map +1 -0
  663. package/dist/segment-system.d.ts +75 -0
  664. package/dist/segment-system.d.ts.map +1 -0
  665. package/dist/segment-system.js +336 -0
  666. package/dist/segment-system.js.map +1 -0
  667. package/dist/server/context.d.ts +245 -0
  668. package/dist/server/context.d.ts.map +1 -0
  669. package/dist/server/context.js +197 -0
  670. package/dist/server/context.js.map +1 -0
  671. package/dist/server/fetchable-loader-store.d.ts +18 -0
  672. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  673. package/dist/server/fetchable-loader-store.js +18 -0
  674. package/dist/server/fetchable-loader-store.js.map +1 -0
  675. package/dist/server/handle-store.d.ts +85 -0
  676. package/dist/server/handle-store.d.ts.map +1 -0
  677. package/dist/server/handle-store.js +142 -0
  678. package/dist/server/handle-store.js.map +1 -0
  679. package/dist/server/loader-registry.d.ts +55 -0
  680. package/dist/server/loader-registry.d.ts.map +1 -0
  681. package/dist/server/loader-registry.js +132 -0
  682. package/dist/server/loader-registry.js.map +1 -0
  683. package/dist/server/request-context.d.ts +226 -0
  684. package/dist/server/request-context.d.ts.map +1 -0
  685. package/dist/server/request-context.js +290 -0
  686. package/dist/server/request-context.js.map +1 -0
  687. package/dist/server/root-layout.d.ts +4 -0
  688. package/dist/server/root-layout.d.ts.map +1 -0
  689. package/dist/server/root-layout.js +5 -0
  690. package/dist/server/root-layout.js.map +1 -0
  691. package/dist/server.d.ts +15 -0
  692. package/dist/server.d.ts.map +1 -0
  693. package/dist/server.js +20 -0
  694. package/dist/server.js.map +1 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  698. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  699. package/dist/ssr/index.d.ts +98 -0
  700. package/dist/ssr/index.d.ts.map +1 -0
  701. package/dist/ssr/index.js +158 -0
  702. package/dist/ssr/index.js.map +1 -0
  703. package/dist/static-handler.d.ts +50 -0
  704. package/dist/static-handler.d.ts.map +1 -0
  705. package/dist/static-handler.gen.d.ts +5 -0
  706. package/dist/static-handler.gen.d.ts.map +1 -0
  707. package/dist/static-handler.gen.js +5 -0
  708. package/dist/static-handler.gen.js.map +1 -0
  709. package/dist/static-handler.js +29 -0
  710. package/dist/static-handler.js.map +1 -0
  711. package/dist/testing/vitest.js +82 -0
  712. package/dist/theme/ThemeProvider.d.ts +20 -0
  713. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  714. package/dist/theme/ThemeProvider.js +240 -0
  715. package/dist/theme/ThemeProvider.js.map +1 -0
  716. package/dist/theme/ThemeScript.d.ts +48 -0
  717. package/dist/theme/ThemeScript.d.ts.map +1 -0
  718. package/dist/theme/ThemeScript.js +13 -0
  719. package/dist/theme/ThemeScript.js.map +1 -0
  720. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  721. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  722. package/dist/theme/__tests__/theme.test.js +103 -0
  723. package/dist/theme/__tests__/theme.test.js.map +1 -0
  724. package/dist/theme/constants.d.ts +29 -0
  725. package/dist/theme/constants.d.ts.map +1 -0
  726. package/dist/theme/constants.js +48 -0
  727. package/dist/theme/constants.js.map +1 -0
  728. package/dist/theme/index.d.ts +31 -0
  729. package/dist/theme/index.d.ts.map +1 -0
  730. package/dist/theme/index.js +36 -0
  731. package/dist/theme/index.js.map +1 -0
  732. package/dist/theme/theme-context.d.ts +40 -0
  733. package/dist/theme/theme-context.d.ts.map +1 -0
  734. package/dist/theme/theme-context.js +60 -0
  735. package/dist/theme/theme-context.js.map +1 -0
  736. package/dist/theme/theme-script.d.ts +27 -0
  737. package/dist/theme/theme-script.d.ts.map +1 -0
  738. package/dist/theme/theme-script.js +147 -0
  739. package/dist/theme/theme-script.js.map +1 -0
  740. package/dist/theme/types.d.ts +163 -0
  741. package/dist/theme/types.d.ts.map +1 -0
  742. package/dist/theme/types.js +11 -0
  743. package/dist/theme/types.js.map +1 -0
  744. package/dist/theme/use-theme.d.ts +12 -0
  745. package/dist/theme/use-theme.d.ts.map +1 -0
  746. package/dist/theme/use-theme.js +40 -0
  747. package/dist/theme/use-theme.js.map +1 -0
  748. package/dist/types.d.ts +1479 -0
  749. package/dist/types.d.ts.map +1 -0
  750. package/dist/types.js +10 -0
  751. package/dist/types.js.map +1 -0
  752. package/dist/urls.d.ts +441 -0
  753. package/dist/urls.d.ts.map +1 -0
  754. package/dist/urls.gen.d.ts +8 -0
  755. package/dist/urls.gen.d.ts.map +1 -0
  756. package/dist/urls.gen.js +8 -0
  757. package/dist/urls.gen.js.map +1 -0
  758. package/dist/urls.js +443 -0
  759. package/dist/urls.js.map +1 -0
  760. package/dist/use-loader.d.ts +127 -0
  761. package/dist/use-loader.d.ts.map +1 -0
  762. package/dist/use-loader.js +237 -0
  763. package/dist/use-loader.js.map +1 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  767. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  771. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  775. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  777. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  779. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  780. package/dist/vite/ast-handler-extract.d.ts +49 -0
  781. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  782. package/dist/vite/ast-handler-extract.js +249 -0
  783. package/dist/vite/ast-handler-extract.js.map +1 -0
  784. package/dist/vite/expose-action-id.d.ts +19 -0
  785. package/dist/vite/expose-action-id.d.ts.map +1 -0
  786. package/dist/vite/expose-action-id.js +250 -0
  787. package/dist/vite/expose-action-id.js.map +1 -0
  788. package/dist/vite/expose-id-utils.d.ts +69 -0
  789. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  790. package/dist/vite/expose-id-utils.js +289 -0
  791. package/dist/vite/expose-id-utils.js.map +1 -0
  792. package/dist/vite/expose-internal-ids.d.ts +22 -0
  793. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  794. package/dist/vite/expose-internal-ids.js +886 -0
  795. package/dist/vite/expose-internal-ids.js.map +1 -0
  796. package/dist/vite/index.d.ts +149 -0
  797. package/dist/vite/index.d.ts.map +1 -0
  798. package/dist/vite/index.js +1165 -310
  799. package/dist/vite/index.js.bak +5448 -0
  800. package/dist/vite/index.js.map +1 -0
  801. package/dist/vite/index.named-routes.gen.ts +103 -0
  802. package/dist/vite/package-resolution.d.ts +43 -0
  803. package/dist/vite/package-resolution.d.ts.map +1 -0
  804. package/dist/vite/package-resolution.js +112 -0
  805. package/dist/vite/package-resolution.js.map +1 -0
  806. package/dist/vite/virtual-entries.d.ts +25 -0
  807. package/dist/vite/virtual-entries.d.ts.map +1 -0
  808. package/dist/vite/virtual-entries.js +110 -0
  809. package/dist/vite/virtual-entries.js.map +1 -0
  810. package/package.json +71 -7
  811. package/skills/api-client/SKILL.md +211 -0
  812. package/skills/breadcrumbs/SKILL.md +61 -1
  813. package/skills/bundle-analysis/SKILL.md +2 -2
  814. package/skills/cache-guide/SKILL.md +2 -2
  815. package/skills/caching/SKILL.md +92 -10
  816. package/skills/css/SKILL.md +76 -0
  817. package/skills/debug-manifest/SKILL.md +4 -2
  818. package/skills/document-cache/SKILL.md +2 -2
  819. package/skills/handler-use/SKILL.md +1 -1
  820. package/skills/hooks/SKILL.md +40 -29
  821. package/skills/host-router/SKILL.md +80 -3
  822. package/skills/intercept/SKILL.md +5 -3
  823. package/skills/layout/SKILL.md +11 -6
  824. package/skills/loader/SKILL.md +25 -19
  825. package/skills/middleware/SKILL.md +4 -2
  826. package/skills/migrate-nextjs/SKILL.md +3 -1
  827. package/skills/migrate-react-router/SKILL.md +4 -2
  828. package/skills/mime-routes/SKILL.md +2 -2
  829. package/skills/observability/SKILL.md +61 -4
  830. package/skills/parallel/SKILL.md +9 -4
  831. package/skills/prerender/SKILL.md +31 -10
  832. package/skills/rango/SKILL.md +31 -10
  833. package/skills/response-routes/SKILL.md +63 -45
  834. package/skills/route/SKILL.md +14 -2
  835. package/skills/router-setup/SKILL.md +27 -3
  836. package/skills/scripts/SKILL.md +179 -0
  837. package/skills/server-actions/SKILL.md +25 -1
  838. package/skills/tailwind/SKILL.md +27 -3
  839. package/skills/testing/SKILL.md +129 -0
  840. package/skills/testing/bindings.md +103 -0
  841. package/skills/testing/cache-prerender.md +127 -0
  842. package/skills/testing/client-components.md +124 -0
  843. package/skills/testing/e2e-parity.md +125 -0
  844. package/skills/testing/flight.md +91 -0
  845. package/skills/testing/handles.md +129 -0
  846. package/skills/testing/loader.md +128 -0
  847. package/skills/testing/middleware.md +99 -0
  848. package/skills/testing/render-handler.md +121 -0
  849. package/skills/testing/response-routes.md +95 -0
  850. package/skills/testing/reverse-and-types.md +84 -0
  851. package/skills/testing/server-actions.md +107 -0
  852. package/skills/testing/server-tree.md +128 -0
  853. package/skills/testing/setup.md +123 -0
  854. package/skills/typesafety/SKILL.md +6 -5
  855. package/skills/use-cache/SKILL.md +10 -9
  856. package/skills/vercel/SKILL.md +128 -0
  857. package/src/__augment-tests__/augmented.check.ts +2 -3
  858. package/src/__internal.ts +0 -65
  859. package/src/browser/action-coordinator.ts +1 -1
  860. package/src/browser/action-fence.ts +47 -0
  861. package/src/browser/app-shell.ts +14 -27
  862. package/src/browser/connection-warmup.ts +134 -0
  863. package/src/browser/cookie-name.ts +140 -0
  864. package/src/browser/event-controller.ts +115 -89
  865. package/src/browser/invalidate-client-cache.ts +52 -0
  866. package/src/browser/navigation-bridge.ts +16 -52
  867. package/src/browser/navigation-client.ts +84 -69
  868. package/src/browser/navigation-store-handle.ts +38 -0
  869. package/src/browser/navigation-store.ts +25 -74
  870. package/src/browser/navigation-transaction.ts +0 -32
  871. package/src/browser/partial-update.ts +81 -127
  872. package/src/browser/prefetch/cache.ts +99 -72
  873. package/src/browser/prefetch/fetch.ts +176 -34
  874. package/src/browser/prefetch/queue.ts +6 -3
  875. package/src/browser/rango-state.ts +157 -115
  876. package/src/browser/react/Link.tsx +30 -7
  877. package/src/browser/react/NavigationProvider.tsx +32 -95
  878. package/src/browser/react/ScrollRestoration.tsx +10 -6
  879. package/src/browser/react/filter-segment-order.ts +17 -2
  880. package/src/browser/react/index.ts +0 -51
  881. package/src/browser/react/location-state-shared.ts +14 -15
  882. package/src/browser/react/location-state.ts +0 -1
  883. package/src/browser/react/use-action.ts +6 -15
  884. package/src/browser/react/use-handle.ts +0 -5
  885. package/src/browser/react/use-href.tsx +8 -1
  886. package/src/browser/react/use-link-status.ts +33 -8
  887. package/src/browser/react/use-navigation.ts +10 -5
  888. package/src/browser/react/use-params.ts +0 -2
  889. package/src/browser/react/use-router.ts +6 -4
  890. package/src/browser/react/use-search-params.ts +0 -5
  891. package/src/browser/react/use-segments.ts +0 -13
  892. package/src/browser/response-adapter.ts +41 -4
  893. package/src/browser/rsc-router.tsx +43 -18
  894. package/src/browser/scroll-restoration.ts +8 -3
  895. package/src/browser/server-action-bridge.ts +194 -28
  896. package/src/browser/types.ts +40 -21
  897. package/src/browser/validate-redirect-origin.ts +43 -16
  898. package/src/build/generate-route-types.ts +1 -1
  899. package/src/build/index.ts +8 -4
  900. package/src/build/prefix-tree-utils.ts +123 -0
  901. package/src/build/route-trie.ts +117 -15
  902. package/src/build/route-types/ast-route-extraction.ts +15 -8
  903. package/src/build/route-types/codegen.ts +12 -1
  904. package/src/build/route-types/include-resolution.ts +116 -22
  905. package/src/build/route-types/param-extraction.ts +6 -3
  906. package/src/build/route-types/per-module-writer.ts +15 -2
  907. package/src/build/route-types/router-processing.ts +77 -41
  908. package/src/build/route-types/source-scan.ts +105 -7
  909. package/src/cache/cache-key-utils.ts +29 -13
  910. package/src/cache/cache-policy.ts +42 -62
  911. package/src/cache/cache-runtime.ts +126 -30
  912. package/src/cache/cache-scope.ts +118 -43
  913. package/src/cache/cache-tag.ts +7 -39
  914. package/src/cache/cf/cf-base64.ts +33 -0
  915. package/src/cache/cf/cf-cache-constants.ts +127 -0
  916. package/src/cache/cf/cf-cache-store.ts +1257 -537
  917. package/src/cache/cf/cf-cache-types.ts +349 -0
  918. package/src/cache/cf/cf-kv-utils.ts +46 -0
  919. package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
  920. package/src/cache/cf/index.ts +6 -19
  921. package/src/cache/document-cache.ts +32 -32
  922. package/src/cache/handle-snapshot.ts +70 -0
  923. package/src/cache/index.ts +20 -24
  924. package/src/cache/memory-segment-store.ts +3 -48
  925. package/src/cache/profile-registry.ts +31 -31
  926. package/src/cache/read-through-swr.ts +41 -11
  927. package/src/cache/segment-codec.ts +9 -17
  928. package/src/cache/tag-invalidation.ts +29 -5
  929. package/src/cache/types.ts +14 -104
  930. package/src/cache/vercel/index.ts +11 -0
  931. package/src/cache/vercel/vercel-cache-store.ts +855 -0
  932. package/src/client.rsc.tsx +42 -22
  933. package/src/client.tsx +31 -58
  934. package/src/cloudflare/index.ts +11 -0
  935. package/src/cloudflare/tracing.ts +109 -0
  936. package/src/component-utils.ts +19 -0
  937. package/src/components/DefaultDocument.tsx +8 -2
  938. package/src/context-var.ts +13 -1
  939. package/src/decode-loader-results.ts +18 -2
  940. package/src/defer.ts +196 -0
  941. package/src/deps/ssr.ts +0 -1
  942. package/src/encode-kv.ts +49 -0
  943. package/src/errors.ts +0 -3
  944. package/src/escape-script.ts +52 -0
  945. package/src/handle.ts +28 -18
  946. package/src/handles/MetaTags.tsx +56 -19
  947. package/src/handles/Scripts.tsx +183 -0
  948. package/src/handles/breadcrumbs.ts +37 -8
  949. package/src/handles/is-thenable.ts +19 -0
  950. package/src/handles/meta.ts +51 -40
  951. package/src/handles/script.ts +244 -0
  952. package/src/host/cookie-handler.ts +9 -60
  953. package/src/host/errors.ts +0 -24
  954. package/src/host/index.ts +6 -0
  955. package/src/host/pattern-matcher.ts +23 -52
  956. package/src/host/router.ts +1 -65
  957. package/src/host/testing.ts +40 -27
  958. package/src/host/types.ts +6 -2
  959. package/src/href-client.ts +7 -12
  960. package/src/index.rsc.ts +75 -8
  961. package/src/index.ts +60 -4
  962. package/src/internal-debug.ts +2 -4
  963. package/src/loader.rsc.ts +19 -9
  964. package/src/loader.ts +12 -4
  965. package/src/network-error-thrower.tsx +1 -6
  966. package/src/outlet-provider.tsx +1 -5
  967. package/src/prerender/param-hash.ts +16 -16
  968. package/src/prerender/store.ts +32 -37
  969. package/src/prerender.ts +58 -3
  970. package/src/redirect-origin.ts +100 -0
  971. package/src/regex-escape.ts +8 -0
  972. package/src/response-utils.ts +25 -0
  973. package/src/root-error-boundary.tsx +1 -19
  974. package/src/route-content-wrapper.tsx +1 -44
  975. package/src/route-definition/dsl-helpers.ts +39 -21
  976. package/src/route-definition/helpers-types.ts +3 -3
  977. package/src/route-definition/redirect.ts +44 -11
  978. package/src/route-definition/resolve-handler-use.ts +6 -0
  979. package/src/route-map-builder.ts +0 -16
  980. package/src/router/basename.ts +14 -0
  981. package/src/router/content-negotiation.ts +58 -23
  982. package/src/router/error-handling.ts +44 -17
  983. package/src/router/find-match.ts +44 -23
  984. package/src/router/handler-context.ts +6 -1
  985. package/src/router/instrument.ts +350 -0
  986. package/src/router/intercept-resolution.ts +35 -2
  987. package/src/router/lazy-includes.ts +7 -44
  988. package/src/router/loader-resolution.ts +139 -73
  989. package/src/router/logging.ts +0 -6
  990. package/src/router/manifest.ts +18 -29
  991. package/src/router/match-api.ts +0 -20
  992. package/src/router/match-context.ts +0 -22
  993. package/src/router/match-handlers.ts +57 -58
  994. package/src/router/match-middleware/background-revalidation.ts +6 -7
  995. package/src/router/match-middleware/cache-lookup.ts +115 -194
  996. package/src/router/match-middleware/cache-store.ts +28 -32
  997. package/src/router/match-middleware/intercept-resolution.ts +0 -22
  998. package/src/router/match-middleware/segment-resolution.ts +0 -22
  999. package/src/router/match-pipelines.ts +1 -42
  1000. package/src/router/match-result.ts +1 -52
  1001. package/src/router/metrics.ts +0 -34
  1002. package/src/router/middleware-types.ts +0 -116
  1003. package/src/router/middleware.ts +175 -90
  1004. package/src/router/navigation-snapshot.ts +0 -51
  1005. package/src/router/params-util.ts +23 -0
  1006. package/src/router/pattern-matching.ts +47 -89
  1007. package/src/router/prefetch-cache-ttl.ts +51 -0
  1008. package/src/router/prerender-match.ts +101 -64
  1009. package/src/router/request-classification.ts +25 -35
  1010. package/src/router/revalidation.ts +75 -81
  1011. package/src/router/route-snapshot.ts +0 -1
  1012. package/src/router/router-context.ts +3 -28
  1013. package/src/router/router-interfaces.ts +38 -7
  1014. package/src/router/router-options.ts +111 -4
  1015. package/src/router/segment-resolution/fresh.ts +66 -78
  1016. package/src/router/segment-resolution/helpers.ts +86 -6
  1017. package/src/router/segment-resolution/loader-cache.ts +57 -23
  1018. package/src/router/segment-resolution/revalidation.ts +212 -304
  1019. package/src/router/segment-resolution/static-store.ts +19 -5
  1020. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  1021. package/src/router/segment-resolution.ts +5 -1
  1022. package/src/router/segment-wrappers.ts +6 -5
  1023. package/src/router/state-cookie-name.ts +33 -0
  1024. package/src/router/telemetry-otel.ts +161 -199
  1025. package/src/router/telemetry.ts +96 -19
  1026. package/src/router/timeout.ts +0 -20
  1027. package/src/router/tracing.ts +206 -0
  1028. package/src/router/trie-matching.ts +163 -64
  1029. package/src/router/types.ts +1 -63
  1030. package/src/router/url-params.ts +0 -5
  1031. package/src/router.ts +87 -37
  1032. package/src/rsc/handler-context.ts +1 -0
  1033. package/src/rsc/handler.ts +232 -153
  1034. package/src/rsc/helpers.ts +97 -4
  1035. package/src/rsc/index.ts +1 -4
  1036. package/src/rsc/json-route-result.ts +38 -0
  1037. package/src/rsc/loader-fetch.ts +114 -38
  1038. package/src/rsc/manifest-init.ts +28 -41
  1039. package/src/rsc/origin-guard.ts +11 -15
  1040. package/src/rsc/progressive-enhancement.ts +59 -9
  1041. package/src/rsc/redirect-guard.ts +99 -0
  1042. package/src/rsc/response-cache-serve.ts +238 -0
  1043. package/src/rsc/response-error.ts +79 -12
  1044. package/src/rsc/response-route-handler.ts +57 -147
  1045. package/src/rsc/rsc-rendering.ts +64 -24
  1046. package/src/rsc/runtime-warnings.ts +14 -0
  1047. package/src/rsc/server-action.ts +244 -81
  1048. package/src/rsc/types.ts +15 -3
  1049. package/src/runtime-env.ts +18 -0
  1050. package/src/search-params.ts +31 -26
  1051. package/src/segment-loader-promise.ts +31 -4
  1052. package/src/segment-system.tsx +89 -89
  1053. package/src/server/context.ts +32 -0
  1054. package/src/server/cookie-parse.ts +32 -0
  1055. package/src/server/cookie-store.ts +52 -1
  1056. package/src/server/handle-store.ts +21 -38
  1057. package/src/server/loader-registry.ts +21 -42
  1058. package/src/server/request-context.ts +189 -131
  1059. package/src/ssr/index.tsx +19 -18
  1060. package/src/static-handler.ts +10 -13
  1061. package/src/testing/cache-status.ts +162 -0
  1062. package/src/testing/collect-handle.ts +40 -0
  1063. package/src/testing/dispatch.ts +701 -0
  1064. package/src/testing/dom.entry.ts +22 -0
  1065. package/src/testing/e2e/fixture.ts +188 -0
  1066. package/src/testing/e2e/index.ts +128 -0
  1067. package/src/testing/e2e/matchers.ts +35 -0
  1068. package/src/testing/e2e/page-helpers.ts +272 -0
  1069. package/src/testing/e2e/parity.ts +387 -0
  1070. package/src/testing/e2e/server.ts +195 -0
  1071. package/src/testing/flight-matchers.ts +97 -0
  1072. package/src/testing/flight-normalize.ts +11 -0
  1073. package/src/testing/flight-runtime.d.ts +57 -0
  1074. package/src/testing/flight-tree.ts +682 -0
  1075. package/src/testing/flight.entry.ts +52 -0
  1076. package/src/testing/flight.ts +257 -0
  1077. package/src/testing/generated-routes.ts +183 -0
  1078. package/src/testing/index.ts +99 -0
  1079. package/src/testing/internal/context.ts +371 -0
  1080. package/src/testing/internal/flight-client-globals.ts +30 -0
  1081. package/src/testing/internal/seed-vars.ts +54 -0
  1082. package/src/testing/render-handler.ts +343 -0
  1083. package/src/testing/render-route.tsx +581 -0
  1084. package/src/testing/run-loader.ts +385 -0
  1085. package/src/testing/run-middleware.ts +205 -0
  1086. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  1087. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  1088. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  1089. package/src/testing/vitest-stubs/version.ts +5 -0
  1090. package/src/testing/vitest.ts +305 -0
  1091. package/src/theme/ThemeProvider.tsx +20 -58
  1092. package/src/theme/ThemeScript.tsx +7 -9
  1093. package/src/theme/constants.ts +52 -13
  1094. package/src/theme/index.ts +0 -7
  1095. package/src/theme/theme-context.ts +1 -5
  1096. package/src/theme/theme-script.ts +22 -21
  1097. package/src/theme/use-theme.ts +0 -3
  1098. package/src/types/boundaries.ts +0 -35
  1099. package/src/types/cache-types.ts +3 -3
  1100. package/src/types/error-types.ts +25 -89
  1101. package/src/types/global-namespace.ts +15 -15
  1102. package/src/types/handler-context.ts +44 -14
  1103. package/src/types/index.ts +0 -10
  1104. package/src/types/loader-types.ts +6 -3
  1105. package/src/types/request-scope.ts +8 -22
  1106. package/src/types/route-config.ts +6 -50
  1107. package/src/types/route-entry.ts +0 -6
  1108. package/src/types/segments.ts +0 -13
  1109. package/src/urls/include-helper.ts +0 -4
  1110. package/src/urls/index.ts +1 -8
  1111. package/src/urls/path-helper-types.ts +8 -2
  1112. package/src/urls/path-helper.ts +0 -54
  1113. package/src/urls/type-extraction.ts +33 -24
  1114. package/src/urls/urls-function.ts +0 -13
  1115. package/src/use-loader.tsx +0 -186
  1116. package/src/vercel/index.ts +11 -0
  1117. package/src/vercel/tracing.ts +88 -0
  1118. package/src/vite/discovery/bundle-postprocess.ts +2 -1
  1119. package/src/vite/discovery/discover-routers.ts +33 -42
  1120. package/src/vite/discovery/prerender-collection.ts +33 -46
  1121. package/src/vite/discovery/state.ts +12 -1
  1122. package/src/vite/discovery/virtual-module-codegen.ts +1 -11
  1123. package/src/vite/index.ts +2 -0
  1124. package/src/vite/plugin-types.ts +143 -10
  1125. package/src/vite/plugins/cjs-to-esm.ts +8 -12
  1126. package/src/vite/plugins/client-ref-dedup.ts +0 -11
  1127. package/src/vite/plugins/client-ref-hashing.ts +0 -10
  1128. package/src/vite/plugins/cloudflare-protocol-stub.ts +0 -20
  1129. package/src/vite/plugins/expose-action-id.ts +2 -73
  1130. package/src/vite/plugins/expose-id-utils.ts +85 -56
  1131. package/src/vite/plugins/expose-ids/export-analysis.ts +30 -43
  1132. package/src/vite/plugins/expose-ids/handler-transform.ts +5 -31
  1133. package/src/vite/plugins/expose-ids/loader-transform.ts +12 -20
  1134. package/src/vite/plugins/expose-ids/router-transform.ts +98 -26
  1135. package/src/vite/plugins/expose-internal-ids.ts +10 -1
  1136. package/src/vite/plugins/performance-tracks.ts +0 -3
  1137. package/src/vite/plugins/refresh-cmd.ts +1 -1
  1138. package/src/vite/plugins/use-cache-transform.ts +21 -46
  1139. package/src/vite/plugins/vercel-output.ts +295 -0
  1140. package/src/vite/plugins/version-injector.ts +0 -20
  1141. package/src/vite/plugins/version-plugin.ts +6 -66
  1142. package/src/vite/plugins/virtual-entries.ts +70 -17
  1143. package/src/vite/rango.ts +135 -134
  1144. package/src/vite/router-discovery.ts +21 -8
  1145. package/src/vite/utils/ast-handler-extract.ts +11 -20
  1146. package/src/vite/utils/bundle-analysis.ts +6 -13
  1147. package/src/vite/utils/client-chunks.ts +0 -6
  1148. package/src/vite/utils/directive-prologue.ts +40 -0
  1149. package/src/vite/utils/forward-user-plugins.ts +0 -22
  1150. package/src/vite/utils/manifest-utils.ts +4 -75
  1151. package/src/vite/utils/package-resolution.ts +1 -73
  1152. package/src/vite/utils/prerender-utils.ts +54 -40
  1153. package/src/vite/utils/shared-utils.ts +8 -37
  1154. package/src/browser/shallow.ts +0 -40
  1155. package/src/router/middleware-cookies.ts +0 -55
@@ -1,6 +1,6 @@
1
1
  // src/vite/rango.ts
2
2
  import { readFileSync as readFileSync7 } from "node:fs";
3
- import { resolve as resolve9 } from "node:path";
3
+ import { resolve as resolve10 } from "node:path";
4
4
 
5
5
  // src/vite/plugins/expose-action-id.ts
6
6
  import MagicString from "magic-string";
@@ -10,6 +10,13 @@ import fs from "node:fs";
10
10
  // src/vite/plugins/expose-id-utils.ts
11
11
  import path from "node:path";
12
12
  import crypto from "node:crypto";
13
+
14
+ // src/regex-escape.ts
15
+ function escapeRegExp(input) {
16
+ return input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
17
+ }
18
+
19
+ // src/vite/plugins/expose-id-utils.ts
13
20
  function normalizePath(p) {
14
21
  return p.split(path.sep).join("/");
15
22
  }
@@ -158,7 +165,9 @@ function countArgs(code, startPos, endPos) {
158
165
  while (i < endPos) {
159
166
  const skipped = skipStringOrComment(code, i);
160
167
  if (skipped > i) {
161
- hasContent = true;
168
+ const ch = code[i];
169
+ const isComment = ch === "/" && i + 1 < code.length && (code[i + 1] === "/" || code[i + 1] === "*");
170
+ if (!isComment) hasContent = true;
162
171
  i = skipped;
163
172
  continue;
164
173
  }
@@ -187,8 +196,59 @@ function findStatementEnd(code, pos) {
187
196
  }
188
197
  return i;
189
198
  }
190
- function escapeRegExp(input) {
191
- return input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
199
+ function findCallParenAfterGenerics(code, afterCalleeIndex) {
200
+ let i = afterCalleeIndex;
201
+ while (i < code.length) {
202
+ const skipped = skipStringOrComment(code, i);
203
+ if (skipped > i) {
204
+ i = skipped;
205
+ continue;
206
+ }
207
+ if (/\s/.test(code[i])) {
208
+ i++;
209
+ continue;
210
+ }
211
+ break;
212
+ }
213
+ if (i >= code.length) return -1;
214
+ if (code[i] === "(") return i;
215
+ if (code[i] === "<") {
216
+ let depth = 0;
217
+ while (i < code.length) {
218
+ const skipped = skipStringOrComment(code, i);
219
+ if (skipped > i) {
220
+ i = skipped;
221
+ continue;
222
+ }
223
+ const ch = code[i];
224
+ if (ch === "<") {
225
+ depth++;
226
+ } else if (ch === ">") {
227
+ depth--;
228
+ if (depth === 0) {
229
+ i++;
230
+ break;
231
+ }
232
+ }
233
+ i++;
234
+ }
235
+ if (depth !== 0) return -1;
236
+ while (i < code.length) {
237
+ const skipped = skipStringOrComment(code, i);
238
+ if (skipped > i) {
239
+ i = skipped;
240
+ continue;
241
+ }
242
+ if (/\s/.test(code[i])) {
243
+ i++;
244
+ continue;
245
+ }
246
+ break;
247
+ }
248
+ if (i < code.length && code[i] === "(") return i;
249
+ return -1;
250
+ }
251
+ return -1;
192
252
  }
193
253
 
194
254
  // src/vite/debug.ts
@@ -431,7 +491,6 @@ function exposeActionId() {
431
491
  counterTransform?.record(id, performance.now() - start);
432
492
  }
433
493
  },
434
- // Build mode: renderChunk runs after all transforms and bundling complete
435
494
  renderChunk(code, chunk) {
436
495
  const start = counterRender ? performance.now() : 0;
437
496
  try {
@@ -473,10 +532,10 @@ import path4 from "node:path";
473
532
  function isDirectivePrologueStatement(node) {
474
533
  return node?.type === "ExpressionStatement" && typeof node.directive === "string";
475
534
  }
476
- function findImportInsertionPos(code, parseAst4) {
535
+ function findImportInsertionPos(code, parseAst5) {
477
536
  let program;
478
537
  try {
479
- program = parseAst4(code, { lang: "tsx" });
538
+ program = parseAst5(code, { lang: "tsx" });
480
539
  } catch {
481
540
  return 0;
482
541
  }
@@ -513,10 +572,10 @@ function walkNode(node, parent, ancestors, enter) {
513
572
  }
514
573
  ancestors.pop();
515
574
  }
516
- function findHandlerCalls(code, fnName, parseAst4) {
575
+ function findHandlerCalls(code, fnName, parseAst5) {
517
576
  let program;
518
577
  try {
519
- program = parseAst4(code, { lang: "tsx" });
578
+ program = parseAst5(code, { lang: "tsx" });
520
579
  } catch {
521
580
  return [];
522
581
  }
@@ -588,18 +647,18 @@ function getImportedLocalNamesFromProgram(program, importedName) {
588
647
  }
589
648
  return localNames;
590
649
  }
591
- function getImportedLocalNames(code, importedName, parseAst4) {
650
+ function getImportedLocalNames(code, importedName, parseAst5) {
592
651
  try {
593
- const program = parseAst4(code, { lang: "tsx" });
652
+ const program = parseAst5(code, { lang: "tsx" });
594
653
  return getImportedLocalNamesFromProgram(program, importedName);
595
654
  } catch {
596
655
  return /* @__PURE__ */ new Set();
597
656
  }
598
657
  }
599
- function extractImportDeclarations(code, parseAst4) {
658
+ function extractImportDeclarations(code, parseAst5) {
600
659
  let program;
601
660
  try {
602
- program = parseAst4(code, { lang: "tsx" });
661
+ program = parseAst5(code, { lang: "tsx" });
603
662
  } catch {
604
663
  return [];
605
664
  }
@@ -623,13 +682,18 @@ function isInertExpression(node) {
623
682
  (e) => e === null || isInertExpression(e)
624
683
  );
625
684
  case "ObjectExpression":
626
- return (node.properties ?? []).every(
627
- (p) => p.type === "Property" && (!p.computed || isInertExpression(p.key)) && isInertExpression(p.value)
628
- );
685
+ return (node.properties ?? []).every((p) => {
686
+ if (p.type === "SpreadElement" || p.type === "RestElement") {
687
+ return isInertExpression(p.argument);
688
+ }
689
+ return p.type === "Property" && (!p.computed || isInertExpression(p.key)) && isInertExpression(p.value);
690
+ });
629
691
  case "UnaryExpression":
630
692
  return isInertExpression(node.argument);
631
693
  case "BinaryExpression":
632
694
  return isInertExpression(node.left) && isInertExpression(node.right);
695
+ case "LogicalExpression":
696
+ return isInertExpression(node.left) && isInertExpression(node.right);
633
697
  case "ConditionalExpression":
634
698
  return isInertExpression(node.test) && isInertExpression(node.consequent) && isInertExpression(node.alternate);
635
699
  case "SpreadElement":
@@ -651,10 +715,10 @@ function isSafeVariableDeclaration(node, handlerNames) {
651
715
  (d) => isSafeDeclaratorInit(d.init) && !(d.init?.type === "CallExpression" && d.init.callee?.type === "Identifier" && handlerNames.has(d.init.callee.name))
652
716
  );
653
717
  }
654
- function extractModuleLevelDeclarations(code, parseAst4, handlerNames) {
718
+ function extractModuleLevelDeclarations(code, parseAst5, handlerNames) {
655
719
  let program;
656
720
  try {
657
- program = parseAst4(code, { lang: "tsx" });
721
+ program = parseAst5(code, { lang: "tsx" });
658
722
  } catch {
659
723
  return [];
660
724
  }
@@ -685,17 +749,17 @@ function extractModuleLevelDeclarations(code, parseAst4, handlerNames) {
685
749
  }
686
750
  return declarations;
687
751
  }
688
- function transformInlineHandlers(fnName, virtualPrefix, s, code, filePath, virtualRegistry, moduleId, parseAst4) {
689
- const sites = findHandlerCalls(code, fnName, parseAst4);
752
+ function transformInlineHandlers(fnName, virtualPrefix, s, code, filePath, virtualRegistry, moduleId, parseAst5) {
753
+ const sites = findHandlerCalls(code, fnName, parseAst5);
690
754
  const inlineSites = sites.filter((site) => site.exportInfo === null);
691
755
  if (inlineSites.length === 0) return false;
692
- const imports = extractImportDeclarations(code, parseAst4);
693
- const staticNames = getImportedLocalNames(code, "Static", parseAst4);
694
- const prerenderNames = getImportedLocalNames(code, "Prerender", parseAst4);
756
+ const imports = extractImportDeclarations(code, parseAst5);
757
+ const staticNames = getImportedLocalNames(code, "Static", parseAst5);
758
+ const prerenderNames = getImportedLocalNames(code, "Prerender", parseAst5);
695
759
  const handlerNames = /* @__PURE__ */ new Set([...staticNames, ...prerenderNames]);
696
760
  const declarations = extractModuleLevelDeclarations(
697
761
  code,
698
- parseAst4,
762
+ parseAst5,
699
763
  handlerNames
700
764
  );
701
765
  const importStatements = [];
@@ -718,7 +782,7 @@ function transformInlineHandlers(fnName, virtualPrefix, s, code, filePath, virtu
718
782
  }
719
783
  if (importStatements.length > 0) {
720
784
  const importBlock = importStatements.join("\n") + "\n";
721
- const insertionPos = findImportInsertionPos(code, parseAst4);
785
+ const insertionPos = findImportInsertionPos(code, parseAst5);
722
786
  if (insertionPos === 0) {
723
787
  s.prepend(importBlock);
724
788
  } else {
@@ -751,25 +815,55 @@ function isLineTerminator(ch) {
751
815
  const c = ch.charCodeAt(0);
752
816
  return c === 10 || c === 13 || c === 8232 || c === 8233;
753
817
  }
818
+ var REGEX_PRECEDING_KEYWORDS = /* @__PURE__ */ new Set([
819
+ "return",
820
+ "typeof",
821
+ "instanceof",
822
+ "in",
823
+ "of",
824
+ "new",
825
+ "delete",
826
+ "void",
827
+ "do",
828
+ "else",
829
+ "yield",
830
+ "await",
831
+ "case",
832
+ "throw"
833
+ ]);
834
+ function isRegexPositionAt(code, slashPos, prevChar) {
835
+ if (prevChar === void 0) return true;
836
+ if (prevChar === ")" || prevChar === "]" || prevChar === "}") return false;
837
+ if (!/[\w$]/.test(prevChar)) return true;
838
+ let k = slashPos - 1;
839
+ while (k >= 0 && /\s/.test(code[k])) k--;
840
+ const wordEnd = k + 1;
841
+ while (k >= 0 && /[\w$]/.test(code[k])) k--;
842
+ return REGEX_PRECEDING_KEYWORDS.has(code.slice(k + 1, wordEnd));
843
+ }
754
844
  function makeCodeClassifier(code) {
755
845
  const n = code.length;
756
846
  let i = 0;
757
847
  let skipStart = -1;
758
848
  let skipEnd = -1;
849
+ let lastSig;
759
850
  return (q) => {
760
851
  if (q >= skipStart && q < skipEnd) return false;
761
852
  while (i < n && i <= q) {
762
853
  const c = code[i];
763
854
  const d = i + 1 < n ? code[i + 1] : "";
764
855
  let end = -1;
856
+ let transparent = false;
765
857
  if (c === "/" && d === "/") {
766
858
  let j = i + 2;
767
859
  while (j < n && !isLineTerminator(code[j])) j++;
768
860
  end = j;
861
+ transparent = true;
769
862
  } else if (c === "/" && d === "*") {
770
863
  let j = i + 2;
771
864
  while (j < n && !(code[j] === "*" && code[j + 1] === "/")) j++;
772
865
  end = Math.min(n, j + 2);
866
+ transparent = true;
773
867
  } else if (c === '"' || c === "'" || c === "`") {
774
868
  let j = i + 1;
775
869
  while (j < n) {
@@ -784,6 +878,29 @@ function makeCodeClassifier(code) {
784
878
  j++;
785
879
  }
786
880
  end = j;
881
+ } else if (c === "/" && d !== "/" && d !== "*" && isRegexPositionAt(code, i, lastSig)) {
882
+ let j = i + 1;
883
+ let inClass = false;
884
+ let closed = false;
885
+ while (j < n && !isLineTerminator(code[j])) {
886
+ const r = code[j];
887
+ if (r === "\\") {
888
+ j += 2;
889
+ continue;
890
+ }
891
+ if (r === "[") inClass = true;
892
+ else if (r === "]") inClass = false;
893
+ else if (r === "/" && !inClass) {
894
+ j++;
895
+ closed = true;
896
+ break;
897
+ }
898
+ j++;
899
+ }
900
+ if (closed) {
901
+ while (j < n && /[a-z]/.test(code[j])) j++;
902
+ end = j;
903
+ }
787
904
  }
788
905
  if (end >= 0) {
789
906
  if (q < end) {
@@ -792,7 +909,9 @@ function makeCodeClassifier(code) {
792
909
  return false;
793
910
  }
794
911
  i = end;
912
+ if (!transparent) lastSig = "x";
795
913
  } else {
914
+ if (!/\s/.test(c)) lastSig = c;
796
915
  i++;
797
916
  }
798
917
  }
@@ -851,13 +970,23 @@ function isExportOnlyFile(code, bindings) {
851
970
  return true;
852
971
  }
853
972
  function createCallPattern(fnNames) {
854
- return new RegExp(
855
- `\\b(?:${fnNames.map(escapeRegExp).join("|")})\\s*(?:<[^>]*>\\s*)?\\(`,
856
- "g"
973
+ return new RegExp(`\\b(?:${fnNames.map(escapeRegExp).join("|")})\\b`, "g");
974
+ }
975
+ function createCallStartIndices(code, fnNames) {
976
+ return codeMatchIndices(code, createCallPattern(fnNames)).filter(
977
+ (index) => findCallParenAfterGenerics(
978
+ code,
979
+ index + matchedNameLength(code, index)
980
+ ) !== -1
857
981
  );
858
982
  }
983
+ function matchedNameLength(code, index) {
984
+ let i = index;
985
+ while (i < code.length && /[A-Za-z0-9_$]/.test(code[i])) i++;
986
+ return i - index;
987
+ }
859
988
  function countCreateCallsForNames(code, fnNames) {
860
- return codeMatchIndices(code, createCallPattern(fnNames)).length;
989
+ return createCallStartIndices(code, fnNames).length;
861
990
  }
862
991
  function offsetToLineColumn(code, index) {
863
992
  let line = 1;
@@ -873,7 +1002,7 @@ function offsetToLineColumn(code, index) {
873
1002
  }
874
1003
  function findUnsupportedCreateCallSites(code, fnNames, supportedBindings) {
875
1004
  const supported = new Set(supportedBindings.map((b) => b.callExprStart));
876
- return codeMatchIndices(code, createCallPattern(fnNames)).filter((index) => !supported.has(index)).map((index) => offsetToLineColumn(code, index));
1005
+ return createCallStartIndices(code, fnNames).filter((index) => !supported.has(index)).map((index) => offsetToLineColumn(code, index));
877
1006
  }
878
1007
  function getImportedFnNames(code, importedName) {
879
1008
  const importPattern = /import\s*\{([^}]*)\}\s*from\s*["']@rangojs\/router(?:\/[^"']*)?["']/g;
@@ -1067,11 +1196,13 @@ function generateClientLoaderStubs(bindings, code, filePath, isBuild) {
1067
1196
  if (!isExportOnlyFile(code, bindings)) return null;
1068
1197
  const lines = [];
1069
1198
  for (const binding of bindings) {
1070
- for (const name of binding.exportNames) {
1071
- const loaderId = makeStubId(filePath, name, isBuild);
1072
- lines.push(
1073
- `export const ${name} = { __brand: "loader", $$id: "${loaderId}" };`
1074
- );
1199
+ const primaryName = binding.exportNames[0];
1200
+ const loaderId = makeStubId(filePath, primaryName, isBuild);
1201
+ lines.push(
1202
+ `export const ${primaryName} = { __brand: "loader", $$id: "${loaderId}" };`
1203
+ );
1204
+ for (const alias of binding.exportNames.slice(1)) {
1205
+ lines.push(`export const ${alias} = ${primaryName};`);
1075
1206
  }
1076
1207
  }
1077
1208
  return { code: lines.join("\n") + "\n" };
@@ -1092,22 +1223,13 @@ ${binding.localName}.$$id = "${loaderId}";`;
1092
1223
  }
1093
1224
 
1094
1225
  // src/vite/plugins/expose-ids/handler-transform.ts
1095
- function analyzeCreateHandleArgs(code, startPos, endPos) {
1096
- const content = code.slice(startPos, endPos).trim();
1097
- return { hasArgs: content.length > 0 };
1098
- }
1099
- function transformHandles(bindings, s, code, filePath, isBuild) {
1226
+ function transformHandles(bindings, s, filePath, isBuild) {
1100
1227
  let hasChanges = false;
1101
1228
  for (const binding of bindings) {
1102
1229
  const exportName = binding.exportNames[0];
1103
- const args = analyzeCreateHandleArgs(
1104
- code,
1105
- binding.callOpenParenPos + 1,
1106
- binding.callCloseParenPos
1107
- );
1108
1230
  const handleId = makeStubId(filePath, exportName, isBuild);
1109
1231
  let paramInjection;
1110
- if (!args.hasArgs) {
1232
+ if (binding.argCount === 0) {
1111
1233
  paramInjection = `undefined, "${handleId}"`;
1112
1234
  } else {
1113
1235
  paramInjection = `, "${handleId}"`;
@@ -1182,36 +1304,68 @@ import MagicString2 from "magic-string";
1182
1304
  import path3 from "node:path";
1183
1305
  import { createHash } from "node:crypto";
1184
1306
  var debug2 = createRangoDebugger(NS.transform);
1185
- function transformRouter(code, filePath, routerFnNames, absolutePath) {
1307
+ function skipLeadingTrivia(code, start, end) {
1308
+ let i = start;
1309
+ while (i < end) {
1310
+ const skipped = skipStringOrComment(code, i);
1311
+ if (skipped > i) {
1312
+ i = skipped;
1313
+ continue;
1314
+ }
1315
+ if (/\s/.test(code[i])) {
1316
+ i++;
1317
+ continue;
1318
+ }
1319
+ break;
1320
+ }
1321
+ return i;
1322
+ }
1323
+ function transformRouter(code, filePath, routerFnNames, absolutePath, warn) {
1186
1324
  const pat = new RegExp(
1187
- `\\b(?:${routerFnNames.map((n) => n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|")})\\s*(?:<[^>]*>)?\\s*\\(`,
1325
+ `\\b(?:${routerFnNames.map(escapeRegExp).join("|")})\\b`,
1188
1326
  "g"
1189
1327
  );
1190
1328
  let match;
1191
1329
  const s = new MagicString2(code);
1192
1330
  let changed = false;
1331
+ const unsupportedSites = [];
1193
1332
  const basename2 = path3.basename(filePath).replace(/\.(tsx?|jsx?)$/, "");
1194
1333
  const routeNamesImport = `./${basename2}.named-routes.gen.js`;
1195
1334
  const routeNamesVar = `__rsc_rn`;
1335
+ const codeOffsets = new Set(codeMatchIndices(code, pat));
1336
+ pat.lastIndex = 0;
1196
1337
  while ((match = pat.exec(code)) !== null) {
1338
+ if (!codeOffsets.has(match.index)) continue;
1197
1339
  const callStart = match.index;
1198
- const parenPos = match.index + match[0].length - 1;
1340
+ const calleeEnd = match.index + match[0].length;
1341
+ const parenPos = findCallParenAfterGenerics(code, calleeEnd);
1342
+ if (parenPos === -1) continue;
1199
1343
  const closeParen = findMatchingParen(code, parenPos + 1);
1200
1344
  const callArgs = code.slice(parenPos + 1, closeParen);
1201
- if (callArgs.includes("$$id")) continue;
1345
+ if (callArgs.includes(`$$routeNames: ${routeNamesVar}`)) continue;
1346
+ const sourceFilePath = absolutePath ?? filePath;
1202
1347
  const lineNumber = code.slice(0, callStart).split("\n").length;
1203
1348
  const hash = createHash("sha256").update(`${filePath}:${lineNumber}`).digest("hex").slice(0, 8);
1204
- changed = true;
1205
- const sourceFilePath = absolutePath ?? filePath;
1206
1349
  const injected = ` $$id: "${hash}", $$sourceFile: "${sourceFilePath}", $$routeNames: ${routeNamesVar},`;
1207
- const afterParen = callArgs.trimStart();
1208
- if (afterParen.startsWith("{")) {
1209
- const bracePos = code.indexOf("{", parenPos + 1);
1210
- s.appendRight(bracePos + 1, injected);
1211
- } else if (afterParen.startsWith(")")) {
1350
+ const argsContentStart = skipLeadingTrivia(code, parenPos + 1, closeParen);
1351
+ const firstArgChar = code[argsContentStart];
1352
+ if (firstArgChar === "{") {
1353
+ changed = true;
1354
+ s.appendRight(argsContentStart + 1, injected);
1355
+ } else if (argsContentStart >= closeParen - 1) {
1356
+ changed = true;
1212
1357
  s.appendRight(parenPos + 1, `{${injected} }`);
1358
+ } else {
1359
+ const lastNl = code.lastIndexOf("\n", callStart - 1);
1360
+ const column = callStart - (lastNl + 1) + 1;
1361
+ unsupportedSites.push({ line: lineNumber, column });
1213
1362
  }
1214
1363
  }
1364
+ if (unsupportedSites.length > 0 && warn) {
1365
+ warn(
1366
+ buildUnsupportedShapeWarning(filePath, "createRouter", unsupportedSites)
1367
+ );
1368
+ }
1215
1369
  if (!changed) return null;
1216
1370
  s.prepend(
1217
1371
  `import { NamedRoutes as ${routeNamesVar} } from "${routeNamesImport}";
@@ -1245,11 +1399,13 @@ function exposeRouterId() {
1245
1399
  try {
1246
1400
  const filePath = normalizePath(path3.relative(projectRoot, id));
1247
1401
  const routerFnNames = getImportedFnNames(code, "createRouter");
1402
+ const warn = typeof this.warn === "function" ? (message) => this.warn(message) : void 0;
1248
1403
  return transformRouter(
1249
1404
  code,
1250
1405
  filePath,
1251
1406
  routerFnNames,
1252
- normalizePath(id)
1407
+ normalizePath(id),
1408
+ warn
1253
1409
  );
1254
1410
  } finally {
1255
1411
  counter?.record(id, performance.now() - start);
@@ -1345,6 +1501,7 @@ ${lazyImports.join(",\n")}
1345
1501
  // --------------- Loader pre-scan (build mode) ---------------
1346
1502
  async buildStart() {
1347
1503
  if (!isBuild) return;
1504
+ if (this.environment && this.environment.name !== "rsc") return;
1348
1505
  const fs2 = await import("node:fs/promises");
1349
1506
  const SKIP_DIRS = /* @__PURE__ */ new Set(["node_modules", "dist", "build", "coverage"]);
1350
1507
  async function scanDir(dir) {
@@ -1729,7 +1886,6 @@ ${lazyImports.join(",\n")}
1729
1886
  changed = transformHandles(
1730
1887
  getBindings(code, fnNames),
1731
1888
  s,
1732
- code,
1733
1889
  filePath,
1734
1890
  isBuild
1735
1891
  ) || changed;
@@ -1806,8 +1962,8 @@ function useCacheTransform() {
1806
1962
  } = rscTransforms;
1807
1963
  let ast;
1808
1964
  try {
1809
- const { parseAst: parseAst4 } = await import("vite");
1810
- ast = parseAst4(code, { lang: "tsx" });
1965
+ const { parseAst: parseAst5 } = await import("vite");
1966
+ ast = parseAst5(code, { lang: "tsx" });
1811
1967
  } catch {
1812
1968
  return;
1813
1969
  }
@@ -1841,7 +1997,7 @@ function useCacheTransform() {
1841
1997
  };
1842
1998
  }
1843
1999
  function transformFileLevelUseCache(code, ast, filePath, sourceId, isBuild, isLayoutOrTemplate, transformWrapExport) {
1844
- const nonFunctionExports = [];
2000
+ const unconfirmedExports = [];
1845
2001
  const { exportNames, output } = transformWrapExport(code, ast, {
1846
2002
  runtime: (value, name) => {
1847
2003
  const funcId = isBuild ? hashId(filePath, name) : `${filePath}#${name}`;
@@ -1850,16 +2006,17 @@ function transformFileLevelUseCache(code, ast, filePath, sourceId, isBuild, isLa
1850
2006
  rejectNonAsyncFunction: false,
1851
2007
  filter: (name, meta) => {
1852
2008
  if (name === "default" && isLayoutOrTemplate) return false;
1853
- if (meta.isFunction === false) {
1854
- nonFunctionExports.push(name);
2009
+ if (meta.isFunction !== true) {
2010
+ unconfirmedExports.push(name);
1855
2011
  return false;
1856
2012
  }
1857
2013
  return true;
1858
2014
  }
1859
2015
  });
1860
- if (nonFunctionExports.length > 0) {
2016
+ if (unconfirmedExports.length > 0) {
2017
+ const plural = unconfirmedExports.length > 1;
1861
2018
  throw new Error(
1862
- `[rango:use-cache] File-level "use cache" in ${sourceId} cannot wrap non-function export${nonFunctionExports.length > 1 ? "s" : ""}: ${nonFunctionExports.map((n) => `"${n}"`).join(", ")}. Only function exports can be cached. Either remove "use cache" from the file level and add it inside individual functions, or move the non-function exports to a separate module.`
2019
+ `[rango:use-cache] File-level "use cache" in ${sourceId} only wraps exports that are statically-confirmed functions. ${plural ? "These exports are" : "This export is"} not: ${unconfirmedExports.map((n) => `"${n}"`).join(", ")}. Declare them directly (export async function foo() {} or export const foo = async () => {}). A factory or otherwise statically-indeterminate initializer (export const foo = makeCached(fn)) is rejected even if it returns a function at runtime -- rewrite it as a direct async function, or move non-function exports to a separate module.`
1863
2020
  );
1864
2021
  }
1865
2022
  if (exportNames.length === 0) {
@@ -1997,7 +2154,6 @@ function clientRefDedup() {
1997
2154
  if (this.environment?.name !== "client") return;
1998
2155
  if (!importer?.includes(CLIENT_IN_SERVER_PROXY_PREFIX)) return;
1999
2156
  if (!source.includes("/node_modules/")) return;
2000
- if (!importer) return;
2001
2157
  const packageName = extractPackageName(source);
2002
2158
  if (!packageName) return;
2003
2159
  if (clientExclude.includes(packageName)) return;
@@ -2039,11 +2195,16 @@ async function initializeApp() {
2039
2195
  createTemporaryReferenceSet,
2040
2196
  };
2041
2197
 
2042
- await initBrowserApp({ rscStream, deps });
2198
+ // initBrowserApp resolves the initial payload and returns the browser app
2199
+ // context, including strictMode (default true) from createRouter. StrictMode
2200
+ // is the default; createRouter({ strictMode: false }) ships the opt-out in the
2201
+ // payload metadata. StrictMode emits no DOM, so toggling never changes markup.
2202
+ const { strictMode } = await initBrowserApp({ rscStream, deps });
2043
2203
 
2204
+ const app = createElement(Rango);
2044
2205
  hydrateRoot(
2045
2206
  document,
2046
- createElement(StrictMode, null, createElement(Rango))
2207
+ strictMode === false ? app : createElement(StrictMode, null, app)
2047
2208
  );
2048
2209
  }
2049
2210
 
@@ -2096,6 +2257,11 @@ export default function handler(request, env) {
2096
2257
  _handler = createRSCHandler({
2097
2258
  router,
2098
2259
  version: VERSION,
2260
+ // Forward the router's CSP nonce provider. createRSCHandler reads the
2261
+ // provider only from options.nonce; without this, createRouter({ nonce })
2262
+ // is silently dropped on the Node preset (the Cloudflare path wires it via
2263
+ // router.fetch). router.nonce is undefined when unconfigured, a safe no-op.
2264
+ nonce: router.nonce,
2099
2265
  deps: {
2100
2266
  renderToReadableStream,
2101
2267
  decodeReply,
@@ -2112,6 +2278,63 @@ export default function handler(request, env) {
2112
2278
  }
2113
2279
  `.trim();
2114
2280
  }
2281
+ function getVirtualEntryRSCHost(hostEntryPath) {
2282
+ return `
2283
+ import * as __hostEntry from "${hostEntryPath}";
2284
+ import { NoRouteMatchError } from "@rangojs/router/host";
2285
+
2286
+ // Register every sub-app's fetchable loaders + route manifests at startup, same
2287
+ // as the single-router entry. Discovery's host fallback populates these for all
2288
+ // mounted sub-apps, so the aggregate manifests cover the whole host tree.
2289
+ import "virtual:rsc-router/loader-manifest";
2290
+ import "virtual:rsc-router/routes-manifest";
2291
+
2292
+ // The host entry module must export the HostRouter instance (createHostRouter()),
2293
+ // as a default export or a named \`hostRouter\`/\`router\` export. A Cloudflare-style
2294
+ // \`export default { fetch }\` object is not a HostRouter and is rejected here.
2295
+ // We require BOTH .match() and .host(): a regular createRouter() also exposes
2296
+ // .match(), so matching on .match() alone would accept an ordinary router and then
2297
+ // return its MatchResult (not a Response) at runtime. .host() is unique to a
2298
+ // HostRouter, so it disambiguates a mistaken \`hostRouter\` path at build time.
2299
+ // Exports are read dynamically (m[name]) so Rollup does not emit IMPORT_IS_UNDEFINED
2300
+ // warnings for the named exports a default-only host module legitimately omits.
2301
+ const __resolveHostRouter = (m) => {
2302
+ for (const name of ["default", "hostRouter", "router"]) {
2303
+ const candidate = m[name];
2304
+ if (
2305
+ candidate &&
2306
+ typeof candidate.match === "function" &&
2307
+ typeof candidate.host === "function"
2308
+ )
2309
+ return candidate;
2310
+ }
2311
+ return undefined;
2312
+ };
2313
+ const hostRouter = __resolveHostRouter(__hostEntry);
2314
+
2315
+ if (!hostRouter) {
2316
+ throw new Error(
2317
+ "[rango] The host entry (${hostEntryPath}) must export a HostRouter instance (createHostRouter()) for the node/vercel preset: a default export, or a named 'hostRouter'/'router' export. An ordinary createRouter() is not a host router (it has no .host()), and a Cloudflare-style 'export default { fetch }' object is not supported on this preset."
2318
+ );
2319
+ }
2320
+
2321
+ // input = { env, ctx } from the launcher / node server. The host router threads
2322
+ // it unchanged to each matched sub-app's handler and cache factory.
2323
+ // On node/vercel rango owns this entry, so there is no user worker to translate
2324
+ // an unmatched host into a response: catch NoRouteMatchError and return 404
2325
+ // (parity with the documented Cloudflare catch). Other errors propagate.
2326
+ export default async function handler(request, input) {
2327
+ try {
2328
+ return await hostRouter.match(request, input);
2329
+ } catch (err) {
2330
+ if (err instanceof NoRouteMatchError) {
2331
+ return new Response("Not Found", { status: 404 });
2332
+ }
2333
+ throw err;
2334
+ }
2335
+ }
2336
+ `.trim();
2337
+ }
2115
2338
  var VIRTUAL_IDS = {
2116
2339
  browser: "virtual:rsc-router/entry.browser.js",
2117
2340
  ssr: "virtual:rsc-router/entry.ssr.js",
@@ -2130,7 +2353,7 @@ import { resolve } from "node:path";
2130
2353
  // package.json
2131
2354
  var package_default = {
2132
2355
  name: "@rangojs/router",
2133
- version: "0.0.0-experimental.e16b7c00",
2356
+ version: "0.0.0-experimental.e9c0b2f2",
2134
2357
  description: "Django-inspired RSC router with composable URL patterns",
2135
2358
  keywords: [
2136
2359
  "react",
@@ -2240,6 +2463,16 @@ var package_default = {
2240
2463
  "react-server": "./src/cache/cache-runtime.ts",
2241
2464
  default: "./src/cache/cache-runtime.ts"
2242
2465
  },
2466
+ "./cloudflare": {
2467
+ types: "./src/cloudflare/index.ts",
2468
+ "react-server": "./src/cloudflare/index.ts",
2469
+ default: "./src/cloudflare/index.ts"
2470
+ },
2471
+ "./vercel": {
2472
+ types: "./src/vercel/index.ts",
2473
+ "react-server": "./src/vercel/index.ts",
2474
+ default: "./src/vercel/index.ts"
2475
+ },
2243
2476
  "./theme": {
2244
2477
  types: "./src/theme/index.ts",
2245
2478
  default: "./src/theme/index.ts"
@@ -2256,6 +2489,31 @@ var package_default = {
2256
2489
  "./host/testing": {
2257
2490
  types: "./src/host/testing.ts",
2258
2491
  default: "./src/host/testing.ts"
2492
+ },
2493
+ "./testing": {
2494
+ types: "./src/testing/index.ts",
2495
+ default: "./src/testing/index.ts"
2496
+ },
2497
+ "./testing/vitest": {
2498
+ types: "./src/testing/vitest.ts",
2499
+ default: "./dist/testing/vitest.js"
2500
+ },
2501
+ "./testing/dom": {
2502
+ types: "./src/testing/dom.entry.ts",
2503
+ default: "./src/testing/dom.entry.ts"
2504
+ },
2505
+ "./testing/e2e": {
2506
+ types: "./src/testing/e2e/index.ts",
2507
+ default: "./src/testing/e2e/index.ts"
2508
+ },
2509
+ "./testing/flight": {
2510
+ types: "./src/testing/flight.entry.ts",
2511
+ "react-server": "./src/testing/flight.entry.ts",
2512
+ default: "./src/testing/flight.entry.ts"
2513
+ },
2514
+ "./testing/flight-matchers": {
2515
+ types: "./src/testing/flight-matchers.ts",
2516
+ default: "./src/testing/flight-matchers.ts"
2259
2517
  }
2260
2518
  },
2261
2519
  publishConfig: {
@@ -2263,51 +2521,80 @@ var package_default = {
2263
2521
  tag: "experimental"
2264
2522
  },
2265
2523
  scripts: {
2266
- 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",
2524
+ build: "pnpm exec 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 exec esbuild src/testing/vitest.ts --bundle --format=esm --outfile=dist/testing/vitest.js --platform=node --packages=external && pnpm exec 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",
2267
2525
  prepublishOnly: "pnpm build",
2268
2526
  typecheck: "tsc --noEmit && tsc -p tsconfig.strict-check.json --noEmit && tsc -p tsconfig.augment-check.json --noEmit",
2269
2527
  test: "playwright test",
2270
2528
  "test:ui": "playwright test --ui",
2271
2529
  "test:hmr-local": "playwright test --project=dev-warmup --project=hmr-routes --project=hmr-basename --project=hmr-prerender --no-deps --workers=1",
2272
2530
  "test:unit": "vitest run",
2273
- "test:unit:watch": "vitest"
2531
+ "test:unit:watch": "vitest",
2532
+ "test:unit:rsc": "vitest run --config vitest.rsc.config.ts"
2274
2533
  },
2275
2534
  dependencies: {
2276
2535
  "@types/debug": "^4.1.12",
2277
2536
  "@vitejs/plugin-rsc": "^0.5.26",
2278
2537
  debug: "^4.4.1",
2279
2538
  "magic-string": "^0.30.17",
2280
- picomatch: "^4.0.3",
2281
- "rsc-html-stream": "^0.0.7"
2539
+ picomatch: "^4.0.4",
2540
+ "rsc-html-stream": "^0.0.7",
2541
+ srvx: "^0.11.15",
2542
+ tinyexec: "^0.3.2"
2282
2543
  },
2283
2544
  devDependencies: {
2545
+ "@opentelemetry/api": "^1.9.0",
2284
2546
  "@playwright/test": "^1.49.1",
2285
2547
  "@shared/e2e": "workspace:*",
2548
+ "@testing-library/dom": "^10.4.1",
2549
+ "@testing-library/react": "^16.3.2",
2286
2550
  "@types/node": "^24.10.1",
2287
2551
  "@types/react": "catalog:",
2288
2552
  "@types/react-dom": "catalog:",
2289
2553
  esbuild: "^0.27.0",
2554
+ "happy-dom": "^20.10.1",
2290
2555
  jiti: "^2.6.1",
2291
2556
  react: "catalog:",
2292
2557
  "react-dom": "catalog:",
2293
- tinyexec: "^0.3.2",
2294
2558
  typescript: "^5.3.0",
2295
2559
  vitest: "^4.0.0"
2296
2560
  },
2297
2561
  peerDependencies: {
2298
2562
  "@cloudflare/vite-plugin": "^1.38.0",
2563
+ "@opentelemetry/api": "^1.9.0",
2564
+ "@playwright/test": "^1.49.1",
2565
+ "@testing-library/react": ">=16",
2566
+ "@vercel/functions": "^3.0.0",
2299
2567
  "@vitejs/plugin-rsc": "^0.5.26",
2300
2568
  react: ">=19.2.6 <20",
2301
2569
  "react-dom": ">=19.2.6 <20",
2302
- vite: "^8.0.0"
2570
+ vite: "^8.0.0",
2571
+ vitest: ">=3"
2303
2572
  },
2304
2573
  peerDependenciesMeta: {
2305
2574
  "@cloudflare/vite-plugin": {
2306
2575
  optional: true
2307
2576
  },
2577
+ "@opentelemetry/api": {
2578
+ optional: true
2579
+ },
2580
+ "@playwright/test": {
2581
+ optional: true
2582
+ },
2583
+ "@testing-library/react": {
2584
+ optional: true
2585
+ },
2586
+ "@vercel/functions": {
2587
+ optional: true
2588
+ },
2308
2589
  vite: {
2309
2590
  optional: true
2591
+ },
2592
+ vitest: {
2593
+ optional: true
2310
2594
  }
2595
+ },
2596
+ engines: {
2597
+ node: "^20.19.0 || >=22.12.0"
2311
2598
  }
2312
2599
  };
2313
2600
 
@@ -2381,10 +2668,10 @@ function extractParamsFromPattern(pattern) {
2381
2668
  function formatRouteEntry(key, pattern, _params, search) {
2382
2669
  const hasSearch = search && Object.keys(search).length > 0;
2383
2670
  if (!hasSearch) {
2384
- return ` ${key}: "${pattern}",`;
2671
+ return ` ${key}: ${JSON.stringify(pattern)},`;
2385
2672
  }
2386
- const searchBody = Object.entries(search).map(([k, v]) => `${k}: "${v}"`).join(", ");
2387
- return ` ${key}: { path: "${pattern}", search: { ${searchBody} } },`;
2673
+ const searchBody = Object.entries(search).map(([k, v]) => `${k}: ${JSON.stringify(v)}`).join(", ");
2674
+ return ` ${key}: { path: ${JSON.stringify(pattern)}, search: { ${searchBody} } },`;
2388
2675
  }
2389
2676
 
2390
2677
  // src/build/route-types/ast-route-extraction.ts
@@ -2410,8 +2697,8 @@ function extractObjectStringProperties(node) {
2410
2697
  }
2411
2698
 
2412
2699
  // src/build/route-types/ast-route-extraction.ts
2413
- function extractRoutesFromSource(code) {
2414
- const sourceFile = ts2.createSourceFile(
2700
+ function extractRoutesFromSource(code, sourceFileArg) {
2701
+ const sourceFile = sourceFileArg ?? ts2.createSourceFile(
2415
2702
  "input.tsx",
2416
2703
  code,
2417
2704
  ts2.ScriptTarget.Latest,
@@ -2491,16 +2778,44 @@ export const NamedRoutes = {
2491
2778
  ${objectBody}
2492
2779
  } as const;
2493
2780
 
2781
+ // Aliased so the augmentation below does not pay a homomorphic mapped-type
2782
+ // instantiation per route; \`as const\` already makes the members readonly.
2783
+ type NamedRoutesShape = typeof NamedRoutes;
2784
+
2494
2785
  declare global {
2495
2786
  namespace Rango {
2496
- interface GeneratedRouteMap extends Readonly<typeof NamedRoutes> {}
2787
+ interface GeneratedRouteMap extends NamedRoutesShape {}
2497
2788
  }
2498
2789
  }
2499
2790
  `;
2500
2791
  }
2501
2792
 
2502
2793
  // src/build/route-types/scan-filter.ts
2794
+ import { join, relative } from "node:path";
2503
2795
  import picomatch from "picomatch";
2796
+ var DEFAULT_EXCLUDE_PATTERNS = [
2797
+ "**/__tests__/**",
2798
+ "**/__mocks__/**",
2799
+ "**/dist/**",
2800
+ "**/coverage/**",
2801
+ "**/*.test.{ts,tsx,js,jsx}",
2802
+ "**/*.spec.{ts,tsx,js,jsx}"
2803
+ ];
2804
+ function createScanFilter(root, opts) {
2805
+ const { include, exclude } = opts;
2806
+ const hasInclude = include && include.length > 0;
2807
+ const hasCustomExclude = exclude !== void 0;
2808
+ if (!hasInclude && !hasCustomExclude) return void 0;
2809
+ const effectiveExclude = exclude ?? DEFAULT_EXCLUDE_PATTERNS;
2810
+ const includeMatcher = hasInclude ? picomatch(include) : null;
2811
+ const excludeMatcher = effectiveExclude.length > 0 ? picomatch(effectiveExclude) : null;
2812
+ return (absolutePath) => {
2813
+ const rel = relative(root, absolutePath);
2814
+ if (excludeMatcher && excludeMatcher(rel)) return false;
2815
+ if (includeMatcher) return includeMatcher(rel);
2816
+ return true;
2817
+ };
2818
+ }
2504
2819
 
2505
2820
  // src/build/route-types/per-module-writer.ts
2506
2821
  import ts4 from "typescript";
@@ -2509,6 +2824,33 @@ import ts4 from "typescript";
2509
2824
  import { readFileSync, existsSync as existsSync2 } from "node:fs";
2510
2825
  import { dirname, resolve as resolve2 } from "node:path";
2511
2826
  import ts3 from "typescript";
2827
+ function createScanMemo() {
2828
+ return { files: /* @__PURE__ */ new Map(), blockSourceFiles: /* @__PURE__ */ new Map() };
2829
+ }
2830
+ function parseBlock(memo, block) {
2831
+ if (memo) {
2832
+ const cached = memo.blockSourceFiles.get(block);
2833
+ if (cached) return cached;
2834
+ }
2835
+ const sf = ts3.createSourceFile(
2836
+ "input.tsx",
2837
+ block,
2838
+ ts3.ScriptTarget.Latest,
2839
+ true,
2840
+ ts3.ScriptKind.TSX
2841
+ );
2842
+ if (memo) memo.blockSourceFiles.set(block, sf);
2843
+ return sf;
2844
+ }
2845
+ function readSourceMemoized(memo, realPath) {
2846
+ if (memo) {
2847
+ const cached = memo.files.get(realPath);
2848
+ if (cached !== void 0) return cached;
2849
+ }
2850
+ const source = readFileSync(realPath, "utf-8");
2851
+ if (memo) memo.files.set(realPath, source);
2852
+ return source;
2853
+ }
2512
2854
  function extractNamePrefixFromInclude(node) {
2513
2855
  if (node.arguments.length >= 3) {
2514
2856
  const thirdArg = node.arguments[2];
@@ -2524,8 +2866,8 @@ function extractNamePrefixFromInclude(node) {
2524
2866
  }
2525
2867
  return null;
2526
2868
  }
2527
- function extractIncludesWithDiagnostics(code) {
2528
- const sourceFile = ts3.createSourceFile(
2869
+ function extractIncludesWithDiagnostics(code, sourceFileArg) {
2870
+ const sourceFile = sourceFileArg ?? ts3.createSourceFile(
2529
2871
  "input.tsx",
2530
2872
  code,
2531
2873
  ts3.ScriptTarget.Latest,
@@ -2579,7 +2921,7 @@ function extractIncludesWithDiagnostics(code) {
2579
2921
  return { resolved, unresolvable };
2580
2922
  }
2581
2923
  function resolveImportedVariable(code, localName) {
2582
- const importRegex = /import\s*\{([^}]+)\}\s*from\s*["']([^"']+)["']/g;
2924
+ const importRegex = /import\s*(?:[\w$]+\s*,\s*)?\{([^}]+)\}\s*from\s*["']([^"']+)["']/g;
2583
2925
  let match;
2584
2926
  while ((match = importRegex.exec(code)) !== null) {
2585
2927
  const imports = match[1];
@@ -2616,8 +2958,8 @@ function resolveImportPath(importSpec, fromFile) {
2616
2958
  }
2617
2959
  return null;
2618
2960
  }
2619
- function extractUrlsBlockForVariable(code, varName) {
2620
- const sourceFile = ts3.createSourceFile(
2961
+ function extractUrlsBlockForVariable(code, varName, sourceFileArg) {
2962
+ const sourceFile = sourceFileArg ?? ts3.createSourceFile(
2621
2963
  "input.tsx",
2622
2964
  code,
2623
2965
  ts3.ScriptTarget.Latest,
@@ -2639,16 +2981,20 @@ function extractUrlsBlockForVariable(code, varName) {
2639
2981
  visit(sourceFile);
2640
2982
  return result;
2641
2983
  }
2642
- function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSchemasOut, diagnosticsOut) {
2984
+ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSchemasOut, diagnosticsOut, memo) {
2643
2985
  const routeMap = {};
2644
- const localRoutes = extractRoutesFromSource(block);
2986
+ const blockSourceFile = parseBlock(memo, block);
2987
+ const localRoutes = extractRoutesFromSource(block, blockSourceFile);
2645
2988
  for (const { name, pattern, search } of localRoutes) {
2646
2989
  routeMap[name] = pattern;
2647
2990
  if (search && searchSchemasOut) {
2648
2991
  searchSchemasOut[name] = search;
2649
2992
  }
2650
2993
  }
2651
- const { resolved: includes, unresolvable } = extractIncludesWithDiagnostics(block);
2994
+ const { resolved: includes, unresolvable } = extractIncludesWithDiagnostics(
2995
+ block,
2996
+ blockSourceFile
2997
+ );
2652
2998
  if (diagnosticsOut) {
2653
2999
  for (const entry of unresolvable) {
2654
3000
  diagnosticsOut.push({ ...entry, sourceFile: filePath });
@@ -2675,12 +3021,15 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
2675
3021
  targetFile,
2676
3022
  imported.exportedName,
2677
3023
  visited,
2678
- diagnosticsOut
3024
+ diagnosticsOut,
3025
+ void 0,
3026
+ memo
2679
3027
  );
2680
3028
  } else {
2681
3029
  const sameFileBlock = extractUrlsBlockForVariable(
2682
3030
  fullSource,
2683
- variableName
3031
+ variableName,
3032
+ parseBlock(memo, fullSource)
2684
3033
  );
2685
3034
  if (!sameFileBlock) {
2686
3035
  if (diagnosticsOut) {
@@ -2698,7 +3047,9 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
2698
3047
  filePath,
2699
3048
  variableName,
2700
3049
  visited,
2701
- diagnosticsOut
3050
+ diagnosticsOut,
3051
+ void 0,
3052
+ memo
2702
3053
  );
2703
3054
  }
2704
3055
  if (namePrefix === null) {
@@ -2722,8 +3073,9 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
2722
3073
  }
2723
3074
  return routeMap;
2724
3075
  }
2725
- function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut, inlineBlock) {
3076
+ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut, inlineBlock, memo) {
2726
3077
  visited = visited ?? /* @__PURE__ */ new Set();
3078
+ memo = memo ?? createScanMemo();
2727
3079
  const realPath = resolve2(filePath);
2728
3080
  const key = variableName ? `${realPath}:${variableName}` : realPath;
2729
3081
  if (visited.has(key)) {
@@ -2733,7 +3085,7 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
2733
3085
  visited.add(key);
2734
3086
  let source;
2735
3087
  try {
2736
- source = readFileSync(realPath, "utf-8");
3088
+ source = readSourceMemoized(memo, realPath);
2737
3089
  } catch {
2738
3090
  return { routes: {}, searchSchemas: {} };
2739
3091
  }
@@ -2741,7 +3093,11 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
2741
3093
  if (inlineBlock) {
2742
3094
  block = inlineBlock;
2743
3095
  } else if (variableName) {
2744
- const extracted = extractUrlsBlockForVariable(source, variableName);
3096
+ const extracted = extractUrlsBlockForVariable(
3097
+ source,
3098
+ variableName,
3099
+ parseBlock(memo, source)
3100
+ );
2745
3101
  if (!extracted) return { routes: {}, searchSchemas: {} };
2746
3102
  block = extracted;
2747
3103
  } else {
@@ -2754,7 +3110,8 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
2754
3110
  realPath,
2755
3111
  visited,
2756
3112
  searchSchemas,
2757
- diagnosticsOut
3113
+ diagnosticsOut,
3114
+ memo
2758
3115
  );
2759
3116
  visited.delete(key);
2760
3117
  return { routes, searchSchemas };
@@ -2769,7 +3126,7 @@ import {
2769
3126
  readdirSync
2770
3127
  } from "node:fs";
2771
3128
  import {
2772
- join,
3129
+ join as join2,
2773
3130
  dirname as dirname2,
2774
3131
  resolve as resolve3,
2775
3132
  sep,
@@ -2792,7 +3149,10 @@ var ROUTER_CALL_PATTERN_G = /\bcreateRouter\s*[<(]/g;
2792
3149
  function isRoutableSourceFile(name) {
2793
3150
  return (name.endsWith(".ts") || name.endsWith(".tsx") || name.endsWith(".js") || name.endsWith(".jsx")) && !name.includes(".gen.") && !name.includes(".test.") && !name.includes(".spec.");
2794
3151
  }
2795
- function findRouterFilesRecursive(dir, filter, results) {
3152
+ function isExcludedScanDir(name) {
3153
+ return name === "node_modules" || name === "dist" || name === "coverage" || name === "__tests__" || name === "__mocks__" || name.startsWith(".");
3154
+ }
3155
+ function findCallSiteFilesRecursive(dir, pattern, patternG, stopAtMatchDir, filter, results) {
2796
3156
  let entries;
2797
3157
  try {
2798
3158
  entries = readdirSync(dir, { withFileTypes: true });
@@ -2803,32 +3163,36 @@ function findRouterFilesRecursive(dir, filter, results) {
2803
3163
  return;
2804
3164
  }
2805
3165
  const childDirs = [];
2806
- const routerFilesInDir = [];
3166
+ const matchesInDir = [];
2807
3167
  for (const entry of entries) {
2808
- const fullPath = join(dir, entry.name);
3168
+ const fullPath = join2(dir, entry.name);
2809
3169
  if (entry.isDirectory()) {
2810
- if (entry.name === "node_modules" || entry.name === "dist" || entry.name === "coverage" || entry.name === "__tests__" || entry.name === "__mocks__" || entry.name.startsWith("."))
2811
- continue;
2812
- childDirs.push(fullPath);
3170
+ if (!isExcludedScanDir(entry.name)) childDirs.push(fullPath);
2813
3171
  continue;
2814
3172
  }
2815
3173
  if (!isRoutableSourceFile(entry.name)) continue;
2816
3174
  if (filter && !filter(fullPath)) continue;
2817
3175
  try {
2818
3176
  const source = readFileSync2(fullPath, "utf-8");
2819
- if (ROUTER_CALL_PATTERN.test(source) && firstCodeMatchIndex(source, ROUTER_CALL_PATTERN_G) >= 0) {
2820
- routerFilesInDir.push(fullPath);
3177
+ if (pattern.test(source) && firstCodeMatchIndex(source, patternG) >= 0) {
3178
+ matchesInDir.push(fullPath);
2821
3179
  }
2822
3180
  } catch {
2823
3181
  continue;
2824
3182
  }
2825
3183
  }
2826
- if (routerFilesInDir.length > 0) {
2827
- results.push(...routerFilesInDir);
2828
- return;
2829
- }
2830
- for (const childDir of childDirs) {
2831
- findRouterFilesRecursive(childDir, filter, results);
3184
+ results.push(...matchesInDir);
3185
+ if (!stopAtMatchDir || matchesInDir.length === 0) {
3186
+ for (const childDir of childDirs) {
3187
+ findCallSiteFilesRecursive(
3188
+ childDir,
3189
+ pattern,
3190
+ patternG,
3191
+ stopAtMatchDir,
3192
+ filter,
3193
+ results
3194
+ );
3195
+ }
2832
3196
  }
2833
3197
  }
2834
3198
  function findNestedRouterConflict(routerFiles) {
@@ -2965,7 +3329,7 @@ function applyBasenameToRoutes(result, basename2) {
2965
3329
  }
2966
3330
  function genFileTsPath(sourceFile) {
2967
3331
  const base = pathBasename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
2968
- return join(dirname2(sourceFile), `${base}.named-routes.gen.ts`);
3332
+ return join2(dirname2(sourceFile), `${base}.named-routes.gen.ts`);
2969
3333
  }
2970
3334
  function resolveSearchSchemas(publicRouteNames, runtimeSchemas, sourceFile) {
2971
3335
  if (runtimeSchemas && Object.keys(runtimeSchemas).length > 0) {
@@ -3026,12 +3390,33 @@ function buildCombinedRouteMapForRouterFile(routerFilePath) {
3026
3390
  }
3027
3391
  function findRouterFiles(root, filter) {
3028
3392
  const result = [];
3029
- findRouterFilesRecursive(root, filter, result);
3393
+ findCallSiteFilesRecursive(
3394
+ root,
3395
+ ROUTER_CALL_PATTERN,
3396
+ ROUTER_CALL_PATTERN_G,
3397
+ true,
3398
+ filter,
3399
+ result
3400
+ );
3401
+ return result;
3402
+ }
3403
+ var HOST_ROUTER_CALL_PATTERN = /\bcreateHostRouter\s*[<(]/;
3404
+ var HOST_ROUTER_CALL_PATTERN_G = /\bcreateHostRouter\s*[<(]/g;
3405
+ function findHostRouterFiles(root, filter) {
3406
+ const result = [];
3407
+ findCallSiteFilesRecursive(
3408
+ root,
3409
+ HOST_ROUTER_CALL_PATTERN,
3410
+ HOST_ROUTER_CALL_PATTERN_G,
3411
+ false,
3412
+ filter,
3413
+ result
3414
+ );
3030
3415
  return result;
3031
3416
  }
3032
3417
  function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
3033
3418
  try {
3034
- const oldCombinedPath = join(root, "src", "named-routes.gen.ts");
3419
+ const oldCombinedPath = join2(root, "src", "named-routes.gen.ts");
3035
3420
  if (existsSync3(oldCombinedPath)) {
3036
3421
  unlinkSync(oldCombinedPath);
3037
3422
  console.log(
@@ -3092,7 +3477,28 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
3092
3477
  }
3093
3478
 
3094
3479
  // src/vite/plugins/version-plugin.ts
3480
+ import { parseAst as parseAst4 } from "vite";
3481
+
3482
+ // src/vite/utils/directive-prologue.ts
3095
3483
  import { parseAst as parseAst3 } from "vite";
3484
+ function hasUseClientDirective(source) {
3485
+ let program;
3486
+ try {
3487
+ program = parseAst3(source, { lang: "tsx" });
3488
+ } catch {
3489
+ return false;
3490
+ }
3491
+ for (const node of program.body ?? []) {
3492
+ if (node?.type === "ExpressionStatement" && node.expression?.type === "Literal" && typeof node.expression.value === "string") {
3493
+ if (node.expression.value === "use client") return true;
3494
+ continue;
3495
+ }
3496
+ break;
3497
+ }
3498
+ return false;
3499
+ }
3500
+
3501
+ // src/vite/plugins/version-plugin.ts
3096
3502
  function isCodeModule(id) {
3097
3503
  return /\.(tsx?|jsx?)($|\?)/.test(id);
3098
3504
  }
@@ -3100,23 +3506,13 @@ function normalizeModuleId(id) {
3100
3506
  return id.split("?", 1)[0];
3101
3507
  }
3102
3508
  function getClientModuleSignature(source) {
3509
+ if (!hasUseClientDirective(source)) return void 0;
3103
3510
  let program;
3104
3511
  try {
3105
- program = parseAst3(source, { lang: "tsx" });
3512
+ program = parseAst4(source, { lang: "tsx" });
3106
3513
  } catch {
3107
3514
  return void 0;
3108
3515
  }
3109
- let isUseClient = false;
3110
- for (const node of program.body ?? []) {
3111
- if (node?.type === "ExpressionStatement" && node.expression?.type === "Literal" && typeof node.expression.value === "string") {
3112
- if (node.expression.value === "use client") {
3113
- isUseClient = true;
3114
- }
3115
- continue;
3116
- }
3117
- break;
3118
- }
3119
- if (!isUseClient) return void 0;
3120
3516
  const exports = /* @__PURE__ */ new Set();
3121
3517
  let hasDefault = false;
3122
3518
  let hasExportAll = false;
@@ -3241,7 +3637,6 @@ function createVersionPlugin() {
3241
3637
  }
3242
3638
  return null;
3243
3639
  },
3244
- // Track RSC module changes and update version
3245
3640
  async hotUpdate(ctx) {
3246
3641
  if (!isDev) return;
3247
3642
  const isRscModule = this.environment?.name === "rsc";
@@ -3318,9 +3713,6 @@ function performanceTracksOptimizeDepsPlugin() {
3318
3713
  const RSDW_CLIENT_RE = /react-server-dom-webpack-client\.browser\.(development|production)\.js$/;
3319
3714
  return {
3320
3715
  name: "@rangojs/router:performance-tracks-optimize-deps",
3321
- // Vite 8 optimizes deps with Rolldown (Rollup-style plugin pipeline), so the
3322
- // pre-bundled RSDW client is patched via load() rather than esbuild's onLoad.
3323
- // Returning code overrides Rolldown's default filesystem read for the module.
3324
3716
  async load(id) {
3325
3717
  const cleanId = id.split("?")[0] ?? id;
3326
3718
  if (!RSDW_CLIENT_RE.test(cleanId)) return null;
@@ -3408,7 +3800,7 @@ function createVirtualEntriesPlugin(entries, routerPathRef) {
3408
3800
  if (virtualId === VIRTUAL_IDS.rsc && routerPathRef?.path) {
3409
3801
  const raw = routerPathRef.path.startsWith(".") ? "/" + routerPathRef.path.slice(2) : routerPathRef.path;
3410
3802
  const absoluteRouterPath = raw.replaceAll("\\", "/");
3411
- return getVirtualEntryRSC(absoluteRouterPath);
3803
+ return routerPathRef.kind === "host" ? getVirtualEntryRSCHost(absoluteRouterPath) : getVirtualEntryRSC(absoluteRouterPath);
3412
3804
  }
3413
3805
  }
3414
3806
  return null;
@@ -3463,7 +3855,7 @@ function getManualChunks(id) {
3463
3855
  }
3464
3856
 
3465
3857
  // src/vite/plugins/client-ref-hashing.ts
3466
- import { relative } from "node:path";
3858
+ import { relative as relative2 } from "node:path";
3467
3859
  import { createHash as createHash2 } from "node:crypto";
3468
3860
  var debug7 = createRangoDebugger(NS.transform);
3469
3861
  var CLIENT_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-package-proxy/";
@@ -3480,10 +3872,10 @@ function computeProductionHash(projectRoot, refKey) {
3480
3872
  const absPath = decodeURIComponent(
3481
3873
  refKey.slice(CLIENT_IN_SERVER_PKG_PROXY_PREFIX.length)
3482
3874
  );
3483
- toHash = relative(projectRoot, absPath).replaceAll("\\", "/");
3875
+ toHash = relative2(projectRoot, absPath).replaceAll("\\", "/");
3484
3876
  } else if (refKey.startsWith(FS_PREFIX)) {
3485
3877
  const absPath = refKey.slice(FS_PREFIX.length - 1);
3486
- toHash = relative(projectRoot, absPath).replaceAll("\\", "/");
3878
+ toHash = relative2(projectRoot, absPath).replaceAll("\\", "/");
3487
3879
  } else if (refKey.startsWith("/")) {
3488
3880
  toHash = refKey.slice(1);
3489
3881
  } else {
@@ -3510,7 +3902,6 @@ function hashClientRefs(projectRoot) {
3510
3902
  const counter = createCounter(debug7, "hash-client-refs");
3511
3903
  return {
3512
3904
  name: "@rangojs/router:hash-client-refs",
3513
- // Run after the RSC plugin's transform (default enforce is normal)
3514
3905
  enforce: "post",
3515
3906
  applyToEnvironment(env) {
3516
3907
  return env.name === "rsc";
@@ -3588,6 +3979,190 @@ function resolveClientChunks(option, ctx) {
3588
3979
  return option;
3589
3980
  }
3590
3981
 
3982
+ // src/vite/plugins/vercel-output.ts
3983
+ import { rm, mkdir, cp, writeFile } from "node:fs/promises";
3984
+ import { existsSync as existsSync4 } from "node:fs";
3985
+ import { resolve as resolve4, join as join3 } from "node:path";
3986
+ import { createRequire as createRequire2 } from "node:module";
3987
+ import { pathToFileURL } from "node:url";
3988
+ var LAUNCHER_SOURCE = `import { toNodeHandler } from "srvx/node";
3989
+ import { waitUntil } from "@vercel/functions";
3990
+ import rscHandler from "./rsc/index.js";
3991
+
3992
+ // The Vercel Node launcher invokes a Node (req, res) handler, not a Web fetch
3993
+ // handler. srvx's toNodeHandler bridges the Rango Web fetch handler and pipes
3994
+ // the streamed Response to the Node response (set supportsResponseStreaming).
3995
+ const onVercel = Boolean(process.env.VERCEL);
3996
+
3997
+ const fetchHandler = (request) =>
3998
+ rscHandler(request, {
3999
+ env: process.env,
4000
+ // Forward Vercel's waitUntil so cache writes / revalidation run off the
4001
+ // response path. Omitted off-platform so those writes settle inline.
4002
+ ctx: onVercel ? { waitUntil } : undefined,
4003
+ });
4004
+
4005
+ export default toNodeHandler(fetchHandler);
4006
+ `;
4007
+ function assertVercelNodeRuntime(runtime) {
4008
+ if (runtime != null && !runtime.startsWith("nodejs")) {
4009
+ throw new Error(
4010
+ `[rango] preset "vercel": runtime "${runtime}" is not supported. This preset emits a Node serverless function; use a "nodejs*" runtime (default "nodejs22.x"). The Edge runtime is not supported.`
4011
+ );
4012
+ }
4013
+ }
4014
+ async function assemble(root, options) {
4015
+ const vercel = options.vercel ?? {};
4016
+ assertVercelNodeRuntime(vercel.runtime);
4017
+ const dist = join3(root, "dist");
4018
+ for (const dir of ["client", "rsc", "ssr"]) {
4019
+ if (!existsSync4(join3(dist, dir))) {
4020
+ throw new Error(
4021
+ `[rango] preset "vercel": missing dist/${dir}. Run the production build first.`
4022
+ );
4023
+ }
4024
+ }
4025
+ const functionName = vercel.functionName ?? "index";
4026
+ const out = join3(root, ".vercel", "output");
4027
+ const funcDir = join3(out, "functions", `${functionName}.func`);
4028
+ await rm(out, { recursive: true, force: true });
4029
+ await mkdir(funcDir, { recursive: true });
4030
+ await cp(join3(dist, "client"), join3(out, "static"), { recursive: true });
4031
+ await cp(join3(dist, "rsc"), join3(funcDir, "rsc"), { recursive: true });
4032
+ await cp(join3(dist, "ssr"), join3(funcDir, "ssr"), { recursive: true });
4033
+ if (existsSync4(join3(dist, "static"))) {
4034
+ await cp(join3(dist, "static"), join3(funcDir, "static"), {
4035
+ recursive: true
4036
+ });
4037
+ }
4038
+ const rangoRequire = createRequire2(import.meta.url);
4039
+ let srvxNodePath;
4040
+ try {
4041
+ srvxNodePath = rangoRequire.resolve("srvx/node");
4042
+ } catch {
4043
+ throw new Error(
4044
+ '[rango] preset "vercel" requires "srvx" (a dependency of @rangojs/router). Reinstall dependencies.'
4045
+ );
4046
+ }
4047
+ const appRequire = createRequire2(join3(root, "package.json"));
4048
+ const resolveEsbuildPath = () => {
4049
+ try {
4050
+ const viteRequire = createRequire2(appRequire.resolve("vite"));
4051
+ return viteRequire.resolve("esbuild");
4052
+ } catch {
4053
+ }
4054
+ try {
4055
+ return appRequire.resolve("esbuild");
4056
+ } catch {
4057
+ }
4058
+ return rangoRequire.resolve("esbuild");
4059
+ };
4060
+ let esbuildModule;
4061
+ try {
4062
+ esbuildModule = await import(pathToFileURL(resolveEsbuildPath()).href);
4063
+ } catch {
4064
+ throw new Error(
4065
+ '[rango] preset "vercel" requires "esbuild" to bundle the function launcher. It ships with Vite; reinstall dependencies (or add esbuild to your app dependencies).'
4066
+ );
4067
+ }
4068
+ const esbuildBuild = esbuildModule.build ?? esbuildModule.default?.build;
4069
+ if (typeof esbuildBuild !== "function") {
4070
+ throw new Error('[rango] preset "vercel": could not load esbuild.build.');
4071
+ }
4072
+ try {
4073
+ await esbuildBuild({
4074
+ stdin: {
4075
+ contents: LAUNCHER_SOURCE,
4076
+ resolveDir: root,
4077
+ sourcefile: "func-entry.mjs",
4078
+ loader: "js"
4079
+ },
4080
+ outfile: join3(funcDir, "index.mjs"),
4081
+ bundle: true,
4082
+ format: "esm",
4083
+ platform: "node",
4084
+ target: "node18",
4085
+ alias: { "srvx/node": srvxNodePath },
4086
+ plugins: [
4087
+ {
4088
+ name: "external-rsc-entry",
4089
+ setup(b) {
4090
+ b.onResolve({ filter: /^\.\/rsc\/index\.js$/ }, () => ({
4091
+ path: "./rsc/index.js",
4092
+ external: true
4093
+ }));
4094
+ }
4095
+ }
4096
+ ]
4097
+ });
4098
+ } catch (error) {
4099
+ const message = error instanceof Error ? error.message : String(error);
4100
+ if (/@vercel\/functions/.test(message)) {
4101
+ throw new Error(
4102
+ '[rango] preset "vercel": could not resolve "@vercel/functions". Add it to your app dependencies (it also backs VercelCacheStore).\n' + message
4103
+ );
4104
+ }
4105
+ throw error;
4106
+ }
4107
+ await writeFile(
4108
+ join3(funcDir, "package.json"),
4109
+ JSON.stringify({ type: "module" }, null, 2) + "\n"
4110
+ );
4111
+ const vcConfig = {
4112
+ runtime: vercel.runtime ?? "nodejs22.x",
4113
+ handler: "index.mjs",
4114
+ launcherType: "Nodejs",
4115
+ shouldAddHelpers: false,
4116
+ supportsResponseStreaming: true,
4117
+ maxDuration: vercel.maxDuration ?? 30
4118
+ };
4119
+ if (vercel.memory != null) vcConfig.memory = vercel.memory;
4120
+ if (vercel.regions != null) vcConfig.regions = vercel.regions;
4121
+ await writeFile(
4122
+ join3(funcDir, ".vc-config.json"),
4123
+ JSON.stringify(vcConfig, null, 2) + "\n"
4124
+ );
4125
+ await writeFile(
4126
+ join3(out, "config.json"),
4127
+ JSON.stringify(
4128
+ {
4129
+ version: 3,
4130
+ routes: [
4131
+ { handle: "filesystem" },
4132
+ { src: "/(.*)", dest: `/${functionName}` }
4133
+ ]
4134
+ },
4135
+ null,
4136
+ 2
4137
+ ) + "\n"
4138
+ );
4139
+ console.log(
4140
+ `[rango] assembled .vercel/output (function: ${functionName}.func)`
4141
+ );
4142
+ }
4143
+ function createVercelOutputPlugin(options) {
4144
+ let root = process.cwd();
4145
+ let isBuild = false;
4146
+ return {
4147
+ name: "@rangojs/router:vercel-output",
4148
+ configResolved(config) {
4149
+ root = resolve4(config.root);
4150
+ isBuild = config.command === "build";
4151
+ },
4152
+ // buildApp runs once after the whole multi-environment build (rsc, client,
4153
+ // ssr), so dist/ is complete here. closeBundle is unusable for this: it
4154
+ // fires per environment, and twice for ssr (the server-reference scan and
4155
+ // the real build), so it would run before dist/client exists.
4156
+ buildApp: {
4157
+ order: "post",
4158
+ async handler() {
4159
+ if (!isBuild) return;
4160
+ await assemble(root, options);
4161
+ }
4162
+ }
4163
+ };
4164
+ }
4165
+
3591
4166
  // src/vite/utils/banner.ts
3592
4167
  var rangoVersion = package_default.version;
3593
4168
  var _bannerPrinted = false;
@@ -3615,7 +4190,7 @@ ${dim} ${reset}${bold}\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550$
3615
4190
  }
3616
4191
 
3617
4192
  // src/vite/plugins/version-injector.ts
3618
- import { resolve as resolve4 } from "node:path";
4193
+ import { resolve as resolve5 } from "node:path";
3619
4194
  import * as Vite2 from "vite";
3620
4195
  function createVersionInjectorPlugin(rscEntryPath) {
3621
4196
  let resolvedEntryPath = "";
@@ -3626,7 +4201,7 @@ function createVersionInjectorPlugin(rscEntryPath) {
3626
4201
  let entryPath = rscEntryPath;
3627
4202
  if (!entryPath) entryPath = resolveRscEntryFromConfig(config);
3628
4203
  if (entryPath) {
3629
- resolvedEntryPath = resolve4(config.root, entryPath);
4204
+ resolvedEntryPath = resolve5(config.root, entryPath);
3630
4205
  }
3631
4206
  },
3632
4207
  transform(code, id) {
@@ -3674,13 +4249,17 @@ function createVersionInjectorPlugin(rscEntryPath) {
3674
4249
  // src/vite/plugins/cjs-to-esm.ts
3675
4250
  var debug8 = createRangoDebugger(NS.transform);
3676
4251
  function createCjsToEsmPlugin() {
4252
+ let isProduction = false;
3677
4253
  return {
3678
4254
  name: "@rangojs/router:cjs-to-esm",
3679
4255
  enforce: "pre",
4256
+ configResolved(config) {
4257
+ isProduction = config.isProduction;
4258
+ },
3680
4259
  transform(code, id) {
3681
4260
  const cleanId = id.split("?")[0].replaceAll("\\", "/");
3682
4261
  if (cleanId.includes("vendor/react-server-dom/client.browser.js")) {
3683
- const isProd = process.env.NODE_ENV === "production";
4262
+ const isProd = isProduction;
3684
4263
  const cjsFile = isProd ? "./cjs/react-server-dom-webpack-client.browser.production.js" : "./cjs/react-server-dom-webpack-client.browser.development.js";
3685
4264
  debug8?.("cjs-to-esm entry redirect %s", id);
3686
4265
  return {
@@ -3731,10 +4310,10 @@ function createCjsToEsmPlugin() {
3731
4310
 
3732
4311
  // src/vite/router-discovery.ts
3733
4312
  import { createServer as createViteServer } from "vite";
3734
- import { resolve as resolve8 } from "node:path";
4313
+ import { resolve as resolve9 } from "node:path";
3735
4314
  import { readFileSync as readFileSync6 } from "node:fs";
3736
- import { createRequire as createRequire2, register } from "node:module";
3737
- import { pathToFileURL } from "node:url";
4315
+ import { createRequire as createRequire3, register } from "node:module";
4316
+ import { pathToFileURL as pathToFileURL2 } from "node:url";
3738
4317
 
3739
4318
  // src/vite/plugins/virtual-stub-plugin.ts
3740
4319
  function createVirtualStubPlugin() {
@@ -4019,7 +4598,50 @@ function checkSelfGenWrite(state, filePath, consume) {
4019
4598
  }
4020
4599
  }
4021
4600
 
4022
- // src/vite/utils/manifest-utils.ts
4601
+ // src/router/logging.ts
4602
+ import { AsyncLocalStorage } from "node:async_hooks";
4603
+
4604
+ // src/internal-debug.ts
4605
+ var INTERNAL_RANGO_DEBUG = typeof __RANGO_DEBUG__ !== "undefined" ? __RANGO_DEBUG__ : typeof process !== "undefined" && Boolean(process.env?.INTERNAL_RANGO_DEBUG);
4606
+
4607
+ // src/router/logging.ts
4608
+ var routerLogContext = new AsyncLocalStorage();
4609
+
4610
+ // src/router/pattern-matching.ts
4611
+ function parsePattern(pattern) {
4612
+ const segments = [];
4613
+ const segmentRegex = /\/(:([a-zA-Z_][a-zA-Z0-9_]*)(\(([^)]+)\))?(\?)?([^/]*)|(\*)|([^/]+))/g;
4614
+ let match;
4615
+ while ((match = segmentRegex.exec(pattern)) !== null) {
4616
+ const [
4617
+ ,
4618
+ ,
4619
+ paramName,
4620
+ ,
4621
+ constraint,
4622
+ optional,
4623
+ suffix,
4624
+ wildcard,
4625
+ staticText
4626
+ ] = match;
4627
+ if (wildcard) {
4628
+ segments.push({ type: "wildcard", value: "*", optional: false });
4629
+ } else if (paramName) {
4630
+ segments.push({
4631
+ type: "param",
4632
+ value: paramName,
4633
+ optional: optional === "?",
4634
+ constraint: constraint ? constraint.split("|") : void 0,
4635
+ suffix: suffix || void 0
4636
+ });
4637
+ } else if (staticText) {
4638
+ segments.push({ type: "static", value: staticText, optional: false });
4639
+ }
4640
+ }
4641
+ return segments;
4642
+ }
4643
+
4644
+ // src/build/prefix-tree-utils.ts
4023
4645
  function flattenLeafEntries(prefixTree, routeManifest, result) {
4024
4646
  function visit(node, ancestorStaticPrefixes) {
4025
4647
  const children = node.children || {};
@@ -4060,6 +4682,219 @@ function buildRouteToStaticPrefix(prefixTree, result) {
4060
4682
  visit(node);
4061
4683
  }
4062
4684
  }
4685
+
4686
+ // src/build/route-trie.ts
4687
+ function buildRouteTrie(routeManifest, routeAncestry, routeToStaticPrefix, routeTrailingSlash, prerenderRouteNames, passthroughRouteNames, responseTypeRoutes) {
4688
+ const root = {};
4689
+ for (const [routeName, pattern] of Object.entries(routeManifest)) {
4690
+ const ancestry = routeAncestry[routeName] || [];
4691
+ const staticPrefix = routeToStaticPrefix[routeName] || "";
4692
+ const trailingSlash = routeTrailingSlash?.[routeName];
4693
+ const responseType = responseTypeRoutes?.[routeName];
4694
+ const hasTrailingSlash = pattern.length > 1 && pattern.endsWith("/");
4695
+ const normalizedPattern = hasTrailingSlash ? pattern.slice(0, -1) : pattern;
4696
+ const segments = parsePattern(normalizedPattern);
4697
+ insertRoute(root, segments, 0, {
4698
+ n: routeName,
4699
+ sp: staticPrefix,
4700
+ a: ancestry,
4701
+ ...trailingSlash ? { ts: trailingSlash } : {},
4702
+ ...prerenderRouteNames?.has(routeName) ? { pr: true } : {},
4703
+ ...passthroughRouteNames?.has(routeName) ? { pt: true } : {},
4704
+ ...responseType ? { rt: responseType } : {}
4705
+ });
4706
+ }
4707
+ sortSuffixParams(root);
4708
+ return root;
4709
+ }
4710
+ function sortSuffixParams(node) {
4711
+ if (node.xp) {
4712
+ const sorted = {};
4713
+ for (const suffix of Object.keys(node.xp).sort(
4714
+ (a, b) => b.length - a.length
4715
+ )) {
4716
+ sorted[suffix] = node.xp[suffix];
4717
+ }
4718
+ node.xp = sorted;
4719
+ for (const child of Object.values(node.xp)) {
4720
+ sortSuffixParams(child.c);
4721
+ }
4722
+ }
4723
+ if (node.s) {
4724
+ for (const child of Object.values(node.s)) {
4725
+ sortSuffixParams(child);
4726
+ }
4727
+ }
4728
+ if (node.p) {
4729
+ sortSuffixParams(node.p.c);
4730
+ }
4731
+ }
4732
+ function buildPerRouterTrie(manifest) {
4733
+ const ancestry = manifest._routeAncestry;
4734
+ if (!ancestry || Object.keys(ancestry).length === 0) {
4735
+ return null;
4736
+ }
4737
+ const routeToStaticPrefix = {};
4738
+ for (const name of Object.keys(manifest.routeManifest)) {
4739
+ routeToStaticPrefix[name] = "";
4740
+ }
4741
+ if (manifest.prefixTree) {
4742
+ buildRouteToStaticPrefix(manifest.prefixTree, routeToStaticPrefix);
4743
+ }
4744
+ return buildRouteTrie(
4745
+ manifest.routeManifest,
4746
+ ancestry,
4747
+ routeToStaticPrefix,
4748
+ manifest.routeTrailingSlash,
4749
+ manifest.prerenderRoutes ? new Set(manifest.prerenderRoutes) : void 0,
4750
+ manifest.passthroughRoutes ? new Set(manifest.passthroughRoutes) : void 0,
4751
+ manifest.responseTypeRoutes
4752
+ );
4753
+ }
4754
+ function insertRoute(node, segments, index, leaf) {
4755
+ const constraints = {};
4756
+ for (const seg of segments) {
4757
+ if (seg.type === "param") {
4758
+ if (seg.constraint) {
4759
+ constraints[seg.value] = seg.constraint;
4760
+ }
4761
+ }
4762
+ }
4763
+ const leafBase = {
4764
+ ...leaf,
4765
+ ...Object.keys(constraints).length > 0 ? { cv: constraints } : {}
4766
+ };
4767
+ insertSegments(node, segments, index, leafBase, []);
4768
+ }
4769
+ function toVariant(leaf, responseType) {
4770
+ return leaf.pa ? { routeKey: leaf.n, responseType, pa: leaf.pa } : { routeKey: leaf.n, responseType };
4771
+ }
4772
+ function mergeLeaves(existing, leaf) {
4773
+ if (!existing) return leaf;
4774
+ if (existing.rt && leaf.rt) {
4775
+ const merged = leaf;
4776
+ merged.nv = existing.nv || [];
4777
+ merged.nv.push(toVariant(existing, existing.rt));
4778
+ return merged;
4779
+ }
4780
+ if (leaf.rt && !existing.rt) {
4781
+ if (!existing.nv) {
4782
+ existing.nv = [];
4783
+ existing.rf = true;
4784
+ }
4785
+ existing.nv.push(toVariant(leaf, leaf.rt));
4786
+ return existing;
4787
+ }
4788
+ if (!leaf.rt && existing.rt) {
4789
+ if (!leaf.nv) leaf.nv = [];
4790
+ if (existing.nv) leaf.nv.push(...existing.nv);
4791
+ leaf.nv.push(toVariant(existing, existing.rt));
4792
+ return leaf;
4793
+ }
4794
+ return leaf;
4795
+ }
4796
+ function mergeLeaf(node, leaf) {
4797
+ node.r = mergeLeaves(node.r, leaf);
4798
+ }
4799
+ function buildLeaf(leafBase, paramNames) {
4800
+ return paramNames.length > 0 ? { ...leafBase, pa: [...paramNames] } : { ...leafBase };
4801
+ }
4802
+ function insertSegments(node, segments, index, leafBase, paramNames) {
4803
+ if (index >= segments.length) {
4804
+ mergeLeaf(node, buildLeaf(leafBase, paramNames));
4805
+ return;
4806
+ }
4807
+ const segment = segments[index];
4808
+ if (segment.type === "static") {
4809
+ if (!node.s) node.s = {};
4810
+ if (!node.s[segment.value]) node.s[segment.value] = {};
4811
+ insertSegments(
4812
+ node.s[segment.value],
4813
+ segments,
4814
+ index + 1,
4815
+ leafBase,
4816
+ paramNames
4817
+ );
4818
+ } else if (segment.type === "param") {
4819
+ if (segment.optional) {
4820
+ insertSegments(node, segments, index + 1, leafBase, paramNames);
4821
+ }
4822
+ if (segment.suffix) {
4823
+ if (!node.xp) node.xp = {};
4824
+ if (!node.xp[segment.suffix]) {
4825
+ node.xp[segment.suffix] = { n: segment.value, c: {} };
4826
+ }
4827
+ insertSegments(node.xp[segment.suffix].c, segments, index + 1, leafBase, [
4828
+ ...paramNames,
4829
+ segment.value
4830
+ ]);
4831
+ } else {
4832
+ if (!node.p) {
4833
+ node.p = { n: segment.value, c: {} };
4834
+ }
4835
+ insertSegments(node.p.c, segments, index + 1, leafBase, [
4836
+ ...paramNames,
4837
+ segment.value
4838
+ ]);
4839
+ }
4840
+ } else if (segment.type === "wildcard") {
4841
+ const wildLeaf = {
4842
+ ...buildLeaf(leafBase, paramNames),
4843
+ pn: "*"
4844
+ };
4845
+ const existing = node.w ? { ...node.w } : void 0;
4846
+ const merged = mergeLeaves(existing, wildLeaf);
4847
+ node.w = merged;
4848
+ }
4849
+ }
4850
+
4851
+ // src/build/collect-fallback-refs.ts
4852
+ var CLIENT_REF = /* @__PURE__ */ Symbol.for("react.client.reference");
4853
+ var MAX_DEPTH = 40;
4854
+ var SYNTHETIC_PROPS = {
4855
+ error: new Error("rango: build-time fallback-chunk discovery"),
4856
+ reset: () => {
4857
+ },
4858
+ pathname: "/",
4859
+ info: { componentStack: "" }
4860
+ };
4861
+ function isReactNodeLike(v) {
4862
+ return Array.isArray(v) || typeof v === "object" && v !== null && "$$typeof" in v;
4863
+ }
4864
+ function walkElementTree(node, report, depth) {
4865
+ if (node == null || depth > MAX_DEPTH) return;
4866
+ if (Array.isArray(node)) {
4867
+ for (const child of node) walkElementTree(child, report, depth + 1);
4868
+ return;
4869
+ }
4870
+ if (typeof node !== "object") return;
4871
+ const el = node;
4872
+ const type = el.type;
4873
+ if (type?.$$typeof === CLIENT_REF && typeof type.$$id === "string") {
4874
+ report(type.$$id.split("#")[0]);
4875
+ }
4876
+ const props = el.props;
4877
+ if (props && typeof props === "object") {
4878
+ walkElementTree(props.children, report, depth + 1);
4879
+ for (const key in props) {
4880
+ if (key === "children") continue;
4881
+ const value = props[key];
4882
+ if (isReactNodeLike(value)) walkElementTree(value, report, depth + 1);
4883
+ }
4884
+ }
4885
+ }
4886
+ function collectFallbackClientRefs(boundary, report) {
4887
+ try {
4888
+ let node = boundary;
4889
+ if (typeof node === "function") {
4890
+ node = node(SYNTHETIC_PROPS);
4891
+ }
4892
+ walkElementTree(node, report, 0);
4893
+ } catch {
4894
+ }
4895
+ }
4896
+
4897
+ // src/vite/utils/manifest-utils.ts
4063
4898
  function jsonParseExpression(value) {
4064
4899
  const json = JSON.stringify(value);
4065
4900
  const escaped = json.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
@@ -4067,6 +4902,9 @@ function jsonParseExpression(value) {
4067
4902
  }
4068
4903
 
4069
4904
  // src/context-var.ts
4905
+ function hasContextVars(variables) {
4906
+ return Object.keys(variables).length > 0 || Object.getOwnPropertySymbols(variables).length > 0;
4907
+ }
4070
4908
  var NON_CACHEABLE_KEYS = /* @__PURE__ */ Symbol.for(
4071
4909
  "rango:non-cacheable-keys"
4072
4910
  );
@@ -4100,16 +4938,13 @@ function contextSet(variables, keyOrVar, value, options) {
4100
4938
  import { createHash as createHash4 } from "node:crypto";
4101
4939
  import {
4102
4940
  copyFileSync,
4103
- existsSync as existsSync4,
4941
+ existsSync as existsSync5,
4104
4942
  mkdirSync,
4105
4943
  rmSync,
4106
4944
  statSync,
4107
4945
  writeFileSync as writeFileSync2
4108
4946
  } from "node:fs";
4109
- import { resolve as resolve5 } from "node:path";
4110
- function escapeRegExp2(str) {
4111
- return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
4112
- }
4947
+ import { resolve as resolve6 } from "node:path";
4113
4948
  function encodePathParam(value) {
4114
4949
  return String(value).split("/").map((segment) => encodeURIComponent(segment)).join("/");
4115
4950
  }
@@ -4117,7 +4952,7 @@ function substituteRouteParams(pattern, params, encode = encodeURIComponent) {
4117
4952
  let result = pattern;
4118
4953
  let hadOmittedOptional = false;
4119
4954
  for (const [key, value] of Object.entries(params)) {
4120
- const escaped = escapeRegExp2(key);
4955
+ const escaped = escapeRegExp(key);
4121
4956
  if (value === "") {
4122
4957
  result = result.replace(
4123
4958
  new RegExp(`:${escaped}(\\([^)]*\\))?(?!\\?)`),
@@ -4150,13 +4985,24 @@ async function runWithConcurrency(items, concurrency, fn) {
4150
4985
  return;
4151
4986
  }
4152
4987
  let nextIndex = 0;
4988
+ let firstError;
4989
+ let failed = false;
4153
4990
  async function worker() {
4154
- while (nextIndex < items.length) {
4991
+ while (nextIndex < items.length && !failed) {
4155
4992
  const idx = nextIndex++;
4156
- await fn(items[idx]);
4993
+ try {
4994
+ await fn(items[idx]);
4995
+ } catch (err) {
4996
+ if (!failed) {
4997
+ failed = true;
4998
+ firstError = err;
4999
+ }
5000
+ return;
5001
+ }
4157
5002
  }
4158
5003
  }
4159
5004
  await Promise.all(Array.from({ length: limit }, () => worker()));
5005
+ if (failed) throw firstError;
4160
5006
  }
4161
5007
  function groupByConcurrency(entries) {
4162
5008
  const map = /* @__PURE__ */ new Map();
@@ -4203,8 +5049,25 @@ function notifyOnError(registry, error, phase, routeKey, pathname, skipped) {
4203
5049
  break;
4204
5050
  }
4205
5051
  }
5052
+ function resolvePrerenderError(registry, error, onError, label, elapsed, phase, routeKey, pathname) {
5053
+ const isSkip = error?.name === "Skip";
5054
+ if (isSkip || onError === "warn") {
5055
+ if (isSkip) {
5056
+ console.log(`[rango] SKIP ${label} (${elapsed}ms) - ${error.message}`);
5057
+ } else {
5058
+ console.warn(
5059
+ `[rango] WARN ${label} (${elapsed}ms) - render error, not pre-rendered (prerender.onError: "warn"): ${error.message}`
5060
+ );
5061
+ }
5062
+ notifyOnError(registry, error, phase, routeKey, pathname, true);
5063
+ return;
5064
+ }
5065
+ console.error(`[rango] FAIL ${label} (${elapsed}ms) - ${error.message}`);
5066
+ notifyOnError(registry, error, phase, routeKey, pathname);
5067
+ throw error;
5068
+ }
4206
5069
  function getStagedAssetDir(projectRoot) {
4207
- return resolve5(projectRoot, "node_modules/.rangojs-router-build/rsc-assets");
5070
+ return resolve6(projectRoot, "node_modules/.rangojs-router-build/rsc-assets");
4208
5071
  }
4209
5072
  function resetStagedBuildAssets(projectRoot) {
4210
5073
  rmSync(getStagedAssetDir(projectRoot), { recursive: true, force: true });
@@ -4214,8 +5077,8 @@ function stageBuildAssetModule(projectRoot, prefix, exportValue) {
4214
5077
  mkdirSync(stagedDir, { recursive: true });
4215
5078
  const contentHash = createHash4("sha256").update(exportValue).digest("hex").slice(0, 8);
4216
5079
  const fileName = `${prefix}-${contentHash}.js`;
4217
- const filePath = resolve5(stagedDir, fileName);
4218
- if (!existsSync4(filePath)) {
5080
+ const filePath = resolve6(stagedDir, fileName);
5081
+ if (!existsSync5(filePath)) {
4219
5082
  writeFileSync2(filePath, `export default ${exportValue};
4220
5083
  `);
4221
5084
  }
@@ -4223,12 +5086,12 @@ function stageBuildAssetModule(projectRoot, prefix, exportValue) {
4223
5086
  }
4224
5087
  function copyStagedBuildAssets(projectRoot, fileNames) {
4225
5088
  const stagedDir = getStagedAssetDir(projectRoot);
4226
- const distAssetsDir = resolve5(projectRoot, "dist/rsc/assets");
5089
+ const distAssetsDir = resolve6(projectRoot, "dist/rsc/assets");
4227
5090
  mkdirSync(distAssetsDir, { recursive: true });
4228
5091
  let totalBytes = 0;
4229
5092
  for (const fileName of new Set(fileNames)) {
4230
- const stagedPath = resolve5(stagedDir, fileName);
4231
- const distPath = resolve5(distAssetsDir, fileName);
5093
+ const stagedPath = resolve6(stagedDir, fileName);
5094
+ const distPath = resolve6(distAssetsDir, fileName);
4232
5095
  copyFileSync(stagedPath, distPath);
4233
5096
  totalBytes += statSync(stagedPath).size;
4234
5097
  }
@@ -4319,7 +5182,7 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
4319
5182
  (performance.now() - getParamsStart).toFixed(1)
4320
5183
  );
4321
5184
  const concurrency = def.options?.concurrency ?? 1;
4322
- const hasBuildVars = Object.keys(buildVars).length > 0 || Object.getOwnPropertySymbols(buildVars).length > 0;
5185
+ const hasBuildVars = hasContextVars(buildVars);
4323
5186
  for (const params of paramsList) {
4324
5187
  let url = substituteRouteParams(
4325
5188
  pattern,
@@ -4404,6 +5267,7 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
4404
5267
  const manifestEntries = {};
4405
5268
  let doneCount = 0;
4406
5269
  let skipCount = 0;
5270
+ const prerenderOnError = state.opts?.prerenderOnError ?? "fail";
4407
5271
  const startTotal = performance.now();
4408
5272
  const groups = groupByConcurrency(entries);
4409
5273
  for (const group of groups) {
@@ -4446,10 +5310,9 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
4446
5310
  const interceptKey = `${result.routeName}/${paramHash}/i`;
4447
5311
  const interceptValue = JSON.stringify({
4448
5312
  segments: [...result.segments, ...result.interceptSegments],
4449
- handles: {
4450
- ...result.handles,
4451
- ...result.interceptHandles || {}
4452
- }
5313
+ // interceptHandles is the pre-encoded MERGED (main + intercept)
5314
+ // handle string (the producer merged before encoding).
5315
+ handles: result.interceptHandles ?? ""
4453
5316
  });
4454
5317
  manifestEntries[interceptKey] = stageBuildAssetModule(
4455
5318
  state.projectRoot,
@@ -4464,34 +5327,19 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
4464
5327
  doneCount++;
4465
5328
  break;
4466
5329
  } catch (err) {
4467
- if (err.name === "Skip") {
4468
- const elapsed2 = (performance.now() - startUrl).toFixed(0);
4469
- console.log(
4470
- `[rango] SKIP ${entry.urlPath.padEnd(40)} (${elapsed2}ms) - ${err.message}`
4471
- );
4472
- skipCount++;
4473
- notifyOnError(
4474
- registry,
4475
- err,
4476
- "prerender",
4477
- entry.routeName,
4478
- entry.urlPath,
4479
- true
4480
- );
4481
- break;
4482
- }
4483
5330
  const elapsed = (performance.now() - startUrl).toFixed(0);
4484
- console.error(
4485
- `[rango] FAIL ${entry.urlPath.padEnd(40)} (${elapsed}ms) - ${err.message}`
4486
- );
4487
- notifyOnError(
5331
+ resolvePrerenderError(
4488
5332
  registry,
4489
5333
  err,
5334
+ prerenderOnError,
5335
+ entry.urlPath.padEnd(40),
5336
+ elapsed,
4490
5337
  "prerender",
4491
5338
  entry.routeName,
4492
5339
  entry.urlPath
4493
5340
  );
4494
- throw err;
5341
+ skipCount++;
5342
+ break;
4495
5343
  }
4496
5344
  }
4497
5345
  }
@@ -4526,6 +5374,7 @@ async function renderStaticHandlers(state, rscEnv, registry) {
4526
5374
  let staticDone = 0;
4527
5375
  let staticSkip = 0;
4528
5376
  let totalStaticCount = 0;
5377
+ const prerenderOnError = state.opts?.prerenderOnError ?? "fail";
4529
5378
  for (const [, exportNames] of state.resolvedStaticModules) {
4530
5379
  totalStaticCount += exportNames.length;
4531
5380
  }
@@ -4559,7 +5408,7 @@ async function renderStaticHandlers(state, rscEnv, registry) {
4559
5408
  !state.isBuildMode
4560
5409
  );
4561
5410
  if (result) {
4562
- const hasHandles = Object.keys(result.handles).length > 0;
5411
+ const hasHandles = result.handles !== "";
4563
5412
  const exportValue = hasHandles ? JSON.stringify(result) : JSON.stringify(result.encoded);
4564
5413
  manifestEntries[def.$$id] = stageBuildAssetModule(
4565
5414
  state.projectRoot,
@@ -4573,22 +5422,18 @@ async function renderStaticHandlers(state, rscEnv, registry) {
4573
5422
  break;
4574
5423
  }
4575
5424
  } catch (err) {
4576
- if (err.name === "Skip") {
4577
- const elapsed2 = (performance.now() - startHandler).toFixed(0);
4578
- console.log(
4579
- `[rango] SKIP ${name.padEnd(40)} (${elapsed2}ms) - ${err.message}`
4580
- );
4581
- staticSkip++;
4582
- notifyOnError(registry, err, "static", void 0, void 0, true);
4583
- handled = true;
4584
- break;
4585
- }
4586
5425
  const elapsed = (performance.now() - startHandler).toFixed(0);
4587
- console.error(
4588
- `[rango] FAIL ${name.padEnd(40)} (${elapsed}ms) - ${err.message}`
5426
+ resolvePrerenderError(
5427
+ registry,
5428
+ err,
5429
+ prerenderOnError,
5430
+ name.padEnd(40),
5431
+ elapsed,
5432
+ "static"
4589
5433
  );
4590
- notifyOnError(registry, err, "static");
4591
- throw err;
5434
+ staticSkip++;
5435
+ handled = true;
5436
+ break;
4592
5437
  }
4593
5438
  }
4594
5439
  if (!handled) {
@@ -4762,8 +5607,8 @@ async function discoverRouters(state, rscEnv) {
4762
5607
  computeProductionHash(state.projectRoot, refKey)
4763
5608
  ) : void 0;
4764
5609
  const collectFromBoundaryNode = (node) => {
4765
- if (collectClientFallbackRef && buildMod.collectFallbackClientRefs) {
4766
- buildMod.collectFallbackClientRefs(node, collectClientFallbackRef);
5610
+ if (collectClientFallbackRef) {
5611
+ collectFallbackClientRefs(node, collectClientFallbackRef);
4767
5612
  }
4768
5613
  };
4769
5614
  const manifestGenStart = debug10 ? performance.now() : 0;
@@ -4822,18 +5667,14 @@ async function discoverRouters(state, rscEnv) {
4822
5667
  if (manifest.routeTrailingSlash) {
4823
5668
  Object.assign(mergedRouteTrailingSlash, manifest.routeTrailingSlash);
4824
5669
  }
4825
- flattenLeafEntries(
4826
- manifest.prefixTree,
4827
- manifest.routeManifest,
4828
- newMergedPrecomputedEntries
4829
- );
4830
- newPerRouterManifestDataMap.set(id, manifest.routeManifest);
4831
5670
  const routerPrecomputed = [];
4832
5671
  flattenLeafEntries(
4833
5672
  manifest.prefixTree,
4834
5673
  manifest.routeManifest,
4835
5674
  routerPrecomputed
4836
5675
  );
5676
+ newMergedPrecomputedEntries.push(...routerPrecomputed);
5677
+ newPerRouterManifestDataMap.set(id, manifest.routeManifest);
4837
5678
  newPerRouterPrecomputedMap.set(id, routerPrecomputed);
4838
5679
  console.log(
4839
5680
  `[rango] Router "${id}" -> ${routeCount} routes (${staticRoutes} static, ${dynamicRoutes} dynamic)`
@@ -4857,8 +5698,7 @@ async function discoverRouters(state, rscEnv) {
4857
5698
  let newMergedRouteTrie = null;
4858
5699
  const trieStart = debug10 ? performance.now() : 0;
4859
5700
  if (Object.keys(newMergedRouteManifest).length > 0) {
4860
- const buildRouteTrie = buildMod.buildRouteTrie;
4861
- if (buildRouteTrie && mergedRouteAncestry) {
5701
+ if (mergedRouteAncestry) {
4862
5702
  const routeToStaticPrefix = {};
4863
5703
  for (const { manifest } of allManifests) {
4864
5704
  for (const name of Object.keys(manifest.routeManifest)) {
@@ -4896,25 +5736,10 @@ async function discoverRouters(state, rscEnv) {
4896
5736
  mergedResponseTypeRoutes
4897
5737
  );
4898
5738
  for (const { id, manifest } of allManifests) {
4899
- if (!manifest._routeAncestry || Object.keys(manifest._routeAncestry).length === 0)
4900
- continue;
4901
- const perRouterStaticPrefix = {};
4902
- for (const name of Object.keys(manifest.routeManifest)) {
4903
- perRouterStaticPrefix[name] = "";
5739
+ const perRouterTrie = buildPerRouterTrie(manifest);
5740
+ if (perRouterTrie) {
5741
+ newPerRouterTrieMap.set(id, perRouterTrie);
4904
5742
  }
4905
- buildRouteToStaticPrefix(manifest.prefixTree, perRouterStaticPrefix);
4906
- const perRouterPrerenderNames = manifest.prerenderRoutes ? new Set(manifest.prerenderRoutes) : void 0;
4907
- const perRouterPassthroughNames = manifest.passthroughRoutes ? new Set(manifest.passthroughRoutes) : void 0;
4908
- const perRouterTrie = buildRouteTrie(
4909
- manifest.routeManifest,
4910
- manifest._routeAncestry,
4911
- perRouterStaticPrefix,
4912
- manifest.routeTrailingSlash,
4913
- perRouterPrerenderNames,
4914
- perRouterPassthroughNames,
4915
- manifest.responseTypeRoutes
4916
- );
4917
- newPerRouterTrieMap.set(id, perRouterTrie);
4918
5743
  }
4919
5744
  }
4920
5745
  }
@@ -4935,8 +5760,8 @@ async function discoverRouters(state, rscEnv) {
4935
5760
  }
4936
5761
 
4937
5762
  // src/vite/discovery/route-types-writer.ts
4938
- import { dirname as dirname3, join as join2, resolve as resolve6 } from "node:path";
4939
- import { readFileSync as readFileSync4, writeFileSync as writeFileSync3, existsSync as existsSync5, unlinkSync as unlinkSync2 } from "node:fs";
5763
+ import { dirname as dirname3, join as join4, resolve as resolve7 } from "node:path";
5764
+ import { readFileSync as readFileSync4, writeFileSync as writeFileSync3, existsSync as existsSync6, unlinkSync as unlinkSync2 } from "node:fs";
4940
5765
  function filterUserNamedRoutes(manifest) {
4941
5766
  const filtered = {};
4942
5767
  for (const [name, pattern] of Object.entries(manifest)) {
@@ -4947,7 +5772,7 @@ function filterUserNamedRoutes(manifest) {
4947
5772
  return filtered;
4948
5773
  }
4949
5774
  function writeGenFileIfChanged(state, outPath, source, opts) {
4950
- const existing = existsSync5(outPath) ? readFileSync4(outPath, "utf-8") : null;
5775
+ const existing = existsSync6(outPath) ? readFileSync4(outPath, "utf-8") : null;
4951
5776
  if (existing === source) return;
4952
5777
  markSelfGenWrite(state, outPath, source);
4953
5778
  writeFileSync3(outPath, source);
@@ -4965,10 +5790,10 @@ function writeRouteTypesFiles(state) {
4965
5790
  if (state.perRouterManifests.length === 0) return;
4966
5791
  try {
4967
5792
  const entryDir = dirname3(
4968
- resolve6(state.projectRoot, state.resolvedEntryPath)
5793
+ resolve7(state.projectRoot, state.resolvedEntryPath)
4969
5794
  );
4970
- const oldCombinedPath = join2(entryDir, "named-routes.gen.ts");
4971
- if (existsSync5(oldCombinedPath)) {
5795
+ const oldCombinedPath = join4(entryDir, "named-routes.gen.ts");
5796
+ if (existsSync6(oldCombinedPath)) {
4972
5797
  unlinkSync2(oldCombinedPath);
4973
5798
  console.log(
4974
5799
  `[rango] Removed stale combined route types: ${oldCombinedPath}`
@@ -5049,7 +5874,7 @@ function supplementGenFilesWithRuntimeRoutes(state) {
5049
5874
  }
5050
5875
 
5051
5876
  // src/vite/discovery/virtual-module-codegen.ts
5052
- import { dirname as dirname4, basename, join as join3 } from "node:path";
5877
+ import { dirname as dirname4, basename, join as join5 } from "node:path";
5053
5878
  function generateRoutesManifestModule(state) {
5054
5879
  const hasManifest = state.mergedRouteManifest && Object.keys(state.mergedRouteManifest).length > 0;
5055
5880
  if (hasManifest) {
@@ -5064,7 +5889,7 @@ function generateRoutesManifestModule(state) {
5064
5889
  /\.(tsx?|jsx?)$/,
5065
5890
  ""
5066
5891
  );
5067
- const genPath = join3(
5892
+ const genPath = join5(
5068
5893
  routerDir,
5069
5894
  `${routerBasename}.named-routes.gen.js`
5070
5895
  ).replaceAll("\\", "/");
@@ -5149,7 +5974,7 @@ function generatePerRouterModule(state, routerId) {
5149
5974
  /\.(tsx?|jsx?)$/,
5150
5975
  ""
5151
5976
  );
5152
- const genPath = join3(
5977
+ const genPath = join5(
5153
5978
  routerDir,
5154
5979
  `${routerBasename}.named-routes.gen.js`
5155
5980
  ).replaceAll("\\", "/");
@@ -5172,17 +5997,17 @@ function generatePerRouterModule(state, routerId) {
5172
5997
  `export const precomputedEntries = ${jsonParseExpression(entries)};`
5173
5998
  );
5174
5999
  }
5175
- return lines.join("\n") || "// empty router manifest";
6000
+ return lines.join("\n") || "";
5176
6001
  }
5177
6002
 
5178
6003
  // src/vite/discovery/bundle-postprocess.ts
5179
- import { resolve as resolve7 } from "node:path";
5180
- import { readFileSync as readFileSync5, writeFileSync as writeFileSync4, existsSync as existsSync6 } from "node:fs";
6004
+ import { resolve as resolve8 } from "node:path";
6005
+ import { readFileSync as readFileSync5, writeFileSync as writeFileSync4, existsSync as existsSync7 } from "node:fs";
5181
6006
  function postprocessBundle(state) {
5182
6007
  const hasPrerenderData = state.prerenderManifestEntries && Object.keys(state.prerenderManifestEntries).length > 0;
5183
6008
  const hasStaticData = state.staticManifestEntries && Object.keys(state.staticManifestEntries).length > 0;
5184
6009
  if (!hasPrerenderData && !hasStaticData) return;
5185
- const rscEntryPath = resolve7(
6010
+ const rscEntryPath = resolve8(
5186
6011
  state.projectRoot,
5187
6012
  "dist/rsc",
5188
6013
  state.rscEntryFileName ?? "index.js"
@@ -5203,7 +6028,7 @@ function postprocessBundle(state) {
5203
6028
  ];
5204
6029
  for (const target of evictionTargets) {
5205
6030
  for (const info of target.infos) {
5206
- const chunkPath = resolve7(state.projectRoot, "dist/rsc", info.fileName);
6031
+ const chunkPath = resolve8(state.projectRoot, "dist/rsc", info.fileName);
5207
6032
  try {
5208
6033
  const code = readFileSync5(chunkPath, "utf-8");
5209
6034
  const result = evictHandlerCode(
@@ -5228,7 +6053,7 @@ function postprocessBundle(state) {
5228
6053
  }
5229
6054
  state.handlerChunkInfoMap.clear();
5230
6055
  state.staticHandlerChunkInfoMap.clear();
5231
- if (hasPrerenderData && existsSync6(rscEntryPath)) {
6056
+ if (hasPrerenderData && existsSync7(rscEntryPath)) {
5232
6057
  const rscCode = readFileSync5(rscEntryPath, "utf-8");
5233
6058
  if (!rscCode.includes("__prerender-manifest.js")) {
5234
6059
  try {
@@ -5243,12 +6068,12 @@ function postprocessBundle(state) {
5243
6068
  manifestMap[key] = `./assets/${assetFileName}`;
5244
6069
  }
5245
6070
  const manifestCode = [
5246
- `const m=JSON.parse('${JSON.stringify(manifestMap).replace(/'/g, "\\'")}');`,
6071
+ `const m=${jsonParseExpression(manifestMap)};`,
5247
6072
  `export function loadPrerenderAsset(s){return import(s)}`,
5248
6073
  `export default m;`,
5249
6074
  ""
5250
6075
  ].join("\n");
5251
- const manifestPath = resolve7(
6076
+ const manifestPath = resolve8(
5252
6077
  state.projectRoot,
5253
6078
  "dist/rsc/__prerender-manifest.js"
5254
6079
  );
@@ -5268,7 +6093,7 @@ function postprocessBundle(state) {
5268
6093
  }
5269
6094
  }
5270
6095
  }
5271
- if (hasStaticData && existsSync6(rscEntryPath)) {
6096
+ if (hasStaticData && existsSync7(rscEntryPath)) {
5272
6097
  const rscCode = readFileSync5(rscEntryPath, "utf-8");
5273
6098
  if (!rscCode.includes("__static-manifest.js")) {
5274
6099
  try {
@@ -5286,7 +6111,7 @@ function postprocessBundle(state) {
5286
6111
  }
5287
6112
  const manifestCode = `const m={${manifestEntries.join(",")}};globalThis.__STATIC_MANIFEST=m;export default m;
5288
6113
  `;
5289
- const manifestPath = resolve7(
6114
+ const manifestPath = resolve8(
5290
6115
  state.projectRoot,
5291
6116
  "dist/rsc/__static-manifest.js"
5292
6117
  );
@@ -5318,8 +6143,8 @@ function createDiscoveryGate(s, debug11) {
5318
6143
  let pendingEvents = false;
5319
6144
  const beginGate = () => {
5320
6145
  if (gatePending) return;
5321
- s.discoveryDone = new Promise((resolve10) => {
5322
- gateResolver = resolve10;
6146
+ s.discoveryDone = new Promise((resolve11) => {
6147
+ gateResolver = resolve11;
5323
6148
  });
5324
6149
  gatePending = true;
5325
6150
  };
@@ -5411,15 +6236,15 @@ function selectForwardableResolvePlugins(plugins) {
5411
6236
  }
5412
6237
  function pickForwardedRunnerConfig(config) {
5413
6238
  const r = config.resolve ?? {};
5414
- const resolve10 = {};
5415
- if (r.alias !== void 0) resolve10.alias = r.alias;
5416
- if (r.dedupe !== void 0) resolve10.dedupe = r.dedupe;
5417
- if (r.conditions !== void 0) resolve10.conditions = r.conditions;
5418
- if (r.mainFields !== void 0) resolve10.mainFields = r.mainFields;
5419
- if (r.extensions !== void 0) resolve10.extensions = r.extensions;
6239
+ const resolve11 = {};
6240
+ if (r.alias !== void 0) resolve11.alias = r.alias;
6241
+ if (r.dedupe !== void 0) resolve11.dedupe = r.dedupe;
6242
+ if (r.conditions !== void 0) resolve11.conditions = r.conditions;
6243
+ if (r.mainFields !== void 0) resolve11.mainFields = r.mainFields;
6244
+ if (r.extensions !== void 0) resolve11.extensions = r.extensions;
5420
6245
  if (r.preserveSymlinks !== void 0)
5421
- resolve10.preserveSymlinks = r.preserveSymlinks;
5422
- if (r.tsconfigPaths !== void 0) resolve10.tsconfigPaths = r.tsconfigPaths;
6246
+ resolve11.preserveSymlinks = r.preserveSymlinks;
6247
+ if (r.tsconfigPaths !== void 0) resolve11.tsconfigPaths = r.tsconfigPaths;
5423
6248
  const userOxc = config.oxc;
5424
6249
  const userJsx = userOxc && typeof userOxc === "object" && typeof userOxc.jsx === "object" && userOxc.jsx !== null ? userOxc.jsx : {};
5425
6250
  const oxc = userOxc && typeof userOxc === "object" ? {
@@ -5427,7 +6252,7 @@ function pickForwardedRunnerConfig(config) {
5427
6252
  jsx: { ...userJsx, runtime: "automatic", importSource: "react" }
5428
6253
  } : { jsx: { runtime: "automatic", importSource: "react" } };
5429
6254
  return {
5430
- resolve: resolve10,
6255
+ resolve: resolve11,
5431
6256
  define: config.define,
5432
6257
  oxc
5433
6258
  };
@@ -5505,11 +6330,11 @@ async function resolveBuildEnv(option, factoryCtx) {
5505
6330
  );
5506
6331
  }
5507
6332
  try {
5508
- const userRequire = createRequire2(
5509
- resolve8(factoryCtx.root, "package.json")
6333
+ const userRequire = createRequire3(
6334
+ resolve9(factoryCtx.root, "package.json")
5510
6335
  );
5511
6336
  const wranglerPath = userRequire.resolve("wrangler");
5512
- const { getPlatformProxy } = await import(pathToFileURL(wranglerPath).href);
6337
+ const { getPlatformProxy } = await import(pathToFileURL2(wranglerPath).href);
5513
6338
  const proxy = await getPlatformProxy();
5514
6339
  return {
5515
6340
  env: proxy.env,
@@ -5571,6 +6396,7 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
5571
6396
  },
5572
6397
  configResolved(config) {
5573
6398
  s.projectRoot = config.root;
6399
+ s.scanFilter = opts?.discovery ? createScanFilter(s.projectRoot, opts.discovery) : void 0;
5574
6400
  s.isBuildMode = config.command === "build";
5575
6401
  viteCommand = config.command;
5576
6402
  viteMode = config.mode;
@@ -5605,8 +6431,8 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
5605
6431
  if (globalThis.__rscRouterDiscoveryActive) return;
5606
6432
  s.devServer = server;
5607
6433
  let resolveDiscovery;
5608
- const discoveryPromise = new Promise((resolve10) => {
5609
- resolveDiscovery = resolve10;
6434
+ const discoveryPromise = new Promise((resolve11) => {
6435
+ resolveDiscovery = resolve11;
5610
6436
  });
5611
6437
  const gate = createDiscoveryGate(s, debugDiscovery);
5612
6438
  const beginDiscoveryGate = gate.beginGate;
@@ -5962,10 +6788,9 @@ ${err.stack}`
5962
6788
  if (wantIntercept && result.interceptSegments?.length) {
5963
6789
  payload = {
5964
6790
  segments: [...result.segments, ...result.interceptSegments],
5965
- handles: {
5966
- ...result.handles,
5967
- ...result.interceptHandles || {}
5968
- }
6791
+ // Pre-encoded MERGED handle string from the producer (handles are
6792
+ // Flight-encoded so Promise/ReactNode values survive the wire).
6793
+ handles: result.interceptHandles ?? ""
5969
6794
  };
5970
6795
  } else {
5971
6796
  payload = { segments: result.segments, handles: result.handles };
@@ -5974,9 +6799,11 @@ ${err.stack}`
5974
6799
  logResult(200, `match ${result.routeName}`);
5975
6800
  return;
5976
6801
  } catch (err) {
5977
- console.warn(
5978
- `[rango] Dev prerender failed for ${pathname}: ${err.message}`
5979
- );
6802
+ if (err?.name !== "Skip") {
6803
+ console.warn(
6804
+ `[rango] Dev prerender error for ${pathname} (serving live instead): ${err.message}`
6805
+ );
6806
+ }
5980
6807
  }
5981
6808
  }
5982
6809
  res.statusCode = 404;
@@ -6183,7 +7010,7 @@ ${err.stack}`
6183
7010
  if (hasCreateRouter) {
6184
7011
  const nestedRouterConflict = findNestedRouterConflict([
6185
7012
  ...s.cachedRouterFiles ?? [],
6186
- resolve8(filePath)
7013
+ resolve9(filePath)
6187
7014
  ]);
6188
7015
  if (nestedRouterConflict) {
6189
7016
  server.config.logger.error(
@@ -6495,7 +7322,11 @@ async function rango(options) {
6495
7322
  ];
6496
7323
  const pkg = getPublishedPackageName();
6497
7324
  const nested = (spec) => `${pkg} > ${spec}`;
6498
- const routerRef = { path: void 0 };
7325
+ const routerRef = {
7326
+ path: void 0,
7327
+ kind: "router"
7328
+ };
7329
+ const explicitHostRouter = preset !== "cloudflare" ? resolvedOptions.hostRouter : void 0;
6499
7330
  const prerenderEnabled = true;
6500
7331
  if (preset === "cloudflare") {
6501
7332
  const { default: rsc } = await import("@vitejs/plugin-rsc");
@@ -6508,8 +7339,6 @@ async function rango(options) {
6508
7339
  enforce: "pre",
6509
7340
  config() {
6510
7341
  return {
6511
- // Exclude rsc-router modules from optimization to prevent module duplication
6512
- // This ensures the same Context instance is used by both browser entry and RSC proxy modules
6513
7342
  optimizeDeps: {
6514
7343
  exclude: excludeDeps,
6515
7344
  rolldownOptions: sharedRolldownOptions
@@ -6532,21 +7361,12 @@ async function rango(options) {
6532
7361
  client: {
6533
7362
  build: {
6534
7363
  rollupOptions: {
6535
- // FILE_NAME_CONFLICT (and any other client-build warning) is
6536
- // emitted by the CLIENT environment build, which consults THIS
6537
- // env's onwarn -- Vite 8's environment builds do NOT propagate
6538
- // the top-level build.rollupOptions.onwarn into the client env.
6539
- // Wire it here so the suppression runs where the conflicts
6540
- // originate (the top-level handler is invoked 0x for these; the
6541
- // client-env handler is invoked for all of them).
6542
7364
  onwarn,
6543
7365
  output: {
6544
7366
  manualChunks: getManualChunks
6545
7367
  }
6546
7368
  }
6547
7369
  },
6548
- // Pre-bundle rsc-html-stream to prevent discovery during first request
6549
- // Exclude rsc-router modules to ensure same Context instance
6550
7370
  optimizeDeps: {
6551
7371
  include: [nested("rsc-html-stream/client")],
6552
7372
  exclude: excludeDeps,
@@ -6554,12 +7374,9 @@ async function rango(options) {
6554
7374
  }
6555
7375
  },
6556
7376
  ssr: {
6557
- // Build SSR inside RSC directory so wrangler can deploy self-contained dist/rsc
6558
7377
  build: {
6559
7378
  outDir: "./dist/rsc/ssr"
6560
7379
  },
6561
- // Pre-bundle SSR entry and React for proper module linking with childEnvironments
6562
- // All deps must be listed to avoid late discovery triggering ERR_OUTDATED_OPTIMIZED_DEP
6563
7380
  optimizeDeps: {
6564
7381
  entries: [finalEntries.ssr],
6565
7382
  include: [
@@ -6579,10 +7396,7 @@ async function rango(options) {
6579
7396
  }
6580
7397
  },
6581
7398
  rsc: {
6582
- // RSC environment needs exclude list and esbuild options
6583
- // Exclude rsc-router modules to prevent createContext in RSC environment
6584
7399
  optimizeDeps: {
6585
- // Pre-bundle all RSC deps to prevent late discovery triggering ERR_OUTDATED_OPTIMIZED_DEP
6586
7400
  include: [
6587
7401
  "react",
6588
7402
  "react/jsx-runtime",
@@ -6620,17 +7434,41 @@ async function rango(options) {
6620
7434
  name: "@rangojs/router:auto-discover",
6621
7435
  config(userConfig) {
6622
7436
  if (routerRef.path) return;
6623
- const root = userConfig.root ? resolve9(process.cwd(), userConfig.root) : process.cwd();
7437
+ const root = userConfig.root ? resolve10(process.cwd(), userConfig.root) : process.cwd();
7438
+ const toRootRelative = (abs) => (abs.startsWith(root) ? "./" + abs.slice(root.length + 1) : abs).replaceAll("\\", "/");
7439
+ const bulletList = (files) => files.map((f) => " - " + toRootRelative(f)).join("\n");
7440
+ if (explicitHostRouter) {
7441
+ routerRef.path = explicitHostRouter.replaceAll("\\", "/");
7442
+ routerRef.kind = "host";
7443
+ return;
7444
+ }
7445
+ const hostCandidates = findHostRouterFiles(root);
7446
+ if (hostCandidates.length === 1) {
7447
+ routerRef.path = toRootRelative(hostCandidates[0]);
7448
+ routerRef.kind = "host";
7449
+ return;
7450
+ }
7451
+ if (hostCandidates.length > 1) {
7452
+ throw new Error(
7453
+ `[rango] Multiple host routers found:
7454
+ ${bulletList(hostCandidates)}
7455
+
7456
+ Set the \`hostRouter\` option to the entry to serve, e.g. rango({ preset: "${preset}", hostRouter: "./src/worker.rsc.tsx" }).`
7457
+ );
7458
+ }
6624
7459
  const candidates = findRouterFiles(root);
6625
7460
  if (candidates.length === 1) {
6626
- const abs = candidates[0];
6627
- routerRef.path = (abs.startsWith(root) ? "./" + abs.slice(root.length + 1) : abs).replaceAll("\\", "/");
6628
- } else if (candidates.length > 1) {
6629
- const list = candidates.map(
6630
- (f) => " - " + (f.startsWith(root) ? f.slice(root.length + 1) : f)
6631
- ).join("\n");
6632
- throw new Error(`[rango] Multiple routers found:
6633
- ${list}`);
7461
+ routerRef.path = toRootRelative(candidates[0]);
7462
+ routerRef.kind = "router";
7463
+ return;
7464
+ }
7465
+ if (candidates.length > 1) {
7466
+ throw new Error(
7467
+ `[rango] Multiple routers found:
7468
+ ${bulletList(candidates)}
7469
+
7470
+ If this is a multi-app host router, export a createHostRouter() instance and set the \`hostRouter\` option (e.g. rango({ preset: "${preset}", hostRouter: "./src/worker.rsc.tsx" })), or use preset: "cloudflare" where you own the worker entry.`
7471
+ );
6634
7472
  }
6635
7473
  }
6636
7474
  });
@@ -6644,8 +7482,12 @@ ${list}`);
6644
7482
  plugins.push({
6645
7483
  name: "@rangojs/router:rsc-integration",
6646
7484
  enforce: "pre",
6647
- config() {
7485
+ config(_userConfig, configEnv) {
7486
+ const vercelDefine = preset === "vercel" && configEnv.command === "build" ? { "process.env.NODE_ENV": JSON.stringify("production") } : void 0;
7487
+ const vercelServerEnv = preset === "vercel" ? { resolve: { noExternal: true } } : void 0;
7488
+ const vercelServerInclude = preset === "vercel" && configEnv.command === "serve" ? ["@vercel/functions"] : [];
6648
7489
  return {
7490
+ ...vercelDefine ? { define: vercelDefine } : {},
6649
7491
  optimizeDeps: {
6650
7492
  exclude: excludeDeps,
6651
7493
  rolldownOptions: sharedRolldownOptions
@@ -6668,13 +7510,6 @@ ${list}`);
6668
7510
  client: {
6669
7511
  build: {
6670
7512
  rollupOptions: {
6671
- // FILE_NAME_CONFLICT (and any other client-build warning) is
6672
- // emitted by the CLIENT environment build, which consults THIS
6673
- // env's onwarn -- Vite 8's environment builds do NOT propagate
6674
- // the top-level build.rollupOptions.onwarn into the client env.
6675
- // Wire it here so the suppression runs where the conflicts
6676
- // originate (the top-level handler is invoked 0x for these; the
6677
- // client-env handler is invoked for all of them).
6678
7513
  onwarn,
6679
7514
  output: {
6680
7515
  manualChunks: getManualChunks
@@ -6695,6 +7530,7 @@ ${list}`);
6695
7530
  }
6696
7531
  },
6697
7532
  ssr: {
7533
+ ...vercelServerEnv ?? {},
6698
7534
  optimizeDeps: {
6699
7535
  entries: [VIRTUAL_IDS.ssr],
6700
7536
  include: [
@@ -6706,13 +7542,15 @@ ${list}`);
6706
7542
  "react/jsx-dev-runtime",
6707
7543
  nested(
6708
7544
  "@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
6709
- )
7545
+ ),
7546
+ ...vercelServerInclude
6710
7547
  ],
6711
7548
  exclude: excludeDeps,
6712
7549
  rolldownOptions: sharedRolldownOptions
6713
7550
  }
6714
7551
  },
6715
7552
  rsc: {
7553
+ ...vercelServerEnv ?? {},
6716
7554
  optimizeDeps: {
6717
7555
  entries: [VIRTUAL_IDS.rsc],
6718
7556
  include: [
@@ -6721,8 +7559,15 @@ ${list}`);
6721
7559
  "react/jsx-dev-runtime",
6722
7560
  nested(
6723
7561
  "@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
6724
- )
7562
+ ),
7563
+ ...vercelServerInclude
6725
7564
  ],
7565
+ // Vite 8 does not propagate the top-level optimizeDeps.exclude
7566
+ // (set in config()) to non-client envs, so the rsc env must set
7567
+ // it explicitly — mirroring the node ssr env and the cloudflare
7568
+ // rsc env. Without it a strict-pnpm npm-installed app can try to
7569
+ // pre-bundle the router's own subpath entries and fail.
7570
+ exclude: excludeDeps,
6726
7571
  rolldownOptions: sharedRolldownOptions
6727
7572
  }
6728
7573
  }
@@ -6732,7 +7577,11 @@ ${list}`);
6732
7577
  configResolved(config) {
6733
7578
  if (showBanner) {
6734
7579
  const mode = config.command === "serve" ? process.argv.includes("preview") ? "preview" : "dev" : "build";
6735
- printBanner(mode, "node", rangoVersion);
7580
+ printBanner(
7581
+ mode,
7582
+ preset === "vercel" ? "vercel" : "node",
7583
+ rangoVersion
7584
+ );
6736
7585
  }
6737
7586
  const rscMinimalCount = config.plugins.filter(
6738
7587
  (p) => p.name === "rsc:minimal"
@@ -6765,8 +7614,7 @@ ${list}`);
6765
7614
  return;
6766
7615
  try {
6767
7616
  const source = readFileSync7(file, "utf-8");
6768
- const trimmed = source.trimStart();
6769
- if (trimmed.startsWith('"use client"') || trimmed.startsWith("'use client'")) {
7617
+ if (hasUseClientDirective(source)) {
6770
7618
  return [];
6771
7619
  }
6772
7620
  } catch {
@@ -6790,9 +7638,16 @@ ${list}`);
6790
7638
  enableBuildPrerender: prerenderEnabled,
6791
7639
  buildEnv: options?.buildEnv,
6792
7640
  preset,
7641
+ prerenderOnError: options?.prerender?.onError,
7642
+ discovery: options?.discovery,
6793
7643
  clientChunkCtx
6794
7644
  })
6795
7645
  );
7646
+ if (preset === "vercel") {
7647
+ plugins.push(
7648
+ createVercelOutputPlugin(resolvedOptions)
7649
+ );
7650
+ }
6796
7651
  debugConfig?.(
6797
7652
  "rango(%s) setup done: %d plugin(s) (%sms)",
6798
7653
  preset,
@@ -6805,7 +7660,7 @@ ${list}`);
6805
7660
  // src/vite/plugins/refresh-cmd.ts
6806
7661
  function poke() {
6807
7662
  return {
6808
- name: "vite-plugin-poke",
7663
+ name: "@rangojs/router:poke",
6809
7664
  apply: "serve",
6810
7665
  configureServer(server) {
6811
7666
  const stdin = process.stdin;