@rangojs/router 0.0.0-experimental.b02a2fec → 0.0.0-experimental.bf1b128c

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 (103) hide show
  1. package/README.md +50 -20
  2. package/dist/vite/index.js +1338 -462
  3. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  4. package/package.json +7 -5
  5. package/skills/breadcrumbs/SKILL.md +3 -1
  6. package/skills/handler-use/SKILL.md +362 -0
  7. package/skills/hooks/SKILL.md +28 -20
  8. package/skills/intercept/SKILL.md +20 -0
  9. package/skills/layout/SKILL.md +22 -0
  10. package/skills/links/SKILL.md +88 -16
  11. package/skills/loader/SKILL.md +66 -2
  12. package/skills/middleware/SKILL.md +32 -3
  13. package/skills/migrate-nextjs/SKILL.md +560 -0
  14. package/skills/migrate-react-router/SKILL.md +765 -0
  15. package/skills/parallel/SKILL.md +66 -0
  16. package/skills/rango/SKILL.md +24 -22
  17. package/skills/response-routes/SKILL.md +8 -0
  18. package/skills/route/SKILL.md +24 -0
  19. package/skills/streams-and-websockets/SKILL.md +283 -0
  20. package/skills/typesafety/SKILL.md +3 -1
  21. package/src/browser/app-shell.ts +52 -0
  22. package/src/browser/navigation-bridge.ts +71 -5
  23. package/src/browser/navigation-client.ts +64 -13
  24. package/src/browser/navigation-store.ts +25 -1
  25. package/src/browser/partial-update.ts +34 -3
  26. package/src/browser/prefetch/cache.ts +129 -21
  27. package/src/browser/prefetch/fetch.ts +148 -16
  28. package/src/browser/prefetch/queue.ts +36 -5
  29. package/src/browser/rango-state.ts +53 -13
  30. package/src/browser/react/Link.tsx +30 -2
  31. package/src/browser/react/NavigationProvider.tsx +50 -11
  32. package/src/browser/react/use-navigation.ts +22 -2
  33. package/src/browser/react/use-params.ts +11 -1
  34. package/src/browser/react/use-router.ts +8 -1
  35. package/src/browser/rsc-router.tsx +34 -6
  36. package/src/browser/segment-reconciler.ts +36 -14
  37. package/src/browser/types.ts +13 -0
  38. package/src/build/route-trie.ts +50 -24
  39. package/src/cache/cf/cf-cache-store.ts +5 -7
  40. package/src/client.tsx +82 -174
  41. package/src/index.rsc.ts +3 -0
  42. package/src/index.ts +40 -9
  43. package/src/outlet-context.ts +1 -1
  44. package/src/response-utils.ts +28 -0
  45. package/src/reverse.ts +7 -3
  46. package/src/route-definition/dsl-helpers.ts +175 -23
  47. package/src/route-definition/helpers-types.ts +63 -14
  48. package/src/route-definition/resolve-handler-use.ts +6 -0
  49. package/src/route-types.ts +7 -0
  50. package/src/router/handler-context.ts +24 -4
  51. package/src/router/lazy-includes.ts +6 -6
  52. package/src/router/loader-resolution.ts +3 -0
  53. package/src/router/manifest.ts +22 -13
  54. package/src/router/match-api.ts +3 -3
  55. package/src/router/middleware-types.ts +2 -22
  56. package/src/router/middleware.ts +54 -7
  57. package/src/router/pattern-matching.ts +60 -9
  58. package/src/router/revalidation.ts +15 -1
  59. package/src/router/segment-resolution/revalidation.ts +63 -58
  60. package/src/router/trie-matching.ts +10 -4
  61. package/src/router/url-params.ts +49 -0
  62. package/src/router.ts +1 -2
  63. package/src/rsc/handler.ts +8 -4
  64. package/src/rsc/helpers.ts +69 -41
  65. package/src/rsc/progressive-enhancement.ts +2 -0
  66. package/src/rsc/response-route-handler.ts +14 -1
  67. package/src/rsc/rsc-rendering.ts +7 -0
  68. package/src/rsc/server-action.ts +2 -0
  69. package/src/segment-content-promise.ts +67 -0
  70. package/src/segment-loader-promise.ts +122 -0
  71. package/src/segment-system.tsx +11 -61
  72. package/src/server/context.ts +26 -3
  73. package/src/server/request-context.ts +10 -42
  74. package/src/types/handler-context.ts +12 -39
  75. package/src/types/loader-types.ts +5 -6
  76. package/src/types/request-scope.ts +126 -0
  77. package/src/types/route-entry.ts +11 -0
  78. package/src/types/segments.ts +0 -1
  79. package/src/urls/include-helper.ts +24 -14
  80. package/src/urls/path-helper-types.ts +30 -4
  81. package/src/urls/response-types.ts +2 -10
  82. package/src/vite/debug.ts +184 -0
  83. package/src/vite/discovery/discover-routers.ts +31 -3
  84. package/src/vite/discovery/gate-state.ts +171 -0
  85. package/src/vite/discovery/prerender-collection.ts +48 -1
  86. package/src/vite/discovery/self-gen-tracking.ts +27 -1
  87. package/src/vite/plugins/cjs-to-esm.ts +5 -0
  88. package/src/vite/plugins/client-ref-dedup.ts +16 -0
  89. package/src/vite/plugins/client-ref-hashing.ts +16 -4
  90. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  91. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  92. package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
  93. package/src/vite/plugins/expose-action-id.ts +52 -28
  94. package/src/vite/plugins/expose-ids/router-transform.ts +20 -3
  95. package/src/vite/plugins/expose-internal-ids.ts +516 -486
  96. package/src/vite/plugins/performance-tracks.ts +17 -9
  97. package/src/vite/plugins/use-cache-transform.ts +56 -43
  98. package/src/vite/plugins/version-injector.ts +37 -11
  99. package/src/vite/rango.ts +49 -14
  100. package/src/vite/router-discovery.ts +558 -53
  101. package/src/vite/utils/banner.ts +1 -1
  102. package/src/vite/utils/package-resolution.ts +41 -1
  103. package/src/vite/utils/prerender-utils.ts +20 -6
package/README.md CHANGED
@@ -161,13 +161,18 @@ const urlpatterns = urls(({ path }) => [
161
161
  ]);
162
162
  ```
163
163
 
164
- Use `reverse()` as the default way to link to routes:
164
+ Use `ctx.reverse()` from handler context as the default way to link to routes from server code:
165
165
 
166
166
  ```tsx
167
- router.reverse("product", { slug: "widget" }); // "/product/widget"
168
- router.reverse("search", undefined, { q: "rsc" }); // "/search?q=rsc"
167
+ const ProductPage: Handler<"product"> = (ctx) => {
168
+ const url = ctx.reverse("product", { slug: "widget" }); // "/product/widget"
169
+ const searchUrl = ctx.reverse("search", undefined, { q: "rsc" }); // "/search?q=rsc"
170
+ return <Link to={url}>Widget</Link>;
171
+ };
169
172
  ```
170
173
 
174
+ `router.reverse()` (exported from the router module) is the same function without a handler context, useful in scripts or tests. In request code, prefer `ctx.reverse()` — it auto-fills mount params from the current match.
175
+
171
176
  ### Composable URL Modules
172
177
 
173
178
  Local route names compose cleanly with `include(..., { name })`:
@@ -479,39 +484,64 @@ const urlpatterns = urls(({ path, loader }) => [
479
484
 
480
485
  ## Navigation & Links
481
486
 
482
- ### Named Routes with `reverse()` (Server Components)
487
+ ### Named Routes with `ctx.reverse()` (Server)
483
488
 
484
- In server components, use `reverse()` to generate URLs by route name:
489
+ In server components and handlers, use `ctx.reverse()` to generate URLs by route name. This is the default — it is typed, auto-fills mount params from the current match, and resolves both local (`.name`) and absolute (`name.sub`) names:
485
490
 
486
491
  ```tsx
487
492
  import { Link } from "@rangojs/router/client";
493
+ import type { Handler } from "@rangojs/router";
494
+
495
+ const BlogPostPage: Handler<"blogPost"> = (ctx) => {
496
+ const backUrl = ctx.reverse("blog");
497
+ return <Link to={backUrl}>Back to blog</Link>;
498
+ };
499
+ ```
500
+
501
+ `reverse()` is type-safe — route names and required params are checked at compile time. Included routes use dotted names: `ctx.reverse("api.health")`.
502
+
503
+ For scripts, tests, or other code without a handler context, import the router-level `reverse`:
504
+
505
+ ```tsx
488
506
  import { reverse } from "./router";
507
+ reverse("blogPost", { slug: "my-post" });
508
+ ```
509
+
510
+ ### Client Components
511
+
512
+ **`reverse()` is server-only.** It depends on the route manifest and handler context — neither is available in the browser bundle. Client components receive URLs as props, loader data, or server-action return values:
513
+
514
+ ```tsx
515
+ // server
516
+ function BlogIndex(ctx: HandlerContext) {
517
+ return (
518
+ <Nav
519
+ home={ctx.reverse("home")}
520
+ post={ctx.reverse("blogPost", { slug: "my-post" })}
521
+ />
522
+ );
523
+ }
524
+ ```
525
+
526
+ ```tsx
527
+ "use client";
528
+ import { Link } from "@rangojs/router/client";
489
529
 
490
- function BlogIndex() {
530
+ export function Nav({ home, post }: { home: string; post: string }) {
491
531
  return (
492
532
  <nav>
493
- <Link to={reverse("home")}>Home</Link>
494
- <Link to={reverse("blogPost", { slug: "my-post" })}>My Post</Link>
495
- <Link to={reverse("about")}>About</Link>
533
+ <Link to={home}>Home</Link>
534
+ <Link to={post}>My Post</Link>
496
535
  </nav>
497
536
  );
498
537
  }
499
538
  ```
500
539
 
501
- `reverse()` is type-safe route names and required params are checked at compile time. Included routes use dotted names: `reverse("api.health")`.
502
-
503
- Handlers also have `ctx.reverse()` directly on the context:
504
-
505
- ```tsx
506
- const BlogPostPage: Handler<"blogPost"> = (ctx) => {
507
- const backUrl = ctx.reverse("blog");
508
- return <Link to={backUrl}>Back to blog</Link>;
509
- };
510
- ```
540
+ For client-side navigation to static paths (no named-route lookup), use `href()` see below. For URLs tied to named routes, always generate on the server and pass the string in.
511
541
 
512
542
  ### `href()` for Path Validation (Client Components)
513
543
 
514
- In client components, use `href()` for compile-time path validation:
544
+ In client components, use `href()` for compile-time path validation on static path strings:
515
545
 
516
546
  ```tsx
517
547
  "use client";