@rangojs/router 0.0.0-experimental.31 → 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 +121 -205
  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 +192 -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 +64 -25
  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 +348 -128
  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
@@ -27,9 +27,6 @@ import type { UseThemeReturn } from "./types.js";
27
27
  *
28
28
  * Must be used within a ThemeProvider (which is automatically included
29
29
  * in NavigationProvider when theme is enabled in router config).
30
- *
31
- * @returns Theme state and methods
32
- * @throws Error if used outside ThemeProvider
33
30
  */
34
31
  export function useTheme(): UseThemeReturn {
35
32
  const ctx = requireThemeContext();
@@ -1,22 +1,12 @@
1
1
  import type { ReactNode } from "react";
2
2
 
3
- /**
4
- * Error information passed to error boundary fallback components
5
- */
6
3
  export interface ErrorInfo {
7
- /** Error message (always available) */
8
4
  message: string;
9
- /** Error name/type (e.g., "RouteNotFoundError", "MiddlewareError") */
10
5
  name: string;
11
- /** Optional error code for programmatic handling */
12
6
  code?: string;
13
- /** Stack trace (only in development) */
14
7
  stack?: string;
15
- /** Original error cause if available */
16
8
  cause?: unknown;
17
- /** Segment ID where the error occurred */
18
9
  segmentId: string;
19
- /** Segment type where the error occurred */
20
10
  segmentType:
21
11
  | "layout"
22
12
  | "route"
@@ -46,13 +36,9 @@ export interface ErrorInfo {
46
36
  * ```
47
37
  */
48
38
  export interface ErrorBoundaryFallbackProps {
49
- /** Error information */
50
39
  error: ErrorInfo;
51
40
  }
52
41
 
53
- /**
54
- * Error boundary handler - receives error info and returns fallback UI
55
- */
56
42
  export type ErrorBoundaryHandler = (
57
43
  props: ErrorBoundaryFallbackProps,
58
44
  ) => ReactNode;
@@ -77,17 +63,10 @@ export type ErrorBoundaryHandler = (
77
63
  * ```
78
64
  */
79
65
  export interface ClientErrorBoundaryFallbackProps {
80
- /** Error information */
81
66
  error: ErrorInfo;
82
- /** Function to reset error state and retry rendering */
83
67
  reset: () => void;
84
68
  }
85
69
 
86
- /**
87
- * Wrapped loader data result for deferred resolution with error handling.
88
- * When loaders are deferred to client-side resolution, errors need to be
89
- * wrapped so the client can handle them appropriately.
90
- */
91
70
  export type LoaderDataResult<T = unknown> =
92
71
  | { __loaderResult: true; ok: true; data: T }
93
72
  | {
@@ -97,9 +76,6 @@ export type LoaderDataResult<T = unknown> =
97
76
  fallback: ReactNode | null;
98
77
  };
99
78
 
100
- /**
101
- * Type guard to check if a value is a wrapped loader result
102
- */
103
79
  export function isLoaderDataResult(value: unknown): value is LoaderDataResult {
104
80
  return (
105
81
  typeof value === "object" &&
@@ -109,15 +85,9 @@ export function isLoaderDataResult(value: unknown): value is LoaderDataResult {
109
85
  );
110
86
  }
111
87
 
112
- /**
113
- * Not found information passed to notFound boundary fallback components
114
- */
115
88
  export interface NotFoundInfo {
116
- /** Not found message */
117
89
  message: string;
118
- /** Segment ID where notFound was thrown */
119
90
  segmentId: string;
120
- /** Segment type where notFound was thrown */
121
91
  segmentType:
122
92
  | "layout"
123
93
  | "route"
@@ -125,7 +95,6 @@ export interface NotFoundInfo {
125
95
  | "loader"
126
96
  | "middleware"
127
97
  | "cache";
128
- /** The pathname that triggered the not found */
129
98
  pathname?: string;
130
99
  }
131
100
 
@@ -146,13 +115,9 @@ export interface NotFoundInfo {
146
115
  * ```
147
116
  */
148
117
  export interface NotFoundBoundaryFallbackProps {
149
- /** Not found information */
150
118
  notFound: NotFoundInfo;
151
119
  }
152
120
 
153
- /**
154
- * NotFound boundary handler - receives not found info and returns fallback UI
155
- */
156
121
  export type NotFoundBoundaryHandler = (
157
122
  props: NotFoundBoundaryFallbackProps,
158
123
  ) => ReactNode;
@@ -5,8 +5,8 @@
5
5
  * during cache key generation (before middleware runs).
6
6
  *
7
7
  * Note: While the full RequestContext is passed, middleware-set variables
8
- * (ctx.var, ctx.get()) may not be populated yet since cache lookup
9
- * happens before middleware execution.
8
+ * read via `ctx.get()` may not be populated yet since cache lookup happens
9
+ * before middleware execution.
10
10
  */
11
11
  export type { RequestContext as CacheContext } from "../server/request-context.js";
12
12
 
@@ -78,6 +78,14 @@ export interface CacheOptions<TEnv = unknown> {
78
78
  * - Loader-specific caching strategies
79
79
  * - Hot data in fast cache, cold data in larger/slower cache
80
80
  *
81
+ * Tag invalidation caveat: a per-boundary store becomes reachable by
82
+ * `updateTag()` / `revalidateTag()` once this boundary is resolved in the
83
+ * current process. If the store is *durable* (shared across processes) and the
84
+ * very first request to a fresh worker is an `updateTag`/`revalidateTag` for a
85
+ * tag held only in this store - before this boundary is matched - that
86
+ * invalidation can miss it. For data you invalidate by tag, prefer the
87
+ * app-level store (always reachable), or ensure the boundary is warmed.
88
+ *
81
89
  * @example
82
90
  * ```typescript
83
91
  * const kvStore = new CloudflareKVStore(env.CACHE_KV);
@@ -101,7 +109,7 @@ export interface CacheOptions<TEnv = unknown> {
101
109
  * Return false to skip cache for this request (always fetch fresh).
102
110
  *
103
111
  * Has access to full RequestContext including env, request, params, cookies, etc.
104
- * Note: Middleware-set variables (ctx.var) may not be populated yet.
112
+ * Note: Middleware-set variables read via `ctx.get()` may not be populated yet.
105
113
  *
106
114
  * @example
107
115
  * ```typescript
@@ -123,7 +131,7 @@ export interface CacheOptions<TEnv = unknown> {
123
131
  * Bypasses default key generation AND store's keyGenerator.
124
132
  *
125
133
  * Has access to full RequestContext including env, request, params, cookies, etc.
126
- * Note: Middleware-set variables (ctx.var) may not be populated yet.
134
+ * Note: Middleware-set variables read via `ctx.get()` may not be populated yet.
127
135
  *
128
136
  * @example
129
137
  * ```typescript
@@ -145,10 +153,11 @@ export interface CacheOptions<TEnv = unknown> {
145
153
  * Tags for cache invalidation.
146
154
  * Can be a static array or a function that returns tags.
147
155
  *
148
- * Note: Tags are passed through to the store but built-in stores
149
- * (MemorySegmentCacheStore, CFCacheStore) do not yet index or
150
- * invalidate by tag. Effective tag-based invalidation requires a
151
- * custom store implementation with secondary indices.
156
+ * The built-in `MemorySegmentCacheStore` and `CFCacheStore` index by tag.
157
+ * Invalidate on demand with `updateTag(...tags)` (awaitable, read-your-own-writes;
158
+ * for server actions) or `revalidateTag(...tags)` (background hard-purge, not
159
+ * awaited; for route handlers / webhooks). For `CFCacheStore`, distributed
160
+ * invalidation requires a `kv` namespace (markers live in that same namespace).
152
161
  *
153
162
  * @example
154
163
  * ```typescript
@@ -14,19 +14,19 @@
14
14
  * - "unknown": Fallback for unclassified errors (not currently invoked)
15
15
  */
16
16
  export type ErrorPhase =
17
- | "routing" // During route matching
18
- | "manifest" // During manifest loading (reserved, not currently invoked)
19
- | "middleware" // During middleware execution (errors propagate to handler phase)
20
- | "loader" // During loader execution
21
- | "handler" // During route/layout handler execution
22
- | "rendering" // During RSC/SSR rendering (SSR handler uses separate callback)
23
- | "action" // During server action execution
24
- | "revalidation" // During revalidation evaluation
25
- | "cache" // During "use cache" background operations (stale revalidation, async cache writes)
26
- | "prerender" // During build-time pre-rendering (Vite closeBundle)
27
- | "static" // During build-time static handler rendering (Vite closeBundle)
28
- | "origin" // During cross-origin request validation (CSRF protection)
29
- | "unknown"; // Fallback for unclassified errors
17
+ | "routing"
18
+ | "manifest"
19
+ | "middleware"
20
+ | "loader"
21
+ | "handler"
22
+ | "rendering"
23
+ | "action"
24
+ | "revalidation"
25
+ | "cache"
26
+ | "prerender"
27
+ | "static"
28
+ | "origin"
29
+ | "unknown";
30
30
 
31
31
  /**
32
32
  * Comprehensive context passed to onError callback
@@ -59,103 +59,43 @@ export type ErrorPhase =
59
59
  * ```
60
60
  */
61
61
  export interface OnErrorContext<TEnv = any> {
62
- /**
63
- * The error that occurred
64
- */
65
62
  error: Error;
66
-
67
- /**
68
- * Phase where the error occurred
69
- */
70
63
  phase: ErrorPhase;
71
-
72
- /**
73
- * The original request
74
- */
75
64
  request: Request;
76
-
77
- /**
78
- * Parsed URL from the request
79
- */
80
65
  url: URL;
81
-
82
- /**
83
- * Request pathname
84
- */
85
66
  pathname: string;
86
-
87
- /**
88
- * HTTP method
89
- */
90
67
  method: string;
91
-
92
- /**
93
- * Matched route key (if available)
94
- * e.g., "shop.products.detail"
95
- */
68
+ /** Matched route key (if available) e.g., "shop.products.detail" */
96
69
  routeKey?: string;
97
-
98
- /**
99
- * Route params (if available)
100
- * e.g., { slug: "headphones" }
101
- */
70
+ /** Route params (if available) e.g., { slug: "headphones" } */
102
71
  params?: Record<string, string>;
103
-
104
- /**
105
- * Segment ID where error occurred (if available)
106
- * e.g., "M1L0" for a layout, "M1R0" for a route
107
- */
72
+ /** Segment ID where error occurred (if available) e.g., "M1L0" for a layout, "M1R0" for a route */
108
73
  segmentId?: string;
109
-
110
- /**
111
- * Segment type where error occurred (if available)
112
- */
74
+ /** Segment type where error occurred (if available) */
113
75
  segmentType?: "layout" | "route" | "parallel" | "loader" | "middleware";
114
-
115
- /**
116
- * Loader name (if error occurred in a loader)
117
- */
76
+ /** Loader name (if error occurred in a loader) */
118
77
  loaderName?: string;
119
-
120
- /**
121
- * Middleware name/id (if error occurred in middleware)
122
- */
78
+ /** Middleware name/id (if error occurred in middleware) */
123
79
  middlewareId?: string;
124
-
125
- /**
126
- * Action ID (if error occurred during server action)
127
- * e.g., "src/actions.ts#addToCart"
128
- */
80
+ /** Action ID (if error occurred during server action) e.g., "src/actions.ts#addToCart" */
129
81
  actionId?: string;
130
-
131
- /**
132
- * Environment/bindings (platform context)
133
- */
82
+ /** Environment/bindings (platform context) */
134
83
  env?: TEnv;
135
-
136
- /**
137
- * Duration from request start to error (milliseconds)
138
- */
84
+ /** Duration from request start to error (milliseconds) */
139
85
  duration?: number;
140
-
141
- /**
142
- * Whether this is a partial/navigation request
143
- */
86
+ /** Whether this is a partial/navigation request */
144
87
  isPartial?: boolean;
145
-
146
- /**
147
- * Whether an error boundary caught the error
148
- * If true, the error was handled and a fallback UI was rendered
149
- */
88
+ /** Whether an error boundary caught the error */
150
89
  handledByBoundary?: boolean;
151
-
152
- /**
153
- * Stack trace (if available)
154
- */
90
+ /** Stack trace (if available) */
155
91
  stack?: string;
156
92
 
157
93
  /**
158
- * Additional metadata specific to the error phase
94
+ * Additional metadata specific to the error phase. For the `cache` phase,
95
+ * `metadata.category` is a `CacheErrorCategory` (exported from
96
+ * `@rangojs/router/cache`) identifying the failure kind, e.g. `cache-read`
97
+ * (transient outage, degraded to a miss) vs `cache-corrupt` (faulty entry
98
+ * self-healed) vs `cache-invalidate` (a failed background revalidateTag).
159
99
  */
160
100
  metadata?: Record<string, unknown>;
161
101
  }
@@ -7,7 +7,7 @@
7
7
  * ```typescript
8
8
  * // In env.ts or env.d.ts
9
9
  * declare global {
10
- * namespace RSCRouter {
10
+ * namespace Rango {
11
11
  * interface Env extends AppBindings {}
12
12
  * interface Vars extends AppVariables {}
13
13
  * }
@@ -18,39 +18,41 @@
18
18
  * ```
19
19
  */
20
20
  declare global {
21
- namespace RSCRouter {
21
+ namespace Rango {
22
22
  // eslint-disable-next-line @typescript-eslint/no-empty-interface
23
- interface Env {
24
- // Empty by default - users augment with their bindings (e.g., { DB: D1Database })
25
- }
23
+ interface Env {}
26
24
 
27
25
  // eslint-disable-next-line @typescript-eslint/no-empty-interface
28
- interface Vars {
29
- // Empty by default - users augment with their variables (e.g., { user?: User })
30
- }
26
+ interface Vars {}
31
27
 
32
28
  // eslint-disable-next-line @typescript-eslint/no-empty-interface
33
- interface RegisteredRoutes {
34
- // Empty by default - users augment with their merged route maps for type-safe href()
35
- // Values are string (pattern) for RSC routes, or { path: string; response: T } for response routes
36
- }
29
+ interface RegisteredRoutes {}
37
30
 
38
31
  // eslint-disable-next-line @typescript-eslint/no-empty-interface
39
- interface GeneratedRouteMap {
40
- // Empty by default - populated by generated named-routes.gen.ts
41
- // Maps route names to URL pattern strings for Handler<"routeName"> support
42
- }
32
+ interface GeneratedRouteMap {}
43
33
  }
44
34
  }
45
35
 
46
36
  /**
47
- * Get registered routes or fallback to generic Record<string, string>
48
- * When RSCRouter.RegisteredRoutes is augmented, provides autocomplete for route names
49
- * When not augmented, allows any string (no autocomplete)
37
+ * Route map for path-validation surfaces (`href`, `ValidPaths`, `PathResponse`).
38
+ *
39
+ * Resolution order:
40
+ * 1. `RegisteredRoutes` — manual `extends typeof router.routeMap`; richest map,
41
+ * the only one carrying response-route payload metadata.
42
+ * 2. `GeneratedRouteMap` — auto-wired by `router.named-routes.gen.ts`; path +
43
+ * search only. Lets `rango generate` alone enable `href()`/`ValidPaths` path
44
+ * checking without a manual `RegisteredRoutes` declaration.
45
+ * 3. `Record<string, string>` — permissive fallback when nothing is registered.
46
+ *
47
+ * Referencing `GeneratedRouteMap` here is cycle-safe: it is declared in the
48
+ * standalone gen file with no imports, unlike `RegisteredRoutes extends typeof
49
+ * router.routeMap`.
50
50
  */
51
- export type GetRegisteredRoutes = keyof RSCRouter.RegisteredRoutes extends never
52
- ? Record<string, string>
53
- : RSCRouter.RegisteredRoutes;
51
+ export type GetRegisteredRoutes = keyof Rango.RegisteredRoutes extends never
52
+ ? keyof Rango.GeneratedRouteMap extends never
53
+ ? Record<string, string>
54
+ : Rango.GeneratedRouteMap
55
+ : Rango.RegisteredRoutes;
54
56
 
55
57
  /**
56
58
  * Default route map for reverse() surfaces.
@@ -58,12 +60,11 @@ export type GetRegisteredRoutes = keyof RSCRouter.RegisteredRoutes extends never
58
60
  * cycles, but falls back to RegisteredRoutes for manual augmentation and then to
59
61
  * a permissive record when no route types are available.
60
62
  */
61
- export type DefaultReverseRouteMap =
62
- keyof RSCRouter.GeneratedRouteMap extends never
63
- ? keyof RSCRouter.RegisteredRoutes extends never
64
- ? Record<string, string>
65
- : RSCRouter.RegisteredRoutes
66
- : RSCRouter.GeneratedRouteMap;
63
+ export type DefaultReverseRouteMap = keyof Rango.GeneratedRouteMap extends never
64
+ ? keyof Rango.RegisteredRoutes extends never
65
+ ? Record<string, string>
66
+ : Rango.RegisteredRoutes
67
+ : Rango.GeneratedRouteMap;
67
68
 
68
69
  /**
69
70
  * Default route map for Handler type.
@@ -71,30 +72,42 @@ export type DefaultReverseRouteMap =
71
72
  * circular dependencies: router.tsx -> urls.tsx -> handler.tsx -> RegisteredRoutes -> router.tsx.
72
73
  * GeneratedRouteMap is declared in a standalone gen file with no imports.
73
74
  */
74
- export type DefaultHandlerRouteMap =
75
- keyof RSCRouter.GeneratedRouteMap extends never
76
- ? {}
77
- : RSCRouter.GeneratedRouteMap;
75
+ export type DefaultHandlerRouteMap = keyof Rango.GeneratedRouteMap extends never
76
+ ? {}
77
+ : Rango.GeneratedRouteMap;
78
78
 
79
79
  /**
80
- * Default environment type - uses global augmentation if available, any otherwise
80
+ * Default environment type - uses global augmentation if available.
81
+ *
82
+ * Falls back to `unknown` (not `any`) when `Rango.Env` is not augmented, so
83
+ * an app that forgets to register its bindings gets a compile error on
84
+ * `ctx.env.SOMETHING` instead of silently losing all env type-checking. Augment
85
+ * `Rango.Env` to type `ctx.env`.
81
86
  */
82
- export type DefaultEnv = keyof RSCRouter.Env extends never
83
- ? any
84
- : RSCRouter.Env;
87
+ export type DefaultEnv = keyof Rango.Env extends never ? unknown : Rango.Env;
85
88
 
86
89
  /**
87
- * Default variables type - uses global augmentation if available, Record<string, any> otherwise
90
+ * Variables type backing the string-key `ctx.get` / `ctx.set` overloads.
91
+ *
92
+ * Uses `Rango.Vars` augmentation when present; otherwise falls back to
93
+ * `Record<string, any>` so an un-augmented app can use string-key vars with
94
+ * zero config -- at the cost of a typo'd key being silently `any`.
95
+ *
96
+ * This `any` fallback is deliberate (see #561) and is an intentional asymmetry
97
+ * with `DefaultEnv` above, which falls back to `unknown`: env bindings are
98
+ * platform-critical and should be registered, so a forgotten binding is made a
99
+ * compile error; vars are ad-hoc and middleware-set, so the zero-config path
100
+ * wins. Augment `Rango.Vars` for type-safe keys.
88
101
  */
89
- export type DefaultVars = keyof RSCRouter.Vars extends never
102
+ export type DefaultVars = keyof Rango.Vars extends never
90
103
  ? Record<string, any>
91
- : RSCRouter.Vars;
104
+ : Rango.Vars;
92
105
 
93
106
  /**
94
107
  * Default route name type for public `routeName` on contexts.
95
108
  * When GeneratedRouteMap is augmented, narrows to the known route names.
96
109
  * Otherwise falls back to `string` for untyped usage.
97
110
  */
98
- export type DefaultRouteName = keyof RSCRouter.GeneratedRouteMap extends never
111
+ export type DefaultRouteName = keyof Rango.GeneratedRouteMap extends never
99
112
  ? string
100
- : keyof RSCRouter.GeneratedRouteMap & string;
113
+ : keyof Rango.GeneratedRouteMap & string;