@rangojs/router 0.0.0-experimental.8 → 0.0.0-experimental.8a4d0430
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.
- package/AGENTS.md +5 -0
- package/README.md +884 -4
- package/dist/bin/rango.js +1601 -0
- package/dist/vite/index.js +4474 -867
- package/package.json +60 -51
- package/skills/breadcrumbs/SKILL.md +250 -0
- package/skills/cache-guide/SKILL.md +262 -0
- package/skills/caching/SKILL.md +50 -21
- package/skills/composability/SKILL.md +172 -0
- package/skills/debug-manifest/SKILL.md +12 -8
- package/skills/document-cache/SKILL.md +18 -16
- package/skills/fonts/SKILL.md +167 -0
- package/skills/hooks/SKILL.md +334 -72
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +131 -8
- package/skills/layout/SKILL.md +100 -3
- package/skills/links/SKILL.md +89 -30
- package/skills/loader/SKILL.md +388 -38
- package/skills/middleware/SKILL.md +171 -34
- package/skills/mime-routes/SKILL.md +128 -0
- package/skills/parallel/SKILL.md +78 -1
- package/skills/prerender/SKILL.md +643 -0
- package/skills/rango/SKILL.md +85 -16
- package/skills/response-routes/SKILL.md +411 -0
- package/skills/route/SKILL.md +226 -14
- package/skills/router-setup/SKILL.md +123 -30
- package/skills/tailwind/SKILL.md +129 -0
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +318 -89
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +102 -4
- package/src/bin/rango.ts +321 -0
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -0
- package/src/browser/event-controller.ts +87 -64
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +285 -553
- package/src/browser/navigation-client.ts +124 -71
- package/src/browser/navigation-store.ts +33 -50
- package/src/browser/navigation-transaction.ts +295 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +258 -308
- package/src/browser/prefetch/cache.ts +146 -0
- package/src/browser/prefetch/fetch.ts +135 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +42 -0
- package/src/browser/prefetch/queue.ts +88 -0
- package/src/browser/rango-state.ts +112 -0
- package/src/browser/react/Link.tsx +185 -73
- package/src/browser/react/NavigationProvider.tsx +51 -11
- package/src/browser/react/context.ts +6 -0
- package/src/browser/react/filter-segment-order.ts +11 -0
- package/src/browser/react/index.ts +12 -12
- package/src/browser/react/location-state-shared.ts +95 -53
- package/src/browser/react/location-state.ts +60 -15
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +29 -51
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +32 -79
- package/src/browser/react/use-href.tsx +2 -2
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-navigation.ts +22 -63
- package/src/browser/react/use-params.ts +65 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-router.ts +63 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +80 -97
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +107 -26
- package/src/browser/scroll-restoration.ts +92 -16
- package/src/browser/segment-reconciler.ts +216 -0
- package/src/browser/segment-structure-assert.ts +16 -0
- package/src/browser/server-action-bridge.ts +504 -599
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +109 -47
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +235 -24
- package/src/build/generate-route-types.ts +36 -0
- package/src/build/index.ts +13 -0
- package/src/build/route-trie.ts +265 -0
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +102 -0
- package/src/build/route-types/include-resolution.ts +411 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +128 -0
- package/src/build/route-types/router-processing.ts +469 -0
- package/src/build/route-types/scan-filter.ts +78 -0
- package/src/build/runtime-discovery.ts +231 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +338 -0
- package/src/cache/cache-scope.ts +120 -303
- package/src/cache/cf/cf-cache-store.ts +119 -7
- package/src/cache/cf/index.ts +8 -2
- package/src/cache/document-cache.ts +101 -72
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +0 -15
- package/src/cache/memory-segment-store.ts +191 -13
- package/src/cache/profile-registry.ts +73 -0
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +256 -0
- package/src/cache/taint.ts +98 -0
- package/src/cache/types.ts +72 -122
- package/src/client.rsc.tsx +3 -1
- package/src/client.tsx +106 -126
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +5 -1
- package/src/context-var.ts +86 -0
- package/src/debug.ts +17 -7
- package/src/errors.ts +108 -2
- package/src/handle.ts +15 -29
- package/src/handles/MetaTags.tsx +73 -20
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/handles/meta.ts +30 -13
- package/src/host/cookie-handler.ts +21 -15
- package/src/host/errors.ts +8 -8
- package/src/host/index.ts +4 -7
- package/src/host/pattern-matcher.ts +27 -27
- package/src/host/router.ts +61 -39
- package/src/host/testing.ts +8 -8
- package/src/host/types.ts +15 -7
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +119 -29
- package/src/index.rsc.ts +153 -19
- package/src/index.ts +211 -30
- package/src/internal-debug.ts +11 -0
- package/src/loader.rsc.ts +26 -157
- package/src/loader.ts +27 -10
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +37 -0
- package/src/prerender/store.ts +185 -0
- package/src/prerender.ts +463 -0
- package/src/reverse.ts +330 -0
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +7 -4
- package/src/route-definition/dsl-helpers.ts +934 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +430 -0
- package/src/route-definition/index.ts +52 -0
- package/src/route-definition/redirect.ts +93 -0
- package/src/route-definition.ts +1 -1428
- package/src/route-map-builder.ts +211 -123
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +59 -8
- package/src/router/content-negotiation.ts +116 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +9 -9
- package/src/router/find-match.ts +158 -0
- package/src/router/handler-context.ts +374 -81
- package/src/router/intercept-resolution.ts +395 -0
- package/src/router/lazy-includes.ts +234 -0
- package/src/router/loader-resolution.ts +215 -122
- package/src/router/logging.ts +248 -0
- package/src/router/manifest.ts +148 -35
- package/src/router/match-api.ts +620 -0
- package/src/router/match-context.ts +5 -3
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +80 -93
- package/src/router/match-middleware/cache-lookup.ts +382 -9
- package/src/router/match-middleware/cache-store.ts +51 -22
- package/src/router/match-middleware/intercept-resolution.ts +55 -17
- package/src/router/match-middleware/segment-resolution.ts +24 -6
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +34 -28
- package/src/router/metrics.ts +235 -15
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +222 -0
- package/src/router/middleware.ts +324 -367
- package/src/router/pattern-matching.ts +211 -43
- package/src/router/prerender-match.ts +402 -0
- package/src/router/preview-match.ts +170 -0
- package/src/router/revalidation.ts +137 -38
- package/src/router/router-context.ts +36 -21
- package/src/router/router-interfaces.ts +452 -0
- package/src/router/router-options.ts +592 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +570 -0
- package/src/router/segment-resolution/helpers.ts +263 -0
- package/src/router/segment-resolution/loader-cache.ts +198 -0
- package/src/router/segment-resolution/revalidation.ts +1241 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -0
- package/src/router/segment-wrappers.ts +289 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +300 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +239 -0
- package/src/router/types.ts +77 -3
- package/src/router.ts +692 -4257
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +764 -754
- package/src/rsc/helpers.ts +140 -6
- package/src/rsc/index.ts +0 -20
- package/src/rsc/loader-fetch.ts +209 -0
- package/src/rsc/manifest-init.ts +86 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +379 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +347 -0
- package/src/rsc/rsc-rendering.ts +235 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +348 -0
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +38 -11
- package/src/search-params.ts +230 -0
- package/src/segment-system.tsx +25 -13
- package/src/server/context.ts +182 -51
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +94 -15
- package/src/server/loader-registry.ts +15 -56
- package/src/server/request-context.ts +430 -70
- package/src/server.ts +35 -130
- package/src/ssr/index.tsx +100 -31
- package/src/static-handler.ts +114 -0
- package/src/theme/ThemeProvider.tsx +21 -15
- package/src/theme/ThemeScript.tsx +5 -5
- package/src/theme/constants.ts +5 -2
- package/src/theme/index.ts +4 -14
- package/src/theme/theme-context.ts +4 -30
- package/src/theme/theme-script.ts +21 -18
- package/src/types/boundaries.ts +158 -0
- package/src/types/cache-types.ts +198 -0
- package/src/types/error-types.ts +192 -0
- package/src/types/global-namespace.ts +100 -0
- package/src/types/handler-context.ts +687 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +183 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +102 -0
- package/src/types/segments.ts +148 -0
- package/src/types.ts +1 -1623
- package/src/urls/include-helper.ts +197 -0
- package/src/urls/index.ts +53 -0
- package/src/urls/path-helper-types.ts +339 -0
- package/src/urls/path-helper.ts +329 -0
- package/src/urls/pattern-types.ts +95 -0
- package/src/urls/response-types.ts +106 -0
- package/src/urls/type-extraction.ts +372 -0
- package/src/urls/urls-function.ts +98 -0
- package/src/urls.ts +1 -802
- package/src/use-loader.tsx +85 -77
- package/src/vite/discovery/bundle-postprocess.ts +184 -0
- package/src/vite/discovery/discover-routers.ts +344 -0
- package/src/vite/discovery/prerender-collection.ts +385 -0
- package/src/vite/discovery/route-types-writer.ts +258 -0
- package/src/vite/discovery/self-gen-tracking.ts +47 -0
- package/src/vite/discovery/state.ts +110 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +11 -1133
- package/src/vite/plugin-types.ts +131 -0
- package/src/vite/plugins/cjs-to-esm.ts +93 -0
- package/src/vite/plugins/client-ref-dedup.ts +115 -0
- package/src/vite/plugins/client-ref-hashing.ts +105 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -51
- package/src/vite/plugins/expose-id-utils.ts +287 -0
- package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +179 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +569 -0
- package/src/vite/plugins/refresh-cmd.ts +65 -0
- package/src/vite/plugins/use-cache-transform.ts +323 -0
- package/src/vite/plugins/version-injector.ts +83 -0
- package/src/vite/plugins/version-plugin.ts +254 -0
- package/src/vite/{virtual-entries.ts → plugins/virtual-entries.ts} +23 -14
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +510 -0
- package/src/vite/router-discovery.ts +785 -0
- package/src/vite/utils/ast-handler-extract.ts +517 -0
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +137 -0
- package/src/vite/utils/manifest-utils.ts +70 -0
- package/src/vite/{package-resolution.ts → utils/package-resolution.ts} +25 -29
- package/src/vite/utils/prerender-utils.ts +189 -0
- package/src/vite/utils/shared-utils.ts +169 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/memory-store.ts +0 -253
- package/src/href-context.ts +0 -33
- package/src/href.ts +0 -255
- package/src/server/route-manifest-cache.ts +0 -173
- package/src/vite/expose-handle-id.ts +0 -209
- package/src/vite/expose-loader-id.ts +0 -426
- package/src/vite/expose-location-state-id.ts +0 -177
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
package/skills/links/SKILL.md
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: links
|
|
3
|
-
description: URL generation with ctx.
|
|
4
|
-
argument-hint: [href|useHref|useMount|
|
|
3
|
+
description: URL generation with ctx.reverse (server), href (client), useHref (mounted), useMount, and scopedReverse
|
|
4
|
+
argument-hint: [href|useHref|useMount|scopedReverse]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Links & URL Generation
|
|
8
8
|
|
|
9
9
|
@rangojs/router provides different href APIs for server and client contexts.
|
|
10
10
|
|
|
11
|
-
## Server: ctx.
|
|
11
|
+
## Server: ctx.reverse()
|
|
12
12
|
|
|
13
13
|
Available in route handlers via HandlerContext. Resolves named routes using the full route map.
|
|
14
14
|
|
|
15
15
|
```typescript
|
|
16
|
-
import { urls,
|
|
16
|
+
import { urls, scopedReverse } from "@rangojs/router";
|
|
17
17
|
|
|
18
18
|
export const shopPatterns = urls(({ path, layout }) => [
|
|
19
19
|
layout(<ShopLayout />, () => [
|
|
@@ -24,38 +24,97 @@ export const shopPatterns = urls(({ path, layout }) => [
|
|
|
24
24
|
]);
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
### Resolution
|
|
27
|
+
### Resolution rules
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
3. **Local name** (`cart`) - resolved relative to current route's namespace
|
|
29
|
+
- **`.name`** — local route, resolved within the current `include()` scope
|
|
30
|
+
- **`name`** — global route, from the named-routes definition
|
|
32
31
|
|
|
33
32
|
```typescript
|
|
34
33
|
// Inside a handler within shopPatterns (mounted at /shop)
|
|
35
34
|
path("/product/:slug", (ctx) => {
|
|
36
|
-
ctx.
|
|
37
|
-
ctx.
|
|
38
|
-
ctx.
|
|
39
|
-
ctx.href("/about"); // "/about" (path-based)
|
|
35
|
+
ctx.reverse(".cart"); // "/shop/cart" (local)
|
|
36
|
+
ctx.reverse(".product", { slug: "widget" }); // "/shop/product/widget" (local + params)
|
|
37
|
+
ctx.reverse("blog.post", { slug: "hi" }); // "/blog/hi" (global)
|
|
40
38
|
|
|
41
39
|
return <ProductPage slug={ctx.params.slug} />;
|
|
42
40
|
}, { name: "product" })
|
|
43
41
|
```
|
|
44
42
|
|
|
45
|
-
###
|
|
43
|
+
### Local names (dot-prefixed)
|
|
46
44
|
|
|
47
|
-
|
|
45
|
+
Prefix a name with `.` to resolve it within the current `include()` scope. The route is looked up using the include's mount namespace.
|
|
48
46
|
|
|
49
47
|
```typescript
|
|
50
|
-
|
|
48
|
+
// urls/magazine.tsx — mounted at include("/magazine", magazinePatterns, { name: "magazine" })
|
|
49
|
+
(ctx) => {
|
|
50
|
+
ctx.reverse(".article", { slug: "design" }); // "/magazine/design"
|
|
51
|
+
ctx.reverse(".author.posts", { authorSlug: "alice" }); // "/magazine/author/alice/posts"
|
|
52
|
+
ctx.reverse(".index"); // "/magazine"
|
|
53
|
+
ctx.reverse(".blog.index"); // THROWS — no magazine.blog.index
|
|
54
|
+
};
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Auto-fill of mount params
|
|
58
|
+
|
|
59
|
+
When routes are mounted via a parameterized `include()`, `ctx.reverse()` automatically fills mount params from `ctx.params`. Inner handlers don't need to pass params that are already known from the current URL match. Explicitly passed params override auto-filled values.
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
// urls/tenant.tsx — mounted at include("/tenant/:tenantId", tenantPatterns, { name: "tenant" })
|
|
63
|
+
export const tenantPatterns = urls(({ path }) => [
|
|
64
|
+
path("/", (ctx) => {
|
|
65
|
+
// tenantId is auto-filled from ctx.params — no need to pass it
|
|
66
|
+
ctx.reverse(".settings"); // "/tenant/acme/settings" (when visiting /tenant/acme)
|
|
67
|
+
ctx.reverse(".user", { userId: "u1" }); // "/tenant/acme/users/u1" (tenantId auto-filled, userId explicit)
|
|
68
|
+
ctx.reverse(".settings", { tenantId: "other" }); // "/tenant/other/settings" (explicit override)
|
|
69
|
+
|
|
70
|
+
// Global names also get auto-filled params
|
|
71
|
+
ctx.reverse("tenant.settings"); // "/tenant/acme/settings"
|
|
72
|
+
return <TenantIndex />;
|
|
73
|
+
}, { name: "index" }),
|
|
74
|
+
path("/settings", SettingsPage, { name: "settings" }),
|
|
75
|
+
path("/users/:userId", UserPage, { name: "user" }),
|
|
76
|
+
]);
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Auto-fill uses `{ ...ctx.params, ...hrefParams }` — current request params are defaults, explicit params win. Params not needed by the target route are silently ignored.
|
|
80
|
+
|
|
81
|
+
### Global names (unprefixed)
|
|
82
|
+
|
|
83
|
+
Unprefixed names resolve against the full named-routes map (the generated `router.named-routes.gen.ts`).
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
(ctx) => {
|
|
87
|
+
ctx.reverse("magazine.index"); // "/magazine"
|
|
88
|
+
ctx.reverse("blog.post", { slug: "hello" }); // "/blog/hello"
|
|
89
|
+
};
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### reverse with search params
|
|
93
|
+
|
|
94
|
+
When a route has a `search` schema, pass a typed search object as the third argument:
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
path("/search", (ctx) => {
|
|
98
|
+
// Generates: /search?q=react&page=2
|
|
99
|
+
const url = ctx.reverse("search", {}, { q: "react", page: 2 });
|
|
100
|
+
return <Link to={url}>Search React</Link>;
|
|
101
|
+
}, { name: "search", search: { q: "string", page: "number?" } })
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### scopedReverse() - type-safe ctx.reverse
|
|
105
|
+
|
|
106
|
+
Wraps `ctx.reverse` with local route type information for autocomplete and validation:
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
import { scopedReverse } from "@rangojs/router";
|
|
51
110
|
|
|
52
111
|
path("/product/:slug", (ctx) => {
|
|
53
|
-
const
|
|
112
|
+
const reverse = scopedReverse<typeof shopPatterns>(ctx.reverse);
|
|
54
113
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
114
|
+
reverse("cart"); // Type-safe local name
|
|
115
|
+
reverse("product", { slug: "widget" }); // Type-safe with params
|
|
116
|
+
reverse("blog.post"); // Absolute names (dot notation) always allowed
|
|
117
|
+
reverse("/about"); // Path-based always allowed
|
|
59
118
|
|
|
60
119
|
return <ProductPage slug={ctx.params.slug} />;
|
|
61
120
|
}, { name: "product" })
|
|
@@ -126,24 +185,24 @@ function MountInfo() {
|
|
|
126
185
|
|
|
127
186
|
## When to use what
|
|
128
187
|
|
|
129
|
-
| Context
|
|
130
|
-
|
|
131
|
-
| Server handler
|
|
132
|
-
| Server handler
|
|
133
|
-
| Client component | `href("/path")`
|
|
134
|
-
| Client component | `useHref()`
|
|
135
|
-
| Client component | `useMount()`
|
|
188
|
+
| Context | API | Resolves | Use for |
|
|
189
|
+
| ---------------- | ------------------------------- | ------------------------------- | ----------------------------------- |
|
|
190
|
+
| Server handler | `ctx.reverse("name")` | Named routes (local + absolute) | Server-side URL generation |
|
|
191
|
+
| Server handler | `scopedReverse<T>(ctx.reverse)` | Same, with type safety | Type-safe server URLs |
|
|
192
|
+
| Client component | `href("/path")` | Absolute paths | Global navigation |
|
|
193
|
+
| Client component | `useHref()` | Mount-prefixed paths | Local navigation inside `include()` |
|
|
194
|
+
| Client component | `useMount()` | Raw mount path | Custom mount-aware logic |
|
|
136
195
|
|
|
137
196
|
## Complete example: mounted module
|
|
138
197
|
|
|
139
198
|
```typescript
|
|
140
199
|
// urls/shop.tsx (server)
|
|
141
|
-
import { urls,
|
|
200
|
+
import { urls, scopedReverse } from "@rangojs/router";
|
|
142
201
|
|
|
143
202
|
export const shopPatterns = urls(({ path, layout }) => [
|
|
144
203
|
layout((ctx) => {
|
|
145
|
-
const
|
|
146
|
-
return <ShopLayout cartUrl={
|
|
204
|
+
const reverse = scopedReverse<typeof shopPatterns>(ctx.reverse);
|
|
205
|
+
return <ShopLayout cartUrl={reverse("cart")} />;
|
|
147
206
|
}, () => [
|
|
148
207
|
path("/", ShopIndex, { name: "index" }),
|
|
149
208
|
path("/cart", CartPage, { name: "cart" }),
|