@rangojs/router 0.0.0-experimental.14 → 0.0.0-experimental.140

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 (460) hide show
  1. package/AGENTS.md +17 -0
  2. package/README.md +432 -7
  3. package/dist/bin/rango.js +2073 -213
  4. package/dist/testing/vitest.js +82 -0
  5. package/dist/vite/index.js +7258 -2714
  6. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  7. package/package.json +140 -67
  8. package/skills/api-client/SKILL.md +211 -0
  9. package/skills/breadcrumbs/SKILL.md +329 -0
  10. package/skills/bundle-analysis/SKILL.md +159 -0
  11. package/skills/cache-guide/SKILL.md +487 -0
  12. package/skills/caching/SKILL.md +357 -25
  13. package/skills/comparison/SKILL.md +50 -0
  14. package/skills/comparison/agents/openai.yaml +4 -0
  15. package/skills/comparison/references/framework-comparison.md +837 -0
  16. package/skills/composability/SKILL.md +246 -0
  17. package/skills/css/SKILL.md +76 -0
  18. package/skills/debug-manifest/SKILL.md +16 -10
  19. package/skills/document-cache/SKILL.md +87 -62
  20. package/skills/fonts/SKILL.md +6 -4
  21. package/skills/handler-use/SKILL.md +364 -0
  22. package/skills/hooks/SKILL.md +557 -79
  23. package/skills/host-router/SKILL.md +320 -0
  24. package/skills/i18n/SKILL.md +276 -0
  25. package/skills/intercept/SKILL.md +207 -15
  26. package/skills/layout/SKILL.md +146 -6
  27. package/skills/links/SKILL.md +304 -25
  28. package/skills/loader/SKILL.md +616 -54
  29. package/skills/middleware/SKILL.md +217 -37
  30. package/skills/migrate-nextjs/SKILL.md +611 -0
  31. package/skills/migrate-react-router/SKILL.md +927 -0
  32. package/skills/mime-routes/SKILL.md +42 -11
  33. package/skills/observability/SKILL.md +194 -0
  34. package/skills/parallel/SKILL.md +284 -3
  35. package/skills/ppr/SKILL.md +426 -0
  36. package/skills/prerender/SKILL.md +437 -52
  37. package/skills/rango/SKILL.md +369 -22
  38. package/skills/react-compiler/SKILL.md +168 -0
  39. package/skills/response-routes/SKILL.md +263 -121
  40. package/skills/route/SKILL.md +350 -21
  41. package/skills/router-setup/SKILL.md +246 -33
  42. package/skills/scripts/SKILL.md +179 -0
  43. package/skills/server-actions/SKILL.md +775 -0
  44. package/skills/shell-manifest/SKILL.md +185 -0
  45. package/skills/streams-and-websockets/SKILL.md +283 -0
  46. package/skills/tailwind/SKILL.md +27 -3
  47. package/skills/testing/SKILL.md +126 -222
  48. package/skills/testing/bindings.md +103 -0
  49. package/skills/testing/cache-prerender.md +127 -0
  50. package/skills/testing/client-components.md +124 -0
  51. package/skills/testing/e2e-parity.md +125 -0
  52. package/skills/testing/flight.md +91 -0
  53. package/skills/testing/handles.md +131 -0
  54. package/skills/testing/loader.md +128 -0
  55. package/skills/testing/middleware.md +99 -0
  56. package/skills/testing/render-handler.md +122 -0
  57. package/skills/testing/response-routes.md +95 -0
  58. package/skills/testing/reverse-and-types.md +85 -0
  59. package/skills/testing/server-actions.md +107 -0
  60. package/skills/testing/server-tree.md +128 -0
  61. package/skills/testing/setup.md +123 -0
  62. package/skills/theme/SKILL.md +9 -8
  63. package/skills/typesafety/SKILL.md +532 -103
  64. package/skills/use-cache/SKILL.md +367 -0
  65. package/skills/vercel/SKILL.md +128 -0
  66. package/skills/view-transitions/SKILL.md +337 -0
  67. package/src/__augment-tests__/augment.ts +81 -0
  68. package/src/__augment-tests__/augmented.check.ts +116 -0
  69. package/src/__internal.ts +77 -44
  70. package/src/bin/rango.ts +312 -15
  71. package/src/browser/action-coordinator.ts +114 -0
  72. package/src/browser/action-fence.ts +47 -0
  73. package/src/browser/app-shell.ts +39 -0
  74. package/src/browser/app-version.ts +14 -0
  75. package/src/browser/connection-warmup.ts +134 -0
  76. package/src/browser/cookie-name.ts +140 -0
  77. package/src/browser/event-controller.ts +293 -202
  78. package/src/browser/history-state.ts +101 -0
  79. package/src/browser/index.ts +3 -3
  80. package/src/browser/intercept-utils.ts +52 -0
  81. package/src/browser/invalidate-client-cache.ts +52 -0
  82. package/src/browser/link-interceptor.ts +24 -4
  83. package/src/browser/logging.ts +11 -0
  84. package/src/browser/merge-segment-loaders.ts +20 -12
  85. package/src/browser/navigation-bridge.ts +385 -576
  86. package/src/browser/navigation-client.ts +245 -75
  87. package/src/browser/navigation-store-handle.ts +38 -0
  88. package/src/browser/navigation-store.ts +184 -118
  89. package/src/browser/navigation-transaction.ts +247 -0
  90. package/src/browser/network-error-handler.ts +88 -0
  91. package/src/browser/partial-update.ts +412 -364
  92. package/src/browser/prefetch/cache.ts +359 -0
  93. package/src/browser/prefetch/fetch.ts +452 -0
  94. package/src/browser/prefetch/observer.ts +65 -0
  95. package/src/browser/prefetch/policy.ts +48 -0
  96. package/src/browser/prefetch/queue.ts +209 -0
  97. package/src/browser/prefetch/resource-ready.ts +77 -0
  98. package/src/browser/rango-state.ts +194 -0
  99. package/src/browser/react/Link.tsx +275 -68
  100. package/src/browser/react/NavigationProvider.tsx +265 -109
  101. package/src/browser/react/ScrollRestoration.tsx +10 -6
  102. package/src/browser/react/context.ts +11 -0
  103. package/src/browser/react/filter-segment-order.ts +70 -0
  104. package/src/browser/react/index.ts +0 -48
  105. package/src/browser/react/location-state-shared.ts +272 -60
  106. package/src/browser/react/location-state.ts +90 -20
  107. package/src/browser/react/mount-context.ts +6 -1
  108. package/src/browser/react/nonce-context.ts +23 -0
  109. package/src/browser/react/shallow-equal.ts +27 -0
  110. package/src/browser/react/use-action.ts +35 -66
  111. package/src/browser/react/use-handle.ts +39 -126
  112. package/src/browser/react/use-href.tsx +8 -1
  113. package/src/browser/react/use-link-status.ts +39 -13
  114. package/src/browser/react/use-navigation.ts +53 -69
  115. package/src/browser/react/use-params.ts +75 -0
  116. package/src/browser/react/use-pathname.ts +47 -0
  117. package/src/browser/react/use-reverse.ts +106 -0
  118. package/src/browser/react/use-router.ts +98 -0
  119. package/src/browser/react/use-search-params.ts +51 -0
  120. package/src/browser/react/use-segments.ts +72 -99
  121. package/src/browser/response-adapter.ts +164 -0
  122. package/src/browser/rsc-router.tsx +300 -72
  123. package/src/browser/scroll-restoration.ts +138 -50
  124. package/src/browser/segment-reconciler.ts +243 -0
  125. package/src/browser/segment-structure-assert.ts +17 -1
  126. package/src/browser/server-action-bridge.ts +668 -613
  127. package/src/browser/types.ts +223 -51
  128. package/src/browser/validate-redirect-origin.ts +56 -0
  129. package/src/build/collect-fallback-refs.ts +107 -0
  130. package/src/build/generate-manifest.ts +252 -161
  131. package/src/build/generate-route-types.ts +41 -1038
  132. package/src/build/index.ts +12 -7
  133. package/src/build/prefix-tree-utils.ts +123 -0
  134. package/src/build/route-trie.ts +225 -42
  135. package/src/build/route-types/ast-helpers.ts +25 -0
  136. package/src/build/route-types/ast-route-extraction.ts +105 -0
  137. package/src/build/route-types/codegen.ts +113 -0
  138. package/src/build/route-types/include-resolution.ts +812 -0
  139. package/src/build/route-types/param-extraction.ts +51 -0
  140. package/src/build/route-types/per-module-writer.ts +144 -0
  141. package/src/build/route-types/router-processing.ts +695 -0
  142. package/src/build/route-types/scan-filter.ts +85 -0
  143. package/src/build/route-types/source-scan.ts +216 -0
  144. package/src/build/runtime-discovery.ts +223 -0
  145. package/src/cache/background-task.ts +34 -0
  146. package/src/cache/cache-error.ts +104 -0
  147. package/src/cache/cache-key-utils.ts +60 -0
  148. package/src/cache/cache-policy.ts +199 -0
  149. package/src/cache/cache-runtime.ts +525 -0
  150. package/src/cache/cache-scope.ts +298 -332
  151. package/src/cache/cache-tag.ts +103 -0
  152. package/src/cache/cf/cf-base64.ts +33 -0
  153. package/src/cache/cf/cf-cache-constants.ts +127 -0
  154. package/src/cache/cf/cf-cache-store.ts +2500 -158
  155. package/src/cache/cf/cf-cache-types.ts +349 -0
  156. package/src/cache/cf/cf-kv-utils.ts +46 -0
  157. package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
  158. package/src/cache/cf/index.ts +17 -17
  159. package/src/cache/document-cache.ts +199 -92
  160. package/src/cache/handle-capture.ts +81 -0
  161. package/src/cache/handle-snapshot.ts +111 -0
  162. package/src/cache/index.ts +29 -35
  163. package/src/cache/memory-segment-store.ts +363 -30
  164. package/src/cache/profile-registry.ts +88 -0
  165. package/src/cache/read-through-swr.ts +178 -0
  166. package/src/cache/segment-codec.ts +248 -0
  167. package/src/cache/shell-cache.ts +386 -0
  168. package/src/cache/tag-invalidation.ts +230 -0
  169. package/src/cache/taint.ts +153 -0
  170. package/src/cache/types.ts +156 -211
  171. package/src/cache/vercel/index.ts +11 -0
  172. package/src/cache/vercel/vercel-cache-store.ts +1102 -0
  173. package/src/client.rsc.tsx +43 -21
  174. package/src/client.tsx +131 -347
  175. package/src/cloudflare/index.ts +11 -0
  176. package/src/cloudflare/tracing.ts +109 -0
  177. package/src/component-utils.ts +23 -4
  178. package/src/components/DefaultDocument.tsx +13 -3
  179. package/src/context-var.ts +168 -0
  180. package/src/debug.ts +19 -9
  181. package/src/decode-loader-results.ts +52 -0
  182. package/src/defer.ts +185 -0
  183. package/src/deps/ssr.ts +0 -1
  184. package/src/encode-kv.ts +49 -0
  185. package/src/errors.ts +106 -10
  186. package/src/escape-script.ts +52 -0
  187. package/src/handle.ts +110 -35
  188. package/src/handles/MetaTags.tsx +83 -59
  189. package/src/handles/Scripts.tsx +183 -0
  190. package/src/handles/breadcrumbs.ts +93 -0
  191. package/src/handles/deferred-resolution.ts +127 -0
  192. package/src/handles/is-thenable.ts +18 -0
  193. package/src/handles/meta.ts +44 -53
  194. package/src/handles/script.ts +244 -0
  195. package/src/host/cookie-handler.ts +20 -65
  196. package/src/host/errors.ts +21 -30
  197. package/src/host/index.ts +13 -9
  198. package/src/host/pattern-matcher.ts +50 -79
  199. package/src/host/router.ts +151 -121
  200. package/src/host/testing.ts +45 -32
  201. package/src/host/types.ts +52 -11
  202. package/src/host/utils.ts +2 -2
  203. package/src/href-client.ts +192 -57
  204. package/src/index.rsc.ts +177 -35
  205. package/src/index.ts +255 -71
  206. package/src/internal-debug.ts +9 -2
  207. package/src/loader-store.ts +500 -0
  208. package/src/loader.rsc.ts +31 -99
  209. package/src/loader.ts +30 -12
  210. package/src/missing-id-error.ts +68 -0
  211. package/src/outlet-context.ts +1 -1
  212. package/src/outlet-provider.tsx +41 -0
  213. package/src/prerender/param-hash.ts +16 -14
  214. package/src/prerender/store.ts +121 -21
  215. package/src/prerender.ts +460 -26
  216. package/src/redirect-origin.ts +100 -0
  217. package/src/regex-escape.ts +8 -0
  218. package/src/render-error-thrower.tsx +20 -0
  219. package/src/response-utils.ts +62 -0
  220. package/src/reverse.ts +198 -128
  221. package/src/root-error-boundary.tsx +42 -48
  222. package/src/route-content-wrapper.tsx +22 -77
  223. package/src/route-definition/dsl-helpers.ts +1116 -0
  224. package/src/route-definition/helper-factories.ts +88 -0
  225. package/src/route-definition/helpers-types.ts +505 -0
  226. package/src/route-definition/index.ts +54 -0
  227. package/src/route-definition/redirect.ts +134 -0
  228. package/src/route-definition/resolve-handler-use.ts +160 -0
  229. package/src/route-definition/use-item-types.ts +29 -0
  230. package/src/route-definition.ts +1 -1481
  231. package/src/route-map-builder.ts +82 -144
  232. package/src/route-name.ts +53 -0
  233. package/src/route-types.ts +71 -45
  234. package/src/router/basename.ts +14 -0
  235. package/src/router/content-negotiation.ts +263 -0
  236. package/src/router/debug-manifest.ts +72 -0
  237. package/src/router/error-handling.ts +54 -27
  238. package/src/router/find-match.ts +245 -0
  239. package/src/router/handler-context.ts +377 -125
  240. package/src/router/instrument.ts +350 -0
  241. package/src/router/intercept-resolution.ts +59 -28
  242. package/src/router/lazy-includes.ts +254 -0
  243. package/src/router/loader-resolution.ts +421 -157
  244. package/src/router/logging.ts +106 -6
  245. package/src/router/manifest.ts +131 -57
  246. package/src/router/match-api.ts +167 -246
  247. package/src/router/match-context.ts +4 -24
  248. package/src/router/match-handlers.ts +440 -0
  249. package/src/router/match-middleware/background-revalidation.ts +117 -93
  250. package/src/router/match-middleware/cache-lookup.ts +297 -150
  251. package/src/router/match-middleware/cache-store.ts +123 -51
  252. package/src/router/match-middleware/intercept-resolution.ts +44 -43
  253. package/src/router/match-middleware/segment-resolution.ts +64 -22
  254. package/src/router/match-pipelines.ts +11 -87
  255. package/src/router/match-result.ts +121 -50
  256. package/src/router/metrics.ts +219 -28
  257. package/src/router/middleware-types.ts +93 -0
  258. package/src/router/middleware.ts +505 -441
  259. package/src/router/navigation-snapshot.ts +133 -0
  260. package/src/router/params-util.ts +23 -0
  261. package/src/router/parse-pattern.ts +115 -0
  262. package/src/router/pattern-matching.ts +311 -142
  263. package/src/router/prefetch-cache-ttl.ts +51 -0
  264. package/src/router/prefetch-limits.ts +37 -0
  265. package/src/router/prerender-match.ts +547 -0
  266. package/src/router/preview-match.ts +102 -0
  267. package/src/router/request-classification.ts +278 -0
  268. package/src/router/revalidation.ts +203 -62
  269. package/src/router/route-snapshot.ts +246 -0
  270. package/src/router/router-context.ts +45 -48
  271. package/src/router/router-interfaces.ts +554 -0
  272. package/src/router/router-options.ts +779 -0
  273. package/src/router/router-registry.ts +21 -0
  274. package/src/router/segment-resolution/fresh.ts +772 -0
  275. package/src/router/segment-resolution/helpers.ts +348 -0
  276. package/src/router/segment-resolution/loader-cache.ts +250 -0
  277. package/src/router/segment-resolution/loader-mask.ts +44 -0
  278. package/src/router/segment-resolution/revalidation.ts +1331 -0
  279. package/src/router/segment-resolution/static-store.ts +81 -0
  280. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  281. package/src/router/segment-resolution/view-transition-default.ts +56 -0
  282. package/src/router/segment-resolution.ts +25 -1354
  283. package/src/router/segment-wrappers.ts +292 -0
  284. package/src/router/state-cookie-name.ts +33 -0
  285. package/src/router/substitute-pattern-params.ts +75 -0
  286. package/src/router/telemetry-otel.ts +261 -0
  287. package/src/router/telemetry.ts +377 -0
  288. package/src/router/timeout.ts +128 -0
  289. package/src/router/tracing.ts +206 -0
  290. package/src/router/trie-matching.ts +240 -61
  291. package/src/router/types.ts +23 -70
  292. package/src/router/url-params.ts +57 -0
  293. package/src/router.ts +781 -2378
  294. package/src/rsc/full-payload.ts +70 -0
  295. package/src/rsc/handler-context.ts +46 -0
  296. package/src/rsc/handler.ts +905 -1142
  297. package/src/rsc/helpers.ts +275 -19
  298. package/src/rsc/index.ts +2 -25
  299. package/src/rsc/json-route-result.ts +38 -0
  300. package/src/rsc/loader-fetch.ts +305 -0
  301. package/src/rsc/manifest-init.ts +77 -0
  302. package/src/rsc/nonce.ts +14 -0
  303. package/src/rsc/origin-guard.ts +155 -0
  304. package/src/rsc/progressive-enhancement.ts +502 -0
  305. package/src/rsc/redirect-guard.ts +99 -0
  306. package/src/rsc/response-cache-serve.ts +238 -0
  307. package/src/rsc/response-error.ts +104 -0
  308. package/src/rsc/response-route-handler.ts +257 -0
  309. package/src/rsc/rsc-rendering.ts +337 -0
  310. package/src/rsc/runtime-warnings.ts +55 -0
  311. package/src/rsc/server-action.ts +522 -0
  312. package/src/rsc/shell-capture.ts +439 -0
  313. package/src/rsc/ssr-setup.ts +144 -0
  314. package/src/rsc/transition-gate.ts +89 -0
  315. package/src/rsc/types.ts +95 -12
  316. package/src/runtime-env.ts +18 -0
  317. package/src/search-params.ts +99 -82
  318. package/src/segment-content-promise.ts +67 -0
  319. package/src/segment-loader-promise.ts +149 -0
  320. package/src/segment-system.tsx +349 -134
  321. package/src/serialize.ts +243 -0
  322. package/src/server/context.ts +452 -85
  323. package/src/server/cookie-parse.ts +32 -0
  324. package/src/server/cookie-store.ts +310 -0
  325. package/src/server/fetchable-loader-store.ts +11 -6
  326. package/src/server/handle-store.ts +123 -42
  327. package/src/server/live.ts +130 -0
  328. package/src/server/loader-registry.ts +51 -100
  329. package/src/server/request-context.ts +842 -157
  330. package/src/server.ts +15 -8
  331. package/src/ssr/index.tsx +412 -136
  332. package/src/ssr/ssr-root.tsx +228 -0
  333. package/src/static-handler.ts +45 -18
  334. package/src/testing/cache-status.ts +162 -0
  335. package/src/testing/collect-handle.ts +46 -0
  336. package/src/testing/dispatch.ts +701 -0
  337. package/src/testing/dom.entry.ts +22 -0
  338. package/src/testing/e2e/fixture.ts +188 -0
  339. package/src/testing/e2e/index.ts +128 -0
  340. package/src/testing/e2e/matchers.ts +35 -0
  341. package/src/testing/e2e/page-helpers.ts +272 -0
  342. package/src/testing/e2e/parity.ts +387 -0
  343. package/src/testing/e2e/server.ts +195 -0
  344. package/src/testing/flight-matchers.ts +97 -0
  345. package/src/testing/flight-normalize.ts +11 -0
  346. package/src/testing/flight-runtime.d.ts +57 -0
  347. package/src/testing/flight-tree.ts +682 -0
  348. package/src/testing/flight.entry.ts +52 -0
  349. package/src/testing/flight.ts +257 -0
  350. package/src/testing/generated-routes.ts +199 -0
  351. package/src/testing/index.ts +105 -0
  352. package/src/testing/internal/context.ts +371 -0
  353. package/src/testing/internal/flight-client-globals.ts +30 -0
  354. package/src/testing/internal/seed-vars.ts +54 -0
  355. package/src/testing/render-handler.ts +357 -0
  356. package/src/testing/render-route.tsx +584 -0
  357. package/src/testing/run-loader.ts +385 -0
  358. package/src/testing/run-middleware.ts +205 -0
  359. package/src/testing/run-transition-when.ts +164 -0
  360. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  361. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  362. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  363. package/src/testing/vitest-stubs/version.ts +5 -0
  364. package/src/testing/vitest.ts +305 -0
  365. package/src/theme/ThemeProvider.tsx +40 -72
  366. package/src/theme/ThemeScript.tsx +12 -14
  367. package/src/theme/constants.ts +57 -15
  368. package/src/theme/index.ts +3 -20
  369. package/src/theme/theme-context.ts +5 -35
  370. package/src/theme/theme-script.ts +43 -39
  371. package/src/theme/use-theme.ts +0 -3
  372. package/src/types/boundaries.ts +123 -0
  373. package/src/types/cache-types.ts +207 -0
  374. package/src/types/error-types.ts +132 -0
  375. package/src/types/global-namespace.ts +113 -0
  376. package/src/types/handler-context.ts +839 -0
  377. package/src/types/index.ts +81 -0
  378. package/src/types/loader-types.ts +212 -0
  379. package/src/types/request-scope.ts +112 -0
  380. package/src/types/route-config.ts +138 -0
  381. package/src/types/route-entry.ts +114 -0
  382. package/src/types/segments.ts +271 -0
  383. package/src/types.ts +1 -1795
  384. package/src/urls/include-helper.ts +162 -0
  385. package/src/urls/include-provider.ts +71 -0
  386. package/src/urls/index.ts +43 -0
  387. package/src/urls/path-helper-types.ts +413 -0
  388. package/src/urls/path-helper.ts +275 -0
  389. package/src/urls/pattern-types.ts +124 -0
  390. package/src/urls/response-types.ts +109 -0
  391. package/src/urls/type-extraction.ts +316 -0
  392. package/src/urls/urls-function.ts +80 -0
  393. package/src/urls.ts +1 -1341
  394. package/src/use-loader.tsx +406 -141
  395. package/src/vercel/index.ts +11 -0
  396. package/src/vercel/tracing.ts +88 -0
  397. package/src/vite/debug.ts +185 -0
  398. package/src/vite/discovery/bundle-postprocess.ts +182 -0
  399. package/src/vite/discovery/discover-routers.ts +389 -0
  400. package/src/vite/discovery/discovery-errors.ts +255 -0
  401. package/src/vite/discovery/gate-state.ts +171 -0
  402. package/src/vite/discovery/prerender-collection.ts +467 -0
  403. package/src/vite/discovery/route-types-writer.ts +214 -0
  404. package/src/vite/discovery/self-gen-tracking.ts +73 -0
  405. package/src/vite/discovery/state.ts +161 -0
  406. package/src/vite/discovery/virtual-module-codegen.ts +183 -0
  407. package/src/vite/index.ts +23 -2255
  408. package/src/vite/inject-client-debug.ts +36 -0
  409. package/src/vite/plugin-types.ts +303 -0
  410. package/src/vite/plugins/cjs-to-esm.ts +90 -0
  411. package/src/vite/plugins/client-ref-dedup.ts +120 -0
  412. package/src/vite/plugins/client-ref-hashing.ts +118 -0
  413. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  414. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  415. package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
  416. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
  417. package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +89 -79
  418. package/src/vite/plugins/expose-ids/export-analysis.ts +363 -0
  419. package/src/vite/plugins/expose-ids/handler-transform.ts +130 -0
  420. package/src/vite/plugins/expose-ids/loader-transform.ts +64 -0
  421. package/src/vite/plugins/expose-ids/router-transform.ts +199 -0
  422. package/src/vite/plugins/expose-ids/types.ts +45 -0
  423. package/src/vite/plugins/expose-internal-ids.ts +805 -0
  424. package/src/vite/plugins/performance-tracks.ts +89 -0
  425. package/src/vite/plugins/refresh-cmd.ts +127 -0
  426. package/src/vite/plugins/use-cache-transform.ts +313 -0
  427. package/src/vite/plugins/vercel-output.ts +384 -0
  428. package/src/vite/plugins/version-injector.ts +94 -0
  429. package/src/vite/plugins/version-plugin.ts +263 -0
  430. package/src/vite/plugins/virtual-entries.ts +234 -0
  431. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  432. package/src/vite/rango.ts +560 -0
  433. package/src/vite/router-discovery.ts +1638 -0
  434. package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +200 -37
  435. package/src/vite/utils/banner.ts +36 -0
  436. package/src/vite/utils/bundle-analysis.ts +132 -0
  437. package/src/vite/utils/client-chunks.ts +184 -0
  438. package/src/vite/utils/directive-prologue.ts +40 -0
  439. package/src/vite/utils/forward-user-plugins.ts +171 -0
  440. package/src/vite/utils/manifest-utils.ts +15 -0
  441. package/src/vite/utils/package-resolution.ts +89 -0
  442. package/src/vite/utils/prerender-utils.ts +249 -0
  443. package/src/vite/utils/shared-utils.ts +269 -0
  444. package/CLAUDE.md +0 -43
  445. package/dist/vite/index.named-routes.gen.ts +0 -103
  446. package/src/browser/lru-cache.ts +0 -69
  447. package/src/browser/react/use-client-cache.ts +0 -56
  448. package/src/browser/request-controller.ts +0 -164
  449. package/src/browser/shallow.ts +0 -35
  450. package/src/cache/memory-store.ts +0 -253
  451. package/src/handles/index.ts +0 -6
  452. package/src/href-context.ts +0 -33
  453. package/src/network-error-thrower.tsx +0 -21
  454. package/src/router.gen.ts +0 -6
  455. package/src/static-handler.gen.ts +0 -5
  456. package/src/urls.gen.ts +0 -8
  457. package/src/vite/expose-internal-ids.ts +0 -1167
  458. package/src/vite/package-resolution.ts +0 -125
  459. package/src/vite/virtual-entries.ts +0 -114
  460. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
@@ -0,0 +1,275 @@
1
+ import type { ReactNode } from "react";
2
+ import type { Handler } from "../types.js";
3
+ import type { RouteItem, RouteUseItem, UseItems } from "../route-types.js";
4
+ import {
5
+ getUrlPrefix,
6
+ getNamePrefix,
7
+ getRootScoped,
8
+ requireDslContext,
9
+ } from "../server/context";
10
+ import { invariant, DataNotFoundError } from "../errors";
11
+ import { validateUserRouteName } from "../route-name.js";
12
+ import {
13
+ isPrerenderHandler,
14
+ isPassthroughHandler,
15
+ type PrerenderHandlerDefinition,
16
+ } from "../prerender.js";
17
+ import {
18
+ isStaticHandler,
19
+ type StaticHandlerDefinition,
20
+ } from "../static-handler.js";
21
+ import {
22
+ registerSearchSchema,
23
+ registerRouteRootScope,
24
+ } from "../route-map-builder.js";
25
+ import { RESPONSE_TYPE } from "./response-types.js";
26
+ import type { PathOptions } from "./pattern-types.js";
27
+ import type {
28
+ PathFn,
29
+ ResponsePathFn,
30
+ JsonResponsePathFn,
31
+ TextResponsePathFn,
32
+ } from "./path-helper-types.js";
33
+ import {
34
+ resolveHandlerUse,
35
+ mergeHandlerUse,
36
+ } from "../route-definition/resolve-handler-use.js";
37
+ import {
38
+ emptySegmentBase,
39
+ runAndValidateUseItems,
40
+ } from "../route-definition/dsl-helpers.js";
41
+
42
+ function applyUrlPrefix(prefix: string, pattern: string): string {
43
+ if (!prefix) return pattern;
44
+ if (pattern === "/") return prefix;
45
+ if (prefix.endsWith("/") && pattern.startsWith("/")) {
46
+ return prefix + pattern.slice(1);
47
+ }
48
+ return prefix + pattern;
49
+ }
50
+
51
+ function applyNamePrefix(prefix: string | undefined, name: string): string {
52
+ if (!prefix) return name;
53
+ return `${prefix}.${name}`;
54
+ }
55
+
56
+ function resolveResponseType(
57
+ options: PathOptions | undefined,
58
+ ): string | undefined {
59
+ return options?.[RESPONSE_TYPE];
60
+ }
61
+
62
+ export function createPathHelper<TEnv>(): PathFn<TEnv> {
63
+ return ((
64
+ pattern: string,
65
+ handler: ReactNode | Handler<any, any, TEnv>,
66
+ optionsOrUse?: PathOptions | (() => UseItems<RouteUseItem>),
67
+ maybeUse?: () => UseItems<RouteUseItem>,
68
+ ): RouteItem => {
69
+ const { store, ctx } = requireDslContext(
70
+ "path() must be called inside urls()",
71
+ );
72
+
73
+ invariant(
74
+ !ctx.parent || ctx.parent.type !== "parallel",
75
+ "path() cannot be used inside parallel()",
76
+ );
77
+
78
+ {
79
+ let ancestor = ctx.parent;
80
+ while (ancestor) {
81
+ invariant(
82
+ ancestor.type !== "route",
83
+ "path() cannot be nested inside another path()",
84
+ );
85
+ ancestor = ancestor.parent;
86
+ }
87
+ }
88
+
89
+ let options: PathOptions | undefined;
90
+ let use: (() => UseItems<RouteUseItem>) | undefined;
91
+
92
+ if (typeof optionsOrUse === "function") {
93
+ // path(pattern, handler, use)
94
+ use = optionsOrUse as () => UseItems<RouteUseItem>;
95
+ } else if (typeof optionsOrUse === "object") {
96
+ // path(pattern, handler, options) or path(pattern, handler, options, use)
97
+ options = optionsOrUse as PathOptions;
98
+ use = maybeUse;
99
+ }
100
+
101
+ const handlerUseFn = resolveHandlerUse(handler);
102
+ const mountSite = resolveResponseType(options) ? "response" : "path";
103
+ const mergedUse = mergeHandlerUse(handlerUseFn, use, mountSite);
104
+
105
+ const urlPrefix = getUrlPrefix();
106
+ const namePrefix = getNamePrefix();
107
+
108
+ const prefixedPattern = applyUrlPrefix(urlPrefix, pattern);
109
+
110
+ const localName =
111
+ options?.name || `$path_${pattern.replace(/[/:*?]/g, "_")}`;
112
+ if (options?.name) {
113
+ validateUserRouteName(options.name);
114
+ }
115
+ const routeName = applyNamePrefix(namePrefix, localName);
116
+
117
+ const namespace = `${ctx.namespace}.${store.getNextIndex("route")}.${routeName}`;
118
+
119
+ if (ctx.forRoute && routeName !== ctx.forRoute) {
120
+ store.getShortCode("route");
121
+ return { type: "route" } as RouteItem;
122
+ }
123
+
124
+ const wrappedHandler: Handler<any, any, TEnv> =
125
+ typeof handler === "function"
126
+ ? (handler as Handler<any, any, TEnv>)
127
+ : isPassthroughHandler(handler)
128
+ ? typeof handler.prerenderDef.handler === "function"
129
+ ? (handler.prerenderDef.handler as Handler<any, any, TEnv>)
130
+ : () => {
131
+ throw new DataNotFoundError(
132
+ "No prerender data found for this route",
133
+ );
134
+ }
135
+ : isPrerenderHandler(handler)
136
+ ? typeof handler.handler === "function"
137
+ ? (handler.handler as Handler<any, any, TEnv>)
138
+ : () => {
139
+ throw new DataNotFoundError(
140
+ "No prerender data found for this route",
141
+ );
142
+ }
143
+ : isStaticHandler(handler)
144
+ ? (handler.handler as Handler<any, any, TEnv>)
145
+ : () => handler;
146
+
147
+ const entry = {
148
+ ...emptySegmentBase(),
149
+ id: namespace,
150
+ shortCode: store.getShortCode("route"),
151
+ type: "route" as const,
152
+ parent: ctx.parent,
153
+ handler: wrappedHandler,
154
+ pattern: prefixedPattern,
155
+ ...(urlPrefix ? { mountPath: urlPrefix } : {}),
156
+ ...(isPassthroughHandler(handler)
157
+ ? {
158
+ isPrerender: true as const,
159
+ prerenderDef: handler.prerenderDef as PrerenderHandlerDefinition,
160
+ isPassthrough: true as const,
161
+ liveHandler: handler.liveHandler as Handler<any, any, TEnv>,
162
+ }
163
+ : isPrerenderHandler(handler)
164
+ ? {
165
+ isPrerender: true as const,
166
+ prerenderDef: handler as PrerenderHandlerDefinition,
167
+ }
168
+ : {}),
169
+ ...(isStaticHandler(handler)
170
+ ? {
171
+ isStaticPrerender: true as const,
172
+ ...(handler.$$id ? { staticHandlerId: handler.$$id } : {}),
173
+ }
174
+ : {}),
175
+ ...(resolveResponseType(options)
176
+ ? { responseType: resolveResponseType(options) }
177
+ : {}),
178
+ };
179
+
180
+ if (isStaticHandler(handler) && handler.$$id && ctx.namePrefix) {
181
+ (handler as any).$$routePrefix = ctx.namePrefix;
182
+ }
183
+
184
+ invariant(
185
+ ctx.manifest.get(routeName) === undefined,
186
+ `Duplicate route name: ${routeName} at ${namespace}`,
187
+ );
188
+
189
+ ctx.manifest.set(routeName, entry);
190
+
191
+ registerRouteRootScope(routeName, getRootScoped());
192
+
193
+ if (ctx.patterns) {
194
+ ctx.patterns.set(routeName, prefixedPattern);
195
+ }
196
+
197
+ if (ctx.patternsByPrefix) {
198
+ const urlPrefix = getUrlPrefix() || "";
199
+ if (!ctx.patternsByPrefix.has(urlPrefix)) {
200
+ ctx.patternsByPrefix.set(urlPrefix, new Map());
201
+ }
202
+ ctx.patternsByPrefix.get(urlPrefix)!.set(routeName, prefixedPattern);
203
+ }
204
+
205
+ if (options?.trailingSlash && ctx.trailingSlash) {
206
+ ctx.trailingSlash.set(routeName, options.trailingSlash);
207
+ }
208
+
209
+ if (options?.search) {
210
+ if (ctx.searchSchemas) {
211
+ ctx.searchSchemas.set(routeName, options.search);
212
+ }
213
+ registerSearchSchema(routeName, options.search);
214
+ }
215
+
216
+ if (mergedUse) {
217
+ const result = runAndValidateUseItems(
218
+ store,
219
+ namespace,
220
+ entry,
221
+ mergedUse,
222
+ "path",
223
+ "use",
224
+ );
225
+ return { name: namespace, type: "route", uses: result } as RouteItem;
226
+ }
227
+
228
+ return { name: namespace, type: "route" } as RouteItem;
229
+ }) as PathFn<TEnv>;
230
+ }
231
+
232
+ export function attachPathResponseTags<TEnv>(
233
+ pathFn: PathFn<TEnv>,
234
+ ): PathFn<TEnv> & {
235
+ json: JsonResponsePathFn<TEnv>;
236
+ text: TextResponsePathFn<TEnv>;
237
+ html: TextResponsePathFn<TEnv>;
238
+ xml: TextResponsePathFn<TEnv>;
239
+ md: TextResponsePathFn<TEnv>;
240
+ image: ResponsePathFn<TEnv>;
241
+ stream: ResponsePathFn<TEnv>;
242
+ any: ResponsePathFn<TEnv>;
243
+ } {
244
+ function createTagged(responseType: string): ResponsePathFn<TEnv> {
245
+ return ((
246
+ pattern: string,
247
+ handler: any,
248
+ optionsOrUse?: any,
249
+ maybeUse?: any,
250
+ ) => {
251
+ let options: PathOptions;
252
+ let use: (() => any[]) | undefined;
253
+ if (typeof optionsOrUse === "function") {
254
+ options = { [RESPONSE_TYPE]: responseType };
255
+ use = optionsOrUse;
256
+ } else {
257
+ options = { ...optionsOrUse, [RESPONSE_TYPE]: responseType };
258
+ use = maybeUse;
259
+ }
260
+
261
+ return pathFn(pattern, handler, options, use);
262
+ }) as ResponsePathFn<TEnv>;
263
+ }
264
+
265
+ const extended = pathFn as any;
266
+ extended.json = createTagged("json");
267
+ extended.text = createTagged("text");
268
+ extended.html = createTagged("html");
269
+ extended.xml = createTagged("xml");
270
+ extended.md = createTagged("md");
271
+ extended.image = createTagged("image");
272
+ extended.stream = createTagged("stream");
273
+ extended.any = createTagged("any");
274
+ return extended;
275
+ }
@@ -0,0 +1,124 @@
1
+ import type { TrailingSlashMode } from "../types.js";
2
+ import type { AllUseItems, UrlPatternsBrand } from "../route-types.js";
3
+ import type { SearchSchema } from "../search-params.js";
4
+ import { RESPONSE_TYPE } from "./response-types.js";
5
+ import type { DefaultEnv } from "../types.js";
6
+ import type { PathHelpers } from "./path-helper-types.js";
7
+
8
+ /**
9
+ * Builder function accepted by urls() and as a shorthand for routes()/urls option.
10
+ * When passed directly to routes() or createRouter({ urls }), it is wrapped in urls() automatically.
11
+ */
12
+ export type UrlBuilder<
13
+ TEnv = DefaultEnv,
14
+ TItems extends readonly (AllUseItems | readonly AllUseItems[])[] =
15
+ readonly AllUseItems[],
16
+ > = (helpers: PathHelpers<TEnv>) => TItems;
17
+
18
+ /**
19
+ * Sentinel type for unnamed routes.
20
+ * Using a branded string instead of `never` prevents TypeScript from
21
+ * widening array type inference when mixing named and unnamed routes.
22
+ */
23
+ export type UnnamedRoute = "$unnamed";
24
+
25
+ /**
26
+ * Sentinel type for include() mounts that stay local to the mounted module.
27
+ * This keeps child route names out of the parent/global type map while still
28
+ * allowing the mounted module to use its own local route names internally.
29
+ *
30
+ * Branded with a symbol key so it cannot be accidentally produced by user code.
31
+ */
32
+ declare const LOCAL_ONLY_BRAND: unique symbol;
33
+ export type LocalOnlyInclude = string & { [LOCAL_ONLY_BRAND]: void };
34
+
35
+ /**
36
+ * Options for path() function
37
+ */
38
+ export interface PathOptions<
39
+ TName extends string = string,
40
+ TSearch extends SearchSchema = {},
41
+ > {
42
+ /** Route name for href() lookups */
43
+ name?: TName;
44
+ /** Search param schema for typed query parameters */
45
+ search?: TSearch;
46
+ /** Trailing slash behavior: "never" (redirect /path/ to /path), "always" (redirect /path to /path/), "ignore" (match both) */
47
+ trailingSlash?: TrailingSlashMode;
48
+ /** Response type marker (set by path.json(), etc.) */
49
+ [RESPONSE_TYPE]?: string;
50
+ }
51
+
52
+ /**
53
+ * Result of urls() - contains the route definitions
54
+ */
55
+ export interface UrlPatterns<
56
+ TEnv = any,
57
+ TRoutes extends Record<string, any> = Record<string, string>,
58
+ TResponses extends Record<string, unknown> = Record<string, unknown>,
59
+ > {
60
+ /** Internal: compiled handler function */
61
+ readonly handler: () => AllUseItems[];
62
+ /** Internal: trailing slash config per route name */
63
+ readonly trailingSlash: Record<string, TrailingSlashMode>;
64
+ /** Brand for type checking */
65
+ readonly [UrlPatternsBrand]: void;
66
+ /** Environment type brand (phantom) */
67
+ readonly _env?: TEnv;
68
+ /** Routes type brand (phantom) - carries route name -> pattern mapping */
69
+ readonly _routes?: TRoutes;
70
+ /** Responses type brand (phantom) - carries route name -> response data type mapping */
71
+ readonly _responses?: TResponses;
72
+ }
73
+
74
+ /**
75
+ * Extract the phantom env type carried by a UrlPatterns value.
76
+ */
77
+ export type UrlPatternsEnv<T> =
78
+ T extends UrlPatterns<infer TEnv, any, any> ? TEnv : never;
79
+
80
+ /**
81
+ * Guards `routes()` env compatibility without over-constraining.
82
+ *
83
+ * - An env-agnostic block (its env is `unknown` — e.g. a shared urls() module,
84
+ * or an app that does not augment `Rango.Env`) attaches to any router.
85
+ * - A block carrying a concrete env is accepted only when the router env
86
+ * (`TRouterEnv`) satisfies it; resolves to `never` otherwise, so a
87
+ * `urls<{ DB: D1Database }>()` cannot be mounted on a `createRouter<{}>()`.
88
+ *
89
+ * Use as `patterns: T & EnvCompatible<T, TEnv>` so `T` still infers from the
90
+ * argument — a bare `EnvCompatible<T, TEnv>` parameter sits in a non-inferrable
91
+ * conditional position and would collapse `T` to its constraint.
92
+ *
93
+ * Known limitation: `TRouterEnv extends ...` distributes over a union router env,
94
+ * so a `urls<A>()` block is accepted on `createRouter<A | B>()` even though the
95
+ * `B` arm cannot supply `A`'s env. Suppressing distribution with
96
+ * `[TRouterEnv] extends [...]` would close that edge but breaks the common
97
+ * generic-`TEnv` call sites (a deferred type parameter can't resolve the tuple
98
+ * conditional, so the intersection stops reducing to `T`). A router has one env,
99
+ * so a union env is not a supported pattern; the distributive form is kept.
100
+ */
101
+ export type EnvCompatible<TPatterns, TRouterEnv> =
102
+ unknown extends UrlPatternsEnv<TPatterns>
103
+ ? TPatterns
104
+ : TRouterEnv extends UrlPatternsEnv<TPatterns>
105
+ ? TPatterns
106
+ : never;
107
+
108
+ /**
109
+ * Options for include()
110
+ */
111
+ export interface IncludeOptions<TNamePrefix extends string = string> {
112
+ /**
113
+ * Name prefix for all routes in this pattern set.
114
+ *
115
+ * - `{ name: "blog" }` — children become `blog.index`, `blog.detail`, etc.
116
+ * Visible in generated route types and resolvable globally via `reverse("blog.index")`.
117
+ * - `{ name: "" }` — children merge into the parent namespace with no prefix.
118
+ * Equivalent to defining the routes inline at the include site.
119
+ * - Omitted — children live in a private local scope, hidden from the
120
+ * generated route map and global reverse resolution. Only dot-local
121
+ * reverse (e.g. `reverse(".child")`) works from inside the module.
122
+ */
123
+ name?: TNamePrefix;
124
+ }
@@ -0,0 +1,109 @@
1
+ import type { ContextVar } from "../context-var.js";
2
+ import type { ReverseFunction } from "../reverse.js";
3
+ import type {
4
+ DefaultReverseRouteMap,
5
+ DefaultVars,
6
+ } from "../types/global-namespace.js";
7
+ import type { UseItems, ResponseRouteUseItem } from "../route-types.js";
8
+ import type { RequestScope } from "../types/request-scope.js";
9
+
10
+ /**
11
+ * Reverse function for response handler contexts.
12
+ * Global names get autocomplete and param validation from the generated route map.
13
+ * Local `.name` calls are accepted but not validated (scope unknown at type level).
14
+ */
15
+ type ResponseReverseFunction = [DefaultReverseRouteMap] extends [
16
+ Record<string, string>,
17
+ ]
18
+ ? (
19
+ name: string,
20
+ params?: Record<string, string>,
21
+ search?: Record<string, unknown>,
22
+ ) => string
23
+ : ReverseFunction<DefaultReverseRouteMap> & {
24
+ (
25
+ name: `.${string}`,
26
+ params?: Record<string, string>,
27
+ search?: Record<string, unknown>,
28
+ ): string;
29
+ };
30
+
31
+ /**
32
+ * Symbol marking a route as a response route (non-RSC).
33
+ * Stored on PathOptions and UrlPatterns to signal the trie to short-circuit.
34
+ */
35
+ export const RESPONSE_TYPE: unique symbol = Symbol.for("rangojs.responseType");
36
+
37
+ /**
38
+ * Shared shape of a response-route handler: a function returning TReturn (or a
39
+ * promise of it), plus an optional composable `use` thunk merged at mount time.
40
+ */
41
+ type ResponseHandlerOf<
42
+ TReturn,
43
+ TParams = Record<string, string>,
44
+ TEnv = any,
45
+ > = ((
46
+ ctx: ResponseHandlerContext<TParams, TEnv>,
47
+ ) => TReturn | Promise<TReturn>) & {
48
+ /** Composable default DSL items merged when the handler is mounted. */
49
+ use?: () => UseItems<ResponseRouteUseItem>;
50
+ };
51
+
52
+ /**
53
+ * Handler that must return Response (not ReactNode).
54
+ * Used by path.image(), path.stream(), path.any() (binary/streaming data).
55
+ */
56
+ export type ResponseHandler<
57
+ TParams = Record<string, string>,
58
+ TEnv = any,
59
+ > = ResponseHandlerOf<Response, TParams, TEnv>;
60
+
61
+ /**
62
+ * JSON-serializable value type for auto-wrap support.
63
+ */
64
+ export type JsonValue =
65
+ | string
66
+ | number
67
+ | boolean
68
+ | null
69
+ | JsonValue[]
70
+ | { [key: string]: JsonValue };
71
+
72
+ /**
73
+ * Handler for JSON response routes.
74
+ * Can return a plain JSON-serializable value (auto-wrapped) or Response (pass-through).
75
+ */
76
+ export type JsonResponseHandler<
77
+ TParams = Record<string, string>,
78
+ TEnv = any,
79
+ > = ResponseHandlerOf<JsonValue | Response, TParams, TEnv>;
80
+
81
+ /**
82
+ * Handler for text-based response routes (text, html, xml).
83
+ * Can return a string (auto-wrapped) or Response (pass-through).
84
+ */
85
+ export type TextResponseHandler<
86
+ TParams = Record<string, string>,
87
+ TEnv = any,
88
+ > = ResponseHandlerOf<string | Response, TParams, TEnv>;
89
+
90
+ /**
91
+ * Lighter handler context for response routes.
92
+ * No ctx.use() (no loaders). Supports setting response headers via ctx.header().
93
+ * Use the standalone cookies() function for cookie mutations.
94
+ */
95
+ export interface ResponseHandlerContext<
96
+ TParams = Record<string, string>,
97
+ TEnv = any,
98
+ > extends RequestScope<TEnv> {
99
+ params: TParams;
100
+ /** @internal Phantom property for params type invariance. Prevents mounting handlers on wrong routes. */
101
+ readonly _paramCheck?: (params: TParams) => TParams;
102
+ reverse: ResponseReverseFunction;
103
+ /** Read a variable set by middleware via ctx.set(key, value) or ctx.set(ContextVar, value). */
104
+ get: {
105
+ <T>(contextVar: ContextVar<T>): T | undefined;
106
+ } & (<K extends keyof DefaultVars>(key: K) => DefaultVars[K]);
107
+ /** Set a response header. Merged into the auto-wrapped or pass-through Response. */
108
+ header: (name: string, value: string) => void;
109
+ }