@rangojs/router 0.0.0-experimental.20 → 0.0.0-experimental.204030a9

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 (293) hide show
  1. package/AGENTS.md +4 -0
  2. package/README.md +242 -55
  3. package/dist/bin/rango.js +277 -99
  4. package/dist/vite/index.js +2929 -1132
  5. package/dist/vite/index.js.bak +5448 -0
  6. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  7. package/package.json +68 -21
  8. package/skills/breadcrumbs/SKILL.md +252 -0
  9. package/skills/bundle-analysis/SKILL.md +159 -0
  10. package/skills/cache-guide/SKILL.md +243 -21
  11. package/skills/caching/SKILL.md +159 -10
  12. package/skills/composability/SKILL.md +27 -2
  13. package/skills/document-cache/SKILL.md +78 -55
  14. package/skills/handler-use/SKILL.md +364 -0
  15. package/skills/hooks/SKILL.md +262 -51
  16. package/skills/host-router/SKILL.md +243 -0
  17. package/skills/i18n/SKILL.md +276 -0
  18. package/skills/intercept/SKILL.md +46 -4
  19. package/skills/layout/SKILL.md +28 -7
  20. package/skills/links/SKILL.md +249 -17
  21. package/skills/loader/SKILL.md +291 -31
  22. package/skills/middleware/SKILL.md +49 -12
  23. package/skills/migrate-nextjs/SKILL.md +562 -0
  24. package/skills/migrate-react-router/SKILL.md +769 -0
  25. package/skills/mime-routes/SKILL.md +27 -0
  26. package/skills/observability/SKILL.md +137 -0
  27. package/skills/parallel/SKILL.md +197 -6
  28. package/skills/prerender/SKILL.md +125 -102
  29. package/skills/rango/SKILL.md +242 -23
  30. package/skills/react-compiler/SKILL.md +168 -0
  31. package/skills/response-routes/SKILL.md +66 -9
  32. package/skills/route/SKILL.md +91 -8
  33. package/skills/router-setup/SKILL.md +98 -8
  34. package/skills/server-actions/SKILL.md +751 -0
  35. package/skills/streams-and-websockets/SKILL.md +283 -0
  36. package/skills/testing/SKILL.md +511 -188
  37. package/skills/typesafety/SKILL.md +354 -50
  38. package/skills/use-cache/SKILL.md +34 -5
  39. package/skills/view-transitions/SKILL.md +294 -0
  40. package/src/__augment-tests__/augment.ts +81 -0
  41. package/src/__augment-tests__/augmented.check.ts +117 -0
  42. package/src/__internal.ts +92 -0
  43. package/src/browser/action-coordinator.ts +53 -36
  44. package/src/browser/app-shell.ts +52 -0
  45. package/src/browser/app-version.ts +14 -0
  46. package/src/browser/event-controller.ts +91 -70
  47. package/src/browser/history-state.ts +21 -0
  48. package/src/browser/index.ts +3 -3
  49. package/src/browser/link-interceptor.ts +4 -0
  50. package/src/browser/navigation-bridge.ts +183 -18
  51. package/src/browser/navigation-client.ts +187 -57
  52. package/src/browser/navigation-store.ts +75 -17
  53. package/src/browser/navigation-transaction.ts +21 -37
  54. package/src/browser/partial-update.ts +143 -40
  55. package/src/browser/prefetch/cache.ts +275 -28
  56. package/src/browser/prefetch/fetch.ts +191 -46
  57. package/src/browser/prefetch/policy.ts +6 -0
  58. package/src/browser/prefetch/queue.ts +123 -20
  59. package/src/browser/prefetch/resource-ready.ts +77 -0
  60. package/src/browser/rango-state.ts +53 -13
  61. package/src/browser/react/Link.tsx +98 -14
  62. package/src/browser/react/NavigationProvider.tsx +110 -33
  63. package/src/browser/react/context.ts +7 -2
  64. package/src/browser/react/filter-segment-order.ts +51 -7
  65. package/src/browser/react/index.ts +3 -0
  66. package/src/browser/react/location-state-shared.ts +175 -4
  67. package/src/browser/react/location-state.ts +39 -13
  68. package/src/browser/react/use-handle.ts +23 -64
  69. package/src/browser/react/use-navigation.ts +22 -2
  70. package/src/browser/react/use-params.ts +20 -8
  71. package/src/browser/react/use-reverse.ts +106 -0
  72. package/src/browser/react/use-router.ts +43 -10
  73. package/src/browser/react/use-segments.ts +11 -8
  74. package/src/browser/response-adapter.ts +25 -0
  75. package/src/browser/rsc-router.tsx +200 -75
  76. package/src/browser/scroll-restoration.ts +46 -39
  77. package/src/browser/segment-reconciler.ts +36 -9
  78. package/src/browser/segment-structure-assert.ts +2 -2
  79. package/src/browser/server-action-bridge.ts +31 -36
  80. package/src/browser/types.ts +81 -5
  81. package/src/build/collect-fallback-refs.ts +107 -0
  82. package/src/build/generate-manifest.ts +65 -40
  83. package/src/build/generate-route-types.ts +5 -0
  84. package/src/build/index.ts +2 -0
  85. package/src/build/route-trie.ts +69 -26
  86. package/src/build/route-types/codegen.ts +4 -4
  87. package/src/build/route-types/include-resolution.ts +9 -2
  88. package/src/build/route-types/per-module-writer.ts +7 -4
  89. package/src/build/route-types/router-processing.ts +278 -88
  90. package/src/build/route-types/scan-filter.ts +9 -2
  91. package/src/build/route-types/source-scan.ts +118 -0
  92. package/src/build/runtime-discovery.ts +9 -20
  93. package/src/cache/cache-runtime.ts +15 -11
  94. package/src/cache/cache-scope.ts +76 -49
  95. package/src/cache/cf/cf-cache-store.ts +501 -18
  96. package/src/cache/cf/index.ts +5 -1
  97. package/src/cache/document-cache.ts +17 -7
  98. package/src/cache/index.ts +1 -0
  99. package/src/cache/taint.ts +55 -0
  100. package/src/client.rsc.tsx +5 -1
  101. package/src/client.tsx +95 -284
  102. package/src/context-var.ts +72 -2
  103. package/src/debug.ts +2 -2
  104. package/src/decode-loader-results.ts +36 -0
  105. package/src/errors.ts +30 -1
  106. package/src/handle.ts +65 -12
  107. package/src/handles/breadcrumbs.ts +66 -0
  108. package/src/handles/index.ts +1 -0
  109. package/src/host/index.ts +2 -5
  110. package/src/host/router.ts +129 -57
  111. package/src/host/types.ts +31 -2
  112. package/src/host/utils.ts +1 -1
  113. package/src/href-client.ts +140 -20
  114. package/src/index.rsc.ts +15 -40
  115. package/src/index.ts +92 -76
  116. package/src/loader-store.ts +500 -0
  117. package/src/loader.rsc.ts +2 -5
  118. package/src/loader.ts +3 -10
  119. package/src/missing-id-error.ts +68 -0
  120. package/src/outlet-context.ts +1 -1
  121. package/src/prerender/store.ts +57 -15
  122. package/src/prerender.ts +141 -80
  123. package/src/response-utils.ts +37 -0
  124. package/src/reverse.ts +65 -15
  125. package/src/route-content-wrapper.tsx +6 -28
  126. package/src/route-definition/dsl-helpers.ts +435 -260
  127. package/src/route-definition/helper-factories.ts +29 -139
  128. package/src/route-definition/helpers-types.ts +110 -34
  129. package/src/route-definition/index.ts +3 -3
  130. package/src/route-definition/redirect.ts +11 -3
  131. package/src/route-definition/resolve-handler-use.ts +155 -0
  132. package/src/route-definition/use-item-types.ts +32 -0
  133. package/src/route-map-builder.ts +7 -1
  134. package/src/route-types.ts +37 -41
  135. package/src/router/basename.ts +14 -0
  136. package/src/router/content-negotiation.ts +113 -1
  137. package/src/router/error-handling.ts +1 -1
  138. package/src/router/find-match.ts +4 -2
  139. package/src/router/handler-context.ts +105 -39
  140. package/src/router/intercept-resolution.ts +15 -22
  141. package/src/router/lazy-includes.ts +12 -9
  142. package/src/router/loader-resolution.ts +175 -23
  143. package/src/router/logging.ts +5 -2
  144. package/src/router/manifest.ts +31 -16
  145. package/src/router/match-api.ts +129 -193
  146. package/src/router/match-handlers.ts +63 -20
  147. package/src/router/match-middleware/background-revalidation.ts +30 -2
  148. package/src/router/match-middleware/cache-lookup.ts +136 -106
  149. package/src/router/match-middleware/cache-store.ts +54 -10
  150. package/src/router/match-middleware/intercept-resolution.ts +9 -7
  151. package/src/router/match-middleware/segment-resolution.ts +61 -5
  152. package/src/router/match-result.ts +124 -18
  153. package/src/router/metrics.ts +239 -14
  154. package/src/router/middleware-types.ts +61 -31
  155. package/src/router/middleware.ts +226 -124
  156. package/src/router/navigation-snapshot.ts +182 -0
  157. package/src/router/pattern-matching.ts +118 -19
  158. package/src/router/prerender-match.ts +114 -10
  159. package/src/router/preview-match.ts +32 -102
  160. package/src/router/request-classification.ts +286 -0
  161. package/src/router/revalidation.ts +85 -9
  162. package/src/router/route-snapshot.ts +245 -0
  163. package/src/router/router-context.ts +6 -1
  164. package/src/router/router-interfaces.ts +91 -29
  165. package/src/router/router-options.ts +89 -19
  166. package/src/router/router-registry.ts +2 -5
  167. package/src/router/segment-resolution/fresh.ts +240 -23
  168. package/src/router/segment-resolution/helpers.ts +30 -25
  169. package/src/router/segment-resolution/loader-cache.ts +1 -0
  170. package/src/router/segment-resolution/revalidation.ts +483 -289
  171. package/src/router/segment-resolution/view-transition-default.ts +36 -0
  172. package/src/router/segment-wrappers.ts +2 -0
  173. package/src/router/substitute-pattern-params.ts +56 -0
  174. package/src/router/telemetry.ts +99 -0
  175. package/src/router/trie-matching.ts +38 -15
  176. package/src/router/types.ts +9 -0
  177. package/src/router/url-params.ts +49 -0
  178. package/src/router.ts +120 -32
  179. package/src/rsc/handler-context.ts +2 -2
  180. package/src/rsc/handler.ts +524 -370
  181. package/src/rsc/helpers.ts +91 -43
  182. package/src/rsc/index.ts +1 -21
  183. package/src/rsc/loader-fetch.ts +23 -3
  184. package/src/rsc/manifest-init.ts +5 -1
  185. package/src/rsc/origin-guard.ts +28 -10
  186. package/src/rsc/progressive-enhancement.ts +39 -10
  187. package/src/rsc/response-route-handler.ts +46 -53
  188. package/src/rsc/rsc-rendering.ts +69 -89
  189. package/src/rsc/runtime-warnings.ts +9 -10
  190. package/src/rsc/server-action.ts +39 -47
  191. package/src/rsc/ssr-setup.ts +144 -0
  192. package/src/rsc/types.ts +19 -3
  193. package/src/search-params.ts +20 -17
  194. package/src/segment-content-promise.ts +67 -0
  195. package/src/segment-loader-promise.ts +122 -0
  196. package/src/segment-system.tsx +219 -67
  197. package/src/serialize.ts +243 -0
  198. package/src/server/context.ts +285 -63
  199. package/src/server/cookie-store.ts +28 -4
  200. package/src/server/handle-store.ts +19 -0
  201. package/src/server/loader-registry.ts +9 -8
  202. package/src/server/request-context.ts +228 -65
  203. package/src/server.ts +6 -0
  204. package/src/ssr/index.tsx +9 -1
  205. package/src/static-handler.ts +19 -7
  206. package/src/testing/cache-status.ts +166 -0
  207. package/src/testing/collect-handle.ts +63 -0
  208. package/src/testing/dispatch.ts +440 -0
  209. package/src/testing/dom.entry.ts +22 -0
  210. package/src/testing/e2e/fixture.ts +154 -0
  211. package/src/testing/e2e/index.ts +149 -0
  212. package/src/testing/e2e/matchers.ts +51 -0
  213. package/src/testing/e2e/page-helpers.ts +272 -0
  214. package/src/testing/e2e/parity.ts +306 -0
  215. package/src/testing/e2e/server.ts +183 -0
  216. package/src/testing/flight-matchers.ts +104 -0
  217. package/src/testing/flight-runtime.d.ts +21 -0
  218. package/src/testing/flight.entry.ts +22 -0
  219. package/src/testing/flight.ts +182 -0
  220. package/src/testing/generated-routes.ts +223 -0
  221. package/src/testing/index.ts +98 -0
  222. package/src/testing/internal/context.ts +151 -0
  223. package/src/testing/render-route.tsx +536 -0
  224. package/src/testing/run-loader.ts +296 -0
  225. package/src/testing/run-middleware.ts +170 -0
  226. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  227. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  228. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  229. package/src/testing/vitest-stubs/version.ts +5 -0
  230. package/src/testing/vitest.ts +112 -0
  231. package/src/theme/index.ts +4 -13
  232. package/src/types/cache-types.ts +4 -4
  233. package/src/types/global-namespace.ts +39 -26
  234. package/src/types/handler-context.ts +197 -79
  235. package/src/types/index.ts +1 -0
  236. package/src/types/loader-types.ts +41 -15
  237. package/src/types/request-scope.ts +126 -0
  238. package/src/types/route-config.ts +17 -8
  239. package/src/types/route-entry.ts +19 -1
  240. package/src/types/segments.ts +37 -6
  241. package/src/urls/include-helper.ts +34 -67
  242. package/src/urls/index.ts +0 -3
  243. package/src/urls/path-helper-types.ts +50 -9
  244. package/src/urls/path-helper.ts +63 -63
  245. package/src/urls/pattern-types.ts +48 -19
  246. package/src/urls/response-types.ts +25 -22
  247. package/src/urls/type-extraction.ts +26 -116
  248. package/src/urls/urls-function.ts +1 -5
  249. package/src/use-loader.tsx +487 -44
  250. package/src/vite/debug.ts +185 -0
  251. package/src/vite/discovery/bundle-postprocess.ts +63 -91
  252. package/src/vite/discovery/discover-routers.ts +106 -53
  253. package/src/vite/discovery/discovery-errors.ts +194 -0
  254. package/src/vite/discovery/gate-state.ts +171 -0
  255. package/src/vite/discovery/prerender-collection.ts +222 -107
  256. package/src/vite/discovery/route-types-writer.ts +40 -84
  257. package/src/vite/discovery/self-gen-tracking.ts +27 -1
  258. package/src/vite/discovery/state.ts +50 -13
  259. package/src/vite/discovery/virtual-module-codegen.ts +13 -23
  260. package/src/vite/index.ts +10 -3
  261. package/src/vite/plugin-types.ts +111 -72
  262. package/src/vite/plugins/cjs-to-esm.ts +8 -7
  263. package/src/vite/plugins/client-ref-dedup.ts +16 -0
  264. package/src/vite/plugins/client-ref-hashing.ts +28 -5
  265. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  266. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  267. package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
  268. package/src/vite/plugins/expose-action-id.ts +55 -33
  269. package/src/vite/plugins/expose-id-utils.ts +24 -8
  270. package/src/vite/plugins/expose-ids/export-analysis.ts +100 -20
  271. package/src/vite/plugins/expose-ids/handler-transform.ts +12 -35
  272. package/src/vite/plugins/expose-ids/loader-transform.ts +3 -5
  273. package/src/vite/plugins/expose-ids/router-transform.ts +20 -3
  274. package/src/vite/plugins/expose-internal-ids.ts +544 -317
  275. package/src/vite/plugins/performance-tracks.ts +92 -0
  276. package/src/vite/plugins/refresh-cmd.ts +127 -0
  277. package/src/vite/plugins/use-cache-transform.ts +65 -50
  278. package/src/vite/plugins/version-injector.ts +39 -23
  279. package/src/vite/plugins/version-plugin.ts +72 -3
  280. package/src/vite/plugins/virtual-entries.ts +2 -2
  281. package/src/vite/rango.ts +265 -226
  282. package/src/vite/router-discovery.ts +924 -137
  283. package/src/vite/utils/ast-handler-extract.ts +15 -15
  284. package/src/vite/utils/banner.ts +4 -4
  285. package/src/vite/utils/bundle-analysis.ts +4 -2
  286. package/src/vite/utils/client-chunks.ts +190 -0
  287. package/src/vite/utils/forward-user-plugins.ts +193 -0
  288. package/src/vite/utils/manifest-utils.ts +21 -5
  289. package/src/vite/utils/package-resolution.ts +41 -1
  290. package/src/vite/utils/prerender-utils.ts +98 -5
  291. package/src/vite/utils/shared-utils.ts +109 -27
  292. package/src/browser/action-response-classifier.ts +0 -99
  293. package/src/route-definition/route-function.ts +0 -119
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)
@@ -115,25 +111,32 @@ export type {
115
111
  // Middleware context types
116
112
  export type { MiddlewareContext, CookieOptions } from "./router/middleware.js";
117
113
 
114
+ function serverOnlyStubError(name: string): Error {
115
+ return new Error(
116
+ `${name}() is only available from "@rangojs/router" in a react-server/RSC environment. ` +
117
+ `For client hooks and components, import from "@rangojs/router/client".`,
118
+ );
119
+ }
120
+
118
121
  /**
119
122
  * Error-throwing stub for server-only `urls` function.
120
123
  */
121
124
  export function urls(): never {
122
- throw new Error("urls() is server-only and requires RSC context.");
125
+ throw serverOnlyStubError("urls");
123
126
  }
124
127
 
125
128
  /**
126
129
  * Error-throwing stub for server-only `createRouter` function.
127
130
  */
128
131
  export function createRouter(): never {
129
- throw new Error("createRouter() is server-only and requires RSC context.");
132
+ throw serverOnlyStubError("createRouter");
130
133
  }
131
134
 
132
135
  /**
133
136
  * Error-throwing stub for server-only `redirect` function.
134
137
  */
135
138
  export function redirect(): never {
136
- throw new Error("redirect() is server-only and requires RSC context.");
139
+ throw serverOnlyStubError("redirect");
137
140
  }
138
141
 
139
142
  // Handle API (universal - works on both server and client)
@@ -146,110 +149,126 @@ export { createVar, type ContextVar } from "./context-var.js";
146
149
  export { nonce } from "./rsc/nonce.js";
147
150
 
148
151
  /**
149
- * Error-throwing stub for server-only `Prerender` function.
152
+ * SSR/client stub for server-only `Prerender` function.
153
+ *
154
+ * Returns a lightweight stub object instead of throwing so that the
155
+ * production SSR build can safely bundle the RSC entry chunk — the SSR
156
+ * bundler resolves `@rangojs/router` to this (SSR) entry, so Prerender
157
+ * calls in RSC code must not crash at module-evaluation time.
158
+ */
159
+ export function Prerender(
160
+ _handler?: any,
161
+ _optionsOrId?: any,
162
+ __injectedId?: string,
163
+ ): any {
164
+ const id =
165
+ typeof _optionsOrId === "string" ? _optionsOrId : __injectedId || "";
166
+ return { __brand: "prerenderHandler" as const, $$id: id };
167
+ }
168
+
169
+ /**
170
+ * SSR/client stub for server-only `Passthrough` function.
150
171
  */
151
- export function Prerender(): never {
152
- throw new Error("Prerender() is server-only and requires RSC context.");
172
+ export function Passthrough(
173
+ _handler?: any,
174
+ _optionsOrId?: any,
175
+ __injectedId?: string,
176
+ ): any {
177
+ const id =
178
+ typeof _optionsOrId === "string" ? _optionsOrId : __injectedId || "";
179
+ return { __brand: "passthroughHandler" as const, $$id: id };
153
180
  }
154
181
 
155
182
  /**
156
- * Error-throwing stub for server-only `Static` function.
183
+ * SSR/client stub for server-only `Static` function.
184
+ *
185
+ * Returns a lightweight stub object instead of throwing so that the
186
+ * production SSR build can safely bundle the RSC entry chunk — the SSR
187
+ * bundler resolves `@rangojs/router` to this (SSR) entry, so Static
188
+ * calls in RSC code must not crash at module-evaluation time.
157
189
  */
158
- export function Static(): never {
159
- throw new Error("Static() is server-only and requires RSC context.");
190
+ export function Static(
191
+ _handler?: any,
192
+ _optionsOrId?: any,
193
+ __injectedId?: string,
194
+ ): any {
195
+ const id =
196
+ typeof _optionsOrId === "string" ? _optionsOrId : __injectedId || "";
197
+ return { __brand: "staticHandler" as const, $$id: id };
160
198
  }
161
199
 
162
200
  /**
163
201
  * Error-throwing stub for server-only `getRequestContext` function.
164
202
  */
165
203
  export function getRequestContext(): never {
166
- throw new Error(
167
- "getRequestContext() is server-only and requires RSC context.",
168
- );
204
+ throw serverOnlyStubError("getRequestContext");
169
205
  }
170
206
 
171
207
  /**
172
208
  * Error-throwing stub for server-only `cookies` function.
173
209
  */
174
210
  export function cookies(): never {
175
- throw new Error("cookies() is server-only and requires RSC context.");
211
+ throw serverOnlyStubError("cookies");
176
212
  }
177
213
 
178
214
  /**
179
215
  * Error-throwing stub for server-only `headers` function.
180
216
  */
181
217
  export function headers(): never {
182
- throw new Error("headers() is server-only and requires RSC context.");
218
+ throw serverOnlyStubError("headers");
183
219
  }
184
220
 
185
221
  /**
186
222
  * Error-throwing stub for server-only `createReverse` function.
187
223
  */
188
224
  export function createReverse(): never {
189
- throw new Error("createReverse() is server-only and requires RSC context.");
190
- }
191
-
192
- /**
193
- * Error-throwing stub for server-only `enableMatchDebug` function.
194
- */
195
- export function enableMatchDebug(): never {
196
- throw new Error(
197
- "enableMatchDebug() is server-only and requires RSC context.",
198
- );
199
- }
200
-
201
- /**
202
- * Error-throwing stub for server-only `getMatchDebugStats` function.
203
- */
204
- export function getMatchDebugStats(): never {
205
- throw new Error(
206
- "getMatchDebugStats() is server-only and requires RSC context.",
207
- );
225
+ throw serverOnlyStubError("createReverse");
208
226
  }
209
227
 
210
228
  // Error-throwing stubs for server-only route helpers
211
229
  export function layout(): never {
212
- throw new Error("layout() is server-only and requires RSC context.");
230
+ throw serverOnlyStubError("layout");
213
231
  }
214
232
  export function cache(): never {
215
- throw new Error("cache() is server-only and requires RSC context.");
233
+ throw serverOnlyStubError("cache");
216
234
  }
217
235
  export function middleware(): never {
218
- throw new Error("middleware() is server-only and requires RSC context.");
236
+ throw serverOnlyStubError("middleware");
219
237
  }
220
238
  export function revalidate(): never {
221
- throw new Error("revalidate() is server-only and requires RSC context.");
239
+ throw serverOnlyStubError("revalidate");
222
240
  }
223
241
  export function loader(): never {
224
- throw new Error("loader() is server-only and requires RSC context.");
242
+ throw serverOnlyStubError("loader");
225
243
  }
226
244
  export function loading(): never {
227
- throw new Error("loading() is server-only and requires RSC context.");
245
+ throw serverOnlyStubError("loading");
228
246
  }
229
247
  export function parallel(): never {
230
- throw new Error("parallel() is server-only and requires RSC context.");
248
+ throw serverOnlyStubError("parallel");
231
249
  }
232
250
  export function intercept(): never {
233
- throw new Error("intercept() is server-only and requires RSC context.");
251
+ throw serverOnlyStubError("intercept");
234
252
  }
235
253
  export function when(): never {
236
- throw new Error("when() is server-only and requires RSC context.");
254
+ throw serverOnlyStubError("when");
237
255
  }
238
256
  export function errorBoundary(): never {
239
- throw new Error("errorBoundary() is server-only and requires RSC context.");
257
+ throw serverOnlyStubError("errorBoundary");
240
258
  }
241
259
  export function notFoundBoundary(): never {
242
- throw new Error(
243
- "notFoundBoundary() is server-only and requires RSC context.",
244
- );
260
+ throw serverOnlyStubError("notFoundBoundary");
245
261
  }
246
262
  export function transition(): never {
247
- throw new Error("transition() is server-only and requires RSC context.");
263
+ throw serverOnlyStubError("transition");
248
264
  }
249
265
 
250
266
  // Request context type (safe for client)
251
267
  export type { PublicRequestContext as RequestContext } from "./server/request-context.js";
252
268
 
269
+ // Shared base for every user-facing request context.
270
+ export type { RequestScope, ExecutionContext } from "./types/request-scope.js";
271
+
253
272
  // Cookie store types (safe for client)
254
273
  export type {
255
274
  CookieStore,
@@ -257,17 +276,22 @@ export type {
257
276
  ReadonlyHeaders,
258
277
  } from "./server/cookie-store.js";
259
278
 
279
+ // Built-in handles (universal — work on both server and client)
280
+ export { Meta } from "./handles/meta.js";
281
+ export { Breadcrumbs } from "./handles/breadcrumbs.js";
282
+
260
283
  // Meta types
261
284
  export type { MetaDescriptor, MetaDescriptorBase } from "./router/types.js";
262
285
 
286
+ // Breadcrumb types
287
+ export type { BreadcrumbItem } from "./handles/breadcrumbs.js";
288
+
263
289
  // Reverse type utilities for type-safe URL generation (Django-style URL reversal)
264
290
  export type {
265
291
  ScopedReverseFunction,
266
292
  ReverseFunction,
267
293
  ExtractLocalRoutes,
268
294
  ParamsFor,
269
- SanitizePrefix,
270
- MergeRoutes,
271
295
  } from "./reverse.js";
272
296
  // scopedReverse() helper for handlers to get locally-typed reverse
273
297
  export { scopedReverse } from "./reverse.js";
@@ -280,27 +304,19 @@ export {
280
304
  type LocationStateOptions,
281
305
  } from "./browser/react/location-state-shared.js";
282
306
 
283
- // Path-based response type lookup from RegisteredRoutes
284
- export type { PathResponse } from "./href-client.js";
285
-
286
- // Telemetry sink
287
- export { createConsoleSink } from "./router/telemetry.js";
288
- export { createOTelSink } from "./router/telemetry-otel.js";
307
+ // Path and response types are ambient on the `Rango` namespace (`Rango.Path`,
308
+ // `Rango.PathResponse`, declared in href-client.ts) — no import needed.
309
+
310
+ // Telemetry types only — the createConsoleSink/createOTelSink values are
311
+ // server-only and live in index.rsc.ts (the `react-server` condition of the
312
+ // bare `@rangojs/router` import). Re-exporting them as values from this
313
+ // (default/client) entry would pull telemetry.ts and telemetry-otel.ts into
314
+ // the client module graph; both tree-shake to zero bytes but still appear in
315
+ // bundle analysis output and slow build-time module resolution. Consumers
316
+ // who need the values in non-RSC contexts can import from
317
+ // `@rangojs/router/server`.
289
318
  export type { OTelTracer, OTelSpan } from "./router/telemetry-otel.js";
290
- export type {
291
- TelemetrySink,
292
- TelemetryEvent,
293
- RequestStartEvent,
294
- RequestEndEvent,
295
- RequestErrorEvent,
296
- RequestTimeoutEvent,
297
- LoaderStartEvent,
298
- LoaderEndEvent,
299
- LoaderErrorEvent,
300
- HandlerErrorEvent,
301
- CacheDecisionEvent,
302
- RevalidationDecisionEvent,
303
- } from "./router/telemetry.js";
319
+ export type { TelemetrySink, TelemetryEvent } from "./router/telemetry.js";
304
320
 
305
321
  // Timeout types and error class
306
322
  export { RouterTimeoutError } from "./router/timeout.js";