@rangojs/router 0.0.0-experimental.b000c598 → 0.0.0-experimental.b30bbf02

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 (51) hide show
  1. package/README.md +65 -0
  2. package/dist/vite/index.js +1160 -443
  3. package/package.json +3 -1
  4. package/skills/hooks/SKILL.md +5 -0
  5. package/skills/links/SKILL.md +2 -0
  6. package/skills/loader/SKILL.md +35 -1
  7. package/skills/middleware/SKILL.md +2 -0
  8. package/skills/migrate-nextjs/SKILL.md +3 -1
  9. package/skills/migrate-react-router/SKILL.md +4 -0
  10. package/skills/parallel/SKILL.md +7 -0
  11. package/skills/rango/SKILL.md +1 -0
  12. package/skills/server-actions/SKILL.md +739 -0
  13. package/src/browser/event-controller.ts +44 -4
  14. package/src/browser/react/NavigationProvider.tsx +20 -7
  15. package/src/browser/react/filter-segment-order.ts +51 -7
  16. package/src/browser/react/use-segments.ts +11 -8
  17. package/src/browser/types.ts +6 -0
  18. package/src/route-definition/helpers-types.ts +6 -1
  19. package/src/router/match-api.ts +1 -0
  20. package/src/router/match-handlers.ts +1 -0
  21. package/src/router/match-result.ts +21 -2
  22. package/src/router/middleware.ts +22 -3
  23. package/src/router/pattern-matching.ts +30 -11
  24. package/src/router/revalidation.ts +15 -1
  25. package/src/router/segment-resolution/fresh.ts +8 -0
  26. package/src/router/segment-resolution/revalidation.ts +128 -100
  27. package/src/router/trie-matching.ts +8 -9
  28. package/src/rsc/progressive-enhancement.ts +2 -0
  29. package/src/rsc/rsc-rendering.ts +3 -0
  30. package/src/rsc/server-action.ts +2 -0
  31. package/src/rsc/types.ts +6 -0
  32. package/src/ssr/index.tsx +5 -1
  33. package/src/types/handler-context.ts +10 -5
  34. package/src/types/segments.ts +17 -0
  35. package/src/vite/debug.ts +184 -0
  36. package/src/vite/discovery/discover-routers.ts +31 -3
  37. package/src/vite/discovery/gate-state.ts +171 -0
  38. package/src/vite/discovery/prerender-collection.ts +48 -1
  39. package/src/vite/discovery/self-gen-tracking.ts +27 -1
  40. package/src/vite/plugins/cjs-to-esm.ts +5 -0
  41. package/src/vite/plugins/client-ref-dedup.ts +16 -0
  42. package/src/vite/plugins/client-ref-hashing.ts +16 -4
  43. package/src/vite/plugins/expose-action-id.ts +52 -28
  44. package/src/vite/plugins/expose-ids/router-transform.ts +20 -3
  45. package/src/vite/plugins/expose-internal-ids.ts +516 -486
  46. package/src/vite/plugins/performance-tracks.ts +17 -9
  47. package/src/vite/plugins/use-cache-transform.ts +56 -43
  48. package/src/vite/plugins/version-injector.ts +37 -11
  49. package/src/vite/rango.ts +19 -5
  50. package/src/vite/router-discovery.ts +498 -52
  51. package/src/vite/utils/package-resolution.ts +8 -0
package/README.md CHANGED
@@ -10,6 +10,7 @@ Named-route RSC router with structural composability and type-safe partial rende
10
10
  - **Structural composability** — Attach routes, loaders, middleware, handles, caching, prerendering, and static generation without hiding the route tree
11
11
  - **Composable URL patterns** — Django-style `urls()` DSL with `path`, `layout`, `include`
12
12
  - **Data loaders** — `createLoader()` with automatic streaming and Suspense integration
13
+ - **Server actions** — `"use server"` mutations with `useActionState`, `useOptimistic`, and per-segment + per-loader `revalidate()` rules
13
14
  - **Live data layer** — Pre-render or cache the UI shell while loaders stay live by default at request time
14
15
  - **Layouts & nesting** — Nested layouts with `<Outlet />` and parallel routes
15
16
  - **Segment-level caching** — `cache()` DSL with TTL/SWR and pluggable cache stores
@@ -482,6 +483,70 @@ const urlpatterns = urls(({ path, loader }) => [
482
483
  ]);
483
484
  ```
484
485
 
486
+ ## Server Actions
487
+
488
+ Server actions are React's RSC mutation primitive. Define them with the
489
+ `"use server"` directive — Rango uses standard React 19 hooks
490
+ (`useActionState`, `useFormStatus`, `useOptimistic`) with no framework wrapper.
491
+
492
+ ```tsx
493
+ // app/actions/cart.ts
494
+ "use server";
495
+
496
+ import { getRequestContext } from "@rangojs/router";
497
+
498
+ export async function addToCart(productId: string): Promise<void> {
499
+ const ctx = getRequestContext();
500
+ const userId = ctx.get("user").id;
501
+ await db.cart.insert({ userId, productId });
502
+ }
503
+ ```
504
+
505
+ ```tsx
506
+ // Client form with progressive enhancement + pending state
507
+ "use client";
508
+ import { useActionState } from "react";
509
+ import { saveProfile } from "../actions/profile";
510
+
511
+ export function ProfileForm() {
512
+ const [state, action, pending] = useActionState(saveProfile, null);
513
+ return (
514
+ <form action={action}>
515
+ <input name="name" defaultValue={state?.values?.name} />
516
+ {state?.errors?.name && <p role="alert">{state.errors.name}</p>}
517
+ <button disabled={pending}>{pending ? "Saving…" : "Save"}</button>
518
+ </form>
519
+ );
520
+ }
521
+ ```
522
+
523
+ After an action runs, matched route segments (path/layout/parallel/intercept)
524
+ and loaders can re-render/re-resolve so the UI reflects the new state.
525
+ Attach a `revalidate(({ actionId }) => ...)` rule on any segment or loader
526
+ that owns data the action touched:
527
+
528
+ ```tsx
529
+ urls(({ path, loader, revalidate }) => [
530
+ // Segment-level: re-render the cart page handler after cart actions.
531
+ // Nest loaders that belong to this route inside the same path() so the
532
+ // segment owns its data dependencies.
533
+ path("/cart", CartPage, { name: "cart" }, () => [
534
+ revalidate(
535
+ ({ actionId }) => actionId?.startsWith("src/actions/cart.ts#") ?? false,
536
+ ),
537
+ loader(CartLoader, () => [
538
+ revalidate(
539
+ ({ actionId }) => actionId?.startsWith("src/actions/cart.ts#") ?? false,
540
+ ),
541
+ ]),
542
+ ]),
543
+ ]);
544
+ ```
545
+
546
+ For the full guide — validation with Zod, error handling, file uploads,
547
+ `useOptimistic`, redirects, and progressive enhancement — see the
548
+ `/server-actions` skill.
549
+
485
550
  ## Navigation & Links
486
551
 
487
552
  ### Named Routes with `ctx.reverse()` (Server)