@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,88 @@
1
+ import type { RouteDefinition, DefaultEnv } from "../types.js";
2
+ import type { AllUseItems } from "../route-types.js";
3
+ import type { RouteHelpers } from "./helpers-types.js";
4
+ import {
5
+ layout,
6
+ cache,
7
+ middleware,
8
+ revalidate,
9
+ parallel,
10
+ intercept,
11
+ errorBoundary,
12
+ notFoundBoundary,
13
+ route,
14
+ loader,
15
+ loading,
16
+ transition,
17
+ } from "./dsl-helpers.js";
18
+ import RootLayout from "../server/root-layout";
19
+ import { invariant } from "../errors";
20
+
21
+ /**
22
+ * Assemble the RouteHelpers object. The helpers are the DSL functions
23
+ * themselves; the single cast erases the phantom generics (and the extra
24
+ * `route` key) that the per-router RouteHelpers<T, TEnv> type carries but the
25
+ * runtime functions do not.
26
+ */
27
+ function buildRouteHelpers<T extends RouteDefinition, TEnv>(): RouteHelpers<
28
+ T,
29
+ TEnv
30
+ > {
31
+ return {
32
+ route,
33
+ layout,
34
+ parallel,
35
+ intercept,
36
+ middleware,
37
+ revalidate,
38
+ loader,
39
+ loading,
40
+ errorBoundary,
41
+ notFoundBoundary,
42
+ cache,
43
+ transition,
44
+ } as unknown as RouteHelpers<T, TEnv>;
45
+ }
46
+
47
+ /**
48
+ * Branded type for route handlers that carries the route type info.
49
+ * This enables type-safe verification that imported handlers match route definitions.
50
+ */
51
+ export interface RouteHandlers<T extends RouteDefinition> {
52
+ (): Array<AllUseItems>;
53
+ /** Brand to carry route type info for type checking */
54
+ readonly __routes: T;
55
+ }
56
+
57
+ /**
58
+ * Type-safe handler definition helper
59
+ *
60
+ */
61
+ export function map<const T extends RouteDefinition, TEnv = DefaultEnv>(
62
+ builder: (helpers: RouteHelpers<T, TEnv>) => Array<AllUseItems>,
63
+ ): RouteHandlers<T> {
64
+ const handler = () => {
65
+ // Check if it's a builder function (array-based API)
66
+ invariant(
67
+ typeof builder === "function",
68
+ "map() expects a builder function as its argument",
69
+ );
70
+ // Create helpers
71
+ const helpers = buildRouteHelpers<T, TEnv>();
72
+
73
+ return [layout(RootLayout, () => builder(helpers))].flat(3);
74
+ };
75
+ // Cast to RouteHandlers to carry the route type brand
76
+ return handler as RouteHandlers<T>;
77
+ }
78
+
79
+ /**
80
+ * Create RouteHelpers for inline route definitions
81
+ * Used internally by router.map() for inline handler syntax
82
+ */
83
+ export function createRouteHelpers<
84
+ T extends RouteDefinition,
85
+ TEnv,
86
+ >(): RouteHelpers<T, TEnv> {
87
+ return buildRouteHelpers<T, TEnv>();
88
+ }
@@ -0,0 +1,505 @@
1
+ import type { ReactNode } from "react";
2
+ import type {
3
+ ExtractRouteParams,
4
+ Handler,
5
+ PartialCacheOptions,
6
+ ErrorBoundaryHandler,
7
+ LoaderDefinition,
8
+ MiddlewareFn,
9
+ NotFoundBoundaryHandler,
10
+ ResolvedRouteMap,
11
+ RouteDefinition,
12
+ ShouldRevalidateFn,
13
+ TransitionConfig,
14
+ } from "../types.js";
15
+ import type {
16
+ AllUseItems,
17
+ LayoutItem,
18
+ RouteItem,
19
+ ParallelItem,
20
+ InterceptItem,
21
+ MiddlewareItem,
22
+ RevalidateItem,
23
+ LoaderItem,
24
+ LoadingItem,
25
+ ErrorBoundaryItem,
26
+ NotFoundBoundaryItem,
27
+ LayoutUseItem,
28
+ RouteUseItem,
29
+ ParallelUseItem,
30
+ InterceptUseItem,
31
+ LoaderUseItem,
32
+ CacheItem,
33
+ TransitionItem,
34
+ UseItems,
35
+ } from "../route-types.js";
36
+
37
+ // Re-export route item types for backward compatibility
38
+ export type {
39
+ AllUseItems,
40
+ LayoutItem,
41
+ RouteItem,
42
+ ParallelItem,
43
+ InterceptItem,
44
+ MiddlewareItem,
45
+ RevalidateItem,
46
+ LoaderItem,
47
+ ErrorBoundaryItem,
48
+ NotFoundBoundaryItem,
49
+ LayoutUseItem,
50
+ RouteUseItem,
51
+ ParallelUseItem,
52
+ InterceptUseItem,
53
+ CacheItem,
54
+ } from "../route-types.js";
55
+
56
+ // Re-export intercept selector types for use in handlers
57
+ export type {
58
+ InterceptConfig,
59
+ InterceptSelectorContext,
60
+ InterceptSegmentsState,
61
+ InterceptWhenFn,
62
+ } from "../server/context";
63
+
64
+ /**
65
+ * Route helpers provided by map()
66
+ * These are the only typed helpers users interact with
67
+ */
68
+ export type RouteHelpers<T extends RouteDefinition, TEnv> = {
69
+ /**
70
+ * Define a route handler for a specific route pattern
71
+ * ```typescript
72
+ * route("products.detail", async (ctx) => {
73
+ * const product = await getProduct(ctx.params.slug);
74
+ * return <ProductPage product={product} />;
75
+ * })
76
+ *
77
+ * // With nested use() for middleware, loaders, etc.
78
+ * route("products.detail", ProductHandler, () => [
79
+ * loader(ProductLoader),
80
+ * loading(<ProductSkeleton />),
81
+ * ])
82
+ * ```
83
+ * @param name - Route name matching a key from route definitions
84
+ * @param handler - Async function that returns JSX for the route
85
+ * @param use - Optional callback returning middleware, loaders, loading, etc.
86
+ */
87
+ route: <K extends keyof ResolvedRouteMap<T> & string>(
88
+ name: K,
89
+ handler: Handler<ExtractRouteParams<T, K & string>, {}, TEnv>,
90
+ use?: () => UseItems<RouteUseItem>,
91
+ ) => RouteItem;
92
+ /**
93
+ * Define a layout that wraps child routes
94
+ * ```typescript
95
+ * layout(<RootLayout />, () => [
96
+ * route("home", HomePage),
97
+ * route("about", AboutPage),
98
+ * ])
99
+ *
100
+ * // With dynamic layout handler
101
+ * layout(async (ctx) => {
102
+ * const user = ctx.get("user");
103
+ * return <DashboardShell user={user} />;
104
+ * }, () => [
105
+ * middleware(authMiddleware),
106
+ * route("dashboard", DashboardPage),
107
+ * ])
108
+ * ```
109
+ * @param component - Static JSX or async handler for the layout
110
+ * @param use - Callback returning child routes, middleware, loaders, etc.
111
+ */
112
+ layout: (
113
+ component: ReactNode | Handler<any, any, TEnv>,
114
+ use?: () => UseItems<LayoutUseItem>,
115
+ ) => LayoutItem;
116
+ /**
117
+ * Define parallel routes that render simultaneously in named slots
118
+ * ```typescript
119
+ * parallel({
120
+ * "@sidebar": <Sidebar />,
121
+ * "@main": async (ctx) => <MainContent data={ctx.use(DataLoader)} />,
122
+ * })
123
+ *
124
+ * // With loaders and loading states (broadcast to every slot)
125
+ * parallel({
126
+ * "@analytics": AnalyticsPanel,
127
+ * "@metrics": MetricsPanel,
128
+ * }, () => [
129
+ * loader(DashboardLoader),
130
+ * loading(<DashboardSkeleton />),
131
+ * ])
132
+ *
133
+ * // Per-slot scoped use via slot descriptor — for single-assignment items
134
+ * // like loading() that should not broadcast to siblings.
135
+ * parallel({
136
+ * "@meta": MetaSlot,
137
+ * "@sidebar": {
138
+ * handler: SidebarSlot,
139
+ * use: () => [loading(<SidebarSkeleton />)],
140
+ * },
141
+ * })
142
+ * ```
143
+ * @param slots - Object with slot names (prefixed with @) mapped to handlers
144
+ * or `{ handler, use? }` slot descriptors.
145
+ * @param use - Optional callback for loaders, loading, revalidate, etc.
146
+ * Items here apply to every slot in the call (broadcast).
147
+ * For per-slot single-assignment items, use the slot descriptor's
148
+ * own `use` callback — slot-local items run after the broadcast,
149
+ * so they take precedence on `loading()` and other last-write-wins
150
+ * fields.
151
+ */
152
+ parallel: <
153
+ TSlots extends Record<
154
+ `@${string}`,
155
+ | Handler<any, any, TEnv>
156
+ | ReactNode
157
+ | {
158
+ handler: Handler<any, any, TEnv> | ReactNode;
159
+ use?: () => UseItems<ParallelUseItem>;
160
+ }
161
+ >,
162
+ >(
163
+ slots: TSlots,
164
+ use?: () => UseItems<ParallelUseItem>,
165
+ ) => ParallelItem;
166
+ /**
167
+ * Define an intercepting route for soft navigation
168
+ *
169
+ * When soft-navigating to the target route from within the current layout,
170
+ * the intercept handler renders in the named slot instead of the route's
171
+ * default handler. Direct navigation uses the route's handler.
172
+ *
173
+ * ```typescript
174
+ * // In a layout - intercept "card" route as modal
175
+ * layout(<KanbanLayout />, () => [
176
+ * intercept("@modal", "card", () => <CardModal />),
177
+ * ])
178
+ *
179
+ * // With loaders and revalidation
180
+ * intercept("@modal", "card", () => <CardModal />, () => [
181
+ * loader(CardModalLoader),
182
+ * revalidate(() => false),
183
+ * ])
184
+ *
185
+ * // Conditional activation via the config object's `when` selector
186
+ * intercept("@modal", "card", <CardModal />, {
187
+ * when: ({ from }) => from.pathname.startsWith("/board"),
188
+ * })
189
+ *
190
+ * // Config + other use-items: config is arg 4, use is arg 5
191
+ * intercept(
192
+ * "@modal",
193
+ * "card",
194
+ * <CardModal />,
195
+ * { when: ({ from }) => from.pathname.startsWith("/board") },
196
+ * () => [loader(CardDetailLoader)],
197
+ * )
198
+ * ```
199
+ * @param slotName - Named slot (prefixed with @) where intercept renders
200
+ * @param routeName - Route name to intercept
201
+ * @param handler - Component or handler for intercepted render
202
+ * @param config - Optional InterceptConfig (e.g. `{ when }`), or the use
203
+ * callback directly when there is no config
204
+ * @param use - Optional callback for loaders, middleware, revalidate, etc.
205
+ */
206
+ intercept: {
207
+ // Local: dot-prefixed, params inferred from local route definition
208
+ <K extends keyof ResolvedRouteMap<T> & string>(
209
+ slotName: `@${string}`,
210
+ routeName: `.${K}`,
211
+ handler: ReactNode | Handler<ExtractRouteParams<T, K>, {}, TEnv>,
212
+ config?:
213
+ | import("../server/context.js").InterceptConfig<TEnv>
214
+ | (() => UseItems<InterceptUseItem>),
215
+ use?: () => UseItems<InterceptUseItem>,
216
+ ): InterceptItem;
217
+ // Global: unprefixed, params inferred from global route map
218
+ <K extends keyof Rango.GeneratedRouteMap & string>(
219
+ slotName: `@${string}`,
220
+ routeName: K,
221
+ handler: ReactNode | Handler<K, Rango.GeneratedRouteMap, TEnv>,
222
+ config?:
223
+ | import("../server/context.js").InterceptConfig<TEnv>
224
+ | (() => UseItems<InterceptUseItem>),
225
+ use?: () => UseItems<InterceptUseItem>,
226
+ ): InterceptItem;
227
+ };
228
+ /**
229
+ * Attach middleware to the current route/layout, or wrap child segments
230
+ *
231
+ * **Sibling mode** — attaches middleware to the parent entry:
232
+ * ```typescript
233
+ * layout(<DashboardShell />, () => [
234
+ * middleware(authMiddleware),
235
+ * middleware([authMiddleware, loggingMiddleware]),
236
+ * path("/", DashboardPage),
237
+ * ])
238
+ * ```
239
+ *
240
+ * **Wrapping mode** — scopes middleware to the children only:
241
+ * ```typescript
242
+ * middleware(authMiddleware, () => [
243
+ * path("/dashboard", DashboardPage),
244
+ * path("/settings", SettingsPage),
245
+ * ])
246
+ *
247
+ * middleware([authMiddleware, loggingMiddleware], () => [
248
+ * path("/admin", AdminPage),
249
+ * ])
250
+ * ```
251
+ */
252
+ middleware: {
253
+ (fn: MiddlewareFn<TEnv>): MiddlewareItem;
254
+ (
255
+ fn: MiddlewareFn<TEnv>,
256
+ children: () => UseItems<LayoutUseItem>,
257
+ ): MiddlewareItem;
258
+ (fns: MiddlewareFn<TEnv>[]): MiddlewareItem;
259
+ (
260
+ fns: MiddlewareFn<TEnv>[],
261
+ children: () => UseItems<LayoutUseItem>,
262
+ ): MiddlewareItem;
263
+ };
264
+ /**
265
+ * Control when a segment should revalidate during navigation
266
+ * ```typescript
267
+ * // Revalidate when params change
268
+ * revalidate(({ currentParams, nextParams }) =>
269
+ * currentParams.slug !== nextParams.slug
270
+ * )
271
+ *
272
+ * // Revalidate after specific actions (actionId format: "path/to/file.ts#exportName")
273
+ * // Use `|| undefined` (defer), not `?? false` (hard short-circuit), so the
274
+ * // chain and the segment default still apply when there is no match.
275
+ * revalidate(({ actionId }) =>
276
+ * actionId?.includes("Cart") || undefined
277
+ * )
278
+ *
279
+ * // Soft decision (suggest but allow override)
280
+ * revalidate(({ defaultShouldRevalidate }) =>
281
+ * ({ defaultShouldRevalidate: true })
282
+ * )
283
+ * ```
284
+ * @param fn - Function returning either:
285
+ * - `boolean` (hard decision — short-circuits the chain),
286
+ * - `{ defaultShouldRevalidate: boolean }` (soft — updates the suggestion
287
+ * for downstream revalidators),
288
+ * - or nothing / `null` / `undefined` (defer — leaves the suggestion
289
+ * unchanged and continues to the next revalidator).
290
+ */
291
+ revalidate: (fn: ShouldRevalidateFn<any, TEnv>) => RevalidateItem;
292
+ /**
293
+ * Attach a data loader to the current route/layout
294
+ * ```typescript
295
+ * loader(ProductLoader)
296
+ *
297
+ * // With loader-specific revalidation (match by file or export name)
298
+ * loader(CartLoader, () => [
299
+ * revalidate(({ actionId }) => actionId?.includes("Cart") || undefined),
300
+ * ])
301
+ *
302
+ * // Consume in client components with useLoader()
303
+ * // (preferred — cache-safe, always fresh)
304
+ * function ProductDetails() {
305
+ * const { data } = useLoader(ProductLoader);
306
+ * return <div>{data.name}</div>;
307
+ * }
308
+ * ```
309
+ * @param loaderDef - Loader created with createLoader()
310
+ * @param use - Optional callback for loader-specific revalidation rules
311
+ */
312
+ loader: <TData>(
313
+ loaderDef: LoaderDefinition<TData>,
314
+ use?: () => UseItems<LoaderUseItem>,
315
+ ) => LoaderItem;
316
+ /**
317
+ * Attach a loading component to the current route/layout
318
+ * ```typescript
319
+ * // Show loading on all requests (including SSR)
320
+ * loading(<Skeleton />)
321
+ *
322
+ * // Skip loading on SSR, only show on client navigation
323
+ * loading(<Skeleton />, { ssr: false })
324
+ * ```
325
+ * @param component - The loading UI to show during navigation
326
+ * @param options - Configuration options
327
+ * @param options.ssr - If false, skip showing loading on document requests (SSR)
328
+ */
329
+ loading: (
330
+ component: ReactNode | (() => ReactNode),
331
+ options?: { ssr?: boolean },
332
+ ) => LoadingItem;
333
+ /**
334
+ * Attach an error boundary to catch errors in this segment and children
335
+ * ```typescript
336
+ * errorBoundary(<ErrorFallback />)
337
+ *
338
+ * // With dynamic error handler
339
+ * errorBoundary(({ error, reset }) => (
340
+ * <div>
341
+ * <h2>Something went wrong</h2>
342
+ * <p>{error.message}</p>
343
+ * <button onClick={reset}>Try again</button>
344
+ * </div>
345
+ * ))
346
+ * ```
347
+ * @param fallback - Static JSX or handler receiving error info and reset function
348
+ */
349
+ errorBoundary: (
350
+ fallback: ReactNode | ErrorBoundaryHandler,
351
+ ) => ErrorBoundaryItem;
352
+ /**
353
+ * Attach a not-found boundary to handle notFound() calls in this segment
354
+ * ```typescript
355
+ * notFoundBoundary(<ProductNotFound />)
356
+ *
357
+ * // With dynamic handler
358
+ * notFoundBoundary(({ notFound }) => (
359
+ * <div>
360
+ * <h2>{notFound.message}</h2>
361
+ * <a href="/products">Browse all products</a>
362
+ * </div>
363
+ * ))
364
+ * ```
365
+ * @param fallback - Static JSX or handler receiving not-found info
366
+ */
367
+ notFoundBoundary: (
368
+ fallback: ReactNode | NotFoundBoundaryHandler,
369
+ ) => NotFoundBoundaryItem;
370
+ /**
371
+ * Define cache configuration for segments
372
+ *
373
+ * Creates a cache boundary that applies to all children unless overridden.
374
+ * Cache config inherits down the route tree like middleware wrapping.
375
+ *
376
+ * When ttl is not specified, uses store defaults (explicit store first,
377
+ * then app-level store). When store is not specified, uses app-level store.
378
+ *
379
+ * Note: Loaders are NOT cached by default. Use cache() inside loader()
380
+ * to explicitly opt-in to loader caching.
381
+ *
382
+ * ```typescript
383
+ * // Using app-level defaults (ttl inherited from store.defaults)
384
+ * cache(() => [
385
+ * layout(<BlogLayout />), // cached with default TTL
386
+ * route("post/:slug"), // cached with default TTL
387
+ * ])
388
+ *
389
+ * // Cache all segments with explicit 60s TTL
390
+ * cache({ ttl: 60 }, () => [
391
+ * layout(<BlogLayout />), // cached
392
+ * route("post/:slug"), // cached
393
+ * ])
394
+ *
395
+ * // With stale-while-revalidate
396
+ * cache({ ttl: 60, swr: 300 }, () => [
397
+ * route("product/:id"),
398
+ * ])
399
+ *
400
+ * // Override for specific section
401
+ * cache({ ttl: 60 }, () => [
402
+ * layout(<RootLayout />),
403
+ * cache({ ttl: 300 }, () => [
404
+ * route("static-page"), // longer TTL
405
+ * ]),
406
+ * cache(false, () => [
407
+ * route("admin"), // not cached
408
+ * ]),
409
+ * ])
410
+ *
411
+ * // Use different store for specific routes
412
+ * cache({ store: kvStore, ttl: 3600 }, () => [
413
+ * route("archive/:year"), // uses KV store
414
+ * ])
415
+ *
416
+ * // Opt-in loader caching
417
+ * route("product/:id", ProductHandler, () => [
418
+ * loader(ProductLoader), // NOT cached (default)
419
+ * loader(StaticMetadata, () => [
420
+ * cache({ ttl: 3600 }), // cached for 1 hour
421
+ * ]),
422
+ * ])
423
+ * ```
424
+ * @param optionsOrChildren - Cache options, false to disable, or children callback
425
+ * @param children - Optional callback returning child segments (when first arg is options)
426
+ */
427
+ cache: {
428
+ (): CacheItem;
429
+ (children: () => UseItems<AllUseItems>): CacheItem;
430
+ (
431
+ options: PartialCacheOptions<TEnv> | false,
432
+ use?: () => UseItems<AllUseItems>,
433
+ ): CacheItem;
434
+ };
435
+ /**
436
+ * Opt a route (or group of routes) into transition-driven navigation.
437
+ *
438
+ * `transition()` does two independent things, and you choose how far to go:
439
+ * 1. startTransition (ALL React versions): the navigation commit is driven
440
+ * through React's startTransition, so a same-route nav (same route,
441
+ * different params, e.g. /product/1 -> /product/2) holds the previous
442
+ * content while the new loader resolves instead of flashing the route's
443
+ * loading() skeleton (see segment-system.tsx inTransitionScope). This is
444
+ * also the precondition for any view-transition animation.
445
+ * 2. <ViewTransition> (experimental React only): the segment content is also
446
+ * wrapped in React's <ViewTransition>, so the held swap cross-fades/morphs.
447
+ * Layered on by default; pass { viewTransition: false } to keep #1 without
448
+ * the router boundary (and place your own <ViewTransition> instead).
449
+ *
450
+ * A view transition cannot fire without a startTransition, so the meaningful
451
+ * choices are (see skills/view-transitions for the full matrix):
452
+ * - no transition() -> neither (remount + skeleton)
453
+ * - transition({ viewTransition: false }) -> startTransition only (hold)
454
+ * - transition({}) / transition({ enter… }) -> startTransition + ViewTransition
455
+ *
456
+ * Precedence: a bare transition({}) inherits createRouter({ viewTransition })
457
+ * (default "auto"); an explicit per-route `viewTransition` always wins. So
458
+ * transition({}) is startTransition + ViewTransition under the default and
459
+ * startTransition only when the router sets viewTransition: false.
460
+ *
461
+ * Conditional hold: pass `when: (ctx) => boolean` to gate the transition per
462
+ * request. It runs server-side AFTER the route handler (so it can read state
463
+ * the handler set via `ctx.get(...)`); returning false drops this transition
464
+ * for the request, so the navigation streams its loading() skeleton instead of
465
+ * holding. This is a post-handler predicate — distinct from intercept()'s
466
+ * match-time `when` config selector (`intercept(slot, route, Comp, { when })`).
467
+ *
468
+ * ```typescript
469
+ * // Attach to a single route
470
+ * path("/about", AboutPage, { name: "about" }, () => [
471
+ * transition({ enter: "fade-in", exit: "fade-out" }),
472
+ * ])
473
+ *
474
+ * // Wrap a group of routes
475
+ * transition({ enter: "fade-in", exit: "fade-out" }, () => [
476
+ * path("/", HomePage),
477
+ * path("/about", AboutPage),
478
+ * ])
479
+ *
480
+ * // Hold content + drive view transitions, but place no router boundary:
481
+ * path("/product/:id", ProductPage, { name: "product" }, () => [
482
+ * transition({ viewTransition: false }),
483
+ * ])
484
+ *
485
+ * // Hold only when the handler decided to (post-handler predicate):
486
+ * path("/product/:id", ProductPage, { name: "product" }, () => [
487
+ * transition({ when: (ctx) => ctx.get(KeepScroll) === true }),
488
+ * ])
489
+ * ```
490
+ * @param config - ViewTransition configuration (enter, exit, update, share,
491
+ * default, name), `viewTransition: "auto" | false` to toggle the router
492
+ * boundary (createRouter({ viewTransition }) sets the app-wide default), and
493
+ * `when: (ctx) => boolean` to gate the transition per request post-handler
494
+ * @param children - Optional callback returning child routes to wrap
495
+ */
496
+ transition: {
497
+ (): TransitionItem;
498
+ (children: () => UseItems<AllUseItems>): TransitionItem;
499
+ (config: TransitionConfig): TransitionItem;
500
+ (
501
+ config: TransitionConfig,
502
+ children: () => UseItems<AllUseItems>,
503
+ ): TransitionItem;
504
+ };
505
+ };
@@ -0,0 +1,54 @@
1
+ // Type definitions
2
+ export type { RouteHelpers } from "./helpers-types.js";
3
+ export type {
4
+ AllUseItems,
5
+ LayoutItem,
6
+ RouteItem,
7
+ ParallelItem,
8
+ InterceptItem,
9
+ MiddlewareItem,
10
+ RevalidateItem,
11
+ LoaderItem,
12
+ ErrorBoundaryItem,
13
+ NotFoundBoundaryItem,
14
+ LayoutUseItem,
15
+ RouteUseItem,
16
+ ParallelUseItem,
17
+ InterceptUseItem,
18
+ CacheItem,
19
+ InterceptConfig,
20
+ InterceptSelectorContext,
21
+ InterceptSegmentsState,
22
+ InterceptWhenFn,
23
+ } from "./helpers-types.js";
24
+
25
+ // DSL helpers
26
+ export {
27
+ layout,
28
+ cache,
29
+ middleware,
30
+ revalidate,
31
+ parallel,
32
+ intercept,
33
+ errorBoundary,
34
+ notFoundBoundary,
35
+ loader,
36
+ loading,
37
+ transition,
38
+ } from "./dsl-helpers.js";
39
+
40
+ // Helper factories and map
41
+ export {
42
+ map,
43
+ createRouteHelpers,
44
+ type RouteHandlers,
45
+ } from "./helper-factories.js";
46
+
47
+ // Handler use resolver
48
+ export { resolveHandlerUse } from "./resolve-handler-use.js";
49
+
50
+ // Redirect
51
+ export { redirect } from "./redirect.js";
52
+
53
+ // Re-export createLoader from loader.rsc.ts for RSC/server context
54
+ export { createLoader } from "../loader.rsc.js";