@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,554 @@
1
+ import type { ComponentType, ReactNode } from "react";
2
+ import type { SerializedManifest } from "../debug.js";
3
+ import type { ReverseFunction } from "../reverse.js";
4
+ import type { UrlPatterns } from "../urls.js";
5
+ import type { UrlBuilder, EnvCompatible } from "../urls/pattern-types.js";
6
+ import type { EntryData } from "../server/context";
7
+ import type { ErrorInfo, MatchResult } from "../types";
8
+ import type { NonceProvider } from "../rsc/types.js";
9
+ import type { ExecutionContext } from "../server/request-context.js";
10
+ import type { SerializedSegmentData } from "../cache/types.js";
11
+ import type { MiddlewareEntry, MiddlewareFn } from "./middleware.js";
12
+ import type { RouteMatchResult } from "./pattern-matching.js";
13
+ import type { ExtractParams } from "../types/route-config.js";
14
+ import { RSC_ROUTER_BRAND } from "./router-registry.js";
15
+ import type { RangoOptions, RootLayoutProps } from "./router-options.js";
16
+ import type { DefaultVars } from "../types/global-namespace.js";
17
+ import type { ResolvedTimeouts, OnTimeoutCallback } from "./timeout.js";
18
+ import type { ResolvedTracing } from "./tracing.js";
19
+
20
+ /**
21
+ * Options passed to router.fetch(), router.match(), and other request entrypoints.
22
+ * All entrypoints use this same shape for consistency.
23
+ */
24
+ export interface RouterRequestInput<TEnv, TVars = DefaultVars> {
25
+ env?: TEnv;
26
+ vars?: Partial<TVars>;
27
+ ctx?: ExecutionContext;
28
+ }
29
+
30
+ /**
31
+ * Merge route patterns with response types into a single route map.
32
+ * Routes with response types get { path, response } objects; others stay as strings.
33
+ * Handles both plain string routes and { path, search } object routes.
34
+ */
35
+ type MergeRoutesWithResponses<
36
+ TRoutes extends Record<string, unknown>,
37
+ TResponses,
38
+ > = {
39
+ [K in keyof TRoutes]: K extends keyof NonNullable<TResponses>
40
+ ? unknown extends NonNullable<TResponses>[K]
41
+ ? TRoutes[K] // RSC route — TData defaults to unknown, keep as-is
42
+ : TRoutes[K] extends { readonly path: infer P extends string }
43
+ ? TRoutes[K] & { readonly response: NonNullable<TResponses>[K] }
44
+ : {
45
+ readonly path: TRoutes[K] & string;
46
+ readonly response: NonNullable<TResponses>[K];
47
+ }
48
+ : TRoutes[K];
49
+ };
50
+
51
+ /**
52
+ * Public Rango router interface — the user-facing API surface.
53
+ *
54
+ * Users interact with this type when building and using routers.
55
+ * Internal framework code uses RangoInternal (via toInternal()) to access
56
+ * matching, build-time, and configuration members that are not part of the
57
+ * public contract.
58
+ *
59
+ * TRoutes accumulates all registered route types through the builder chain.
60
+ */
61
+ export interface Rango<
62
+ TEnv = any,
63
+ TRoutes extends Record<string, unknown> = Record<string, string>,
64
+ > {
65
+ /**
66
+ * Unique identifier for this router instance.
67
+ * Used to namespace static output and isolate route maps between routers.
68
+ */
69
+ readonly id: string;
70
+
71
+ /**
72
+ * URL prefix applied to all routes. Undefined when no basename is configured.
73
+ */
74
+ readonly basename: string | undefined;
75
+
76
+ /**
77
+ * Register routes using URL patterns from urls() or a builder function
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * // With urls()
82
+ * createRouter({}).routes(urlpatterns)
83
+ *
84
+ * // With builder function (urls() is implicit)
85
+ * createRouter({}).routes(({ path, layout }) => [
86
+ * layout(RootLayout, () => [
87
+ * path("/", HomePage),
88
+ * ]),
89
+ * ])
90
+ * ```
91
+ */
92
+ routes<T extends UrlPatterns<any, any, any>>(
93
+ patterns: T & EnvCompatible<T, TEnv>,
94
+ ): Rango<
95
+ TEnv,
96
+ TRoutes &
97
+ (NonNullable<T["_routes"]> extends Record<string, unknown>
98
+ ? MergeRoutesWithResponses<NonNullable<T["_routes"]>, T["_responses"]>
99
+ : Record<string, string>)
100
+ >;
101
+ routes(builder: UrlBuilder<TEnv>): Rango<TEnv, TRoutes>;
102
+
103
+ /**
104
+ * Add global middleware that runs on all routes
105
+ *
106
+ * @example
107
+ * ```typescript
108
+ * createRouter({ document: RootLayout })
109
+ * .use(loggerMiddleware) // All routes
110
+ * .use("/api/*", rateLimiter) // Pattern match
111
+ * .use("/users/:id", (ctx) => {}) // ctx.params.id is typed
112
+ * .routes(urlpatterns)
113
+ * ```
114
+ */
115
+ use<Pattern extends string>(
116
+ pattern: Pattern,
117
+ middleware: MiddlewareFn<TEnv, ExtractParams<Pattern>>,
118
+ ): Rango<TEnv, TRoutes>;
119
+ use(
120
+ patternOrMiddleware: string | MiddlewareFn<TEnv>,
121
+ middleware?: MiddlewareFn<TEnv>,
122
+ ): Rango<TEnv, TRoutes>;
123
+
124
+ /**
125
+ * Type-safe URL builder for registered routes
126
+ * Types are inferred from the accumulated route registrations
127
+ *
128
+ * @example
129
+ * ```typescript
130
+ * router.reverse("cart"); // "/shop/cart"
131
+ * router.reverse("detail", { slug: "widget" }); // "/shop/product/widget"
132
+ * ```
133
+ */
134
+ reverse: ReverseFunction<TRoutes>;
135
+
136
+ /**
137
+ * Accumulated route map for typeof extraction
138
+ * Used for module augmentation: `type AppRoutes = typeof _router.routeMap`
139
+ *
140
+ * @example
141
+ * ```typescript
142
+ * const _router = createRouter<AppEnv>({
143
+ * urls: urlpatterns,
144
+ * });
145
+ *
146
+ * type AppRoutes = typeof _router.routeMap;
147
+ *
148
+ * declare global {
149
+ * namespace Rango {
150
+ * interface RegisteredRoutes extends AppRoutes {}
151
+ * }
152
+ * }
153
+ * ```
154
+ */
155
+ readonly routeMap: TRoutes;
156
+
157
+ /**
158
+ * Handle an RSC request.
159
+ *
160
+ * Uses the router's configuration (nonce, version, cache) automatically.
161
+ * The handler is lazily created on first call.
162
+ *
163
+ * @example Cloudflare Workers
164
+ * ```tsx
165
+ * import { router } from "./router";
166
+ *
167
+ * export default { fetch: router.fetch };
168
+ * ```
169
+ *
170
+ * @example Direct export
171
+ * ```tsx
172
+ * const router = createRouter({
173
+ * document: Document,
174
+ * urls: urlpatterns,
175
+ * nonce: () => true,
176
+ * });
177
+ *
178
+ * export const fetch = router.fetch;
179
+ * ```
180
+ */
181
+ fetch(request: Request, input?: RouterRequestInput<TEnv>): Promise<Response>;
182
+ }
183
+
184
+ /**
185
+ * Internal Rango router interface — the full framework-facing API.
186
+ *
187
+ * This type includes all members used by the Vite plugin, RSC handler,
188
+ * pre-rendering pipeline, and other framework internals. It is NOT exported
189
+ * from the public package API.
190
+ *
191
+ * Use toInternal(router) to assert a public Rango into this type
192
+ * at the boundary where framework code receives a user-provided router.
193
+ */
194
+ export interface RangoInternal<
195
+ TEnv = any,
196
+ TRoutes extends Record<string, unknown> = Record<string, string>,
197
+ > {
198
+ /**
199
+ * Brand marker for build-time discovery.
200
+ * The Vite plugin uses this to identify router instances in module exports.
201
+ */
202
+ readonly __brand: typeof RSC_ROUTER_BRAND;
203
+
204
+ /**
205
+ * Unique identifier for this router instance.
206
+ * Used to namespace static output and isolate route maps between routers.
207
+ */
208
+ readonly id: string;
209
+
210
+ /** URL prefix applied to all routes. */
211
+ readonly basename: string | undefined;
212
+
213
+ /**
214
+ * Register routes using URL patterns from urls() or a builder function.
215
+ *
216
+ * Env compatibility is checked by EnvCompatible: an env-agnostic urls() block
217
+ * (its env is `unknown` — e.g. a shared module, or an app that does not augment
218
+ * `Rango.Env`) attaches to any router, while a urls<TEnv>() block carrying a
219
+ * concrete env is accepted only when this router's `TEnv` satisfies it. So a
220
+ * `urls<{ DB }>()` cannot be mounted on a `createRouter<{}>()`.
221
+ */
222
+ routes<T extends UrlPatterns<any, any, any>>(
223
+ patterns: T & EnvCompatible<T, TEnv>,
224
+ ): Rango<
225
+ TEnv,
226
+ TRoutes &
227
+ (NonNullable<T["_routes"]> extends Record<string, unknown>
228
+ ? MergeRoutesWithResponses<NonNullable<T["_routes"]>, T["_responses"]>
229
+ : Record<string, string>)
230
+ >;
231
+ routes(builder: UrlBuilder<TEnv>): Rango<TEnv, TRoutes>;
232
+
233
+ /**
234
+ * Add global middleware that runs on all routes
235
+ */
236
+ use<Pattern extends string>(
237
+ pattern: Pattern,
238
+ middleware: MiddlewareFn<TEnv, ExtractParams<Pattern>>,
239
+ ): Rango<TEnv, TRoutes>;
240
+ use(
241
+ patternOrMiddleware: string | MiddlewareFn<TEnv>,
242
+ middleware?: MiddlewareFn<TEnv>,
243
+ ): Rango<TEnv, TRoutes>;
244
+
245
+ /**
246
+ * Type-safe URL builder for registered routes
247
+ */
248
+ reverse: ReverseFunction<TRoutes>;
249
+
250
+ /**
251
+ * Accumulated route map for typeof extraction
252
+ */
253
+ readonly routeMap: TRoutes;
254
+
255
+ /**
256
+ * Root layout component that wraps the entire application
257
+ * Access this to pass to renderSegments
258
+ */
259
+ readonly rootLayout?: ComponentType<RootLayoutProps>;
260
+
261
+ /**
262
+ * Error callback for monitoring/alerting
263
+ * Called when errors occur in loaders, actions, or routes
264
+ */
265
+ readonly onError?: RangoOptions<TEnv>["onError"];
266
+
267
+ /**
268
+ * Cache configuration
269
+ */
270
+ readonly cache?: RangoOptions<TEnv>["cache"];
271
+
272
+ /**
273
+ * Not found component to render when no route matches
274
+ */
275
+ readonly notFound?: RangoOptions<TEnv>["notFound"];
276
+
277
+ /**
278
+ * Resolved theme configuration (null if theme not enabled)
279
+ * Used by NavigationProvider to include ThemeProvider and by MetaTags to render theme script
280
+ */
281
+ readonly themeConfig: import("../theme/types.js").ResolvedThemeConfig | null;
282
+
283
+ /**
284
+ * Cache profiles for "use cache" per-request resolution.
285
+ * Always includes at least the "default" profile.
286
+ */
287
+ readonly cacheProfiles: Record<
288
+ string,
289
+ import("../cache/profile-registry.js").CacheProfile
290
+ >;
291
+
292
+ /**
293
+ * Cache-Control header value for prefetch responses.
294
+ * False means no caching of prefetch responses.
295
+ * Derived from prefetchCacheTTL.
296
+ */
297
+ readonly prefetchCacheControl: string | false;
298
+
299
+ /**
300
+ * TTL in milliseconds for the client-side in-memory prefetch cache.
301
+ * 0 means caching is disabled.
302
+ */
303
+ readonly prefetchCacheTTL: number;
304
+
305
+ /**
306
+ * Maximum number of decoded prefetch payloads the client keeps in its
307
+ * in-memory prefetch cache (FIFO eviction at capacity). Shipped to the
308
+ * client in payload metadata. Derived from prefetchCacheSize.
309
+ */
310
+ readonly prefetchCacheSize: number;
311
+
312
+ /**
313
+ * Maximum number of speculative prefetch requests the client runs
314
+ * concurrently. Shipped to the client in payload metadata. Derived from
315
+ * prefetchConcurrency.
316
+ */
317
+ readonly prefetchConcurrency: number;
318
+
319
+ /**
320
+ * Resolved rango state cookie name (`{prefix}_{routerId}`), composed once at
321
+ * router init and shipped to the client in payload metadata. The server-side
322
+ * cookie writer reads it from here; the client reads it from metadata.
323
+ */
324
+ readonly resolvedStateCookieName: string;
325
+
326
+ /**
327
+ * Whether connection warmup is enabled.
328
+ * When true, the client sends HEAD /?_rsc_warmup after idle periods
329
+ * and the server responds with 204 No Content.
330
+ */
331
+ readonly warmupEnabled: boolean;
332
+
333
+ /**
334
+ * Whether the client hydrates inside React.StrictMode. Resolved from
335
+ * createRouter({ strictMode }) (default true) and shipped to the client in
336
+ * the initial payload metadata.
337
+ */
338
+ readonly strictMode: boolean;
339
+
340
+ /**
341
+ * Whether router-wide performance debugging is enabled.
342
+ * Used by the request handler to create metrics before middleware runs.
343
+ */
344
+ readonly debugPerformance?: boolean;
345
+
346
+ /**
347
+ * Resolved platform phase-span tracing (Cloudflare custom spans or OTel), or
348
+ * undefined when off. Threaded onto the request context and read at each
349
+ * traced phase.
350
+ */
351
+ readonly tracing?: ResolvedTracing;
352
+
353
+ /**
354
+ * Whether ?__debug_manifest is allowed in production.
355
+ * Always enabled in development.
356
+ */
357
+ readonly allowDebugManifest: boolean;
358
+
359
+ /**
360
+ * Resolved timeout configuration (merged from shorthand + structured).
361
+ */
362
+ readonly timeouts: ResolvedTimeouts;
363
+
364
+ /**
365
+ * Custom timeout response handler.
366
+ */
367
+ readonly onTimeout?: OnTimeoutCallback<TEnv>;
368
+
369
+ /**
370
+ * App-level middleware entries
371
+ * These wrap the entire request/response cycle
372
+ */
373
+ readonly middleware: MiddlewareEntry<TEnv>[];
374
+
375
+ /**
376
+ * Nonce provider for CSP
377
+ */
378
+ readonly nonce?: NonceProvider<TEnv>;
379
+
380
+ /**
381
+ * RSC version string
382
+ */
383
+ readonly version?: string;
384
+
385
+ /**
386
+ * URL patterns reference for build-time manifest generation
387
+ */
388
+ readonly urlpatterns?: UrlPatterns<TEnv, any>;
389
+
390
+ /**
391
+ * SSR configuration. resolveStreaming determines stream vs allReady
392
+ * per HTML request (undefined = always stream).
393
+ */
394
+ readonly ssr?: import("./router-options.js").SSROptions<TEnv>;
395
+
396
+ /**
397
+ * Cross-origin request protection configuration.
398
+ * Default: true (enabled).
399
+ */
400
+ readonly originCheck: import("../rsc/origin-guard.js").OriginCheckConfig<TEnv>;
401
+
402
+ /**
403
+ * Source file path where createRouter() was called.
404
+ * Set via Error.stack parsing at construction time.
405
+ * Used by the Vite plugin to write per-router named-routes.gen.ts files.
406
+ */
407
+ readonly __sourceFile?: string;
408
+
409
+ /** @internal basename for runtime manifest generation */
410
+ readonly __basename?: string;
411
+
412
+ /**
413
+ * @internal Router-level error/notFound fallbacks (`createRouter` options),
414
+ * exposed for the build-time clientChunks discovery so a `"use client"`
415
+ * default boundary is routed into the dedicated `app-fallback` chunk. Unlike
416
+ * the route-tree `errorBoundary()`/`notFoundBoundary()` helpers these never
417
+ * land in `EntryData`, so they are read directly off the router instance.
418
+ */
419
+ readonly __defaultErrorBoundary?: RangoOptions<TEnv>["defaultErrorBoundary"];
420
+ readonly __defaultNotFoundBoundary?: RangoOptions<TEnv>["defaultNotFoundBoundary"];
421
+ readonly __notFound?: RangoOptions<TEnv>["notFound"];
422
+
423
+ match(
424
+ request: Request,
425
+ input?: RouterRequestInput<TEnv>,
426
+ ): Promise<MatchResult>;
427
+
428
+ /**
429
+ * Build-time pre-render match. Resolves segments with a BuildContext
430
+ * (no request/env/headers/cookies), skipping middleware and loaders.
431
+ * Used by the Vite plugin to collect pre-render data at build time.
432
+ */
433
+ matchForPrerender(
434
+ pathname: string,
435
+ params: Record<string, string>,
436
+ buildVars?: Record<string, any>,
437
+ isPassthroughRoute?: boolean,
438
+ buildEnv?: any,
439
+ devMode?: boolean,
440
+ ): Promise<{
441
+ segments: SerializedSegmentData[];
442
+ /** RSC-encoded handle map ("" when none) — see handle-snapshot.ts. */
443
+ handles: string;
444
+ routeName: string;
445
+ params: Record<string, string>;
446
+ interceptSegments?: SerializedSegmentData[];
447
+ /** RSC-encoded MERGED (main + intercept) handle map for the intercept artifact. */
448
+ interceptHandles?: string;
449
+ passthrough?: true;
450
+ } | null>;
451
+
452
+ /**
453
+ * Render a single Static handler at build time.
454
+ * Returns the RSC-serialized component string and handle data, or null on failure.
455
+ */
456
+ renderStaticSegment(
457
+ handler: Function,
458
+ handlerId: string,
459
+ routeName?: string,
460
+ buildEnv?: any,
461
+ devMode?: boolean,
462
+ ): Promise<{ encoded: string; handles: string } | null>;
463
+
464
+ /**
465
+ * Preview match - returns route middleware without segment resolution.
466
+ * Also returns responseType and handler for response routes (non-RSC short-circuit).
467
+ */
468
+ previewMatch(
469
+ request: Request,
470
+ input?: RouterRequestInput<TEnv>,
471
+ ): Promise<{
472
+ routeMiddleware?: Array<{
473
+ handler: import("./middleware.js").MiddlewareFn;
474
+ params: Record<string, string>;
475
+ }>;
476
+ responseType?: string;
477
+ handler?: Function;
478
+ params?: Record<string, string>;
479
+ negotiated?: boolean;
480
+ manifestEntry?: EntryData;
481
+ routeKey?: string;
482
+ } | null>;
483
+
484
+ matchPartial(
485
+ request: Request,
486
+ input?: RouterRequestInput<TEnv>,
487
+ actionContext?: {
488
+ actionId?: string;
489
+ actionUrl?: URL;
490
+ actionResult?: any;
491
+ formData?: FormData;
492
+ },
493
+ ): Promise<MatchResult | null>;
494
+
495
+ /**
496
+ * Match an error to the nearest error boundary and return error segments
497
+ *
498
+ * Used when an action or other operation fails and we need to render
499
+ * the error boundary UI. Finds the nearest errorBoundary in the route tree
500
+ * for the current URL and renders it with the error info.
501
+ *
502
+ * @param request - The current request (used to match the route)
503
+ * @param context - Environment context
504
+ * @param error - The error that occurred
505
+ * @param segmentType - Type of segment where error occurred (default: "route")
506
+ * @returns MatchResult with error segment, or null if no error boundary found
507
+ */
508
+ matchError(
509
+ request: Request,
510
+ input: RouterRequestInput<TEnv> | undefined,
511
+ error: unknown,
512
+ segmentType?: ErrorInfo["segmentType"],
513
+ ): Promise<MatchResult | null>;
514
+
515
+ /**
516
+ * Low-level route matching function.
517
+ * Used by classifyRequest() for request classification without
518
+ * entering the full match pipeline.
519
+ */
520
+ // Async since a lazy async include (`() => import()`) must resolve before its
521
+ // routes can match. Typed (not `any`) so a consumer doing
522
+ // `const m = router.findMatch(p); if (!m) ...; m.entry` gets a compile error
523
+ // (m is a Promise) instead of the silent always-truthy bug.
524
+ findMatch(
525
+ pathname: string,
526
+ metricsStore?: any,
527
+ ): Promise<RouteMatchResult<TEnv> | null>;
528
+
529
+ /**
530
+ * Debug utility to serialize the manifest for inspection
531
+ * Returns a JSON-friendly representation of all routes and layouts
532
+ */
533
+ debugManifest(): Promise<SerializedManifest>;
534
+
535
+ /**
536
+ * Handle an RSC request.
537
+ */
538
+ fetch(request: Request, input?: RouterRequestInput<TEnv>): Promise<Response>;
539
+ }
540
+
541
+ /**
542
+ * Assert a public Rango into the internal type.
543
+ *
544
+ * Use this at the boundary where framework code receives a user-provided
545
+ * router and needs access to internal members (match, config, build-time).
546
+ * The cast is safe because createRouter() always produces an object that
547
+ * satisfies RangoInternal; the public type is just a narrower view.
548
+ */
549
+ export function toInternal<
550
+ TEnv = any,
551
+ TRoutes extends Record<string, unknown> = Record<string, string>,
552
+ >(router: Rango<TEnv, TRoutes>): RangoInternal<TEnv, TRoutes> {
553
+ return router as RangoInternal<TEnv, TRoutes>;
554
+ }