@rangojs/router 0.20.0 → 0.21.0
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/dist/bin/rango.js +26 -14
- package/dist/types/browser/event-controller.d.ts +32 -0
- package/dist/types/browser/history-state.d.ts +16 -4
- package/dist/types/browser/navigation-transaction.d.ts +7 -0
- package/dist/types/browser/rango-state.d.ts +3 -1
- package/dist/types/browser/react/context.d.ts +11 -0
- package/dist/types/browser/react/location-state-shared.d.ts +84 -10
- package/dist/types/browser/react/location-state.d.ts +7 -2
- package/dist/types/browser/react/subscribe-to-nothing.d.ts +7 -0
- package/dist/types/cache/cache-scope.d.ts +4 -5
- package/dist/types/cache/cf/cf-cache-store.d.ts +27 -6
- package/dist/types/cache/cf/cf-cache-types.d.ts +12 -4
- package/dist/types/cache/handle-snapshot.d.ts +36 -50
- package/dist/types/cache/index.d.ts +2 -0
- package/dist/types/cache/shell-snapshot.d.ts +19 -3
- package/dist/types/cache/types.d.ts +21 -10
- package/dist/types/cache/vercel/vercel-cache-store.d.ts +28 -16
- package/dist/types/client-urls/navigation.d.ts +7 -1
- package/dist/types/client-urls/optimistic-location.d.ts +10 -4
- package/dist/types/handles/deferred-resolution.d.ts +11 -1
- package/dist/types/prerender/build-shell-capture.d.ts +8 -6
- package/dist/types/router/match-middleware/cache-lookup.d.ts +1 -1
- package/dist/types/router/navigation-snapshot.d.ts +8 -1
- package/dist/types/router/router-interfaces.d.ts +2 -1
- package/dist/types/router/router-options.d.ts +17 -7
- package/dist/types/router/segment-resolution/loader-cache.d.ts +21 -9
- package/dist/types/router-versions.d.ts +39 -0
- package/dist/types/rsc/handler-context.d.ts +5 -0
- package/dist/types/rsc/shell-build-manifest.d.ts +3 -2
- package/dist/types/rsc/types.d.ts +4 -6
- package/dist/types/server/build-version-table.d.ts +44 -0
- package/dist/types/server/handle-store.d.ts +87 -46
- package/dist/types/server/request-context.d.ts +22 -8
- package/dist/types/testing/build-versions.d.ts +32 -0
- package/dist/types/testing/dom.entry.d.ts +1 -1
- package/dist/types/testing/flight.entry.d.ts +1 -1
- package/dist/types/testing/index.d.ts +2 -0
- package/dist/types/testing/internal/seed-vars.d.ts +7 -2
- package/dist/types/testing/location-state-key.d.ts +5 -1
- package/dist/types/testing/render-route.d.ts +77 -6
- package/dist/types/testing/serve-shell-request.d.ts +21 -0
- package/dist/types/testing/vitest-stubs/version.d.ts +1 -0
- package/dist/types/types/handler-context.d.ts +8 -5
- package/dist/types/vite/discovery/build-versions.d.ts +393 -0
- package/dist/types/vite/discovery/installed-packages.d.ts +26 -0
- package/dist/types/vite/discovery/router-versions-phase.d.ts +52 -0
- package/dist/types/vite/discovery/shell-prerender-phase.d.ts +7 -17
- package/dist/types/vite/discovery/state.d.ts +14 -0
- package/dist/types/vite/encryption-key.d.ts +18 -0
- package/dist/types/vite/plugin-types.d.ts +27 -0
- package/dist/types/vite/plugins/{version-injector.d.ts → entry-bootstrap-injector.d.ts} +4 -6
- package/dist/types/vite/plugins/expose-ids/export-analysis.d.ts +1 -0
- package/dist/types/vite/plugins/expose-ids/router-transform.d.ts +14 -0
- package/dist/types/vite/plugins/stable-rsc-output.d.ts +51 -0
- package/dist/types/vite/plugins/version-plugin.d.ts +9 -11
- package/dist/types/vite/plugins/virtual-entries.d.ts +18 -1
- package/dist/types/vite/router-discovery.d.ts +6 -0
- package/dist/types/vite/utils/client-chunks.d.ts +2 -0
- package/dist/types/vite/utils/compare-strings.d.ts +7 -0
- package/dist/types/vite/utils/package-resolution.d.ts +8 -0
- package/dist/types/vite/utils/prerender-utils.d.ts +2 -0
- package/dist/vite/index.js +1537 -444
- package/package.json +1 -2
- package/skills/cache-guide/SKILL.md +84 -20
- package/skills/caching/SKILL.md +16 -5
- package/skills/client-urls/SKILL.md +16 -0
- package/skills/cloudflare/SKILL.md +2 -1
- package/skills/comparison/references/framework-comparison.md +16 -12
- package/skills/hooks/SKILL.md +3 -0
- package/skills/hooks/handle-and-actions.md +6 -0
- package/skills/hooks/navigation.md +28 -0
- package/skills/hooks/state.md +209 -8
- package/skills/hooks/urls.md +40 -1
- package/skills/host-router/SKILL.md +13 -0
- package/skills/intercept/SKILL.md +6 -0
- package/skills/loader/SKILL.md +19 -1
- package/skills/middleware/SKILL.md +2 -0
- package/skills/ppr/SKILL.md +119 -40
- package/skills/prerender/SKILL.md +7 -3
- package/skills/rango/SKILL.md +8 -7
- package/skills/router-setup/SKILL.md +15 -1
- package/skills/testing/SKILL.md +30 -26
- package/skills/testing/client-components.md +193 -8
- package/skills/testing/handles.md +2 -0
- package/skills/testing/loader.md +1 -1
- package/skills/testing/middleware.md +1 -1
- package/skills/testing/render-handler.md +18 -18
- package/skills/testing/serve-shell-request.md +63 -14
- package/skills/testing/server-actions.md +17 -17
- package/skills/testing/server-tree.md +1 -1
- package/skills/typesafety/generated-files-and-cli.md +1 -1
- package/skills/use-cache/SKILL.md +16 -5
- package/skills/vercel/SKILL.md +3 -3
- package/src/bin/rango.ts +1 -1
- package/src/browser/event-controller.ts +75 -2
- package/src/browser/history-state.ts +39 -17
- package/src/browser/navigation-bridge.ts +41 -18
- package/src/browser/navigation-transaction.ts +15 -10
- package/src/browser/partial-update.ts +10 -2
- package/src/browser/rango-state.ts +3 -1
- package/src/browser/react/Link.tsx +2 -3
- package/src/browser/react/NavigationProvider.tsx +25 -1
- package/src/browser/react/context.ts +13 -0
- package/src/browser/react/location-state-shared.ts +200 -34
- package/src/browser/react/location-state.ts +40 -75
- package/src/browser/react/subscribe-to-nothing.ts +7 -0
- package/src/browser/react/use-handle.ts +20 -1
- package/src/browser/rsc-router.tsx +33 -11
- package/src/browser/server-action-bridge.ts +17 -1
- package/src/cache/cache-scope.ts +18 -8
- package/src/cache/cf/cf-cache-store.ts +75 -55
- package/src/cache/cf/cf-cache-types.ts +12 -4
- package/src/cache/handle-snapshot.ts +69 -87
- package/src/cache/index.ts +4 -0
- package/src/cache/shell-snapshot.ts +35 -5
- package/src/cache/types.ts +21 -10
- package/src/cache/vercel/vercel-cache-store.ts +48 -20
- package/src/client-urls/client-root.tsx +1 -0
- package/src/client-urls/navigation.ts +10 -0
- package/src/client-urls/optimistic-location.ts +10 -4
- package/src/handles/deferred-resolution.ts +31 -0
- package/src/prerender/build-shell-capture.ts +11 -9
- package/src/router/manifest.ts +2 -0
- package/src/router/match-middleware/cache-lookup.ts +11 -18
- package/src/router/navigation-snapshot.ts +25 -6
- package/src/router/request-classification.ts +15 -12
- package/src/router/router-interfaces.ts +2 -1
- package/src/router/router-options.ts +17 -7
- package/src/router/segment-resolution/loader-cache.ts +95 -60
- package/src/router-versions.ts +60 -0
- package/src/rsc/full-payload.ts +6 -2
- package/src/rsc/handler-context.ts +5 -0
- package/src/rsc/handler.ts +14 -4
- package/src/rsc/rsc-rendering.ts +12 -1
- package/src/rsc/shell-build-manifest.ts +10 -7
- package/src/rsc/shell-capture.ts +36 -26
- package/src/rsc/types.ts +4 -6
- package/src/server/build-version-table.ts +115 -0
- package/src/server/handle-store.ts +344 -127
- package/src/server/request-context.ts +62 -11
- package/src/ssr/ssr-root.tsx +16 -4
- package/src/testing/build-versions.ts +64 -0
- package/src/testing/dispatch.ts +6 -0
- package/src/testing/dom.entry.ts +1 -0
- package/src/testing/flight.entry.ts +1 -0
- package/src/testing/index.ts +3 -0
- package/src/testing/internal/context.ts +2 -1
- package/src/testing/internal/seed-vars.ts +14 -2
- package/src/testing/location-state-key.ts +18 -8
- package/src/testing/render-handler.ts +2 -1
- package/src/testing/render-route.tsx +277 -43
- package/src/testing/serve-shell-request.ts +80 -11
- package/src/testing/vitest-stubs/version.ts +4 -1
- package/src/types/handler-context.ts +8 -5
- package/src/vite/discovery/build-versions.ts +1281 -0
- package/src/vite/discovery/installed-packages.ts +159 -0
- package/src/vite/discovery/prerender-collection.ts +38 -1
- package/src/vite/discovery/router-versions-phase.ts +336 -0
- package/src/vite/discovery/shell-prerender-phase.ts +28 -38
- package/src/vite/discovery/state.ts +19 -0
- package/src/vite/discovery/virtual-module-codegen.ts +7 -2
- package/src/vite/encryption-key.ts +101 -9
- package/src/vite/plugin-types.ts +28 -0
- package/src/vite/plugins/{version-injector.ts → entry-bootstrap-injector.ts} +7 -22
- package/src/vite/plugins/expose-ids/export-analysis.ts +1 -1
- package/src/vite/plugins/expose-ids/router-transform.ts +36 -15
- package/src/vite/plugins/expose-internal-ids.ts +12 -3
- package/src/vite/plugins/stable-rsc-output.ts +147 -0
- package/src/vite/plugins/version-plugin.ts +19 -24
- package/src/vite/plugins/version.d.ts +17 -2
- package/src/vite/plugins/virtual-entries.ts +31 -5
- package/src/vite/rango.ts +28 -3
- package/src/vite/router-discovery.ts +82 -13
- package/src/vite/utils/client-chunks.ts +5 -1
- package/src/vite/utils/compare-strings.ts +9 -0
- package/src/vite/utils/package-resolution.ts +9 -0
- package/src/vite/utils/prerender-utils.ts +4 -1
- package/src/vite/utils/shared-utils.ts +1 -1
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/// <reference path="../vite/plugins/version.d.ts" />
|
|
2
|
+
/**
|
|
3
|
+
* Runtime side of the per-router cache versions: binds the
|
|
4
|
+
* `@rangojs/router:version` virtual module and answers "which versions does
|
|
5
|
+
* this router, or this request, use".
|
|
6
|
+
*
|
|
7
|
+
* Design: docs/design/per-app-cache-version.md.
|
|
8
|
+
*/
|
|
9
|
+
import { ROUTER_VERSIONS, VERSION } from "@rangojs/router:version";
|
|
10
|
+
import {
|
|
11
|
+
resolveVersionsFrom,
|
|
12
|
+
uniformVersions,
|
|
13
|
+
type RouterVersions,
|
|
14
|
+
type RouterVersionsTable,
|
|
15
|
+
} from "../router-versions.js";
|
|
16
|
+
import { _getRequestContext } from "./request-context.js";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The build's table. Module state only so the testing primitive
|
|
20
|
+
* (testing/build-versions.ts) can install one where the build's is absent;
|
|
21
|
+
* production never reassigns it.
|
|
22
|
+
*/
|
|
23
|
+
let table: RouterVersionsTable | undefined = ROUTER_VERSIONS;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The versions a router serves with, in order:
|
|
27
|
+
*
|
|
28
|
+
* 1. `override`, a consumer-set `version` (createRouter or createRSCHandler):
|
|
29
|
+
* that exact value for both.
|
|
30
|
+
* 2. The router's entry in the build table, else the whole-build entry.
|
|
31
|
+
* 3. `VERSION` for both: the dev stamp, bumped on every RSC module edit.
|
|
32
|
+
*/
|
|
33
|
+
export function resolveRouterVersions(
|
|
34
|
+
routerId: string | undefined,
|
|
35
|
+
override?: string,
|
|
36
|
+
): RouterVersions {
|
|
37
|
+
return (
|
|
38
|
+
resolveVersionsFrom(table, routerId, override) ?? uniformVersions(VERSION)
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** The table gives some router a pair of its own. */
|
|
43
|
+
function hasRouterVersions(): boolean {
|
|
44
|
+
if (!table) return false;
|
|
45
|
+
const pairs = new Set(
|
|
46
|
+
Object.values(table).map(([data, document]) => `${data}\0${document}`),
|
|
47
|
+
);
|
|
48
|
+
return pairs.size > 1;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
let warnedOutsideRequest = false;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The versions of the router serving the current request, for a cache store
|
|
55
|
+
* building a key. A store operation with no request context (a detached task
|
|
56
|
+
* that lost the ALS) gets the whole-build versions: it misses the request's
|
|
57
|
+
* entries instead of reading another version's. When routers have versions of
|
|
58
|
+
* their own that is a write no router reads back, so it is logged, once per
|
|
59
|
+
* process: `ctx.waitUntil()` re-enters the request context for every task it
|
|
60
|
+
* runs (server/request-context.ts), and this line in a production log means
|
|
61
|
+
* some other path lost it.
|
|
62
|
+
*
|
|
63
|
+
* Public from `@rangojs/router/cache`, for a custom persistent store to key
|
|
64
|
+
* the way the built-in ones do. Prefix cached RSC data (segment entries, items) with
|
|
65
|
+
* `data` and stored HTML or responses (shells, document responses) with
|
|
66
|
+
* `document`, and leave tag-invalidation records unversioned; an empty string
|
|
67
|
+
* means "no version" (tests). Call it per operation, inside the request, not
|
|
68
|
+
* in the store's constructor: the cache factory runs before the request
|
|
69
|
+
* context exists.
|
|
70
|
+
*/
|
|
71
|
+
export function getCacheVersions(): RouterVersions {
|
|
72
|
+
const versions = _getRequestContext()?._versions;
|
|
73
|
+
if (versions) return versions;
|
|
74
|
+
if (!warnedOutsideRequest && hasRouterVersions()) {
|
|
75
|
+
warnedOutsideRequest = true;
|
|
76
|
+
console.warn(
|
|
77
|
+
"[rango] A cache key was built outside a request, so it carries the whole-build cache " +
|
|
78
|
+
"version instead of a router's. This build has per-router versions: an entry written " +
|
|
79
|
+
"under that key is not read by a router with its own version, and an entry that router " +
|
|
80
|
+
"wrote is not found from here. A store operation ran in a task that lost the request's " +
|
|
81
|
+
"async context. Logged once per process.",
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
return resolveRouterVersions(undefined);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Which of the serving router's versions a store key carries; `null`: none. */
|
|
88
|
+
export type KeyVersion = keyof RouterVersions | null;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* The `v/{version}/` prefix of a persistent store key, or "" for an
|
|
92
|
+
* unversioned one. A store-level `version` is used for every versioned kind;
|
|
93
|
+
* otherwise the version is the serving router's, read per operation because
|
|
94
|
+
* the cache factory builds the store before the request context exists.
|
|
95
|
+
*/
|
|
96
|
+
export function versionKeyPrefix(
|
|
97
|
+
storeVersion: string | undefined,
|
|
98
|
+
kind: KeyVersion,
|
|
99
|
+
): string {
|
|
100
|
+
if (kind === null) return "";
|
|
101
|
+
const version = storeVersion ?? getCacheVersions()[kind];
|
|
102
|
+
return version ? `v/${version}/` : "";
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* @internal Install a table, or restore the build's with `undefined`. A
|
|
107
|
+
* request handler resolves its router's versions once, when it is created, so
|
|
108
|
+
* a test that swaps the table (a "deploy") needs new handlers.
|
|
109
|
+
*/
|
|
110
|
+
export function installRouterVersionsTable(
|
|
111
|
+
next: RouterVersionsTable | undefined,
|
|
112
|
+
): void {
|
|
113
|
+
table = next ?? ROUTER_VERSIONS;
|
|
114
|
+
warnedOutsideRequest = false;
|
|
115
|
+
}
|