vinext 0.1.8 → 0.2.1
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 +51 -30
- package/dist/build/css-url-assets.d.ts +3 -1
- package/dist/build/css-url-assets.js +18 -1
- package/dist/build/inject-pregenerated-paths.d.ts +7 -0
- package/dist/build/inject-pregenerated-paths.js +21 -0
- package/dist/build/layout-classification.js +1 -1
- package/dist/build/nitro-route-rules.js +1 -1
- package/dist/build/pages-client-assets-module.d.ts +11 -0
- package/dist/build/pages-client-assets-module.js +27 -0
- package/dist/build/prerender-server-entry.d.ts +1 -0
- package/dist/build/prerender-server-entry.js +49 -0
- package/dist/build/prerender-server-pool.d.ts +44 -0
- package/dist/build/prerender-server-pool.js +194 -0
- package/dist/build/prerender.d.ts +2 -1
- package/dist/build/prerender.js +98 -27
- package/dist/build/report.d.ts +13 -2
- package/dist/build/report.js +99 -2
- package/dist/build/run-prerender.d.ts +7 -0
- package/dist/build/run-prerender.js +12 -2
- package/dist/build/standalone.js +2 -0
- package/dist/cache/cache-adapters-virtual.js +3 -3
- package/dist/check.d.ts +4 -6
- package/dist/check.js +48 -11
- package/dist/cli-args.d.ts +1 -2
- package/dist/cli-args.js +1 -1
- package/dist/cli-dev-config.d.ts +12 -0
- package/dist/cli-dev-config.js +23 -0
- package/dist/cli.js +112 -96
- package/dist/{server → client}/dev-error-overlay-store.d.ts +1 -1
- package/dist/{server → client}/dev-error-overlay-store.js +1 -1
- package/dist/{server → client}/dev-error-overlay.d.ts +1 -1
- package/dist/{server → client}/dev-error-overlay.js +2 -2
- package/dist/client/navigation-runtime.d.ts +2 -0
- package/dist/client/navigation-runtime.js +3 -1
- package/dist/client/vinext-next-data.d.ts +4 -1
- package/dist/client/window-next.d.ts +2 -1
- package/dist/cloudflare/index.d.ts +2 -2
- package/dist/cloudflare/index.js +2 -2
- package/dist/config/config-matchers.js +45 -19
- package/dist/config/next-config.d.ts +41 -9
- package/dist/config/next-config.js +60 -3
- package/dist/config/prerender.d.ts +34 -0
- package/dist/config/prerender.js +55 -0
- package/dist/entries/app-browser-entry.js +5 -1
- package/dist/entries/app-rsc-entry.d.ts +5 -3
- package/dist/entries/app-rsc-entry.js +44 -10
- package/dist/entries/app-rsc-manifest.js +2 -0
- package/dist/entries/pages-client-entry.d.ts +3 -0
- package/dist/entries/pages-client-entry.js +28 -3
- package/dist/entries/pages-server-entry.js +23 -6
- package/dist/image/image-adapters-virtual.d.ts +59 -0
- package/dist/image/image-adapters-virtual.js +59 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +482 -120
- package/dist/init-cloudflare.d.ts +43 -0
- package/dist/init-cloudflare.js +839 -0
- package/dist/init-platform.d.ts +40 -0
- package/dist/init-platform.js +195 -0
- package/dist/init.d.ts +16 -38
- package/dist/init.js +209 -99
- package/dist/node_modules/.pnpm/am-i-vibing@0.5.0/node_modules/am-i-vibing/dist/detector-1yx2Hoe0.js +294 -0
- package/dist/node_modules/.pnpm/process-ancestry@0.1.0/node_modules/process-ancestry/dist/index.js +94 -0
- package/dist/{cloudflare → packages/cloudflare}/src/cache/cdn-adapter.runtime.js +1 -1
- package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.d.ts +2 -2
- package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.js +9 -2
- package/dist/packages/cloudflare/src/deploy-config.js +150 -0
- package/dist/packages/cloudflare/src/deploy-help.js +55 -0
- package/dist/packages/cloudflare/src/deploy.js +272 -0
- package/dist/{cloudflare → packages/cloudflare/src}/tpr.d.ts +4 -41
- package/dist/{cloudflare → packages/cloudflare/src}/tpr.js +44 -20
- package/dist/plugins/ast-scope.d.ts +16 -0
- package/dist/plugins/ast-scope.js +62 -0
- package/dist/plugins/ast-utils.d.ts +27 -1
- package/dist/plugins/ast-utils.js +32 -1
- package/dist/plugins/css-module-imports.d.ts +14 -0
- package/dist/plugins/css-module-imports.js +59 -0
- package/dist/plugins/extensionless-dynamic-import.js +2 -2
- package/dist/plugins/fonts.js +1 -1
- package/dist/plugins/ignore-dynamic-requests.d.ts +11 -0
- package/dist/plugins/ignore-dynamic-requests.js +530 -0
- package/dist/plugins/og-assets.js +2 -1
- package/dist/plugins/optimize-imports.js +1 -1
- package/dist/plugins/rsc-reference-validation-normalizer.d.ts +12 -0
- package/dist/plugins/rsc-reference-validation-normalizer.js +48 -0
- package/dist/plugins/sass.d.ts +17 -1
- package/dist/plugins/sass.js +74 -1
- package/dist/plugins/styled-jsx.d.ts +16 -0
- package/dist/plugins/styled-jsx.js +149 -0
- package/dist/plugins/typeof-window.d.ts +1 -1
- package/dist/plugins/typeof-window.js +28 -56
- package/dist/routing/app-route-graph.d.ts +23 -2
- package/dist/routing/app-route-graph.js +138 -38
- package/dist/routing/file-matcher.d.ts +11 -1
- package/dist/routing/file-matcher.js +18 -3
- package/dist/routing/pages-router.js +2 -2
- package/dist/server/api-handler.js +9 -14
- package/dist/server/app-browser-action-result.d.ts +4 -1
- package/dist/server/app-browser-action-result.js +8 -1
- package/dist/server/app-browser-entry.js +198 -57
- package/dist/server/app-browser-interception-context.d.ts +1 -0
- package/dist/server/app-browser-interception-context.js +4 -2
- package/dist/server/app-browser-navigation-controller.d.ts +2 -0
- package/dist/server/app-browser-navigation-controller.js +60 -31
- package/dist/server/app-browser-server-action-client.d.ts +1 -1
- package/dist/server/app-browser-server-action-client.js +8 -7
- package/dist/server/app-browser-state.d.ts +12 -1
- package/dist/server/app-browser-state.js +25 -8
- package/dist/server/app-browser-visible-commit.d.ts +6 -1
- package/dist/server/app-browser-visible-commit.js +42 -24
- package/dist/server/app-elements-wire.d.ts +9 -2
- package/dist/server/app-elements-wire.js +8 -1
- package/dist/server/app-elements.d.ts +2 -2
- package/dist/server/app-elements.js +4 -3
- package/dist/server/app-fallback-renderer.d.ts +2 -1
- package/dist/server/app-fallback-renderer.js +10 -6
- package/dist/server/app-hydration-cache-publication.d.ts +11 -0
- package/dist/server/app-hydration-cache-publication.js +43 -0
- package/dist/server/app-middleware.d.ts +4 -3
- package/dist/server/app-middleware.js +8 -3
- package/dist/server/app-optimistic-routing.js +11 -4
- package/dist/server/app-page-boundary.js +2 -1
- package/dist/server/app-page-cache-finalizer.d.ts +1 -0
- package/dist/server/app-page-cache-finalizer.js +5 -4
- package/dist/server/app-page-cache-render.d.ts +1 -0
- package/dist/server/app-page-cache-render.js +8 -4
- package/dist/server/app-page-cache.d.ts +1 -0
- package/dist/server/app-page-cache.js +27 -7
- package/dist/server/app-page-dispatch.d.ts +1 -0
- package/dist/server/app-page-dispatch.js +26 -8
- package/dist/server/app-page-element-builder.d.ts +2 -1
- package/dist/server/app-page-element-builder.js +59 -4
- package/dist/server/app-page-execution.js +2 -1
- package/dist/server/app-page-probe.js +5 -0
- package/dist/server/app-page-render-identity.d.ts +2 -0
- package/dist/server/app-page-render-identity.js +3 -2
- package/dist/server/app-page-render.d.ts +2 -0
- package/dist/server/app-page-render.js +85 -16
- package/dist/server/app-page-request.d.ts +14 -0
- package/dist/server/app-page-request.js +69 -4
- package/dist/server/app-page-response.d.ts +7 -0
- package/dist/server/app-page-response.js +16 -4
- package/dist/server/app-page-route-wiring.d.ts +8 -1
- package/dist/server/app-page-route-wiring.js +32 -18
- package/dist/server/app-page-segment-state.d.ts +2 -1
- package/dist/server/app-page-segment-state.js +3 -1
- package/dist/server/app-page-stream.d.ts +7 -1
- package/dist/server/app-page-stream.js +3 -1
- package/dist/server/app-route-handler-execution.js +5 -1
- package/dist/server/app-route-handler-response.js +1 -0
- package/dist/server/app-route-handler-runtime.js +1 -1
- package/dist/server/app-route-tree-prefetch.d.ts +43 -0
- package/dist/server/app-route-tree-prefetch.js +187 -0
- package/dist/server/app-router-entry.js +9 -2
- package/dist/server/app-rsc-cache-busting.d.ts +2 -1
- package/dist/server/app-rsc-cache-busting.js +9 -4
- package/dist/server/app-rsc-handler.d.ts +7 -0
- package/dist/server/app-rsc-handler.js +148 -39
- package/dist/server/app-rsc-render-mode.d.ts +3 -2
- package/dist/server/app-rsc-render-mode.js +4 -1
- package/dist/server/app-rsc-request-normalization.d.ts +6 -6
- package/dist/server/app-rsc-request-normalization.js +10 -8
- package/dist/server/app-segment-config.d.ts +11 -0
- package/dist/server/app-segment-config.js +62 -6
- package/dist/server/app-server-action-execution.d.ts +1 -0
- package/dist/server/app-server-action-execution.js +61 -30
- package/dist/server/app-ssr-entry.d.ts +3 -0
- package/dist/server/app-ssr-entry.js +13 -5
- package/dist/server/app-ssr-stream.d.ts +7 -3
- package/dist/server/app-ssr-stream.js +10 -6
- package/dist/server/app-visited-response-cache.d.ts +6 -0
- package/dist/server/app-visited-response-cache.js +3 -1
- package/dist/server/cache-control.d.ts +3 -1
- package/dist/server/cache-control.js +13 -1
- package/dist/server/client-trace-metadata.js +26 -0
- package/dist/server/default-global-not-found-module.d.ts +14 -0
- package/dist/server/default-global-not-found-module.js +14 -0
- package/dist/server/dev-route-files.js +4 -0
- package/dist/server/dev-server.d.ts +11 -1
- package/dist/server/dev-server.js +94 -35
- package/dist/server/dev-stack-sourcemap.d.ts +1 -1
- package/dist/server/dev-stack-sourcemap.js +1 -1
- package/dist/server/fetch-handler.d.ts +2 -0
- package/dist/server/fetch-handler.js +18 -0
- package/dist/server/headers.d.ts +7 -15
- package/dist/server/headers.js +11 -18
- package/dist/server/image-optimization.d.ts +51 -1
- package/dist/server/image-optimization.js +52 -2
- package/dist/server/implicit-tags.js +1 -1
- package/dist/server/isr-cache.d.ts +3 -2
- package/dist/server/isr-cache.js +9 -5
- package/dist/server/metadata-routes.d.ts +3 -1
- package/dist/server/metadata-routes.js +12 -2
- package/dist/server/middleware-runtime.js +6 -1
- package/dist/server/navigation-planner.d.ts +1 -0
- package/dist/server/navigation-planner.js +14 -3
- package/dist/server/pages-api-route.js +2 -2
- package/dist/server/pages-asset-tags.d.ts +4 -6
- package/dist/server/pages-asset-tags.js +12 -12
- package/dist/server/pages-client-assets.d.ts +12 -0
- package/dist/server/pages-client-assets.js +10 -0
- package/dist/server/pages-data-route.d.ts +4 -2
- package/dist/server/pages-data-route.js +18 -4
- package/dist/server/pages-dev-module-url.d.ts +2 -1
- package/dist/server/pages-dev-module-url.js +6 -3
- package/dist/server/pages-node-compat.d.ts +19 -1
- package/dist/server/pages-node-compat.js +81 -4
- package/dist/server/pages-page-data.d.ts +33 -1
- package/dist/server/pages-page-data.js +62 -33
- package/dist/server/pages-page-handler.d.ts +2 -1
- package/dist/server/pages-page-handler.js +38 -19
- package/dist/server/pages-page-response.d.ts +8 -0
- package/dist/server/pages-page-response.js +7 -3
- package/dist/server/pages-request-pipeline.d.ts +9 -5
- package/dist/server/pages-request-pipeline.js +55 -7
- package/dist/server/pages-router-entry.d.ts +30 -0
- package/dist/server/pages-router-entry.js +108 -0
- package/dist/server/prerender-manifest.d.ts +3 -1
- package/dist/server/prerender-route-params.js +1 -1
- package/dist/server/prod-server.d.ts +5 -3
- package/dist/server/prod-server.js +68 -39
- package/dist/server/request-pipeline.js +2 -1
- package/dist/server/seed-cache.js +4 -4
- package/dist/shims/app-router-scroll-state.d.ts +1 -0
- package/dist/shims/app-router-scroll-state.js +1 -0
- package/dist/shims/app-router-scroll.js +2 -1
- package/dist/shims/cache-handler.js +8 -1
- package/dist/shims/cache.js +22 -15
- package/dist/shims/cdn-cache.js +1 -1
- package/dist/shims/dynamic-preload-chunks.js +2 -1
- package/dist/shims/fetch-cache.d.ts +3 -1
- package/dist/shims/fetch-cache.js +77 -52
- package/dist/shims/form.d.ts +4 -2
- package/dist/shims/form.js +37 -43
- package/dist/shims/headers.d.ts +7 -1
- package/dist/shims/headers.js +17 -3
- package/dist/shims/image.js +75 -14
- package/dist/shims/internal/app-prefetch-fetch-queue.d.ts +10 -0
- package/dist/shims/internal/app-prefetch-fetch-queue.js +61 -0
- package/dist/shims/internal/app-route-detection.d.ts +2 -17
- package/dist/shims/internal/app-route-detection.js +4 -17
- package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +23 -0
- package/dist/shims/internal/hybrid-client-route-owner-direct.js +51 -0
- package/dist/shims/internal/hybrid-client-route-owner.d.ts +3 -15
- package/dist/shims/internal/hybrid-client-route-owner.js +40 -58
- package/dist/shims/internal/pages-data-fetch-dedup.d.ts +10 -5
- package/dist/shims/internal/pages-data-fetch-dedup.js +84 -14
- package/dist/shims/internal/pages-data-target.d.ts +18 -12
- package/dist/shims/internal/pages-data-target.js +97 -13
- package/dist/shims/internal/pages-router-components.d.ts +7 -0
- package/dist/shims/internal/pages-router-components.js +13 -0
- package/dist/shims/layout-segment-context.d.ts +4 -1
- package/dist/shims/layout-segment-context.js +18 -4
- package/dist/shims/link.d.ts +1 -1
- package/dist/shims/link.js +224 -58
- package/dist/shims/navigation.d.ts +19 -3
- package/dist/shims/navigation.js +245 -47
- package/dist/shims/request-context.js +18 -0
- package/dist/shims/root-params.d.ts +15 -1
- package/dist/shims/root-params.js +21 -1
- package/dist/shims/router.d.ts +5 -7
- package/dist/shims/router.js +387 -102
- package/dist/shims/server.js +3 -2
- package/dist/shims/slot.js +3 -6
- package/dist/shims/unified-request-context.js +1 -0
- package/dist/typegen.js +1 -1
- package/dist/utils/client-runtime-metadata.d.ts +2 -18
- package/dist/utils/client-runtime-metadata.js +31 -22
- package/dist/utils/dev-stack-sourcemap-endpoint.d.ts +4 -0
- package/dist/{server → utils}/dev-stack-sourcemap-endpoint.js +1 -1
- package/dist/utils/domain-locale.d.ts +6 -3
- package/dist/{server → utils}/middleware-request-headers.d.ts +1 -1
- package/dist/{server → utils}/middleware-request-headers.js +3 -3
- package/dist/utils/project.d.ts +48 -2
- package/dist/utils/project.js +225 -4
- package/dist/utils/protocol-headers.d.ts +23 -0
- package/dist/utils/protocol-headers.js +23 -0
- package/dist/utils/react-version.d.ts +4 -0
- package/dist/utils/react-version.js +44 -0
- package/dist/utils/vite-version.d.ts +2 -0
- package/dist/utils/vite-version.js +11 -1
- package/package.json +47 -2
- package/dist/deploy.d.ts +0 -197
- package/dist/deploy.js +0 -1040
- package/dist/server/dev-stack-sourcemap-endpoint.d.ts +0 -4
- /package/dist/{cloudflare → packages/cloudflare}/src/utils/cache-control-metadata.js +0 -0
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { createRequestContext, runWithRequestContext } from "../shims/unified-request-context.js";
|
|
2
2
|
import { getRequestExecutionContext } from "../shims/request-context.js";
|
|
3
|
+
import "../utils/protocol-headers.js";
|
|
3
4
|
import { AppElementsWire } from "./app-elements-wire.js";
|
|
4
|
-
import { shouldSuppressLoadingBoundaries } from "./app-rsc-render-mode.js";
|
|
5
|
+
import { APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL, shouldSuppressLoadingBoundaries } from "./app-rsc-render-mode.js";
|
|
5
6
|
import "./app-elements.js";
|
|
6
7
|
import { consumeDynamicUsage, consumeInvalidDynamicUsageError, getAndClearPendingCookies, getDraftModeCookieHeader, getHeadersContext, isDraftModeRequest, markDynamicUsage, peekDynamicUsage, peekRenderRequestApiUsage, setHeadersContext } from "../shims/headers.js";
|
|
7
8
|
import { _consumeRequestScopedCacheLife, _peekRequestScopedCacheLife } from "../shims/cache-request-state.js";
|
|
8
|
-
import { ensureFetchPatch, getCollectedFetchTags, peekDynamicFetchObservations, runWithFetchDedupe, setCurrentFetchCacheMode, setCurrentFetchSoftTags, setCurrentForceDynamicFetchDefault } from "../shims/fetch-cache.js";
|
|
9
|
-
import { VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityIdHeader } from "./app-rsc-cache-busting.js";
|
|
9
|
+
import { ensureFetchPatch, getCollectedFetchTags, peekDynamicFetchObservations, runWithFetchDedupe, setCurrentFetchCacheMode, setCurrentFetchSoftTags, setCurrentForceDynamicFetchDefault, setRefreshStaleFetchesInForeground } from "../shims/fetch-cache.js";
|
|
10
|
+
import { VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityIdHeader, applyRscDeploymentIdHeader } from "./app-rsc-cache-busting.js";
|
|
10
11
|
import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
|
|
11
12
|
import "./app-page-response.js";
|
|
12
13
|
import { buildAppPageSpecialErrorResponse, probeAppPageThrownError, resolveAppPageSpecialError } from "./app-page-execution.js";
|
|
@@ -100,6 +101,10 @@ function getEffectiveLayoutClassifications(route, debugClassification) {
|
|
|
100
101
|
function shouldReadAppPageCache(options) {
|
|
101
102
|
return options.isProduction && !options.isProgressiveActionRender && !options.isDraftMode && !options.isForceDynamic && (options.isRscRequest || !options.scriptNonce) && (options.revalidateSeconds === null || options.revalidateSeconds > 0);
|
|
102
103
|
}
|
|
104
|
+
function resolveAppPageCacheReadRevalidateSeconds(options) {
|
|
105
|
+
if (options.revalidateSeconds === null && (options.isForceStatic || options.isDynamicError)) return Infinity;
|
|
106
|
+
return options.revalidateSeconds ?? 0;
|
|
107
|
+
}
|
|
103
108
|
function hasSearchParams(searchParams) {
|
|
104
109
|
return searchParams !== null && searchParams !== void 0 && searchParams.size > 0;
|
|
105
110
|
}
|
|
@@ -119,6 +124,7 @@ async function runAppPageRevalidationContext(options, renderFn) {
|
|
|
119
124
|
unstableCacheRevalidation: "foreground"
|
|
120
125
|
}), async () => {
|
|
121
126
|
ensureFetchPatch();
|
|
127
|
+
setRefreshStaleFetchesInForeground(process.env.VINEXT_PRERENDER === "1");
|
|
122
128
|
setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], options.routeSegments));
|
|
123
129
|
options.setNavigationContext({
|
|
124
130
|
pathname: options.displayPathname ?? options.cleanPathname,
|
|
@@ -154,10 +160,12 @@ async function dispatchAppPageInner(options) {
|
|
|
154
160
|
const isForceStatic = dynamicConfig === "force-static";
|
|
155
161
|
const isDynamicError = dynamicConfig === "error";
|
|
156
162
|
const isForceDynamic = dynamicConfig === "force-dynamic";
|
|
163
|
+
const isPrefetchDynamicShell = options.renderMode === APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL;
|
|
157
164
|
const isDraftMode = isDraftModeRequest(options.request, options.draftModeSecret);
|
|
158
165
|
const requestHeadersContext = getHeadersContext();
|
|
159
|
-
const
|
|
160
|
-
const
|
|
166
|
+
const shouldUseEmptySearchParams = isForceStatic || isPrefetchDynamicShell;
|
|
167
|
+
const hasRequestSearchParams = !shouldUseEmptySearchParams && hasSearchParams(options.searchParams);
|
|
168
|
+
const pageSearchParams = shouldUseEmptySearchParams ? new URLSearchParams() : options.searchParams;
|
|
161
169
|
const layoutParamAccess = createAppLayoutParamAccessTracker();
|
|
162
170
|
const hasActiveLoadingBoundary = shouldSuppressLoadingBoundaries(options.renderMode ?? "navigation") ? false : Boolean(route.loading?.default);
|
|
163
171
|
setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], route.routeSegments));
|
|
@@ -222,7 +230,11 @@ async function dispatchAppPageInner(options) {
|
|
|
222
230
|
mountedSlotsHeader: options.mountedSlotsHeader,
|
|
223
231
|
renderMode: options.renderMode,
|
|
224
232
|
expireSeconds: options.expireSeconds,
|
|
225
|
-
revalidateSeconds:
|
|
233
|
+
revalidateSeconds: resolveAppPageCacheReadRevalidateSeconds({
|
|
234
|
+
isDynamicError,
|
|
235
|
+
isForceStatic,
|
|
236
|
+
revalidateSeconds: currentRevalidateSeconds
|
|
237
|
+
}),
|
|
226
238
|
renderFreshPageForCache: async () => {
|
|
227
239
|
const revalidationTarget = await resolveAppPageInterceptionRerenderTarget({
|
|
228
240
|
cleanPathname: options.cleanPathname,
|
|
@@ -284,6 +296,7 @@ async function dispatchAppPageInner(options) {
|
|
|
284
296
|
return {
|
|
285
297
|
html: rendered.html,
|
|
286
298
|
htmlRenderObservation: rendered.htmlRenderObservation,
|
|
299
|
+
linkHeader: rendered.linkHeader,
|
|
287
300
|
rscData: rendered.rscData,
|
|
288
301
|
rscRenderObservation: rendered.rscRenderObservation,
|
|
289
302
|
tags: rendered.tags,
|
|
@@ -360,6 +373,7 @@ async function dispatchAppPageInner(options) {
|
|
|
360
373
|
});
|
|
361
374
|
mergeMiddlewareResponseHeaders(interceptHeaders, options.middlewareContext.headers);
|
|
362
375
|
applyRscCompatibilityIdHeader(interceptHeaders);
|
|
376
|
+
applyRscDeploymentIdHeader(interceptHeaders);
|
|
363
377
|
return new Response(interceptStream, {
|
|
364
378
|
status: options.middlewareContext.status ?? 200,
|
|
365
379
|
headers: interceptHeaders
|
|
@@ -427,6 +441,8 @@ async function dispatchAppPageInner(options) {
|
|
|
427
441
|
const activeFallbackShellState = options.pprRuntime?.getState() ?? null;
|
|
428
442
|
const pprFallbackShellSignal = activeFallbackShellState?.abortController.signal;
|
|
429
443
|
const pprFallbackShellReactSignal = activeFallbackShellState?.reactAbortController.signal;
|
|
444
|
+
const isPrerender = process.env.VINEXT_PRERENDER === "1";
|
|
445
|
+
const isSpeculativePrerender = isPrerender && options.request.headers.get("x-vinext-prerender-speculative") === "1";
|
|
430
446
|
return renderAppPageLifecycle({
|
|
431
447
|
basePath: options.basePath,
|
|
432
448
|
clientTraceMetadata: options.clientTraceMetadata,
|
|
@@ -458,7 +474,7 @@ async function dispatchAppPageInner(options) {
|
|
|
458
474
|
},
|
|
459
475
|
handlerStart: options.handlerStart,
|
|
460
476
|
hasLoadingBoundary: hasActiveLoadingBoundary,
|
|
461
|
-
omitPendingDynamicCacheState:
|
|
477
|
+
omitPendingDynamicCacheState: hasRequestSearchParams,
|
|
462
478
|
formState: options.formState ?? null,
|
|
463
479
|
isProgressiveActionRender: options.isProgressiveActionRender === true,
|
|
464
480
|
isDynamicError,
|
|
@@ -466,7 +482,8 @@ async function dispatchAppPageInner(options) {
|
|
|
466
482
|
isForceDynamic,
|
|
467
483
|
isForceStatic,
|
|
468
484
|
isEdgeRuntime: options.isEdgeRuntime === true,
|
|
469
|
-
isPrerender
|
|
485
|
+
isPrerender,
|
|
486
|
+
isSpeculativePrerender,
|
|
470
487
|
isProduction: options.isProduction,
|
|
471
488
|
isRscRequest: options.isRscRequest,
|
|
472
489
|
isrDebug: options.isrDebug,
|
|
@@ -482,6 +499,7 @@ async function dispatchAppPageInner(options) {
|
|
|
482
499
|
params: options.params,
|
|
483
500
|
pprFallbackShellSignal,
|
|
484
501
|
pprFallbackShellReactSignal,
|
|
502
|
+
renderedPathAndSearch: options.renderedPathAndSearch,
|
|
485
503
|
abortPprFallbackShell: activeFallbackShellState ? () => {
|
|
486
504
|
options.pprRuntime.beginFinalRender(activeFallbackShellState);
|
|
487
505
|
} : void 0,
|
|
@@ -95,6 +95,7 @@ type AppPageNavigationParamInterceptOptions = {
|
|
|
95
95
|
* {@link https://github.com/vercel/next.js/blob/canary/packages/next/src/server/app-render/create-metadata.tsx|create-metadata.tsx}.
|
|
96
96
|
*/
|
|
97
97
|
declare function buildPageElements<TModule extends AppPageModule = AppPageModule, TErrorModule extends AppPageErrorModule = AppPageErrorModule>(options: BuildPageElementsOptions<TModule, TErrorModule>): Promise<AppElements>;
|
|
98
|
+
declare function resolveInterceptedSlotSegments(sourcePageSegments: readonly string[] | null | undefined, slotKey: string): readonly string[] | null;
|
|
98
99
|
declare function resolveAppPageNavigationParams(route: AppPageNavigationParamRoute, routeParams: AppPageParams, routePath: string, opts?: AppPageNavigationParamInterceptOptions | null): AppPageParams;
|
|
99
100
|
//#endregion
|
|
100
|
-
export { AppPageBuildRoute, type AppPageErrorModule, AppPageInterceptOptions, AppPagePageRequest, type AppPageRouteWiringRoute, BuildPageElementsOptions, buildPageElements, resolveAppPageNavigationParams };
|
|
101
|
+
export { AppPageBuildRoute, type AppPageErrorModule, AppPageInterceptOptions, AppPagePageRequest, type AppPageRouteWiringRoute, BuildPageElementsOptions, buildPageElements, resolveAppPageNavigationParams, resolveInterceptedSlotSegments };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { matchRoutePattern } from "../routing/route-pattern.js";
|
|
2
1
|
import { AppElementsWire } from "./app-elements-wire.js";
|
|
3
2
|
import { APP_RSC_RENDER_MODE_NAVIGATION } from "./app-rsc-render-mode.js";
|
|
4
3
|
import "./app-elements.js";
|
|
5
4
|
import { createAppPageRenderIdentity } from "./app-page-render-identity.js";
|
|
5
|
+
import { matchRoutePattern } from "../routing/route-pattern.js";
|
|
6
6
|
import { makeThenableParams } from "../shims/thenable-params.js";
|
|
7
7
|
import { resolveAppPageBranchParams } from "./app-page-params.js";
|
|
8
8
|
import { resolveActiveParallelRouteHeadInputs, resolveAppPageHead } from "./app-page-head.js";
|
|
@@ -51,6 +51,8 @@ async function buildPageElements(options) {
|
|
|
51
51
|
const hasPageModule = !!pageModule;
|
|
52
52
|
const renderIdentity = createAppPageRenderIdentity({
|
|
53
53
|
displayPathname,
|
|
54
|
+
matchedRoutePathname: routePath,
|
|
55
|
+
targetMatchedPathname: routePath,
|
|
54
56
|
interceptionContext: opts?.interceptionContext ?? null,
|
|
55
57
|
interceptSourceMatchedUrl: opts?.interceptSourceMatchedUrl ?? null,
|
|
56
58
|
interceptSlotId: isSiblingIntercept ? null : opts?.interceptSlotId ?? null
|
|
@@ -181,18 +183,71 @@ function buildSlotOverrides(route, routeParams, routePath, opts) {
|
|
|
181
183
|
layoutModules: opts.interceptLayouts || null,
|
|
182
184
|
layoutSegments: opts.interceptLayoutSegments ?? null,
|
|
183
185
|
pageModule: opts.interceptPage,
|
|
184
|
-
params: opts.interceptParams || routeParams
|
|
186
|
+
params: opts.interceptParams || routeParams,
|
|
187
|
+
routeSegments: resolveInterceptedSlotSegments(opts.interceptSourcePageSegments, opts.interceptSlotKey)
|
|
185
188
|
};
|
|
186
189
|
const slotParamOverrides = resolveSlotParamOverrides(route, routePath);
|
|
187
190
|
for (const [slotKey, params] of Object.entries(slotParamOverrides ?? {})) {
|
|
188
191
|
const existing = overrides[slotKey];
|
|
189
192
|
overrides[slotKey] = existing ? {
|
|
190
193
|
...existing,
|
|
191
|
-
params
|
|
194
|
+
params: existing.params ?? params
|
|
192
195
|
} : { params };
|
|
193
196
|
}
|
|
194
197
|
return Object.keys(overrides).length > 0 ? overrides : null;
|
|
195
198
|
}
|
|
199
|
+
function resolveInterceptedSlotSegments(sourcePageSegments, slotKey) {
|
|
200
|
+
if (!sourcePageSegments) return null;
|
|
201
|
+
const markerTraversals = [
|
|
202
|
+
{
|
|
203
|
+
prefix: "(...)",
|
|
204
|
+
levels: Number.POSITIVE_INFINITY
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
prefix: "(..)(..)",
|
|
208
|
+
levels: 2
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
prefix: "(..)",
|
|
212
|
+
levels: 1
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
prefix: "(.)",
|
|
216
|
+
levels: 0
|
|
217
|
+
}
|
|
218
|
+
];
|
|
219
|
+
const markerIndex = sourcePageSegments.findIndex((segment) => markerTraversals.some(({ prefix }) => segment.startsWith(prefix)));
|
|
220
|
+
if (markerIndex < 0) return null;
|
|
221
|
+
const slotPathSeparator = slotKey.indexOf("@");
|
|
222
|
+
const ownerSegments = (slotPathSeparator >= 0 ? slotKey.slice(slotPathSeparator + 1) : "").split("/").filter(Boolean);
|
|
223
|
+
let segmentStart = ownerSegments.length;
|
|
224
|
+
if (segmentStart === 0 || segmentStart > markerIndex || !ownerSegments.every((segment, index) => sourcePageSegments[index] === segment)) {
|
|
225
|
+
let slotName = null;
|
|
226
|
+
for (let index = ownerSegments.length - 1; index >= 0; index--) if (ownerSegments[index].startsWith("@")) {
|
|
227
|
+
slotName = ownerSegments[index];
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
let slotIndex = -1;
|
|
231
|
+
if (slotName) {
|
|
232
|
+
for (let index = markerIndex - 1; index >= 0; index--) if (sourcePageSegments[index] === slotName) {
|
|
233
|
+
slotIndex = index;
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (slotIndex < 0) return null;
|
|
238
|
+
segmentStart = slotIndex + 1;
|
|
239
|
+
}
|
|
240
|
+
const routeSegments = sourcePageSegments.slice(segmentStart, markerIndex).filter((segment) => !segment.startsWith("@") && !(segment.startsWith("(") && segment.endsWith(")")));
|
|
241
|
+
const markerSegment = sourcePageSegments[markerIndex];
|
|
242
|
+
const marker = markerTraversals.find(({ prefix }) => markerSegment.startsWith(prefix));
|
|
243
|
+
if (!marker) return null;
|
|
244
|
+
if (Number.isFinite(marker.levels)) routeSegments.splice(Math.max(0, routeSegments.length - marker.levels), marker.levels);
|
|
245
|
+
else routeSegments.length = 0;
|
|
246
|
+
const targetSegment = markerSegment.slice(marker.prefix.length);
|
|
247
|
+
if (targetSegment) routeSegments.push(targetSegment);
|
|
248
|
+
routeSegments.push(...sourcePageSegments.slice(markerIndex + 1).filter((segment) => !segment.startsWith("@") && !(segment.startsWith("(") && segment.endsWith(")"))));
|
|
249
|
+
return routeSegments;
|
|
250
|
+
}
|
|
196
251
|
function resolveSlotParamOverrides(route, routePath) {
|
|
197
252
|
const overrides = {};
|
|
198
253
|
const slots = route.slots;
|
|
@@ -238,4 +293,4 @@ function collectParamNameSet(params) {
|
|
|
238
293
|
return set;
|
|
239
294
|
}
|
|
240
295
|
//#endregion
|
|
241
|
-
export { buildPageElements, resolveAppPageNavigationParams };
|
|
296
|
+
export { buildPageElements, resolveAppPageNavigationParams, resolveInterceptedSlotSegments };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { addBasePathToPathname } from "../utils/base-path.js";
|
|
2
2
|
import { VINEXT_RSC_REDIRECT_HEADER } from "./headers.js";
|
|
3
3
|
import { runWithConnectionProbe } from "../shims/headers.js";
|
|
4
|
-
import { VINEXT_RSC_CONTENT_TYPE, applyRscCompatibilityIdHeader, createRscRedirectLocation } from "./app-rsc-cache-busting.js";
|
|
4
|
+
import { VINEXT_RSC_CONTENT_TYPE, applyRscCompatibilityIdHeader, applyRscDeploymentIdHeader, createRscRedirectLocation } from "./app-rsc-cache-busting.js";
|
|
5
5
|
import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
|
|
6
6
|
import { applyEdgeRuntimeHeader } from "./app-page-response.js";
|
|
7
7
|
import { parseNextHttpErrorDigest, parseNextRedirectDigest } from "./next-error-digest.js";
|
|
@@ -161,6 +161,7 @@ async function buildAppPageSpecialErrorResponse(options) {
|
|
|
161
161
|
});
|
|
162
162
|
applyEdgeRuntimeHeader(headers, options.isEdgeRuntime);
|
|
163
163
|
applyRscCompatibilityIdHeader(headers);
|
|
164
|
+
applyRscDeploymentIdHeader(headers);
|
|
164
165
|
mergeMiddlewareResponseHeaders(headers, options.middlewareContext?.headers ?? null);
|
|
165
166
|
const pendingCookies = options.getAndClearPendingCookies?.() ?? [];
|
|
166
167
|
for (const cookie of pendingCookies) headers.append("Set-Cookie", cookie);
|
|
@@ -12,6 +12,7 @@ const DEFAULT_SUBTREE_PROBE_MAX_NODES = 1e3;
|
|
|
12
12
|
const REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref");
|
|
13
13
|
const REACT_LAZY_TYPE = Symbol.for("react.lazy");
|
|
14
14
|
const REACT_MEMO_TYPE = Symbol.for("react.memo");
|
|
15
|
+
const REACT_CLIENT_REFERENCE_TYPE = Symbol.for("react.client.reference");
|
|
15
16
|
var AppPageSubtreeProbeLimitError = class extends Error {
|
|
16
17
|
constructor(message) {
|
|
17
18
|
super(message);
|
|
@@ -36,6 +37,9 @@ function isObjectLike(value) {
|
|
|
36
37
|
function isUnknownFunction(value) {
|
|
37
38
|
return typeof value === "function";
|
|
38
39
|
}
|
|
40
|
+
function isReactClientReference(value) {
|
|
41
|
+
return isObjectLike(value) && Reflect.get(value, "$$typeof") === REACT_CLIENT_REFERENCE_TYPE;
|
|
42
|
+
}
|
|
39
43
|
function readReactMemoType(value) {
|
|
40
44
|
if (!isObjectLike(value) || Reflect.get(value, "$$typeof") !== REACT_MEMO_TYPE) return null;
|
|
41
45
|
return { innerType: Reflect.get(value, "type") };
|
|
@@ -80,6 +84,7 @@ async function probeReactServerSubtree(node, options = {}) {
|
|
|
80
84
|
};
|
|
81
85
|
const renderElementType = async (type, props, depth, wrapperDepth = 0) => {
|
|
82
86
|
if (wrapperDepth > maxDepth) throw new AppPageSubtreeProbeLimitError("App page layout subtree probe exceeded max depth");
|
|
87
|
+
if (isReactClientReference(type)) return false;
|
|
83
88
|
if (isUnknownFunction(type)) {
|
|
84
89
|
await visit(type(props), depth + 1);
|
|
85
90
|
return true;
|
|
@@ -2,6 +2,8 @@ import { AppElementsInterception } from "./app-elements-wire.js";
|
|
|
2
2
|
//#region src/server/app-page-render-identity.d.ts
|
|
3
3
|
type AppPageRenderIdentityInput = {
|
|
4
4
|
displayPathname: string;
|
|
5
|
+
matchedRoutePathname?: string;
|
|
6
|
+
targetMatchedPathname?: string;
|
|
5
7
|
interceptionContext?: string | null;
|
|
6
8
|
interceptSourceMatchedUrl?: string | null;
|
|
7
9
|
interceptSlotId?: string | null;
|
|
@@ -13,10 +13,11 @@ function normalizeAppPageInterceptionProofPathname(pathname) {
|
|
|
13
13
|
}
|
|
14
14
|
function createAppPageRenderIdentity(input) {
|
|
15
15
|
const interceptionContext = input.interceptionContext ?? null;
|
|
16
|
-
const targetMatchedPathname = normalizeAppPageRenderMatchedPathname(input.displayPathname);
|
|
16
|
+
const targetMatchedPathname = normalizeAppPageRenderMatchedPathname(input.targetMatchedPathname ?? input.displayPathname);
|
|
17
|
+
const requestedMatchedRoutePathname = normalizeAppPageRenderMatchedPathname(input.matchedRoutePathname ?? input.targetMatchedPathname ?? input.displayPathname);
|
|
17
18
|
const sourceMatchedPathname = normalizeAppPageInterceptionProofPathname(input.interceptSourceMatchedUrl ?? null);
|
|
18
19
|
const slotId = input.interceptSlotId ?? null;
|
|
19
|
-
const matchedRoutePathname = sourceMatchedPathname ??
|
|
20
|
+
const matchedRoutePathname = sourceMatchedPathname ?? requestedMatchedRoutePathname;
|
|
20
21
|
const routeId = AppElementsWire.encodeRouteId(matchedRoutePathname, null);
|
|
21
22
|
const pageId = AppElementsWire.encodePageId(matchedRoutePathname, null);
|
|
22
23
|
const interception = sourceMatchedPathname === null || slotId === null ? null : {
|
|
@@ -60,6 +60,7 @@ type RenderAppPageLifecycleOptions = {
|
|
|
60
60
|
isForceStatic: boolean;
|
|
61
61
|
isProgressiveActionRender?: boolean;
|
|
62
62
|
isPrerender?: boolean;
|
|
63
|
+
isSpeculativePrerender?: boolean;
|
|
63
64
|
isProduction: boolean;
|
|
64
65
|
probePageBeforeRender?: boolean;
|
|
65
66
|
omitPendingDynamicCacheState?: boolean;
|
|
@@ -103,6 +104,7 @@ type RenderAppPageLifecycleOptions = {
|
|
|
103
104
|
clientReuseManifest?: ClientReuseManifestParseResult;
|
|
104
105
|
skipDisposition?: ClientReuseManifestSkipDisposition;
|
|
105
106
|
mountedSlotsHeader?: string | null;
|
|
107
|
+
renderedPathAndSearch?: string | null;
|
|
106
108
|
renderMode?: AppRscRenderMode;
|
|
107
109
|
waitUntil?: (promise: Promise<void>) => void;
|
|
108
110
|
layoutParamAccess?: AppLayoutParamAccessTracker;
|
|
@@ -2,6 +2,7 @@ import { NEVER_CACHE_CONTROL, NO_STORE_CACHE_CONTROL, applyCdnResponseHeaders }
|
|
|
2
2
|
import { createArtifactCompatibilityEnvelope, createArtifactCompatibilityGraphVersion } from "./artifact-compatibility.js";
|
|
3
3
|
import { AppElementsWire, isAppElementsRecord } from "./app-elements-wire.js";
|
|
4
4
|
import "./app-elements.js";
|
|
5
|
+
import { peekDynamicUsage } from "../shims/headers.js";
|
|
5
6
|
import { runWithFetchDedupe } from "../shims/fetch-cache.js";
|
|
6
7
|
import { buildAppPageHtmlResponse, buildAppPageRscResponse, resolveAppPageHtmlResponsePolicy, resolveAppPageRscResponsePolicy } from "./app-page-response.js";
|
|
7
8
|
import { buildAppPageFontLinkHeader, readAppPageBinaryStream, resolveAppPageSpecialError, teeAppPageRscStreamForCapture } from "./app-page-execution.js";
|
|
@@ -26,8 +27,14 @@ function buildResponseTiming(options) {
|
|
|
26
27
|
};
|
|
27
28
|
}
|
|
28
29
|
function readRequestCacheLifeForPrerender(options) {
|
|
30
|
+
if (options.isEdgeRuntime && options.revalidateSeconds === null) return (options.peekRequestCacheLife?.() ?? options.getRequestCacheLife())?.revalidate !== void 0 ? { revalidate: 0 } : null;
|
|
29
31
|
return options.peekRequestCacheLife?.() ?? options.getRequestCacheLife();
|
|
30
32
|
}
|
|
33
|
+
function readRequestCacheLifeForCachePolicy(options) {
|
|
34
|
+
const requestCacheLife = options.getRequestCacheLife();
|
|
35
|
+
if (options.isEdgeRuntime && options.revalidateSeconds === null) return null;
|
|
36
|
+
return requestCacheLife;
|
|
37
|
+
}
|
|
31
38
|
function applyRequestCacheLife(options) {
|
|
32
39
|
let revalidateSeconds = options.revalidateSeconds;
|
|
33
40
|
let expireSeconds = options.expireSeconds;
|
|
@@ -39,6 +46,10 @@ function applyRequestCacheLife(options) {
|
|
|
39
46
|
revalidateSeconds
|
|
40
47
|
};
|
|
41
48
|
}
|
|
49
|
+
function resolveAppPageCacheWriteRevalidateSeconds(options) {
|
|
50
|
+
if (options.revalidateSeconds === null && (options.isForceStatic || options.isDynamicError)) return Infinity;
|
|
51
|
+
return options.revalidateSeconds;
|
|
52
|
+
}
|
|
42
53
|
function readRootBoundaryId(element) {
|
|
43
54
|
const rootLayoutTreePath = element[AppElementsWire.keys.rootLayout];
|
|
44
55
|
return typeof rootLayoutTreePath === "string" ? rootLayoutTreePath : null;
|
|
@@ -314,6 +325,7 @@ async function renderAppPageLifecycle(options) {
|
|
|
314
325
|
const outgoingElement = AppElementsWire.encodeOutgoingPayload({
|
|
315
326
|
element: options.element,
|
|
316
327
|
layoutFlags,
|
|
328
|
+
...options.dynamicStaleTimeSeconds !== void 0 && options.isPrerender !== true && !options.isForceStatic ? { dynamicStaleTimeSeconds: options.dynamicStaleTimeSeconds } : {},
|
|
317
329
|
...artifactCompatibility ? { artifactCompatibility } : {},
|
|
318
330
|
renderObservation: payloadRenderObservation,
|
|
319
331
|
skipDisposition: options.isRscRequest ? skipDisposition : void 0
|
|
@@ -336,6 +348,8 @@ async function renderAppPageLifecycle(options) {
|
|
|
336
348
|
if (options.pprFallbackShellSignal) pprFallbackShellRsc = new Uint8Array(await readAppPageBinaryStream(rscStream));
|
|
337
349
|
let revalidateSeconds = options.revalidateSeconds;
|
|
338
350
|
let expireSeconds = options.expireSeconds;
|
|
351
|
+
const shouldWaitForAllReady = options.isPrerender === true && options.isSpeculativePrerender !== true;
|
|
352
|
+
const shouldReadRequestCacheLifeForPrerender = options.isPrerender === true;
|
|
339
353
|
const shouldCaptureRscForCacheMetadata = options.isProgressiveActionRender !== true && (options.isProduction || options.isPrerender === true) && (revalidateSeconds === null || revalidateSeconds > 0 && revalidateSeconds !== Infinity) && !options.isDraftMode && !options.isForceDynamic && !shouldBypassRscCacheForSkipTransport;
|
|
340
354
|
const createBufferedRscStream = (close) => new ReadableStream({ start(controller) {
|
|
341
355
|
if (pprFallbackShellRsc) controller.enqueue(pprFallbackShellRsc);
|
|
@@ -349,11 +363,13 @@ async function renderAppPageLifecycle(options) {
|
|
|
349
363
|
const capturedRscDataRef = { value: null };
|
|
350
364
|
if (rscCapture.sideStream && options.isRscRequest) capturedRscDataRef.value = readAppPageBinaryStream(rscCapture.sideStream);
|
|
351
365
|
if (options.isRscRequest) {
|
|
352
|
-
|
|
353
|
-
|
|
366
|
+
let requestCacheLifeForPrerender = null;
|
|
367
|
+
if (shouldWaitForAllReady) await settleCapturedRscRenderForCacheMetadata(capturedRscDataRef.value);
|
|
368
|
+
if (shouldReadRequestCacheLifeForPrerender) {
|
|
369
|
+
requestCacheLifeForPrerender = readRequestCacheLifeForPrerender(options);
|
|
354
370
|
({expireSeconds, revalidateSeconds} = applyRequestCacheLife({
|
|
355
371
|
expireSeconds,
|
|
356
|
-
requestCacheLife:
|
|
372
|
+
requestCacheLife: requestCacheLifeForPrerender,
|
|
357
373
|
revalidateSeconds
|
|
358
374
|
}));
|
|
359
375
|
}
|
|
@@ -376,6 +392,8 @@ async function renderAppPageLifecycle(options) {
|
|
|
376
392
|
mountedSlotsHeader: options.mountedSlotsHeader,
|
|
377
393
|
params: options.navigationParams,
|
|
378
394
|
policy: rscResponsePolicy,
|
|
395
|
+
renderedPathAndSearch: options.renderedPathAndSearch,
|
|
396
|
+
requestCacheLife: requestCacheLifeForPrerender,
|
|
379
397
|
timing: buildResponseTiming({
|
|
380
398
|
compileEnd,
|
|
381
399
|
handlerStart: options.handlerStart,
|
|
@@ -405,17 +423,22 @@ async function renderAppPageLifecycle(options) {
|
|
|
405
423
|
return options.getPageTags();
|
|
406
424
|
},
|
|
407
425
|
getRequestCacheLife() {
|
|
408
|
-
return options
|
|
426
|
+
return readRequestCacheLifeForCachePolicy(options);
|
|
409
427
|
},
|
|
410
428
|
isrDebug: options.isrDebug,
|
|
411
429
|
isrRscKey: options.isrRscKey,
|
|
412
430
|
isrSet: options.isrSet,
|
|
413
431
|
interceptionContext: options.interceptionContext,
|
|
414
432
|
mountedSlotsHeader: options.mountedSlotsHeader,
|
|
433
|
+
omitPendingDynamicCacheState: options.omitPendingDynamicCacheState,
|
|
415
434
|
renderMode: options.renderMode,
|
|
416
435
|
preserveClientResponseHeaders: rscResponsePolicy.cacheState !== "MISS",
|
|
417
436
|
expireSeconds,
|
|
418
|
-
revalidateSeconds
|
|
437
|
+
revalidateSeconds: resolveAppPageCacheWriteRevalidateSeconds({
|
|
438
|
+
isDynamicError: options.isDynamicError,
|
|
439
|
+
isForceStatic: options.isForceStatic,
|
|
440
|
+
revalidateSeconds
|
|
441
|
+
}),
|
|
419
442
|
waitUntil(promise) {
|
|
420
443
|
options.waitUntil?.(promise);
|
|
421
444
|
}
|
|
@@ -427,6 +450,7 @@ async function renderAppPageLifecycle(options) {
|
|
|
427
450
|
getStyles: options.getFontStyles
|
|
428
451
|
});
|
|
429
452
|
const fontLinkHeader = buildAppPageFontLinkHeader(fontData.preloads);
|
|
453
|
+
let dynamicUsedDuringHtmlRender = false;
|
|
430
454
|
let renderEnd;
|
|
431
455
|
const htmlRender = await renderAppPageHtmlStreamWithRecovery({
|
|
432
456
|
onShellRendered() {
|
|
@@ -440,6 +464,19 @@ async function renderAppPageLifecycle(options) {
|
|
|
440
464
|
const ssrHandler = await options.loadSsrHandler();
|
|
441
465
|
return renderAppPageHtmlStream({
|
|
442
466
|
capturedRscDataRef,
|
|
467
|
+
getInitialNavigationCacheMetadata: () => {
|
|
468
|
+
let kind;
|
|
469
|
+
if (options.isForceStatic) kind = "static";
|
|
470
|
+
else if (options.isForceDynamic || dynamicUsedDuringHtmlRender || peekDynamicUsage()) kind = "dynamic";
|
|
471
|
+
else {
|
|
472
|
+
const observation = options.peekRenderObservationState?.();
|
|
473
|
+
kind = observation && (observation.dynamicFetches.length > 0 || observation.requestApis.length > 0) ? "dynamic" : "static";
|
|
474
|
+
}
|
|
475
|
+
return {
|
|
476
|
+
kind,
|
|
477
|
+
...kind === "dynamic" && options.dynamicStaleTimeSeconds !== void 0 && options.isPrerender !== true && !shouldCaptureRscForCacheMetadata ? { dynamicStaleTimeSeconds: options.dynamicStaleTimeSeconds } : {}
|
|
478
|
+
};
|
|
479
|
+
},
|
|
443
480
|
fontData,
|
|
444
481
|
hasCustomGlobalError: options.hasCustomGlobalError,
|
|
445
482
|
navigationContext: options.getNavigationContext(),
|
|
@@ -453,7 +490,8 @@ async function renderAppPageLifecycle(options) {
|
|
|
453
490
|
scriptNonce: options.scriptNonce,
|
|
454
491
|
sideStream: rscCapture.sideStream,
|
|
455
492
|
ssrHandler,
|
|
456
|
-
|
|
493
|
+
fallbackToErrorDocumentOnShellError: options.isPrerender === true && options.isSpeculativePrerender === true ? false : void 0,
|
|
494
|
+
waitForAllReady: shouldWaitForAllReady
|
|
457
495
|
});
|
|
458
496
|
},
|
|
459
497
|
renderSpecialErrorResponse(specialError) {
|
|
@@ -476,19 +514,33 @@ async function renderAppPageLifecycle(options) {
|
|
|
476
514
|
}
|
|
477
515
|
}
|
|
478
516
|
}
|
|
479
|
-
|
|
480
|
-
|
|
517
|
+
let requestCacheLifeForPrerender = null;
|
|
518
|
+
let dynamicUsedDuringRender = options.consumeDynamicUsage();
|
|
519
|
+
dynamicUsedDuringHtmlRender = dynamicUsedDuringRender;
|
|
520
|
+
const stopSpeculativeMetadataWaitOnDynamicUsage = options.isSpeculativePrerender === true && shouldReadRequestCacheLifeForPrerender ? () => {
|
|
521
|
+
if (dynamicUsedDuringRender || (options.peekDynamicUsage?.() ?? peekDynamicUsage())) {
|
|
522
|
+
dynamicUsedDuringRender = true;
|
|
523
|
+
dynamicUsedDuringHtmlRender = true;
|
|
524
|
+
return true;
|
|
525
|
+
}
|
|
526
|
+
return false;
|
|
527
|
+
} : void 0;
|
|
528
|
+
if (shouldWaitForAllReady || shouldReadRequestCacheLifeForPrerender) await settleCapturedRscRenderForCacheMetadata(htmlRender.capturedRscData, stopSpeculativeMetadataWaitOnDynamicUsage);
|
|
529
|
+
if (shouldReadRequestCacheLifeForPrerender) {
|
|
530
|
+
requestCacheLifeForPrerender = readRequestCacheLifeForPrerender(options);
|
|
481
531
|
({expireSeconds, revalidateSeconds} = applyRequestCacheLife({
|
|
482
532
|
expireSeconds,
|
|
483
|
-
requestCacheLife:
|
|
533
|
+
requestCacheLife: requestCacheLifeForPrerender,
|
|
484
534
|
revalidateSeconds
|
|
485
535
|
}));
|
|
486
536
|
}
|
|
487
|
-
|
|
537
|
+
dynamicUsedDuringRender = dynamicUsedDuringRender || options.consumeDynamicUsage();
|
|
538
|
+
dynamicUsedDuringHtmlRender = dynamicUsedDuringRender;
|
|
488
539
|
const draftCookie = options.getDraftModeCookieHeader();
|
|
489
540
|
let dynamicUsedBeforeContextCleanup = dynamicUsedDuringRender;
|
|
490
541
|
const safeHtmlStream = deferUntilStreamConsumed(htmlStream, () => {
|
|
491
542
|
dynamicUsedBeforeContextCleanup = dynamicUsedBeforeContextCleanup || options.consumeDynamicUsage();
|
|
543
|
+
dynamicUsedDuringHtmlRender = dynamicUsedBeforeContextCleanup;
|
|
492
544
|
options.clearRequestContext();
|
|
493
545
|
});
|
|
494
546
|
const htmlResponsePolicy = resolveAppPageHtmlResponsePolicy({
|
|
@@ -520,12 +572,13 @@ async function renderAppPageLifecycle(options) {
|
|
|
520
572
|
status: 500
|
|
521
573
|
},
|
|
522
574
|
policy: { cacheControl: NEVER_CACHE_CONTROL },
|
|
575
|
+
requestCacheLife: requestCacheLifeForPrerender,
|
|
523
576
|
timing: htmlResponseTiming
|
|
524
577
|
});
|
|
525
578
|
applyCdnResponseHeaders(response.headers, { cacheControl: NEVER_CACHE_CONTROL });
|
|
526
579
|
return response;
|
|
527
580
|
}
|
|
528
|
-
const shouldSpeculativelyWriteCache = options.isProduction && shouldCaptureRscForCacheMetadata && revalidateSeconds === null && !options.isDynamicError && !options.isForceStatic && !options.scriptNonce && options.isProgressiveActionRender !== true && !dynamicUsedDuringRender;
|
|
581
|
+
const shouldSpeculativelyWriteCache = options.isProduction && shouldCaptureRscForCacheMetadata && !options.isEdgeRuntime && revalidateSeconds === null && !options.isDynamicError && !options.isForceStatic && !options.scriptNonce && options.isProgressiveActionRender !== true && !dynamicUsedDuringRender;
|
|
529
582
|
if (htmlResponsePolicy.shouldWriteToCache || shouldSpeculativelyWriteCache) {
|
|
530
583
|
const isrResponse = buildAppPageHtmlResponse(safeHtmlStream, {
|
|
531
584
|
draftCookie,
|
|
@@ -533,6 +586,7 @@ async function renderAppPageLifecycle(options) {
|
|
|
533
586
|
isEdgeRuntime: options.isEdgeRuntime,
|
|
534
587
|
middlewareContext: options.middlewareContext,
|
|
535
588
|
policy: htmlResponsePolicy,
|
|
589
|
+
requestCacheLife: requestCacheLifeForPrerender,
|
|
536
590
|
timing: htmlResponseTiming
|
|
537
591
|
});
|
|
538
592
|
if (options.isPrerender === true) return isrResponse;
|
|
@@ -572,7 +626,7 @@ async function renderAppPageLifecycle(options) {
|
|
|
572
626
|
return options.getPageTags();
|
|
573
627
|
},
|
|
574
628
|
getRequestCacheLife() {
|
|
575
|
-
return options
|
|
629
|
+
return readRequestCacheLifeForCachePolicy(options);
|
|
576
630
|
},
|
|
577
631
|
isrDebug: options.isrDebug,
|
|
578
632
|
isrHtmlKey: options.isrHtmlKey,
|
|
@@ -582,7 +636,11 @@ async function renderAppPageLifecycle(options) {
|
|
|
582
636
|
omitPendingDynamicCacheState: options.omitPendingDynamicCacheState,
|
|
583
637
|
preserveClientResponseHeaders: !htmlResponsePolicy.shouldWriteToCache,
|
|
584
638
|
expireSeconds,
|
|
585
|
-
revalidateSeconds
|
|
639
|
+
revalidateSeconds: resolveAppPageCacheWriteRevalidateSeconds({
|
|
640
|
+
isDynamicError: options.isDynamicError,
|
|
641
|
+
isForceStatic: options.isForceStatic,
|
|
642
|
+
revalidateSeconds
|
|
643
|
+
}),
|
|
586
644
|
waitUntil(cachePromise) {
|
|
587
645
|
options.waitUntil?.(cachePromise);
|
|
588
646
|
}
|
|
@@ -594,14 +652,25 @@ async function renderAppPageLifecycle(options) {
|
|
|
594
652
|
isEdgeRuntime: options.isEdgeRuntime,
|
|
595
653
|
middlewareContext: options.middlewareContext,
|
|
596
654
|
policy: htmlResponsePolicy,
|
|
655
|
+
requestCacheLife: requestCacheLifeForPrerender,
|
|
597
656
|
timing: htmlResponseTiming
|
|
598
657
|
});
|
|
599
658
|
}
|
|
600
|
-
async function settleCapturedRscRenderForCacheMetadata(capturedRscDataPromise) {
|
|
659
|
+
async function settleCapturedRscRenderForCacheMetadata(capturedRscDataPromise, shouldStopWaiting) {
|
|
601
660
|
if (!capturedRscDataPromise) return;
|
|
661
|
+
if (!shouldStopWaiting) {
|
|
662
|
+
try {
|
|
663
|
+
await capturedRscDataPromise;
|
|
664
|
+
} catch {}
|
|
665
|
+
return;
|
|
666
|
+
}
|
|
667
|
+
let settled = false;
|
|
668
|
+
const settledPromise = capturedRscDataPromise.catch(() => {}).then(() => {
|
|
669
|
+
settled = true;
|
|
670
|
+
});
|
|
602
671
|
try {
|
|
603
|
-
await
|
|
604
|
-
}
|
|
672
|
+
while (!settled && !shouldStopWaiting()) await Promise.race([settledPromise, new Promise((resolve) => setTimeout(resolve, 0))]);
|
|
673
|
+
} finally {}
|
|
605
674
|
}
|
|
606
675
|
//#endregion
|
|
607
676
|
export { renderAppPageLifecycle };
|
|
@@ -12,8 +12,20 @@ type GenerateStaticParamsModule = {
|
|
|
12
12
|
};
|
|
13
13
|
type GenerateStaticParamsSource = {
|
|
14
14
|
generateStaticParams: GenerateStaticParams;
|
|
15
|
+
paramAliases?: Readonly<Record<string, string>>;
|
|
16
|
+
paramPatternParts?: readonly string[];
|
|
17
|
+
routePatternParts?: readonly string[];
|
|
15
18
|
parentParamNames: readonly string[];
|
|
16
19
|
};
|
|
20
|
+
type ParallelGenerateStaticParamsBranch = {
|
|
21
|
+
configLayouts?: readonly (GenerateStaticParamsModule | null | undefined)[] | null;
|
|
22
|
+
configLayoutTreePositions?: readonly number[] | null;
|
|
23
|
+
layout?: GenerateStaticParamsModule | null;
|
|
24
|
+
page?: GenerateStaticParamsModule | null;
|
|
25
|
+
paramNames?: readonly string[] | null;
|
|
26
|
+
patternParts?: readonly string[] | null;
|
|
27
|
+
routeSegments?: readonly string[] | null;
|
|
28
|
+
};
|
|
17
29
|
type ValidateAppPageDynamicParamsOptions = {
|
|
18
30
|
clearRequestContext: () => void;
|
|
19
31
|
enforceStaticParamsOnly: boolean;
|
|
@@ -25,6 +37,8 @@ type ResolveAppPageGenerateStaticParamsSourcesOptions = {
|
|
|
25
37
|
layouts?: readonly (GenerateStaticParamsModule | null | undefined)[];
|
|
26
38
|
layoutTreePositions?: readonly number[];
|
|
27
39
|
page?: GenerateStaticParamsModule | null;
|
|
40
|
+
parallelBranches?: readonly (ParallelGenerateStaticParamsBranch | null | undefined)[];
|
|
41
|
+
routePatternParts?: readonly string[];
|
|
28
42
|
routeSegments: readonly string[];
|
|
29
43
|
};
|
|
30
44
|
type BuildAppPageElementOptions<TElement> = {
|