@rangojs/router 0.0.0-experimental.16 → 0.0.0-experimental.18.d80c2f4.20260228

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 (242) hide show
  1. package/README.md +63 -35
  2. package/dist/bin/rango.js +945 -160
  3. package/dist/vite/index.js +3132 -1812
  4. package/package.json +60 -52
  5. package/skills/cache-guide/SKILL.md +258 -0
  6. package/skills/caching/SKILL.md +42 -13
  7. package/skills/composability/SKILL.md +172 -0
  8. package/skills/debug-manifest/SKILL.md +12 -8
  9. package/skills/document-cache/SKILL.md +8 -6
  10. package/skills/fonts/SKILL.md +6 -4
  11. package/skills/hooks/SKILL.md +132 -47
  12. package/skills/intercept/SKILL.md +48 -4
  13. package/skills/layout/SKILL.md +40 -3
  14. package/skills/links/SKILL.md +62 -15
  15. package/skills/loader/SKILL.md +7 -8
  16. package/skills/middleware/SKILL.md +62 -5
  17. package/skills/mime-routes/SKILL.md +14 -10
  18. package/skills/parallel/SKILL.md +22 -0
  19. package/skills/prerender/SKILL.md +191 -23
  20. package/skills/rango/SKILL.md +28 -26
  21. package/skills/response-routes/SKILL.md +129 -77
  22. package/skills/route/SKILL.md +149 -15
  23. package/skills/router-setup/SKILL.md +20 -15
  24. package/skills/testing/SKILL.md +37 -37
  25. package/skills/theme/SKILL.md +4 -4
  26. package/skills/typesafety/SKILL.md +92 -31
  27. package/skills/use-cache/SKILL.md +310 -0
  28. package/src/__internal.ts +9 -3
  29. package/src/bin/rango.ts +228 -19
  30. package/src/browser/action-response-classifier.ts +2 -7
  31. package/src/browser/event-controller.ts +25 -16
  32. package/src/browser/intercept-utils.ts +5 -9
  33. package/src/browser/link-interceptor.ts +1 -1
  34. package/src/browser/merge-segment-loaders.ts +5 -5
  35. package/src/browser/navigation-bridge.ts +137 -43
  36. package/src/browser/navigation-client.ts +12 -1
  37. package/src/browser/navigation-store.ts +35 -23
  38. package/src/browser/partial-update.ts +110 -23
  39. package/src/browser/react/Link.tsx +26 -11
  40. package/src/browser/react/NavigationProvider.tsx +16 -11
  41. package/src/browser/react/index.ts +6 -6
  42. package/src/browser/react/location-state-shared.ts +75 -51
  43. package/src/browser/react/location-state.ts +54 -11
  44. package/src/browser/react/mount-context.ts +6 -1
  45. package/src/browser/react/use-action.ts +6 -6
  46. package/src/browser/react/use-handle.ts +8 -6
  47. package/src/browser/react/use-link-status.ts +6 -5
  48. package/src/browser/react/use-navigation.ts +1 -2
  49. package/src/browser/react/use-segments.ts +6 -5
  50. package/src/browser/rsc-router.tsx +58 -15
  51. package/src/browser/scroll-restoration.ts +15 -8
  52. package/src/browser/server-action-bridge.ts +77 -10
  53. package/src/browser/shallow.ts +6 -1
  54. package/src/browser/types.ts +26 -12
  55. package/src/build/generate-manifest.ts +29 -12
  56. package/src/build/generate-route-types.ts +32 -848
  57. package/src/build/index.ts +1 -5
  58. package/src/build/route-trie.ts +5 -2
  59. package/src/build/route-types/ast-helpers.ts +25 -0
  60. package/src/build/route-types/ast-route-extraction.ts +98 -0
  61. package/src/build/route-types/codegen.ts +93 -0
  62. package/src/build/route-types/include-resolution.ts +398 -0
  63. package/src/build/route-types/param-extraction.ts +48 -0
  64. package/src/build/route-types/per-module-writer.ts +116 -0
  65. package/src/build/route-types/router-processing.ts +317 -0
  66. package/src/build/route-types/scan-filter.ts +78 -0
  67. package/src/build/runtime-discovery.ts +219 -0
  68. package/src/cache/cache-runtime.ts +325 -0
  69. package/src/cache/cache-scope.ts +62 -247
  70. package/src/cache/cf/cf-cache-store.ts +109 -2
  71. package/src/cache/cf/index.ts +8 -2
  72. package/src/cache/document-cache.ts +12 -7
  73. package/src/cache/handle-snapshot.ts +41 -0
  74. package/src/cache/memory-segment-store.ts +167 -5
  75. package/src/cache/memory-store.ts +2 -2
  76. package/src/cache/profile-registry.ts +38 -0
  77. package/src/cache/segment-codec.ts +233 -0
  78. package/src/cache/taint.ts +71 -0
  79. package/src/cache/types.ts +72 -8
  80. package/src/client.rsc.tsx +1 -0
  81. package/src/client.tsx +20 -45
  82. package/src/component-utils.ts +4 -4
  83. package/src/components/DefaultDocument.tsx +5 -1
  84. package/src/context-var.ts +86 -0
  85. package/src/debug.ts +17 -7
  86. package/src/errors.ts +63 -6
  87. package/src/fetchable-loader-action.ts +30 -0
  88. package/src/handle.ts +11 -6
  89. package/src/handles/MetaTags.tsx +68 -18
  90. package/src/handles/meta.ts +30 -13
  91. package/src/host/cookie-handler.ts +12 -12
  92. package/src/host/errors.ts +8 -8
  93. package/src/host/index.ts +5 -5
  94. package/src/host/pattern-matcher.ts +27 -27
  95. package/src/host/router.ts +31 -26
  96. package/src/host/testing.ts +8 -8
  97. package/src/host/types.ts +2 -2
  98. package/src/host/utils.ts +1 -1
  99. package/src/href-client.ts +62 -44
  100. package/src/index.rsc.ts +46 -6
  101. package/src/index.ts +82 -31
  102. package/src/internal-debug.ts +9 -3
  103. package/src/loader-action-shared.ts +104 -0
  104. package/src/loader.rsc.ts +23 -77
  105. package/src/loader.ts +18 -9
  106. package/src/network-error-thrower.tsx +3 -1
  107. package/src/outlet-provider.tsx +45 -0
  108. package/src/prerender/store.ts +69 -7
  109. package/src/prerender.ts +264 -15
  110. package/src/reverse.ts +133 -117
  111. package/src/root-error-boundary.tsx +11 -3
  112. package/src/route-content-wrapper.tsx +7 -4
  113. package/src/route-definition/dsl-helpers.ts +931 -0
  114. package/src/route-definition/helper-factories.ts +200 -0
  115. package/src/route-definition/helpers-types.ts +430 -0
  116. package/src/route-definition/index.ts +55 -0
  117. package/src/route-definition/redirect.ts +81 -0
  118. package/src/route-definition/route-function.ts +119 -0
  119. package/src/route-definition.ts +1 -1481
  120. package/src/route-map-builder.ts +44 -132
  121. package/src/route-types.ts +34 -6
  122. package/src/router/content-negotiation.ts +116 -0
  123. package/src/router/debug-manifest.ts +59 -0
  124. package/src/router/error-handling.ts +7 -7
  125. package/src/router/find-match.ts +158 -0
  126. package/src/router/handler-context.ts +193 -92
  127. package/src/router/intercept-resolution.ts +3 -0
  128. package/src/router/lazy-includes.ts +230 -0
  129. package/src/router/loader-resolution.ts +46 -37
  130. package/src/router/logging.ts +8 -2
  131. package/src/router/manifest.ts +20 -16
  132. package/src/router/match-api.ts +8 -6
  133. package/src/router/match-handlers.ts +266 -0
  134. package/src/router/match-middleware/background-revalidation.ts +6 -6
  135. package/src/router/match-middleware/cache-lookup.ts +176 -48
  136. package/src/router/match-middleware/cache-store.ts +25 -10
  137. package/src/router/match-middleware/intercept-resolution.ts +42 -21
  138. package/src/router/match-middleware/segment-resolution.ts +16 -8
  139. package/src/router/match-pipelines.ts +4 -4
  140. package/src/router/match-result.ts +7 -5
  141. package/src/router/metrics.ts +3 -3
  142. package/src/router/middleware-cookies.ts +55 -0
  143. package/src/router/middleware-types.ts +210 -0
  144. package/src/router/middleware.ts +86 -255
  145. package/src/router/pattern-matching.ts +66 -16
  146. package/src/router/prerender-match.ts +360 -0
  147. package/src/router/preview-match.ts +161 -0
  148. package/src/router/revalidation.ts +18 -6
  149. package/src/router/router-context.ts +21 -21
  150. package/src/router/router-interfaces.ts +315 -0
  151. package/src/router/router-options.ts +361 -0
  152. package/src/router/router-registry.ts +21 -0
  153. package/src/router/segment-resolution/fresh.ts +645 -0
  154. package/src/router/segment-resolution/loader-cache.ts +194 -0
  155. package/src/router/segment-resolution/revalidation.ts +1118 -0
  156. package/src/router/segment-resolution/static-store.ts +67 -0
  157. package/src/router/segment-resolution.ts +23 -1384
  158. package/src/router/segment-wrappers.ts +286 -0
  159. package/src/router/trie-matching.ts +56 -23
  160. package/src/router/types.ts +8 -8
  161. package/src/router.ts +314 -2269
  162. package/src/rsc/handler-context.ts +34 -0
  163. package/src/rsc/handler.ts +367 -840
  164. package/src/rsc/helpers.ts +1 -1
  165. package/src/rsc/loader-fetch.ts +160 -0
  166. package/src/rsc/manifest-init.ts +85 -0
  167. package/src/rsc/progressive-enhancement.ts +153 -0
  168. package/src/rsc/response-error.ts +37 -0
  169. package/src/rsc/rsc-rendering.ts +224 -0
  170. package/src/rsc/server-action.ts +237 -0
  171. package/src/rsc/types.ts +12 -8
  172. package/src/search-params.ts +29 -32
  173. package/src/segment-system.tsx +24 -12
  174. package/src/server/context.ts +83 -38
  175. package/src/server/handle-store.ts +10 -3
  176. package/src/server/loader-registry.ts +3 -3
  177. package/src/server/request-context.ts +114 -32
  178. package/src/server.ts +10 -9
  179. package/src/ssr/index.tsx +39 -13
  180. package/src/static-handler.ts +15 -4
  181. package/src/theme/ThemeProvider.tsx +15 -14
  182. package/src/theme/ThemeScript.tsx +5 -5
  183. package/src/theme/constants.ts +5 -2
  184. package/src/theme/index.ts +5 -1
  185. package/src/theme/theme-context.ts +3 -2
  186. package/src/theme/theme-script.ts +19 -17
  187. package/src/types/boundaries.ts +158 -0
  188. package/src/types/cache-types.ts +193 -0
  189. package/src/types/error-types.ts +189 -0
  190. package/src/types/global-namespace.ts +71 -0
  191. package/src/types/handler-context.ts +608 -0
  192. package/src/types/index.ts +91 -0
  193. package/src/types/loader-types.ts +200 -0
  194. package/src/types/route-config.ts +189 -0
  195. package/src/types/route-entry.ts +74 -0
  196. package/src/types/segments.ts +153 -0
  197. package/src/types.ts +1 -1795
  198. package/src/urls/include-helper.ts +156 -0
  199. package/src/urls/index.ts +52 -0
  200. package/src/urls/path-helper-types.ts +321 -0
  201. package/src/urls/path-helper.ts +314 -0
  202. package/src/urls/pattern-types.ts +75 -0
  203. package/src/urls/response-types.ts +85 -0
  204. package/src/urls/type-extraction.ts +364 -0
  205. package/src/urls/urls-function.ts +98 -0
  206. package/src/urls.ts +1 -1352
  207. package/src/use-loader.tsx +55 -19
  208. package/src/vite/discovery/bundle-postprocess.ts +204 -0
  209. package/src/vite/discovery/discover-routers.ts +318 -0
  210. package/src/vite/discovery/prerender-collection.ts +368 -0
  211. package/src/vite/discovery/route-types-writer.ts +258 -0
  212. package/src/vite/discovery/self-gen-tracking.ts +47 -0
  213. package/src/vite/discovery/state.ts +110 -0
  214. package/src/vite/discovery/virtual-module-codegen.ts +200 -0
  215. package/src/vite/index.ts +57 -2368
  216. package/src/vite/plugin-types.ts +131 -0
  217. package/src/vite/plugins/cjs-to-esm.ts +93 -0
  218. package/src/vite/plugins/client-ref-hashing.ts +105 -0
  219. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -45
  220. package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +8 -43
  221. package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
  222. package/src/vite/plugins/expose-ids/handler-transform.ts +179 -0
  223. package/src/vite/plugins/expose-ids/loader-transform.ts +92 -0
  224. package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
  225. package/src/vite/plugins/expose-ids/types.ts +45 -0
  226. package/src/vite/plugins/expose-internal-ids.ts +568 -0
  227. package/src/vite/plugins/use-cache-transform.ts +235 -0
  228. package/src/vite/plugins/version-injector.ts +83 -0
  229. package/src/vite/plugins/version-plugin.ts +84 -0
  230. package/src/vite/{virtual-entries.ts → plugins/virtual-entries.ts} +23 -14
  231. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  232. package/src/vite/rango.ts +485 -0
  233. package/src/vite/router-discovery.ts +712 -0
  234. package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +181 -9
  235. package/src/vite/utils/banner.ts +36 -0
  236. package/src/vite/utils/bundle-analysis.ts +137 -0
  237. package/src/vite/utils/manifest-utils.ts +70 -0
  238. package/src/vite/{package-resolution.ts → utils/package-resolution.ts} +1 -1
  239. package/src/vite/utils/prerender-utils.ts +108 -0
  240. package/src/vite/utils/shared-utils.ts +159 -0
  241. package/src/vite/expose-internal-ids.ts +0 -1167
  242. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
package/README.md CHANGED
@@ -47,10 +47,7 @@ import { defineConfig } from "vite";
47
47
  import { rango } from "@rangojs/router/vite";
48
48
 
49
49
  export default defineConfig({
50
- plugins: [
51
- react(),
52
- rango({ preset: "cloudflare" }),
53
- ],
50
+ plugins: [react(), rango({ preset: "cloudflare" })],
54
51
  });
55
52
  ```
56
53
 
@@ -69,8 +66,7 @@ const urlpatterns = urls(({ path, layout }) => [
69
66
  ]),
70
67
  ]);
71
68
 
72
- export const router = createRouter({ document: Document })
73
- .routes(urlpatterns);
69
+ export const router = createRouter({ document: Document }).routes(urlpatterns);
74
70
 
75
71
  // Export typed reverse function for URL generation by route name
76
72
  export const reverse = router.reverse;
@@ -138,9 +134,9 @@ const urlpatterns = urls(({ path }) => [
138
134
  }),
139
135
  ]);
140
136
 
141
- // Handler receives typed searchParams
137
+ // Handler receives typed search params via ctx.search
142
138
  const SearchPage: Handler<"search"> = (ctx) => {
143
- const { q, page, sort } = ctx.searchParams;
139
+ const { q, page, sort } = ctx.search;
144
140
  // q: string, page: number | undefined, sort: string | undefined
145
141
  };
146
142
  ```
@@ -234,7 +230,13 @@ import { BlogSidebarLoader } from "./loaders/blog";
234
230
 
235
231
  async function BlogSidebarHandler(ctx: HandlerContext) {
236
232
  const { posts } = await ctx.use(BlogSidebarLoader);
237
- return <ul>{posts.map(p => <li key={p.slug}>{p.title}</li>)}</ul>;
233
+ return (
234
+ <ul>
235
+ {posts.map((p) => (
236
+ <li key={p.slug}>{p.title}</li>
237
+ ))}
238
+ </ul>
239
+ );
238
240
  }
239
241
  ```
240
242
 
@@ -247,7 +249,13 @@ import { BlogSidebarLoader } from "./loaders/blog";
247
249
 
248
250
  function BlogSidebar() {
249
251
  const { posts } = useLoader(BlogSidebarLoader);
250
- return <ul>{posts.map(p => <li key={p.slug}>{p.title}</li>)}</ul>;
252
+ return (
253
+ <ul>
254
+ {posts.map((p) => (
255
+ <li key={p.slug}>{p.title}</li>
256
+ ))}
257
+ </ul>
258
+ );
251
259
  }
252
260
  ```
253
261
 
@@ -305,7 +313,9 @@ function Nav() {
305
313
  return (
306
314
  <nav>
307
315
  <Link to={href("/")}>Home</Link>
308
- <Link to={href("/blog")} prefetch="intent">Blog</Link>
316
+ <Link to={href("/blog")} prefetch="intent">
317
+ Blog
318
+ </Link>
309
319
  <Link to={href("/about")}>About</Link>
310
320
  </nav>
311
321
  );
@@ -379,14 +389,17 @@ Included route names are prefixed with the include name: `reverse("api.health")`
379
389
 
380
390
  ```tsx
381
391
  const urlpatterns = urls(({ path, middleware }) => [
382
- middleware(async (ctx, next) => {
383
- const start = Date.now();
384
- const response = await next();
385
- console.log(`${ctx.request.method} ${ctx.url.pathname} ${Date.now() - start}ms`);
386
- return response;
387
- }, () => [
388
- path("/dashboard", DashboardPage, { name: "dashboard" }),
389
- ]),
392
+ middleware(
393
+ async (ctx, next) => {
394
+ const start = Date.now();
395
+ const response = await next();
396
+ console.log(
397
+ `${ctx.request.method} ${ctx.url.pathname} ${Date.now() - start}ms`,
398
+ );
399
+ return response;
400
+ },
401
+ () => [path("/dashboard", DashboardPage, { name: "dashboard" })],
402
+ ),
390
403
  ]);
391
404
  ```
392
405
 
@@ -407,7 +420,10 @@ const urlpatterns = urls(({ path, cache }) => [
407
420
 
408
421
  ```tsx
409
422
  import { createRouter } from "@rangojs/router";
410
- import { CFCacheStore, createDocumentCacheMiddleware } from "@rangojs/router/cache";
423
+ import {
424
+ CFCacheStore,
425
+ createDocumentCacheMiddleware,
426
+ } from "@rangojs/router/cache";
411
427
 
412
428
  export const router = createRouter({
413
429
  document: Document,
@@ -423,6 +439,7 @@ export const router = createRouter({
423
439
  ```
424
440
 
425
441
  Available cache stores:
442
+
426
443
  - `CFCacheStore` — Cloudflare edge cache (production)
427
444
  - `MemorySegmentCacheStore` — In-memory cache (development/testing)
428
445
 
@@ -443,7 +460,15 @@ export const AboutPage = Static(async () => {
443
460
 
444
461
  export const DocsNav = Static(async () => {
445
462
  const items = await readDocsNavItems();
446
- return <nav>{items.map(i => <a key={i.slug} href={i.slug}>{i.title}</a>)}</nav>;
463
+ return (
464
+ <nav>
465
+ {items.map((i) => (
466
+ <a key={i.slug} href={i.slug}>
467
+ {i.title}
468
+ </a>
469
+ ))}
470
+ </nav>
471
+ );
447
472
  });
448
473
  ```
449
474
 
@@ -457,7 +482,7 @@ import { Prerender } from "@rangojs/router";
457
482
  export const BlogPost = Prerender(
458
483
  async () => {
459
484
  const slugs = await getAllBlogSlugs();
460
- return slugs.map(slug => ({ slug }));
485
+ return slugs.map((slug) => ({ slug }));
461
486
  },
462
487
  async (ctx) => {
463
488
  const post = await getPost(ctx.params.slug);
@@ -474,7 +499,7 @@ import { Prerender } from "@rangojs/router";
474
499
  export const ProductPage = Prerender(
475
500
  async () => {
476
501
  const featured = await db.getFeaturedProducts();
477
- return featured.map(p => ({ id: p.id }));
502
+ return featured.map((p) => ({ id: p.id }));
478
503
  },
479
504
  async (ctx) => {
480
505
  const product = await db.getProduct(ctx.params.id);
@@ -511,8 +536,10 @@ import { useTheme } from "@rangojs/router/theme";
511
536
  function ThemeToggle() {
512
537
  const { theme, setTheme, themes } = useTheme();
513
538
  return (
514
- <select value={theme} onChange={e => setTheme(e.target.value)}>
515
- {themes.map(t => <option key={t}>{t}</option>)}
539
+ <select value={theme} onChange={(e) => setTheme(e.target.value)}>
540
+ {themes.map((t) => (
541
+ <option key={t}>{t}</option>
542
+ ))}
516
543
  </select>
517
544
  );
518
545
  }
@@ -572,6 +599,7 @@ npx rango generate src/urls.tsx src/api/ # mix files and directories
572
599
  ```
573
600
 
574
601
  Auto-detects file type:
602
+
575
603
  - Files with `createRouter` → `*.named-routes.gen.ts` with global route map
576
604
  - Files with `urls()` → `*.gen.ts` with per-module route names, params, and search types
577
605
 
@@ -581,16 +609,16 @@ The Vite plugin automatically generates a `router.named-routes.gen.ts` file that
581
609
 
582
610
  ## Subpath Exports
583
611
 
584
- | Export | Description |
585
- |--------|-------------|
586
- | `@rangojs/router` | Core: `createRouter`, `urls`, `createLoader`, `Handler`, `Prerender`, `Meta` |
587
- | `@rangojs/router/client` | Client: `Link`, `Outlet`, `href`, `useNavigation`, `useLoader`, `MetaTags` |
588
- | `@rangojs/router/cache` | Cache: `CFCacheStore`, `MemorySegmentCacheStore`, `createDocumentCacheMiddleware` |
589
- | `@rangojs/router/theme` | Theme: `useTheme`, `ThemeProvider`, `ThemeScript` |
590
- | `@rangojs/router/host` | Host routing: `createHostRouter`, `defineHosts` |
591
- | `@rangojs/router/vite` | Vite plugin: `rango()` |
592
- | `@rangojs/router/server` | Server utilities |
593
- | `@rangojs/router/build` | Build utilities |
612
+ | Export | Description |
613
+ | ------------------------ | --------------------------------------------------------------------------------- |
614
+ | `@rangojs/router` | Core: `createRouter`, `urls`, `createLoader`, `Handler`, `Prerender`, `Meta` |
615
+ | `@rangojs/router/client` | Client: `Link`, `Outlet`, `href`, `useNavigation`, `useLoader`, `MetaTags` |
616
+ | `@rangojs/router/cache` | Cache: `CFCacheStore`, `MemorySegmentCacheStore`, `createDocumentCacheMiddleware` |
617
+ | `@rangojs/router/theme` | Theme: `useTheme`, `ThemeProvider`, `ThemeScript` |
618
+ | `@rangojs/router/host` | Host routing: `createHostRouter`, `defineHosts` |
619
+ | `@rangojs/router/vite` | Vite plugin: `rango()` |
620
+ | `@rangojs/router/server` | Server utilities |
621
+ | `@rangojs/router/build` | Build utilities |
594
622
 
595
623
  ## Examples
596
624