@rangojs/router 0.16.0 → 0.18.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/README.md +255 -89
- package/dist/testing/vitest.js +252 -0
- package/dist/types/browser/cookie-name.d.ts +6 -0
- package/dist/types/browser/history-state.d.ts +16 -0
- package/dist/types/browser/navigation-transaction.d.ts +6 -0
- package/dist/types/browser/partial-update.d.ts +11 -0
- package/dist/types/browser/react/ScrollRestoration.d.ts +6 -6
- package/dist/types/browser/rsc-router.d.ts +1 -1
- package/dist/types/browser/scroll-restoration.d.ts +7 -0
- package/dist/types/cache/cache-exec-scope.d.ts +18 -1
- package/dist/types/cache/cache-key-utils.d.ts +17 -2
- package/dist/types/cache/cache-policy.d.ts +17 -0
- package/dist/types/cache/cache-scope.d.ts +132 -19
- package/dist/types/cache/cache-tag.d.ts +92 -7
- package/dist/types/cache/cf/cf-base64.d.ts +6 -0
- package/dist/types/cache/cf/cf-cache-constants.d.ts +11 -0
- package/dist/types/cache/cf/cf-cache-store.d.ts +185 -44
- package/dist/types/cache/cf/cf-cache-types.d.ts +31 -4
- package/dist/types/cache/cf/cf-shell-frame.d.ts +95 -0
- package/dist/types/cache/cf/cf-tag-marker-memo.d.ts +34 -0
- package/dist/types/cache/handle-capture.d.ts +41 -3
- package/dist/types/cache/handle-snapshot.d.ts +54 -13
- package/dist/types/cache/index.d.ts +1 -0
- package/dist/types/cache/isolate-tag-memo.d.ts +149 -0
- package/dist/types/cache/segment-codec.d.ts +10 -3
- package/dist/types/cache/shell-memo.d.ts +178 -0
- package/dist/types/cache/shell-snapshot.d.ts +110 -21
- package/dist/types/cache/tag-invalidation.d.ts +30 -3
- package/dist/types/cache/taint.d.ts +1 -1
- package/dist/types/cache/types.d.ts +220 -44
- package/dist/types/cache/vercel/vercel-cache-store.d.ts +111 -13
- package/dist/types/client.d.ts +4 -4
- package/dist/types/client.rsc.d.ts +4 -5
- package/dist/types/components/DefaultDocument.d.ts +5 -2
- package/dist/types/context-var.d.ts +6 -5
- package/dist/types/escape-script.d.ts +1 -1
- package/dist/types/handles/MetaTags.d.ts +5 -4
- package/dist/types/handles/Scripts.d.ts +8 -7
- package/dist/types/handles/meta.d.ts +2 -2
- package/dist/types/handles/script.d.ts +17 -16
- package/dist/types/href-client.d.ts +1 -1
- package/dist/types/html.d.ts +12 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.rsc.d.ts +3 -2
- package/dist/types/loader-store.d.ts +7 -4
- package/dist/types/prerender/build-shell-capture.d.ts +11 -4
- package/dist/types/reverse.d.ts +36 -4
- package/dist/types/route-definition/dsl-helpers.d.ts +3 -3
- package/dist/types/route-definition/helpers-types.d.ts +33 -9
- package/dist/types/route-definition/resolve-handler-use.d.ts +23 -1
- package/dist/types/route-types.d.ts +1 -1
- package/dist/types/router/debug-manifest.d.ts +3 -2
- package/dist/types/router/error-handling.d.ts +20 -0
- package/dist/types/router/handler-context.d.ts +6 -0
- package/dist/types/router/instrument.d.ts +8 -0
- package/dist/types/router/match-middleware/background-revalidation.d.ts +46 -5
- package/dist/types/router/middleware-types.d.ts +9 -3
- package/dist/types/router/router-context.d.ts +3 -1
- package/dist/types/router/router-interfaces.d.ts +24 -2
- package/dist/types/router/router-options.d.ts +8 -5
- package/dist/types/router/segment-resolution/fresh.d.ts +10 -0
- package/dist/types/router/segment-resolution/loader-cache.d.ts +66 -1
- package/dist/types/router/segment-resolution/loader-mask.d.ts +9 -19
- package/dist/types/router/segment-resolution/loader-snapshot.d.ts +23 -12
- package/dist/types/router/segment-resolution/mask-nested.d.ts +67 -26
- package/dist/types/router/segment-resolution/revalidation.d.ts +6 -2
- package/dist/types/router/segment-wrappers.d.ts +1 -1
- package/dist/types/rsc/full-payload.d.ts +14 -0
- package/dist/types/rsc/handler.d.ts +1 -1
- package/dist/types/rsc/response-route-handler.d.ts +1 -1
- package/dist/types/rsc/rsc-rendering.d.ts +1 -2
- package/dist/types/rsc/shell-build-manifest.d.ts +8 -0
- package/dist/types/rsc/shell-capture-constants.d.ts +61 -6
- package/dist/types/rsc/shell-capture.d.ts +151 -19
- package/dist/types/rsc/shell-serve.d.ts +140 -17
- package/dist/types/rsc/ssr-setup.d.ts +6 -6
- package/dist/types/rsc/types.d.ts +17 -0
- package/dist/types/server/context.d.ts +139 -15
- package/dist/types/server/cookie-store.d.ts +21 -0
- package/dist/types/server/handle-store.d.ts +26 -2
- package/dist/types/server/request-context.d.ts +182 -53
- package/dist/types/ssr/index.d.ts +24 -0
- package/dist/types/ssr/ssr-root.d.ts +9 -8
- package/dist/types/static-handler.d.ts +4 -1
- package/dist/types/testing/flight.entry.d.ts +7 -0
- package/dist/types/testing/generated-routes.d.ts +2 -2
- package/dist/types/testing/internal/context.d.ts +1 -1
- package/dist/types/testing/render-route.d.ts +32 -6
- package/dist/types/testing/run-loader.d.ts +18 -3
- package/dist/types/testing/serve-shell-request.d.ts +132 -0
- package/dist/types/testing/shell-status.d.ts +23 -10
- package/dist/types/testing/vitest-stubs/plugin-rsc.d.ts +28 -5
- package/dist/types/testing/vitest.d.ts +35 -1
- package/dist/types/theme/ThemeScript.d.ts +3 -3
- package/dist/types/types/cache-types.d.ts +14 -10
- package/dist/types/types/handler-context.d.ts +28 -1
- package/dist/types/types/loader-types.d.ts +8 -6
- package/dist/types/urls/pattern-types.d.ts +22 -18
- package/dist/types/urls/response-types.d.ts +3 -12
- package/dist/types/use-loader.d.ts +12 -3
- package/dist/types/vite/plugins/use-cache-transform.d.ts +33 -2
- package/dist/types/vite/rango.d.ts +1 -1
- package/dist/types/vite/router-discovery.d.ts +29 -2
- package/dist/vite/index.js +1420 -1348
- package/package.json +2 -2
- package/skills/api-client/SKILL.md +22 -10
- package/skills/breadcrumbs/SKILL.md +75 -22
- package/skills/bundle-analysis/SKILL.md +22 -22
- package/skills/cache-guide/SKILL.md +306 -124
- package/skills/caching/SKILL.md +530 -98
- package/skills/catalog.json +16 -16
- package/skills/client-urls/SKILL.md +65 -38
- package/skills/cloudflare/SKILL.md +87 -20
- package/skills/cloudflare/references/d1-and-local-dev.md +15 -2
- package/skills/cloudflare/references/streaming-and-deploy.md +10 -3
- package/skills/cloudflare/references/webhooks-and-crypto.md +9 -2
- package/skills/comparison/SKILL.md +5 -0
- package/skills/comparison/references/framework-comparison.md +75 -57
- package/skills/composability/SKILL.md +38 -29
- package/skills/css/SKILL.md +10 -13
- package/skills/debug-manifest/SKILL.md +74 -31
- package/skills/defer-hydration/SKILL.md +52 -31
- package/skills/deployment-caching/SKILL.md +11 -3
- package/skills/document-cache/SKILL.md +98 -28
- package/skills/fonts/SKILL.md +16 -8
- package/skills/handler-use/SKILL.md +55 -17
- package/skills/hooks/SKILL.md +28 -20
- package/skills/hooks/data.md +23 -3
- package/skills/hooks/handle-and-actions.md +34 -17
- package/skills/hooks/navigation.md +39 -10
- package/skills/hooks/outlets.md +13 -6
- package/skills/hooks/state.md +39 -15
- package/skills/hooks/urls.md +7 -5
- package/skills/host-router/SKILL.md +64 -12
- package/skills/i18n/SKILL.md +60 -34
- package/skills/intercept/SKILL.md +161 -26
- package/skills/layout/SKILL.md +106 -50
- package/skills/links/SKILL.md +51 -19
- package/skills/loader/SKILL.md +386 -128
- package/skills/middleware/SKILL.md +129 -26
- package/skills/migrate-nextjs/SKILL.md +156 -70
- package/skills/migrate-nextjs/backend-host-swap.md +5 -2
- package/skills/migrate-react-router/SKILL.md +51 -39
- package/skills/migrate-react-router/component-migration.md +28 -7
- package/skills/migrate-react-router/data-and-actions.md +21 -6
- package/skills/migrate-react-router/route-mapping.md +19 -10
- package/skills/mime-routes/SKILL.md +12 -7
- package/skills/observability/SKILL.md +92 -14
- package/skills/parallel/SKILL.md +88 -47
- package/skills/ppr/SKILL.md +866 -379
- package/skills/prerender/SKILL.md +210 -108
- package/skills/rango/SKILL.md +115 -65
- package/skills/react-compiler/SKILL.md +6 -5
- package/skills/response-routes/SKILL.md +133 -25
- package/skills/route/SKILL.md +170 -60
- package/skills/router-setup/SKILL.md +420 -240
- package/skills/scripts/SKILL.md +39 -21
- package/skills/server-actions/SKILL.md +231 -59
- package/skills/shell-manifest/SKILL.md +28 -14
- package/skills/streams-and-websockets/SKILL.md +32 -14
- package/skills/tailwind/SKILL.md +37 -33
- package/skills/testing/SKILL.md +73 -33
- package/skills/testing/cache-prerender.md +60 -33
- package/skills/testing/client-components.md +59 -6
- package/skills/testing/e2e-parity.md +12 -2
- package/skills/testing/flight.md +19 -11
- package/skills/testing/handles.md +8 -5
- package/skills/testing/loader.md +26 -6
- package/skills/testing/middleware.md +8 -3
- package/skills/testing/predicates.md +120 -0
- package/skills/testing/render-handler.md +70 -22
- package/skills/testing/response-routes.md +11 -4
- package/skills/testing/reverse-and-types.md +20 -14
- package/skills/testing/serve-shell-request.md +188 -0
- package/skills/testing/server-actions.md +12 -3
- package/skills/testing/server-tree.md +9 -0
- package/skills/testing/setup.md +9 -5
- package/skills/theme/SKILL.md +155 -30
- package/skills/typesafety/SKILL.md +20 -9
- package/skills/typesafety/env-and-bindings.md +137 -50
- package/skills/typesafety/generated-files-and-cli.md +26 -14
- package/skills/typesafety/params-and-search.md +44 -19
- package/skills/typesafety/route-types.md +50 -14
- package/skills/use-cache/SKILL.md +224 -83
- package/skills/vercel/SKILL.md +35 -13
- package/skills/view-transitions/SKILL.md +42 -21
- package/src/__augment-tests__/augmented.check.ts +26 -1
- package/src/browser/cookie-name.ts +23 -0
- package/src/browser/history-state.ts +23 -0
- package/src/browser/index.ts +2 -2
- package/src/browser/navigation-bridge.ts +3 -4
- package/src/browser/navigation-transaction.ts +22 -2
- package/src/browser/partial-update.ts +35 -25
- package/src/browser/react/ScrollRestoration.tsx +6 -6
- package/src/browser/rsc-router.tsx +6 -1
- package/src/browser/scroll-restoration.ts +53 -6
- package/src/cache/cache-exec-scope.ts +37 -4
- package/src/cache/cache-key-utils.ts +23 -8
- package/src/cache/cache-policy.ts +22 -0
- package/src/cache/cache-runtime.ts +264 -68
- package/src/cache/cache-scope.ts +419 -43
- package/src/cache/cache-tag.ts +375 -11
- package/src/cache/cf/cf-base64.ts +36 -4
- package/src/cache/cf/cf-cache-constants.ts +12 -0
- package/src/cache/cf/cf-cache-store.ts +990 -348
- package/src/cache/cf/cf-cache-types.ts +32 -4
- package/src/cache/cf/cf-shell-frame.ts +258 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +143 -39
- package/src/cache/document-cache.ts +15 -0
- package/src/cache/handle-capture.ts +90 -10
- package/src/cache/handle-snapshot.ts +133 -28
- package/src/cache/index.ts +2 -0
- package/src/cache/isolate-tag-memo.ts +308 -0
- package/src/cache/segment-codec.ts +26 -7
- package/src/cache/shell-memo.ts +341 -0
- package/src/cache/shell-snapshot.ts +217 -27
- package/src/cache/tag-invalidation.ts +108 -22
- package/src/cache/taint.ts +1 -1
- package/src/cache/types.ts +225 -44
- package/src/cache/vercel/vercel-cache-store.ts +545 -61
- package/src/client.rsc.tsx +10 -9
- package/src/client.tsx +5 -4
- package/src/components/DefaultDocument.tsx +7 -2
- package/src/context-var.ts +6 -5
- package/src/escape-script.ts +1 -1
- package/src/handles/MetaTags.tsx +13 -11
- package/src/handles/Scripts.tsx +11 -10
- package/src/handles/meta.ts +2 -2
- package/src/handles/script.ts +17 -16
- package/src/href-client.ts +1 -1
- package/src/html.ts +12 -0
- package/src/index.rsc.ts +5 -0
- package/src/index.ts +1 -0
- package/src/loader-store.ts +7 -4
- package/src/prerender/build-shell-capture.ts +73 -22
- package/src/reverse.ts +44 -4
- package/src/route-definition/dsl-helpers.ts +121 -33
- package/src/route-definition/helpers-types.ts +33 -9
- package/src/route-definition/resolve-handler-use.ts +121 -6
- package/src/route-types.ts +0 -3
- package/src/router/debug-manifest.ts +10 -2
- package/src/router/error-handling.ts +51 -15
- package/src/router/handler-context.ts +71 -28
- package/src/router/instrument.ts +54 -2
- package/src/router/intercept-resolution.ts +141 -43
- package/src/router/loader-resolution.ts +115 -39
- package/src/router/match-api.ts +40 -26
- package/src/router/match-handlers.ts +5 -0
- package/src/router/match-middleware/background-revalidation.ts +161 -96
- package/src/router/match-middleware/cache-lookup.ts +110 -10
- package/src/router/match-middleware/cache-store.ts +48 -101
- package/src/router/middleware-types.ts +9 -6
- package/src/router/middleware.ts +75 -13
- package/src/router/prerender-match.ts +59 -19
- package/src/router/route-snapshot.ts +11 -1
- package/src/router/router-context.ts +2 -0
- package/src/router/router-interfaces.ts +25 -2
- package/src/router/router-options.ts +8 -5
- package/src/router/segment-resolution/fresh.ts +62 -21
- package/src/router/segment-resolution/helpers.ts +4 -2
- package/src/router/segment-resolution/loader-cache.ts +407 -76
- package/src/router/segment-resolution/loader-mask.ts +12 -22
- package/src/router/segment-resolution/loader-snapshot.ts +208 -56
- package/src/router/segment-resolution/mask-nested.ts +138 -44
- package/src/router/segment-resolution/revalidation.ts +61 -16
- package/src/router/segment-wrappers.ts +4 -0
- package/src/rsc/full-payload.ts +25 -1
- package/src/rsc/handler.ts +14 -2
- package/src/rsc/progressive-enhancement.ts +3 -2
- package/src/rsc/render-pipeline.ts +3 -0
- package/src/rsc/response-cache-serve.ts +9 -6
- package/src/rsc/response-route-handler.ts +11 -3
- package/src/rsc/rsc-rendering.ts +608 -225
- package/src/rsc/shell-build-manifest.ts +27 -9
- package/src/rsc/shell-capture-constants.ts +73 -6
- package/src/rsc/shell-capture.ts +1068 -296
- package/src/rsc/shell-serve.ts +316 -34
- package/src/rsc/ssr-setup.ts +14 -8
- package/src/rsc/types.ts +18 -0
- package/src/server/context.ts +300 -32
- package/src/server/cookie-store.ts +87 -61
- package/src/server/handle-store.ts +232 -7
- package/src/server/request-context.ts +297 -67
- package/src/ssr/index.tsx +136 -44
- package/src/ssr/ssr-root.tsx +9 -8
- package/src/static-handler.ts +4 -1
- package/src/testing/flight-runtime.d.ts +21 -0
- package/src/testing/flight.entry.ts +14 -0
- package/src/testing/generated-routes.ts +2 -2
- package/src/testing/internal/context.ts +1 -1
- package/src/testing/internal/flight-client-globals.ts +7 -5
- package/src/testing/render-route.tsx +85 -24
- package/src/testing/run-loader.ts +68 -6
- package/src/testing/serve-shell-request.ts +378 -0
- package/src/testing/shell-status.ts +34 -12
- package/src/testing/vitest-stubs/plugin-rsc.ts +123 -20
- package/src/testing/vitest.ts +62 -1
- package/src/theme/ThemeProvider.tsx +7 -6
- package/src/theme/ThemeScript.tsx +3 -3
- package/src/types/cache-types.ts +14 -10
- package/src/types/handler-context.ts +28 -1
- package/src/types/loader-types.ts +8 -6
- package/src/urls/pattern-types.ts +22 -18
- package/src/urls/response-types.ts +3 -23
- package/src/use-loader.tsx +12 -3
- package/src/vite/discovery/shell-prerender-phase.ts +9 -0
- package/src/vite/plugins/use-cache-transform.ts +118 -74
- package/src/vite/rango.ts +7 -3
- package/src/vite/router-discovery.ts +14 -4
|
@@ -164,8 +164,10 @@ export interface RangoOptions<TEnv = any> {
|
|
|
164
164
|
*
|
|
165
165
|
* Must be a client component ("use client") that accepts { children }.
|
|
166
166
|
*
|
|
167
|
-
* If not provided, a default document
|
|
168
|
-
* `<
|
|
167
|
+
* If not provided, a default document is used: `Html.Meta` and `Html.Scripts`
|
|
168
|
+
* in `<head>`, `Html.Scripts position="body"` before `{children}` and
|
|
169
|
+
* `Html.ScrollRestoration` after it. Pass your own to set `getKey` or to
|
|
170
|
+
* leave back/forward scrolling to the browser.
|
|
169
171
|
*
|
|
170
172
|
* @example
|
|
171
173
|
* ```typescript
|
|
@@ -201,7 +203,8 @@ export interface RangoOptions<TEnv = any> {
|
|
|
201
203
|
|
|
202
204
|
/**
|
|
203
205
|
* Default not-found boundary fallback used when no notFoundBoundary is defined in the route tree
|
|
204
|
-
* If not provided,
|
|
206
|
+
* If not provided, notFound() renders the `notFound` option, else a plain
|
|
207
|
+
* `<h1>Not Found</h1>` (status 404)
|
|
205
208
|
*/
|
|
206
209
|
defaultNotFoundBoundary?: ReactNode | NotFoundBoundaryHandler;
|
|
207
210
|
|
|
@@ -211,7 +214,7 @@ export interface RangoOptions<TEnv = any> {
|
|
|
211
214
|
* This is rendered within your document/app shell with a 404 status code.
|
|
212
215
|
* Use this for a custom 404 page that maintains your app's look and feel.
|
|
213
216
|
*
|
|
214
|
-
* If not provided, a
|
|
217
|
+
* If not provided, a plain `<h1>Not Found</h1>` is rendered.
|
|
215
218
|
*
|
|
216
219
|
* Can be a static ReactNode or a function receiving the pathname.
|
|
217
220
|
*
|
|
@@ -368,7 +371,7 @@ export interface RangoOptions<TEnv = any> {
|
|
|
368
371
|
* When provided, enables:
|
|
369
372
|
* - ctx.theme and ctx.setTheme() in route handlers
|
|
370
373
|
* - useTheme() hook for client components
|
|
371
|
-
* - FOUC prevention via inline script in
|
|
374
|
+
* - FOUC prevention via inline script in `<Html.Meta />`
|
|
372
375
|
* - Automatic ThemeProvider wrapping in NavigationProvider
|
|
373
376
|
*
|
|
374
377
|
* @example
|
|
@@ -37,7 +37,7 @@ import { applyViewTransitionDefault } from "./view-transition-default.js";
|
|
|
37
37
|
import { _getRequestContext } from "../../server/request-context.js";
|
|
38
38
|
import { getRouterContext } from "../router-context.js";
|
|
39
39
|
import { observeStreamedHandler } from "./streamed-handler-telemetry.js";
|
|
40
|
-
import {
|
|
40
|
+
import { observeSegmentHandler } from "../instrument.js";
|
|
41
41
|
import {
|
|
42
42
|
track,
|
|
43
43
|
RangoContext,
|
|
@@ -120,12 +120,8 @@ export async function resolveLoaders<TEnv>(
|
|
|
120
120
|
// loading-disabled entries consult it), so normal requests are unchanged.
|
|
121
121
|
const emitStreaming = !loadingDisabled || isShellCaptureActive();
|
|
122
122
|
|
|
123
|
-
// PPR
|
|
124
|
-
//
|
|
125
|
-
// executed at capture (container bakes, nested pending promises hole at the
|
|
126
|
-
// consumer's Suspense) and overlay-pinned from the shell snapshot on a HIT.
|
|
127
|
-
// Renderable loading() keeps the LIVE lane (masked at capture, always
|
|
128
|
-
// fresh). Computed per entry; resolveLoaderData applies the policy.
|
|
123
|
+
// PPR bake/seed key input only; lane rule: see resolveLoaderData
|
|
124
|
+
// (loader-cache.ts). Unflagged loaders mask at capture regardless of the key.
|
|
129
125
|
const bakeLane = !entryLoadingMasksLoaders(entry.loading);
|
|
130
126
|
|
|
131
127
|
// Error context for wrapLoaderPromise: without it, a throwing DSL loader never
|
|
@@ -146,9 +142,9 @@ export async function resolveLoaders<TEnv>(
|
|
|
146
142
|
// barrier), and the loader body can call rendered() before the await below
|
|
147
143
|
// is reached.
|
|
148
144
|
//
|
|
149
|
-
// Shell-capture renders await too: flagged loaders
|
|
150
|
-
// (
|
|
151
|
-
//
|
|
145
|
+
// Shell-capture renders await too: flagged loaders execute at capture
|
|
146
|
+
// (lane rule: see resolveLoaderData, loader-cache.ts), so their handle
|
|
147
|
+
// pushes must land in the prelude.
|
|
152
148
|
const awaitedIndices = registerAwaitBeforeFlushIds(loaderEntries);
|
|
153
149
|
|
|
154
150
|
// Streaming loaders: promises kick off now, settle during RSC serialization.
|
|
@@ -177,9 +173,7 @@ export async function resolveLoaders<TEnv>(
|
|
|
177
173
|
// bakes at capture regardless of the entry's loading() lane
|
|
178
174
|
// (loader-cache.ts capture branch) and its HIT-tail seed
|
|
179
175
|
// overlay needs the same key.
|
|
180
|
-
bakeLane || loaderEntry.
|
|
181
|
-
? segmentId
|
|
182
|
-
: null,
|
|
176
|
+
bakeLane || loaderEntry.bake === true ? segmentId : null,
|
|
183
177
|
),
|
|
184
178
|
),
|
|
185
179
|
entry,
|
|
@@ -227,7 +221,7 @@ export async function resolveLoaders<TEnv>(
|
|
|
227
221
|
loaderEntry,
|
|
228
222
|
ctx,
|
|
229
223
|
ctx.pathname,
|
|
230
|
-
bakeLane || loaderEntry.
|
|
224
|
+
bakeLane || loaderEntry.bake === true ? segmentId : null,
|
|
231
225
|
),
|
|
232
226
|
),
|
|
233
227
|
entry,
|
|
@@ -276,6 +270,16 @@ export interface ResolveSegmentOptions {
|
|
|
276
270
|
* so error boundaries keep catching at request time.
|
|
277
271
|
*/
|
|
278
272
|
throwOnError?: boolean;
|
|
273
|
+
/**
|
|
274
|
+
* The matched route's full entry chain. resolveAllSegments defaults it to
|
|
275
|
+
* its `entries`; withCacheLookup passes it when it resolves only the entries
|
|
276
|
+
* above a cache() boundary. An orphan list can hold an entry of the chain: a
|
|
277
|
+
* bare cache() marker sits in its layout's layout[] (it wraps that layout's
|
|
278
|
+
* routes) and is the parent of the routes after it. For those routes it
|
|
279
|
+
* resolves once, as a chain entry, below the cache() header latch (issue
|
|
280
|
+
* #918: resolved twice on a MISS, once and discarded on a HIT).
|
|
281
|
+
*/
|
|
282
|
+
chain?: readonly EntryData[];
|
|
279
283
|
}
|
|
280
284
|
|
|
281
285
|
/**
|
|
@@ -349,6 +353,7 @@ export async function resolveSegment<TEnv>(
|
|
|
349
353
|
}
|
|
350
354
|
|
|
351
355
|
for (const orphan of entry.layout) {
|
|
356
|
+
if (options?.chain?.includes(orphan)) continue;
|
|
352
357
|
const orphanSegments = await resolveOrphanLayout(
|
|
353
358
|
orphan,
|
|
354
359
|
params,
|
|
@@ -389,7 +394,7 @@ export async function resolveSegment<TEnv>(
|
|
|
389
394
|
const doneRouteHandler = track(`handler:${entry.id}`, 2);
|
|
390
395
|
if (entry.loading) {
|
|
391
396
|
const result = handleHandlerResult(
|
|
392
|
-
|
|
397
|
+
observeSegmentHandler(entry.shortCode, entry.id, handler, context),
|
|
393
398
|
);
|
|
394
399
|
if (result instanceof Promise) {
|
|
395
400
|
warnOnStreamedResponse(result, entry.id);
|
|
@@ -413,7 +418,12 @@ export async function resolveSegment<TEnv>(
|
|
|
413
418
|
}
|
|
414
419
|
} else {
|
|
415
420
|
component = handleHandlerResult(
|
|
416
|
-
await
|
|
421
|
+
await observeSegmentHandler(
|
|
422
|
+
entry.shortCode,
|
|
423
|
+
entry.id,
|
|
424
|
+
handler,
|
|
425
|
+
context,
|
|
426
|
+
),
|
|
417
427
|
);
|
|
418
428
|
doneRouteHandler();
|
|
419
429
|
}
|
|
@@ -578,6 +588,26 @@ export async function resolveOrphanLayout<TEnv>(
|
|
|
578
588
|
resolvedParallelEntries.add(parallelEntry.id);
|
|
579
589
|
}
|
|
580
590
|
|
|
591
|
+
// Routeless entries nested in this one (a layout() after a bare cache()
|
|
592
|
+
// marker, a wrapper inside a routeless wrapper) wrap the same content one
|
|
593
|
+
// level deeper. Issue #918: they were never rendered. None is in the
|
|
594
|
+
// matched chain: that would put this orphan in it, and resolveSegment
|
|
595
|
+
// skips those.
|
|
596
|
+
for (const nested of orphan.layout) {
|
|
597
|
+
segments.push(
|
|
598
|
+
...(await resolveOrphanLayout(
|
|
599
|
+
nested,
|
|
600
|
+
params,
|
|
601
|
+
context,
|
|
602
|
+
loaderPromises,
|
|
603
|
+
belongsToRoute,
|
|
604
|
+
deps,
|
|
605
|
+
options,
|
|
606
|
+
routeKey,
|
|
607
|
+
)),
|
|
608
|
+
);
|
|
609
|
+
}
|
|
610
|
+
|
|
581
611
|
return segments;
|
|
582
612
|
}
|
|
583
613
|
|
|
@@ -643,7 +673,12 @@ export async function resolveParallelEntry<TEnv>(
|
|
|
643
673
|
if (hasLoadingFallback) {
|
|
644
674
|
const result =
|
|
645
675
|
typeof handler === "function"
|
|
646
|
-
?
|
|
676
|
+
? observeSegmentHandler(
|
|
677
|
+
`${parentShortCode}.${slot}`,
|
|
678
|
+
`${parallelEntry.id}.${slot}`,
|
|
679
|
+
handler,
|
|
680
|
+
context,
|
|
681
|
+
)
|
|
647
682
|
: handler;
|
|
648
683
|
if (result instanceof Promise) {
|
|
649
684
|
result.finally(doneParallelHandler).catch(() => {});
|
|
@@ -667,7 +702,8 @@ export async function resolveParallelEntry<TEnv>(
|
|
|
667
702
|
} else {
|
|
668
703
|
component =
|
|
669
704
|
typeof handler === "function"
|
|
670
|
-
? await
|
|
705
|
+
? await observeSegmentHandler(
|
|
706
|
+
`${parentShortCode}.${slot}`,
|
|
671
707
|
`${parallelEntry.id}.${slot}`,
|
|
672
708
|
handler,
|
|
673
709
|
context,
|
|
@@ -736,6 +772,10 @@ export async function resolveAllSegments<TEnv>(
|
|
|
736
772
|
): Promise<ResolvedSegment[]> {
|
|
737
773
|
const allSegments: ResolvedSegment[] = [];
|
|
738
774
|
const seenIds = new Set<string>();
|
|
775
|
+
const segmentOptions: ResolveSegmentOptions = {
|
|
776
|
+
...options,
|
|
777
|
+
chain: options?.chain ?? entries,
|
|
778
|
+
};
|
|
739
779
|
|
|
740
780
|
// ppr routes are document-scoped cached territory: the whole chain (root
|
|
741
781
|
// layout down to the page) bakes into the shared shell, so the header-write
|
|
@@ -760,8 +800,9 @@ export async function resolveAllSegments<TEnv>(
|
|
|
760
800
|
// Set ALS flag when entering a cache() boundary so that ctx.get()
|
|
761
801
|
// can guard non-cacheable variable reads. Also latch the header-write
|
|
762
802
|
// scope (response-level side effects — headers/cookies/status).
|
|
763
|
-
// Persists for all descendant entries.
|
|
764
|
-
|
|
803
|
+
// Persists for all descendant entries. A route entry carries `cache` when
|
|
804
|
+
// cache() is among its own children (dsl-helpers.ts cache()).
|
|
805
|
+
if (entry.cache) {
|
|
765
806
|
const store = RangoContext.getStore();
|
|
766
807
|
if (store) store.insideCacheScope = true;
|
|
767
808
|
latchCachedHeaderScope("cache", routeKey);
|
|
@@ -779,7 +820,7 @@ export async function resolveAllSegments<TEnv>(
|
|
|
779
820
|
loaderPromises,
|
|
780
821
|
deps,
|
|
781
822
|
false,
|
|
782
|
-
|
|
823
|
+
segmentOptions,
|
|
783
824
|
),
|
|
784
825
|
(seg) => [seg],
|
|
785
826
|
deps,
|
|
@@ -29,7 +29,7 @@ import type {
|
|
|
29
29
|
import type { SegmentResolutionDeps } from "../types.js";
|
|
30
30
|
import { debugLog } from "../logging.js";
|
|
31
31
|
import { tryStaticLookup } from "./static-store.js";
|
|
32
|
-
import {
|
|
32
|
+
import { observeSegmentHandler } from "../instrument.js";
|
|
33
33
|
import type { TelemetrySink } from "../telemetry.js";
|
|
34
34
|
import { resolveSink, safeEmit, getRequestId } from "../telemetry.js";
|
|
35
35
|
|
|
@@ -175,7 +175,9 @@ export async function resolveLayoutComponent<TEnv>(
|
|
|
175
175
|
// by track("handler:<id>") at the call site). handleHandlerResult stays OUTSIDE
|
|
176
176
|
// the span so a handler that returns a Response (redirect control flow, which it
|
|
177
177
|
// rethrows) is not recorded as a span error — mirrors the route-handler sites.
|
|
178
|
-
return handleHandlerResult(
|
|
178
|
+
return handleHandlerResult(
|
|
179
|
+
await observeSegmentHandler(entry.shortCode, entry.id, handler, context),
|
|
180
|
+
);
|
|
179
181
|
}
|
|
180
182
|
|
|
181
183
|
// ---------------------------------------------------------------------------
|