@rangojs/router 0.0.0-experimental.13 → 0.0.0-experimental.13221847
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 +9 -0
- package/README.md +884 -4
- package/dist/bin/rango.js +1531 -212
- package/dist/vite/index.js +3995 -2489
- package/package.json +57 -52
- package/skills/breadcrumbs/SKILL.md +250 -0
- package/skills/cache-guide/SKILL.md +262 -0
- package/skills/caching/SKILL.md +85 -23
- 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 +6 -4
- package/skills/hooks/SKILL.md +328 -70
- 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 +62 -15
- package/skills/loader/SKILL.md +368 -42
- package/skills/middleware/SKILL.md +171 -34
- package/skills/mime-routes/SKILL.md +14 -10
- package/skills/parallel/SKILL.md +137 -1
- package/skills/prerender/SKILL.md +366 -28
- package/skills/rango/SKILL.md +85 -21
- package/skills/response-routes/SKILL.md +136 -83
- package/skills/route/SKILL.md +195 -21
- package/skills/router-setup/SKILL.md +123 -30
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +240 -102
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +102 -4
- package/src/bin/rango.ts +312 -15
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -0
- package/src/browser/event-controller.ts +92 -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 +11 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +266 -558
- package/src/browser/navigation-client.ts +132 -75
- package/src/browser/navigation-store.ts +33 -50
- package/src/browser/navigation-transaction.ts +297 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +303 -309
- package/src/browser/prefetch/cache.ts +206 -0
- package/src/browser/prefetch/fetch.ts +144 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +128 -0
- package/src/browser/rango-state.ts +112 -0
- package/src/browser/react/Link.tsx +190 -70
- package/src/browser/react/NavigationProvider.tsx +78 -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 +29 -70
- 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 +188 -57
- package/src/browser/scroll-restoration.ts +117 -44
- package/src/browser/segment-reconciler.ts +221 -0
- package/src/browser/segment-structure-assert.ts +16 -0
- package/src/browser/server-action-bridge.ts +488 -606
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +116 -47
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +63 -21
- package/src/build/generate-route-types.ts +36 -1038
- package/src/build/index.ts +2 -5
- package/src/build/route-trie.ts +38 -12
- 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 +479 -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 +342 -0
- package/src/cache/cache-scope.ts +122 -303
- package/src/cache/cf/cf-cache-store.ts +571 -17
- package/src/cache/cf/index.ts +13 -3
- package/src/cache/document-cache.ts +116 -77
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +1 -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 +84 -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 +19 -9
- package/src/errors.ts +77 -7
- package/src/handle.ts +12 -7
- 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 +65 -45
- package/src/index.rsc.ts +104 -40
- package/src/index.ts +122 -67
- package/src/internal-debug.ts +9 -3
- package/src/loader.rsc.ts +18 -93
- package/src/loader.ts +26 -9
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +4 -2
- package/src/prerender/store.ts +121 -17
- package/src/prerender.ts +325 -20
- package/src/reverse.ts +144 -124
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +7 -4
- package/src/route-definition/dsl-helpers.ts +959 -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 -1450
- package/src/route-map-builder.ts +87 -133
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +41 -6
- 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 +160 -0
- package/src/router/handler-context.ts +324 -116
- package/src/router/intercept-resolution.ts +11 -4
- package/src/router/lazy-includes.ts +237 -0
- package/src/router/loader-resolution.ts +179 -133
- package/src/router/logging.ts +112 -6
- package/src/router/manifest.ts +58 -19
- package/src/router/match-api.ts +89 -88
- package/src/router/match-context.ts +4 -2
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +86 -89
- package/src/router/match-middleware/cache-lookup.ts +295 -49
- package/src/router/match-middleware/cache-store.ts +56 -13
- package/src/router/match-middleware/intercept-resolution.ts +45 -22
- package/src/router/match-middleware/segment-resolution.ts +20 -9
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +44 -21
- package/src/router/metrics.ts +240 -15
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +222 -0
- package/src/router/middleware.ts +327 -369
- package/src/router/pattern-matching.ts +169 -31
- package/src/router/prerender-match.ts +402 -0
- package/src/router/preview-match.ts +170 -0
- package/src/router/revalidation.ts +105 -14
- package/src/router/router-context.ts +40 -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 +677 -0
- package/src/router/segment-resolution/helpers.ts +263 -0
- package/src/router/segment-resolution/loader-cache.ts +199 -0
- package/src/router/segment-resolution/revalidation.ts +1296 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -1354
- package/src/router/segment-wrappers.ts +291 -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 +96 -29
- package/src/router/types.ts +15 -9
- package/src/router.ts +642 -2366
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +639 -1027
- 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 +237 -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 +66 -54
- package/src/segment-system.tsx +165 -17
- package/src/server/context.ts +237 -54
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +94 -15
- package/src/server/loader-registry.ts +15 -56
- package/src/server/request-context.ts +438 -71
- package/src/server.ts +26 -164
- package/src/ssr/index.tsx +101 -31
- package/src/static-handler.ts +22 -4
- 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 +773 -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 +109 -0
- package/src/types/segments.ts +150 -0
- package/src/types.ts +1 -1795
- 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 -1323
- 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 +108 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +11 -2259
- package/src/vite/plugin-types.ts +48 -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 -47
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +8 -43
- 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 +266 -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 +445 -0
- package/src/vite/router-discovery.ts +777 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +181 -9
- 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/dist/vite/index.named-routes.gen.ts +0 -103
- 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/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -50,20 +50,22 @@ export const urlpatterns = urls(({ path, layout, loader, loading }) => [
|
|
|
50
50
|
The `urls()` function provides a callback with all available DSL functions:
|
|
51
51
|
|
|
52
52
|
```typescript
|
|
53
|
-
urls(
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
53
|
+
urls(
|
|
54
|
+
({
|
|
55
|
+
path, // Define a route
|
|
56
|
+
layout, // Wrap routes in a layout
|
|
57
|
+
parallel, // Define parallel routes (slots)
|
|
58
|
+
loader, // Add data loader
|
|
59
|
+
loading, // Add loading skeleton
|
|
60
|
+
cache, // Configure caching
|
|
61
|
+
middleware, // Add middleware
|
|
62
|
+
revalidate, // Control revalidation
|
|
63
|
+
intercept, // Intercept routes for modals
|
|
64
|
+
when, // Conditional rendering
|
|
65
|
+
}) => [
|
|
66
|
+
// Route definitions here
|
|
67
|
+
],
|
|
68
|
+
);
|
|
67
69
|
```
|
|
68
70
|
|
|
69
71
|
## Router Options
|
|
@@ -76,7 +78,7 @@ interface RSCRouterOptions<TEnv> {
|
|
|
76
78
|
// Document component wrapping entire app
|
|
77
79
|
document?: ComponentType<{ children: ReactNode }>;
|
|
78
80
|
|
|
79
|
-
// Enable performance
|
|
81
|
+
// Enable per-request performance timeline (console waterfall + Server-Timing header)
|
|
80
82
|
debugPerformance?: boolean;
|
|
81
83
|
|
|
82
84
|
// Default error boundary
|
|
@@ -97,11 +99,25 @@ interface RSCRouterOptions<TEnv> {
|
|
|
97
99
|
// Theme configuration
|
|
98
100
|
theme?: ThemeConfig | true;
|
|
99
101
|
|
|
102
|
+
// SSR options (streaming policy)
|
|
103
|
+
ssr?: SSROptions<TEnv>;
|
|
104
|
+
|
|
105
|
+
// Telemetry sink for structured lifecycle events
|
|
106
|
+
telemetry?: TelemetrySink;
|
|
107
|
+
|
|
100
108
|
// Connection warmup (default: true)
|
|
101
109
|
warmup?: boolean;
|
|
102
110
|
|
|
111
|
+
// Prefetch cache TTL in seconds (default: 300)
|
|
112
|
+
// Controls in-memory cache duration and Cache-Control max-age for prefetch responses.
|
|
113
|
+
// Set to false to disable prefetch caching.
|
|
114
|
+
prefetchCacheTTL?: number | false;
|
|
115
|
+
|
|
103
116
|
// CSP nonce provider (for router.fetch)
|
|
104
|
-
nonce?: (
|
|
117
|
+
nonce?: (
|
|
118
|
+
request: Request,
|
|
119
|
+
env: TEnv,
|
|
120
|
+
) => string | true | Promise<string | true>;
|
|
105
121
|
|
|
106
122
|
// RSC version string (for router.fetch)
|
|
107
123
|
version?: string;
|
|
@@ -160,7 +176,7 @@ import { createRouter } from "@rangojs/router";
|
|
|
160
176
|
import { Document } from "./document";
|
|
161
177
|
import { urlpatterns } from "./urls";
|
|
162
178
|
|
|
163
|
-
export const router = createRouter<
|
|
179
|
+
export const router = createRouter<AppBindings>({
|
|
164
180
|
document: Document,
|
|
165
181
|
urls: urlpatterns,
|
|
166
182
|
});
|
|
@@ -170,7 +186,7 @@ import { router } from "./router";
|
|
|
170
186
|
|
|
171
187
|
export default {
|
|
172
188
|
async fetch(request: Request, env: Env, ctx: ExecutionContext) {
|
|
173
|
-
return router.fetch(request, {
|
|
189
|
+
return router.fetch(request, { env, ctx });
|
|
174
190
|
},
|
|
175
191
|
};
|
|
176
192
|
```
|
|
@@ -184,12 +200,12 @@ For per-request cache configuration (e.g., Cloudflare Workers with ExecutionCont
|
|
|
184
200
|
import { createRouter } from "@rangojs/router";
|
|
185
201
|
import { CFCacheStore } from "@rangojs/router/cache";
|
|
186
202
|
|
|
187
|
-
export const router = createRouter<
|
|
203
|
+
export const router = createRouter<AppBindings>({
|
|
188
204
|
document: Document,
|
|
189
205
|
urls: urlpatterns,
|
|
190
|
-
// Cache config receives env
|
|
191
|
-
cache: (
|
|
192
|
-
store: new CFCacheStore({ ctx:
|
|
206
|
+
// Cache config receives (env, ctx) separately
|
|
207
|
+
cache: (_env, ctx) => ({
|
|
208
|
+
store: new CFCacheStore({ ctx: ctx!, defaults: { ttl: 60 } }),
|
|
193
209
|
}),
|
|
194
210
|
});
|
|
195
211
|
|
|
@@ -198,7 +214,7 @@ import { router } from "./router";
|
|
|
198
214
|
|
|
199
215
|
export default {
|
|
200
216
|
async fetch(request: Request, env: Env, ctx: ExecutionContext) {
|
|
201
|
-
return router.fetch(request, {
|
|
217
|
+
return router.fetch(request, { env, ctx });
|
|
202
218
|
},
|
|
203
219
|
};
|
|
204
220
|
```
|
|
@@ -286,10 +302,10 @@ export const shopPatterns = urls(({ path, layout }) => [
|
|
|
286
302
|
]);
|
|
287
303
|
|
|
288
304
|
// src/urls.tsx
|
|
289
|
-
import { urls
|
|
305
|
+
import { urls } from "@rangojs/router";
|
|
290
306
|
import { shopPatterns } from "./urls/shop";
|
|
291
307
|
|
|
292
|
-
export const urlpatterns = urls(({ path }) => [
|
|
308
|
+
export const urlpatterns = urls(({ path, include }) => [
|
|
293
309
|
path("/", HomePage, { name: "home" }),
|
|
294
310
|
include("/shop", shopPatterns, { name: "shop" }),
|
|
295
311
|
]);
|
|
@@ -298,23 +314,29 @@ export const urlpatterns = urls(({ path }) => [
|
|
|
298
314
|
## Environment Types
|
|
299
315
|
|
|
300
316
|
```typescript
|
|
301
|
-
|
|
302
|
-
|
|
317
|
+
// Bindings passed as TEnv to createRouter<TEnv>()
|
|
303
318
|
interface AppBindings {
|
|
304
319
|
DB: D1Database;
|
|
305
320
|
KV: KVNamespace;
|
|
306
321
|
}
|
|
307
322
|
|
|
323
|
+
// Variables declared via module augmentation
|
|
308
324
|
interface AppVariables {
|
|
309
325
|
user?: { id: string; name: string };
|
|
310
326
|
}
|
|
311
327
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
const router = createRouter<AppEnv>({
|
|
328
|
+
const router = createRouter<AppBindings>({
|
|
315
329
|
document: Document,
|
|
316
330
|
urls: urlpatterns,
|
|
317
331
|
});
|
|
332
|
+
|
|
333
|
+
// Register types globally for implicit typing
|
|
334
|
+
declare global {
|
|
335
|
+
namespace RSCRouter {
|
|
336
|
+
interface Env extends AppBindings {}
|
|
337
|
+
interface Vars extends AppVariables {}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
318
340
|
```
|
|
319
341
|
|
|
320
342
|
## Connection Warmup
|
|
@@ -344,3 +366,74 @@ const router = createRouter({
|
|
|
344
366
|
|
|
345
367
|
The warmup request is relative to the current page path, so it works correctly
|
|
346
368
|
with subpath deployments (reverse proxy, base path).
|
|
369
|
+
|
|
370
|
+
## Telemetry
|
|
371
|
+
|
|
372
|
+
The router emits structured lifecycle events through a pluggable telemetry sink.
|
|
373
|
+
Zero overhead when not configured.
|
|
374
|
+
|
|
375
|
+
```typescript
|
|
376
|
+
// Console sink for development
|
|
377
|
+
import { createRouter, createConsoleSink } from "@rangojs/router";
|
|
378
|
+
|
|
379
|
+
const router = createRouter({
|
|
380
|
+
document: Document,
|
|
381
|
+
urls: urlpatterns,
|
|
382
|
+
telemetry: createConsoleSink(),
|
|
383
|
+
});
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
```typescript
|
|
387
|
+
// OpenTelemetry for production
|
|
388
|
+
import { createRouter, createOTelSink } from "@rangojs/router";
|
|
389
|
+
import { trace } from "@opentelemetry/api";
|
|
390
|
+
|
|
391
|
+
const router = createRouter({
|
|
392
|
+
document: Document,
|
|
393
|
+
urls: urlpatterns,
|
|
394
|
+
telemetry: createOTelSink(trace.getTracer("my-app")),
|
|
395
|
+
});
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
```typescript
|
|
399
|
+
// Custom sink
|
|
400
|
+
const router = createRouter({
|
|
401
|
+
telemetry: {
|
|
402
|
+
emit(event) {
|
|
403
|
+
// Send to any observability backend
|
|
404
|
+
myTracer.record(event);
|
|
405
|
+
},
|
|
406
|
+
},
|
|
407
|
+
});
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
Events emitted: `request.start/end/error`, `loader.start/end/error`,
|
|
411
|
+
`handler.error`, `cache.decision`, `revalidation.decision`.
|
|
412
|
+
|
|
413
|
+
## SSR Streaming Policy
|
|
414
|
+
|
|
415
|
+
Control whether HTML SSR responses stream progressively or wait for all content:
|
|
416
|
+
|
|
417
|
+
```typescript
|
|
418
|
+
import { createRouter, type SSRStreamMode } from "@rangojs/router";
|
|
419
|
+
|
|
420
|
+
const router = createRouter({
|
|
421
|
+
ssr: {
|
|
422
|
+
resolveStreaming: ({ request }) => {
|
|
423
|
+
const ua = request.headers.get("user-agent") ?? "";
|
|
424
|
+
// Bots that can't process streamed HTML get a fully resolved page
|
|
425
|
+
if (/Googlebot|bingbot/i.test(ua)) return "allReady";
|
|
426
|
+
return "stream";
|
|
427
|
+
},
|
|
428
|
+
},
|
|
429
|
+
});
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
`SSRStreamMode` is `"stream" | "allReady"`:
|
|
433
|
+
|
|
434
|
+
- `"stream"` (default) — flush HTML as React renders. Suspense fallbacks appear first, then resolved content streams in. Best for real users (fastest TTFB).
|
|
435
|
+
- `"allReady"` — await `stream.allReady` before flushing. The full page arrives in one shot. Use for bots that cannot execute JavaScript or process chunked HTML.
|
|
436
|
+
|
|
437
|
+
The resolver receives `{ request, env, url }` and may be sync or async. It only runs on HTML SSR paths — RSC partials, `__rsc` requests, and response routes are unaffected.
|
|
438
|
+
|
|
439
|
+
When `resolveStreaming` is not configured, the default is `"stream"`.
|
package/skills/theme/SKILL.md
CHANGED
|
@@ -25,31 +25,32 @@ const router = createRouter<Env>({
|
|
|
25
25
|
document: Document,
|
|
26
26
|
urls: urlpatterns,
|
|
27
27
|
theme: {
|
|
28
|
-
defaultTheme: "system",
|
|
28
|
+
defaultTheme: "system", // "light" | "dark" | "system"
|
|
29
29
|
themes: ["light", "dark"],
|
|
30
|
-
attribute: "class",
|
|
30
|
+
attribute: "class", // or "data-theme"
|
|
31
31
|
storageKey: "theme",
|
|
32
|
-
}
|
|
32
|
+
},
|
|
33
33
|
});
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
## Server (in loaders/middleware)
|
|
37
37
|
|
|
38
38
|
```typescript
|
|
39
|
-
import { createLoader
|
|
39
|
+
import { createLoader } from "@rangojs/router";
|
|
40
|
+
import type { Middleware } from "@rangojs/router";
|
|
40
41
|
|
|
41
42
|
// In a loader
|
|
42
|
-
export const SettingsLoader = createLoader(
|
|
43
|
-
const currentTheme = ctx.theme;
|
|
43
|
+
export const SettingsLoader = createLoader(async (ctx) => {
|
|
44
|
+
const currentTheme = ctx.theme; // read from cookie
|
|
44
45
|
return { theme: currentTheme };
|
|
45
46
|
});
|
|
46
47
|
|
|
47
48
|
// In middleware
|
|
48
|
-
export const themeMiddleware =
|
|
49
|
+
export const themeMiddleware: Middleware = async (ctx, next) => {
|
|
49
50
|
// Set theme based on user preference
|
|
50
51
|
ctx.setTheme("dark");
|
|
51
52
|
await next();
|
|
52
|
-
}
|
|
53
|
+
};
|
|
53
54
|
```
|
|
54
55
|
|
|
55
56
|
## Client
|