@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,246 @@
1
+ /**
2
+ * Route Snapshot
3
+ *
4
+ * Pure data type representing the fully-resolved state of a single route match.
5
+ * Consolidates the duplicated findMatch + loadManifest + collectRouteMiddleware +
6
+ * cacheScope derivation that previously lived separately in preview-match.ts
7
+ * and match-api.ts.
8
+ *
9
+ * resolveRoute() is the factory: given a pathname and dependencies, it returns
10
+ * a RouteSnapshot (or redirect/null). Consumers (createMatchContextForFull,
11
+ * createMatchContextForPartial, previewMatch) read snapshot fields instead of
12
+ * re-deriving them.
13
+ */
14
+
15
+ import type { CacheScope } from "../cache/cache-scope.js";
16
+ import { createCacheScope } from "../cache/cache-scope.js";
17
+ import type { EntryData, MetricsStore } from "../server/context.js";
18
+ import { loadManifest } from "./manifest.js";
19
+ import { collectRouteMiddleware } from "./middleware.js";
20
+ import type { CollectedMiddleware } from "./middleware-types.js";
21
+ import { traverseBack } from "./pattern-matching.js";
22
+ import type { RouteMatchResult } from "./pattern-matching.js";
23
+
24
+ /**
25
+ * Immutable snapshot of a resolved route match.
26
+ *
27
+ * Contains everything derivable from (pathname, findMatch, loadManifest)
28
+ * without request context, navigation state, or intercept logic.
29
+ */
30
+ export interface RouteSnapshot<TEnv = any> {
31
+ /** Raw match result from the trie/pattern matcher */
32
+ matched: RouteMatchResult<TEnv>;
33
+ /** Resolved manifest entry (with loaded handler, loader, etc.) */
34
+ manifestEntry: EntryData;
35
+ /** All entries in the route chain (from traverseBack) */
36
+ entries: EntryData[];
37
+ /** Canonical route key (e.g. "blog.detail") */
38
+ routeKey: string;
39
+ /** Last segment of a dotted route key (e.g. "detail" from "blog.detail") */
40
+ localRouteName: string;
41
+ /** Extracted route params */
42
+ params: Record<string, string>;
43
+ /** Collected route-level middleware from the entry tree */
44
+ routeMiddleware: CollectedMiddleware[];
45
+ /** Merged cache scope from the entry chain */
46
+ cacheScope: CacheScope | null;
47
+ /** Whether the matched route is a passthrough route */
48
+ isPassthrough: boolean;
49
+ /** Response type for non-RSC routes (e.g. "application/json") */
50
+ responseType?: string;
51
+ }
52
+
53
+ export type ResolveRouteResult<TEnv = any> =
54
+ | { type: "match"; snapshot: RouteSnapshot<TEnv> }
55
+ | { type: "redirect"; redirectTo: string }
56
+ | null;
57
+
58
+ export interface ResolveRouteDeps<TEnv = any> {
59
+ findMatch: (
60
+ pathname: string,
61
+ ) => RouteMatchResult<TEnv> | null | Promise<RouteMatchResult<TEnv> | null>;
62
+ metricsStore?: MetricsStore;
63
+ isSSR?: boolean;
64
+ /**
65
+ * When true, skip entries array and cacheScope chain construction.
66
+ * Used by previewMatch which only needs matched, manifestEntry,
67
+ * routeMiddleware, and responseType — avoids an extra traverseBack
68
+ * allocation and cacheScope composition on the hot classification path.
69
+ */
70
+ lite?: boolean;
71
+ /**
72
+ * When true, skip pushing the "route-matching" metric internally.
73
+ * Used by createMatchContextForPartial on the fresh path (no snapshot
74
+ * reuse) so it can measure current + prev + intercept-source findMatch
75
+ * calls under one combined "route-matching" metric. On the reuse path,
76
+ * the partial path emits "route-matching:nav" for the prev +
77
+ * intercept-source lookups only (current-route resolution was done
78
+ * during classification without metrics).
79
+ */
80
+ skipRouteMatchMetric?: boolean;
81
+ }
82
+
83
+ /**
84
+ * Resolve a pathname into a RouteSnapshot.
85
+ *
86
+ * This is the single source of truth for route derivation. It performs:
87
+ * 1. findMatch(pathname)
88
+ * 2. Redirect check
89
+ * 3. loadManifest
90
+ * 4. Passthrough detection
91
+ * 5. collectRouteMiddleware
92
+ * 6. Cache scope chain
93
+ * 7. responseType + localRouteName extraction
94
+ *
95
+ * Metrics timing is preserved identically to the previous inline code.
96
+ */
97
+ export async function resolveRoute<TEnv = any>(
98
+ pathname: string,
99
+ deps: ResolveRouteDeps<TEnv>,
100
+ ): Promise<ResolveRouteResult<TEnv>> {
101
+ const {
102
+ metricsStore,
103
+ isSSR = false,
104
+ lite = false,
105
+ skipRouteMatchMetric = false,
106
+ } = deps;
107
+
108
+ const routeMatchStart =
109
+ metricsStore && !skipRouteMatchMetric ? performance.now() : 0;
110
+ const matched = await deps.findMatch(pathname);
111
+ if (metricsStore && !skipRouteMatchMetric) {
112
+ metricsStore.metrics.push({
113
+ label: "route-matching",
114
+ duration: performance.now() - routeMatchStart,
115
+ startTime: routeMatchStart - metricsStore.requestStart,
116
+ });
117
+ }
118
+
119
+ if (!matched) {
120
+ return null;
121
+ }
122
+
123
+ if (matched.redirectTo) {
124
+ return { type: "redirect", redirectTo: matched.redirectTo };
125
+ }
126
+
127
+ const manifestStart = metricsStore ? performance.now() : 0;
128
+ const manifestEntry = await loadManifest(
129
+ matched.entry,
130
+ matched.routeKey,
131
+ pathname,
132
+ metricsStore,
133
+ isSSR,
134
+ );
135
+ if (metricsStore) {
136
+ metricsStore.metrics.push({
137
+ label: "manifest-loading",
138
+ duration: performance.now() - manifestStart,
139
+ startTime: manifestStart - metricsStore.requestStart,
140
+ });
141
+ }
142
+
143
+ const isPassthrough =
144
+ manifestEntry.type === "route" && manifestEntry.isPassthrough === true;
145
+
146
+ let entries: EntryData[];
147
+ let cacheScope: CacheScope | null = null;
148
+ if (lite) {
149
+ entries = [];
150
+ } else {
151
+ ({ entries, cacheScope } = buildEntriesAndCacheScope(manifestEntry));
152
+ }
153
+
154
+ const routeMiddleware = collectRouteMiddleware(
155
+ lite ? traverseBack(manifestEntry) : entries,
156
+ matched.params,
157
+ );
158
+
159
+ const responseType =
160
+ matched.responseType ||
161
+ (manifestEntry.type === "route" ? manifestEntry.responseType : undefined);
162
+
163
+ const localRouteName = matched.routeKey.includes(".")
164
+ ? matched.routeKey.split(".").pop()!
165
+ : matched.routeKey;
166
+
167
+ return {
168
+ type: "match",
169
+ snapshot: {
170
+ matched,
171
+ manifestEntry,
172
+ entries,
173
+ routeKey: matched.routeKey,
174
+ localRouteName,
175
+ params: matched.params,
176
+ routeMiddleware,
177
+ cacheScope,
178
+ isPassthrough,
179
+ responseType,
180
+ },
181
+ };
182
+ }
183
+
184
+ /**
185
+ * Fill in the entries and cacheScope fields on a lite snapshot.
186
+ *
187
+ * When classifyRequest produces a lite snapshot (entries=[], cacheScope=null),
188
+ * this function computes the missing fields from manifestEntry without
189
+ * re-running findMatch, loadManifest, or collectRouteMiddleware.
190
+ *
191
+ * If the snapshot already has entries, returns it as-is.
192
+ */
193
+ export function ensureFullRouteSnapshot<TEnv = any>(
194
+ snapshot: RouteSnapshot<TEnv>,
195
+ ): RouteSnapshot<TEnv> {
196
+ if (snapshot.entries.length > 0) {
197
+ return snapshot;
198
+ }
199
+
200
+ const { entries, cacheScope } = buildEntriesAndCacheScope(
201
+ snapshot.manifestEntry,
202
+ );
203
+ return { ...snapshot, entries, cacheScope };
204
+ }
205
+
206
+ /**
207
+ * Materialize the entry chain and derive the merged cache scope.
208
+ * Shared by resolveRoute (non-lite) and ensureFullRouteSnapshot.
209
+ */
210
+ function buildEntriesAndCacheScope(manifestEntry: EntryData): {
211
+ entries: EntryData[];
212
+ cacheScope: CacheScope | null;
213
+ } {
214
+ const entries = [...traverseBack(manifestEntry)];
215
+ let cacheScope: CacheScope | null = null;
216
+ for (const entry of entries) {
217
+ if (entry.cache) {
218
+ cacheScope = createCacheScope(entry.cache, cacheScope);
219
+ }
220
+ }
221
+ return { entries, cacheScope };
222
+ }
223
+
224
+ /**
225
+ * Test helper: create a RouteSnapshot with sensible defaults and overrides.
226
+ */
227
+ export function createRouteSnapshot<TEnv = any>(
228
+ overrides?: Partial<RouteSnapshot<TEnv>>,
229
+ ): RouteSnapshot<TEnv> {
230
+ return {
231
+ matched: {
232
+ entry: {} as any,
233
+ routeKey: "test",
234
+ params: {},
235
+ } as RouteMatchResult<TEnv>,
236
+ manifestEntry: { type: "route", shortCode: "R0", parent: null } as any,
237
+ entries: [],
238
+ routeKey: "test",
239
+ localRouteName: "test",
240
+ params: {},
241
+ routeMiddleware: [],
242
+ cacheScope: null,
243
+ isPassthrough: false,
244
+ ...overrides,
245
+ };
246
+ }
@@ -18,6 +18,8 @@ import type {
18
18
  ShouldRevalidateFn,
19
19
  } from "../types.js";
20
20
  import type { RouteMatchResult } from "./pattern-matching.js";
21
+ import type { TelemetrySink } from "./telemetry.js";
22
+ import type { ResolveSegmentOptions } from "./segment-resolution.js";
21
23
 
22
24
  /**
23
25
  * Revalidation context passed to segment resolution
@@ -53,22 +55,20 @@ export interface InterceptResult {
53
55
  * Instead of passing 20+ parameters, middleware calls getRouterContext() to access them.
54
56
  */
55
57
  export interface RouterContext<TEnv = any> {
56
- // Route matching
57
- findMatch: (pathname: string) => RouteMatchResult | null;
58
+ findMatch: (
59
+ pathname: string,
60
+ ) => RouteMatchResult | null | Promise<RouteMatchResult | null>;
58
61
 
59
- // Manifest loading
60
62
  loadManifest: (
61
63
  entry: any,
62
64
  routeKey: string,
63
65
  pathname: string,
64
66
  metricsStore?: MetricsStore,
65
- isSSR?: boolean
67
+ isSSR?: boolean,
66
68
  ) => Promise<EntryData>;
67
69
 
68
- // Entry traversal
69
70
  traverseBack: (entry: EntryData) => Generator<EntryData>;
70
71
 
71
- // Handler context creation
72
72
  createHandlerContext: (
73
73
  params: Record<string, string>,
74
74
  request: Request,
@@ -77,49 +77,45 @@ export interface RouterContext<TEnv = any> {
77
77
  url: URL,
78
78
  bindings?: any,
79
79
  routeMap?: Record<string, string>,
80
- routeName?: string
80
+ routeName?: string,
81
+ responseType?: string,
82
+ isPassthroughRoute?: boolean,
81
83
  ) => HandlerContext<any, TEnv>;
82
84
 
83
- // Loader setup
84
85
  setupLoaderAccess: (
85
86
  ctx: HandlerContext<any, TEnv>,
86
- loaderPromises: Map<string, Promise<any>>
87
+ loaderPromises: Map<string, Promise<any>>,
87
88
  ) => void;
88
89
 
89
90
  setupLoaderAccessSilent: (
90
91
  ctx: HandlerContext<any, TEnv>,
91
- loaderPromises: Map<string, Promise<any>>
92
+ loaderPromises: Map<string, Promise<any>>,
92
93
  ) => void;
93
94
 
94
- // Context access
95
95
  getContext: () => {
96
96
  getOrCreateStore: (key: string) => any;
97
97
  runWithStore: <T>(
98
98
  store: any,
99
99
  namespace: string,
100
100
  parent: any,
101
- fn: () => T
101
+ fn: () => T,
102
102
  ) => T;
103
103
  };
104
104
 
105
- // Metrics
106
105
  getMetricsStore: () => MetricsStore | undefined;
107
106
 
108
- // Cache
109
107
  createCacheScope: (
110
108
  cacheConfig: any,
111
- parent: CacheScope | null
109
+ parent: CacheScope | null,
112
110
  ) => CacheScope | null;
113
111
 
114
- // Intercept detection
115
112
  findInterceptForRoute: (
116
113
  routeKey: string,
117
114
  parentEntry: EntryData | null,
118
115
  selectorContext: InterceptSelectorContext,
119
- isAction: boolean
116
+ isAction: boolean,
120
117
  ) => InterceptResult | null;
121
118
 
122
- // Segment resolution (with revalidation)
123
119
  resolveAllSegmentsWithRevalidation: (
124
120
  entries: EntryData[],
125
121
  routeKey: string,
@@ -130,11 +126,11 @@ export interface RouterContext<TEnv = any> {
130
126
  request: Request,
131
127
  prevUrl: URL,
132
128
  nextUrl: URL,
133
- loaderPromises: Map<string, Promise<any>>,
134
129
  actionContext: any | undefined,
135
130
  interceptResult: InterceptResult | null,
136
131
  localRouteName: string,
137
- pathname: string
132
+ pathname: string,
133
+ stale?: boolean,
138
134
  ) => Promise<{ segments: ResolvedSegment[]; matchedIds: string[] }>;
139
135
 
140
136
  // Generator-based segment resolution (for pipeline)
@@ -149,7 +145,7 @@ export interface RouterContext<TEnv = any> {
149
145
  prevUrl: URL,
150
146
  nextUrl: URL,
151
147
  loaderPromises: Map<string, Promise<any>>,
152
- actionContext?: any
148
+ actionContext?: any,
153
149
  ) => AsyncGenerator<ResolvedSegment | { __type: "id"; id: string }>;
154
150
 
155
151
  // Intercept resolution
@@ -159,15 +155,14 @@ export interface RouterContext<TEnv = any> {
159
155
  params: Record<string, string>,
160
156
  handlerContext: HandlerContext<any, TEnv>,
161
157
  belongsToRoute: boolean,
162
- revalidationContext?: RevalidationContext
158
+ revalidationContext?: RevalidationContext,
159
+ options?: { skipMiddleware?: boolean },
163
160
  ) => Promise<ResolvedSegment[]>;
164
161
 
165
- // Collect with markers
166
162
  collectWithMarkers?: <T>(
167
- gen: AsyncGenerator<T | { __type: "id"; id: string }>
163
+ gen: AsyncGenerator<T | { __type: "id"; id: string }>,
168
164
  ) => Promise<{ items: T[]; matchedIds: string[] }>;
169
165
 
170
- // Revalidation evaluation
171
166
  evaluateRevalidation: (params: {
172
167
  segment: ResolvedSegment;
173
168
  prevParams: Record<string, string>;
@@ -180,9 +175,17 @@ export interface RouterContext<TEnv = any> {
180
175
  context: HandlerContext<any, TEnv>;
181
176
  actionContext?: any;
182
177
  stale?: boolean;
178
+ traceSource?:
179
+ | "segment-resolution"
180
+ | "cache-hit"
181
+ | "loader"
182
+ | "parallel"
183
+ | "orphan-layout"
184
+ | "route-handler"
185
+ | "layout-handler"
186
+ | "intercept-loader";
183
187
  }) => Promise<boolean>;
184
188
 
185
- // Request context
186
189
  getRequestContext: () =>
187
190
  | {
188
191
  waitUntil: (fn: () => Promise<void>) => void;
@@ -190,39 +193,34 @@ export interface RouterContext<TEnv = any> {
190
193
  }
191
194
  | undefined;
192
195
 
193
- // Simple segment resolution (without revalidation - for full match)
194
196
  resolveAllSegments: (
195
197
  entries: EntryData[],
196
198
  routeKey: string,
197
199
  params: Record<string, string>,
198
200
  handlerContext: HandlerContext<any, TEnv>,
199
- loaderPromises: Map<string, Promise<any>>
201
+ loaderPromises: Map<string, Promise<any>>,
202
+ options?: ResolveSegmentOptions,
200
203
  ) => Promise<ResolvedSegment[]>;
201
204
 
202
- // Generator-based simple resolution
203
205
  resolveAllSegmentsGenerator?: (
204
206
  entries: EntryData[],
205
207
  routeKey: string,
206
208
  params: Record<string, string>,
207
209
  handlerContext: HandlerContext<any, TEnv>,
208
- loaderPromises: Map<string, Promise<any>>
210
+ loaderPromises: Map<string, Promise<any>>,
209
211
  ) => AsyncGenerator<ResolvedSegment | { __type: "id"; id: string }>;
210
212
 
211
- // Collect segments from generator
212
213
  collectSegmentsFromGenerator?: <T>(
213
- gen: AsyncGenerator<T | { __type: "id"; id: string }>
214
+ gen: AsyncGenerator<T | { __type: "id"; id: string }>,
214
215
  ) => Promise<T[]>;
215
216
 
216
- // Handle store
217
217
  createHandleStore: () => any;
218
218
 
219
- // Loaders-only resolution (for full match cache hit - no revalidation)
220
219
  resolveLoadersOnly?: (
221
220
  entries: EntryData[],
222
- handlerContext: HandlerContext<any, TEnv>
221
+ handlerContext: HandlerContext<any, TEnv>,
223
222
  ) => Promise<ResolvedSegment[]>;
224
223
 
225
- // Loaders-only resolution (for cache hit scenarios)
226
224
  resolveLoadersOnlyWithRevalidation?: (
227
225
  entries: EntryData[],
228
226
  handlerContext: HandlerContext<any, TEnv>,
@@ -232,15 +230,20 @@ export interface RouterContext<TEnv = any> {
232
230
  prevUrl: URL,
233
231
  nextUrl: URL,
234
232
  routeKey: string,
235
- actionContext?: any
233
+ actionContext?: any,
234
+ stale?: boolean,
236
235
  ) => Promise<{ segments: ResolvedSegment[]; matchedIds: string[] }>;
237
236
 
238
237
  // Entry revalidation map
239
238
  buildEntryRevalidateMap?: (
240
- entries: EntryData[]
239
+ entries: EntryData[],
241
240
  ) => Map<string, { revalidate: ShouldRevalidateFn[] }>;
242
241
 
243
- // Intercept loaders only (for cache hit + intercept scenarios)
242
+ // Telemetry sink (optional, no-op when undefined)
243
+ telemetry?: TelemetrySink;
244
+
245
+ requestId?: string;
246
+
244
247
  resolveInterceptLoadersOnly?: (
245
248
  intercept: InterceptEntry,
246
249
  entry: EntryData,
@@ -256,14 +259,13 @@ export interface RouterContext<TEnv = any> {
256
259
  routeKey: string;
257
260
  actionContext?: any;
258
261
  stale?: boolean;
259
- }
262
+ },
260
263
  ) => Promise<{
261
264
  loaderDataPromise: Promise<any[]> | any[];
262
265
  loaderIds: string[];
263
266
  } | null>;
264
267
  }
265
268
 
266
- // AsyncLocalStorage instance for router context
267
269
  const routerContext = new AsyncLocalStorage<RouterContext<any>>();
268
270
 
269
271
  /**
@@ -276,7 +278,7 @@ export function getRouterContext<TEnv = any>(): RouterContext<TEnv> {
276
278
  if (!deps) {
277
279
  throw new Error(
278
280
  "getRouterContext() called outside of router context. " +
279
- "Ensure code is running inside runWithRouterContext()."
281
+ "Ensure code is running inside runWithRouterContext().",
280
282
  );
281
283
  }
282
284
  return deps as RouterContext<TEnv>;
@@ -287,15 +289,10 @@ export function getRouterContext<TEnv = any>(): RouterContext<TEnv> {
287
289
  *
288
290
  * All async code within fn() can call getRouterContext() to access router closures.
289
291
  * This works across async boundaries thanks to AsyncLocalStorage.
290
- *
291
- * @param deps Router dependencies to make available
292
- * @param fn Function to run with dependencies available
293
- * @returns Result of fn()
294
292
  */
295
293
  export function runWithRouterContext<T, TEnv = any>(
296
294
  deps: RouterContext<TEnv>,
297
- fn: () => T
295
+ fn: () => T,
298
296
  ): T {
299
297
  return routerContext.run(deps, fn);
300
298
  }
301
-