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,5 @@
|
|
|
1
|
+
import { NextRouter } from "../shims/router.js";
|
|
2
|
+
|
|
1
3
|
//#region src/server/pages-get-initial-props.d.ts
|
|
2
4
|
type PagesGetInitialPropsContext = {
|
|
3
5
|
req?: unknown;
|
|
@@ -10,6 +12,16 @@ type PagesGetInitialPropsContext = {
|
|
|
10
12
|
locales?: string[];
|
|
11
13
|
defaultLocale?: string;
|
|
12
14
|
} & Record<string, unknown>;
|
|
15
|
+
type PagesGetInitialPropsRouter = Omit<Pick<NextRouter, "route" | "pathname" | "query" | "asPath">, "query"> & {
|
|
16
|
+
query: Record<string, unknown>;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Build the URL-state subset of Next.js's ServerRouter used by isolated
|
|
20
|
+
* initial-props helpers. Real request handlers pass their full `next/router`
|
|
21
|
+
* instance; this fallback keeps direct helper callers and tests aligned with
|
|
22
|
+
* the same required fields.
|
|
23
|
+
*/
|
|
24
|
+
declare function createPagesGetInitialPropsRouter(pathname: string, query: Record<string, unknown>, asPath: string): PagesGetInitialPropsRouter;
|
|
13
25
|
declare function hasPagesGetInitialProps(component: unknown): boolean;
|
|
14
26
|
declare function isResponseSent(res: unknown): boolean;
|
|
15
27
|
declare function loadPagesGetInitialProps(component: unknown, context: PagesGetInitialPropsContext): Promise<Record<string, unknown> | null>;
|
|
@@ -47,7 +59,8 @@ type DevAppInitialPropsContext = {
|
|
|
47
59
|
res: unknown;
|
|
48
60
|
pathname: string;
|
|
49
61
|
query: Record<string, unknown>;
|
|
50
|
-
asPath: string;
|
|
62
|
+
asPath: string; /** The request-scoped `next/router` server instance when available. */
|
|
63
|
+
router?: PagesGetInitialPropsRouter;
|
|
51
64
|
locale?: string;
|
|
52
65
|
locales?: string[];
|
|
53
66
|
defaultLocale?: string;
|
|
@@ -64,4 +77,4 @@ type DevAppInitialPropsContext = {
|
|
|
64
77
|
*/
|
|
65
78
|
declare function loadDevAppInitialProps(ctx: DevAppInitialPropsContext): Promise<DevAppInitialPropsResult>;
|
|
66
79
|
//#endregion
|
|
67
|
-
export { DevAppInitialPropsContext, DevAppInitialPropsResult, hasPagesGetInitialProps, isResponseSent, loadDevAppInitialProps, loadPagesGetInitialProps };
|
|
80
|
+
export { DevAppInitialPropsContext, DevAppInitialPropsResult, PagesGetInitialPropsRouter, createPagesGetInitialPropsRouter, hasPagesGetInitialProps, isResponseSent, loadDevAppInitialProps, loadPagesGetInitialProps };
|
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
//#region src/server/pages-get-initial-props.ts
|
|
2
|
+
/**
|
|
3
|
+
* Build the URL-state subset of Next.js's ServerRouter used by isolated
|
|
4
|
+
* initial-props helpers. Real request handlers pass their full `next/router`
|
|
5
|
+
* instance; this fallback keeps direct helper callers and tests aligned with
|
|
6
|
+
* the same required fields.
|
|
7
|
+
*/
|
|
8
|
+
function createPagesGetInitialPropsRouter(pathname, query, asPath) {
|
|
9
|
+
return {
|
|
10
|
+
route: pathname.replace(/\/$/, "") || "/",
|
|
11
|
+
pathname,
|
|
12
|
+
query,
|
|
13
|
+
asPath
|
|
14
|
+
};
|
|
15
|
+
}
|
|
2
16
|
function isObjectLike(value) {
|
|
3
17
|
return typeof value === "object" && value !== null || typeof value === "function";
|
|
4
18
|
}
|
|
@@ -61,11 +75,7 @@ async function loadDevAppInitialProps(ctx) {
|
|
|
61
75
|
const initialProps = await loadPagesGetInitialProps(ctx.appComponent, {
|
|
62
76
|
AppTree: ctx.appTree,
|
|
63
77
|
Component: ctx.component,
|
|
64
|
-
router:
|
|
65
|
-
pathname: ctx.pathname,
|
|
66
|
-
query: ctx.query,
|
|
67
|
-
asPath: ctx.asPath
|
|
68
|
-
},
|
|
78
|
+
router: ctx.router ?? createPagesGetInitialPropsRouter(ctx.pathname, ctx.query, ctx.asPath),
|
|
69
79
|
ctx: {
|
|
70
80
|
req: ctx.req,
|
|
71
81
|
res: ctx.res,
|
|
@@ -89,4 +99,4 @@ async function loadDevAppInitialProps(ctx) {
|
|
|
89
99
|
};
|
|
90
100
|
}
|
|
91
101
|
//#endregion
|
|
92
|
-
export { hasPagesGetInitialProps, isResponseSent, loadDevAppInitialProps, loadPagesGetInitialProps };
|
|
102
|
+
export { createPagesGetInitialPropsRouter, hasPagesGetInitialProps, isResponseSent, loadDevAppInitialProps, loadPagesGetInitialProps };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { PagesBodyParseError } from "./pages-media-type.js";
|
|
2
2
|
import { RevalidateOptions } from "./pages-revalidate.js";
|
|
3
|
+
import { PagesPreviewData } from "./pages-preview.js";
|
|
3
4
|
import { Readable, Writable } from "node:stream";
|
|
4
5
|
|
|
5
6
|
//#region src/server/pages-node-compat.d.ts
|
|
@@ -11,6 +12,9 @@ type PagesReqResRequest = Readable & {
|
|
|
11
12
|
query: PagesRequestQuery;
|
|
12
13
|
body: unknown;
|
|
13
14
|
cookies: Record<string, string>;
|
|
15
|
+
preview?: true;
|
|
16
|
+
draftMode?: true;
|
|
17
|
+
previewData: PagesPreviewData | false;
|
|
14
18
|
};
|
|
15
19
|
type PagesReqResHeaders = {
|
|
16
20
|
[key: string]: string | number | boolean | string[];
|
|
@@ -24,13 +28,19 @@ type PagesReqResResponse = Writable & {
|
|
|
24
28
|
status: (code: number) => PagesReqResResponse;
|
|
25
29
|
json: (data: unknown) => void;
|
|
26
30
|
send: (data: unknown) => void;
|
|
27
|
-
redirect: (statusOrUrl: number | string, url?: string) =>
|
|
31
|
+
redirect: (statusOrUrl: number | string, url?: string) => PagesReqResResponse;
|
|
28
32
|
getHeaders: () => PagesReqResHeaders;
|
|
29
33
|
revalidate: (urlPath: string, opts?: RevalidateOptions) => Promise<void>;
|
|
30
34
|
setPreviewData: (data: object | string, options?: {
|
|
31
35
|
maxAge?: number;
|
|
32
36
|
path?: string;
|
|
33
37
|
}) => PagesReqResResponse;
|
|
38
|
+
clearPreviewData: (options?: {
|
|
39
|
+
path?: string;
|
|
40
|
+
}) => PagesReqResResponse;
|
|
41
|
+
setDraftMode: (options?: {
|
|
42
|
+
enable?: boolean;
|
|
43
|
+
}) => PagesReqResResponse;
|
|
34
44
|
};
|
|
35
45
|
type PagesRequestCookiesCarrier = {
|
|
36
46
|
headers: {
|
|
@@ -49,7 +59,6 @@ type CreatePagesReqResResult = {
|
|
|
49
59
|
res: PagesReqResResponse;
|
|
50
60
|
responsePromise: Promise<Response>;
|
|
51
61
|
};
|
|
52
|
-
type PagesPreviewData = object | string;
|
|
53
62
|
/**
|
|
54
63
|
* Read and parse a Pages Router API request body for the Workers/prod path.
|
|
55
64
|
*
|
|
@@ -61,13 +70,11 @@ type PagesPreviewData = object | string;
|
|
|
61
70
|
* @see https://nextjs.org/docs/pages/building-your-application/routing/api-routes#custom-config
|
|
62
71
|
*/
|
|
63
72
|
declare function parsePagesApiBody(request: Request, maxBytes?: number): Promise<unknown>;
|
|
64
|
-
declare function getPagesPreviewDataFromCookieHeader(cookieHeader: string | string[] | null | undefined, options?: {
|
|
65
|
-
isOnDemandRevalidate?: boolean;
|
|
66
|
-
}): PagesPreviewData | false;
|
|
67
73
|
declare function getPagesPreviewData(request: Request, options?: {
|
|
68
74
|
isOnDemandRevalidate?: boolean;
|
|
69
75
|
}): PagesPreviewData | false;
|
|
70
76
|
declare function attachPagesRequestCookies(req: PagesRequestCookiesCarrier): void;
|
|
77
|
+
declare function attachPagesPreviewApi(req: PagesReqResRequest, res: PagesReqResResponse): void;
|
|
71
78
|
declare function createPagesReqRes(options: CreatePagesReqResOptions): CreatePagesReqResResult;
|
|
72
79
|
//#endregion
|
|
73
|
-
export { PagesBodyParseError as PagesApiBodyParseError,
|
|
80
|
+
export { PagesBodyParseError as PagesApiBodyParseError, PagesReqResRequest, PagesReqResResponse, PagesRequestQuery, attachPagesPreviewApi, attachPagesRequestCookies, createPagesReqRes, getPagesPreviewData, parsePagesApiBody };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { parseCookieHeader } from "../utils/parse-cookie.js";
|
|
2
|
-
import { getRevalidateSecret, isRevalidateSecret } from "./isr-cache.js";
|
|
3
2
|
import { readStreamAsTextWithLimit } from "../utils/text-stream.js";
|
|
4
3
|
import { DEFAULT_PAGES_API_BODY_SIZE_LIMIT } from "./pages-body-parser-config.js";
|
|
5
4
|
import { PagesBodyParseError, getMediaType, isJsonMediaType } from "./pages-media-type.js";
|
|
6
5
|
import { performOnDemandRevalidate } from "./pages-revalidate.js";
|
|
6
|
+
import { clearPagesPreviewData, getPagesPreviewState, setPagesDraftMode, setPagesPreviewData } from "./pages-preview.js";
|
|
7
7
|
import { decode } from "node:querystring";
|
|
8
8
|
import { Readable, Writable } from "node:stream";
|
|
9
9
|
//#region src/server/pages-node-compat.ts
|
|
@@ -65,44 +65,12 @@ function createRequestReadable(request) {
|
|
|
65
65
|
function parsePagesRequestCookies(cookieHeader) {
|
|
66
66
|
return parseCookieHeader(Array.isArray(cookieHeader) ? cookieHeader.join("; ") : cookieHeader);
|
|
67
67
|
}
|
|
68
|
-
function serializePreviewCookie(name, value, options = {}) {
|
|
69
|
-
const parts = [
|
|
70
|
-
`${name}=${encodeURIComponent(value)}`,
|
|
71
|
-
"HttpOnly",
|
|
72
|
-
`Path=${options.path ?? "/"}`,
|
|
73
|
-
process.env.NODE_ENV !== "development" ? "SameSite=None" : "SameSite=Lax"
|
|
74
|
-
];
|
|
75
|
-
if (process.env.NODE_ENV !== "development") parts.push("Secure");
|
|
76
|
-
if (options.maxAge !== void 0) parts.push(`Max-Age=${Math.trunc(options.maxAge)}`);
|
|
77
|
-
return parts.join("; ");
|
|
78
|
-
}
|
|
79
|
-
function decodePagesPreviewPayload(payload) {
|
|
80
|
-
try {
|
|
81
|
-
const decoded = Buffer.from(payload, "base64url").toString("utf8");
|
|
82
|
-
const value = JSON.parse(decoded);
|
|
83
|
-
return typeof value === "object" && value !== null ? value : String(value);
|
|
84
|
-
} catch {
|
|
85
|
-
return false;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
68
|
function getPagesPreviewDataFromCookieHeader(cookieHeader, options = {}) {
|
|
89
|
-
|
|
90
|
-
const cookies = parsePagesRequestCookies(cookieHeader);
|
|
91
|
-
const bypass = cookies.__prerender_bypass;
|
|
92
|
-
const payload = cookies.__next_preview_data;
|
|
93
|
-
if (!bypass && !payload) return false;
|
|
94
|
-
if (!isRevalidateSecret(bypass)) return false;
|
|
95
|
-
if (!payload) return {};
|
|
96
|
-
return decodePagesPreviewPayload(payload);
|
|
69
|
+
return getPagesPreviewState(cookieHeader, options).data;
|
|
97
70
|
}
|
|
98
71
|
function getPagesPreviewData(request, options = {}) {
|
|
99
72
|
return getPagesPreviewDataFromCookieHeader(request.headers.get("cookie"), options);
|
|
100
73
|
}
|
|
101
|
-
function normalizeSetCookieHeader(value) {
|
|
102
|
-
if (value === void 0) return [];
|
|
103
|
-
if (Array.isArray(value)) return value.map(String);
|
|
104
|
-
return [String(value)];
|
|
105
|
-
}
|
|
106
74
|
function attachPagesRequestCookies(req) {
|
|
107
75
|
if (Object.hasOwn(req, "cookies")) return;
|
|
108
76
|
Object.defineProperty(req, "cookies", {
|
|
@@ -128,6 +96,27 @@ function attachPagesRequestCookies(req) {
|
|
|
128
96
|
}
|
|
129
97
|
});
|
|
130
98
|
}
|
|
99
|
+
function attachPagesPreviewApi(req, res) {
|
|
100
|
+
const preview = getPagesPreviewState(req.headers.cookie);
|
|
101
|
+
req.previewData = preview.data;
|
|
102
|
+
if (preview.data !== false) {
|
|
103
|
+
req.preview = true;
|
|
104
|
+
req.draftMode = true;
|
|
105
|
+
}
|
|
106
|
+
res.setPreviewData = (data, options = {}) => {
|
|
107
|
+
setPagesPreviewData(res, data, options);
|
|
108
|
+
return res;
|
|
109
|
+
};
|
|
110
|
+
res.clearPreviewData = (options = {}) => {
|
|
111
|
+
clearPagesPreviewData(res, options);
|
|
112
|
+
return res;
|
|
113
|
+
};
|
|
114
|
+
res.setDraftMode = (options = { enable: true }) => {
|
|
115
|
+
setPagesDraftMode(res, options.enable !== false);
|
|
116
|
+
return res;
|
|
117
|
+
};
|
|
118
|
+
if (preview.shouldClear) clearPagesPreviewData(res);
|
|
119
|
+
}
|
|
131
120
|
var PagesResponseStream = class extends Writable {
|
|
132
121
|
resolveResponse;
|
|
133
122
|
rejectResponse;
|
|
@@ -197,9 +186,15 @@ var PagesResponseStream = class extends Writable {
|
|
|
197
186
|
this.end(String(data));
|
|
198
187
|
}
|
|
199
188
|
redirect(statusOrUrl, url) {
|
|
200
|
-
if (typeof statusOrUrl === "string")
|
|
201
|
-
|
|
189
|
+
if (typeof statusOrUrl === "string") {
|
|
190
|
+
url = statusOrUrl;
|
|
191
|
+
statusOrUrl = 307;
|
|
192
|
+
}
|
|
193
|
+
if (typeof statusOrUrl !== "number" || typeof url !== "string") throw new Error("Invalid redirect arguments. Please use a single argument URL, e.g. res.redirect('/destination') or use a status code and URL, e.g. res.redirect(307, '/destination').");
|
|
194
|
+
this.writeHead(statusOrUrl, { Location: url });
|
|
195
|
+
this.write(url);
|
|
202
196
|
this.end();
|
|
197
|
+
return this;
|
|
203
198
|
}
|
|
204
199
|
getHeaders() {
|
|
205
200
|
const headers = { ...this.resHeaders };
|
|
@@ -210,13 +205,15 @@ var PagesResponseStream = class extends Writable {
|
|
|
210
205
|
await performOnDemandRevalidate(this.requestHeaders, urlPath, opts);
|
|
211
206
|
}
|
|
212
207
|
setPreviewData(data, options = {}) {
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
208
|
+
setPagesPreviewData(this, data, options);
|
|
209
|
+
return this;
|
|
210
|
+
}
|
|
211
|
+
clearPreviewData(options = {}) {
|
|
212
|
+
clearPagesPreviewData(this, options);
|
|
213
|
+
return this;
|
|
214
|
+
}
|
|
215
|
+
setDraftMode(options = { enable: true }) {
|
|
216
|
+
setPagesDraftMode(this, options.enable !== false);
|
|
220
217
|
return this;
|
|
221
218
|
}
|
|
222
219
|
_write(chunk, encoding, callback) {
|
|
@@ -302,11 +299,13 @@ function createPagesReqRes(options) {
|
|
|
302
299
|
resolveResponse = resolve;
|
|
303
300
|
rejectResponse = reject;
|
|
304
301
|
});
|
|
302
|
+
const res = new PagesResponseStream(resolveResponse, rejectResponse, options.request.headers);
|
|
303
|
+
attachPagesPreviewApi(req, res);
|
|
305
304
|
return {
|
|
306
305
|
req,
|
|
307
|
-
res
|
|
306
|
+
res,
|
|
308
307
|
responsePromise
|
|
309
308
|
};
|
|
310
309
|
}
|
|
311
310
|
//#endregion
|
|
312
|
-
export { PagesBodyParseError as PagesApiBodyParseError, attachPagesRequestCookies, createPagesReqRes, getPagesPreviewData,
|
|
311
|
+
export { PagesBodyParseError as PagesApiBodyParseError, attachPagesPreviewApi, attachPagesRequestCookies, createPagesReqRes, getPagesPreviewData, parsePagesApiBody };
|
|
@@ -2,7 +2,8 @@ import { Route } from "../routing/pages-router.js";
|
|
|
2
2
|
import { VinextNextData } from "../client/vinext-next-data.js";
|
|
3
3
|
import { CachedPagesValue } from "../shims/cache-handler.js";
|
|
4
4
|
import { ISRCacheEntry } from "./isr-cache.js";
|
|
5
|
-
import { PagesPreviewData } from "./pages-
|
|
5
|
+
import { PagesPreviewData } from "./pages-preview.js";
|
|
6
|
+
import { PagesGetInitialPropsRouter } from "./pages-get-initial-props.js";
|
|
6
7
|
import { PagesGsspResponse, PagesI18nRenderContext, PagesNextDataExtras } from "./pages-page-response.js";
|
|
7
8
|
import { ReactNode } from "react";
|
|
8
9
|
|
|
@@ -161,7 +162,8 @@ type ResolvePagesPageDataOptions = {
|
|
|
161
162
|
deploymentId?: string;
|
|
162
163
|
htmlLimitedBots?: string;
|
|
163
164
|
pageModule: PagesPageModule;
|
|
164
|
-
AppComponent?: unknown;
|
|
165
|
+
AppComponent?: unknown; /** The request-scoped `next/router` server instance when available. */
|
|
166
|
+
router?: PagesGetInitialPropsRouter;
|
|
165
167
|
params: Record<string, unknown>;
|
|
166
168
|
query: Record<string, unknown>;
|
|
167
169
|
asPath?: string;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { normalizePathnameForRouteMatch } from "../routing/utils.js";
|
|
1
2
|
import { NEXTJS_DEPLOYMENT_ID_HEADER } from "./headers.js";
|
|
3
|
+
import { isDangerousScheme } from "../shims/url-safety.js";
|
|
2
4
|
import { buildCacheStateHeaders } from "./cache-headers.js";
|
|
3
5
|
import { isUnknownRecord } from "../utils/record.js";
|
|
4
6
|
import { applyCdnResponseHeaders } from "./cache-control.js";
|
|
@@ -6,7 +8,7 @@ import { decideIsr } from "./isr-decision.js";
|
|
|
6
8
|
import { buildPagesCacheValue } from "./isr-cache.js";
|
|
7
9
|
import { normalizeStaticPathname } from "../routing/route-pattern.js";
|
|
8
10
|
import { buildPagesNextDataScript, etagMatches, generatePagesETag, isPagesStreamingBot, requestsNoCache } from "./pages-page-response.js";
|
|
9
|
-
import { hasPagesGetInitialProps, isResponseSent, loadPagesGetInitialProps } from "./pages-get-initial-props.js";
|
|
11
|
+
import { createPagesGetInitialPropsRouter, hasPagesGetInitialProps, isResponseSent, loadPagesGetInitialProps } from "./pages-get-initial-props.js";
|
|
10
12
|
import { buildNextDataPropsJsonResponse } from "./pages-data-route.js";
|
|
11
13
|
import { isSerializableProps } from "./pages-serializable-props.js";
|
|
12
14
|
import { isBotUserAgent } from "../utils/html-limited-bots.js";
|
|
@@ -57,11 +59,7 @@ async function loadPagesAppInitialRenderProps(options, getSharedReqRes) {
|
|
|
57
59
|
const initialProps = await loadPagesGetInitialProps(options.AppComponent, {
|
|
58
60
|
AppTree: options.createAppTree ?? options.createPageElement,
|
|
59
61
|
Component: options.pageModule.default,
|
|
60
|
-
router:
|
|
61
|
-
pathname: options.routePattern,
|
|
62
|
-
query: options.query,
|
|
63
|
-
asPath: options.asPath ?? options.routeUrl
|
|
64
|
-
},
|
|
62
|
+
router: options.router ?? createPagesGetInitialPropsRouter(options.routePattern, options.query, options.asPath ?? options.routeUrl),
|
|
65
63
|
ctx: {
|
|
66
64
|
req,
|
|
67
65
|
res,
|
|
@@ -111,6 +109,17 @@ async function loadPagesAppInitialRenderProps(options, getSharedReqRes) {
|
|
|
111
109
|
*/
|
|
112
110
|
function buildPagesRedirectResponse(redirect, options, props = { pageProps: {} }) {
|
|
113
111
|
const destination = options.sanitizeDestination(redirect.destination);
|
|
112
|
+
if (isDangerousScheme(destination)) {
|
|
113
|
+
const headers = new Headers({
|
|
114
|
+
"Cache-Control": "private, no-cache, no-store, max-age=0, must-revalidate",
|
|
115
|
+
"Content-Type": "text/plain; charset=utf-8"
|
|
116
|
+
});
|
|
117
|
+
if (options.deploymentId) headers.set(NEXTJS_DEPLOYMENT_ID_HEADER, options.deploymentId);
|
|
118
|
+
return new Response("Invalid redirect destination", {
|
|
119
|
+
status: 500,
|
|
120
|
+
headers
|
|
121
|
+
});
|
|
122
|
+
}
|
|
114
123
|
if (options.isDataReq) {
|
|
115
124
|
const init = { headers: {} };
|
|
116
125
|
if (options.deploymentId) init.headers[NEXTJS_DEPLOYMENT_ID_HEADER] = options.deploymentId;
|
|
@@ -152,7 +161,7 @@ function getPagesRouteParams(routePattern) {
|
|
|
152
161
|
}).filter((param) => param !== null);
|
|
153
162
|
}
|
|
154
163
|
function matchesPagesStaticPath(pathEntry, params, routeParams, routeUrl) {
|
|
155
|
-
if (typeof pathEntry === "string") return normalizeStaticPathname(pathEntry) === normalizeStaticPathname(routeUrl);
|
|
164
|
+
if (typeof pathEntry === "string") return normalizePathnameForRouteMatch(normalizeStaticPathname(pathEntry)) === normalizePathnameForRouteMatch(normalizeStaticPathname(routeUrl));
|
|
156
165
|
const entryParams = pathEntry.params;
|
|
157
166
|
if (entryParams === void 0 || entryParams === null) return false;
|
|
158
167
|
return routeParams.every(({ key, repeat, optional }) => {
|
|
@@ -248,6 +257,7 @@ async function resolvePagesPageData(options) {
|
|
|
248
257
|
const userFacingParams = options.route.isDynamic ? options.params : null;
|
|
249
258
|
let isFallback = false;
|
|
250
259
|
let shouldPersistFallbackData = false;
|
|
260
|
+
const previewData = options.isOnDemandRevalidate ? false : options.previewData ?? false;
|
|
251
261
|
if (typeof options.pageModule.getStaticPaths === "function" && options.route.isDynamic) {
|
|
252
262
|
const pathsResult = await options.pageModule.getStaticPaths({
|
|
253
263
|
locales: options.i18n.locales ?? [],
|
|
@@ -257,14 +267,13 @@ async function resolvePagesPageData(options) {
|
|
|
257
267
|
const paths = pathsResult?.paths ?? [];
|
|
258
268
|
const routeParams = getPagesRouteParams(options.routePattern);
|
|
259
269
|
const isValidPath = paths.some((pathEntry) => matchesPagesStaticPath(pathEntry, options.params, routeParams, options.routeUrl));
|
|
260
|
-
if (fallback === false && !isValidPath) return buildPagesNotFoundResult(options);
|
|
270
|
+
if (fallback === false && !isValidPath && previewData === false) return buildPagesNotFoundResult(options);
|
|
261
271
|
const isBotRequest = !!options.userAgent && isBotUserAgent(options.userAgent, options.htmlLimitedBots);
|
|
262
|
-
if (fallback === true && !isValidPath && !options.isDataReq && !isBotRequest) isFallback = true;
|
|
272
|
+
if (fallback === true && !isValidPath && !options.isDataReq && !isBotRequest && previewData === false) isFallback = true;
|
|
263
273
|
shouldPersistFallbackData = fallback === true && !isValidPath && options.isDataReq === true;
|
|
264
274
|
}
|
|
265
275
|
let pageProps = {};
|
|
266
276
|
let gsspRes = null;
|
|
267
|
-
const previewData = options.isOnDemandRevalidate ? false : options.previewData ?? false;
|
|
268
277
|
const previewContext = previewData === false ? {} : {
|
|
269
278
|
draftMode: true,
|
|
270
279
|
preview: true,
|
|
@@ -276,6 +285,7 @@ async function resolvePagesPageData(options) {
|
|
|
276
285
|
return sharedReqRes;
|
|
277
286
|
}
|
|
278
287
|
let renderProps = { pageProps };
|
|
288
|
+
if (previewData !== false) renderProps.__N_PREVIEW = true;
|
|
279
289
|
async function loadForegroundAppInitialRenderProps() {
|
|
280
290
|
const result = await loadPagesAppInitialRenderProps(options, getSharedReqRes);
|
|
281
291
|
if (result.kind === "response") return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { RenderPageEnhancers } from "./pages-document-initial-props.js";
|
|
2
|
+
import { PagesGetInitialPropsRouter } from "./pages-get-initial-props.js";
|
|
2
3
|
import { PagesPageModule } from "./pages-page-data.js";
|
|
3
4
|
import { ComponentType, ReactNode } from "react";
|
|
4
5
|
|
|
@@ -23,7 +24,7 @@ type I18nConfig = {
|
|
|
23
24
|
domain: string;
|
|
24
25
|
defaultLocale: string;
|
|
25
26
|
locales?: string[];
|
|
26
|
-
http?:
|
|
27
|
+
http?: true;
|
|
27
28
|
}>;
|
|
28
29
|
} | null;
|
|
29
30
|
type VinextConfigSubset = {
|
|
@@ -60,7 +61,8 @@ type CreatePagesPageHandlerOptions = {
|
|
|
60
61
|
*/
|
|
61
62
|
getPagesNavigationIsReadyFromSerializedState: ((routePattern: string | undefined, searchString: string, nextData?: Record<string, unknown>) => boolean) | null; /** `setI18nContext` from `vinext/i18n-context`. */
|
|
62
63
|
setI18nContext: ((ctx: Record<string, unknown>) => void) | null; /** `wrapWithRouterContext` from `next/router`. */
|
|
63
|
-
wrapWithRouterContext: ((element: ReactNode) => ReactNode) | null; /**
|
|
64
|
+
wrapWithRouterContext: ((element: ReactNode) => ReactNode) | null; /** Request-scoped `next/router` server instance. */
|
|
65
|
+
router?: PagesGetInitialPropsRouter; /** `resetSSRHead` from `next/head`. */
|
|
64
66
|
resetSSRHead: (() => void) | undefined; /** `getSSRHeadHTML` from `next/head`. */
|
|
65
67
|
getSSRHeadHTML: (() => string) | undefined; /** `setDocumentInitialHead` from `next/head`. */
|
|
66
68
|
setDocumentInitialHead: ((head: ReactNode[]) => void) | undefined; /** `flushPreloads` from `next/dynamic`. */
|
|
@@ -10,7 +10,7 @@ import { ensureFetchPatch } from "../shims/fetch-cache.js";
|
|
|
10
10
|
import { appendAssetDeploymentIdQuery } from "../utils/deployment-id.js";
|
|
11
11
|
import { mergeRouteParamsIntoQuery, parseQueryString } from "../utils/query.js";
|
|
12
12
|
import { getScriptNonceFromHeaderSources } from "./csp.js";
|
|
13
|
-
import { resolvePagesI18nRequest } from "./pages-i18n.js";
|
|
13
|
+
import { extractLocaleFromUrl, resolvePagesI18nRequest } from "./pages-i18n.js";
|
|
14
14
|
import { buildDefaultPagesNotFoundResponse } from "./pages-default-404.js";
|
|
15
15
|
import { buildPagesReadinessNextData } from "./pages-readiness.js";
|
|
16
16
|
import { resolvePagesPageMethodResponse } from "./pages-page-method.js";
|
|
@@ -19,8 +19,20 @@ import { hasPagesGetInitialProps } from "./pages-get-initial-props.js";
|
|
|
19
19
|
import { buildNextDataNotFoundResponse, buildNextDataPropsJsonResponse, normalizePagesDataRequest, parseNextDataPathname } from "./pages-data-route.js";
|
|
20
20
|
import { resolvePagesPageData } from "./pages-page-data.js";
|
|
21
21
|
import { collectAssetTags, resolveClientModuleUrl } from "./pages-asset-tags.js";
|
|
22
|
-
import {
|
|
22
|
+
import { PAGES_PREVIEW_CACHE_CONTROL, appendPagesPreviewClearCookies, getPagesPreviewState } from "./pages-preview.js";
|
|
23
|
+
import { createPagesReqRes } from "./pages-node-compat.js";
|
|
23
24
|
//#region src/server/pages-page-handler.ts
|
|
25
|
+
function finalizePagesPreviewResponse(response, preview) {
|
|
26
|
+
if (preview.data === false && !preview.shouldClear) return response;
|
|
27
|
+
const headers = new Headers(response.headers);
|
|
28
|
+
if (preview.data !== false) headers.set("Cache-Control", PAGES_PREVIEW_CACHE_CONTROL);
|
|
29
|
+
if (preview.shouldClear) appendPagesPreviewClearCookies(headers);
|
|
30
|
+
return new Response(response.body, {
|
|
31
|
+
headers,
|
|
32
|
+
status: response.status,
|
|
33
|
+
statusText: response.statusText
|
|
34
|
+
});
|
|
35
|
+
}
|
|
24
36
|
function shouldEmitPagesClientTraceMetadata(pageModule, appComponent) {
|
|
25
37
|
if (typeof pageModule.getServerSideProps === "function") return true;
|
|
26
38
|
if (typeof pageModule.getStaticProps === "function") return false;
|
|
@@ -41,7 +53,7 @@ function buildI18nRenderContext(i18nConfig, locale, currentDefaultLocale, domain
|
|
|
41
53
|
* accepts the same options shape the generated entry always passed inline.
|
|
42
54
|
*/
|
|
43
55
|
function createPagesPageHandler(opts) {
|
|
44
|
-
const { pageRoutes, errorPageRoute, matchRoute, i18nConfig, vinextConfig, buildId, hasMiddleware, appAssetPath, hasRewrites, setSSRContext, getPagesNavigationIsReadyFromSerializedState, setI18nContext, wrapWithRouterContext, resetSSRHead, getSSRHeadHTML, setDocumentInitialHead, flushPreloads, getFontLinks, getFontStyles, getFontPreloads, renderToReadableStream, renderIsrPassToStringAsync, safeJsonStringify, sanitizeDestination, createPageElement, enhancePageElement, AppComponent, DocumentComponent } = opts;
|
|
56
|
+
const { pageRoutes, errorPageRoute, matchRoute, i18nConfig, vinextConfig, buildId, hasMiddleware, appAssetPath, hasRewrites, setSSRContext, getPagesNavigationIsReadyFromSerializedState, setI18nContext, wrapWithRouterContext, router, resetSSRHead, getSSRHeadHTML, setDocumentInitialHead, flushPreloads, getFontLinks, getFontStyles, getFontPreloads, renderToReadableStream, renderIsrPassToStringAsync, safeJsonStringify, sanitizeDestination, createPageElement, enhancePageElement, AppComponent, DocumentComponent } = opts;
|
|
45
57
|
function renderToStringAsync(element) {
|
|
46
58
|
return renderToReadableStream(element).then((stream) => new Response(stream).text());
|
|
47
59
|
}
|
|
@@ -126,25 +138,38 @@ function createPagesPageHandler(opts) {
|
|
|
126
138
|
} else return buildDefaultPagesNotFoundResponse();
|
|
127
139
|
}
|
|
128
140
|
const { route, params } = match;
|
|
141
|
+
const pageModule = route.module;
|
|
142
|
+
const isStaticPropsRoute = typeof pageModule.getStaticProps === "function";
|
|
143
|
+
const isStaticPropsRender = isStaticPropsRoute && typeof pageModule.getServerSideProps !== "function";
|
|
144
|
+
const renderRouteUrl = isStaticPropsRender ? routeUrl.split("?")[0] : routeUrl;
|
|
145
|
+
const routerAsPathSource = isStaticPropsRender ? renderRouteUrl : renderAsPath ?? renderRouteUrl;
|
|
146
|
+
const routerAsPath = i18nConfig ? extractLocaleFromUrl(routerAsPathSource, i18nConfig, locale).url : routerAsPathSource;
|
|
129
147
|
return runWithRequestContext(createRequestContext({ executionContext: getRequestExecutionContext() }), async () => {
|
|
130
148
|
ensureFetchPatch();
|
|
131
149
|
try {
|
|
132
150
|
const routePattern = patternToNextFormat(route.pattern);
|
|
133
151
|
const renderStatusCode = renderStatusCodeOverride ?? (routePattern === "/404" ? 404 : void 0);
|
|
134
|
-
const query = mergeRouteParamsIntoQuery(parseQueryString(
|
|
135
|
-
const
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
152
|
+
const query = mergeRouteParamsIntoQuery(parseQueryString(renderRouteUrl), params);
|
|
153
|
+
const isOnDemandRevalidate = isOnDemandRevalidateRequest(request.headers.get(PRERENDER_REVALIDATE_HEADER));
|
|
154
|
+
const preview = isStaticPropsRoute || typeof pageModule.getServerSideProps === "function" ? getPagesPreviewState(request.headers.get("cookie"), { isOnDemandRevalidate }) : {
|
|
155
|
+
data: false,
|
|
156
|
+
shouldClear: false
|
|
157
|
+
};
|
|
158
|
+
const previewData = preview.data;
|
|
159
|
+
const pagesNextData = {
|
|
160
|
+
...buildPagesReadinessNextData({
|
|
161
|
+
pageModule,
|
|
162
|
+
appComponent: AppComponent,
|
|
163
|
+
hasRewrites
|
|
164
|
+
}),
|
|
165
|
+
...previewData === false ? {} : { isPreview: true }
|
|
166
|
+
};
|
|
167
|
+
const navigationIsReady = isStaticPropsRender ? false : typeof getPagesNavigationIsReadyFromSerializedState === "function" ? getPagesNavigationIsReadyFromSerializedState(routePattern, originalRequestUrl.search, pagesNextData) : true;
|
|
143
168
|
function applySSRContext(extra) {
|
|
144
169
|
if (typeof setSSRContext === "function") setSSRContext({
|
|
145
170
|
pathname: routePattern,
|
|
146
171
|
query,
|
|
147
|
-
asPath:
|
|
172
|
+
asPath: routerAsPath,
|
|
148
173
|
navigationIsReady,
|
|
149
174
|
locale,
|
|
150
175
|
locales: i18nConfig ? i18nConfig.locales : void 0,
|
|
@@ -160,7 +185,10 @@ function createPagesPageHandler(opts) {
|
|
|
160
185
|
hostname: new URL(request.url).hostname
|
|
161
186
|
});
|
|
162
187
|
}
|
|
163
|
-
applySSRContext({
|
|
188
|
+
applySSRContext({
|
|
189
|
+
isPreview: previewData !== false,
|
|
190
|
+
nextData: pagesNextData
|
|
191
|
+
});
|
|
164
192
|
const PageComponent = pageModule.default;
|
|
165
193
|
if (!PageComponent) return new Response("Page has no default export", { status: 500 });
|
|
166
194
|
if (!isDataReq && routePattern !== "/_error" && routePattern !== "/404" && routePattern !== "/500" && renderStatusCodeOverride === void 0) {
|
|
@@ -179,7 +207,7 @@ function createPagesPageHandler(opts) {
|
|
|
179
207
|
pageModuleUrl,
|
|
180
208
|
appModuleUrl,
|
|
181
209
|
hasMiddleware,
|
|
182
|
-
routeUrl
|
|
210
|
+
routeUrl: renderRouteUrl
|
|
183
211
|
}
|
|
184
212
|
};
|
|
185
213
|
const scriptNonce = getScriptNonceFromHeaderSources(request.headers, middlewareHeaders);
|
|
@@ -190,13 +218,16 @@ function createPagesPageHandler(opts) {
|
|
|
190
218
|
if (allFontPreloads.length > 0) fontLinkHeader = allFontPreloads.map((p) => "<" + appendAssetDeploymentIdQuery(p.href) + ">; rel=preload; as=font; type=" + p.type + "; crossorigin").join(", ");
|
|
191
219
|
} catch {}
|
|
192
220
|
const pagesResolvedUrl = (new URL(routeUrl, originalRequestUrl).pathname || "/") + originalRequestUrl.search;
|
|
193
|
-
const createPageReqRes = () =>
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
221
|
+
const createPageReqRes = () => {
|
|
222
|
+
const reqRes = createPagesReqRes({
|
|
223
|
+
body: void 0,
|
|
224
|
+
query,
|
|
225
|
+
request,
|
|
226
|
+
url: originalRequestPathAndSearch
|
|
227
|
+
});
|
|
228
|
+
if (typeof renderStatusCode === "number") reqRes.res.statusCode = renderStatusCode;
|
|
229
|
+
return reqRes;
|
|
230
|
+
};
|
|
200
231
|
const pageDataResult = await resolvePagesPageData({
|
|
201
232
|
isDataReq,
|
|
202
233
|
err: err instanceof Error ? err : void 0,
|
|
@@ -222,17 +253,18 @@ function createPagesPageHandler(opts) {
|
|
|
222
253
|
isBuildTimePrerendering: typeof process !== "undefined" && process.env && process.env.VINEXT_PRERENDER === "1",
|
|
223
254
|
validatePropsSerialization: process.env.NODE_ENV !== "production" || process.env.VINEXT_PRERENDER === "1",
|
|
224
255
|
isOnDemandRevalidate,
|
|
225
|
-
previewData
|
|
256
|
+
previewData,
|
|
226
257
|
pageModule,
|
|
227
258
|
AppComponent,
|
|
259
|
+
router,
|
|
228
260
|
params,
|
|
229
261
|
query,
|
|
230
|
-
asPath:
|
|
262
|
+
asPath: routerAsPath,
|
|
231
263
|
resolvedUrl: pagesResolvedUrl,
|
|
232
264
|
renderIsrPassToStringAsync,
|
|
233
265
|
route: { isDynamic: route.isDynamic },
|
|
234
266
|
routePattern,
|
|
235
|
-
routeUrl,
|
|
267
|
+
routeUrl: renderRouteUrl,
|
|
236
268
|
runInFreshUnifiedContext(callback) {
|
|
237
269
|
return runWithRequestContext(createRequestContext({ executionContext: null }), async () => {
|
|
238
270
|
ensureFetchPatch();
|
|
@@ -252,18 +284,22 @@ function createPagesPageHandler(opts) {
|
|
|
252
284
|
});
|
|
253
285
|
if (pageDataResult.kind === "notFound") {
|
|
254
286
|
const notFoundRoute = findNotFoundRoute();
|
|
255
|
-
if (notFoundRoute && routePattern !== "/404" && routePattern !== "/_error") return renderPage(request, url, manifest, middlewareHeaders, {
|
|
287
|
+
if (notFoundRoute && routePattern !== "/404" && routePattern !== "/_error") return finalizePagesPreviewResponse(await renderPage(request, url, manifest, middlewareHeaders, {
|
|
256
288
|
statusCode: 404,
|
|
257
|
-
asPath:
|
|
289
|
+
asPath: routerAsPath,
|
|
258
290
|
renderErrorPageOnMiss: false,
|
|
259
291
|
__forcedRoute: notFoundRoute
|
|
260
|
-
});
|
|
261
|
-
return buildDefaultPagesNotFoundResponse();
|
|
292
|
+
}), preview);
|
|
293
|
+
return finalizePagesPreviewResponse(buildDefaultPagesNotFoundResponse(), preview);
|
|
262
294
|
}
|
|
263
|
-
if (pageDataResult.kind === "response") return pageDataResult.response;
|
|
295
|
+
if (pageDataResult.kind === "response") return finalizePagesPreviewResponse(pageDataResult.response, preview);
|
|
264
296
|
let pageProps = pageDataResult.pageProps;
|
|
265
297
|
let renderProps = pageDataResult.props;
|
|
266
|
-
if (
|
|
298
|
+
if (previewData !== false) renderProps = {
|
|
299
|
+
...renderProps,
|
|
300
|
+
__N_PREVIEW: true
|
|
301
|
+
};
|
|
302
|
+
if (routePattern === "/_error" && typeof renderStatusCode === "number" && renderProps.pageProps !== void 0) {
|
|
267
303
|
pageProps = {
|
|
268
304
|
...pageProps,
|
|
269
305
|
statusCode: renderStatusCode
|
|
@@ -277,15 +313,10 @@ function createPagesPageHandler(opts) {
|
|
|
277
313
|
const documentReqRes = serializedPagesNextData.autoExport === true ? null : pageDataResult.documentReqRes ?? createPageReqRes();
|
|
278
314
|
const isrRevalidateSeconds = pageDataResult.isrRevalidateSeconds;
|
|
279
315
|
const isFallbackRender = pageDataResult.isFallback === true;
|
|
280
|
-
if (isFallbackRender
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
asPath: renderAsPath ?? routeUrl,
|
|
316
|
+
if (isFallbackRender) applySSRContext({
|
|
317
|
+
query: {},
|
|
318
|
+
asPath: routePattern,
|
|
284
319
|
navigationIsReady: false,
|
|
285
|
-
locale,
|
|
286
|
-
locales: i18nConfig ? i18nConfig.locales : void 0,
|
|
287
|
-
defaultLocale: currentDefaultLocale,
|
|
288
|
-
domainLocales,
|
|
289
320
|
isFallback: true
|
|
290
321
|
});
|
|
291
322
|
if (isDataReq) {
|
|
@@ -316,12 +347,12 @@ function createPagesPageHandler(opts) {
|
|
|
316
347
|
const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
|
|
317
348
|
if (deploymentId) init.headers[NEXTJS_DEPLOYMENT_ID_HEADER] = deploymentId;
|
|
318
349
|
}
|
|
319
|
-
return buildNextDataPropsJsonResponse(renderProps, safeJsonStringify, init);
|
|
350
|
+
return finalizePagesPreviewResponse(buildNextDataPropsJsonResponse(renderProps, safeJsonStringify, init), preview);
|
|
320
351
|
}
|
|
321
352
|
const pageModuleIds = [];
|
|
322
353
|
if (appAssetPath) pageModuleIds.push(appAssetPath);
|
|
323
354
|
if (route.filePath) pageModuleIds.push(route.filePath);
|
|
324
|
-
return await renderPagesPageResponse({
|
|
355
|
+
return finalizePagesPreviewResponse(await renderPagesPageResponse({
|
|
325
356
|
assetTags: collectAssetTags({
|
|
326
357
|
manifest,
|
|
327
358
|
moduleIds: pageModuleIds,
|
|
@@ -372,7 +403,7 @@ function createPagesPageHandler(opts) {
|
|
|
372
403
|
resetSSRHead: typeof resetSSRHead === "function" ? resetSSRHead : void 0,
|
|
373
404
|
setDocumentInitialHead: typeof setDocumentInitialHead === "function" ? setDocumentInitialHead : void 0,
|
|
374
405
|
routePattern,
|
|
375
|
-
routeUrl,
|
|
406
|
+
routeUrl: renderRouteUrl,
|
|
376
407
|
safeJsonStringify,
|
|
377
408
|
scriptNonce,
|
|
378
409
|
statusCode: renderStatusCode,
|
|
@@ -380,7 +411,7 @@ function createPagesPageHandler(opts) {
|
|
|
380
411
|
userAgent: request.headers.get("user-agent") ?? void 0,
|
|
381
412
|
ifNoneMatch: request.headers.get("if-none-match") ?? void 0,
|
|
382
413
|
requestCacheControl: request.headers.get("cache-control") ?? void 0
|
|
383
|
-
});
|
|
414
|
+
}), preview);
|
|
384
415
|
} catch (e) {
|
|
385
416
|
console.error("[vinext] SSR error:", e);
|
|
386
417
|
reportRequestError(e instanceof Error ? e : new Error(String(e)), {
|