@rangojs/router 0.0.0-experimental.32 → 0.0.0-experimental.3232cd17

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 (376) hide show
  1. package/AGENTS.md +4 -0
  2. package/README.md +198 -44
  3. package/dist/bin/rango.js +287 -105
  4. package/dist/testing/vitest.js +82 -0
  5. package/dist/vite/index.js +3248 -1117
  6. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  7. package/package.json +73 -21
  8. package/skills/api-client/SKILL.md +211 -0
  9. package/skills/breadcrumbs/SKILL.md +107 -1
  10. package/skills/bundle-analysis/SKILL.md +159 -0
  11. package/skills/cache-guide/SKILL.md +245 -21
  12. package/skills/caching/SKILL.md +302 -6
  13. package/skills/composability/SKILL.md +27 -2
  14. package/skills/css/SKILL.md +76 -0
  15. package/skills/document-cache/SKILL.md +78 -55
  16. package/skills/handler-use/SKILL.md +364 -0
  17. package/skills/hooks/SKILL.md +270 -30
  18. package/skills/host-router/SKILL.md +82 -22
  19. package/skills/i18n/SKILL.md +276 -0
  20. package/skills/intercept/SKILL.md +49 -5
  21. package/skills/layout/SKILL.md +35 -9
  22. package/skills/links/SKILL.md +249 -17
  23. package/skills/loader/SKILL.md +294 -30
  24. package/skills/middleware/SKILL.md +52 -13
  25. package/skills/migrate-nextjs/SKILL.md +584 -0
  26. package/skills/migrate-react-router/SKILL.md +769 -0
  27. package/skills/mime-routes/SKILL.md +27 -0
  28. package/skills/observability/SKILL.md +137 -0
  29. package/skills/parallel/SKILL.md +203 -7
  30. package/skills/prerender/SKILL.md +123 -100
  31. package/skills/rango/SKILL.md +250 -22
  32. package/skills/react-compiler/SKILL.md +168 -0
  33. package/skills/response-routes/SKILL.md +122 -47
  34. package/skills/route/SKILL.md +97 -5
  35. package/skills/router-setup/SKILL.md +90 -5
  36. package/skills/server-actions/SKILL.md +775 -0
  37. package/skills/streams-and-websockets/SKILL.md +283 -0
  38. package/skills/tailwind/SKILL.md +27 -3
  39. package/skills/testing/SKILL.md +129 -0
  40. package/skills/testing/bindings.md +89 -0
  41. package/skills/testing/cache-prerender.md +124 -0
  42. package/skills/testing/client-components.md +122 -0
  43. package/skills/testing/e2e-parity.md +125 -0
  44. package/skills/testing/flight.md +92 -0
  45. package/skills/testing/handles.md +129 -0
  46. package/skills/testing/loader.md +128 -0
  47. package/skills/testing/middleware.md +99 -0
  48. package/skills/testing/render-handler.md +121 -0
  49. package/skills/testing/response-routes.md +95 -0
  50. package/skills/testing/reverse-and-types.md +84 -0
  51. package/skills/testing/server-actions.md +107 -0
  52. package/skills/testing/server-tree.md +128 -0
  53. package/skills/testing/setup.md +120 -0
  54. package/skills/typesafety/SKILL.md +329 -27
  55. package/skills/use-cache/SKILL.md +36 -5
  56. package/skills/view-transitions/SKILL.md +294 -0
  57. package/src/__augment-tests__/augment.ts +81 -0
  58. package/src/__augment-tests__/augmented.check.ts +116 -0
  59. package/src/__internal.ts +67 -40
  60. package/src/browser/action-coordinator.ts +53 -36
  61. package/src/browser/action-fence.ts +47 -0
  62. package/src/browser/app-shell.ts +39 -0
  63. package/src/browser/app-version.ts +14 -0
  64. package/src/browser/cookie-name.ts +140 -0
  65. package/src/browser/event-controller.ts +86 -147
  66. package/src/browser/history-state.ts +21 -0
  67. package/src/browser/index.ts +3 -3
  68. package/src/browser/invalidate-client-cache.ts +52 -0
  69. package/src/browser/link-interceptor.ts +4 -0
  70. package/src/browser/navigation-bridge.ts +148 -19
  71. package/src/browser/navigation-client.ts +187 -67
  72. package/src/browser/navigation-store-handle.ts +38 -0
  73. package/src/browser/navigation-store.ts +76 -67
  74. package/src/browser/navigation-transaction.ts +18 -66
  75. package/src/browser/partial-update.ts +123 -94
  76. package/src/browser/prefetch/cache.ts +214 -36
  77. package/src/browser/prefetch/fetch.ts +260 -38
  78. package/src/browser/prefetch/policy.ts +6 -0
  79. package/src/browser/prefetch/queue.ts +126 -20
  80. package/src/browser/prefetch/resource-ready.ts +77 -0
  81. package/src/browser/rango-state.ts +158 -76
  82. package/src/browser/react/Link.tsx +93 -11
  83. package/src/browser/react/NavigationProvider.tsx +115 -34
  84. package/src/browser/react/ScrollRestoration.tsx +10 -6
  85. package/src/browser/react/context.ts +7 -2
  86. package/src/browser/react/filter-segment-order.ts +49 -7
  87. package/src/browser/react/index.ts +0 -48
  88. package/src/browser/react/location-state-shared.ts +166 -8
  89. package/src/browser/react/location-state.ts +39 -14
  90. package/src/browser/react/use-action.ts +6 -15
  91. package/src/browser/react/use-handle.ts +23 -69
  92. package/src/browser/react/use-link-status.ts +0 -4
  93. package/src/browser/react/use-navigation.ts +22 -5
  94. package/src/browser/react/use-params.ts +20 -10
  95. package/src/browser/react/use-reverse.ts +106 -0
  96. package/src/browser/react/use-router.ts +46 -11
  97. package/src/browser/react/use-search-params.ts +0 -5
  98. package/src/browser/react/use-segments.ts +11 -21
  99. package/src/browser/response-adapter.ts +52 -1
  100. package/src/browser/rsc-router.tsx +215 -76
  101. package/src/browser/scroll-restoration.ts +46 -39
  102. package/src/browser/segment-reconciler.ts +36 -9
  103. package/src/browser/segment-structure-assert.ts +2 -2
  104. package/src/browser/server-action-bridge.ts +176 -50
  105. package/src/browser/types.ts +95 -11
  106. package/src/browser/validate-redirect-origin.ts +43 -16
  107. package/src/build/collect-fallback-refs.ts +107 -0
  108. package/src/build/generate-manifest.ts +65 -40
  109. package/src/build/generate-route-types.ts +5 -0
  110. package/src/build/index.ts +8 -2
  111. package/src/build/prefix-tree-utils.ts +123 -0
  112. package/src/build/route-trie.ts +137 -32
  113. package/src/build/route-types/codegen.ts +4 -4
  114. package/src/build/route-types/include-resolution.ts +9 -2
  115. package/src/build/route-types/param-extraction.ts +6 -3
  116. package/src/build/route-types/per-module-writer.ts +7 -4
  117. package/src/build/route-types/router-processing.ts +278 -96
  118. package/src/build/route-types/scan-filter.ts +9 -2
  119. package/src/build/route-types/source-scan.ts +118 -0
  120. package/src/build/runtime-discovery.ts +9 -20
  121. package/src/cache/cache-error.ts +104 -0
  122. package/src/cache/cache-policy.ts +68 -28
  123. package/src/cache/cache-runtime.ts +149 -43
  124. package/src/cache/cache-scope.ts +148 -81
  125. package/src/cache/cache-tag.ts +98 -0
  126. package/src/cache/cf/cf-cache-store.ts +2550 -93
  127. package/src/cache/cf/index.ts +11 -17
  128. package/src/cache/document-cache.ts +78 -27
  129. package/src/cache/handle-snapshot.ts +63 -0
  130. package/src/cache/index.ts +23 -20
  131. package/src/cache/memory-segment-store.ts +136 -37
  132. package/src/cache/profile-registry.ts +6 -30
  133. package/src/cache/read-through-swr.ts +41 -11
  134. package/src/cache/segment-codec.ts +0 -16
  135. package/src/cache/tag-invalidation.ts +230 -0
  136. package/src/cache/taint.ts +55 -0
  137. package/src/cache/types.ts +33 -100
  138. package/src/cache/vercel/index.ts +11 -0
  139. package/src/cache/vercel/vercel-cache-store.ts +799 -0
  140. package/src/client.rsc.tsx +6 -21
  141. package/src/client.tsx +108 -290
  142. package/src/component-utils.ts +19 -0
  143. package/src/context-var.ts +84 -2
  144. package/src/debug.ts +2 -2
  145. package/src/decode-loader-results.ts +36 -0
  146. package/src/defer.ts +196 -0
  147. package/src/deps/ssr.ts +0 -1
  148. package/src/errors.ts +30 -4
  149. package/src/handle.ts +70 -22
  150. package/src/handles/MetaTags.tsx +0 -14
  151. package/src/handles/breadcrumbs.ts +16 -5
  152. package/src/handles/meta.ts +0 -39
  153. package/src/host/cookie-handler.ts +0 -36
  154. package/src/host/errors.ts +0 -24
  155. package/src/host/index.ts +8 -2
  156. package/src/host/pattern-matcher.ts +7 -50
  157. package/src/host/router.ts +107 -99
  158. package/src/host/testing.ts +40 -27
  159. package/src/host/types.ts +37 -4
  160. package/src/host/utils.ts +1 -1
  161. package/src/href-client.ts +137 -22
  162. package/src/index.rsc.ts +52 -26
  163. package/src/index.ts +100 -38
  164. package/src/internal-debug.ts +2 -4
  165. package/src/loader-store.ts +500 -0
  166. package/src/loader.rsc.ts +20 -13
  167. package/src/loader.ts +12 -11
  168. package/src/missing-id-error.ts +68 -0
  169. package/src/network-error-thrower.tsx +1 -6
  170. package/src/outlet-context.ts +1 -1
  171. package/src/outlet-provider.tsx +1 -5
  172. package/src/prerender/param-hash.ts +10 -11
  173. package/src/prerender/store.ts +37 -41
  174. package/src/prerender.ts +198 -82
  175. package/src/redirect-origin.ts +100 -0
  176. package/src/response-utils.ts +37 -0
  177. package/src/reverse.ts +65 -15
  178. package/src/root-error-boundary.tsx +1 -19
  179. package/src/route-content-wrapper.tsx +7 -72
  180. package/src/route-definition/dsl-helpers.ts +437 -274
  181. package/src/route-definition/helper-factories.ts +29 -139
  182. package/src/route-definition/helpers-types.ts +113 -37
  183. package/src/route-definition/index.ts +3 -0
  184. package/src/route-definition/redirect.ts +52 -10
  185. package/src/route-definition/resolve-handler-use.ts +161 -0
  186. package/src/route-definition/use-item-types.ts +32 -0
  187. package/src/route-map-builder.ts +7 -17
  188. package/src/route-types.ts +37 -41
  189. package/src/router/basename.ts +14 -0
  190. package/src/router/content-negotiation.ts +108 -9
  191. package/src/router/error-handling.ts +13 -17
  192. package/src/router/find-match.ts +45 -22
  193. package/src/router/handler-context.ts +83 -41
  194. package/src/router/intercept-resolution.ts +25 -23
  195. package/src/router/lazy-includes.ts +19 -53
  196. package/src/router/loader-resolution.ts +213 -30
  197. package/src/router/logging.ts +5 -8
  198. package/src/router/manifest.ts +49 -45
  199. package/src/router/match-api.ts +120 -204
  200. package/src/router/match-context.ts +0 -22
  201. package/src/router/match-handlers.ts +58 -58
  202. package/src/router/match-middleware/background-revalidation.ts +27 -6
  203. package/src/router/match-middleware/cache-lookup.ts +205 -249
  204. package/src/router/match-middleware/cache-store.ts +45 -32
  205. package/src/router/match-middleware/intercept-resolution.ts +8 -28
  206. package/src/router/match-middleware/segment-resolution.ts +52 -18
  207. package/src/router/match-pipelines.ts +1 -42
  208. package/src/router/match-result.ts +104 -40
  209. package/src/router/metrics.ts +5 -34
  210. package/src/router/middleware-types.ts +13 -142
  211. package/src/router/middleware.ts +173 -143
  212. package/src/router/navigation-snapshot.ts +131 -0
  213. package/src/router/params-util.ts +23 -0
  214. package/src/router/pattern-matching.ts +109 -63
  215. package/src/router/prerender-match.ts +190 -54
  216. package/src/router/preview-match.ts +32 -102
  217. package/src/router/request-classification.ts +276 -0
  218. package/src/router/revalidation.ts +63 -55
  219. package/src/router/route-snapshot.ts +244 -0
  220. package/src/router/router-context.ts +6 -28
  221. package/src/router/router-interfaces.ts +100 -35
  222. package/src/router/router-options.ts +91 -11
  223. package/src/router/router-registry.ts +2 -5
  224. package/src/router/segment-resolution/fresh.ts +242 -75
  225. package/src/router/segment-resolution/helpers.ts +63 -24
  226. package/src/router/segment-resolution/loader-cache.ts +41 -37
  227. package/src/router/segment-resolution/revalidation.ts +456 -372
  228. package/src/router/segment-resolution/static-store.ts +19 -5
  229. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  230. package/src/router/segment-resolution/view-transition-default.ts +36 -0
  231. package/src/router/segment-resolution.ts +4 -1
  232. package/src/router/segment-wrappers.ts +2 -3
  233. package/src/router/state-cookie-name.ts +33 -0
  234. package/src/router/substitute-pattern-params.ts +56 -0
  235. package/src/router/telemetry-otel.ts +0 -20
  236. package/src/router/telemetry.ts +96 -19
  237. package/src/router/timeout.ts +0 -20
  238. package/src/router/trie-matching.ts +91 -46
  239. package/src/router/types.ts +10 -63
  240. package/src/router/url-params.ts +44 -0
  241. package/src/router.ts +134 -43
  242. package/src/rsc/handler-context.ts +3 -2
  243. package/src/rsc/handler.ts +492 -383
  244. package/src/rsc/helpers.ts +162 -46
  245. package/src/rsc/index.ts +1 -1
  246. package/src/rsc/json-route-result.ts +38 -0
  247. package/src/rsc/loader-fetch.ts +23 -3
  248. package/src/rsc/manifest-init.ts +33 -42
  249. package/src/rsc/origin-guard.ts +39 -25
  250. package/src/rsc/progressive-enhancement.ts +30 -3
  251. package/src/rsc/redirect-guard.ts +99 -0
  252. package/src/rsc/response-error.ts +79 -12
  253. package/src/rsc/response-route-handler.ts +90 -63
  254. package/src/rsc/rsc-rendering.ts +56 -54
  255. package/src/rsc/runtime-warnings.ts +23 -10
  256. package/src/rsc/server-action.ts +74 -67
  257. package/src/rsc/ssr-setup.ts +18 -2
  258. package/src/rsc/types.ts +25 -6
  259. package/src/runtime-env.ts +18 -0
  260. package/src/search-params.ts +4 -20
  261. package/src/segment-content-promise.ts +67 -0
  262. package/src/segment-loader-promise.ts +134 -0
  263. package/src/segment-system.tsx +272 -129
  264. package/src/serialize.ts +243 -0
  265. package/src/server/context.ts +309 -61
  266. package/src/server/cookie-store.ts +80 -5
  267. package/src/server/handle-store.ts +26 -24
  268. package/src/server/loader-registry.ts +10 -28
  269. package/src/server/request-context.ts +338 -126
  270. package/src/ssr/index.tsx +23 -15
  271. package/src/static-handler.ts +27 -18
  272. package/src/testing/cache-status.ts +162 -0
  273. package/src/testing/collect-handle.ts +40 -0
  274. package/src/testing/dispatch.ts +618 -0
  275. package/src/testing/dom.entry.ts +22 -0
  276. package/src/testing/e2e/fixture.ts +188 -0
  277. package/src/testing/e2e/index.ts +128 -0
  278. package/src/testing/e2e/matchers.ts +35 -0
  279. package/src/testing/e2e/page-helpers.ts +272 -0
  280. package/src/testing/e2e/parity.ts +387 -0
  281. package/src/testing/e2e/server.ts +195 -0
  282. package/src/testing/flight-matchers.ts +97 -0
  283. package/src/testing/flight-normalize.ts +11 -0
  284. package/src/testing/flight-runtime.d.ts +57 -0
  285. package/src/testing/flight-tree.ts +682 -0
  286. package/src/testing/flight.entry.ts +52 -0
  287. package/src/testing/flight.ts +232 -0
  288. package/src/testing/generated-routes.ts +183 -0
  289. package/src/testing/index.ts +99 -0
  290. package/src/testing/internal/context.ts +348 -0
  291. package/src/testing/internal/flight-client-globals.ts +30 -0
  292. package/src/testing/internal/seed-vars.ts +54 -0
  293. package/src/testing/render-handler.ts +330 -0
  294. package/src/testing/render-route.tsx +566 -0
  295. package/src/testing/run-loader.ts +378 -0
  296. package/src/testing/run-middleware.ts +205 -0
  297. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  298. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  299. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  300. package/src/testing/vitest-stubs/version.ts +5 -0
  301. package/src/testing/vitest.ts +305 -0
  302. package/src/theme/ThemeProvider.tsx +0 -52
  303. package/src/theme/ThemeScript.tsx +0 -6
  304. package/src/theme/constants.ts +0 -12
  305. package/src/theme/index.ts +0 -7
  306. package/src/theme/theme-context.ts +1 -5
  307. package/src/theme/theme-script.ts +0 -14
  308. package/src/theme/use-theme.ts +0 -3
  309. package/src/types/boundaries.ts +0 -35
  310. package/src/types/cache-types.ts +17 -8
  311. package/src/types/error-types.ts +30 -90
  312. package/src/types/global-namespace.ts +54 -41
  313. package/src/types/handler-context.ts +233 -81
  314. package/src/types/index.ts +1 -10
  315. package/src/types/loader-types.ts +44 -15
  316. package/src/types/request-scope.ts +107 -0
  317. package/src/types/route-config.ts +6 -50
  318. package/src/types/route-entry.ts +19 -7
  319. package/src/types/segments.ts +37 -14
  320. package/src/urls/include-helper.ts +33 -70
  321. package/src/urls/index.ts +1 -11
  322. package/src/urls/path-helper-types.ts +58 -11
  323. package/src/urls/path-helper.ts +57 -111
  324. package/src/urls/pattern-types.ts +48 -19
  325. package/src/urls/response-types.ts +25 -22
  326. package/src/urls/type-extraction.ts +58 -139
  327. package/src/urls/urls-function.ts +1 -18
  328. package/src/use-loader.tsx +346 -89
  329. package/src/vite/debug.ts +185 -0
  330. package/src/vite/discovery/bundle-postprocess.ts +36 -38
  331. package/src/vite/discovery/discover-routers.ts +130 -85
  332. package/src/vite/discovery/discovery-errors.ts +194 -0
  333. package/src/vite/discovery/gate-state.ts +171 -0
  334. package/src/vite/discovery/prerender-collection.ts +192 -99
  335. package/src/vite/discovery/route-types-writer.ts +40 -84
  336. package/src/vite/discovery/self-gen-tracking.ts +27 -1
  337. package/src/vite/discovery/state.ts +51 -6
  338. package/src/vite/discovery/virtual-module-codegen.ts +14 -34
  339. package/src/vite/index.ts +8 -0
  340. package/src/vite/plugin-types.ts +187 -69
  341. package/src/vite/plugins/cjs-to-esm.ts +8 -18
  342. package/src/vite/plugins/client-ref-dedup.ts +16 -11
  343. package/src/vite/plugins/client-ref-hashing.ts +28 -15
  344. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  345. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  346. package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
  347. package/src/vite/plugins/expose-action-id.ts +49 -98
  348. package/src/vite/plugins/expose-id-utils.ts +11 -50
  349. package/src/vite/plugins/expose-ids/export-analysis.ts +76 -34
  350. package/src/vite/plugins/expose-ids/handler-transform.ts +10 -48
  351. package/src/vite/plugins/expose-ids/loader-transform.ts +3 -20
  352. package/src/vite/plugins/expose-ids/router-transform.ts +20 -16
  353. package/src/vite/plugins/expose-internal-ids.ts +554 -317
  354. package/src/vite/plugins/performance-tracks.ts +89 -0
  355. package/src/vite/plugins/refresh-cmd.ts +89 -27
  356. package/src/vite/plugins/use-cache-transform.ts +73 -83
  357. package/src/vite/plugins/vercel-output.ts +258 -0
  358. package/src/vite/plugins/version-injector.ts +21 -25
  359. package/src/vite/plugins/version-plugin.ts +41 -20
  360. package/src/vite/plugins/virtual-entries.ts +2 -17
  361. package/src/vite/rango.ts +257 -289
  362. package/src/vite/router-discovery.ts +930 -140
  363. package/src/vite/utils/ast-handler-extract.ts +15 -31
  364. package/src/vite/utils/banner.ts +4 -4
  365. package/src/vite/utils/bundle-analysis.ts +10 -15
  366. package/src/vite/utils/client-chunks.ts +184 -0
  367. package/src/vite/utils/forward-user-plugins.ts +171 -0
  368. package/src/vite/utils/manifest-utils.ts +4 -59
  369. package/src/vite/utils/package-resolution.ts +20 -52
  370. package/src/vite/utils/prerender-utils.ts +27 -29
  371. package/src/vite/utils/shared-utils.ts +92 -42
  372. package/src/browser/action-response-classifier.ts +0 -99
  373. package/src/browser/react/use-client-cache.ts +0 -58
  374. package/src/browser/shallow.ts +0 -40
  375. package/src/handles/index.ts +0 -7
  376. package/src/router/middleware-cookies.ts +0 -55
@@ -15,7 +15,7 @@
15
15
  */
16
16
 
17
17
  import type { GetRegisteredRoutes } from "./types.js";
18
- import type { ResponseEnvelope } from "./urls.js";
18
+ import type { JsonSerialize } from "./serialize.js";
19
19
 
20
20
  /**
21
21
  * Parse constraint values into a union type for paths
@@ -103,29 +103,75 @@ type NameForPattern<TPattern extends string, TRoutes = GetRegisteredRoutes> = {
103
103
  }[keyof TRoutes];
104
104
 
105
105
  /**
106
- * Look up the response data type for a route pattern from RegisteredRoutes.
107
- *
108
- * Works by reverse-looking up the route name for the given pattern,
109
- * then extracting the response type from the route entry.
106
+ * Strip a query (`?…`) and/or hash (`#…`) suffix before matching, so a concrete
107
+ * URL like `/api/health?ts=1` still resolves to its route's response. Removes
108
+ * from the earliest of `?`/`#`: a `#` before the first `?` (the query is part of
109
+ * a fragment, e.g. `/health#top?x=1`) is handled, as is a `/:` that only appears
110
+ * inside the query (e.g. `/health?next=/:id`).
111
+ */
112
+ type StripPathSuffix<T extends string> = T extends `${infer Base}?${string}`
113
+ ? Base extends `${infer Frag}#${string}`
114
+ ? Frag
115
+ : Base
116
+ : T extends `${infer Base}#${string}`
117
+ ? Base
118
+ : T;
119
+
120
+ /** Extract a route entry's response payload (or `never` for RSC routes). */
121
+ type ResponsePayloadOf<TRoutes, K extends keyof TRoutes> = TRoutes[K] extends {
122
+ readonly response: infer R;
123
+ }
124
+ ? Exclude<R, Response>
125
+ : never;
126
+
127
+ /**
128
+ * Look up the response payload for a route, keyed by either a route pattern
129
+ * (`/api/products/:id`) or a concrete path (`/api/products/123`). The same type
130
+ * serves a pattern lookup and a typed `fetch` wrapper that forwards a concrete
131
+ * `Rango.Path`:
110
132
  *
111
- * For static routes (no params), pattern === path:
112
- * PathResponse<"/api/health"> → { status: string; timestamp: number }
133
+ * PathResponse<"/api/products/:id"> Product // by pattern
134
+ * PathResponse<"/api/products/123"> → Product // by concrete path
113
135
  *
114
- * For dynamic routes, use the pattern:
115
- * PathResponse<"/api/products/:id"> Product
136
+ * The query/hash suffix is stripped first; the stripped key is then treated as a
137
+ * pattern when it contains a `/:param` segment and matched exactly (precise even
138
+ * for nested dynamic routes), otherwise as a concrete path matched against each
139
+ * route's `PatternToPath` template. Because those holes are `${string}`
140
+ * (slash-greedy), a concrete path under a *nested* dynamic route can match several
141
+ * patterns and union their responses — pattern lookups do not have this
142
+ * looseness. RSC routes (no response) and unmatched keys resolve to `never`.
143
+ */
144
+ type ResponsePayloadFor<
145
+ TPath extends string,
146
+ TRoutes = GetRegisteredRoutes,
147
+ > = ResponsePayloadForKey<StripPathSuffix<TPath>, TRoutes>;
148
+
149
+ type ResponsePayloadForKey<
150
+ TKey extends string,
151
+ TRoutes,
152
+ > = TKey extends `${string}/:${string}`
153
+ ? {
154
+ [K in keyof TRoutes]: RoutePattern<TRoutes, K> extends TKey
155
+ ? ResponsePayloadOf<TRoutes, K>
156
+ : never;
157
+ }[keyof TRoutes]
158
+ : {
159
+ [K in keyof TRoutes]: TKey extends PatternToPath<RoutePattern<TRoutes, K>>
160
+ ? ResponsePayloadOf<TRoutes, K>
161
+ : never;
162
+ }[keyof TRoutes];
163
+
164
+ /**
165
+ * Public response type for a route, keyed by pattern or concrete path. JSON
166
+ * response routes send the handler's return value verbatim (bare), so the
167
+ * payload is wrapped only in `JsonSerialize` to describe the JSON **wire** value
168
+ * a consumer receives from `fetch().then(r => r.json())` — e.g. a handler
169
+ * returning `{ createdAt: Date }` resolves here to `{ createdAt: string }`.
116
170
  */
117
171
  export type PathResponse<
118
- TPattern extends string,
172
+ TPath extends string,
119
173
  TRoutes = GetRegisteredRoutes,
120
- > = ResponseEnvelope<
121
- {
122
- [K in keyof TRoutes]: RoutePattern<TRoutes, K> extends TPattern
123
- ? TRoutes[K] extends { readonly response: infer R }
124
- ? Exclude<R, Response>
125
- : never
126
- : never;
127
- }[keyof TRoutes]
128
- >;
174
+ > = JsonSerialize<ResponsePayloadFor<TPath, TRoutes>>;
129
175
 
130
176
  /**
131
177
  * Strip trailing slash from a path (e.g., "/blog/" -> "/blog" | "/blog/")
@@ -140,7 +186,7 @@ type OptionalTrailingSlash<T extends string> = T extends `${infer Base}/`
140
186
  /**
141
187
  * Union of all valid paths from registered routes
142
188
  *
143
- * Generated from RSCRouter.RegisteredRoutes via module augmentation.
189
+ * Generated from Rango.RegisteredRoutes via module augmentation.
144
190
  * Allows optional query strings and hash fragments.
145
191
  */
146
192
  export type ValidPaths<TRoutes = GetRegisteredRoutes> =
@@ -154,6 +200,76 @@ export type ValidPaths<TRoutes = GetRegisteredRoutes> =
154
200
  }[keyof TRoutes]
155
201
  >;
156
202
 
203
+ // Module-scoped alias so the ambient `Rango.PathResponse` below can reference
204
+ // the module-level `PathResponse` without the global namespace shadowing the
205
+ // name when both are called `PathResponse`.
206
+ type GlobalPathResponse<
207
+ TPattern extends string,
208
+ TRoutes = GetRegisteredRoutes,
209
+ > = PathResponse<TPattern, TRoutes>;
210
+
211
+ /**
212
+ * Ambient path types on the `Rango` namespace.
213
+ *
214
+ * These live on the same global namespace consumers already augment for
215
+ * `Rango.Env` / `Rango.Vars`, so they are reachable with no import wherever the
216
+ * router's types are in scope. They are the public, recommended surface for
217
+ * typing anything that wraps `href()`. `ValidPaths` / `PathResponse` stay as the
218
+ * internal building blocks behind them.
219
+ */
220
+ declare global {
221
+ namespace Rango {
222
+ /**
223
+ * Union of every valid route path accepted by `href()`.
224
+ *
225
+ * Type a wrapper's path parameter as `Rango.Path` so it shares `href()`'s
226
+ * compile-time validation against the registered routes:
227
+ *
228
+ * ```ts
229
+ * import { href } from "@rangojs/router/client";
230
+ *
231
+ * export const appHref = (path: Rango.Path) => href(path);
232
+ * ```
233
+ *
234
+ * Resolves from `Rango.RegisteredRoutes` when augmented, otherwise the
235
+ * auto-generated `Rango.GeneratedRouteMap`, otherwise a permissive
236
+ * `/${string}` fallback.
237
+ */
238
+ type Path<TRoutes = GetRegisteredRoutes> = ValidPaths<TRoutes>;
239
+
240
+ /**
241
+ * Response payload for a route, looked up from the global route map by
242
+ * either a route pattern (`/api/products/:id`) or a concrete path
243
+ * (`/api/products/123`). Because it accepts a concrete `Rango.Path`, it
244
+ * doubles as the return type of a typed `fetch` wrapper:
245
+ *
246
+ * ```ts
247
+ * type Product = Rango.PathResponse<"/api/products/:id">; // by pattern
248
+ * type Same = Rango.PathResponse<"/api/products/42">; // by concrete path
249
+ *
250
+ * const get = async <T extends Rango.Path>(
251
+ * path: T,
252
+ * ): Promise<Rango.PathResponse<T>> =>
253
+ * fetch(href(path)).then((r) => r.json());
254
+ * ```
255
+ *
256
+ * The payload is the JSON **wire** shape (via `Rango.JsonSerialize`), not the
257
+ * handler's raw return — a handler returning `{ createdAt: Date }` resolves
258
+ * here to `{ createdAt: string }` (bare, no envelope), matching what
259
+ * `fetch().then(r => r.json())` actually yields.
260
+ *
261
+ * Only resolves once `Rango.RegisteredRoutes` carries response metadata (the
262
+ * generated map has paths and search but no payloads). Pass an explicit route
263
+ * map as the second argument to look up against a non-global map (rarely
264
+ * needed in app code).
265
+ */
266
+ type PathResponse<
267
+ TPath extends string,
268
+ TRoutes = GetRegisteredRoutes,
269
+ > = GlobalPathResponse<TPath, TRoutes>;
270
+ }
271
+ }
272
+
157
273
  /**
158
274
  * Type-safe href function for client-side use
159
275
  *
@@ -182,11 +298,10 @@ export type ValidPaths<TRoutes = GetRegisteredRoutes> =
182
298
  */
183
299
  export function href<T extends ValidPaths>(path: T, mount?: string): string {
184
300
  if (mount && mount !== "/") {
185
- // Strip trailing slash from mount to avoid double-slash when joining
186
301
  const normalizedMount = mount.endsWith("/") ? mount.slice(0, -1) : mount;
187
302
  return normalizedMount + path;
188
303
  }
189
- return path;
304
+ return path as string;
190
305
  }
191
306
 
192
307
  /**
package/src/index.rsc.ts CHANGED
@@ -11,8 +11,6 @@
11
11
 
12
12
  // Re-export all universal exports from index.ts
13
13
  export {
14
- // Universal rendering utilities
15
- renderSegments,
16
14
  // Error classes
17
15
  RouteNotFoundError,
18
16
  DataNotFoundError,
@@ -20,10 +18,8 @@ export {
20
18
  MiddlewareError,
21
19
  HandlerError,
22
20
  BuildError,
21
+ DslContextError,
23
22
  InvalidHandlerError,
24
- NetworkError,
25
- isNetworkError,
26
- sanitizeError,
27
23
  RouterError,
28
24
  Skip,
29
25
  isSkip,
@@ -40,7 +36,6 @@ export type {
40
36
  TrailingSlashMode,
41
37
  // Handler types
42
38
  Handler,
43
- ScopedRouteMap,
44
39
  HandlerContext,
45
40
  ExtractParams,
46
41
  GenericParams,
@@ -49,6 +44,7 @@ export type {
49
44
  // Revalidation types
50
45
  RevalidateParams,
51
46
  Revalidate,
47
+ ActionRef,
52
48
  RouteKeys,
53
49
  // Loader types
54
50
  LoaderDefinition,
@@ -73,12 +69,19 @@ export type {
73
69
 
74
70
  // Router options type (server-only, so import directly)
75
71
  export type {
76
- RSCRouterOptions,
72
+ RangoOptions,
77
73
  SSRStreamMode,
78
74
  SSROptions,
79
75
  ResolveStreamingContext,
80
76
  } from "./router.js";
81
77
 
78
+ // Origin-check callback types (referenced by the RangoOptions.originCheck JSDoc)
79
+ export type {
80
+ OriginCheckConfig,
81
+ OriginCheckContext,
82
+ OriginCheckPhase,
83
+ } from "./rsc/origin-guard.js";
84
+
82
85
  // Server-side createLoader and redirect
83
86
  export {
84
87
  createLoader,
@@ -106,10 +109,18 @@ export type {
106
109
  LayoutUseItem,
107
110
  AllUseItems,
108
111
  UseItems,
112
+ HandlerUseItem,
109
113
  } from "./route-types.js";
110
114
 
111
115
  // Handle API
112
116
  export { createHandle, isHandle, type Handle } from "./handle.js";
117
+ export {
118
+ DEFAULT_DEFER_TIMEOUT_MS,
119
+ type DeferOptions,
120
+ type DeferredHandleEntry,
121
+ type HandlePush,
122
+ type HandlePushFn,
123
+ } from "./defer.js";
113
124
 
114
125
  // Context variable API (typed ctx.set/ctx.get tokens)
115
126
  export { createVar, type ContextVar } from "./context-var.js";
@@ -120,34 +131,33 @@ export { nonce } from "./rsc/nonce.js";
120
131
  // Pre-render handler API
121
132
  export {
122
133
  Prerender,
123
- isPrerenderHandler,
134
+ Passthrough,
124
135
  type PrerenderHandlerDefinition,
125
- type PrerenderPassthroughContext,
136
+ type PassthroughHandlerDefinition,
126
137
  type PrerenderOptions,
127
138
  type BuildContext,
128
139
  type StaticBuildContext,
129
140
  type GetParamsContext,
141
+ type PrerenderPassthroughResult,
130
142
  } from "./prerender.js";
131
143
 
132
144
  // Static handler API
133
145
  export {
134
146
  Static,
135
- isStaticHandler,
136
147
  type StaticHandlerDefinition,
148
+ type StaticHandlerOptions,
137
149
  } from "./static-handler.js";
138
150
 
139
151
  // Django-style URL patterns (RSC/server context)
140
152
  export {
141
153
  urls,
142
- RESPONSE_TYPE,
143
154
  type PathHelpers,
144
155
  type PathOptions,
145
156
  type UrlPatterns,
146
157
  type IncludeOptions,
147
158
  type IncludeItem,
148
159
  type RouteResponse,
149
- type ResponseError,
150
- type ResponseEnvelope,
160
+ type ProblemDetails,
151
161
  type ResponseHandler,
152
162
  type ResponseHandlerContext,
153
163
  type JsonResponseHandler,
@@ -161,7 +171,7 @@ export {
161
171
  // Core router (server-side)
162
172
  export {
163
173
  createRouter,
164
- type RSCRouter,
174
+ type Rango,
165
175
  type RootLayoutProps,
166
176
  type RouterRequestInput,
167
177
  } from "./router.js";
@@ -182,6 +192,9 @@ export type { PublicRequestContext as RequestContext } from "./server/request-co
182
192
  import type { PublicRequestContext } from "./server/request-context.js";
183
193
  import type { DefaultEnv } from "./types/global-namespace.js";
184
194
 
195
+ // Shared base for every user-facing request context (mirrors index.ts).
196
+ export type { RequestScope, ExecutionContext } from "./types/request-scope.js";
197
+
185
198
  export const getRequestContext: <
186
199
  TEnv = DefaultEnv,
187
200
  >() => PublicRequestContext<TEnv> = _getRequestContextInternal;
@@ -190,16 +203,31 @@ export const getRequestContext: <
190
203
  export {
191
204
  cookies,
192
205
  headers,
206
+ invalidateClientCache,
207
+ keepClientCache,
193
208
  type CookieStore,
194
209
  type Cookie,
195
210
  type ReadonlyHeaders,
196
211
  } from "./server/cookie-store.js";
197
212
 
213
+ // Cache tag APIs (server-only)
214
+ // cacheTag: tag the current "use cache" entry at runtime.
215
+ // updateTag: read-your-own-writes invalidation (awaitable, for Server Actions).
216
+ // revalidateTag: background hard-purge invalidation (not awaited, for route handlers / webhooks).
217
+ export { cacheTag } from "./cache/cache-tag.js";
218
+ export { updateTag, revalidateTag } from "./cache/tag-invalidation.js";
219
+
198
220
  // Meta types
199
221
  export type { MetaDescriptor, MetaDescriptorBase } from "./router/types.js";
200
222
 
201
223
  // Middleware context types
202
- export type { MiddlewareContext, CookieOptions } from "./router/middleware.js";
224
+ export type {
225
+ MiddlewareContext,
226
+ CookieOptions,
227
+ // The function type of a middleware. Public so the documented "extract the
228
+ // middleware and unit-test it with runMiddleware" pattern has a nameable type.
229
+ MiddlewareFn,
230
+ } from "./router/middleware.js";
203
231
 
204
232
  // Reverse type utilities for type-safe URL generation (Django-style URL reversal)
205
233
  export type {
@@ -207,8 +235,6 @@ export type {
207
235
  ReverseFunction,
208
236
  ExtractLocalRoutes,
209
237
  ParamsFor,
210
- SanitizePrefix,
211
- MergeRoutes,
212
238
  } from "./reverse.js";
213
239
  export { scopedReverse, createReverse } from "./reverse.js";
214
240
 
@@ -221,12 +247,6 @@ export type {
221
247
  RouteParams,
222
248
  } from "./search-params.js";
223
249
 
224
- // Debug utilities for route matching (development only)
225
- export {
226
- enableMatchDebug,
227
- getMatchDebugStats,
228
- } from "./router/pattern-matching.js";
229
-
230
250
  // Location state (universal)
231
251
  export {
232
252
  createLocationState,
@@ -235,26 +255,32 @@ export {
235
255
  type LocationStateOptions,
236
256
  } from "./browser/react/location-state-shared.js";
237
257
 
238
- // Path-based response type lookup from RegisteredRoutes
239
- export type { PathResponse } from "./href-client.js";
258
+ // Path and response types are ambient on the `Rango` namespace (`Rango.Path`,
259
+ // `Rango.PathResponse`, declared in href-client.ts) — no import needed.
240
260
 
241
261
  // Telemetry sink
242
262
  export { createConsoleSink } from "./router/telemetry.js";
243
263
  export { createOTelSink } from "./router/telemetry-otel.js";
244
264
  export type { OTelTracer, OTelSpan } from "./router/telemetry-otel.js";
265
+ // The full TelemetryEvent union PLUS its member types, so a consumer writing a
266
+ // TelemetrySink can annotate a per-`type` handler (or construct an event literal
267
+ // in a test) instead of only narrowing the opaque union.
245
268
  export type {
246
269
  TelemetrySink,
247
270
  TelemetryEvent,
248
271
  RequestStartEvent,
249
272
  RequestEndEvent,
250
273
  RequestErrorEvent,
251
- RequestTimeoutEvent,
252
274
  LoaderStartEvent,
253
275
  LoaderEndEvent,
254
276
  LoaderErrorEvent,
255
277
  HandlerErrorEvent,
278
+ CacheSegmentStatus,
279
+ CacheSegmentSignal,
256
280
  CacheDecisionEvent,
257
281
  RevalidationDecisionEvent,
282
+ RequestTimeoutEvent,
283
+ OriginCheckRejectedEvent,
258
284
  } from "./router/telemetry.js";
259
285
 
260
286
  // Timeout types and error class
package/src/index.ts CHANGED
@@ -10,9 +10,6 @@
10
10
  * import from "@rangojs/router/client"
11
11
  */
12
12
 
13
- // Universal rendering utilities (work on both server and client)
14
- export { renderSegments } from "./segment-system.js";
15
-
16
13
  // Error classes (can be used on both server and client)
17
14
  export {
18
15
  RouteNotFoundError,
@@ -21,10 +18,8 @@ export {
21
18
  MiddlewareError,
22
19
  HandlerError,
23
20
  BuildError,
21
+ DslContextError,
24
22
  InvalidHandlerError,
25
- NetworkError,
26
- isNetworkError,
27
- sanitizeError,
28
23
  RouterError,
29
24
  Skip,
30
25
  isSkip,
@@ -41,7 +36,6 @@ export type {
41
36
  TrailingSlashMode,
42
37
  // Handler types
43
38
  Handler, // Supports params object, path pattern, or route name
44
- ScopedRouteMap, // Scoped view of GeneratedRouteMap for Handler<"localName", ScopedRouteMap<"prefix">>
45
39
  HandlerContext,
46
40
  ExtractParams,
47
41
  GenericParams,
@@ -50,6 +44,7 @@ export type {
50
44
  // Revalidation types
51
45
  RevalidateParams,
52
46
  Revalidate,
47
+ ActionRef,
53
48
  RouteKeys,
54
49
  // Loader types
55
50
  LoaderDefinition,
@@ -95,6 +90,7 @@ export type {
95
90
  LayoutUseItem,
96
91
  AllUseItems,
97
92
  UseItems,
93
+ HandlerUseItem,
98
94
  } from "./route-types.js";
99
95
 
100
96
  // Response route types (usable in both server and client contexts)
@@ -108,8 +104,7 @@ export type {
108
104
  JsonResponsePathFn,
109
105
  TextResponsePathFn,
110
106
  RouteResponse,
111
- ResponseError,
112
- ResponseEnvelope,
107
+ ProblemDetails,
113
108
  } from "./urls.js";
114
109
 
115
110
  // Middleware context types
@@ -145,6 +140,13 @@ export function redirect(): never {
145
140
 
146
141
  // Handle API (universal - works on both server and client)
147
142
  export { createHandle, isHandle, type Handle } from "./handle.js";
143
+ export {
144
+ DEFAULT_DEFER_TIMEOUT_MS,
145
+ type DeferOptions,
146
+ type DeferredHandleEntry,
147
+ type HandlePush,
148
+ type HandlePushFn,
149
+ } from "./defer.js";
148
150
 
149
151
  // Context variable API (typed ctx.set/ctx.get tokens)
150
152
  export { createVar, type ContextVar } from "./context-var.js";
@@ -153,17 +155,52 @@ export { createVar, type ContextVar } from "./context-var.js";
153
155
  export { nonce } from "./rsc/nonce.js";
154
156
 
155
157
  /**
156
- * Error-throwing stub for server-only `Prerender` function.
158
+ * SSR/client stub for server-only `Prerender` function.
159
+ *
160
+ * Returns a lightweight stub object instead of throwing so that the
161
+ * production SSR build can safely bundle the RSC entry chunk — the SSR
162
+ * bundler resolves `@rangojs/router` to this (SSR) entry, so Prerender
163
+ * calls in RSC code must not crash at module-evaluation time.
164
+ */
165
+ export function Prerender(
166
+ _handler?: any,
167
+ _optionsOrId?: any,
168
+ __injectedId?: string,
169
+ ): any {
170
+ const id =
171
+ typeof _optionsOrId === "string" ? _optionsOrId : __injectedId || "";
172
+ return { __brand: "prerenderHandler" as const, $$id: id };
173
+ }
174
+
175
+ /**
176
+ * SSR/client stub for server-only `Passthrough` function.
157
177
  */
158
- export function Prerender(): never {
159
- throw serverOnlyStubError("Prerender");
178
+ export function Passthrough(
179
+ _handler?: any,
180
+ _optionsOrId?: any,
181
+ __injectedId?: string,
182
+ ): any {
183
+ const id =
184
+ typeof _optionsOrId === "string" ? _optionsOrId : __injectedId || "";
185
+ return { __brand: "passthroughHandler" as const, $$id: id };
160
186
  }
161
187
 
162
188
  /**
163
- * Error-throwing stub for server-only `Static` function.
189
+ * SSR/client stub for server-only `Static` function.
190
+ *
191
+ * Returns a lightweight stub object instead of throwing so that the
192
+ * production SSR build can safely bundle the RSC entry chunk — the SSR
193
+ * bundler resolves `@rangojs/router` to this (SSR) entry, so Static
194
+ * calls in RSC code must not crash at module-evaluation time.
164
195
  */
165
- export function Static(): never {
166
- throw serverOnlyStubError("Static");
196
+ export function Static(
197
+ _handler?: any,
198
+ _optionsOrId?: any,
199
+ __injectedId?: string,
200
+ ): any {
201
+ const id =
202
+ typeof _optionsOrId === "string" ? _optionsOrId : __injectedId || "";
203
+ return { __brand: "staticHandler" as const, $$id: id };
167
204
  }
168
205
 
169
206
  /**
@@ -188,24 +225,21 @@ export function headers(): never {
188
225
  }
189
226
 
190
227
  /**
191
- * Error-throwing stub for server-only `createReverse` function.
192
- */
193
- export function createReverse(): never {
194
- throw serverOnlyStubError("createReverse");
195
- }
196
-
197
- /**
198
- * Error-throwing stub for server-only `enableMatchDebug` function.
228
+ * Client implementation of `invalidateClientCache()`. Unlike the server-only
229
+ * stubs above this is a REAL function under the `default` condition (it marks
230
+ * the client's caches stale); the `react-server` condition (index.rsc.ts)
231
+ * selects the server implementation that writes a rotated `Set-Cookie`.
199
232
  */
200
- export function enableMatchDebug(): never {
201
- throw serverOnlyStubError("enableMatchDebug");
202
- }
233
+ export {
234
+ invalidateClientCache,
235
+ keepClientCache,
236
+ } from "./browser/invalidate-client-cache.js";
203
237
 
204
238
  /**
205
- * Error-throwing stub for server-only `getMatchDebugStats` function.
239
+ * Error-throwing stub for server-only `createReverse` function.
206
240
  */
207
- export function getMatchDebugStats(): never {
208
- throw serverOnlyStubError("getMatchDebugStats");
241
+ export function createReverse(): never {
242
+ throw serverOnlyStubError("createReverse");
209
243
  }
210
244
 
211
245
  // Error-throwing stubs for server-only route helpers
@@ -221,6 +255,18 @@ export function middleware(): never {
221
255
  export function revalidate(): never {
222
256
  throw serverOnlyStubError("revalidate");
223
257
  }
258
+ // Cache tag APIs are server-only (real implementations in index.rsc.ts). These
259
+ // stubs keep the named-export shape identical under the default/non-react-server
260
+ // condition so SSR/client/default bundles that encounter the import link cleanly.
261
+ export function cacheTag(): never {
262
+ throw serverOnlyStubError("cacheTag");
263
+ }
264
+ export function updateTag(): never {
265
+ throw serverOnlyStubError("updateTag");
266
+ }
267
+ export function revalidateTag(): never {
268
+ throw serverOnlyStubError("revalidateTag");
269
+ }
224
270
  export function loader(): never {
225
271
  throw serverOnlyStubError("loader");
226
272
  }
@@ -249,6 +295,9 @@ export function transition(): never {
249
295
  // Request context type (safe for client)
250
296
  export type { PublicRequestContext as RequestContext } from "./server/request-context.js";
251
297
 
298
+ // Shared base for every user-facing request context.
299
+ export type { RequestScope, ExecutionContext } from "./types/request-scope.js";
300
+
252
301
  // Cookie store types (safe for client)
253
302
  export type {
254
303
  CookieStore,
@@ -256,6 +305,10 @@ export type {
256
305
  ReadonlyHeaders,
257
306
  } from "./server/cookie-store.js";
258
307
 
308
+ // Built-in handles (universal — work on both server and client)
309
+ export { Meta } from "./handles/meta.js";
310
+ export { Breadcrumbs } from "./handles/breadcrumbs.js";
311
+
259
312
  // Meta types
260
313
  export type { MetaDescriptor, MetaDescriptorBase } from "./router/types.js";
261
314
 
@@ -268,8 +321,6 @@ export type {
268
321
  ReverseFunction,
269
322
  ExtractLocalRoutes,
270
323
  ParamsFor,
271
- SanitizePrefix,
272
- MergeRoutes,
273
324
  } from "./reverse.js";
274
325
  // scopedReverse() helper for handlers to get locally-typed reverse
275
326
  export { scopedReverse } from "./reverse.js";
@@ -282,26 +333,37 @@ export {
282
333
  type LocationStateOptions,
283
334
  } from "./browser/react/location-state-shared.js";
284
335
 
285
- // Path-based response type lookup from RegisteredRoutes
286
- export type { PathResponse } from "./href-client.js";
287
-
288
- // Telemetry sink
289
- export { createConsoleSink } from "./router/telemetry.js";
290
- export { createOTelSink } from "./router/telemetry-otel.js";
336
+ // Path and response types are ambient on the `Rango` namespace (`Rango.Path`,
337
+ // `Rango.PathResponse`, declared in href-client.ts) — no import needed.
338
+
339
+ // Telemetry types only — the createConsoleSink/createOTelSink values are
340
+ // server-only and live in index.rsc.ts (the `react-server` condition of the
341
+ // bare `@rangojs/router` import). Re-exporting them as values from this
342
+ // (default/client) entry would pull telemetry.ts and telemetry-otel.ts into
343
+ // the client module graph; both tree-shake to zero bytes but still appear in
344
+ // bundle analysis output and slow build-time module resolution. Consumers
345
+ // who need the values in non-RSC contexts can import from
346
+ // `@rangojs/router/server`.
291
347
  export type { OTelTracer, OTelSpan } from "./router/telemetry-otel.js";
348
+ // The full TelemetryEvent union PLUS its member types, so a consumer writing a
349
+ // TelemetrySink can annotate a per-`type` handler (or construct an event literal
350
+ // in a test) instead of only narrowing the opaque union.
292
351
  export type {
293
352
  TelemetrySink,
294
353
  TelemetryEvent,
295
354
  RequestStartEvent,
296
355
  RequestEndEvent,
297
356
  RequestErrorEvent,
298
- RequestTimeoutEvent,
299
357
  LoaderStartEvent,
300
358
  LoaderEndEvent,
301
359
  LoaderErrorEvent,
302
360
  HandlerErrorEvent,
361
+ CacheSegmentStatus,
362
+ CacheSegmentSignal,
303
363
  CacheDecisionEvent,
304
364
  RevalidationDecisionEvent,
365
+ RequestTimeoutEvent,
366
+ OriginCheckRejectedEvent,
305
367
  } from "./router/telemetry.js";
306
368
 
307
369
  // Timeout types and error class
@@ -1,7 +1,5 @@
1
- // Internal debug gate. Enable with INTERNAL_RANGO_DEBUG=1 in the environment.
2
- // Uses a Vite define (__RANGO_DEBUG__) for compile-time injection so it works
3
- // in all runtimes including Cloudflare Workers where process.env is unavailable.
4
- // Falls back to process.env for non-Vite contexts (tests, direct Node usage).
1
+ // Vite define for compile-time injection; falls back to process.env (tests, Node).
2
+ // Works in all runtimes including Cloudflare Workers where process.env is unavailable.
5
3
  export const INTERNAL_RANGO_DEBUG: boolean =
6
4
  typeof __RANGO_DEBUG__ !== "undefined"
7
5
  ? __RANGO_DEBUG__