@rangojs/router 0.0.0-experimental.0f44aca1
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 +899 -0
- package/dist/bin/rango.js +1601 -0
- package/dist/vite/index.js +5214 -0
- package/package.json +176 -0
- package/skills/breadcrumbs/SKILL.md +250 -0
- package/skills/cache-guide/SKILL.md +262 -0
- package/skills/caching/SKILL.md +220 -0
- package/skills/composability/SKILL.md +172 -0
- package/skills/debug-manifest/SKILL.md +112 -0
- package/skills/document-cache/SKILL.md +182 -0
- package/skills/fonts/SKILL.md +167 -0
- package/skills/hooks/SKILL.md +704 -0
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +313 -0
- package/skills/layout/SKILL.md +310 -0
- package/skills/links/SKILL.md +239 -0
- package/skills/loader/SKILL.md +596 -0
- package/skills/middleware/SKILL.md +339 -0
- package/skills/mime-routes/SKILL.md +128 -0
- package/skills/parallel/SKILL.md +305 -0
- package/skills/prerender/SKILL.md +643 -0
- package/skills/rango/SKILL.md +118 -0
- package/skills/response-routes/SKILL.md +411 -0
- package/skills/route/SKILL.md +385 -0
- package/skills/router-setup/SKILL.md +439 -0
- package/skills/tailwind/SKILL.md +129 -0
- package/skills/theme/SKILL.md +79 -0
- package/skills/typesafety/SKILL.md +623 -0
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +273 -0
- 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 +899 -0
- package/src/browser/history-state.ts +80 -0
- package/src/browser/index.ts +18 -0
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +141 -0
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +134 -0
- package/src/browser/navigation-bridge.ts +645 -0
- package/src/browser/navigation-client.ts +215 -0
- package/src/browser/navigation-store.ts +806 -0
- package/src/browser/navigation-transaction.ts +295 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +550 -0
- 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 +360 -0
- package/src/browser/react/NavigationProvider.tsx +386 -0
- package/src/browser/react/ScrollRestoration.tsx +94 -0
- package/src/browser/react/context.ts +59 -0
- package/src/browser/react/filter-segment-order.ts +11 -0
- package/src/browser/react/index.ts +52 -0
- package/src/browser/react/location-state-shared.ts +162 -0
- package/src/browser/react/location-state.ts +107 -0
- package/src/browser/react/mount-context.ts +37 -0
- 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 +218 -0
- package/src/browser/react/use-client-cache.ts +58 -0
- package/src/browser/react/use-handle.ts +162 -0
- package/src/browser/react/use-href.tsx +40 -0
- package/src/browser/react/use-link-status.ts +135 -0
- package/src/browser/react/use-mount.ts +31 -0
- package/src/browser/react/use-navigation.ts +99 -0
- 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 +171 -0
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +431 -0
- package/src/browser/scroll-restoration.ts +400 -0
- package/src/browser/segment-reconciler.ts +216 -0
- package/src/browser/segment-structure-assert.ts +83 -0
- package/src/browser/server-action-bridge.ts +667 -0
- package/src/browser/shallow.ts +40 -0
- package/src/browser/types.ts +538 -0
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +438 -0
- package/src/build/generate-route-types.ts +36 -0
- package/src/build/index.ts +35 -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 +382 -0
- package/src/cache/cf/cf-cache-store.ts +540 -0
- package/src/cache/cf/index.ts +25 -0
- package/src/cache/document-cache.ts +369 -0
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +43 -0
- package/src/cache/memory-segment-store.ts +328 -0
- 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 +342 -0
- package/src/client.rsc.tsx +85 -0
- package/src/client.tsx +601 -0
- package/src/component-utils.ts +76 -0
- package/src/components/DefaultDocument.tsx +27 -0
- package/src/context-var.ts +86 -0
- package/src/debug.ts +243 -0
- package/src/default-error-boundary.tsx +88 -0
- package/src/deps/browser.ts +8 -0
- package/src/deps/html-stream-client.ts +2 -0
- package/src/deps/html-stream-server.ts +2 -0
- package/src/deps/rsc.ts +10 -0
- package/src/deps/ssr.ts +2 -0
- package/src/errors.ts +365 -0
- package/src/handle.ts +135 -0
- package/src/handles/MetaTags.tsx +246 -0
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +7 -0
- package/src/handles/meta.ts +264 -0
- package/src/host/cookie-handler.ts +165 -0
- package/src/host/errors.ts +97 -0
- package/src/host/index.ts +53 -0
- package/src/host/pattern-matcher.ts +214 -0
- package/src/host/router.ts +352 -0
- package/src/host/testing.ts +79 -0
- package/src/host/types.ts +146 -0
- package/src/host/utils.ts +25 -0
- package/src/href-client.ts +222 -0
- package/src/index.rsc.ts +233 -0
- package/src/index.ts +277 -0
- package/src/internal-debug.ts +11 -0
- package/src/loader.rsc.ts +89 -0
- package/src/loader.ts +64 -0
- package/src/network-error-thrower.tsx +23 -0
- package/src/outlet-context.ts +15 -0
- 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 +289 -0
- package/src/route-content-wrapper.tsx +196 -0
- 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 -0
- package/src/route-map-builder.ts +275 -0
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +259 -0
- package/src/router/content-negotiation.ts +116 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +287 -0
- package/src/router/find-match.ts +158 -0
- package/src/router/handler-context.ts +451 -0
- package/src/router/intercept-resolution.ts +395 -0
- package/src/router/lazy-includes.ts +234 -0
- package/src/router/loader-resolution.ts +420 -0
- package/src/router/logging.ts +248 -0
- package/src/router/manifest.ts +267 -0
- package/src/router/match-api.ts +620 -0
- package/src/router/match-context.ts +266 -0
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +223 -0
- package/src/router/match-middleware/cache-lookup.ts +634 -0
- package/src/router/match-middleware/cache-store.ts +295 -0
- package/src/router/match-middleware/index.ts +81 -0
- package/src/router/match-middleware/intercept-resolution.ts +306 -0
- package/src/router/match-middleware/segment-resolution.ts +192 -0
- package/src/router/match-pipelines.ts +179 -0
- package/src/router/match-result.ts +219 -0
- package/src/router/metrics.ts +282 -0
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +222 -0
- package/src/router/middleware.ts +748 -0
- package/src/router/pattern-matching.ts +563 -0
- package/src/router/prerender-match.ts +402 -0
- package/src/router/preview-match.ts +170 -0
- package/src/router/revalidation.ts +289 -0
- package/src/router/router-context.ts +316 -0
- 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 +1239 -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 +170 -0
- package/src/router.ts +1002 -0
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +1089 -0
- package/src/rsc/helpers.ts +198 -0
- package/src/rsc/index.ts +36 -0
- package/src/rsc/loader-fetch.ts +209 -0
- package/src/rsc/manifest-init.ts +86 -0
- package/src/rsc/nonce.ts +32 -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 +263 -0
- package/src/search-params.ts +230 -0
- package/src/segment-system.tsx +454 -0
- package/src/server/context.ts +591 -0
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +308 -0
- package/src/server/loader-registry.ts +133 -0
- package/src/server/request-context.ts +914 -0
- package/src/server/root-layout.tsx +10 -0
- package/src/server/tsconfig.json +14 -0
- package/src/server.ts +51 -0
- package/src/ssr/index.tsx +365 -0
- package/src/static-handler.ts +114 -0
- package/src/theme/ThemeProvider.tsx +297 -0
- package/src/theme/ThemeScript.tsx +61 -0
- package/src/theme/constants.ts +62 -0
- package/src/theme/index.ts +48 -0
- package/src/theme/theme-context.ts +44 -0
- package/src/theme/theme-script.ts +155 -0
- package/src/theme/types.ts +182 -0
- package/src/theme/use-theme.ts +44 -0
- 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 -0
- 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 -0
- package/src/use-loader.tsx +354 -0
- 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 +16 -0
- 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/plugins/expose-action-id.ts +365 -0
- 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/plugins/version.d.ts +12 -0
- package/src/vite/plugins/virtual-entries.ts +123 -0
- 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/utils/package-resolution.ts +121 -0
- package/src/vite/utils/prerender-utils.ts +189 -0
- package/src/vite/utils/shared-utils.ts +169 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background Revalidation Middleware
|
|
3
|
+
*
|
|
4
|
+
* Implements SWR (stale-while-revalidate) pattern.
|
|
5
|
+
* Triggers background refresh when cached data is stale.
|
|
6
|
+
*
|
|
7
|
+
* FLOW DIAGRAM
|
|
8
|
+
* ============
|
|
9
|
+
*
|
|
10
|
+
* source (from cache-store)
|
|
11
|
+
* |
|
|
12
|
+
* v
|
|
13
|
+
* +---------------------------+
|
|
14
|
+
* | yield* source | Pure pass-through
|
|
15
|
+
* | (no modifications) |
|
|
16
|
+
* +---------------------------+
|
|
17
|
+
* |
|
|
18
|
+
* v
|
|
19
|
+
* +---------------------+
|
|
20
|
+
* | Should revalidate? |
|
|
21
|
+
* | - shouldRevalidate |──no───> return
|
|
22
|
+
* | - cacheHit |
|
|
23
|
+
* | - cacheScope |
|
|
24
|
+
* +---------------------+
|
|
25
|
+
* | yes
|
|
26
|
+
* v
|
|
27
|
+
* +---------------------------+
|
|
28
|
+
* | requestCtx.waitUntil() | Non-blocking background task
|
|
29
|
+
* +---------------------------+
|
|
30
|
+
* |
|
|
31
|
+
* v (async, doesn't block response)
|
|
32
|
+
* +---------------------------+
|
|
33
|
+
* | Create fresh context | Fresh handleStore, handlerContext,
|
|
34
|
+
* | (full isolation) | and loaderPromises map
|
|
35
|
+
* +---------------------------+
|
|
36
|
+
* |
|
|
37
|
+
* v
|
|
38
|
+
* +---------------------------+
|
|
39
|
+
* | resolveAllSegments() | Fresh resolution (no revalidation)
|
|
40
|
+
* | + resolveIntercepts() | Ensures complete components
|
|
41
|
+
* +---------------------------+
|
|
42
|
+
* |
|
|
43
|
+
* v
|
|
44
|
+
* +---------------------------+
|
|
45
|
+
* | cacheScope.cacheRoute() | Update cache with fresh data
|
|
46
|
+
* +---------------------------+
|
|
47
|
+
*
|
|
48
|
+
*
|
|
49
|
+
* SWR PATTERN
|
|
50
|
+
* ===========
|
|
51
|
+
*
|
|
52
|
+
* Stale-While-Revalidate provides fast responses with eventual consistency:
|
|
53
|
+
*
|
|
54
|
+
* Timeline:
|
|
55
|
+
* ---------
|
|
56
|
+
* T0: Request arrives
|
|
57
|
+
* T1: Cache lookup finds stale entry
|
|
58
|
+
* T2: Return stale data immediately (fast!)
|
|
59
|
+
* T3: Response sent to client
|
|
60
|
+
* T4: waitUntil() triggers background revalidation
|
|
61
|
+
* T5: Fresh data resolved
|
|
62
|
+
* T6: Cache updated with fresh data
|
|
63
|
+
* T7: Next request gets fresh data from cache
|
|
64
|
+
*
|
|
65
|
+
* Benefits:
|
|
66
|
+
* - Fast initial response (cached data)
|
|
67
|
+
* - Eventually consistent (background refresh)
|
|
68
|
+
* - No blocking on revalidation
|
|
69
|
+
*
|
|
70
|
+
*
|
|
71
|
+
* WHEN IS CACHE STALE?
|
|
72
|
+
* ====================
|
|
73
|
+
*
|
|
74
|
+
* The cache-lookup middleware sets state.shouldRevalidate based on:
|
|
75
|
+
* - TTL (time-to-live) expiration
|
|
76
|
+
* - Cache entry metadata
|
|
77
|
+
* - Configured staleness rules
|
|
78
|
+
*
|
|
79
|
+
* This middleware only acts on the flag, it doesn't determine staleness.
|
|
80
|
+
*
|
|
81
|
+
*
|
|
82
|
+
* ISOLATION FROM RESPONSE
|
|
83
|
+
* =======================
|
|
84
|
+
*
|
|
85
|
+
* Background revalidation creates fully isolated context:
|
|
86
|
+
* - Fresh handleStore (prevents polluting the response stream)
|
|
87
|
+
* - Fresh handlerContext + loaderPromises (prevents reusing memoized
|
|
88
|
+
* loader results from the foreground pass)
|
|
89
|
+
* - handleStore is saved/restored in try/finally
|
|
90
|
+
*
|
|
91
|
+
* This matches the proactive caching pattern in cache-store.ts.
|
|
92
|
+
*
|
|
93
|
+
*
|
|
94
|
+
* FRESH RESOLUTION (NO REVALIDATION)
|
|
95
|
+
* ===================================
|
|
96
|
+
*
|
|
97
|
+
* Both full and partial requests use resolveAllSegments() (without
|
|
98
|
+
* revalidation logic) to ensure all segments have complete components.
|
|
99
|
+
* Using revalidation-aware resolution would produce null components
|
|
100
|
+
* for skipped segments, which would corrupt the cache entry.
|
|
101
|
+
*/
|
|
102
|
+
import type { ResolvedSegment } from "../../types.js";
|
|
103
|
+
import type { MatchContext, MatchPipelineState } from "../match-context.js";
|
|
104
|
+
import { getRouterContext } from "../router-context.js";
|
|
105
|
+
import type { GeneratorMiddleware } from "./cache-lookup.js";
|
|
106
|
+
import { debugLog, debugWarn } from "../logging.js";
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Creates background revalidation middleware
|
|
110
|
+
*
|
|
111
|
+
* If cache was stale (state.shouldRevalidate === true):
|
|
112
|
+
* - Triggers background resolution via waitUntil
|
|
113
|
+
* - Observes segments but doesn't modify them
|
|
114
|
+
* - Updates cache with fresh segments after revalidation completes
|
|
115
|
+
*/
|
|
116
|
+
export function withBackgroundRevalidation<TEnv>(
|
|
117
|
+
ctx: MatchContext<TEnv>,
|
|
118
|
+
state: MatchPipelineState,
|
|
119
|
+
): GeneratorMiddleware<ResolvedSegment> {
|
|
120
|
+
return async function* (
|
|
121
|
+
source: AsyncGenerator<ResolvedSegment>,
|
|
122
|
+
): AsyncGenerator<ResolvedSegment> {
|
|
123
|
+
// Pass through all segments unchanged
|
|
124
|
+
for await (const segment of source) {
|
|
125
|
+
yield segment;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Only trigger background revalidation if:
|
|
129
|
+
// 1. Cache was hit and stale
|
|
130
|
+
// 2. Cache scope exists
|
|
131
|
+
if (!state.shouldRevalidate || !state.cacheHit || !ctx.cacheScope) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const {
|
|
136
|
+
getRequestContext,
|
|
137
|
+
createHandleStore,
|
|
138
|
+
createHandlerContext,
|
|
139
|
+
setupLoaderAccess,
|
|
140
|
+
resolveAllSegments,
|
|
141
|
+
resolveInterceptEntry,
|
|
142
|
+
} = getRouterContext<TEnv>();
|
|
143
|
+
|
|
144
|
+
const requestCtx = getRequestContext();
|
|
145
|
+
const cacheScope = ctx.cacheScope;
|
|
146
|
+
|
|
147
|
+
requestCtx?.waitUntil(async () => {
|
|
148
|
+
debugLog("backgroundRevalidation", "revalidating stale route", {
|
|
149
|
+
pathname: ctx.pathname,
|
|
150
|
+
fullMatch: ctx.isFullMatch,
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// Save and replace handleStore to avoid polluting the response stream.
|
|
154
|
+
// Restore in finally (same pattern as proactive caching in cache-store).
|
|
155
|
+
const originalHandleStore = requestCtx._handleStore;
|
|
156
|
+
requestCtx._handleStore = createHandleStore();
|
|
157
|
+
|
|
158
|
+
try {
|
|
159
|
+
// Create fresh handler context and loader promises to avoid
|
|
160
|
+
// reusing memoized results from the foreground pass
|
|
161
|
+
const freshHandlerContext = createHandlerContext(
|
|
162
|
+
ctx.matched.params,
|
|
163
|
+
ctx.request,
|
|
164
|
+
ctx.url.searchParams,
|
|
165
|
+
ctx.pathname,
|
|
166
|
+
ctx.url,
|
|
167
|
+
ctx.env,
|
|
168
|
+
ctx.routeMap,
|
|
169
|
+
ctx.matched.routeKey,
|
|
170
|
+
ctx.matched.responseType,
|
|
171
|
+
ctx.matched.pt === true,
|
|
172
|
+
);
|
|
173
|
+
const freshLoaderPromises = new Map<string, Promise<any>>();
|
|
174
|
+
setupLoaderAccess(freshHandlerContext, freshLoaderPromises);
|
|
175
|
+
|
|
176
|
+
// Resolve all segments fresh (without revalidation logic)
|
|
177
|
+
// to ensure complete components for caching
|
|
178
|
+
const freshSegments = await ctx.Store.run(() =>
|
|
179
|
+
resolveAllSegments(
|
|
180
|
+
ctx.entries,
|
|
181
|
+
ctx.routeKey,
|
|
182
|
+
ctx.matched.params,
|
|
183
|
+
freshHandlerContext,
|
|
184
|
+
freshLoaderPromises,
|
|
185
|
+
),
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
// Also resolve intercept segments fresh if applicable
|
|
189
|
+
let freshInterceptSegments: ResolvedSegment[] = [];
|
|
190
|
+
if (ctx.interceptResult) {
|
|
191
|
+
freshInterceptSegments = await ctx.Store.run(() =>
|
|
192
|
+
resolveInterceptEntry(
|
|
193
|
+
ctx.interceptResult!.intercept,
|
|
194
|
+
ctx.interceptResult!.entry,
|
|
195
|
+
ctx.matched.params,
|
|
196
|
+
freshHandlerContext,
|
|
197
|
+
true,
|
|
198
|
+
),
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const completeSegments = [...freshSegments, ...freshInterceptSegments];
|
|
203
|
+
requestCtx._handleStore.seal();
|
|
204
|
+
await cacheScope.cacheRoute(
|
|
205
|
+
ctx.pathname,
|
|
206
|
+
ctx.matched.params,
|
|
207
|
+
completeSegments,
|
|
208
|
+
ctx.isIntercept,
|
|
209
|
+
);
|
|
210
|
+
debugLog("backgroundRevalidation", "revalidation complete", {
|
|
211
|
+
pathname: ctx.pathname,
|
|
212
|
+
});
|
|
213
|
+
} catch (error) {
|
|
214
|
+
debugWarn("backgroundRevalidation", "revalidation failed", {
|
|
215
|
+
pathname: ctx.pathname,
|
|
216
|
+
error: String(error),
|
|
217
|
+
});
|
|
218
|
+
} finally {
|
|
219
|
+
requestCtx._handleStore = originalHandleStore;
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
};
|
|
223
|
+
}
|