vinext 1.0.0-beta.0 → 1.0.0-beta.2
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 +21 -2
- package/dist/build/assets-ignore.js +1 -1
- package/dist/build/clean-output.js +1 -1
- package/dist/build/client-build-config.js +7 -4
- package/dist/build/css-url-assets.js +3 -3
- package/dist/build/google-fonts/fallback-metrics.js +1 -1
- package/dist/build/google-fonts/font-metadata.js +1 -1
- package/dist/build/inject-pregenerated-paths.js +1 -1
- package/dist/build/inline-css.js +2 -5
- package/dist/build/module-dependency-cache.d.ts +4 -0
- package/dist/build/module-dependency-cache.js +13 -0
- package/dist/build/next-client-runtime-manifests.js +1 -1
- package/dist/build/pages-client-assets-module.js +1 -1
- package/dist/build/precompress.js +7 -7
- package/dist/build/prerender-paths.d.ts +2 -2
- package/dist/build/prerender-paths.js +10 -15
- package/dist/build/prerender-server-pool.js +2 -2
- package/dist/build/prerender.js +1 -1
- package/dist/build/preview-credentials.d.ts +11 -0
- package/dist/build/preview-credentials.js +19 -0
- package/dist/build/report.d.ts +8 -4
- package/dist/build/report.js +14 -6
- package/dist/build/run-prerender.d.ts +2 -11
- package/dist/build/run-prerender.js +2 -10
- package/dist/build/server-manifest.js +1 -1
- package/dist/build/ssr-manifest.d.ts +4 -0
- package/dist/build/ssr-manifest.js +10 -6
- package/dist/build/standalone.js +37 -37
- package/dist/cache/cache-adapters-virtual.d.ts +1 -17
- package/dist/cache/cache-adapters-virtual.js +20 -11
- package/dist/check.d.ts +0 -16
- package/dist/check.js +27 -36
- package/dist/cli.js +61 -55
- package/dist/client/instrumentation-client-inject.js +1 -1
- package/dist/client/pages-router-link-navigation.js +1 -1
- package/dist/config/config-matchers.d.ts +13 -37
- package/dist/config/config-matchers.js +33 -123
- package/dist/config/dotenv.js +1 -1
- package/dist/config/next-config.d.ts +7 -3
- package/dist/config/next-config.js +84 -15
- package/dist/config/prerender.d.ts +2 -2
- package/dist/config/prerender.js +7 -15
- package/dist/config/request-context.d.ts +14 -0
- package/dist/config/request-context.js +26 -0
- package/dist/config/server-external-packages.js +1 -1
- package/dist/config/tsconfig-paths.js +2 -2
- package/dist/{node_modules/.pnpm/am-i-vibing@0.5.0/node_modules → deps/.pnpm/am-i-vibing@0.5.0/deps}/am-i-vibing/dist/detector-1yx2Hoe0.js +2 -2
- package/dist/deps/.pnpm/pathslash@0.1.0/deps/pathslash/dist/index.js +50 -0
- package/dist/entries/app-rsc-entry.js +39 -14
- package/dist/entries/app-rsc-manifest.js +21 -4
- package/dist/entries/pages-client-entry.js +6 -5
- package/dist/entries/pages-server-entry.js +18 -28
- package/dist/entries/runtime-entry-module.js +2 -2
- package/dist/index.js +314 -230
- package/dist/init-cloudflare.js +1 -1
- package/dist/init-platform.js +1 -1
- package/dist/init.d.ts +6 -4
- package/dist/init.js +25 -27
- package/dist/plugins/ast-utils.js +1 -1
- package/dist/plugins/dynamic-preload-metadata.js +7 -7
- package/dist/plugins/extensionless-dynamic-import.js +1 -1
- package/dist/plugins/fonts.js +3 -3
- package/dist/plugins/ignore-dynamic-requests.js +13 -8
- package/dist/plugins/import-meta-url.js +16 -17
- package/dist/plugins/middleware-export-validation.js +1 -1
- package/dist/plugins/middleware-server-only.js +2 -2
- package/dist/plugins/og-asset-ownership.js +7 -6
- package/dist/plugins/og-assets.js +5 -6
- package/dist/plugins/optimize-imports.js +12 -13
- package/dist/plugins/postcss.js +1 -1
- package/dist/plugins/remove-console.js +1 -1
- package/dist/plugins/require-context.js +1 -1
- package/dist/plugins/sass.js +2 -2
- package/dist/plugins/server-externals-manifest.js +1 -1
- package/dist/plugins/strip-server-exports.js +1 -1
- package/dist/plugins/styled-jsx.js +3 -2
- package/dist/plugins/typeof-window.js +1 -1
- package/dist/routing/app-route-graph.d.ts +16 -15
- package/dist/routing/app-route-graph.js +86 -88
- package/dist/routing/app-router.d.ts +0 -5
- package/dist/routing/app-router.js +12 -11
- package/dist/routing/file-matcher.d.ts +13 -28
- package/dist/routing/file-matcher.js +31 -44
- package/dist/routing/pages-router.js +26 -32
- package/dist/routing/route-matching.d.ts +14 -1
- package/dist/routing/route-matching.js +13 -1
- package/dist/routing/route-pattern.d.ts +2 -1
- package/dist/routing/route-pattern.js +7 -4
- package/dist/routing/route-trie.d.ts +5 -1
- package/dist/routing/route-trie.js +5 -2
- package/dist/server/api-handler.js +41 -33
- package/dist/server/app-browser-entry.js +18 -11
- package/dist/server/app-browser-history-controller.d.ts +1 -1
- package/dist/server/app-browser-history-controller.js +3 -3
- package/dist/server/app-browser-navigation-controller.js +4 -2
- package/dist/server/app-browser-server-action-client.js +1 -1
- package/dist/server/app-elements-wire.d.ts +2 -1
- package/dist/server/app-fallback-renderer.d.ts +11 -0
- package/dist/server/app-fallback-renderer.js +16 -2
- package/dist/server/app-middleware.js +2 -1
- package/dist/server/app-page-boundary-render.d.ts +26 -2
- package/dist/server/app-page-boundary-render.js +190 -55
- package/dist/server/app-page-cache-finalizer.d.ts +1 -1
- package/dist/server/app-page-cache.d.ts +1 -1
- package/dist/server/app-page-dispatch.d.ts +12 -2
- package/dist/server/app-page-dispatch.js +37 -51
- package/dist/server/app-page-element-builder.d.ts +8 -2
- package/dist/server/app-page-element-builder.js +112 -27
- package/dist/server/app-page-execution.d.ts +3 -1
- package/dist/server/app-page-execution.js +31 -39
- package/dist/server/app-page-head.d.ts +54 -2
- package/dist/server/app-page-head.js +164 -78
- package/dist/server/app-page-http-access-fallback-metadata.d.ts +29 -0
- package/dist/server/app-page-http-access-fallback-metadata.js +106 -0
- package/dist/server/app-page-render.d.ts +2 -2
- package/dist/server/app-page-render.js +1 -1
- package/dist/server/app-page-request.d.ts +12 -0
- package/dist/server/app-page-request.js +134 -14
- package/dist/server/app-page-route-wiring.d.ts +9 -0
- package/dist/server/app-page-route-wiring.js +44 -4
- package/dist/server/app-post-middleware-context.d.ts +1 -1
- package/dist/server/app-post-middleware-context.js +1 -1
- package/dist/server/app-route-handler-dispatch.js +31 -17
- package/dist/server/app-route-handler-execution.d.ts +6 -1
- package/dist/server/app-route-handler-execution.js +41 -15
- package/dist/server/app-route-handler-policy.d.ts +2 -0
- package/dist/server/app-route-handler-policy.js +3 -3
- package/dist/server/app-route-module-loader.d.ts +3 -1
- package/dist/server/app-route-module-loader.js +1 -0
- package/dist/server/app-route-tree-prefetch.js +1 -1
- package/dist/server/app-rsc-cache-busting.d.ts +1 -1
- package/dist/server/app-rsc-cache-busting.js +1 -1
- package/dist/server/app-rsc-errors.d.ts +1 -1
- package/dist/server/app-rsc-errors.js +12 -2
- package/dist/server/app-rsc-handler.d.ts +10 -5
- package/dist/server/app-rsc-handler.js +51 -23
- package/dist/server/app-rsc-redirect-flight.d.ts +66 -0
- package/dist/server/app-rsc-redirect-flight.js +71 -0
- package/dist/server/app-rsc-request-normalization.d.ts +3 -2
- package/dist/server/app-rsc-request-normalization.js +8 -2
- package/dist/server/app-rsc-response-finalizer.d.ts +2 -2
- package/dist/server/app-rsc-response-finalizer.js +5 -11
- package/dist/server/app-rsc-route-matching.d.ts +20 -0
- package/dist/server/app-rsc-route-matching.js +87 -11
- package/dist/server/app-segment-config.js +15 -5
- package/dist/server/app-server-action-execution.d.ts +3 -1
- package/dist/server/app-server-action-execution.js +8 -6
- package/dist/server/app-ssr-entry.js +4 -1
- package/dist/server/app-ssr-stream.d.ts +2 -7
- package/dist/server/app-ssr-stream.js +5 -10
- package/dist/server/cache-proof.js +1 -1
- package/dist/server/config-headers.d.ts +24 -0
- package/dist/server/config-headers.js +52 -0
- package/dist/server/default-global-error-module.d.ts +3 -1
- package/dist/server/default-not-found-module.d.ts +3 -1
- package/dist/server/dev-initial-server-error.d.ts +1 -1
- package/dist/server/dev-lockfile.js +2 -3
- package/dist/server/dev-route-files.js +1 -1
- package/dist/server/dev-server.js +281 -173
- package/dist/server/dev-stack-sourcemap.js +4 -3
- package/dist/server/headers.d.ts +3 -1
- package/dist/server/headers.js +3 -1
- package/dist/server/image-optimization.js +2 -2
- package/dist/server/implicit-tags.js +2 -1
- package/dist/server/instrumentation.js +2 -2
- package/dist/server/isr-cache.d.ts +1 -1
- package/dist/server/isr-cache.js +1 -1
- package/dist/server/metadata-routes.js +4 -4
- package/dist/server/middleware-matcher-pattern.d.ts +22 -0
- package/dist/server/middleware-matcher-pattern.js +219 -0
- package/dist/server/middleware-matcher.d.ts +2 -7
- package/dist/server/middleware-matcher.js +13 -60
- package/dist/server/middleware-path-to-regexp.d.ts +14 -0
- package/dist/server/middleware-path-to-regexp.js +228 -0
- package/dist/server/middleware-response-headers.js +1 -1
- package/dist/server/middleware-runtime.js +5 -4
- package/dist/server/middleware.d.ts +2 -1
- package/dist/server/middleware.js +3 -2
- package/dist/server/navigation-planner.d.ts +2 -0
- package/dist/server/navigation-planner.js +8 -2
- package/dist/server/next-error-digest.d.ts +9 -24
- package/dist/server/next-error-digest.js +23 -15
- package/dist/server/operation-token.js +1 -1
- package/dist/server/pages-body-parser-config.js +2 -1
- package/dist/server/pages-data-route.d.ts +11 -1
- package/dist/server/pages-data-route.js +16 -1
- package/dist/server/pages-dev-hydration.d.ts +14 -0
- package/dist/server/pages-dev-hydration.js +83 -0
- package/dist/server/pages-dev-module-url.js +2 -2
- package/dist/server/pages-get-initial-props.d.ts +15 -2
- package/dist/server/pages-get-initial-props.js +16 -6
- package/dist/server/pages-node-compat.d.ts +13 -6
- package/dist/server/pages-node-compat.js +44 -45
- package/dist/server/pages-page-data.d.ts +4 -2
- package/dist/server/pages-page-data.js +20 -10
- package/dist/server/pages-page-handler.d.ts +4 -2
- package/dist/server/pages-page-handler.js +74 -43
- package/dist/server/pages-page-response.d.ts +2 -2
- package/dist/server/pages-page-response.js +1 -1
- package/dist/server/pages-preview.d.ts +26 -0
- package/dist/server/pages-preview.js +165 -0
- package/dist/server/pages-readiness.d.ts +5 -4
- package/dist/server/pages-readiness.js +4 -2
- package/dist/server/pages-request-pipeline.d.ts +1 -0
- package/dist/server/pages-request-pipeline.js +25 -11
- package/dist/server/pages-router-entry.js +6 -0
- package/dist/server/prerender-route-params.js +2 -2
- package/dist/server/prod-server.d.ts +1 -4
- package/dist/server/prod-server.js +44 -30
- package/dist/server/request-pipeline.d.ts +15 -29
- package/dist/server/request-pipeline.js +25 -60
- package/dist/server/rsc-stream-hints.js +122 -18
- package/dist/server/seed-cache.js +1 -1
- package/dist/server/socket-error-backstop.js +1 -1
- package/dist/server/static-file-cache.js +7 -8
- package/dist/server/worker-utils.js +1 -1
- package/dist/shims/app.d.ts +1 -1
- package/dist/shims/cache-request-state.d.ts +27 -1
- package/dist/shims/cache-request-state.js +60 -1
- package/dist/shims/cache-runtime.d.ts +12 -1
- package/dist/shims/cache-runtime.js +22 -7
- package/dist/shims/cache.d.ts +5 -5
- package/dist/shims/cache.js +28 -11
- package/dist/shims/constants.js +1 -1
- package/dist/shims/document.d.ts +42 -83
- package/dist/shims/document.js +62 -53
- package/dist/shims/dynamic.d.ts +5 -25
- package/dist/shims/dynamic.js +29 -8
- package/dist/shims/error-boundary.d.ts +4 -4
- package/dist/shims/error.d.ts +22 -6
- package/dist/shims/error.js +53 -15
- package/dist/shims/fetch-cache.js +13 -4
- package/dist/shims/font-google-base.d.ts +11 -4
- package/dist/shims/font-local.d.ts +10 -3
- package/dist/shims/font-utils.js +1 -1
- package/dist/shims/form.d.ts +1 -1
- package/dist/shims/head.d.ts +13 -2
- package/dist/shims/head.js +6 -6
- package/dist/shims/headers.d.ts +28 -31
- package/dist/shims/headers.js +115 -53
- package/dist/shims/image.d.ts +27 -37
- package/dist/shims/image.js +21 -14
- package/dist/shims/internal/cookie-serialize.d.ts +3 -1
- package/dist/shims/internal/cookie-serialize.js +3 -1
- package/dist/shims/internal/hybrid-client-route-owner.js +3 -1
- package/dist/shims/internal/pages-data-fetch-dedup.js +5 -3
- package/dist/shims/internal/utils.d.ts +3 -3
- package/dist/shims/layout-segment-context.d.ts +1 -1
- package/dist/shims/legacy-image.d.ts +3 -37
- package/dist/shims/legacy-image.js +6 -16
- package/dist/shims/link.d.ts +16 -21
- package/dist/shims/link.js +25 -13
- package/dist/shims/navigation-context-state.d.ts +1 -1
- package/dist/shims/navigation-errors.d.ts +2 -1
- package/dist/shims/navigation-errors.js +9 -13
- package/dist/shims/navigation.d.ts +8 -4
- package/dist/shims/navigation.js +29 -18
- package/dist/shims/next-shims-augmentations.d.ts +1 -0
- package/dist/shims/next-shims-public.d.ts +1 -0
- package/dist/shims/public-shim-map.json.js +103 -0
- package/dist/shims/readonly-url-search-params.d.ts +3 -3
- package/dist/shims/readonly-url-search-params.js +3 -3
- package/dist/shims/request-state-types.d.ts +1 -1
- package/dist/shims/router-state.d.ts +1 -0
- package/dist/shims/router.d.ts +57 -22
- package/dist/shims/router.js +178 -46
- package/dist/shims/script.d.ts +6 -10
- package/dist/shims/script.js +7 -4
- package/dist/shims/server.d.ts +45 -22
- package/dist/shims/server.js +46 -7
- package/dist/shims/slot.d.ts +1 -1
- package/dist/shims/thenable-params.js +1 -1
- package/dist/shims/unified-request-context.d.ts +1 -1
- package/dist/shims/unified-request-context.js +2 -0
- package/dist/shims/url-safety.d.ts +1 -1
- package/dist/shims/url-safety.js +2 -2
- package/dist/typegen.d.ts +8 -2
- package/dist/typegen.js +84 -25
- package/dist/utils/client-build-manifest.js +2 -2
- package/dist/utils/client-entry-manifest.js +1 -1
- package/dist/utils/client-runtime-metadata.js +1 -1
- package/dist/utils/commonjs-loader.js +3 -3
- package/dist/utils/domain-locale.d.ts +2 -2
- package/dist/utils/external-url.d.ts +5 -0
- package/dist/utils/external-url.js +7 -0
- package/dist/utils/mdx-scan.js +1 -1
- package/dist/utils/path.d.ts +1 -13
- package/dist/utils/path.js +1 -15
- package/dist/utils/plugin-options.d.ts +4 -0
- package/dist/utils/plugin-options.js +8 -0
- package/dist/utils/project.d.ts +0 -6
- package/dist/utils/project.js +2 -8
- package/dist/utils/public-routes.js +2 -2
- package/dist/utils/react-version.js +1 -1
- package/dist/utils/redirect-digest.d.ts +9 -0
- package/dist/utils/redirect-digest.js +25 -0
- package/dist/utils/regex-safety.d.ts +8 -0
- package/dist/utils/regex-safety.js +737 -0
- package/dist/utils/vinext-root.js +1 -1
- package/dist/utils/vite-version.d.ts +5 -2
- package/dist/utils/vite-version.js +43 -17
- package/package.json +16 -4
- /package/dist/build/google-fonts/{fallback-metrics-data.js → fallback-metrics-data.json.js} +0 -0
- /package/dist/build/google-fonts/{font-data.js → font-data.json.js} +0 -0
- /package/dist/{node_modules/.pnpm/process-ancestry@0.1.0/node_modules → deps/.pnpm/process-ancestry@0.1.0/deps}/process-ancestry/dist/index.js +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { stripBasePath } from "../utils/base-path.js";
|
|
1
2
|
import { NEVER_CACHE_CONTROL } from "./cache-control.js";
|
|
2
3
|
import { AppElementsWire } from "./app-elements-wire.js";
|
|
3
4
|
import "./app-elements.js";
|
|
@@ -6,18 +7,34 @@ import { isNavigationSignalError } from "../utils/navigation-signal.js";
|
|
|
6
7
|
import { ErrorBoundary, GlobalErrorBoundary, SerializedErrorBoundary } from "../shims/error-boundary.js";
|
|
7
8
|
import { LayoutSegmentProvider } from "../shims/layout-segment-context.js";
|
|
8
9
|
import { MetadataHead, ViewportHead } from "../shims/metadata.js";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
10
|
+
import { resolveAppPageBranchParams, resolveAppPageSegmentParams } from "./app-page-params.js";
|
|
11
|
+
import { stripRscSuffix } from "./app-rsc-cache-busting.js";
|
|
12
|
+
import { buildRscRedirectFlightStream } from "./app-rsc-redirect-flight.js";
|
|
13
|
+
import { bufferAppPageBinaryStream, buildAppPageSpecialErrorResponse, resolveAppPageSpecialError } from "./app-page-execution.js";
|
|
14
|
+
import { resolveActiveParallelRouteHeadInputs, resolveAppPageHead } from "./app-page-head.js";
|
|
11
15
|
import { createAppPageLayoutEntries, createAppPageSourcePage } from "./app-page-route-wiring.js";
|
|
12
16
|
import { buildClientHookErrorMessage } from "../shims/client-hook-error.js";
|
|
17
|
+
import { resolveHttpAccessFallbackMetadata, resolveHttpAccessFallbackViewport } from "./app-page-http-access-fallback-metadata.js";
|
|
18
|
+
import "./app-rsc-route-matching.js";
|
|
13
19
|
import { renderAppPageBoundaryResponse, resolveAppPageErrorBoundary, resolveAppPageHttpAccessBoundaryModule, wrapAppPageBoundaryElement } from "./app-page-boundary.js";
|
|
14
|
-
import {
|
|
20
|
+
import { resolveSlotParamOverrides } from "./app-page-element-builder.js";
|
|
21
|
+
import { createAppPageFontData, createAppPageRscErrorTracker, renderAppPageHtmlResponse } from "./app-page-stream.js";
|
|
15
22
|
import { Fragment, createElement } from "react";
|
|
16
23
|
//#region src/server/app-page-boundary-render.ts
|
|
17
24
|
const DEFAULT_GLOBAL_ERROR_COMPONENT = DefaultGlobalError;
|
|
18
25
|
function getDefaultExport(module) {
|
|
19
26
|
return module?.default ?? null;
|
|
20
27
|
}
|
|
28
|
+
function resolveHttpAccessBoundaryTreePosition(route, boundaryModule, statusCode) {
|
|
29
|
+
if (!route || !boundaryModule) return null;
|
|
30
|
+
const routeBoundary = statusCode === 403 ? route.forbidden : statusCode === 401 ? route.unauthorized : route.notFound;
|
|
31
|
+
const layoutBoundaries = statusCode === 403 ? route.forbiddens : statusCode === 401 ? route.unauthorizeds : route.notFounds;
|
|
32
|
+
if (boundaryModule === routeBoundary && statusCode === 404) return route.notFoundTreePosition ?? null;
|
|
33
|
+
if (boundaryModule === routeBoundary && statusCode === 403) return route.forbiddenTreePosition ?? null;
|
|
34
|
+
if (boundaryModule === routeBoundary && statusCode === 401) return route.unauthorizedTreePosition ?? null;
|
|
35
|
+
for (let index = (layoutBoundaries?.length ?? 0) - 1; index >= 0; index--) if (layoutBoundaries?.[index] === boundaryModule) return route.layoutTreePositions?.[index] ?? null;
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
21
38
|
function wrapRenderedBoundaryElement(options) {
|
|
22
39
|
return wrapAppPageBoundaryElement({
|
|
23
40
|
element: options.element,
|
|
@@ -89,52 +106,95 @@ function createAppPageBoundaryRscPayload(options) {
|
|
|
89
106
|
[routeId]: options.element
|
|
90
107
|
};
|
|
91
108
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
getLinks: options.getFontLinks,
|
|
99
|
-
getPreloads: options.getFontPreloads,
|
|
100
|
-
getStyles: options.getFontStyles
|
|
101
|
-
});
|
|
102
|
-
const ssrHandler = await options.loadSsrHandler();
|
|
103
|
-
return renderAppPageHtmlResponse({
|
|
104
|
-
clearRequestContext: options.clearRequestContext,
|
|
105
|
-
fontData,
|
|
106
|
-
fontLinkHeader: options.buildFontLinkHeader(fontData.preloads),
|
|
107
|
-
isEdgeRuntime: options.isEdgeRuntime,
|
|
108
|
-
middlewareHeaders: options.middlewareContext.headers,
|
|
109
|
-
navigationContext: options.getNavigationContext() ?? {
|
|
110
|
-
pathname,
|
|
111
|
-
searchParams: requestUrl.searchParams,
|
|
112
|
-
params: options.navigationParams ?? options.route?.params ?? {}
|
|
113
|
-
},
|
|
114
|
-
rscStream,
|
|
115
|
-
scriptNonce: options.scriptNonce,
|
|
116
|
-
ssrHandler,
|
|
117
|
-
status: responseStatus,
|
|
118
|
-
initialDevServerError: options.initialDevServerError
|
|
119
|
-
});
|
|
120
|
-
},
|
|
121
|
-
createRscOnErrorHandler() {
|
|
122
|
-
return options.createRscOnErrorHandler(pathname, options.routePattern ?? pathname);
|
|
123
|
-
},
|
|
124
|
-
element: createAppPageBoundaryRscPayload({
|
|
125
|
-
element: options.element,
|
|
126
|
-
layoutModules: options.layoutModules,
|
|
127
|
-
pathname,
|
|
128
|
-
route: options.route,
|
|
129
|
-
sourcePageSegments: options.sourcePageSegments
|
|
109
|
+
function renderBoundarySpecialErrorResponse(options, specialError) {
|
|
110
|
+
return buildAppPageSpecialErrorResponse({
|
|
111
|
+
basePath: options.basePath,
|
|
112
|
+
buildRscRedirectFlightStream: (rscOptions) => buildRscRedirectFlightStream({
|
|
113
|
+
renderToReadableStream: options.renderToReadableStream,
|
|
114
|
+
digest: rscOptions.digest
|
|
130
115
|
}),
|
|
116
|
+
clearRequestContext: options.clearRequestContext,
|
|
117
|
+
getAndClearPendingCookies: options.getAndClearPendingCookies,
|
|
131
118
|
isEdgeRuntime: options.isEdgeRuntime,
|
|
132
119
|
isRscRequest: options.isRscRequest,
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
120
|
+
middlewareContext: options.middlewareContext,
|
|
121
|
+
serveStreamingMetadata: options.serveStreamingMetadata,
|
|
122
|
+
request: options.request,
|
|
123
|
+
specialError
|
|
136
124
|
});
|
|
137
125
|
}
|
|
126
|
+
async function renderAppPageBoundaryElementResponse(options) {
|
|
127
|
+
const requestUrl = new URL(options.requestUrl);
|
|
128
|
+
const pathname = requestUrl.pathname;
|
|
129
|
+
const payload = createAppPageBoundaryRscPayload({
|
|
130
|
+
element: options.element,
|
|
131
|
+
layoutModules: options.layoutModules,
|
|
132
|
+
pathname,
|
|
133
|
+
route: options.route,
|
|
134
|
+
sourcePageSegments: options.sourcePageSegments
|
|
135
|
+
});
|
|
136
|
+
const rscErrorTracker = createAppPageRscErrorTracker(options.createRscOnErrorHandler(pathname, options.routePattern ?? pathname));
|
|
137
|
+
const resolveCapturedSpecialError = (error) => resolveAppPageSpecialError(error) ?? resolveAppPageSpecialError(rscErrorTracker.getCapturedSpecialError());
|
|
138
|
+
const renderSpecialErrorResponse = (specialError) => renderBoundarySpecialErrorResponse(options, specialError);
|
|
139
|
+
const handleSpecialErrors = options.handleSpecialErrors === true;
|
|
140
|
+
let response;
|
|
141
|
+
try {
|
|
142
|
+
response = await renderAppPageBoundaryResponse({
|
|
143
|
+
async createHtmlResponse(rscStream, responseStatus) {
|
|
144
|
+
const fontData = createAppPageFontData({
|
|
145
|
+
getLinks: options.getFontLinks,
|
|
146
|
+
getPreloads: options.getFontPreloads,
|
|
147
|
+
getStyles: options.getFontStyles
|
|
148
|
+
});
|
|
149
|
+
const ssrHandler = await options.loadSsrHandler();
|
|
150
|
+
return renderAppPageHtmlResponse({
|
|
151
|
+
clearRequestContext: options.clearRequestContext,
|
|
152
|
+
fontData,
|
|
153
|
+
fontLinkHeader: options.buildFontLinkHeader(fontData.preloads),
|
|
154
|
+
isEdgeRuntime: options.isEdgeRuntime,
|
|
155
|
+
middlewareHeaders: options.middlewareContext.headers,
|
|
156
|
+
navigationContext: options.getNavigationContext() ?? {
|
|
157
|
+
pathname,
|
|
158
|
+
searchParams: requestUrl.searchParams,
|
|
159
|
+
params: options.navigationParams ?? options.route?.params ?? {}
|
|
160
|
+
},
|
|
161
|
+
rscStream,
|
|
162
|
+
scriptNonce: options.scriptNonce,
|
|
163
|
+
ssrHandler,
|
|
164
|
+
status: responseStatus,
|
|
165
|
+
initialDevServerError: options.initialDevServerError
|
|
166
|
+
});
|
|
167
|
+
},
|
|
168
|
+
createRscOnErrorHandler() {
|
|
169
|
+
return rscErrorTracker.onRenderError;
|
|
170
|
+
},
|
|
171
|
+
element: payload,
|
|
172
|
+
isEdgeRuntime: options.isEdgeRuntime,
|
|
173
|
+
isRscRequest: options.isRscRequest,
|
|
174
|
+
middlewareHeaders: options.middlewareContext.headers,
|
|
175
|
+
renderToReadableStream: options.renderToReadableStream,
|
|
176
|
+
status: options.status
|
|
177
|
+
});
|
|
178
|
+
} catch (error) {
|
|
179
|
+
const specialError = handleSpecialErrors ? resolveCapturedSpecialError(error) : null;
|
|
180
|
+
if (specialError !== null) return renderSpecialErrorResponse(specialError);
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
183
|
+
if (!handleSpecialErrors) return response;
|
|
184
|
+
if (options.isRscRequest && response.body) {
|
|
185
|
+
const bufferedStream = await bufferAppPageBinaryStream(response.body);
|
|
186
|
+
response = new Response(bufferedStream, {
|
|
187
|
+
status: response.status,
|
|
188
|
+
headers: response.headers
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
const specialError = resolveCapturedSpecialError();
|
|
192
|
+
if (!specialError) return response;
|
|
193
|
+
if (response.body) try {
|
|
194
|
+
await response.body.cancel();
|
|
195
|
+
} catch {}
|
|
196
|
+
return renderSpecialErrorResponse(specialError);
|
|
197
|
+
}
|
|
138
198
|
async function renderAppPageHttpAccessFallback(options) {
|
|
139
199
|
const resolvedBoundaryModule = resolveAppPageHttpAccessBoundaryModule({
|
|
140
200
|
rootForbiddenModule: options.rootForbiddenModule,
|
|
@@ -150,18 +210,92 @@ async function renderAppPageHttpAccessFallback(options) {
|
|
|
150
210
|
if (!boundaryComponent) return null;
|
|
151
211
|
const layoutModules = options.layoutModules ?? options.route?.layouts ?? options.rootLayouts;
|
|
152
212
|
const pathname = new URL(options.requestUrl).pathname;
|
|
213
|
+
const routePathname = options.routePathname ?? stripRscSuffix(stripBasePath(pathname, options.basePath ?? ""));
|
|
153
214
|
const routeSegments = resolveHttpAccessFallbackHeadRouteSegments(options.route, layoutModules);
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
215
|
+
const fallbackRouteSegments = routeSegments ?? [];
|
|
216
|
+
let head;
|
|
217
|
+
try {
|
|
218
|
+
if ([
|
|
219
|
+
401,
|
|
220
|
+
403,
|
|
221
|
+
404
|
|
222
|
+
].includes(options.statusCode)) {
|
|
223
|
+
const boundaryTreePosition = resolveHttpAccessBoundaryTreePosition(options.route, boundaryModule, options.statusCode);
|
|
224
|
+
const boundaryParams = boundaryTreePosition == null ? {} : resolveAppPageSegmentParams(fallbackRouteSegments, boundaryTreePosition, options.matchedParams);
|
|
225
|
+
const intercept = options.intercept;
|
|
226
|
+
const isSiblingIntercept = intercept?.interceptSlotKey === "__vinext_page_intercept" && intercept.interceptPage != null;
|
|
227
|
+
const effectiveParams = isSiblingIntercept ? intercept.interceptParams ?? options.matchedParams : options.matchedParams;
|
|
228
|
+
const slotParams = resolveSlotParamOverrides({ slots: options.route?.slots ?? null }, routePathname);
|
|
229
|
+
const parallelBranches = resolveActiveParallelRouteHeadInputs({
|
|
230
|
+
interceptBranchSegments: intercept?.interceptBranchSegments ?? null,
|
|
231
|
+
interceptLayouts: intercept?.interceptLayouts ?? null,
|
|
232
|
+
interceptLayoutSegments: intercept?.interceptLayoutSegments ?? null,
|
|
233
|
+
interceptNotFoundBranchSegments: intercept?.interceptNotFoundBranchSegments ?? null,
|
|
234
|
+
interceptNotFound: intercept?.interceptNotFound ?? null,
|
|
235
|
+
interceptNotFoundTreePosition: intercept?.interceptNotFoundTreePosition ?? null,
|
|
236
|
+
interceptPage: intercept?.interceptPage ?? null,
|
|
237
|
+
interceptParams: intercept?.interceptParams ?? null,
|
|
238
|
+
interceptSlotKey: intercept?.interceptSlotKey ?? null,
|
|
239
|
+
interceptSourcePageSegments: intercept?.interceptSourcePageSegments ?? null,
|
|
240
|
+
layoutTreePositions: options.route?.layoutTreePositions,
|
|
241
|
+
params: options.matchedParams,
|
|
242
|
+
routeSegments: fallbackRouteSegments,
|
|
243
|
+
slotParams,
|
|
244
|
+
slots: options.route?.slots ?? null
|
|
245
|
+
});
|
|
246
|
+
const primaryParallelBranch = isSiblingIntercept ? {
|
|
247
|
+
head: {
|
|
248
|
+
layoutModules: intercept?.interceptLayouts ?? [],
|
|
249
|
+
layoutParams: (intercept?.interceptLayoutSegments ?? []).map((segments) => resolveAppPageBranchParams(intercept?.interceptBranchSegments ?? segments, segments.length, effectiveParams, segments)),
|
|
250
|
+
pageModule: intercept?.interceptPage ?? null,
|
|
251
|
+
params: effectiveParams,
|
|
252
|
+
routeSegments: intercept?.interceptSourcePageSegments ?? fallbackRouteSegments
|
|
253
|
+
},
|
|
254
|
+
...intercept?.interceptNotFound ? {
|
|
255
|
+
notFoundModule: intercept.interceptNotFound,
|
|
256
|
+
notFoundParams: resolveAppPageBranchParams(intercept.interceptNotFoundBranchSegments ?? intercept.interceptBranchSegments ?? fallbackRouteSegments, intercept.interceptNotFoundTreePosition ?? 0, effectiveParams)
|
|
257
|
+
} : {},
|
|
258
|
+
ownerTreePosition: fallbackRouteSegments.length
|
|
259
|
+
} : null;
|
|
260
|
+
const fallbackHeadOptions = {
|
|
261
|
+
boundaryModule,
|
|
262
|
+
boundaryParams,
|
|
263
|
+
branchNotFoundConventions: options.statusCode === 404,
|
|
264
|
+
layoutModules,
|
|
265
|
+
layoutTreePositions: resolveHttpAccessFallbackHeadLayoutTreePositions(options.route, layoutModules),
|
|
266
|
+
parallelBranches,
|
|
267
|
+
params: options.matchedParams,
|
|
268
|
+
primaryParallelBranch,
|
|
269
|
+
routeSegments
|
|
270
|
+
};
|
|
271
|
+
const [metadata, viewport] = await Promise.all([resolveHttpAccessFallbackMetadata({
|
|
272
|
+
applyFileBasedMetadata: options.applyFileBasedMetadata,
|
|
273
|
+
basePath: options.basePath ?? "",
|
|
274
|
+
...fallbackHeadOptions,
|
|
275
|
+
metadataRoutes: options.metadataRoutes,
|
|
276
|
+
routePath: options.route?.pattern ?? pathname
|
|
277
|
+
}), resolveHttpAccessFallbackViewport(fallbackHeadOptions)]);
|
|
278
|
+
head = {
|
|
279
|
+
metadata,
|
|
280
|
+
viewport
|
|
281
|
+
};
|
|
282
|
+
} else head = await resolveAppPageHead({
|
|
283
|
+
applyFileBasedMetadata: options.applyFileBasedMetadata,
|
|
284
|
+
basePath: options.basePath ?? "",
|
|
285
|
+
layoutModules,
|
|
286
|
+
layoutTreePositions: resolveHttpAccessFallbackHeadLayoutTreePositions(options.route, layoutModules),
|
|
287
|
+
metadataRoutes: options.metadataRoutes,
|
|
288
|
+
pageModule: boundaryModule,
|
|
289
|
+
params: options.matchedParams,
|
|
290
|
+
routePath: options.route?.pattern ?? pathname,
|
|
291
|
+
routeSegments
|
|
292
|
+
});
|
|
293
|
+
} catch (error) {
|
|
294
|
+
const specialError = resolveAppPageSpecialError(error);
|
|
295
|
+
if (specialError) return renderBoundarySpecialErrorResponse(options, specialError);
|
|
296
|
+
throw error;
|
|
297
|
+
}
|
|
298
|
+
const { metadata, viewport } = head;
|
|
165
299
|
const headElements = [createElement("meta", {
|
|
166
300
|
charSet: "utf-8",
|
|
167
301
|
key: "charset"
|
|
@@ -197,6 +331,7 @@ async function renderAppPageHttpAccessFallback(options) {
|
|
|
197
331
|
return renderAppPageBoundaryElementResponse({
|
|
198
332
|
...options,
|
|
199
333
|
element,
|
|
334
|
+
handleSpecialErrors: true,
|
|
200
335
|
layoutModules: skipLayoutWrapping ? [] : layoutModules,
|
|
201
336
|
navigationParams: options.matchedParams,
|
|
202
337
|
route: skipLayoutWrapping ? null : options.route,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { RenderObservation } from "./cache-proof.js";
|
|
2
|
-
import { CachedAppPageValue } from "../shims/cache-handler.js";
|
|
3
2
|
import { AppRscRenderMode } from "./app-rsc-render-mode.js";
|
|
3
|
+
import { CachedAppPageValue } from "../shims/cache-handler.js";
|
|
4
4
|
import { AppPageRenderObservationState } from "./app-page-render-observation.js";
|
|
5
5
|
|
|
6
6
|
//#region src/server/app-page-cache-finalizer.d.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { RenderObservation } from "./cache-proof.js";
|
|
2
|
-
import { CacheControlMetadata, CachedAppPageValue } from "../shims/cache-handler.js";
|
|
3
2
|
import { AppRscRenderMode } from "./app-rsc-render-mode.js";
|
|
3
|
+
import { CacheControlMetadata, CachedAppPageValue } from "../shims/cache-handler.js";
|
|
4
4
|
import { finalizeAppPageHtmlCacheResponse, finalizeAppPageRscCacheResponse, scheduleAppPageRscCacheWrite } from "./app-page-cache-finalizer.js";
|
|
5
5
|
import { ISRCacheEntry } from "./isr-cache.js";
|
|
6
6
|
|
|
@@ -4,11 +4,11 @@ import { AppOutgoingElements } from "./app-elements-wire.js";
|
|
|
4
4
|
import { NavigationContext } from "../shims/navigation-context-state.js";
|
|
5
5
|
import { AppPageFontPreload, LayoutClassificationOptions } from "./app-page-execution.js";
|
|
6
6
|
import { AppPageMiddlewareContext } from "./app-page-response.js";
|
|
7
|
+
import { AppLayoutParamAccessTracker } from "./app-layout-param-observation.js";
|
|
8
|
+
import { AppRscRenderMode } from "./app-rsc-render-mode.js";
|
|
7
9
|
import { RootParams } from "../shims/root-params.js";
|
|
8
10
|
import { AppPageSsrHandler } from "./app-page-stream.js";
|
|
9
|
-
import { AppLayoutParamAccessTracker } from "./app-layout-param-observation.js";
|
|
10
11
|
import { CachedAppPageValue } from "../shims/cache-handler.js";
|
|
11
|
-
import { AppRscRenderMode } from "./app-rsc-render-mode.js";
|
|
12
12
|
import { ISRCacheEntry } from "./isr-cache.js";
|
|
13
13
|
import { PprFallbackShellState } from "../shims/ppr-fallback-shell.js";
|
|
14
14
|
import { FetchCacheMode } from "../shims/fetch-cache.js";
|
|
@@ -36,6 +36,9 @@ type AppPageDispatchIntercept<TPage = unknown> = {
|
|
|
36
36
|
interceptLayouts?: readonly unknown[] | null;
|
|
37
37
|
interceptLayoutSegments?: readonly (readonly string[])[] | null;
|
|
38
38
|
interceptBranchSegments?: readonly string[] | null;
|
|
39
|
+
interceptNotFoundBranchSegments?: readonly string[] | null;
|
|
40
|
+
notFound?: unknown;
|
|
41
|
+
notFoundTreePosition?: number | null;
|
|
39
42
|
matchedParams: AppPageParams;
|
|
40
43
|
sourceMatchedParams?: AppPageParams;
|
|
41
44
|
page: TPage;
|
|
@@ -49,6 +52,9 @@ type AppPageDispatchInterceptOptions<TPage = unknown> = {
|
|
|
49
52
|
interceptLayouts?: readonly unknown[] | null;
|
|
50
53
|
interceptLayoutSegments?: readonly (readonly string[])[] | null;
|
|
51
54
|
interceptBranchSegments?: readonly string[] | null;
|
|
55
|
+
interceptNotFoundBranchSegments?: readonly string[] | null;
|
|
56
|
+
interceptNotFound?: unknown;
|
|
57
|
+
interceptNotFoundTreePosition?: number | null;
|
|
52
58
|
interceptPage: TPage;
|
|
53
59
|
interceptParams: AppPageParams;
|
|
54
60
|
interceptSlotId?: string | null;
|
|
@@ -73,6 +79,7 @@ type AppPageDispatchRoute = {
|
|
|
73
79
|
error?: AppPageModule | null;
|
|
74
80
|
errors?: readonly (AppPageModule | null | undefined)[];
|
|
75
81
|
forbidden?: AppPageModule | null;
|
|
82
|
+
forbiddenTreePosition?: number | null;
|
|
76
83
|
forbiddens?: readonly (AppPageModule | null | undefined)[];
|
|
77
84
|
isDynamic: boolean;
|
|
78
85
|
layouts: readonly AppPageModule[];
|
|
@@ -85,6 +92,7 @@ type AppPageDispatchRoute = {
|
|
|
85
92
|
routeSegments: readonly string[];
|
|
86
93
|
slots?: Readonly<Record<string, AppPageDispatchSlot>>;
|
|
87
94
|
unauthorized?: AppPageModule | null;
|
|
95
|
+
unauthorizedTreePosition?: number | null;
|
|
88
96
|
unauthorizeds?: readonly (AppPageModule | null | undefined)[];
|
|
89
97
|
};
|
|
90
98
|
type AppPagePprRuntime<TRoute extends AppPageDispatchRoute> = {
|
|
@@ -112,6 +120,7 @@ type DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {
|
|
|
112
120
|
buildPageElement: (route: TRoute, params: AppPageParams, opts: AppPageDispatchInterceptOptions | undefined, searchParams: URLSearchParams, layoutParamAccess?: AppLayoutParamAccessTracker, options?: {
|
|
113
121
|
observeMetadataSearchParamsAccess?: boolean;
|
|
114
122
|
observePageSearchParamsAccess?: boolean;
|
|
123
|
+
serveStreamingMetadata?: boolean;
|
|
115
124
|
}) => Promise<AppPageElement>;
|
|
116
125
|
clientReuseManifest?: ClientReuseManifestParseResult;
|
|
117
126
|
cleanPathname: string;
|
|
@@ -184,6 +193,7 @@ type DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {
|
|
|
184
193
|
renderHttpAccessFallbackPage: (statusCode: number, opts: {
|
|
185
194
|
boundaryComponent?: unknown;
|
|
186
195
|
boundaryModule?: AppPageModule | null;
|
|
196
|
+
intercept?: AppPageDispatchInterceptOptions | null;
|
|
187
197
|
layouts?: readonly AppPageModule[];
|
|
188
198
|
matchedParams: AppPageParams;
|
|
189
199
|
}, middlewareContext: AppPageMiddlewareContext | null) => Promise<Response | null>;
|
|
@@ -4,24 +4,24 @@ import "../utils/protocol-headers.js";
|
|
|
4
4
|
import { AppElementsWire } from "./app-elements-wire.js";
|
|
5
5
|
import { APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL } from "./app-rsc-render-mode.js";
|
|
6
6
|
import "./app-elements.js";
|
|
7
|
-
import { consumeDynamicUsage, consumeInvalidDynamicUsageError, getAndClearPendingCookies, getDraftModeCookieHeader, getHeadersContext, isDraftModeRequest,
|
|
7
|
+
import { consumeDynamicUsage, consumeInvalidDynamicUsageError, getAndClearPendingCookies, getDraftModeCookieHeader, getHeadersContext, isDraftModeRequest, peekDynamicUsage, peekRenderRequestApiUsage, runWithIsolatedDynamicUsage, setHeadersContext } from "../shims/headers.js";
|
|
8
8
|
import { _consumeRequestScopedCacheLife, _peekRequestScopedCacheLife } from "../shims/cache-request-state.js";
|
|
9
9
|
import { ensureFetchPatch, getCollectedFetchTags, peekDynamicFetchObservations, runWithFetchDedupe, setCurrentFetchCacheMode, setCurrentFetchSoftTags, setCurrentForceDynamicFetchDefault, setRefreshStaleFetchesInForeground } from "../shims/fetch-cache.js";
|
|
10
10
|
import { VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityIdHeader, applyRscDeploymentIdHeader } from "./app-rsc-cache-busting.js";
|
|
11
11
|
import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
|
|
12
12
|
import "./app-page-response.js";
|
|
13
|
+
import { buildRscRedirectFlightStream } from "./app-rsc-redirect-flight.js";
|
|
13
14
|
import { buildAppPageSpecialErrorResponse, probeAppPageThrownError, resolveAppPageSpecialError } from "./app-page-execution.js";
|
|
14
15
|
import { createAppPageTreePath } from "./app-page-route-wiring.js";
|
|
15
16
|
import { consumeAppPageRenderObservationState, discardAppPageRenderState } from "./app-page-render-observation.js";
|
|
16
17
|
import { resolveAppPageParentHttpAccessBoundary, resolveAppPageParentHttpAccessBoundaryModule } from "./app-page-boundary.js";
|
|
18
|
+
import { shouldServeStreamingMetadata } from "./streaming-metadata.js";
|
|
19
|
+
import { resolveAppPageNavigationParams } from "./app-page-element-builder.js";
|
|
17
20
|
import { createAppLayoutParamAccessTracker, isAppLayoutObservationUnsafeForStaticReuse } from "./app-layout-param-observation.js";
|
|
18
21
|
import { buildAppPageTags } from "./implicit-tags.js";
|
|
19
22
|
import { resolveAppPageMethodResponse } from "./app-page-method.js";
|
|
20
|
-
import { shouldServeStreamingMetadata } from "./streaming-metadata.js";
|
|
21
|
-
import { resolveAppPageNavigationParams } from "./app-page-element-builder.js";
|
|
22
23
|
import { buildAppPageElement, resolveAppPageIntercept, resolveAppPageInterceptionRerenderTarget, validateAppPageDynamicParams } from "./app-page-request.js";
|
|
23
24
|
import { renderAppPageLifecycle } from "./app-page-render.js";
|
|
24
|
-
import React from "react";
|
|
25
25
|
//#region src/server/app-page-dispatch.ts
|
|
26
26
|
function resolveAppPageRouteBoundaryModule(route, statusCode) {
|
|
27
27
|
if (statusCode === 403) return route.forbidden ?? null;
|
|
@@ -140,6 +140,9 @@ function toInterceptOptions(interceptionContext, intercept) {
|
|
|
140
140
|
interceptLayouts: intercept.interceptLayouts,
|
|
141
141
|
interceptLayoutSegments: intercept.interceptLayoutSegments,
|
|
142
142
|
interceptBranchSegments: intercept.interceptBranchSegments,
|
|
143
|
+
interceptNotFoundBranchSegments: intercept.interceptNotFoundBranchSegments,
|
|
144
|
+
interceptNotFound: intercept.notFound,
|
|
145
|
+
interceptNotFoundTreePosition: intercept.notFoundTreePosition,
|
|
143
146
|
interceptPage: intercept.page,
|
|
144
147
|
interceptParams: intercept.matchedParams,
|
|
145
148
|
interceptSlotId: intercept.slotId ?? null,
|
|
@@ -160,6 +163,9 @@ async function dispatchAppPageInner(options) {
|
|
|
160
163
|
const isForceStatic = dynamicConfig === "force-static";
|
|
161
164
|
const isDynamicError = dynamicConfig === "error";
|
|
162
165
|
const isForceDynamic = dynamicConfig === "force-dynamic";
|
|
166
|
+
const isPrerender = process.env.VINEXT_PRERENDER === "1";
|
|
167
|
+
const serveStreamingMetadata = shouldServeStreamingMetadata(options.request.headers.get("user-agent") ?? "", options.htmlLimitedBots);
|
|
168
|
+
const placeGeneratedMetadataInBody = (!isPrerender || options.pprFallbackShell !== void 0) && serveStreamingMetadata;
|
|
163
169
|
const isPrefetchDynamicShell = options.renderMode === APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL;
|
|
164
170
|
const isDraftMode = isDraftModeRequest(options.request, options.draftModeSecret);
|
|
165
171
|
const requestHeadersContext = getHeadersContext();
|
|
@@ -269,7 +275,8 @@ async function dispatchAppPageInner(options) {
|
|
|
269
275
|
const { renderAppPageCacheArtifacts } = await import("./app-page-cache-render.js");
|
|
270
276
|
const revalidatedElement = await options.buildPageElement(revalidationTarget.route, revalidationTarget.params, revalidationTarget.interceptOpts, new URLSearchParams(), void 0, {
|
|
271
277
|
observeMetadataSearchParamsAccess: revalidationDynamicConfig !== "force-static",
|
|
272
|
-
observePageSearchParamsAccess: revalidationDynamicConfig !== "force-static"
|
|
278
|
+
observePageSearchParamsAccess: revalidationDynamicConfig !== "force-static",
|
|
279
|
+
serveStreamingMetadata: false
|
|
273
280
|
});
|
|
274
281
|
const revalidatedOnError = options.createRscOnErrorHandler(options.cleanPathname, revalidationTarget.route.pattern);
|
|
275
282
|
const rendered = await renderAppPageCacheArtifacts({
|
|
@@ -314,7 +321,7 @@ async function dispatchAppPageInner(options) {
|
|
|
314
321
|
});
|
|
315
322
|
if (cachedPageResponse) return cachedPageResponse;
|
|
316
323
|
}
|
|
317
|
-
if (options.skipStaticParamsValidation !== true) {
|
|
324
|
+
if (options.skipStaticParamsValidation !== true && !(options.isProduction && isForceDynamic)) {
|
|
318
325
|
const dynamicParamsResponse = await validateAppPageDynamicParams({
|
|
319
326
|
clearRequestContext: options.clearRequestContext,
|
|
320
327
|
enforceStaticParamsOnly: options.dynamicParamsConfig === false,
|
|
@@ -345,7 +352,8 @@ async function dispatchAppPageInner(options) {
|
|
|
345
352
|
setCurrentForceDynamicFetchDefault(sourceDynamicConfig === "force-dynamic");
|
|
346
353
|
return options.buildPageElement(interceptRoute, interceptParams, interceptOpts, interceptSearchParams, interceptLayoutParamAccess, {
|
|
347
354
|
observeMetadataSearchParamsAccess: sourceDynamicConfig !== "force-static",
|
|
348
|
-
observePageSearchParamsAccess: sourceDynamicConfig !== "force-static"
|
|
355
|
+
observePageSearchParamsAccess: sourceDynamicConfig !== "force-static",
|
|
356
|
+
serveStreamingMetadata: placeGeneratedMetadataInBody
|
|
349
357
|
});
|
|
350
358
|
},
|
|
351
359
|
cleanPathname: options.cleanPathname,
|
|
@@ -397,7 +405,8 @@ async function dispatchAppPageInner(options) {
|
|
|
397
405
|
if (options.actionFailed) throw options.actionError;
|
|
398
406
|
return options.buildPageElement(route, options.params, interceptResult.interceptOpts, pageSearchParams, layoutParamAccess, {
|
|
399
407
|
observeMetadataSearchParamsAccess: !isForceStatic,
|
|
400
|
-
observePageSearchParamsAccess: !isForceStatic
|
|
408
|
+
observePageSearchParamsAccess: !isForceStatic,
|
|
409
|
+
serveStreamingMetadata: placeGeneratedMetadataInBody
|
|
401
410
|
});
|
|
402
411
|
},
|
|
403
412
|
async probePageSpecialError() {
|
|
@@ -413,7 +422,7 @@ async function dispatchAppPageInner(options) {
|
|
|
413
422
|
return options.renderErrorBoundaryPage(buildError);
|
|
414
423
|
},
|
|
415
424
|
renderSpecialError(specialError) {
|
|
416
|
-
return renderPageSpecialError(options, specialError);
|
|
425
|
+
return renderPageSpecialError(options, specialError, serveStreamingMetadata, interceptResult.interceptOpts);
|
|
417
426
|
},
|
|
418
427
|
resolveSpecialError: resolveAppPageSpecialError
|
|
419
428
|
});
|
|
@@ -441,7 +450,6 @@ async function dispatchAppPageInner(options) {
|
|
|
441
450
|
const activeFallbackShellState = options.pprRuntime?.getState() ?? null;
|
|
442
451
|
const pprFallbackShellSignal = activeFallbackShellState?.abortController.signal;
|
|
443
452
|
const pprFallbackShellReactSignal = activeFallbackShellState?.reactAbortController.signal;
|
|
444
|
-
const isPrerender = process.env.VINEXT_PRERENDER === "1";
|
|
445
453
|
const isSpeculativePrerender = isPrerender && options.request.headers.get("x-vinext-prerender-speculative") === "1";
|
|
446
454
|
return renderAppPageLifecycle({
|
|
447
455
|
basePath: options.basePath,
|
|
@@ -530,16 +538,7 @@ async function dispatchAppPageInner(options) {
|
|
|
530
538
|
return isAppLayoutObservationUnsafeForStaticReuse(layoutParamAccess.getLayoutObservation(layoutId));
|
|
531
539
|
},
|
|
532
540
|
async runWithIsolatedDynamicScope(fn) {
|
|
533
|
-
|
|
534
|
-
try {
|
|
535
|
-
return {
|
|
536
|
-
result: await fn(),
|
|
537
|
-
dynamicDetected: consumeDynamicUsage()
|
|
538
|
-
};
|
|
539
|
-
} finally {
|
|
540
|
-
consumeDynamicUsage();
|
|
541
|
-
if (priorDynamic) markDynamicUsage();
|
|
542
|
-
}
|
|
541
|
+
return runWithIsolatedDynamicUsage(fn);
|
|
543
542
|
}
|
|
544
543
|
},
|
|
545
544
|
dynamicStaleTimeSeconds: options.dynamicStaleTimeSeconds,
|
|
@@ -550,10 +549,10 @@ async function dispatchAppPageInner(options) {
|
|
|
550
549
|
return options.renderErrorBoundaryPage(renderError, errorOrigin);
|
|
551
550
|
},
|
|
552
551
|
renderLayoutSpecialError(specialError, layoutIndex) {
|
|
553
|
-
return renderLayoutSpecialError(options, specialError, layoutIndex);
|
|
552
|
+
return renderLayoutSpecialError(options, specialError, layoutIndex, serveStreamingMetadata);
|
|
554
553
|
},
|
|
555
554
|
renderPageSpecialError(specialError) {
|
|
556
|
-
return renderPageSpecialError(options, specialError);
|
|
555
|
+
return renderPageSpecialError(options, specialError, serveStreamingMetadata, interceptResult.interceptOpts);
|
|
557
556
|
},
|
|
558
557
|
renderToReadableStream: options.renderToReadableStream,
|
|
559
558
|
hasCustomGlobalError: options.hasCustomGlobalError,
|
|
@@ -568,35 +567,16 @@ async function dispatchAppPageInner(options) {
|
|
|
568
567
|
}
|
|
569
568
|
});
|
|
570
569
|
}
|
|
571
|
-
|
|
572
|
-
* Builds an RSC flight payload that encodes a redirect as a React error chunk.
|
|
573
|
-
* We render a tiny element that immediately throws an `Error` whose `digest`
|
|
574
|
-
* is the canonical `NEXT_REDIRECT;...` string. `renderToReadableStream`'s
|
|
575
|
-
* `onError` returns that digest, react-server-dom-webpack serializes the
|
|
576
|
-
* error into the stream, and the client's `RedirectErrorBoundary` decodes it
|
|
577
|
-
* via `getURLFromRedirectError` / `getRedirectTypeFromError`.
|
|
578
|
-
*
|
|
579
|
-
* The thrown error's digest matches Next.js's well-known router error format,
|
|
580
|
-
* so neither vinext's RSC error handler nor Next.js's reporter logs it as a
|
|
581
|
-
* "real" server error. Mirrors `app-render.tsx generateDynamicFlightRenderResult`
|
|
582
|
-
* where a redirect thrown during RSC rendering propagates through
|
|
583
|
-
* `renderToFlightStream`'s `onError` callback into the flight payload.
|
|
584
|
-
*/
|
|
585
|
-
function buildRscRedirectFlightStream(options, digest) {
|
|
586
|
-
const throwingElement = React.createElement(function NextRedirectFlightThrower() {
|
|
587
|
-
const err = /* @__PURE__ */ new Error("NEXT_REDIRECT");
|
|
588
|
-
err.digest = digest;
|
|
589
|
-
throw err;
|
|
590
|
-
});
|
|
591
|
-
return options.renderToReadableStream(throwingElement, { onError: () => digest });
|
|
592
|
-
}
|
|
593
|
-
async function renderLayoutSpecialError(options, specialError, layoutIndex) {
|
|
570
|
+
async function renderLayoutSpecialError(options, specialError, layoutIndex, serveStreamingMetadata) {
|
|
594
571
|
return buildAppPageSpecialErrorResponse({
|
|
595
572
|
basePath: options.basePath,
|
|
596
|
-
buildRscRedirectFlightStream: (rscOptions) => buildRscRedirectFlightStream(
|
|
573
|
+
buildRscRedirectFlightStream: (rscOptions) => buildRscRedirectFlightStream({
|
|
574
|
+
renderToReadableStream: options.renderToReadableStream,
|
|
575
|
+
digest: rscOptions.digest
|
|
576
|
+
}),
|
|
597
577
|
clearRequestContext: options.clearRequestContext,
|
|
598
578
|
getAndClearPendingCookies,
|
|
599
|
-
serveStreamingMetadata
|
|
579
|
+
serveStreamingMetadata,
|
|
600
580
|
isEdgeRuntime: options.isEdgeRuntime,
|
|
601
581
|
isRscRequest: options.isRscRequest,
|
|
602
582
|
middlewareContext: options.middlewareContext,
|
|
@@ -625,13 +605,16 @@ async function renderLayoutSpecialError(options, specialError, layoutIndex) {
|
|
|
625
605
|
specialError
|
|
626
606
|
});
|
|
627
607
|
}
|
|
628
|
-
async function renderPageSpecialError(options, specialError) {
|
|
608
|
+
async function renderPageSpecialError(options, specialError, serveStreamingMetadata, intercept) {
|
|
629
609
|
return buildAppPageSpecialErrorResponse({
|
|
630
610
|
basePath: options.basePath,
|
|
631
|
-
buildRscRedirectFlightStream: (rscOptions) => buildRscRedirectFlightStream(
|
|
611
|
+
buildRscRedirectFlightStream: (rscOptions) => buildRscRedirectFlightStream({
|
|
612
|
+
renderToReadableStream: options.renderToReadableStream,
|
|
613
|
+
digest: rscOptions.digest
|
|
614
|
+
}),
|
|
632
615
|
clearRequestContext: options.clearRequestContext,
|
|
633
616
|
getAndClearPendingCookies,
|
|
634
|
-
serveStreamingMetadata
|
|
617
|
+
serveStreamingMetadata,
|
|
635
618
|
isEdgeRuntime: options.isEdgeRuntime,
|
|
636
619
|
isRscRequest: options.isRscRequest,
|
|
637
620
|
middlewareContext: options.middlewareContext,
|
|
@@ -649,7 +632,10 @@ async function renderPageSpecialError(options, specialError) {
|
|
|
649
632
|
statusCode
|
|
650
633
|
});
|
|
651
634
|
const useLayoutAlignedBoundary = boundaryLayoutIndex !== null && (routeBoundaryModule === null || routeBoundaryModule === parentBoundaryModule);
|
|
652
|
-
const fallbackOptions = {
|
|
635
|
+
const fallbackOptions = {
|
|
636
|
+
intercept,
|
|
637
|
+
matchedParams: options.params
|
|
638
|
+
};
|
|
653
639
|
if (useLayoutAlignedBoundary && boundaryLayoutIndex !== null) {
|
|
654
640
|
fallbackOptions.layouts = options.route.layouts.slice(0, boundaryLayoutIndex + 1);
|
|
655
641
|
if (parentBoundaryModule) {
|
|
@@ -22,6 +22,9 @@ type AppPageInterceptOptions<TModule extends AppPageModule = AppPageModule> = {
|
|
|
22
22
|
interceptLayouts?: readonly (TModule | null | undefined)[] | null;
|
|
23
23
|
interceptLayoutSegments?: readonly (readonly string[])[] | null;
|
|
24
24
|
interceptBranchSegments?: readonly string[] | null;
|
|
25
|
+
interceptNotFoundBranchSegments?: readonly string[] | null;
|
|
26
|
+
interceptNotFound?: TModule | null;
|
|
27
|
+
interceptNotFoundTreePosition?: number | null;
|
|
25
28
|
interceptPage?: TModule | null;
|
|
26
29
|
interceptParams?: AppPageParams | null;
|
|
27
30
|
interceptSlotId?: string | null;
|
|
@@ -37,7 +40,9 @@ type AppPagePageRequest<TModule extends AppPageModule = AppPageModule> = {
|
|
|
37
40
|
mountedSlotsHeader: string | null; /** Semantic RSC payload mode for this page render. */
|
|
38
41
|
renderMode?: AppRscRenderMode; /** Observe page `searchParams` access for cache-safety classification. */
|
|
39
42
|
observePageSearchParamsAccess?: boolean; /** Observe page metadata `searchParams` access for cache-safety classification. */
|
|
40
|
-
observeMetadataSearchParamsAccess?: boolean;
|
|
43
|
+
observeMetadataSearchParamsAccess?: boolean; /** Whether generated metadata may stream into the response body. */
|
|
44
|
+
serveStreamingMetadata?: boolean; /** Whether streamed render errors must be sanitized for client transport. */
|
|
45
|
+
isProduction?: boolean;
|
|
41
46
|
};
|
|
42
47
|
type BuildPageElementsOptions<TModule extends AppPageModule = AppPageModule, TErrorModule extends AppPageErrorModule = AppPageErrorModule> = {
|
|
43
48
|
applyFileBasedMetadata?: ApplyAppPageFileBasedMetadata;
|
|
@@ -96,6 +101,7 @@ type AppPageNavigationParamInterceptOptions = {
|
|
|
96
101
|
*/
|
|
97
102
|
declare function buildPageElements<TModule extends AppPageModule = AppPageModule, TErrorModule extends AppPageErrorModule = AppPageErrorModule>(options: BuildPageElementsOptions<TModule, TErrorModule>): Promise<AppElements>;
|
|
98
103
|
declare function resolveInterceptedSlotSegments(sourcePageSegments: readonly string[] | null | undefined, slotKey: string): readonly string[] | null;
|
|
104
|
+
declare function resolveSlotParamOverrides(route: AppPageNavigationParamRoute, routePath: string): Readonly<Record<string, AppPageParams>> | null;
|
|
99
105
|
declare function resolveAppPageNavigationParams(route: AppPageNavigationParamRoute, routeParams: AppPageParams, routePath: string, opts?: AppPageNavigationParamInterceptOptions | null): AppPageParams;
|
|
100
106
|
//#endregion
|
|
101
|
-
export { AppPageBuildRoute, type AppPageErrorModule, AppPageInterceptOptions, AppPagePageRequest, type AppPageRouteWiringRoute, BuildPageElementsOptions, buildPageElements, resolveAppPageNavigationParams, resolveInterceptedSlotSegments };
|
|
107
|
+
export { AppPageBuildRoute, type AppPageErrorModule, AppPageInterceptOptions, AppPagePageRequest, type AppPageRouteWiringRoute, BuildPageElementsOptions, buildPageElements, resolveAppPageNavigationParams, resolveInterceptedSlotSegments, resolveSlotParamOverrides };
|