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,4 +1,4 @@
|
|
|
1
|
-
import { VINEXT_CLIENT_REUSE_MANIFEST_HEADER, VINEXT_PARAMS_HEADER, VINEXT_RSC_REDIRECT_HEADER } from "./headers.js";
|
|
1
|
+
import { VINEXT_CLIENT_REUSE_MANIFEST_HEADER, VINEXT_PARAMS_HEADER, VINEXT_RSC_REDIRECT_HEADER, VINEXT_RSC_REDIRECT_TYPE_HEADER } from "./headers.js";
|
|
2
2
|
import { AppElementsWire } from "./app-elements-wire.js";
|
|
3
3
|
import { getMountedSlotIdsHeader, resolveVisitedResponseInterceptionContext } from "./app-elements.js";
|
|
4
4
|
import { AppRouterContext } from "../shims/internal/app-router-context.js";
|
|
@@ -24,8 +24,7 @@ import { readHistoryStatePreviousNextUrl } from "./app-history-state.js";
|
|
|
24
24
|
import { AppBrowserMpaNavigationScheduler } from "./app-browser-mpa-navigation.js";
|
|
25
25
|
import { blockDangerousStreamedRscRedirect } from "./app-browser-rsc-redirect.js";
|
|
26
26
|
import { navigationPlanner } from "./navigation-planner.js";
|
|
27
|
-
import {
|
|
28
|
-
import { DYNAMIC_NAVIGATION_CACHE_TTL, PREFETCH_CACHE_TTL, __basePath, appRouterInstance, commitClientNavigationState, consumePrefetchResponseForNavigation, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, createSnapshotPathAndSearch, deletePrefetchResponseSnapshot, getClientNavigationRenderContext, getMountedSlotsHeader, getPrefetchCache, hasPrefetchCacheEntryForNavigation, invalidatePrefetchCache, pushHistoryStateWithoutNotify, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, resolvePrefetchCacheEntryMountedSlotsHeader, restoreRscResponse, saveScrollPosition, seedPrefetchResponseSnapshot, setClientParams, setMountedSlotsHeader, setPendingPathname, useRouter } from "../shims/navigation.js";
|
|
27
|
+
import { DYNAMIC_NAVIGATION_CACHE_TTL, PREFETCH_CACHE_TTL, __basePath, appRouterInstance, commitClientNavigationState, consumePrefetchResponseForNavigation, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, createSnapshotPathAndSearch, deletePrefetchResponseSnapshot, getClientNavigationRenderContext, getMountedSlotsHeader, getPrefetchCache, hasPrefetchCacheEntryForNavigation, invalidatePrefetchCache, preloadHybridClientRouteOwner, pushHistoryStateWithoutNotify, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, resolveLoadedHybridClientRewriteHref, resolvePrefetchCacheEntryMountedSlotsHeader, restoreRscResponse, saveScrollPosition, seedPrefetchResponseSnapshot, setClientParams, setMountedSlotsHeader, setPendingPathname, useRouter } from "../shims/navigation.js";
|
|
29
28
|
import { chunksToReadableStream, createProgressiveRscStream, getVinextBrowserGlobal } from "./app-browser-stream.js";
|
|
30
29
|
import { COMMITTED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, isCacheRestorableAppPayloadMetadata, isCompleteAppPayloadMetadata, resolveInterceptionContextFromPreviousNextUrl } from "./app-browser-state.js";
|
|
31
30
|
import { clearHardNavigationLoopGuard, createAppBrowserNavigationController, createBasePathStrippedPathAndSearch } from "./app-browser-navigation-controller.js";
|
|
@@ -43,6 +42,7 @@ import { createRoot, hydrateRoot } from "react-dom/client";
|
|
|
43
42
|
import { createFromFetch, createFromReadableStream, setServerCallback } from "@vitejs/plugin-rsc/browser";
|
|
44
43
|
import { hasServerActions, loadServerActionClient } from "virtual:vinext-app-capabilities";
|
|
45
44
|
//#region src/server/app-browser-entry.ts
|
|
45
|
+
const HAS_CLIENT_REWRITES = process.env.__VINEXT_HAS_CLIENT_REWRITES !== "false";
|
|
46
46
|
function toActionType(kind) {
|
|
47
47
|
return kind === "traverse" ? "traverse" : "navigate";
|
|
48
48
|
}
|
|
@@ -597,9 +597,10 @@ function BrowserRoot({ hydrationCachePublication, initialElements, initialNaviga
|
|
|
597
597
|
resetKey: treeState.renderId,
|
|
598
598
|
onCatch: handleDevRecoveryBoundaryCatch
|
|
599
599
|
}, innerTree) : innerTree;
|
|
600
|
+
const scrollScopedTree = createElement(AppRouterScrollCommitProvider, { commitId: treeState.renderId }, committedTree);
|
|
600
601
|
const rootErrorTree = createElement(GlobalErrorBoundary, {
|
|
601
602
|
fallback: DEFAULT_GLOBAL_ERROR_COMPONENT,
|
|
602
|
-
children:
|
|
603
|
+
children: scrollScopedTree
|
|
603
604
|
});
|
|
604
605
|
const ClientNavigationRenderContext = getClientNavigationRenderContext();
|
|
605
606
|
if (!ClientNavigationRenderContext) return rootErrorTree;
|
|
@@ -737,6 +738,7 @@ async function main() {
|
|
|
737
738
|
if (!claimInitialAppRouterBootstrap()) return;
|
|
738
739
|
if (hasServerActions) registerServerActionCallback();
|
|
739
740
|
installAppNavigationFailureListeners();
|
|
741
|
+
if (HAS_CLIENT_REWRITES) await preloadHybridClientRouteOwner();
|
|
740
742
|
let devErrorOverlay = null;
|
|
741
743
|
if (import.meta.env.DEV) {
|
|
742
744
|
devErrorOverlay = await import("../client/dev-error-overlay.js");
|
|
@@ -763,7 +765,8 @@ function bootstrapHydration(rscStream, devErrorOverlay, initialRscBootstrap) {
|
|
|
763
765
|
const metadata = AppElementsWire.readMetadata(elements);
|
|
764
766
|
if (!isCompleteAppPayloadMetadata(metadata)) return;
|
|
765
767
|
const mountedSlotsHeader = getMountedSlotIdsHeader(elements);
|
|
766
|
-
const
|
|
768
|
+
const headers = createRscRequestHeaders({ mountedSlotsHeader });
|
|
769
|
+
const rscUrl = await createRscRequestUrl(initialPathAndSearch, headers);
|
|
767
770
|
if (cacheGeneration !== clientNavigationCacheGeneration) return;
|
|
768
771
|
const snapshot = {
|
|
769
772
|
compatibilityIdHeader: CLIENT_RSC_COMPATIBILITY_ID,
|
|
@@ -851,9 +854,9 @@ function bootstrapHydration(rscStream, devErrorOverlay, initialRscBootstrap) {
|
|
|
851
854
|
let redirectCount = redirectDepth;
|
|
852
855
|
let detachedNavigationCommits = false;
|
|
853
856
|
const activeTraversalIntent = navigationKind === "traverse" ? traversalIntent ?? historyController.resolveTraversalIntent(window.history.state) : null;
|
|
854
|
-
const performHardNavigationForScrollIntent = (targetHref) => {
|
|
857
|
+
const performHardNavigationForScrollIntent = (targetHref, mode) => {
|
|
855
858
|
consumeAppRouterScrollIntent(scrollIntent ?? null);
|
|
856
|
-
const didNavigate = browserNavigationController.performHardNavigation(targetHref);
|
|
859
|
+
const didNavigate = browserNavigationController.performHardNavigation(targetHref, mode);
|
|
857
860
|
if (!didNavigate) clearAppNavigationFailureTarget(targetHref);
|
|
858
861
|
return didNavigate;
|
|
859
862
|
};
|
|
@@ -890,7 +893,7 @@ function bootstrapHydration(rscStream, devErrorOverlay, initialRscBootstrap) {
|
|
|
890
893
|
mountedSlotsHeader
|
|
891
894
|
});
|
|
892
895
|
const rscUrl = await createRscRequestUrl(url.pathname + url.search, requestHeaders);
|
|
893
|
-
const rewrittenNavigationHref = navigationKind === "navigate" ?
|
|
896
|
+
const rewrittenNavigationHref = navigationKind === "navigate" && HAS_CLIENT_REWRITES ? resolveLoadedHybridClientRewriteHref(currentHref, __basePath) : null;
|
|
894
897
|
const additionalPrefetchRscUrls = rewrittenNavigationHref && rewrittenNavigationHref !== currentHref ? [await createRscRequestUrl(rewrittenNavigationHref, requestHeaders)] : [];
|
|
895
898
|
const visitedResponseCandidate = shouldBypassNavigationCache ? {
|
|
896
899
|
cacheKey: AppElementsWire.encodeCacheKey(rscUrl, requestInterceptionContext),
|
|
@@ -1033,6 +1036,8 @@ function bootstrapHydration(rscStream, devErrorOverlay, initialRscBootstrap) {
|
|
|
1033
1036
|
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
1034
1037
|
const navContentType = navResponse.headers.get("content-type") ?? "";
|
|
1035
1038
|
const streamedRedirectTarget = navResponse.headers.get(VINEXT_RSC_REDIRECT_HEADER);
|
|
1039
|
+
const streamedRedirectTypeHeader = navResponse.headers.get(VINEXT_RSC_REDIRECT_TYPE_HEADER);
|
|
1040
|
+
const streamedRedirectType = streamedRedirectTypeHeader === "push" || streamedRedirectTypeHeader === "replace" ? streamedRedirectTypeHeader : null;
|
|
1036
1041
|
if (blockDangerousStreamedRscRedirect(navResponse, streamedRedirectTarget)) return;
|
|
1037
1042
|
const liveFetchDecision = navigationPlanner.classifyRscFetchResult({
|
|
1038
1043
|
clientCompatibilityId: CLIENT_RSC_COMPATIBILITY_ID,
|
|
@@ -1047,13 +1052,14 @@ function bootstrapHydration(rscStream, devErrorOverlay, initialRscBootstrap) {
|
|
|
1047
1052
|
responseOk: navResponse.ok,
|
|
1048
1053
|
responseUrl: navResponseUrl ?? navResponse.url,
|
|
1049
1054
|
source: "live",
|
|
1050
|
-
streamedRedirectTarget
|
|
1055
|
+
streamedRedirectTarget,
|
|
1056
|
+
streamedRedirectType
|
|
1051
1057
|
});
|
|
1052
1058
|
if (liveFetchDecision.kind === "hardNavigate") {
|
|
1053
1059
|
if (liveFetchDecision.discardBody) navResponse.body?.cancel().catch(() => {});
|
|
1054
1060
|
if (liveFetchDecision.reason === "redirectDepthExhausted") console.error("[vinext] Too many RSC redirects — aborting navigation to prevent infinite loop.");
|
|
1055
1061
|
if (liveFetchDecision.reason === "streamedRedirectLoop") console.error("[vinext] RSC streamed redirect resolved to the current URL — aborting navigation to prevent infinite loop.");
|
|
1056
|
-
performHardNavigationForScrollIntent(liveFetchDecision.url);
|
|
1062
|
+
performHardNavigationForScrollIntent(liveFetchDecision.url, liveFetchDecision.hardNavigationMode);
|
|
1057
1063
|
return;
|
|
1058
1064
|
}
|
|
1059
1065
|
if (liveFetchDecision.kind === "followRedirect") {
|
|
@@ -1204,7 +1210,8 @@ function bootstrapHydration(rscStream, devErrorOverlay, initialRscBootstrap) {
|
|
|
1204
1210
|
}
|
|
1205
1211
|
};
|
|
1206
1212
|
import.meta.hot.on("rsc:update", () => {
|
|
1207
|
-
|
|
1213
|
+
const updateId = ++latestRscHmrUpdateId;
|
|
1214
|
+
handleRscUpdate(updateId);
|
|
1208
1215
|
});
|
|
1209
1216
|
}
|
|
1210
1217
|
}
|
|
@@ -18,7 +18,7 @@ type AppBrowserHistoryControllerDeps = {
|
|
|
18
18
|
readHistoryState: () => unknown; /** Reads `window.location.href`. Injected so the controller stays unit-testable. */
|
|
19
19
|
readCurrentHref: () => string; /** Wraps `pushHistoryStateWithoutNotify(state, "", href)`. */
|
|
20
20
|
pushHistoryState: (state: unknown, href: string) => void; /** Wraps `replaceHistoryStateWithoutNotify(state, "", href)`. */
|
|
21
|
-
replaceHistoryState: (state: unknown, href
|
|
21
|
+
replaceHistoryState: (state: unknown, href?: string) => void;
|
|
22
22
|
readVisibleNavigationMetadata: () => VisibleNavigationMetadata | null;
|
|
23
23
|
};
|
|
24
24
|
/**
|
|
@@ -158,9 +158,9 @@ var AppBrowserHistoryController = class {
|
|
|
158
158
|
bfcacheVersion: bfcacheIds === void 0 ? void 0 : this.#restorableClientState.currentBfcacheVersion,
|
|
159
159
|
previousNextUrl
|
|
160
160
|
});
|
|
161
|
-
this.#replaceHistoryState(nextHistoryState
|
|
161
|
+
this.#replaceHistoryState(nextHistoryState);
|
|
162
162
|
if (this.#isHistoryStateNavigationMetadataInSync(this.#readHistoryState(), previousNextUrl, bfcacheIds)) return;
|
|
163
|
-
this.#replaceHistoryState(nextHistoryState
|
|
163
|
+
this.#replaceHistoryState(nextHistoryState);
|
|
164
164
|
}
|
|
165
165
|
#isHistoryStateNavigationMetadataInSync(state, previousNextUrl, bfcacheIds) {
|
|
166
166
|
return readHistoryStatePreviousNextUrl(state) === previousNextUrl && (bfcacheIds === void 0 || areBfcacheIdMapsEqual(readHistoryStateBfcacheIds(state), bfcacheIds) && this.#restorableClientState.isCurrentBfcacheVersion(state));
|
|
@@ -179,7 +179,7 @@ var AppBrowserHistoryController = class {
|
|
|
179
179
|
bfcacheVersion: this.#restorableClientState.currentBfcacheVersion,
|
|
180
180
|
previousNextUrl: options.previousNextUrl,
|
|
181
181
|
traversalIndex: this.#currentHistoryTraversalIndex
|
|
182
|
-
})
|
|
182
|
+
}));
|
|
183
183
|
}
|
|
184
184
|
/**
|
|
185
185
|
* Resolves a restorable snapshot candidate for the given history entry and
|
|
@@ -259,12 +259,14 @@ function createAppBrowserNavigationController(deps = {}) {
|
|
|
259
259
|
}
|
|
260
260
|
if (visibleCommitMode === "synchronous") {
|
|
261
261
|
flushSync(() => {
|
|
262
|
-
|
|
262
|
+
const committedState = captureCandidateState(applyApprovedVisibleCommit(getBrowserRouterState(), commit));
|
|
263
|
+
setter(committedState);
|
|
263
264
|
});
|
|
264
265
|
return;
|
|
265
266
|
}
|
|
266
267
|
startTransition(() => {
|
|
267
|
-
|
|
268
|
+
const committedState = captureCandidateState(applyApprovedVisibleCommit(getBrowserRouterState(), commit));
|
|
269
|
+
setter(committedState);
|
|
268
270
|
});
|
|
269
271
|
}
|
|
270
272
|
function dispatchSynchronousVisibleCommit(commit) {
|
|
@@ -49,7 +49,7 @@ var ServerActionRedirectError = class extends Error {
|
|
|
49
49
|
const redirectUrl = new URL(target.href, window.location.href);
|
|
50
50
|
const redirectHref = redirectUrl.pathname + redirectUrl.search + redirectUrl.hash;
|
|
51
51
|
const redirectType = target.type === "push" ? "push" : "replace";
|
|
52
|
-
this.digest = `NEXT_REDIRECT;${redirectType};${
|
|
52
|
+
this.digest = `NEXT_REDIRECT;${redirectType};${redirectHref};${target.status};`;
|
|
53
53
|
}
|
|
54
54
|
};
|
|
55
55
|
async function invokeClientServerAction(id, args, actionInitiation, deps) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ArtifactCompatibilityEnvelope } from "./artifact-compatibility.js";
|
|
2
2
|
import { CacheEntryReuseProof, RenderObservation } from "./cache-proof.js";
|
|
3
3
|
import { ClientReuseManifestSkipDisposition } from "./client-reuse-manifest.js";
|
|
4
|
+
import { compareStrings } from "../utils/compare.js";
|
|
4
5
|
import { ReactNode } from "react";
|
|
5
6
|
|
|
6
7
|
//#region src/server/app-elements-wire.d.ts
|
|
@@ -42,7 +43,7 @@ type AppElementsInterception = Readonly<{
|
|
|
42
43
|
targetMatchedUrl: string;
|
|
43
44
|
targetRouteId: string;
|
|
44
45
|
}>;
|
|
45
|
-
declare const compareAppElementsSlotIds:
|
|
46
|
+
declare const compareAppElementsSlotIds: typeof compareStrings;
|
|
46
47
|
declare function normalizeAppElementsSlotBindings(slotBindings: readonly AppElementsSlotBinding[], options?: {
|
|
47
48
|
layoutIds?: readonly string[];
|
|
48
49
|
}): readonly AppElementsSlotBinding[];
|
|
@@ -5,6 +5,7 @@ import { AppPageParams } from "./app-page-boundary.js";
|
|
|
5
5
|
import { AppPageFontPreload } from "./app-page-execution.js";
|
|
6
6
|
import { AppPageMiddlewareContext } from "./app-page-response.js";
|
|
7
7
|
import { ApplyAppPageFileBasedMetadata } from "./app-page-head.js";
|
|
8
|
+
import { AppPageInterceptOptions } from "./app-page-element-builder.js";
|
|
8
9
|
import { AppPageSsrHandler } from "./app-page-stream.js";
|
|
9
10
|
import { AppPageBoundaryRoute } from "./app-page-boundary-render.js";
|
|
10
11
|
import { ReactNode } from "react";
|
|
@@ -32,6 +33,7 @@ type AppFallbackRendererOptions<TModule extends AppPageModule = AppPageModule> =
|
|
|
32
33
|
clearRequestContext: () => void;
|
|
33
34
|
createRscOnErrorHandler: (request: Request, pathname: string, routePath: string) => AppPageBoundaryOnError;
|
|
34
35
|
fontProviders: AppFallbackRendererFontProviders;
|
|
36
|
+
getAndClearPendingCookies?: () => string[];
|
|
35
37
|
getNavigationContext: () => NavigationContext | null;
|
|
36
38
|
globalErrorModule?: TModule | null; /** Whether experimental.globalNotFound is enabled for route-miss 404s. */
|
|
37
39
|
globalNotFoundEnabled?: boolean;
|
|
@@ -57,6 +59,13 @@ type AppFallbackRendererOptions<TModule extends AppPageModule = AppPageModule> =
|
|
|
57
59
|
metadataRoutes: MetadataFileRoute[]; /** Configured next.config `basePath`, threaded into file-based metadata href emission. */
|
|
58
60
|
basePath?: string; /** Configured next.config `trailingSlash`, threaded into canonical URL rendering. */
|
|
59
61
|
trailingSlash?: boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Serialized next.config `htmlLimitedBots` regexp source. Used to decide, per
|
|
64
|
+
* request user-agent, whether a `generateMetadata()` redirect thrown from a
|
|
65
|
+
* fallback boundary should stream (200) or block (307) — matching the
|
|
66
|
+
* matched-page dispatch path via `shouldServeStreamingMetadata`.
|
|
67
|
+
*/
|
|
68
|
+
htmlLimitedBots?: string;
|
|
60
69
|
resolveChildSegments: (routeSegments: readonly string[], treePosition: number, params: AppPageParams) => string[];
|
|
61
70
|
rootBoundaries: AppFallbackRendererRootBoundaries<TModule>;
|
|
62
71
|
rscRenderer: (element: ReactNode | AppElements, options: {
|
|
@@ -73,6 +82,7 @@ type AppFallbackRendererCallContext = {
|
|
|
73
82
|
* render path. Defaults to `false` when no route is matched.
|
|
74
83
|
*/
|
|
75
84
|
isEdgeRuntime?: boolean;
|
|
85
|
+
routePathname?: string;
|
|
76
86
|
sourcePageSegments?: readonly string[] | null;
|
|
77
87
|
};
|
|
78
88
|
type AppFallbackRenderer<TModule extends AppPageModule = AppPageModule> = {
|
|
@@ -80,6 +90,7 @@ type AppFallbackRenderer<TModule extends AppPageModule = AppPageModule> = {
|
|
|
80
90
|
renderHttpAccessFallback: (route: AppPageBoundaryRoute<TModule> | null, statusCode: number, isRscRequest: boolean, request: Request, opts: {
|
|
81
91
|
boundaryComponent?: AppPageComponent | null;
|
|
82
92
|
boundaryModule?: TModule | null;
|
|
93
|
+
intercept?: AppPageInterceptOptions<TModule> | null;
|
|
83
94
|
layouts?: readonly (TModule | null | undefined)[] | null;
|
|
84
95
|
matchedParams?: AppPageParams;
|
|
85
96
|
}, scriptNonce: string | undefined, middlewareContext: AppPageMiddlewareContext, callContext?: AppFallbackRendererCallContext) => Promise<Response | null>;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { renderAppPageErrorBoundary, renderAppPageHttpAccessFallback } from "./app-page-boundary-render.js";
|
|
2
1
|
import { DEFAULT_GLOBAL_ERROR_MODULE } from "./default-global-error-module.js";
|
|
2
|
+
import { shouldServeStreamingMetadata } from "./streaming-metadata.js";
|
|
3
|
+
import { renderAppPageErrorBoundary, renderAppPageHttpAccessFallback } from "./app-page-boundary-render.js";
|
|
3
4
|
import { DEFAULT_GLOBAL_NOT_FOUND_MODULE } from "./default-global-not-found-module.js";
|
|
4
5
|
import { DEFAULT_NOT_FOUND_MODULE } from "./default-not-found-module.js";
|
|
5
6
|
//#region src/server/app-fallback-renderer.ts
|
|
@@ -8,7 +9,7 @@ const EMPTY_MW_CTX = {
|
|
|
8
9
|
status: null
|
|
9
10
|
};
|
|
10
11
|
function createAppFallbackRenderer(options) {
|
|
11
|
-
const { applyFileBasedMetadata, basePath = "", clearRequestContext, createRscOnErrorHandler: buildRscOnErrorHandler, fontProviders, getNavigationContext, globalErrorModule, globalNotFoundEnabled = false, loadGlobalNotFoundModule, makeThenableParams, metadataRoutes, resolveChildSegments, rootBoundaries, rscRenderer, sanitizer, ssrLoader, trailingSlash } = options;
|
|
12
|
+
const { applyFileBasedMetadata, basePath = "", htmlLimitedBots, clearRequestContext, createRscOnErrorHandler: buildRscOnErrorHandler, fontProviders, getAndClearPendingCookies, getNavigationContext, globalErrorModule, globalNotFoundEnabled = false, loadGlobalNotFoundModule, makeThenableParams, metadataRoutes, resolveChildSegments, rootBoundaries, rscRenderer, sanitizer, ssrLoader, trailingSlash } = options;
|
|
12
13
|
const { rootForbiddenModule, rootLayouts, rootNotFoundModule, rootUnauthorizedModule } = rootBoundaries;
|
|
13
14
|
const effectiveGlobalErrorModule = globalErrorModule ?? DEFAULT_GLOBAL_ERROR_MODULE;
|
|
14
15
|
const effectiveRootNotFoundModule = rootNotFoundModule ?? DEFAULT_NOT_FOUND_MODULE;
|
|
@@ -20,12 +21,15 @@ function createAppFallbackRenderer(options) {
|
|
|
20
21
|
}
|
|
21
22
|
return {
|
|
22
23
|
async renderHttpAccessFallback(route, statusCode, isRscRequest, request, opts, scriptNonce, middlewareContext, callContext) {
|
|
24
|
+
const serveStreamingMetadata = shouldServeStreamingMetadata(request.headers.get("user-agent") ?? "", htmlLimitedBots);
|
|
23
25
|
const useGlobalNotFound = statusCode === 404 && globalNotFoundEnabled && !route && !opts?.boundaryComponent;
|
|
24
26
|
if (useGlobalNotFound && loadGlobalNotFoundModule) {
|
|
25
27
|
const globalNotFoundModule = await resolveGlobalNotFoundModule();
|
|
26
28
|
const globalNotFoundComponent = globalNotFoundModule?.default ?? null;
|
|
27
29
|
if (globalNotFoundComponent) return renderAppPageHttpAccessFallback({
|
|
28
30
|
applyFileBasedMetadata,
|
|
31
|
+
basePath,
|
|
32
|
+
trailingSlash,
|
|
29
33
|
boundaryComponent: globalNotFoundComponent,
|
|
30
34
|
boundaryModule: globalNotFoundModule ?? null,
|
|
31
35
|
buildFontLinkHeader: fontProviders.buildFontLinkHeader,
|
|
@@ -36,6 +40,7 @@ function createAppFallbackRenderer(options) {
|
|
|
36
40
|
getFontLinks: fontProviders.getFontLinks,
|
|
37
41
|
getFontPreloads: fontProviders.getFontPreloads,
|
|
38
42
|
getFontStyles: fontProviders.getFontStyles,
|
|
43
|
+
getAndClearPendingCookies,
|
|
39
44
|
getNavigationContext,
|
|
40
45
|
globalErrorModule: effectiveGlobalErrorModule,
|
|
41
46
|
isEdgeRuntime: callContext?.isEdgeRuntime,
|
|
@@ -46,6 +51,7 @@ function createAppFallbackRenderer(options) {
|
|
|
46
51
|
matchedParams: opts?.matchedParams ?? {},
|
|
47
52
|
middlewareContext: middlewareContext ?? EMPTY_MW_CTX,
|
|
48
53
|
metadataRoutes,
|
|
54
|
+
request,
|
|
49
55
|
requestUrl: request.url,
|
|
50
56
|
resolveChildSegments,
|
|
51
57
|
rootForbiddenModule: null,
|
|
@@ -55,6 +61,7 @@ function createAppFallbackRenderer(options) {
|
|
|
55
61
|
route: null,
|
|
56
62
|
renderToReadableStream: rscRenderer,
|
|
57
63
|
scriptNonce,
|
|
64
|
+
serveStreamingMetadata,
|
|
58
65
|
skipLayoutWrapping: true,
|
|
59
66
|
statusCode
|
|
60
67
|
});
|
|
@@ -74,8 +81,10 @@ function createAppFallbackRenderer(options) {
|
|
|
74
81
|
getFontLinks: fontProviders.getFontLinks,
|
|
75
82
|
getFontPreloads: fontProviders.getFontPreloads,
|
|
76
83
|
getFontStyles: fontProviders.getFontStyles,
|
|
84
|
+
getAndClearPendingCookies,
|
|
77
85
|
getNavigationContext,
|
|
78
86
|
globalErrorModule: effectiveGlobalErrorModule,
|
|
87
|
+
intercept: opts?.intercept ?? null,
|
|
79
88
|
isEdgeRuntime: callContext?.isEdgeRuntime,
|
|
80
89
|
isRscRequest,
|
|
81
90
|
layoutModules: useGlobalNotFound ? [] : opts?.layouts ?? null,
|
|
@@ -84,6 +93,7 @@ function createAppFallbackRenderer(options) {
|
|
|
84
93
|
matchedParams: opts?.matchedParams ?? route?.params ?? {},
|
|
85
94
|
middlewareContext: middlewareContext ?? EMPTY_MW_CTX,
|
|
86
95
|
metadataRoutes,
|
|
96
|
+
request,
|
|
87
97
|
requestUrl: request.url,
|
|
88
98
|
resolveChildSegments,
|
|
89
99
|
rootForbiddenModule,
|
|
@@ -91,8 +101,10 @@ function createAppFallbackRenderer(options) {
|
|
|
91
101
|
rootNotFoundModule: routeMissRootNotFoundModule,
|
|
92
102
|
rootUnauthorizedModule,
|
|
93
103
|
route: useGlobalNotFound ? null : route,
|
|
104
|
+
routePathname: callContext?.routePathname,
|
|
94
105
|
renderToReadableStream: rscRenderer,
|
|
95
106
|
scriptNonce,
|
|
107
|
+
serveStreamingMetadata,
|
|
96
108
|
skipLayoutWrapping: useGlobalNotFound,
|
|
97
109
|
sourcePageSegments: callContext?.sourcePageSegments,
|
|
98
110
|
statusCode
|
|
@@ -116,6 +128,7 @@ function createAppFallbackRenderer(options) {
|
|
|
116
128
|
getFontLinks: fontProviders.getFontLinks,
|
|
117
129
|
getFontPreloads: fontProviders.getFontPreloads,
|
|
118
130
|
getFontStyles: fontProviders.getFontStyles,
|
|
131
|
+
getAndClearPendingCookies,
|
|
119
132
|
getNavigationContext,
|
|
120
133
|
globalErrorModule: effectiveGlobalErrorModule,
|
|
121
134
|
isEdgeRuntime: callContext?.isEdgeRuntime,
|
|
@@ -125,6 +138,7 @@ function createAppFallbackRenderer(options) {
|
|
|
125
138
|
matchedParams: matchedParams ?? route?.params ?? {},
|
|
126
139
|
middlewareContext: middlewareContext ?? EMPTY_MW_CTX,
|
|
127
140
|
metadataRoutes,
|
|
141
|
+
request,
|
|
128
142
|
requestUrl: request.url,
|
|
129
143
|
resolveChildSegments,
|
|
130
144
|
rootLayouts,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { VINEXT_MW_CTX_HEADER } from "../utils/protocol-headers.js";
|
|
2
2
|
import { FLIGHT_HEADERS } from "./headers.js";
|
|
3
3
|
import { buildRequestHeadersFromMiddlewareResponse } from "../utils/middleware-request-headers.js";
|
|
4
|
-
import { isExternalUrl
|
|
4
|
+
import { isExternalUrl } from "../utils/external-url.js";
|
|
5
5
|
import { internalServerErrorResponse } from "./http-error-responses.js";
|
|
6
6
|
import { cloneRequestWithHeaders, processMiddlewareHeaders } from "./request-pipeline.js";
|
|
7
7
|
import { executeMiddleware } from "./middleware-runtime.js";
|
|
@@ -58,6 +58,7 @@ async function proxyExternalMiddlewareRewrite(request, rewriteUrl, context) {
|
|
|
58
58
|
const proxyRequest = requestWithMiddlewareRequestHeaders(request, context.requestHeaders ?? context.headers);
|
|
59
59
|
setHeadersContext(null);
|
|
60
60
|
setNavigationContext(null);
|
|
61
|
+
const { proxyExternalRequest } = await import("../config/config-matchers.js");
|
|
61
62
|
const proxyResponse = await proxyExternalRequest(proxyRequest, rewriteUrl);
|
|
62
63
|
const headers = new Headers(proxyResponse.headers);
|
|
63
64
|
processMiddlewareHeaders(headers);
|
|
@@ -5,6 +5,8 @@ import { AppPageParams } from "./app-page-boundary.js";
|
|
|
5
5
|
import { AppPageFontPreload } from "./app-page-execution.js";
|
|
6
6
|
import { AppPageMiddlewareContext } from "./app-page-response.js";
|
|
7
7
|
import { ApplyAppPageFileBasedMetadata } from "./app-page-head.js";
|
|
8
|
+
import { AppPageRouteWiringRoute } from "./app-page-route-wiring.js";
|
|
9
|
+
import { AppPageInterceptOptions } from "./app-page-element-builder.js";
|
|
8
10
|
import { AppPageSsrHandler } from "./app-page-stream.js";
|
|
9
11
|
import { ComponentType, ReactNode } from "react";
|
|
10
12
|
|
|
@@ -19,19 +21,27 @@ type AppPageBoundaryRoute<TModule extends AppPageModule = AppPageModule> = {
|
|
|
19
21
|
errorPaths?: readonly TModule[] | null;
|
|
20
22
|
errors?: readonly (TModule | null | undefined)[] | null;
|
|
21
23
|
forbidden?: TModule | null;
|
|
24
|
+
forbiddenTreePosition?: number | null;
|
|
25
|
+
forbiddens?: readonly (TModule | null | undefined)[] | null;
|
|
22
26
|
layoutTreePositions?: readonly number[] | null;
|
|
23
27
|
layouts?: readonly (TModule | null | undefined)[];
|
|
24
28
|
notFound?: TModule | null;
|
|
29
|
+
notFounds?: readonly (TModule | null | undefined)[] | null;
|
|
30
|
+
notFoundTreePosition?: number | null;
|
|
25
31
|
params?: AppPageParams;
|
|
26
32
|
pattern?: string;
|
|
27
33
|
routeSegments?: readonly string[];
|
|
34
|
+
slots?: AppPageRouteWiringRoute<TModule>["slots"];
|
|
28
35
|
unauthorized?: TModule | null;
|
|
36
|
+
unauthorizedTreePosition?: number | null;
|
|
37
|
+
unauthorizeds?: readonly (TModule | null | undefined)[] | null;
|
|
29
38
|
};
|
|
30
39
|
type AppPageBoundaryRenderCommonOptions<TModule extends AppPageModule = AppPageModule> = {
|
|
31
40
|
applyFileBasedMetadata?: ApplyAppPageFileBasedMetadata;
|
|
32
41
|
buildFontLinkHeader: (preloads: readonly AppPageFontPreload[] | null | undefined) => string;
|
|
33
42
|
clearRequestContext: () => void;
|
|
34
43
|
createRscOnErrorHandler: (pathname: string, routePath: string) => AppPageBoundaryOnError;
|
|
44
|
+
getAndClearPendingCookies?: () => string[];
|
|
35
45
|
getFontLinks: () => string[];
|
|
36
46
|
getFontPreloads: () => AppPageFontPreload[];
|
|
37
47
|
getFontStyles: () => string[];
|
|
@@ -42,12 +52,24 @@ type AppPageBoundaryRenderCommonOptions<TModule extends AppPageModule = AppPageM
|
|
|
42
52
|
loadSsrHandler: () => Promise<AppPageSsrHandler>;
|
|
43
53
|
makeThenableParams: (params: AppPageParams) => unknown;
|
|
44
54
|
middlewareContext: AppPageMiddlewareContext;
|
|
45
|
-
metadataRoutes: MetadataFileRoute[];
|
|
55
|
+
metadataRoutes: MetadataFileRoute[];
|
|
56
|
+
/**
|
|
57
|
+
* Whether metadata-origin redirects should ride as a 200 streaming response
|
|
58
|
+
* (HTML meta-refresh / RSC flight) rather than a blocking 307. Mirrors the
|
|
59
|
+
* matched-page dispatch decision `shouldServeStreamingMetadata(userAgent,
|
|
60
|
+
* htmlLimitedBots)`: html-limited bots get the blocking 307, so a
|
|
61
|
+
* `generateMetadata()` redirect thrown from a fallback boundary matches the
|
|
62
|
+
* matched-page path instead of always defaulting to streaming. Undefined
|
|
63
|
+
* means "not computed" and is treated as streaming, preserving prior behavior
|
|
64
|
+
* for callers that never hit metadata redirects.
|
|
65
|
+
*/
|
|
66
|
+
serveStreamingMetadata?: boolean; /** Configured next.config `basePath`, threaded into file-based metadata href emission. */
|
|
46
67
|
basePath?: string; /** Configured next.config `trailingSlash`, threaded into canonical URL rendering. */
|
|
47
68
|
trailingSlash?: boolean;
|
|
48
69
|
renderToReadableStream: (element: ReactNode | AppElements, options: {
|
|
49
70
|
onError: AppPageBoundaryOnError;
|
|
50
71
|
}) => ReadableStream<Uint8Array>;
|
|
72
|
+
request: Request;
|
|
51
73
|
requestUrl: string;
|
|
52
74
|
resolveChildSegments: (routeSegments: readonly string[], treePosition: number, params: AppPageParams) => string[];
|
|
53
75
|
rootLayouts: readonly (TModule | null | undefined)[];
|
|
@@ -57,11 +79,13 @@ type AppPageBoundaryRenderCommonOptions<TModule extends AppPageModule = AppPageM
|
|
|
57
79
|
type RenderAppPageHttpAccessFallbackOptions<TModule extends AppPageModule = AppPageModule> = {
|
|
58
80
|
boundaryComponent?: AppPageComponent | null;
|
|
59
81
|
boundaryModule?: TModule | null;
|
|
82
|
+
intercept?: AppPageInterceptOptions<TModule> | null;
|
|
60
83
|
layoutModules?: readonly (TModule | null | undefined)[] | null;
|
|
61
84
|
matchedParams: AppPageParams;
|
|
62
85
|
rootForbiddenModule?: TModule | null;
|
|
63
86
|
rootNotFoundModule?: TModule | null;
|
|
64
|
-
rootUnauthorizedModule?: TModule | null;
|
|
87
|
+
rootUnauthorizedModule?: TModule | null; /** Normalized, basePath-free application pathname used for route matching. */
|
|
88
|
+
routePathname?: string;
|
|
65
89
|
route?: AppPageBoundaryRoute<TModule> | null;
|
|
66
90
|
/**
|
|
67
91
|
* When true, the resolved boundary is rendered without wrapping it in the
|