@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
@@ -1,46 +1,42 @@
1
- /**
2
- * Match API
3
- *
4
- * Extracted from createRouter closure. Contains match context creation functions
5
- * and the matchError function for error boundary resolution.
6
- */
7
-
8
1
  import { CacheScope, createCacheScope } from "../cache/cache-scope.js";
9
- import {
10
- RouteNotFoundError,
11
- } from "../errors";
2
+ import { RouteNotFoundError } from "../errors";
12
3
  import {
13
4
  createErrorInfo,
14
5
  createErrorSegment,
15
6
  findNearestErrorBoundary as findErrorBoundary,
16
7
  } from "./error-handling.js";
17
- import { createHandlerContext } from "./handler-context.js";
8
+ import {
9
+ createHandlerContext,
10
+ stripInternalParams,
11
+ } from "./handler-context.js";
18
12
  import { setupLoaderAccess } from "./loader-resolution.js";
19
13
  import { loadManifest, clearManifestCache } from "./manifest.js";
20
14
  import { collectRouteMiddleware } from "./middleware.js";
21
15
  import { traverseBack } from "./pattern-matching.js";
22
16
  import { DefaultErrorFallback } from "../default-error-boundary.js";
23
17
  import {
24
- EntryData,
25
- LoaderEntry,
18
+ type EntryData,
19
+ type LoaderEntry,
26
20
  getContext,
27
- InterceptSelectorContext,
28
- type MetricsStore,
21
+ type InterceptSelectorContext,
29
22
  } from "../server/context";
30
- import type {
31
- ErrorBoundaryHandler,
32
- ErrorInfo,
33
- HandlerContext,
34
- MatchResult,
35
- ResolvedSegment,
36
- } from "../types";
23
+ import type { ErrorBoundaryHandler, ErrorInfo, MatchResult } from "../types";
37
24
  import type { ReactNode } from "react";
38
- import type { MatchContext, ActionContext as MatchActionContext } from "./match-context.js";
25
+ import type { MatchContext } from "./match-context.js";
39
26
  import type { MatchApiDeps, ActionContext } from "./types.js";
40
- import type { InterceptEntry } from "../server/context";
41
- import type { RouteMatchResult } from "./pattern-matching.js";
42
- import { getRequestContext } from "../server/request-context.js";
27
+ import {
28
+ getRequestContext,
29
+ setRequestContextPrevRouteKey,
30
+ } from "../server/request-context.js";
31
+ import { isAutoGeneratedRouteName } from "../route-name.js";
32
+ import type { DefaultRouteName } from "../types/global-namespace.js";
43
33
  import { debugLog, debugWarn } from "./logging.js";
34
+ import {
35
+ resolveRoute,
36
+ ensureFullRouteSnapshot,
37
+ type RouteSnapshot,
38
+ } from "./route-snapshot.js";
39
+ import { resolveNavigation } from "./navigation-snapshot.js";
44
40
 
45
41
  /**
46
42
  * Create match context for full requests (document/SSR).
@@ -56,61 +52,46 @@ export async function createMatchContextForFull<TEnv>(
56
52
 
57
53
  const metricsStore = deps.getMetricsStore();
58
54
 
59
- const routeMatchStart = metricsStore ? performance.now() : 0;
60
- const matched = deps.findMatch(pathname, metricsStore);
61
- if (metricsStore) {
62
- metricsStore.metrics.push({
63
- label: "route-matching",
64
- duration: performance.now() - routeMatchStart,
65
- startTime: routeMatchStart - metricsStore.requestStart,
66
- });
67
- }
55
+ const result = await resolveRoute<TEnv>(pathname, {
56
+ findMatch: (p) => deps.findMatch(p, metricsStore),
57
+ metricsStore,
58
+ isSSR: true,
59
+ });
68
60
 
69
- if (!matched) {
61
+ if (!result) {
70
62
  throw new RouteNotFoundError(`No route matched for ${pathname}`, {
71
63
  cause: { pathname, method: request.method },
72
64
  });
73
65
  }
74
66
 
75
- if (matched.redirectTo) {
67
+ if (result.type === "redirect") {
76
68
  return {
77
69
  type: "redirect",
78
- redirectUrl: matched.redirectTo + url.search,
70
+ redirectUrl: result.redirectTo + url.search,
79
71
  };
80
72
  }
81
73
 
82
- const manifestStart = metricsStore ? performance.now() : 0;
83
- const manifestEntry = await loadManifest(
84
- matched.entry,
85
- matched.routeKey,
86
- pathname,
87
- metricsStore,
88
- true,
89
- );
90
- if (metricsStore) {
91
- metricsStore.metrics.push({
92
- label: "manifest-loading",
93
- duration: performance.now() - manifestStart,
94
- startTime: manifestStart - metricsStore.requestStart,
95
- });
96
- }
74
+ const snapshot = result.snapshot;
97
75
 
98
- const routeMiddleware = collectRouteMiddleware(
99
- traverseBack(manifestEntry),
100
- matched.params,
101
- );
76
+ const { matched } = snapshot;
77
+
78
+ if (snapshot.isPassthrough) {
79
+ matched.pt = true;
80
+ }
102
81
 
103
- const bindings = (env as any)?.Bindings ?? env;
82
+ const cleanUrl = stripInternalParams(url);
104
83
 
105
84
  const handlerContext = createHandlerContext(
106
85
  matched.params,
107
86
  request,
108
- url.searchParams,
87
+ cleanUrl.searchParams,
109
88
  pathname,
110
- url,
111
- bindings,
89
+ cleanUrl,
90
+ env,
112
91
  deps.getRouteMap(),
113
92
  matched.routeKey,
93
+ matched.responseType,
94
+ matched.pt === true,
114
95
  );
115
96
 
116
97
  const loaderPromises = new Map<string, Promise<any>>();
@@ -128,33 +109,22 @@ export async function createMatchContextForFull<TEnv>(
128
109
  Store.metrics = metricsStore;
129
110
  }
130
111
 
131
- const entries = [...traverseBack(manifestEntry)];
132
- let cacheScope: CacheScope | null = null;
133
- for (const entry of entries) {
134
- if (entry.cache) {
135
- cacheScope = createCacheScope(entry.cache, cacheScope);
136
- }
137
- }
138
-
139
112
  return {
140
113
  request,
141
- url,
114
+ url: cleanUrl,
142
115
  pathname,
143
116
  env,
144
- bindings,
145
117
  clientSegmentIds: [],
146
118
  clientSegmentSet: new Set(),
147
119
  stale: false,
148
- prevUrl: url,
120
+ prevUrl: cleanUrl,
149
121
  prevParams: {},
150
122
  prevMatch: null,
151
123
  matched,
152
- manifestEntry,
153
- entries,
124
+ manifestEntry: snapshot.manifestEntry,
125
+ entries: snapshot.entries,
154
126
  routeKey: matched.routeKey,
155
- localRouteName: matched.routeKey.includes(".")
156
- ? matched.routeKey.split(".").pop()!
157
- : matched.routeKey,
127
+ localRouteName: snapshot.localRouteName,
158
128
  handlerContext,
159
129
  loaderPromises,
160
130
  routeMap: deps.getRouteMap(),
@@ -162,20 +132,24 @@ export async function createMatchContextForFull<TEnv>(
162
132
  Store,
163
133
  interceptContextMatch: null,
164
134
  interceptSelectorContext: {
165
- from: url,
166
- to: url,
135
+ from: cleanUrl,
136
+ to: cleanUrl,
167
137
  params: matched.params,
168
138
  request,
169
139
  env,
170
140
  segments: { path: [], ids: [] },
141
+ toRouteName:
142
+ matched.routeKey && !isAutoGeneratedRouteName(matched.routeKey)
143
+ ? (matched.routeKey as DefaultRouteName)
144
+ : undefined,
171
145
  },
172
146
  isSameRouteNavigation: false,
173
147
  interceptResult: null,
174
- cacheScope,
148
+ cacheScope: snapshot.cacheScope,
175
149
  isIntercept: false,
176
150
  actionContext: undefined,
177
151
  isAction: false,
178
- routeMiddleware,
152
+ routeMiddleware: snapshot.routeMiddleware,
179
153
  isFullMatch: true,
180
154
  };
181
155
  }
@@ -193,103 +167,99 @@ export async function createMatchContextForPartial<TEnv>(
193
167
  const url = new URL(request.url);
194
168
  const pathname = url.pathname;
195
169
 
196
- const requestStartTime = performance.now();
197
170
  const metricsStore = deps.getMetricsStore();
198
171
 
199
- const clientSegmentIds =
200
- url.searchParams.get("_rsc_segments")?.split(",").filter(Boolean) || [];
201
- const stale = url.searchParams.get("_rsc_stale") === "true";
202
- const previousUrl =
203
- request.headers.get("X-RSC-Router-Client-Path") ||
204
- request.headers.get("Referer");
205
- const interceptSourceUrl = request.headers.get(
206
- "X-RSC-Router-Intercept-Source",
207
- );
172
+ const isHmr = !!request.headers.get("X-RSC-HMR");
208
173
 
209
174
  // HMR: clear manifest cache so stale handler references are discarded
210
- if (request.headers.get("X-RSC-HMR")) {
175
+ if (isHmr) {
211
176
  clearManifestCache();
212
177
  }
213
178
 
214
- if (!previousUrl) {
215
- return null;
216
- }
179
+ // Reuse the classified snapshot when available and not invalidated by HMR.
180
+ // classifyRequest already called resolveRoute(lite) with isSSR=false, which
181
+ // matches the partial path. On HMR, discard to pick up manifest changes.
182
+ const classifiedRoute = isHmr
183
+ ? undefined
184
+ : getRequestContext()?._classifiedRoute;
185
+
186
+ // Time route matching. On the reuse path, only nav findMatch calls are new
187
+ // (current-route findMatch and manifest-loading were already timed during
188
+ // classifyRequest via its metricsStore). On the fresh path, all findMatch
189
+ // calls are measured together.
190
+ const routeMatchStart = metricsStore ? performance.now() : 0;
217
191
 
218
- const prevUrl = new URL(previousUrl, url.origin);
219
- const interceptContextUrl = interceptSourceUrl
220
- ? new URL(interceptSourceUrl, url.origin)
221
- : prevUrl;
192
+ let snapshot: RouteSnapshot<TEnv>;
193
+ if (classifiedRoute && classifiedRoute.manifestEntry) {
194
+ snapshot = ensureFullRouteSnapshot(classifiedRoute);
195
+ } else {
196
+ const result = await resolveRoute<TEnv>(pathname, {
197
+ findMatch: (p) => deps.findMatch(p, metricsStore),
198
+ metricsStore,
199
+ isSSR: false,
200
+ skipRouteMatchMetric: true,
201
+ });
222
202
 
223
- const routeMatchStart = metricsStore ? performance.now() : 0;
224
- const prevMatch = deps.findMatch(prevUrl.pathname);
225
- const prevParams = prevMatch?.params || {};
226
- const interceptContextMatch = interceptSourceUrl
227
- ? deps.findMatch(interceptContextUrl.pathname)
228
- : prevMatch;
203
+ if (!result) {
204
+ throw new RouteNotFoundError(`No route matched for ${pathname}`, {
205
+ cause: { pathname, method: request.method },
206
+ });
207
+ }
229
208
 
230
- const matched = deps.findMatch(pathname, metricsStore);
209
+ if (result.type === "redirect") {
210
+ return null;
211
+ }
231
212
 
232
- if (metricsStore) {
233
- metricsStore.metrics.push({
234
- label: "route-matching",
235
- duration: performance.now() - routeMatchStart,
236
- startTime: routeMatchStart - metricsStore.requestStart,
237
- });
213
+ snapshot = result.snapshot;
238
214
  }
239
215
 
240
- if (!matched) {
241
- throw new RouteNotFoundError(`No route matched for ${pathname}`, {
242
- cause: { pathname, method: request.method, previousUrl },
243
- });
216
+ const { matched } = snapshot;
217
+
218
+ // Backward compat: downstream middleware reads matched.pt
219
+ if (snapshot.isPassthrough) {
220
+ matched.pt = true;
244
221
  }
245
222
 
246
- if (matched.redirectTo) {
223
+ const nav = await resolveNavigation(request, url, matched.routeKey, {
224
+ findMatch: deps.findMatch,
225
+ });
226
+ if (!nav) {
247
227
  return null;
248
228
  }
249
229
 
250
- if (prevMatch && prevMatch.entry !== matched.entry && !matched.pr) {
251
- debugLog("matchPartial", "route group changed", {
252
- from: prevMatch.routeKey,
253
- to: matched.routeKey,
230
+ if (metricsStore) {
231
+ const isReuse = !!classifiedRoute;
232
+ metricsStore.metrics.push({
233
+ label: isReuse ? "route-matching:nav" : "route-matching",
234
+ duration: performance.now() - routeMatchStart,
235
+ startTime: routeMatchStart - metricsStore.requestStart,
254
236
  });
255
237
  }
256
238
 
257
- const manifestStart = metricsStore ? performance.now() : 0;
258
- const manifestEntry = await loadManifest(
259
- matched.entry,
260
- matched.routeKey,
261
- pathname,
262
- metricsStore,
263
- false,
264
- );
265
- if (metricsStore) {
266
- metricsStore.metrics.push({
267
- label: "manifest-loading",
268
- duration: performance.now() - manifestStart,
269
- startTime: manifestStart - metricsStore.requestStart,
239
+ if (nav.prevMatch && nav.prevMatch.entry !== matched.entry && !matched.pr) {
240
+ debugLog("matchPartial", "route group changed", {
241
+ from: nav.prevMatch.routeKey,
242
+ to: matched.routeKey,
270
243
  });
271
244
  }
272
245
 
273
- const routeMiddleware = collectRouteMiddleware(
274
- traverseBack(manifestEntry),
275
- matched.params,
276
- );
246
+ const cleanUrl = stripInternalParams(url);
277
247
 
278
- const bindings = (env as any)?.Bindings ?? env;
279
248
  const handlerContext = createHandlerContext(
280
249
  matched.params,
281
250
  request,
282
- url.searchParams,
251
+ cleanUrl.searchParams,
283
252
  pathname,
284
- url,
285
- bindings,
253
+ cleanUrl,
254
+ env,
286
255
  deps.getRouteMap(),
287
256
  matched.routeKey,
257
+ matched.responseType,
258
+ matched.pt === true,
288
259
  );
289
260
 
290
- const clientSegmentSet = new Set(clientSegmentIds);
291
261
  debugLog("matchPartial", "client segments", {
292
- segments: Array.from(clientSegmentSet),
262
+ segments: Array.from(nav.clientSegmentSet),
293
263
  });
294
264
 
295
265
  const loaderPromises = new Map<string, Promise<any>>();
@@ -307,117 +277,113 @@ export async function createMatchContextForPartial<TEnv>(
307
277
  Store.metrics = metricsStore;
308
278
  }
309
279
 
310
- const isSameRouteNavigation = !!(
311
- interceptContextMatch &&
312
- interceptContextMatch.routeKey === matched.routeKey
313
- );
314
-
315
- if (interceptSourceUrl) {
280
+ if (nav.hasInterceptSource) {
316
281
  debugLog("matchPartial.intercept", "intercept context detected", {
317
282
  currentUrl: pathname,
318
- interceptSource: interceptSourceUrl,
319
- contextRoute: interceptContextMatch?.routeKey,
283
+ interceptSource: nav.interceptContextUrl.href,
284
+ contextRoute: nav.interceptContextMatch?.routeKey,
320
285
  currentRoute: matched.routeKey,
321
- sameRouteNavigation: isSameRouteNavigation,
286
+ sameRouteNavigation: nav.isSameRouteNavigation,
322
287
  });
323
288
  }
324
289
 
325
- const localRouteName = matched.routeKey.includes(".")
326
- ? matched.routeKey.split(".").pop()!
327
- : matched.routeKey;
290
+ setRequestContextPrevRouteKey(
291
+ nav.effectiveFromMatch?.routeKey,
292
+ nav.effectiveFromUrl,
293
+ nav.effectiveFromMatch?.params ?? nav.prevParams,
294
+ );
328
295
 
329
- const filteredSegmentIds = clientSegmentIds.filter((id) => {
330
- if (id.includes(".@")) return false;
331
- if (/D\d+\./.test(id)) return false;
332
- return true;
333
- });
334
296
  const interceptSelectorContext: InterceptSelectorContext = {
335
- from: prevUrl,
336
- to: url,
297
+ from: nav.effectiveFromUrl,
298
+ to: cleanUrl,
337
299
  params: matched.params,
338
300
  request,
339
301
  env,
340
302
  segments: {
341
- path: prevUrl.pathname.split("/").filter(Boolean),
342
- ids: filteredSegmentIds,
303
+ path: nav.effectiveFromUrl.pathname.split("/").filter(Boolean),
304
+ ids: nav.filteredSegmentIds,
343
305
  },
306
+ fromRouteName:
307
+ nav.effectiveFromMatch?.routeKey &&
308
+ !isAutoGeneratedRouteName(nav.effectiveFromMatch.routeKey)
309
+ ? (nav.effectiveFromMatch.routeKey as DefaultRouteName)
310
+ : undefined,
311
+ toRouteName:
312
+ matched.routeKey && !isAutoGeneratedRouteName(matched.routeKey)
313
+ ? (matched.routeKey as DefaultRouteName)
314
+ : undefined,
344
315
  };
345
316
  const isAction = !!actionContext;
346
317
 
347
- const clientHasInterceptSegments = [...clientSegmentSet].some((id) =>
318
+ const clientHasInterceptSegments = [...nav.clientSegmentSet].some((id) =>
348
319
  id.includes(".@"),
349
320
  );
350
321
  const skipInterceptForAction = isAction && !clientHasInterceptSegments;
351
322
  const interceptResult =
352
- isSameRouteNavigation || skipInterceptForAction
323
+ nav.isSameRouteNavigation || skipInterceptForAction
353
324
  ? null
354
325
  : findInterceptForRoute(
355
326
  matched.routeKey,
356
- manifestEntry.parent,
327
+ snapshot.manifestEntry.parent,
357
328
  interceptSelectorContext,
358
329
  isAction,
359
330
  ) ||
360
- (localRouteName !== matched.routeKey
331
+ (snapshot.localRouteName !== matched.routeKey
361
332
  ? findInterceptForRoute(
362
- localRouteName,
363
- manifestEntry.parent,
333
+ snapshot.localRouteName,
334
+ snapshot.manifestEntry.parent,
364
335
  interceptSelectorContext,
365
336
  isAction,
366
337
  )
367
338
  : null);
368
339
 
340
+ // Make a mutable copy of clientSegmentSet so we can delete entries
341
+ // for same-route navigation forcing
342
+ const clientSegmentSet = new Set(nav.clientSegmentSet);
343
+
369
344
  if (
370
- isSameRouteNavigation &&
371
- manifestEntry.type === "route" &&
372
- interceptSourceUrl
345
+ nav.isSameRouteNavigation &&
346
+ snapshot.manifestEntry.type === "route" &&
347
+ nav.hasInterceptSource
373
348
  ) {
374
349
  debugLog("matchPartial.intercept", "forcing route segment render", {
375
- segmentId: manifestEntry.shortCode,
350
+ segmentId: snapshot.manifestEntry.shortCode,
376
351
  });
377
- clientSegmentSet.delete(manifestEntry.shortCode);
378
- }
379
-
380
- const entries = [...traverseBack(manifestEntry)];
381
- let cacheScope: CacheScope | null = null;
382
- for (const entry of entries) {
383
- if (entry.cache) {
384
- cacheScope = createCacheScope(entry.cache, cacheScope);
385
- }
352
+ clientSegmentSet.delete(snapshot.manifestEntry.shortCode);
386
353
  }
387
354
 
388
355
  const isIntercept = !!interceptResult;
389
356
 
390
357
  return {
391
358
  request,
392
- url,
359
+ url: cleanUrl,
393
360
  pathname,
394
361
  env,
395
- bindings,
396
- clientSegmentIds,
362
+ clientSegmentIds: nav.clientSegmentIds,
397
363
  clientSegmentSet,
398
- stale,
399
- prevUrl,
400
- prevParams,
401
- prevMatch,
364
+ stale: nav.stale,
365
+ prevUrl: nav.prevUrl,
366
+ prevParams: nav.prevParams,
367
+ prevMatch: nav.prevMatch,
402
368
  matched,
403
- manifestEntry,
404
- entries,
369
+ manifestEntry: snapshot.manifestEntry,
370
+ entries: snapshot.entries,
405
371
  routeKey: matched.routeKey,
406
- localRouteName,
372
+ localRouteName: snapshot.localRouteName,
407
373
  handlerContext,
408
374
  loaderPromises,
409
375
  routeMap: deps.getRouteMap(),
410
376
  metricsStore,
411
377
  Store,
412
- interceptContextMatch,
378
+ interceptContextMatch: nav.interceptContextMatch,
413
379
  interceptSelectorContext,
414
- isSameRouteNavigation,
380
+ isSameRouteNavigation: nav.isSameRouteNavigation,
415
381
  interceptResult,
416
- cacheScope,
382
+ cacheScope: snapshot.cacheScope,
417
383
  isIntercept,
418
384
  actionContext,
419
385
  isAction,
420
- routeMiddleware,
386
+ routeMiddleware: snapshot.routeMiddleware,
421
387
  isFullMatch: false,
422
388
  };
423
389
  }
@@ -438,7 +404,7 @@ export async function matchError<TEnv>(
438
404
 
439
405
  debugLog("matchError", "matching error", { pathname });
440
406
 
441
- const matched = deps.findMatch(pathname);
407
+ const matched = await deps.findMatch(pathname);
442
408
  if (!matched) {
443
409
  debugWarn("matchError", "no route matched", { pathname });
444
410
  return null;
@@ -544,10 +510,7 @@ export async function matchError<TEnv>(
544
510
 
545
511
  const reqCtx = getRequestContext();
546
512
  if (reqCtx) {
547
- reqCtx.res = new Response(null, {
548
- status: 500,
549
- headers: reqCtx.res.headers,
550
- });
513
+ reqCtx._setStatus(500);
551
514
  }
552
515
 
553
516
  const effectiveFallback = fallback || DefaultErrorFallback;
@@ -571,49 +534,7 @@ export async function matchError<TEnv>(
571
534
  segments: [errorSegment],
572
535
  matched: matchedIds,
573
536
  diff: [errorSegment.id],
537
+ resolvedIds: [errorSegment.id],
574
538
  params: matched.params,
575
539
  };
576
540
  }
577
-
578
- /**
579
- * Preview match - returns route middleware without segment resolution.
580
- */
581
- export async function previewMatch<TEnv>(
582
- request: Request,
583
- context: TEnv,
584
- deps: MatchApiDeps<TEnv>,
585
- ): Promise<{
586
- routeMiddleware?: Array<{
587
- handler: import("./middleware.js").MiddlewareFn;
588
- params: Record<string, string>;
589
- }>;
590
- } | null> {
591
- const url = new URL(request.url);
592
- const pathname = url.pathname;
593
-
594
- const matched = deps.findMatch(pathname);
595
- if (!matched) {
596
- return null;
597
- }
598
-
599
- if (matched.redirectTo) {
600
- return { routeMiddleware: undefined };
601
- }
602
-
603
- const manifestEntry = await loadManifest(
604
- matched.entry,
605
- matched.routeKey,
606
- pathname,
607
- undefined,
608
- false,
609
- );
610
-
611
- const routeMiddleware = collectRouteMiddleware(
612
- traverseBack(manifestEntry),
613
- matched.params,
614
- );
615
-
616
- return {
617
- routeMiddleware: routeMiddleware.length > 0 ? routeMiddleware : undefined,
618
- };
619
- }
@@ -45,7 +45,7 @@
45
45
  * - request, url, pathname: The incoming HTTP request
46
46
  *
47
47
  * Environment:
48
- * - env, bindings: Server environment (Cloudflare bindings, etc.)
48
+ * - env: Server environment (Cloudflare bindings, etc.)
49
49
  *
50
50
  * Client State (from RSC request headers):
51
51
  * - clientSegmentIds: Segments the client currently has
@@ -140,7 +140,6 @@ export interface MatchContext<TEnv = any> {
140
140
 
141
141
  // Environment
142
142
  env: TEnv;
143
- bindings: TEnv;
144
143
 
145
144
  // Client state
146
145
  clientSegmentIds: string[];
@@ -211,6 +210,9 @@ export interface MatchPipelineState {
211
210
  // Whether cache should be revalidated (SWR)
212
211
  shouldRevalidate?: boolean;
213
212
 
213
+ // Source of cache hit ("runtime" or "prerender")
214
+ cacheSource?: "runtime" | "prerender";
215
+
214
216
  // Resolved segments from pipeline
215
217
  segments: ResolvedSegment[];
216
218
  matchedIds: string[];
@@ -240,25 +242,3 @@ export function createPipelineState(): MatchPipelineState {
240
242
  slots: {},
241
243
  };
242
244
  }
243
-
244
- /**
245
- * Input parameters for createMatchContext
246
- */
247
- export interface CreateMatchContextInput<TEnv = any> {
248
- request: Request;
249
- env: TEnv;
250
- actionContext?: ActionContext;
251
- }
252
-
253
- /**
254
- * Result from createMatchContext - either a context or null (fall back to full match)
255
- */
256
- export type CreateMatchContextResult<TEnv = any> =
257
- | { type: "context"; ctx: MatchContext<TEnv> }
258
- | { type: "fallback"; reason: string }
259
- | { type: "error"; error: Error };
260
-
261
- // Note: createMatchContext() will be implemented in Step J10 when we wire everything together.
262
- // It requires access to RouterContext (findMatch, loadManifest, etc.) which are closure
263
- // functions from createRouter(). The implementation will live in router.ts initially
264
- // and call getRouterContext() to access these dependencies.