@rangojs/router 0.0.0-experimental.97 → 0.0.0-experimental.98914650
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/README.md +24 -9
- package/dist/bin/rango.js +157 -63
- package/dist/testing/vitest.js +82 -0
- package/dist/vite/index.js +1584 -639
- package/package.json +71 -21
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +60 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +222 -30
- package/skills/caching/SKILL.md +263 -8
- package/skills/composability/SKILL.md +27 -2
- package/skills/css/SKILL.md +76 -0
- package/skills/document-cache/SKILL.md +78 -55
- package/skills/handler-use/SKILL.md +3 -1
- package/skills/hooks/SKILL.md +235 -28
- package/skills/host-router/SKILL.md +122 -22
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +29 -5
- package/skills/layout/SKILL.md +13 -9
- package/skills/links/SKILL.md +173 -17
- package/skills/loader/SKILL.md +170 -23
- package/skills/middleware/SKILL.md +16 -10
- package/skills/migrate-nextjs/SKILL.md +38 -16
- package/skills/mime-routes/SKILL.md +27 -0
- package/skills/observability/SKILL.md +137 -0
- package/skills/parallel/SKILL.md +11 -7
- package/skills/prerender/SKILL.md +14 -33
- package/skills/rango/SKILL.md +250 -25
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +114 -47
- package/skills/route/SKILL.md +42 -5
- package/skills/router-setup/SKILL.md +3 -3
- package/skills/server-actions/SKILL.md +78 -42
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/testing/SKILL.md +129 -0
- package/skills/testing/bindings.md +89 -0
- package/skills/testing/cache-prerender.md +124 -0
- package/skills/testing/client-components.md +122 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +92 -0
- package/skills/testing/handles.md +129 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +121 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +84 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +120 -0
- package/skills/typesafety/SKILL.md +316 -26
- package/skills/use-cache/SKILL.md +36 -5
- package/skills/vercel/SKILL.md +107 -0
- package/skills/view-transitions/SKILL.md +294 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +0 -65
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +14 -27
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +37 -143
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/navigation-bridge.ts +30 -59
- package/src/browser/navigation-client.ts +96 -84
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +32 -82
- package/src/browser/navigation-transaction.ts +9 -59
- package/src/browser/partial-update.ts +60 -127
- package/src/browser/prefetch/cache.ts +82 -72
- package/src/browser/prefetch/fetch.ts +108 -33
- package/src/browser/prefetch/queue.ts +6 -3
- package/src/browser/rango-state.ts +157 -115
- package/src/browser/react/Link.tsx +0 -2
- package/src/browser/react/NavigationProvider.tsx +41 -48
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/filter-segment-order.ts +0 -2
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +166 -8
- package/src/browser/react/location-state.ts +39 -14
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +17 -14
- package/src/browser/react/use-link-status.ts +0 -4
- package/src/browser/react/use-navigation.ts +0 -3
- package/src/browser/react/use-params.ts +11 -11
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +20 -5
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +0 -13
- package/src/browser/response-adapter.ts +52 -1
- package/src/browser/rsc-router.tsx +70 -34
- package/src/browser/scroll-restoration.ts +22 -14
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +168 -44
- package/src/browser/types.ts +36 -21
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +60 -35
- package/src/build/generate-route-types.ts +3 -0
- package/src/build/index.ts +8 -2
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +89 -10
- package/src/build/route-types/codegen.ts +4 -4
- package/src/build/route-types/include-resolution.ts +1 -1
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +7 -4
- package/src/build/route-types/router-processing.ts +122 -22
- package/src/build/route-types/scan-filter.ts +1 -1
- package/src/build/route-types/source-scan.ts +118 -0
- package/src/build/runtime-discovery.ts +9 -20
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-policy.ts +68 -28
- package/src/cache/cache-runtime.ts +134 -32
- package/src/cache/cache-scope.ts +100 -74
- package/src/cache/cache-tag.ts +98 -0
- package/src/cache/cf/cf-cache-store.ts +2255 -238
- package/src/cache/cf/index.ts +6 -16
- package/src/cache/document-cache.ts +61 -20
- package/src/cache/handle-snapshot.ts +63 -0
- package/src/cache/index.ts +22 -20
- package/src/cache/memory-segment-store.ts +136 -37
- package/src/cache/profile-registry.ts +6 -30
- package/src/cache/read-through-swr.ts +41 -11
- package/src/cache/segment-codec.ts +0 -16
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/types.ts +33 -100
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +799 -0
- package/src/client.rsc.tsx +6 -21
- package/src/client.tsx +25 -61
- package/src/component-utils.ts +19 -0
- package/src/context-var.ts +17 -5
- package/src/decode-loader-results.ts +36 -0
- package/src/defer.ts +196 -0
- package/src/deps/ssr.ts +0 -1
- package/src/errors.ts +30 -4
- package/src/handle.ts +31 -23
- package/src/handles/MetaTags.tsx +0 -14
- package/src/handles/breadcrumbs.ts +16 -5
- package/src/handles/meta.ts +0 -39
- package/src/host/cookie-handler.ts +0 -36
- package/src/host/errors.ts +0 -24
- package/src/host/index.ts +8 -2
- package/src/host/pattern-matcher.ts +7 -50
- package/src/host/router.ts +107 -99
- package/src/host/testing.ts +40 -27
- package/src/host/types.ts +37 -4
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +137 -22
- package/src/index.rsc.ts +63 -9
- package/src/index.ts +64 -9
- package/src/internal-debug.ts +2 -4
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +20 -13
- package/src/loader.ts +12 -11
- package/src/missing-id-error.ts +68 -0
- package/src/network-error-thrower.tsx +1 -6
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +10 -11
- package/src/prerender/store.ts +32 -37
- package/src/prerender.ts +61 -6
- package/src/redirect-origin.ts +100 -0
- package/src/response-utils.ts +9 -0
- package/src/reverse.ts +65 -40
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +7 -72
- package/src/route-definition/dsl-helpers.ts +244 -281
- package/src/route-definition/helper-factories.ts +29 -139
- package/src/route-definition/helpers-types.ts +40 -17
- package/src/route-definition/redirect.ts +43 -9
- package/src/route-definition/resolve-handler-use.ts +6 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-map-builder.ts +0 -16
- package/src/route-types.ts +19 -41
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +15 -15
- package/src/router/error-handling.ts +13 -17
- package/src/router/find-match.ts +44 -23
- package/src/router/handler-context.ts +4 -41
- package/src/router/intercept-resolution.ts +14 -19
- package/src/router/lazy-includes.ts +9 -46
- package/src/router/loader-resolution.ts +91 -46
- package/src/router/logging.ts +0 -6
- package/src/router/manifest.ts +18 -29
- package/src/router/match-api.ts +0 -20
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +57 -58
- package/src/router/match-middleware/background-revalidation.ts +0 -7
- package/src/router/match-middleware/cache-lookup.ts +150 -271
- package/src/router/match-middleware/cache-store.ts +3 -33
- package/src/router/match-middleware/intercept-resolution.ts +0 -22
- package/src/router/match-middleware/segment-resolution.ts +0 -22
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +31 -80
- package/src/router/metrics.ts +0 -34
- package/src/router/middleware-types.ts +5 -112
- package/src/router/middleware.ts +118 -133
- package/src/router/navigation-snapshot.ts +0 -51
- package/src/router/params-util.ts +23 -0
- package/src/router/pattern-matching.ts +62 -67
- package/src/router/prerender-match.ts +99 -63
- package/src/router/preview-match.ts +3 -1
- package/src/router/request-classification.ts +28 -62
- package/src/router/revalidation.ts +50 -56
- package/src/router/route-snapshot.ts +0 -1
- package/src/router/router-context.ts +0 -27
- package/src/router/router-interfaces.ts +68 -35
- package/src/router/router-options.ts +55 -1
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +44 -63
- package/src/router/segment-resolution/helpers.ts +34 -0
- package/src/router/segment-resolution/loader-cache.ts +40 -37
- package/src/router/segment-resolution/revalidation.ts +203 -285
- package/src/router/segment-resolution/static-store.ts +19 -5
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +36 -0
- package/src/router/segment-resolution.ts +4 -1
- package/src/router/segment-wrappers.ts +0 -3
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry-otel.ts +0 -20
- package/src/router/telemetry.ts +96 -19
- package/src/router/timeout.ts +0 -20
- package/src/router/trie-matching.ts +87 -48
- package/src/router/types.ts +9 -63
- package/src/router/url-params.ts +0 -5
- package/src/router.ts +80 -41
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +83 -78
- package/src/rsc/helpers.ts +93 -5
- package/src/rsc/index.ts +1 -1
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/manifest-init.ts +28 -41
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +12 -1
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +76 -62
- package/src/rsc/rsc-rendering.ts +41 -60
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +62 -67
- package/src/rsc/ssr-setup.ts +16 -0
- package/src/rsc/types.ts +10 -5
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +4 -20
- package/src/segment-loader-promise.ts +14 -2
- package/src/segment-system.tsx +199 -142
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +150 -51
- package/src/server/cookie-store.ts +80 -5
- package/src/server/handle-store.ts +7 -24
- package/src/server/loader-registry.ts +5 -24
- package/src/server/request-context.ts +165 -87
- package/src/ssr/index.tsx +14 -14
- package/src/static-handler.ts +10 -13
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +40 -0
- package/src/testing/dispatch.ts +618 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +232 -0
- package/src/testing/generated-routes.ts +183 -0
- package/src/testing/index.ts +99 -0
- package/src/testing/internal/context.ts +348 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +330 -0
- package/src/testing/render-route.tsx +566 -0
- package/src/testing/run-loader.ts +378 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +0 -52
- package/src/theme/ThemeScript.tsx +0 -6
- package/src/theme/constants.ts +0 -12
- package/src/theme/index.ts +0 -7
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +0 -14
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +0 -35
- package/src/types/cache-types.ts +13 -4
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +54 -41
- package/src/types/handler-context.ts +97 -22
- package/src/types/index.ts +1 -10
- package/src/types/loader-types.ts +6 -3
- package/src/types/request-scope.ts +0 -19
- package/src/types/route-config.ts +6 -50
- package/src/types/route-entry.ts +0 -6
- package/src/types/segments.ts +18 -14
- package/src/urls/include-helper.ts +9 -56
- package/src/urls/index.ts +1 -11
- package/src/urls/path-helper-types.ts +19 -5
- package/src/urls/path-helper.ts +17 -106
- package/src/urls/pattern-types.ts +36 -19
- package/src/urls/response-types.ts +20 -19
- package/src/urls/type-extraction.ts +58 -139
- package/src/urls/urls-function.ts +1 -18
- package/src/use-loader.tsx +292 -107
- package/src/vite/debug.ts +1 -0
- package/src/vite/discovery/bundle-postprocess.ts +8 -7
- package/src/vite/discovery/discover-routers.ts +95 -82
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/prerender-collection.ts +26 -34
- package/src/vite/discovery/route-types-writer.ts +40 -84
- package/src/vite/discovery/state.ts +39 -1
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +4 -0
- package/src/vite/plugin-types.ts +185 -10
- package/src/vite/plugins/cjs-to-esm.ts +3 -18
- package/src/vite/plugins/client-ref-dedup.ts +0 -11
- package/src/vite/plugins/client-ref-hashing.ts +12 -11
- package/src/vite/plugins/cloudflare-protocol-stub.ts +1 -21
- package/src/vite/plugins/expose-action-id.ts +4 -75
- package/src/vite/plugins/expose-id-utils.ts +3 -54
- package/src/vite/plugins/expose-ids/export-analysis.ts +76 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +6 -74
- package/src/vite/plugins/expose-ids/loader-transform.ts +3 -20
- package/src/vite/plugins/expose-ids/router-transform.ts +0 -13
- package/src/vite/plugins/expose-internal-ids.ts +57 -67
- package/src/vite/plugins/performance-tracks.ts +9 -16
- package/src/vite/plugins/refresh-cmd.ts +1 -1
- package/src/vite/plugins/use-cache-transform.ts +26 -49
- package/src/vite/plugins/vercel-output.ts +258 -0
- package/src/vite/plugins/version-injector.ts +2 -32
- package/src/vite/plugins/version-plugin.ts +32 -23
- package/src/vite/plugins/virtual-entries.ts +35 -17
- package/src/vite/rango.ts +148 -115
- package/src/vite/router-discovery.ts +220 -68
- package/src/vite/utils/ast-handler-extract.ts +15 -31
- package/src/vite/utils/bundle-analysis.ts +10 -15
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +4 -59
- package/src/vite/utils/package-resolution.ts +1 -73
- package/src/vite/utils/prerender-utils.ts +0 -34
- package/src/vite/utils/shared-utils.ts +95 -43
- package/src/browser/action-response-classifier.ts +0 -99
- package/src/browser/react/use-client-cache.ts +0 -58
- package/src/browser/shallow.ts +0 -40
- package/src/handles/index.ts +0 -7
- package/src/router/middleware-cookies.ts +0 -55
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Plugin } from "vite";
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import * as Vite from "vite";
|
|
4
|
+
import { resolveRscEntryFromConfig } from "../utils/shared-utils.js";
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Plugin that auto-injects VERSION and routes-manifest into custom entry.rsc files.
|
|
@@ -20,18 +21,7 @@ export function createVersionInjectorPlugin(
|
|
|
20
21
|
|
|
21
22
|
configResolved(config) {
|
|
22
23
|
let entryPath = rscEntryPath;
|
|
23
|
-
|
|
24
|
-
// The @cloudflare/vite-plugin reads wrangler config (toml/json/jsonc)
|
|
25
|
-
// and sets optimizeDeps.entries on the RSC environment.
|
|
26
|
-
if (!entryPath) {
|
|
27
|
-
const rscEnvConfig = (config.environments as any)?.["rsc"];
|
|
28
|
-
const entries = rscEnvConfig?.optimizeDeps?.entries;
|
|
29
|
-
if (typeof entries === "string") {
|
|
30
|
-
entryPath = entries;
|
|
31
|
-
} else if (Array.isArray(entries) && entries.length > 0) {
|
|
32
|
-
entryPath = entries[0];
|
|
33
|
-
}
|
|
34
|
-
}
|
|
24
|
+
if (!entryPath) entryPath = resolveRscEntryFromConfig(config);
|
|
35
25
|
if (entryPath) {
|
|
36
26
|
resolvedEntryPath = resolve(config.root, entryPath);
|
|
37
27
|
}
|
|
@@ -39,7 +29,6 @@ export function createVersionInjectorPlugin(
|
|
|
39
29
|
|
|
40
30
|
transform(code, id) {
|
|
41
31
|
if (!resolvedEntryPath) return null;
|
|
42
|
-
// Only transform the RSC entry file
|
|
43
32
|
const normalizedId = Vite.normalizePath(id);
|
|
44
33
|
const normalizedEntry = Vite.normalizePath(resolvedEntryPath);
|
|
45
34
|
|
|
@@ -47,25 +36,10 @@ export function createVersionInjectorPlugin(
|
|
|
47
36
|
return null;
|
|
48
37
|
}
|
|
49
38
|
|
|
50
|
-
// Always prepend `import "virtual:rsc-router/routes-manifest"` as the
|
|
51
|
-
// first side-effect import. The manifest virtual module's `load()` hook
|
|
52
|
-
// awaits `s.discoveryDone` so that, by the time the rest of the entry
|
|
53
|
-
// including any module-level `router.reverse()` calls under `./router.js`
|
|
54
|
-
// evaluates, runtime discovery has rewritten `router.named-routes.gen.ts`
|
|
55
|
-
// with the full route table.
|
|
56
|
-
//
|
|
57
|
-
// ES module evaluation order matters here: while imports are *parsed*
|
|
58
|
-
// hoisted, side-effect imports are evaluated in source order in the
|
|
59
|
-
// dependency graph. A user-authored `import "virtual:rsc-router/..."`
|
|
60
|
-
// placed after `import "./router.js"` runs too late: the manifest
|
|
61
|
-
// gate fires after router.tsx has already crashed on a stale gen file.
|
|
62
|
-
// We always prepend; ESM dedups any user-written duplicate, so module
|
|
63
|
-
// initialization still runs once.
|
|
64
39
|
const prepend: string[] = [
|
|
65
40
|
`import "virtual:rsc-router/routes-manifest";`,
|
|
66
41
|
];
|
|
67
42
|
|
|
68
|
-
// Auto-inject VERSION if file uses createRSCHandler without version
|
|
69
43
|
let newCode = code;
|
|
70
44
|
const needsVersion =
|
|
71
45
|
code.includes("createRSCHandler") &&
|
|
@@ -80,10 +54,6 @@ export function createVersionInjectorPlugin(
|
|
|
80
54
|
);
|
|
81
55
|
}
|
|
82
56
|
|
|
83
|
-
// Insert after any leading `/// <reference ... />` triple-slash
|
|
84
|
-
// directives (and surrounding blank lines). TypeScript requires those
|
|
85
|
-
// directives to precede all other code; putting our imports above
|
|
86
|
-
// them silently demotes the directives to plain comments.
|
|
87
57
|
const lines = newCode.split("\n");
|
|
88
58
|
let insertAt = 0;
|
|
89
59
|
while (insertAt < lines.length) {
|
|
@@ -18,7 +18,7 @@ function getClientModuleSignature(
|
|
|
18
18
|
): ClientModuleSignature | undefined {
|
|
19
19
|
let program: any;
|
|
20
20
|
try {
|
|
21
|
-
program = parseAst(source, {
|
|
21
|
+
program = parseAst(source, { lang: "tsx" });
|
|
22
22
|
} catch {
|
|
23
23
|
return undefined;
|
|
24
24
|
}
|
|
@@ -133,14 +133,13 @@ export function createVersionPlugin(): Plugin {
|
|
|
133
133
|
let currentVersion = buildVersion;
|
|
134
134
|
let isDev = false;
|
|
135
135
|
let server: any = null;
|
|
136
|
+
let resolvedCacheDir: string | undefined;
|
|
136
137
|
const clientModuleSignatures = new Map<string, ClientModuleSignature>();
|
|
137
138
|
|
|
138
139
|
let versionCounter = 0;
|
|
139
140
|
const bumpVersion = (reason: string) => {
|
|
140
|
-
// Use timestamp + counter to guarantee uniqueness even when multiple
|
|
141
|
-
// bumps happen within the same millisecond (e.g. cascading HMR events).
|
|
142
141
|
currentVersion = Date.now().toString(16) + String(++versionCounter);
|
|
143
|
-
console.log(`[
|
|
142
|
+
console.log(`[rango] ${reason}, version updated: ${currentVersion}`);
|
|
144
143
|
|
|
145
144
|
const rscEnv = server?.environments?.rsc;
|
|
146
145
|
const versionMod = rscEnv?.moduleGraph?.getModuleById(
|
|
@@ -157,6 +156,9 @@ export function createVersionPlugin(): Plugin {
|
|
|
157
156
|
|
|
158
157
|
configResolved(config) {
|
|
159
158
|
isDev = config.command === "serve";
|
|
159
|
+
resolvedCacheDir = config.cacheDir
|
|
160
|
+
? String(config.cacheDir).replace(/\\/g, "/")
|
|
161
|
+
: undefined;
|
|
160
162
|
},
|
|
161
163
|
|
|
162
164
|
configureServer(devServer) {
|
|
@@ -203,19 +205,15 @@ export function createVersionPlugin(): Plugin {
|
|
|
203
205
|
return null;
|
|
204
206
|
},
|
|
205
207
|
|
|
206
|
-
// Track RSC module changes and update version
|
|
207
208
|
async hotUpdate(ctx) {
|
|
208
209
|
if (!isDev) return;
|
|
209
210
|
|
|
210
|
-
// Check if this is an RSC environment update (not client/ssr)
|
|
211
|
-
// RSC modules affect server-rendered content and cached payloads
|
|
212
|
-
// In Vite 6, environment is accessed via `this.environment`
|
|
213
211
|
const isRscModule = this.environment?.name === "rsc";
|
|
214
212
|
|
|
215
213
|
if (!isRscModule) return;
|
|
216
214
|
|
|
217
|
-
|
|
218
|
-
|
|
215
|
+
if (isViteDepCachePath(ctx.file, resolvedCacheDir)) return;
|
|
216
|
+
|
|
219
217
|
if (
|
|
220
218
|
ctx.modules.length === 1 &&
|
|
221
219
|
ctx.modules[0].id === "\0" + VIRTUAL_IDS.version
|
|
@@ -230,9 +228,6 @@ export function createVersionPlugin(): Plugin {
|
|
|
230
228
|
const source = await ctx.read();
|
|
231
229
|
const nextSignature = getClientModuleSignature(source);
|
|
232
230
|
if (nextSignature) {
|
|
233
|
-
// "use client" file — compare export signatures.
|
|
234
|
-
// client-component-hmr may have cleared ctx.modules, so we
|
|
235
|
-
// cannot rely on ctx.modules.length for these files.
|
|
236
231
|
clientModuleSignatures.set(filePath, nextSignature);
|
|
237
232
|
if (
|
|
238
233
|
previousSignature &&
|
|
@@ -243,20 +238,11 @@ export function createVersionPlugin(): Plugin {
|
|
|
243
238
|
} else {
|
|
244
239
|
clientModuleSignatures.delete(filePath);
|
|
245
240
|
if (!previousSignature) {
|
|
246
|
-
// Not and never was "use client" — use module graph check.
|
|
247
|
-
// ctx.modules is reliable for pure server files (only
|
|
248
|
-
// client-component-hmr clears it for "use client" modules).
|
|
249
241
|
if (ctx.modules.length === 0) return;
|
|
250
242
|
}
|
|
251
|
-
// Was "use client" but directive removed — boundary changed,
|
|
252
|
-
// bump below.
|
|
253
243
|
}
|
|
254
|
-
} catch {
|
|
255
|
-
// Fail open: if we can't read or parse the update, invalidate.
|
|
256
|
-
}
|
|
244
|
+
} catch {}
|
|
257
245
|
} else {
|
|
258
|
-
// Non-code file (json, css, etc.) — only bump if it's actually
|
|
259
|
-
// referenced by the RSC module graph.
|
|
260
246
|
if (ctx.modules.length === 0) return;
|
|
261
247
|
}
|
|
262
248
|
|
|
@@ -264,3 +250,26 @@ export function createVersionPlugin(): Plugin {
|
|
|
264
250
|
},
|
|
265
251
|
};
|
|
266
252
|
}
|
|
253
|
+
|
|
254
|
+
export function isViteDepCachePath(
|
|
255
|
+
filePath: string | undefined,
|
|
256
|
+
cacheDir?: string,
|
|
257
|
+
): boolean {
|
|
258
|
+
if (!filePath) return false;
|
|
259
|
+
const normalized = filePath.replace(/\\/g, "/");
|
|
260
|
+
|
|
261
|
+
if (cacheDir) {
|
|
262
|
+
const normalizedCacheDir = cacheDir.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
263
|
+
if (
|
|
264
|
+
normalized === normalizedCacheDir ||
|
|
265
|
+
normalized.startsWith(normalizedCacheDir + "/")
|
|
266
|
+
) {
|
|
267
|
+
return true;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
return (
|
|
272
|
+
/\/node_modules\/\.vite[^/]*\//.test(normalized) ||
|
|
273
|
+
normalized.includes("/.vite-isolated/")
|
|
274
|
+
);
|
|
275
|
+
}
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default virtual entry file contents for rsc-router.
|
|
3
|
-
* These are used when users don't provide their own entry files.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
1
|
export const VIRTUAL_ENTRY_BROWSER: string = `
|
|
7
2
|
import {
|
|
8
3
|
createFromReadableStream,
|
|
@@ -14,7 +9,7 @@ import {
|
|
|
14
9
|
import { createElement, StrictMode } from "react";
|
|
15
10
|
import { hydrateRoot } from "react-dom/client";
|
|
16
11
|
import { rscStream } from "@rangojs/router/internal/deps/html-stream-client";
|
|
17
|
-
import { initBrowserApp,
|
|
12
|
+
import { initBrowserApp, Rango } from "@rangojs/router/browser";
|
|
18
13
|
|
|
19
14
|
async function initializeApp() {
|
|
20
15
|
const deps = {
|
|
@@ -29,7 +24,7 @@ async function initializeApp() {
|
|
|
29
24
|
|
|
30
25
|
hydrateRoot(
|
|
31
26
|
document,
|
|
32
|
-
createElement(StrictMode, null, createElement(
|
|
27
|
+
createElement(StrictMode, null, createElement(Rango))
|
|
33
28
|
);
|
|
34
29
|
}
|
|
35
30
|
|
|
@@ -51,9 +46,6 @@ export const renderHTML = createSSRHandler({
|
|
|
51
46
|
});
|
|
52
47
|
`.trim();
|
|
53
48
|
|
|
54
|
-
/**
|
|
55
|
-
* Generate the RSC entry content with the specified router path
|
|
56
|
-
*/
|
|
57
49
|
export function getVirtualEntryRSC(routerPath: string): string {
|
|
58
50
|
return `
|
|
59
51
|
import {
|
|
@@ -104,9 +96,39 @@ export default function handler(request, env) {
|
|
|
104
96
|
`.trim();
|
|
105
97
|
}
|
|
106
98
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
99
|
+
export function getVirtualEntryRSCHost(hostEntryPath: string): string {
|
|
100
|
+
return `
|
|
101
|
+
import * as __hostEntry from "${hostEntryPath}";
|
|
102
|
+
|
|
103
|
+
// Register every sub-app's fetchable loaders + route manifests at startup, same
|
|
104
|
+
// as the single-router entry. Discovery's host fallback populates these for all
|
|
105
|
+
// mounted sub-apps, so the aggregate manifests cover the whole host tree.
|
|
106
|
+
import "virtual:rsc-router/loader-manifest";
|
|
107
|
+
import "virtual:rsc-router/routes-manifest";
|
|
108
|
+
|
|
109
|
+
// The host entry module must export the HostRouter instance (createHostRouter()),
|
|
110
|
+
// as a default export or a named \`hostRouter\`/\`router\` export. A Cloudflare-style
|
|
111
|
+
// \`export default { fetch }\` object is not a HostRouter and is rejected here.
|
|
112
|
+
const __defaultExport = __hostEntry.default;
|
|
113
|
+
const hostRouter =
|
|
114
|
+
__defaultExport && typeof __defaultExport.match === "function"
|
|
115
|
+
? __defaultExport
|
|
116
|
+
: __hostEntry.hostRouter ?? __hostEntry.router;
|
|
117
|
+
|
|
118
|
+
if (!hostRouter || typeof hostRouter.match !== "function") {
|
|
119
|
+
throw new Error(
|
|
120
|
+
"[rango] The host entry (${hostEntryPath}) must export a HostRouter instance for the node/vercel preset: a default export, or a named 'hostRouter'/'router' export (e.g. export default createHostRouter()). A Cloudflare-style 'export default { fetch }' object is not supported on this preset."
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// input = { env, ctx } from the launcher / node server. The host router threads
|
|
125
|
+
// it unchanged to each matched sub-app's handler and cache factory.
|
|
126
|
+
export default function handler(request, input) {
|
|
127
|
+
return hostRouter.match(request, input);
|
|
128
|
+
}
|
|
129
|
+
`.trim();
|
|
130
|
+
}
|
|
131
|
+
|
|
110
132
|
export const VIRTUAL_IDS = {
|
|
111
133
|
browser: "virtual:rsc-router/entry.browser.js",
|
|
112
134
|
ssr: "virtual:rsc-router/entry.ssr.js",
|
|
@@ -114,10 +136,6 @@ export const VIRTUAL_IDS = {
|
|
|
114
136
|
version: "@rangojs/router:version",
|
|
115
137
|
} as const;
|
|
116
138
|
|
|
117
|
-
/**
|
|
118
|
-
* Virtual module content for version.
|
|
119
|
-
* Exports VERSION - a timestamp that changes on server restart (dev) or at build time (production).
|
|
120
|
-
*/
|
|
121
139
|
export function getVirtualVersionContent(version: string): string {
|
|
122
140
|
return `export const VERSION = ${JSON.stringify(version)};`;
|
|
123
141
|
}
|