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
|
@@ -4,12 +4,16 @@ import "./app-elements.js";
|
|
|
4
4
|
import { createAppPageRenderIdentity } from "./app-page-render-identity.js";
|
|
5
5
|
import { matchRoutePattern } from "../routing/route-pattern.js";
|
|
6
6
|
import { makeThenableParams } from "../shims/thenable-params.js";
|
|
7
|
-
import { resolveAppPageBranchParams } from "./app-page-params.js";
|
|
8
|
-
import {
|
|
7
|
+
import { resolveAppPageBranchParams, resolveAppPageSegmentParams } from "./app-page-params.js";
|
|
8
|
+
import { resolveAppPageSpecialError } from "./app-page-execution.js";
|
|
9
|
+
import { prepareAppPageHead, resolveActiveParallelRouteHeadInputs } from "./app-page-head.js";
|
|
9
10
|
import { createAppPageSearchParamsObserver, makeObservedAppPageSearchParamsThenable } from "./app-page-search-params-observation.js";
|
|
10
11
|
import { buildAppPageElements, createAppPageSourcePage, createAppPageTreePath } from "./app-page-route-wiring.js";
|
|
11
|
-
import {
|
|
12
|
+
import { resolveHttpAccessFallbackMetadata, resolveHttpAccessFallbackViewport } from "./app-page-http-access-fallback-metadata.js";
|
|
12
13
|
import "./app-rsc-route-matching.js";
|
|
14
|
+
import { resolveAppPageParentHttpAccessBoundary } from "./app-page-boundary.js";
|
|
15
|
+
import { sanitizeErrorForClient } from "./app-rsc-errors.js";
|
|
16
|
+
import { DEFAULT_GLOBAL_ERROR_MODULE } from "./default-global-error-module.js";
|
|
13
17
|
import { shouldServeStreamingMetadata } from "./streaming-metadata.js";
|
|
14
18
|
import { createElement } from "react";
|
|
15
19
|
//#region src/server/app-page-element-builder.ts
|
|
@@ -41,7 +45,7 @@ function isReactOwnedPageComponent(component) {
|
|
|
41
45
|
async function buildPageElements(options) {
|
|
42
46
|
const { route, params, routePath, displayPathname = routePath, pageRequest, globalErrorModule, rootNotFoundModule, rootForbiddenModule, rootUnauthorizedModule, metadataRoutes } = options;
|
|
43
47
|
const slotParamOverrides = resolveSlotParamOverrides(route, routePath);
|
|
44
|
-
const { opts, searchParams, isRscRequest, mountedSlotsHeader, renderMode = APP_RSC_RENDER_MODE_NAVIGATION, observeMetadataSearchParamsAccess = false, observePageSearchParamsAccess = false } = pageRequest;
|
|
48
|
+
const { opts, searchParams, isRscRequest, mountedSlotsHeader, renderMode = APP_RSC_RENDER_MODE_NAVIGATION, observeMetadataSearchParamsAccess = false, observePageSearchParamsAccess = false, serveStreamingMetadata, isProduction = process.env.NODE_ENV === "production" } = pageRequest;
|
|
45
49
|
const pageModule = route.page;
|
|
46
50
|
const isSiblingIntercept = opts?.interceptSlotKey === "__vinext_page_intercept" && !!opts?.interceptPage;
|
|
47
51
|
const effectivePageModule = isSiblingIntercept ? opts.interceptPage : pageModule;
|
|
@@ -76,38 +80,116 @@ async function buildPageElements(options) {
|
|
|
76
80
|
[renderIdentity.routeId]: createElement("div", null, "Page has no default export")
|
|
77
81
|
};
|
|
78
82
|
}
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
+
const activeParallelRouteHeadInputs = resolveActiveParallelRouteHeadInputs({
|
|
84
|
+
interceptBranchSegments: opts?.interceptBranchSegments ?? null,
|
|
85
|
+
interceptLayouts: opts?.interceptLayouts ?? null,
|
|
86
|
+
interceptLayoutSegments: opts?.interceptLayoutSegments ?? null,
|
|
87
|
+
interceptNotFoundBranchSegments: opts?.interceptNotFoundBranchSegments ?? null,
|
|
88
|
+
interceptNotFound: opts?.interceptNotFound ?? null,
|
|
89
|
+
interceptNotFoundTreePosition: opts?.interceptNotFoundTreePosition ?? null,
|
|
90
|
+
interceptPage: opts?.interceptPage ?? null,
|
|
91
|
+
interceptParams: opts?.interceptParams ?? null,
|
|
92
|
+
interceptSlotKey: opts?.interceptSlotKey ?? null,
|
|
93
|
+
interceptSourcePageSegments: opts?.interceptSourcePageSegments ?? null,
|
|
83
94
|
layoutTreePositions: route.layoutTreePositions,
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
interceptParams: opts?.interceptParams ?? null,
|
|
92
|
-
interceptSlotKey: opts?.interceptSlotKey ?? null,
|
|
93
|
-
layoutTreePositions: route.layoutTreePositions,
|
|
94
|
-
params,
|
|
95
|
-
routeSegments: route.routeSegments ?? [],
|
|
96
|
-
slotParams: slotParamOverrides,
|
|
97
|
-
slots: route.slots ?? null
|
|
98
|
-
}), ...isSiblingIntercept ? [{
|
|
95
|
+
params,
|
|
96
|
+
routeSegments: route.routeSegments ?? [],
|
|
97
|
+
slotParams: slotParamOverrides,
|
|
98
|
+
slots: route.slots ?? null
|
|
99
|
+
});
|
|
100
|
+
const primaryParallelRouteHeadInput = isSiblingIntercept ? {
|
|
101
|
+
head: {
|
|
99
102
|
layoutModules: opts?.interceptLayouts ?? [],
|
|
100
103
|
layoutParams: (opts?.interceptLayoutSegments ?? []).map((segments) => resolveInterceptLayoutParams(opts?.interceptBranchSegments ?? segments, segments, effectiveParams)),
|
|
101
104
|
pageModule: effectivePageModule ?? null,
|
|
102
105
|
params: effectiveParams,
|
|
103
106
|
routeSegments: opts?.interceptSourcePageSegments ?? route.routeSegments ?? []
|
|
104
|
-
}
|
|
107
|
+
},
|
|
108
|
+
...opts?.interceptNotFound ? {
|
|
109
|
+
notFoundModule: opts.interceptNotFound,
|
|
110
|
+
notFoundParams: resolveAppPageBranchParams(opts.interceptNotFoundBranchSegments ?? opts.interceptBranchSegments ?? route.routeSegments ?? [], opts.interceptNotFoundTreePosition ?? 0, effectiveParams)
|
|
111
|
+
} : {},
|
|
112
|
+
ownerTreePosition: route.routeSegments?.length ?? 0
|
|
113
|
+
} : null;
|
|
114
|
+
const parallelRoutes = [...activeParallelRouteHeadInputs.map((input) => input.head), ...primaryParallelRouteHeadInput ? [primaryParallelRouteHeadInput.head] : []];
|
|
115
|
+
const metadataSearchParamsObserver = observeMetadataSearchParamsAccess ? createAppPageSearchParamsObserver() : void 0;
|
|
116
|
+
const preparedHead = prepareAppPageHead({
|
|
117
|
+
applyFileBasedMetadata: options.applyFileBasedMetadata,
|
|
118
|
+
basePath: options.basePath ?? "",
|
|
119
|
+
layoutModules: route.layouts,
|
|
120
|
+
layoutTreePositions: route.layoutTreePositions,
|
|
121
|
+
metadataRoutes,
|
|
122
|
+
pageModule: isSiblingIntercept ? null : effectivePageModule ?? null,
|
|
123
|
+
parallelRoutes,
|
|
105
124
|
params: effectiveParams,
|
|
106
125
|
routePath: route.pattern,
|
|
107
126
|
routeSegments: route.routeSegments ?? null,
|
|
108
127
|
searchParams,
|
|
109
|
-
searchParamsObserver:
|
|
128
|
+
searchParamsObserver: metadataSearchParamsObserver
|
|
110
129
|
});
|
|
130
|
+
const { hasDynamicMetadata, pageSearchParams } = preparedHead;
|
|
131
|
+
const streamGeneratedHead = serveStreamingMetadata ?? shouldServeStreamingMetadata(pageRequest.request.headers.get("user-agent") ?? "", options.htmlLimitedBots);
|
|
132
|
+
const metadataPlacement = hasDynamicMetadata && streamGeneratedHead ? "body" : "head";
|
|
133
|
+
const shouldDeferMetadata = metadataPlacement === "body";
|
|
134
|
+
const streamingMetadata = shouldDeferMetadata ? isProduction ? preparedHead.metadata.catch((error) => {
|
|
135
|
+
throw sanitizeErrorForClient(error, "production");
|
|
136
|
+
}) : preparedHead.metadata : null;
|
|
137
|
+
streamingMetadata?.catch(() => null);
|
|
138
|
+
const resolveNotFoundFallbackPlanOptions = () => {
|
|
139
|
+
const routeBoundaryModule = route.notFound;
|
|
140
|
+
const parentBoundary = resolveAppPageParentHttpAccessBoundary({
|
|
141
|
+
layoutIndex: route.layouts.length,
|
|
142
|
+
rootForbiddenModule,
|
|
143
|
+
rootNotFoundModule,
|
|
144
|
+
rootUnauthorizedModule,
|
|
145
|
+
routeForbiddenModules: route.forbiddens,
|
|
146
|
+
routeNotFoundModules: route.notFounds,
|
|
147
|
+
routeUnauthorizedModules: route.unauthorizeds,
|
|
148
|
+
statusCode: 404
|
|
149
|
+
});
|
|
150
|
+
const boundaryModule = routeBoundaryModule ?? parentBoundary.module;
|
|
151
|
+
const boundaryTreePosition = routeBoundaryModule ? route.notFoundTreePosition : parentBoundary.layoutIndex === null ? null : route.layoutTreePositions?.[parentBoundary.layoutIndex];
|
|
152
|
+
return {
|
|
153
|
+
boundaryModule,
|
|
154
|
+
boundaryParams: boundaryModule && boundaryTreePosition != null ? resolveAppPageSegmentParams(route.routeSegments ?? [], boundaryTreePosition, effectiveParams) : {},
|
|
155
|
+
layoutModules: route.layouts,
|
|
156
|
+
layoutTreePositions: route.layoutTreePositions,
|
|
157
|
+
parallelBranches: activeParallelRouteHeadInputs,
|
|
158
|
+
params: effectiveParams,
|
|
159
|
+
primaryParallelBranch: primaryParallelRouteHeadInput,
|
|
160
|
+
routeSegments: route.routeSegments ?? null
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
let viewportErrorOutlet = null;
|
|
164
|
+
let metadataErrorOutlet = null;
|
|
165
|
+
const resolveMetadataErrorTags = async (error) => {
|
|
166
|
+
if (resolveAppPageSpecialError(error)?.kind !== "http-access-fallback") return null;
|
|
167
|
+
return resolveHttpAccessFallbackMetadata({
|
|
168
|
+
applyFileBasedMetadata: options.applyFileBasedMetadata,
|
|
169
|
+
basePath: options.basePath ?? "",
|
|
170
|
+
...resolveNotFoundFallbackPlanOptions(),
|
|
171
|
+
metadataRoutes,
|
|
172
|
+
routePath: route.pattern
|
|
173
|
+
}).catch(() => null);
|
|
174
|
+
};
|
|
175
|
+
const [resolvedMetadata, resolvedViewport] = await Promise.all([shouldDeferMetadata ? Promise.resolve(null) : preparedHead.metadata.catch((error) => {
|
|
176
|
+
metadataErrorOutlet = Promise.reject(isProduction ? sanitizeErrorForClient(error, "production") : error);
|
|
177
|
+
metadataErrorOutlet.catch(() => null);
|
|
178
|
+
return resolveMetadataErrorTags(error);
|
|
179
|
+
}), preparedHead.viewport.catch(async (error) => {
|
|
180
|
+
const specialError = resolveAppPageSpecialError(error);
|
|
181
|
+
viewportErrorOutlet = Promise.reject(isProduction ? sanitizeErrorForClient(error, "production") : error);
|
|
182
|
+
viewportErrorOutlet.catch(() => null);
|
|
183
|
+
return specialError?.kind === "http-access-fallback" ? resolveHttpAccessFallbackViewport(resolveNotFoundFallbackPlanOptions()).catch(() => ({})) : {};
|
|
184
|
+
})]);
|
|
185
|
+
const streamingMetadataTags = shouldDeferMetadata ? preparedHead.metadata.catch(resolveMetadataErrorTags) : null;
|
|
186
|
+
const streamingMetadataOutletInputs = [
|
|
187
|
+
streamingMetadata,
|
|
188
|
+
metadataErrorOutlet,
|
|
189
|
+
viewportErrorOutlet
|
|
190
|
+
].filter((promise) => promise !== null).map((promise) => Promise.resolve(promise));
|
|
191
|
+
const streamingMetadataOutlet = streamingMetadataOutletInputs.length > 0 ? Promise.all(streamingMetadataOutletInputs).then(() => null) : null;
|
|
192
|
+
streamingMetadataOutlet?.catch(() => null);
|
|
111
193
|
const pageProps = { params: makeThenableParams(effectiveParams) };
|
|
112
194
|
const hasRequestSearchParams = Object.keys(pageSearchParams).length > 0;
|
|
113
195
|
const createPageElement = (PageComponent, props) => {
|
|
@@ -127,7 +209,6 @@ async function buildPageElements(options) {
|
|
|
127
209
|
const pageSearchParamsThenable = searchParams ? makeThenableParams(pageSearchParams) : void 0;
|
|
128
210
|
const mountedSlotIds = mountedSlotsHeader ? new Set(mountedSlotsHeader.split(" ")) : null;
|
|
129
211
|
const slotOverrides = buildSlotOverrides(route, params, routePath, opts);
|
|
130
|
-
const metadataPlacement = hasDynamicMetadata && shouldServeStreamingMetadata(pageRequest.request.headers.get("user-agent") ?? "", options.htmlLimitedBots) ? "body" : "head";
|
|
131
212
|
let siblingInterceptElement = isSiblingIntercept && EffectivePageComponent ? createPageElement(EffectivePageComponent, pageProps) : null;
|
|
132
213
|
if (isSiblingIntercept && siblingInterceptElement !== null && opts?.interceptLayouts?.length) for (let i = opts.interceptLayouts.length - 1; i >= 0; i--) {
|
|
133
214
|
const LayoutComponent = opts.interceptLayouts[i]?.default;
|
|
@@ -149,6 +230,10 @@ async function buildPageElements(options) {
|
|
|
149
230
|
resolvedMetadata,
|
|
150
231
|
resolvedMetadataPathname: routePath,
|
|
151
232
|
resolvedViewport,
|
|
233
|
+
streamingMetadata,
|
|
234
|
+
streamingMetadataOutlet,
|
|
235
|
+
streamingMetadataOutletSuspended: streamGeneratedHead,
|
|
236
|
+
streamingMetadataTags,
|
|
152
237
|
renderIdentity,
|
|
153
238
|
routePath,
|
|
154
239
|
sourcePageSegments,
|
|
@@ -293,4 +378,4 @@ function collectParamNameSet(params) {
|
|
|
293
378
|
return set;
|
|
294
379
|
}
|
|
295
380
|
//#endregion
|
|
296
|
-
export { buildPageElements, resolveAppPageNavigationParams, resolveInterceptedSlotSegments };
|
|
381
|
+
export { buildPageElements, resolveAppPageNavigationParams, resolveInterceptedSlotSegments, resolveSlotParamOverrides };
|
|
@@ -6,6 +6,7 @@ type AppPageSpecialError = {
|
|
|
6
6
|
kind: "redirect";
|
|
7
7
|
location: string;
|
|
8
8
|
statusCode: number;
|
|
9
|
+
type?: "push" | "replace";
|
|
9
10
|
fromMetadata?: boolean;
|
|
10
11
|
} | {
|
|
11
12
|
kind: "http-access-fallback";
|
|
@@ -132,7 +133,8 @@ declare function probeAppPageLayouts(options: ProbeAppPageLayoutsOptions): Promi
|
|
|
132
133
|
declare function probeAppPageComponent(options: ProbeAppPageComponentOptions): Promise<Response | null>;
|
|
133
134
|
declare function probeAppPageThrownError(options: ProbeAppPageThrownErrorOptions): Promise<unknown>;
|
|
134
135
|
declare function readAppPageBinaryStream(stream: ReadableStream<Uint8Array>): Promise<ArrayBuffer>;
|
|
136
|
+
declare function bufferAppPageBinaryStream(stream: ReadableStream<Uint8Array>): Promise<ReadableStream<Uint8Array>>;
|
|
135
137
|
declare function teeAppPageRscStreamForCapture(stream: ReadableStream<Uint8Array>, shouldCapture: boolean): AppPageRscStreamCapture;
|
|
136
138
|
declare function buildAppPageFontLinkHeader(preloads: readonly AppPageFontPreload[] | null | undefined): string;
|
|
137
139
|
//#endregion
|
|
138
|
-
export { AppPageFontPreload, AppPageSpecialError, LayoutClassificationOptions, type LayoutFlags, buildAppPageFontLinkHeader, buildAppPageSpecialErrorResponse, probeAppPageComponent, probeAppPageLayouts, probeAppPageThrownError, readAppPageBinaryStream, resolveAppPageSpecialError, tagAppPageMetadataError, teeAppPageRscStreamForCapture };
|
|
140
|
+
export { AppPageFontPreload, AppPageSpecialError, LayoutClassificationOptions, type LayoutFlags, bufferAppPageBinaryStream, buildAppPageFontLinkHeader, buildAppPageSpecialErrorResponse, probeAppPageComponent, probeAppPageLayouts, probeAppPageThrownError, readAppPageBinaryStream, resolveAppPageSpecialError, tagAppPageMetadataError, teeAppPageRscStreamForCapture };
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { VINEXT_RSC_REDIRECT_HEADER } from "./headers.js";
|
|
1
|
+
import { VINEXT_RSC_REDIRECT_HEADER, VINEXT_RSC_REDIRECT_TYPE_HEADER } from "./headers.js";
|
|
3
2
|
import { runWithConnectionProbe } from "../shims/headers.js";
|
|
4
3
|
import { VINEXT_RSC_CONTENT_TYPE, applyRscCompatibilityIdHeader, applyRscDeploymentIdHeader, createRscRedirectLocation } from "./app-rsc-cache-busting.js";
|
|
5
4
|
import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
|
|
@@ -7,28 +6,9 @@ import { applyEdgeRuntimeHeader } from "./app-page-response.js";
|
|
|
7
6
|
import { parseNextHttpErrorDigest, parseNextRedirectDigest } from "./next-error-digest.js";
|
|
8
7
|
import { renderSsrErrorMetaTags } from "./app-ssr-error-meta.js";
|
|
9
8
|
import { isPromiseLike } from "../utils/promise.js";
|
|
9
|
+
import { formatNextRedirectDigest } from "./app-rsc-redirect-flight.js";
|
|
10
10
|
//#region src/server/app-page-execution.ts
|
|
11
11
|
/**
|
|
12
|
-
* Builds the canonical `NEXT_REDIRECT;<type>;<url>;<status>;` digest that
|
|
13
|
-
* Next.js encodes on `redirect()` / `permanentRedirect()` throws. Used when
|
|
14
|
-
* we synthesize a flight payload for an RSC navigation: the digest must
|
|
15
|
-
* round-trip through the client's `RedirectErrorBoundary` so the same
|
|
16
|
-
* `getURLFromRedirectError` / `getRedirectTypeFromError` helpers decode it.
|
|
17
|
-
*
|
|
18
|
-
* The URL is included verbatim, not encoded — Next.js's `getRedirectError`
|
|
19
|
-
* sets `digest = ${CODE};${type};${url};${status};` with the raw URL, and the
|
|
20
|
-
* client decodes via `error.digest.split(';').slice(2, -2).join(';')`. We
|
|
21
|
-
* default `type=replace` because `redirect()` is replace-style outside of
|
|
22
|
-
* server actions, matching Next.js's `getRedirectError` default.
|
|
23
|
-
*
|
|
24
|
-
* Reference:
|
|
25
|
-
* `.nextjs-ref/packages/next/src/client/components/redirect.ts:20-23`
|
|
26
|
-
* `.nextjs-ref/packages/next/src/client/components/redirect-error.ts`
|
|
27
|
-
*/
|
|
28
|
-
function formatNextRedirectDigest(options) {
|
|
29
|
-
return `NEXT_REDIRECT;replace;${options.url};${options.statusCode};`;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
12
|
* Marker we tag onto a thrown redirect/notFound error when it originates from
|
|
33
13
|
* `generateMetadata()` (vs. a server component itself). Metadata resolution is
|
|
34
14
|
* suspended/streamed in Next.js, so a redirect from metadata is not emitted as
|
|
@@ -73,12 +53,13 @@ function mergeAppPageSpecialErrorHeaders(response, middlewareContext) {
|
|
|
73
53
|
function resolveAppPageSpecialError(error) {
|
|
74
54
|
if (!(error && typeof error === "object" && "digest" in error)) return null;
|
|
75
55
|
const digest = String(error.digest);
|
|
76
|
-
const fromMetadata = error
|
|
56
|
+
const fromMetadata = Reflect.get(error, APP_PAGE_METADATA_ERROR_MARKER) === true;
|
|
77
57
|
const redirect = parseNextRedirectDigest(digest);
|
|
78
58
|
if (redirect) return {
|
|
79
59
|
kind: "redirect",
|
|
80
60
|
location: redirect.url,
|
|
81
61
|
statusCode: redirect.status,
|
|
62
|
+
type: redirect.type === "push" ? "push" : "replace",
|
|
82
63
|
...fromMetadata ? { fromMetadata: true } : {}
|
|
83
64
|
};
|
|
84
65
|
const httpError = parseNextHttpErrorDigest(digest);
|
|
@@ -97,17 +78,15 @@ function resolveAppPageSpecialError(error) {
|
|
|
97
78
|
* in `app-render.tsx`: a `redirect("/about")` call from a page mounted at
|
|
98
79
|
* `/blog` (basePath) produces `Location: /blog/about`.
|
|
99
80
|
*
|
|
100
|
-
* Skips prefixing when
|
|
101
|
-
*
|
|
102
|
-
* - the target is a full URL pointing at a different origin (external redirect)
|
|
103
|
-
* - the target already starts with the basePath (caller did the work themselves)
|
|
81
|
+
* Skips prefixing only when basePath is unset or the raw target does not start
|
|
82
|
+
* with `/`, matching Next.js's literal `addPathPrefix()` contract.
|
|
104
83
|
*/
|
|
105
|
-
function applyAppPageRedirectBasePath(location,
|
|
106
|
-
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
return
|
|
84
|
+
function applyAppPageRedirectBasePath(location, basePath) {
|
|
85
|
+
if (!basePath || !location.startsWith("/")) return location;
|
|
86
|
+
const queryIndex = location.indexOf("?");
|
|
87
|
+
const hashIndex = location.indexOf("#");
|
|
88
|
+
const suffixIndex = queryIndex === -1 ? hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex);
|
|
89
|
+
return `${basePath}${suffixIndex === -1 ? location : location.slice(0, suffixIndex)}${suffixIndex === -1 ? "" : location.slice(suffixIndex)}`;
|
|
111
90
|
}
|
|
112
91
|
/**
|
|
113
92
|
* Returns a path-relative form (`/foo?bar`) of an absolute URL when it shares
|
|
@@ -141,9 +120,10 @@ function buildMetadataRedirectHtmlResponse(options) {
|
|
|
141
120
|
async function buildAppPageSpecialErrorResponse(options) {
|
|
142
121
|
if (options.specialError.kind === "redirect") {
|
|
143
122
|
options.clearRequestContext();
|
|
144
|
-
const prefixedLocation = applyAppPageRedirectBasePath(options.specialError.location, options.
|
|
123
|
+
const prefixedLocation = applyAppPageRedirectBasePath(options.specialError.location, options.basePath);
|
|
145
124
|
const digestUrl = sameOriginPathOrAbsolute(prefixedLocation, options.request.url);
|
|
146
125
|
const digest = formatNextRedirectDigest({
|
|
126
|
+
type: options.specialError.type ?? "replace",
|
|
147
127
|
url: digestUrl,
|
|
148
128
|
statusCode: options.specialError.statusCode
|
|
149
129
|
});
|
|
@@ -155,14 +135,13 @@ async function buildAppPageSpecialErrorResponse(options) {
|
|
|
155
135
|
});
|
|
156
136
|
if (Boolean(options.buildRscRedirectFlightStream) && options.isRscRequest && options.buildRscRedirectFlightStream) {
|
|
157
137
|
const stream = options.buildRscRedirectFlightStream({ digest });
|
|
158
|
-
const headers = new Headers({
|
|
159
|
-
"Content-Type": VINEXT_RSC_CONTENT_TYPE,
|
|
160
|
-
[VINEXT_RSC_REDIRECT_HEADER]: digestUrl
|
|
161
|
-
});
|
|
138
|
+
const headers = new Headers({ "Content-Type": VINEXT_RSC_CONTENT_TYPE });
|
|
162
139
|
applyEdgeRuntimeHeader(headers, options.isEdgeRuntime);
|
|
163
140
|
applyRscCompatibilityIdHeader(headers);
|
|
164
141
|
applyRscDeploymentIdHeader(headers);
|
|
165
142
|
mergeMiddlewareResponseHeaders(headers, options.middlewareContext?.headers ?? null);
|
|
143
|
+
headers.set(VINEXT_RSC_REDIRECT_HEADER, digestUrl);
|
|
144
|
+
headers.set(VINEXT_RSC_REDIRECT_TYPE_HEADER, options.specialError.type ?? "replace");
|
|
166
145
|
const pendingCookies = options.getAndClearPendingCookies?.() ?? [];
|
|
167
146
|
for (const cookie of pendingCookies) headers.append("Set-Cookie", cookie);
|
|
168
147
|
return new Response(stream, {
|
|
@@ -313,6 +292,19 @@ async function readAppPageBinaryStream(stream) {
|
|
|
313
292
|
}
|
|
314
293
|
return buffer.buffer;
|
|
315
294
|
}
|
|
295
|
+
async function bufferAppPageBinaryStream(stream) {
|
|
296
|
+
const reader = stream.getReader();
|
|
297
|
+
const chunks = [];
|
|
298
|
+
for (;;) {
|
|
299
|
+
const { done, value } = await reader.read();
|
|
300
|
+
if (done) break;
|
|
301
|
+
chunks.push(value);
|
|
302
|
+
}
|
|
303
|
+
return new ReadableStream({ start(controller) {
|
|
304
|
+
for (const chunk of chunks) controller.enqueue(chunk);
|
|
305
|
+
controller.close();
|
|
306
|
+
} });
|
|
307
|
+
}
|
|
316
308
|
function teeAppPageRscStreamForCapture(stream, shouldCapture) {
|
|
317
309
|
if (!shouldCapture) return { ssrStream: stream };
|
|
318
310
|
const [ssrStream, sideStream] = stream.tee();
|
|
@@ -326,4 +318,4 @@ function buildAppPageFontLinkHeader(preloads) {
|
|
|
326
318
|
return preloads.map((preload) => `<${preload.href}>; rel=preload; as=font; type=${preload.type}; crossorigin`).join(", ");
|
|
327
319
|
}
|
|
328
320
|
//#endregion
|
|
329
|
-
export { buildAppPageFontLinkHeader, buildAppPageSpecialErrorResponse, probeAppPageComponent, probeAppPageLayouts, probeAppPageThrownError, readAppPageBinaryStream, resolveAppPageSpecialError, tagAppPageMetadataError, teeAppPageRscStreamForCapture };
|
|
321
|
+
export { bufferAppPageBinaryStream, buildAppPageFontLinkHeader, buildAppPageSpecialErrorResponse, probeAppPageComponent, probeAppPageLayouts, probeAppPageThrownError, readAppPageBinaryStream, resolveAppPageSpecialError, tagAppPageMetadataError, teeAppPageRscStreamForCapture };
|
|
@@ -8,6 +8,14 @@ import { applyFileBasedMetadata } from "./file-based-metadata.js";
|
|
|
8
8
|
type AppPageSearchParams = Record<string, string | string[]>;
|
|
9
9
|
type AppPageHeadModule = Record<string, unknown>;
|
|
10
10
|
type ApplyAppPageFileBasedMetadata = typeof applyFileBasedMetadata;
|
|
11
|
+
type OrderedAppPageMetadataSource<TModule extends AppPageHeadModule = AppPageHeadModule> = {
|
|
12
|
+
/** Preserve an empty result as the most specific file-metadata source. */includeWhenEmpty?: boolean;
|
|
13
|
+
module: TModule;
|
|
14
|
+
params: AppPageParams;
|
|
15
|
+
routeSegments: readonly string[];
|
|
16
|
+
searchParams?: AppPageSearchParams;
|
|
17
|
+
searchParamsObserver?: ThenableParamsObserver;
|
|
18
|
+
};
|
|
11
19
|
type AppPageHeadParallelRoute<TModule extends AppPageHeadModule = AppPageHeadModule> = {
|
|
12
20
|
layoutParams?: readonly AppPageParams[] | null;
|
|
13
21
|
layoutModule?: TModule | null;
|
|
@@ -17,11 +25,19 @@ type AppPageHeadParallelRoute<TModule extends AppPageHeadModule = AppPageHeadMod
|
|
|
17
25
|
params?: AppPageParams | null;
|
|
18
26
|
routeSegments?: readonly string[] | null;
|
|
19
27
|
};
|
|
28
|
+
type ActiveParallelRouteHeadInput<TModule extends AppPageHeadModule = AppPageHeadModule> = {
|
|
29
|
+
head: AppPageHeadParallelRoute<TModule>;
|
|
30
|
+
notFoundModule?: TModule | null;
|
|
31
|
+
notFoundParams?: AppPageParams | null;
|
|
32
|
+
ownerTreePosition: number;
|
|
33
|
+
};
|
|
20
34
|
type AppPageHeadSlot<TModule extends AppPageHeadModule = AppPageHeadModule> = {
|
|
21
35
|
configLayouts?: readonly (TModule | null | undefined)[] | null;
|
|
22
36
|
configLayoutTreePositions?: readonly number[] | null;
|
|
23
37
|
layout?: TModule | null;
|
|
24
38
|
layoutIndex?: number;
|
|
39
|
+
notFound?: TModule | null;
|
|
40
|
+
notFoundTreePosition?: number | null;
|
|
25
41
|
page?: TModule | null;
|
|
26
42
|
routeSegments?: readonly string[] | null;
|
|
27
43
|
};
|
|
@@ -30,8 +46,12 @@ type ResolveActiveParallelRouteHeadInputsOptions<TModule extends AppPageHeadModu
|
|
|
30
46
|
interceptBranchSegments?: readonly string[] | null;
|
|
31
47
|
interceptLayoutSegments?: readonly (readonly string[])[] | null;
|
|
32
48
|
interceptPage?: TModule | null;
|
|
49
|
+
interceptNotFoundBranchSegments?: readonly string[] | null;
|
|
50
|
+
interceptNotFound?: TModule | null;
|
|
51
|
+
interceptNotFoundTreePosition?: number | null;
|
|
33
52
|
interceptParams?: AppPageParams | null;
|
|
34
53
|
interceptSlotKey?: string | null;
|
|
54
|
+
interceptSourcePageSegments?: readonly string[] | null;
|
|
35
55
|
layoutTreePositions?: readonly number[] | null;
|
|
36
56
|
params: AppPageParams;
|
|
37
57
|
routeSegments: readonly string[];
|
|
@@ -59,6 +79,18 @@ type ResolveAppPageHeadOptions<TModule extends AppPageHeadModule = AppPageHeadMo
|
|
|
59
79
|
searchParams?: URLSearchParams | null;
|
|
60
80
|
searchParamsObserver?: ThenableParamsObserver;
|
|
61
81
|
};
|
|
82
|
+
type AppPageMetadataOutputOptions = {
|
|
83
|
+
applyFileBasedMetadata?: ApplyAppPageFileBasedMetadata;
|
|
84
|
+
basePath?: string;
|
|
85
|
+
fallbackOnFileMetadataError?: boolean;
|
|
86
|
+
metadataRoutes: readonly MetadataFileRoute[];
|
|
87
|
+
params: AppPageParams;
|
|
88
|
+
routePath: string;
|
|
89
|
+
routeSegments?: readonly string[] | null;
|
|
90
|
+
};
|
|
91
|
+
type ResolveOrderedAppPageMetadataOptions<TModule extends AppPageHeadModule = AppPageHeadModule> = AppPageMetadataOutputOptions & {
|
|
92
|
+
sources: readonly OrderedAppPageMetadataSource<TModule>[];
|
|
93
|
+
};
|
|
62
94
|
type ResolveAppPageHeadResult = {
|
|
63
95
|
hasDynamicMetadata: boolean;
|
|
64
96
|
hasSearchParams: boolean;
|
|
@@ -66,12 +98,32 @@ type ResolveAppPageHeadResult = {
|
|
|
66
98
|
pageSearchParams: AppPageSearchParams;
|
|
67
99
|
viewport: Viewport;
|
|
68
100
|
};
|
|
101
|
+
type PreparedAppPageHead = Omit<ResolveAppPageHeadResult, "metadata" | "viewport"> & {
|
|
102
|
+
metadata: Promise<Metadata | null>;
|
|
103
|
+
viewport: Promise<Viewport>;
|
|
104
|
+
};
|
|
69
105
|
type AppPageSearchParamsCollection = {
|
|
70
106
|
hasSearchParams: boolean;
|
|
71
107
|
pageSearchParams: AppPageSearchParams;
|
|
72
108
|
};
|
|
73
|
-
declare function resolveActiveParallelRouteHeadInputs<TModule extends AppPageHeadModule>(options: ResolveActiveParallelRouteHeadInputsOptions<TModule>):
|
|
109
|
+
declare function resolveActiveParallelRouteHeadInputs<TModule extends AppPageHeadModule>(options: ResolveActiveParallelRouteHeadInputsOptions<TModule>): ActiveParallelRouteHeadInput<TModule>[];
|
|
74
110
|
declare function collectAppPageSearchParams(searchParams: URLSearchParams | null | undefined): AppPageSearchParamsCollection;
|
|
111
|
+
/**
|
|
112
|
+
* Resolve an explicit metadata-source sequence.
|
|
113
|
+
*
|
|
114
|
+
* Route-specific conventions own source selection and ordering. This resolver
|
|
115
|
+
* only supplies each source with its accumulated parent, merges the results,
|
|
116
|
+
* and applies file-based metadata at the end.
|
|
117
|
+
*/
|
|
118
|
+
declare function resolveOrderedAppPageMetadata<TModule extends AppPageHeadModule>(options: ResolveOrderedAppPageMetadataOptions<TModule>): Promise<Metadata | null>;
|
|
75
119
|
declare function resolveAppPageHead<TModule extends AppPageHeadModule>(options: ResolveAppPageHeadOptions<TModule>): Promise<ResolveAppPageHeadResult>;
|
|
120
|
+
/**
|
|
121
|
+
* Start metadata and viewport resolution without coupling their completion.
|
|
122
|
+
*
|
|
123
|
+
* Live document renders can place the metadata promise behind Suspense while
|
|
124
|
+
* still waiting for viewport tags before the shell is emitted. Blocking
|
|
125
|
+
* callers use {@link resolveAppPageHead} and observe the same result as before.
|
|
126
|
+
*/
|
|
127
|
+
declare function prepareAppPageHead<TModule extends AppPageHeadModule>(options: ResolveAppPageHeadOptions<TModule>): PreparedAppPageHead;
|
|
76
128
|
//#endregion
|
|
77
|
-
export { AppPageSearchParams, ApplyAppPageFileBasedMetadata, collectAppPageSearchParams, resolveActiveParallelRouteHeadInputs, resolveAppPageHead };
|
|
129
|
+
export { ActiveParallelRouteHeadInput, AppPageHeadModule, AppPageHeadParallelRoute, AppPageSearchParams, ApplyAppPageFileBasedMetadata, OrderedAppPageMetadataSource, PreparedAppPageHead, ResolveAppPageHeadResult, ResolveOrderedAppPageMetadataOptions, collectAppPageSearchParams, prepareAppPageHead, resolveActiveParallelRouteHeadInputs, resolveAppPageHead, resolveOrderedAppPageMetadata };
|