@rangojs/router 0.27.0 → 0.28.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 +1 -1
- package/dist/types/__internal.d.ts +7 -1
- package/dist/types/browser/event-controller.d.ts +2 -1
- package/dist/types/browser/history-state.d.ts +3 -9
- package/dist/types/browser/navigation-store.d.ts +8 -6
- package/dist/types/browser/react/filter-segment-order.d.ts +2 -2
- package/dist/types/browser/segment-reconciler.d.ts +6 -4
- package/dist/types/browser/types.d.ts +2 -1
- package/dist/types/browser/wire-protocol.d.ts +25 -0
- package/dist/types/cache/cache-key-utils.d.ts +11 -5
- package/dist/types/cache/cache-scope.d.ts +34 -22
- package/dist/types/cache/cf/cf-cache-constants.d.ts +2 -2
- package/dist/types/cache/cf/cf-cache-store.d.ts +47 -65
- package/dist/types/cache/cf/cf-kv-utils.d.ts +1 -1
- package/dist/types/cache/handle-snapshot.d.ts +9 -4
- package/dist/types/cache/segment-codec.d.ts +14 -0
- package/dist/types/cache/shell-snapshot.d.ts +1 -1
- package/dist/types/cache/tag-invalidation.d.ts +10 -0
- package/dist/types/cache/taint.d.ts +5 -3
- package/dist/types/cache/types.d.ts +7 -3
- package/dist/types/cache/vercel/vercel-cache-store.d.ts +8 -6
- package/dist/types/prefetch-markers.d.ts +5 -14
- package/dist/types/prerender/store.d.ts +31 -0
- package/dist/types/prerender/warm-request.d.ts +3 -3
- package/dist/types/prerender.d.ts +2 -2
- package/dist/types/route-name.d.ts +5 -0
- package/dist/types/router/error-handling.d.ts +4 -4
- package/dist/types/router/instrument.d.ts +4 -3
- package/dist/types/router/intercept-resolution.d.ts +25 -9
- package/dist/types/router/match-context.d.ts +4 -11
- package/dist/types/router/match-handlers.d.ts +2 -6
- package/dist/types/router/match-middleware/background-revalidation.d.ts +10 -20
- package/dist/types/router/match-middleware/cache-lookup.d.ts +34 -86
- package/dist/types/router/match-middleware/segment-resolution.d.ts +8 -6
- package/dist/types/router/prerender-match.d.ts +21 -6
- package/dist/types/router/preview-match.d.ts +2 -7
- package/dist/types/router/request-classification.d.ts +5 -0
- package/dist/types/router/router-context.d.ts +7 -46
- package/dist/types/router/router-interfaces.d.ts +8 -14
- package/dist/types/router/segment-resolution/loader-cache.d.ts +3 -3
- package/dist/types/router/segment-resolution/loader-mask.d.ts +4 -4
- package/dist/types/router/segment-resolution/prefetch-deferral.d.ts +20 -18
- package/dist/types/router/segment-resolution/resolution-pass.d.ts +93 -0
- package/dist/types/router/segment-resolution/revalidation.d.ts +82 -31
- package/dist/types/router/segment-resolution.d.ts +1 -2
- package/dist/types/router/segment-wrappers.d.ts +11 -48
- package/dist/types/router/telemetry.d.ts +2 -0
- package/dist/types/router/types.d.ts +10 -0
- package/dist/types/rsc/full-payload.d.ts +2 -2
- package/dist/types/rsc/handler-context.d.ts +6 -6
- package/dist/types/rsc/json-route-result.d.ts +5 -9
- package/dist/types/rsc/request-stages.d.ts +203 -0
- package/dist/types/rsc/response-cache-serve.d.ts +7 -12
- package/dist/types/rsc/response-route-handler.d.ts +2 -2
- package/dist/types/rsc/routine-plan.d.ts +1 -1
- package/dist/types/rsc/server-action.d.ts +2 -2
- package/dist/types/rsc/shell-capture-constants.d.ts +1 -1
- package/dist/types/rsc/shell-capture.d.ts +132 -15
- package/dist/types/rsc/shell-serve.d.ts +37 -12
- package/dist/types/server/context.d.ts +9 -8
- package/dist/types/server/handle-store.d.ts +16 -0
- package/dist/types/server/render-pass.d.ts +72 -0
- package/dist/types/server/request-context.d.ts +24 -104
- package/dist/types/server/rewrite-trail.d.ts +2 -2
- package/dist/types/testing/dispatch.d.ts +35 -18
- package/dist/types/types/cache-types.d.ts +6 -3
- package/dist/types/types/error-types.d.ts +9 -1
- package/dist/types/types/handler-context.d.ts +9 -1
- package/dist/types/types/segments.d.ts +1 -1
- package/dist/types/vite/discovery/build-discovery-phase.d.ts +40 -0
- package/dist/types/vite/discovery/build-env.d.ts +22 -0
- package/dist/types/vite/discovery/bundle-scan-phase.d.ts +12 -0
- package/dist/types/vite/discovery/dev-prerender-cache.d.ts +3 -2
- package/dist/types/vite/discovery/dev-server-phase.d.ts +26 -0
- package/dist/types/vite/discovery/discovery-errors.d.ts +1 -1
- package/dist/types/vite/discovery/state.d.ts +12 -0
- package/dist/types/vite/plugins/version-plugin.d.ts +1 -1
- package/dist/types/vite/plugins/virtual-entries.d.ts +1 -1
- package/dist/types/vite/router-discovery.d.ts +8 -47
- package/dist/types/vite/temp-rsc-server.d.ts +39 -0
- package/dist/types/vite/utils/prerender-utils.d.ts +9 -0
- package/dist/types/wire-params.d.ts +34 -0
- package/dist/vite/index.js +3809 -3710
- package/package.json +1 -1
- package/skills/cache-guide/SKILL.md +8 -5
- package/skills/caching/SKILL.md +37 -18
- package/skills/document-cache/SKILL.md +13 -1
- package/skills/handler-use/SKILL.md +1 -1
- package/skills/intercept/SKILL.md +17 -7
- package/skills/middleware/SKILL.md +18 -0
- package/skills/ppr/SKILL.md +18 -3
- package/skills/prerender/SKILL.md +39 -15
- package/skills/rango/SKILL.md +5 -1
- package/skills/server-actions/SKILL.md +8 -1
- package/skills/testing/response-routes.md +6 -4
- package/skills/use-cache/SKILL.md +46 -8
- package/src/__internal.ts +7 -1
- package/src/browser/connection-warmup.ts +3 -1
- package/src/browser/event-controller.ts +5 -3
- package/src/browser/history-state.ts +6 -12
- package/src/browser/navigation-bridge.ts +14 -13
- package/src/browser/navigation-client.ts +18 -25
- package/src/browser/navigation-store.ts +25 -27
- package/src/browser/navigation-transaction.ts +4 -1
- package/src/browser/prefetch/cache.ts +2 -1
- package/src/browser/prefetch/fetch.ts +8 -16
- package/src/browser/prefetch/queue.ts +4 -4
- package/src/browser/react/NavigationProvider.tsx +2 -1
- package/src/browser/react/filter-segment-order.ts +2 -2
- package/src/browser/rsc-router.tsx +1 -0
- package/src/browser/segment-reconciler.ts +66 -53
- package/src/browser/server-action-bridge.ts +50 -57
- package/src/browser/types.ts +2 -1
- package/src/browser/wire-protocol.ts +41 -0
- package/src/cache/cache-key-utils.ts +11 -5
- package/src/cache/cache-runtime.ts +110 -50
- package/src/cache/cache-scope.ts +110 -64
- package/src/cache/cf/cf-cache-constants.ts +2 -2
- package/src/cache/cf/cf-cache-store.ts +486 -874
- package/src/cache/cf/cf-kv-utils.ts +1 -1
- package/src/cache/document-cache.ts +34 -13
- package/src/cache/handle-snapshot.ts +19 -7
- package/src/cache/segment-codec.ts +55 -0
- package/src/cache/shell-snapshot.ts +2 -2
- package/src/cache/tag-invalidation.ts +21 -2
- package/src/cache/taint.ts +5 -3
- package/src/cache/types.ts +7 -3
- package/src/cache/vercel/vercel-cache-store.ts +243 -310
- package/src/handles/pushed-by.ts +1 -1
- package/src/prefetch-markers.ts +5 -16
- package/src/prerender/store.ts +76 -0
- package/src/prerender/warm-request.ts +8 -4
- package/src/prerender.ts +2 -2
- package/src/route-name.ts +8 -0
- package/src/router/error-handling.ts +4 -4
- package/src/router/instrument.ts +4 -3
- package/src/router/intercept-resolution.ts +77 -75
- package/src/router/loader-resolution.ts +5 -4
- package/src/router/match-api.ts +4 -5
- package/src/router/match-context.ts +20 -12
- package/src/router/match-handlers.ts +8 -20
- package/src/router/match-middleware/background-revalidation.ts +41 -53
- package/src/router/match-middleware/cache-lookup.ts +675 -726
- package/src/router/match-middleware/cache-store.ts +4 -8
- package/src/router/match-middleware/intercept-resolution.ts +3 -23
- package/src/router/match-middleware/segment-resolution.ts +34 -61
- package/src/router/middleware.ts +69 -11
- package/src/router/navigation-snapshot.ts +4 -4
- package/src/router/prerender-match.ts +100 -44
- package/src/router/preview-match.ts +6 -41
- package/src/router/request-classification.ts +13 -7
- package/src/router/route-snapshot.ts +2 -5
- package/src/router/router-context.ts +10 -95
- package/src/router/router-interfaces.ts +8 -14
- package/src/router/segment-resolution/loader-cache.ts +14 -9
- package/src/router/segment-resolution/loader-mask.ts +5 -5
- package/src/router/segment-resolution/prefetch-deferral.ts +30 -27
- package/src/router/segment-resolution/resolution-pass.ts +137 -0
- package/src/router/segment-resolution/revalidation.ts +897 -776
- package/src/router/segment-resolution.ts +4 -13
- package/src/router/segment-wrappers.ts +51 -269
- package/src/router/telemetry.ts +5 -0
- package/src/router/types.ts +10 -0
- package/src/router.ts +12 -13
- package/src/rsc/full-payload.ts +6 -5
- package/src/rsc/handler-context.ts +8 -14
- package/src/rsc/handler.ts +126 -507
- package/src/rsc/json-route-result.ts +5 -9
- package/src/rsc/loader-fetch.ts +6 -5
- package/src/rsc/progressive-enhancement.ts +5 -0
- package/src/rsc/request-stages.ts +757 -0
- package/src/rsc/response-cache-serve.ts +10 -14
- package/src/rsc/response-route-handler.ts +13 -5
- package/src/rsc/rewrite-passes.ts +2 -1
- package/src/rsc/routine-plan.ts +1 -1
- package/src/rsc/rsc-rendering.ts +164 -349
- package/src/rsc/server-action.ts +87 -113
- package/src/rsc/shell-capture-constants.ts +1 -1
- package/src/rsc/shell-capture.ts +212 -169
- package/src/rsc/shell-serve.ts +121 -18
- package/src/rsc/ssr-setup.ts +5 -4
- package/src/segment-system.tsx +3 -3
- package/src/server/context.ts +22 -25
- package/src/server/handle-store.ts +55 -0
- package/src/server/render-pass.ts +291 -0
- package/src/server/request-context.ts +26 -115
- package/src/server/rewrite-trail.ts +6 -4
- package/src/ssr/index.tsx +1 -1
- package/src/testing/dispatch.ts +223 -710
- package/src/testing/e2e/page-helpers.ts +2 -2
- package/src/testing/serve-shell-request.ts +23 -36
- package/src/types/cache-types.ts +6 -3
- package/src/types/error-types.ts +9 -1
- package/src/types/handler-context.ts +12 -1
- package/src/types/segments.ts +1 -1
- package/src/vite/discovery/build-discovery-phase.ts +204 -0
- package/src/vite/discovery/build-env.ts +148 -0
- package/src/vite/discovery/bundle-scan-phase.ts +128 -0
- package/src/vite/discovery/dev-prerender-cache.ts +8 -3
- package/src/vite/discovery/dev-server-phase.ts +1776 -0
- package/src/vite/discovery/discover-routers.ts +1 -1
- package/src/vite/discovery/discovery-errors.ts +1 -1
- package/src/vite/discovery/prerender-collection.ts +24 -39
- package/src/vite/discovery/state.ts +15 -0
- package/src/vite/plugins/version-plugin.ts +1 -1
- package/src/vite/plugins/virtual-entries.ts +1 -1
- package/src/vite/router-discovery.ts +29 -2428
- package/src/vite/temp-rsc-server.ts +223 -0
- package/src/vite/utils/prerender-utils.ts +47 -0
- package/src/wire-params.ts +35 -0
- package/dist/types/router/segment-resolution/fresh.d.ts +0 -72
- package/src/router/segment-resolution/fresh.ts +0 -945
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
* |
|
|
37
37
|
* v
|
|
38
38
|
* +---------------------------+
|
|
39
|
-
* |
|
|
39
|
+
* | FRESH segment pass | Fresh resolution (no revalidation)
|
|
40
40
|
* | + resolveIntercepts() | Ensures complete components
|
|
41
41
|
* +---------------------------+
|
|
42
42
|
* |
|
|
@@ -94,14 +94,17 @@
|
|
|
94
94
|
* FRESH RESOLUTION (NO REVALIDATION)
|
|
95
95
|
* ===================================
|
|
96
96
|
*
|
|
97
|
-
* Both full and partial requests
|
|
97
|
+
* Both full and partial requests resolve with a FRESH pass (without
|
|
98
98
|
* revalidation logic) to ensure all segments have complete components.
|
|
99
99
|
* Using revalidation-aware resolution would produce null components
|
|
100
|
-
* for skipped segments, which would corrupt the cache entry.
|
|
100
|
+
* for skipped segments, which would corrupt the cache entry. Under an
|
|
101
|
+
* intercept the walk still skips the intercepted route's entry, as the MISS
|
|
102
|
+
* does: an intercept: record never holds the route's page.
|
|
101
103
|
*/
|
|
102
104
|
import type { ResolvedSegment } from "../../types.js";
|
|
103
105
|
import type { MatchContext, MatchPipelineState } from "../match-context.js";
|
|
104
106
|
import { getRouterContext, type RouterContext } from "../router-context.js";
|
|
107
|
+
import { interceptRecordKey } from "../intercept-resolution.js";
|
|
105
108
|
import type { CacheScope } from "../../cache/cache-scope.js";
|
|
106
109
|
import type { GeneratorMiddleware } from "./cache-lookup.js";
|
|
107
110
|
import { debugLog, debugWarn, getOrCreateRequestId } from "../logging.js";
|
|
@@ -109,12 +112,16 @@ import { INTERNAL_RANGO_DEBUG } from "../../internal-debug.js";
|
|
|
109
112
|
import { getContext } from "../../server/context.js";
|
|
110
113
|
import { executionStart } from "../../cache/tag-invalidation.js";
|
|
111
114
|
import {
|
|
112
|
-
bindRes,
|
|
113
115
|
createRequestContext,
|
|
114
116
|
runWithRequestContext,
|
|
115
117
|
type RequestContext,
|
|
116
118
|
} from "../../server/request-context.js";
|
|
119
|
+
import { deriveRenderPass } from "../../server/render-pass.js";
|
|
117
120
|
import { recordUse } from "../segment-resolution/prefetch-deferral.js";
|
|
121
|
+
import {
|
|
122
|
+
freshPassInput,
|
|
123
|
+
heldNothingPassInput,
|
|
124
|
+
} from "../segment-resolution/resolution-pass.js";
|
|
118
125
|
|
|
119
126
|
/**
|
|
120
127
|
* Re-render a cached route in the background and write it with
|
|
@@ -129,23 +136,11 @@ import { recordUse } from "../segment-resolution/prefetch-deferral.js";
|
|
|
129
136
|
* MAX_REVALIDATION_INTERVAL, as after a refresh that throws.
|
|
130
137
|
*
|
|
131
138
|
* Runs on a DERIVED request context that owns the per-render state the
|
|
132
|
-
* foreground reads while it is still producing the page
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
* cache-scope.ts), so a swap sent live pushes into this render.
|
|
138
|
-
* setupLoaderAccess binds the store at setup, so it runs inside the
|
|
139
|
-
* derived context too.
|
|
140
|
-
* - _metricsStore: undefined, and the DSL store below has `metrics` unset
|
|
141
|
-
* (track() reads that one), so nothing lands on the foreground's perf
|
|
142
|
-
* timeline. ctx.Store.run closes over ctx.Store, so the derived store
|
|
143
|
-
* needs its own run.
|
|
144
|
-
* - response writes (headers, cookies, status, onResponse callbacks) go to
|
|
145
|
-
* a throwaway context (whose status gates the write, above) and are
|
|
146
|
-
* dropped: a layout above the cache() boundary is outside the header
|
|
147
|
-
* guard and an error boundary sets a status, so they would otherwise
|
|
148
|
-
* reach the live response.
|
|
139
|
+
* foreground reads while it is still producing the page:
|
|
140
|
+
* RENDER_PASS_FIELDS["background-revalidation"] (server/render-pass.ts) lists
|
|
141
|
+
* each field and why. The DSL store below has `metrics` unset too (track()
|
|
142
|
+
* reads that one), so nothing lands on the foreground's perf timeline;
|
|
143
|
+
* ctx.Store.run closes over ctx.Store, so the derived store needs its own run.
|
|
149
144
|
* runWithRequestContext also re-establishes the request ALS, which a waitUntil
|
|
150
145
|
* task on workerd loses; the DSL store is a different ALS (build context).
|
|
151
146
|
*/
|
|
@@ -157,8 +152,7 @@ export async function rerenderAndCacheRoute<TEnv>(
|
|
|
157
152
|
): Promise<number> {
|
|
158
153
|
const start = executionStart();
|
|
159
154
|
const handleStore = routerCtx.createHandleStore();
|
|
160
|
-
// Response writes land in a throwaway context nothing merges or drains.
|
|
161
|
-
// mutators are closures over its own stub, and they keep the same guards.
|
|
155
|
+
// Response writes land in a throwaway context nothing merges or drains.
|
|
162
156
|
const sink = createRequestContext({
|
|
163
157
|
env: ctx.env,
|
|
164
158
|
request: ctx.request,
|
|
@@ -166,26 +160,10 @@ export async function rerenderAndCacheRoute<TEnv>(
|
|
|
166
160
|
variables: {},
|
|
167
161
|
themeConfig: requestCtx._themeConfig,
|
|
168
162
|
});
|
|
169
|
-
const renderCtx
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
_metricsStore: undefined,
|
|
174
|
-
_renderErrors: [],
|
|
175
|
-
_recoveredHandlerErrors: undefined,
|
|
176
|
-
_onResponseCallbacks: [],
|
|
177
|
-
header: sink.header,
|
|
178
|
-
setCookie: sink.setCookie,
|
|
179
|
-
deleteCookie: sink.deleteCookie,
|
|
180
|
-
setStatus: sink.setStatus,
|
|
181
|
-
_setStatus: sink._setStatus,
|
|
182
|
-
setTheme: sink.setTheme,
|
|
183
|
-
_rotateStateCookie: sink._rotateStateCookie,
|
|
184
|
-
_setKeepCacheDirective: sink._setKeepCacheDirective,
|
|
185
|
-
},
|
|
186
|
-
);
|
|
187
|
-
// ctx.res reads the sink's stub, not the live request's.
|
|
188
|
-
bindRes(renderCtx, () => sink.res);
|
|
163
|
+
const renderCtx = deriveRenderPass(requestCtx, "background-revalidation", {
|
|
164
|
+
handleStore,
|
|
165
|
+
sink,
|
|
166
|
+
});
|
|
189
167
|
const store = Object.assign(Object.create(ctx.Store), { metrics: undefined });
|
|
190
168
|
const runInStore = <T>(fn: () => T): T =>
|
|
191
169
|
getContext().runWithStore(
|
|
@@ -210,26 +188,36 @@ export async function rerenderAndCacheRoute<TEnv>(
|
|
|
210
188
|
const loaderPromises = new Map<string, Promise<any>>();
|
|
211
189
|
routerCtx.setupLoaderAccess(handlerContext, loaderPromises);
|
|
212
190
|
|
|
213
|
-
const segments = await runInStore(() =>
|
|
191
|
+
const { segments } = await runInStore(() =>
|
|
214
192
|
routerCtx.resolveAllSegments(
|
|
193
|
+
freshPassInput(handlerContext, ctx.routeKey, ctx.matched.params, {
|
|
194
|
+
skipLoaders: true,
|
|
195
|
+
partialRequest: !ctx.isFullMatch,
|
|
196
|
+
}),
|
|
215
197
|
ctx.entries,
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
198
|
+
// Under an intercept the route's own entry is skipped, as on a MISS.
|
|
199
|
+
{
|
|
200
|
+
interceptResult: ctx.interceptResult,
|
|
201
|
+
localRouteName: ctx.localRouteName,
|
|
202
|
+
pathname: handlerContext.pathname,
|
|
203
|
+
},
|
|
221
204
|
),
|
|
222
205
|
);
|
|
223
206
|
if (ctx.interceptResult) {
|
|
224
207
|
segments.push(
|
|
225
208
|
...(await runInStore(() =>
|
|
226
209
|
routerCtx.resolveInterceptEntry(
|
|
210
|
+
// Nothing held: render fresh. Its loaders are skipped as the
|
|
211
|
+
// route's are: the record drops them.
|
|
212
|
+
heldNothingPassInput(
|
|
213
|
+
handlerContext,
|
|
214
|
+
ctx.interceptResult!.intercept.routeName,
|
|
215
|
+
ctx.matched.params,
|
|
216
|
+
{ skipLoaders: true },
|
|
217
|
+
),
|
|
227
218
|
ctx.interceptResult!.intercept,
|
|
228
219
|
ctx.interceptResult!.entry,
|
|
229
|
-
ctx.matched.params,
|
|
230
|
-
handlerContext,
|
|
231
220
|
true, // belongsToRoute
|
|
232
|
-
undefined, // no revalidationContext: render fresh
|
|
233
221
|
// A handler error rejects, so the failure is never cached.
|
|
234
222
|
{ background: true },
|
|
235
223
|
),
|
|
@@ -251,7 +239,7 @@ export async function rerenderAndCacheRoute<TEnv>(
|
|
|
251
239
|
ctx.pathname,
|
|
252
240
|
ctx.matched.params,
|
|
253
241
|
segments,
|
|
254
|
-
ctx.
|
|
242
|
+
interceptRecordKey(ctx.interceptResult),
|
|
255
243
|
start,
|
|
256
244
|
);
|
|
257
245
|
return segments.length;
|