vinext 1.0.0-beta.2 → 1.0.0-beta.4
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 +6 -9
- package/dist/build/client-build-config.js +7 -1
- package/dist/build/precompress.js +1 -1
- package/dist/build/prerender.d.ts +2 -1
- package/dist/build/prerender.js +12 -2
- package/dist/check.js +4 -0
- package/dist/cli-args.d.ts +2 -1
- package/dist/cli-args.js +10 -0
- package/dist/cli.js +14 -8
- package/dist/client/navigation-runtime.d.ts +6 -0
- package/dist/client/navigation-runtime.js +1 -1
- package/dist/config/config-matchers.js +4 -1
- package/dist/config/dotenv.d.ts +3 -4
- package/dist/config/dotenv.js +30 -22
- package/dist/config/next-config.d.ts +16 -5
- package/dist/config/next-config.js +7 -0
- package/dist/entries/app-browser-entry.d.ts +4 -10
- package/dist/entries/app-browser-entry.js +20 -4
- package/dist/entries/app-rsc-entry.js +21 -3
- package/dist/entries/app-rsc-manifest.js +19 -0
- package/dist/entries/pages-client-entry.js +0 -1
- package/dist/entries/pages-server-entry.js +13 -3
- package/dist/index.js +122 -49
- package/dist/init-cloudflare.d.ts +3 -1
- package/dist/init-cloudflare.js +59 -5
- package/dist/plugins/client-reference-dedup.js +7 -5
- package/dist/plugins/extensionless-dynamic-import.js +23 -18
- package/dist/plugins/ignore-dynamic-requests.js +3 -1
- package/dist/plugins/import-meta-url.js +17 -6
- package/dist/plugins/require-context.js +20 -15
- package/dist/plugins/sass.js +3 -4
- package/dist/plugins/transform-cache.d.ts +19 -0
- package/dist/plugins/transform-cache.js +36 -0
- package/dist/routing/app-route-graph.d.ts +14 -6
- package/dist/routing/app-route-graph.js +106 -16
- package/dist/server/api-handler.d.ts +2 -0
- package/dist/server/api-handler.js +7 -6
- package/dist/server/app-bfcache-identity.js +28 -2
- package/dist/server/app-browser-entry.js +175 -75
- package/dist/server/app-browser-navigation-controller.d.ts +23 -21
- package/dist/server/app-browser-navigation-controller.js +30 -5
- package/dist/server/app-browser-prefetch-response.d.ts +9 -0
- package/dist/server/app-browser-prefetch-response.js +32 -0
- package/dist/server/app-browser-state.d.ts +8 -3
- package/dist/server/app-browser-state.js +9 -3
- package/dist/server/app-page-cache-finalizer.js +1 -1
- package/dist/server/app-page-cache.d.ts +1 -1
- package/dist/server/app-page-cache.js +16 -2
- package/dist/server/app-page-dispatch.d.ts +9 -1
- package/dist/server/app-page-dispatch.js +37 -8
- package/dist/server/app-page-element-builder.d.ts +4 -1
- package/dist/server/app-page-element-builder.js +34 -7
- package/dist/server/app-page-head.d.ts +3 -3
- package/dist/server/app-page-head.js +58 -13
- package/dist/server/app-page-http-access-fallback-metadata.d.ts +2 -2
- package/dist/server/app-page-http-access-fallback-metadata.js +9 -1
- package/dist/server/app-page-probe.d.ts +4 -0
- package/dist/server/app-page-probe.js +6 -2
- package/dist/server/app-page-render.d.ts +1 -1
- package/dist/server/app-page-render.js +13 -3
- package/dist/server/app-page-request.d.ts +3 -1
- package/dist/server/app-page-request.js +4 -13
- package/dist/server/app-page-response.d.ts +2 -0
- package/dist/server/app-page-response.js +7 -2
- package/dist/server/app-page-route-wiring.d.ts +10 -2
- package/dist/server/app-page-route-wiring.js +269 -59
- package/dist/server/app-pages-bridge.d.ts +2 -1
- package/dist/server/app-pages-bridge.js +3 -1
- package/dist/server/app-route-handler-cache.js +4 -0
- package/dist/server/app-route-handler-dispatch.js +9 -3
- package/dist/server/app-route-handler-response.js +1 -1
- package/dist/server/app-route-module-loader.d.ts +6 -0
- package/dist/server/app-route-module-loader.js +3 -0
- package/dist/server/app-router-entry.js +6 -3
- package/dist/server/app-rsc-cache-busting.d.ts +7 -0
- package/dist/server/app-rsc-cache-busting.js +6 -0
- package/dist/server/app-rsc-errors.js +10 -0
- package/dist/server/app-rsc-handler.d.ts +2 -0
- package/dist/server/app-rsc-handler.js +30 -13
- package/dist/server/app-rsc-render-mode.d.ts +3 -2
- package/dist/server/app-rsc-render-mode.js +4 -1
- package/dist/server/app-rsc-request-normalization.js +65 -4
- package/dist/server/app-rsc-route-matching.d.ts +9 -0
- package/dist/server/app-rsc-route-matching.js +6 -0
- package/dist/server/app-server-action-execution.d.ts +1 -1
- package/dist/server/app-ssr-entry.js +4 -4
- package/dist/server/app-visited-response-cache.d.ts +6 -1
- package/dist/server/app-visited-response-cache.js +49 -1
- package/dist/server/cache-control.d.ts +2 -2
- package/dist/server/cache-control.js +2 -1
- package/dist/server/dev-server.d.ts +3 -1
- package/dist/server/dev-server.js +204 -348
- package/dist/server/edge-api-runtime.d.ts +10 -1
- package/dist/server/edge-api-runtime.js +29 -1
- package/dist/server/headers.d.ts +4 -2
- package/dist/server/headers.js +6 -3
- package/dist/server/isr-cache.d.ts +10 -33
- package/dist/server/isr-cache.js +33 -43
- package/dist/server/isr-decision.d.ts +2 -2
- package/dist/server/pages-api-route.d.ts +4 -0
- package/dist/server/pages-api-route.js +6 -3
- package/dist/server/pages-asset-tags.d.ts +1 -0
- package/dist/server/pages-asset-tags.js +6 -4
- package/dist/server/pages-dev-hydration.js +0 -1
- package/dist/server/pages-document-asset-props.d.ts +26 -0
- package/dist/server/pages-document-asset-props.js +69 -0
- package/dist/server/pages-get-initial-props.d.ts +1 -1
- package/dist/server/pages-get-initial-props.js +1 -4
- package/dist/server/pages-i18n.js +64 -16
- package/dist/server/pages-node-compat.d.ts +2 -0
- package/dist/server/pages-node-compat.js +10 -6
- package/dist/server/pages-page-data.d.ts +61 -9
- package/dist/server/pages-page-data.js +334 -74
- package/dist/server/pages-page-handler.d.ts +6 -1
- package/dist/server/pages-page-handler.js +119 -20
- package/dist/server/pages-page-response.d.ts +7 -3
- package/dist/server/pages-page-response.js +41 -33
- package/dist/server/pages-request-pipeline.d.ts +7 -0
- package/dist/server/pages-request-pipeline.js +5 -1
- package/dist/server/pages-revalidate.d.ts +1 -1
- package/dist/server/pages-revalidate.js +54 -8
- package/dist/server/pages-router-entry.d.ts +1 -0
- package/dist/server/pages-router-entry.js +10 -4
- package/dist/server/prerender-manifest.d.ts +1 -0
- package/dist/server/prod-server.d.ts +2 -1
- package/dist/server/prod-server.js +38 -13
- package/dist/server/revalidation-host.d.ts +11 -0
- package/dist/server/revalidation-host.js +19 -0
- package/dist/server/seed-cache.js +1 -1
- package/dist/server/worker-revalidation-context.d.ts +13 -0
- package/dist/server/worker-revalidation-context.js +30 -0
- package/dist/shims/app-router-scroll-state.d.ts +2 -1
- package/dist/shims/app-router-scroll-state.js +7 -2
- package/dist/shims/cache-handler.d.ts +1 -1
- package/dist/shims/cache-handler.js +10 -7
- package/dist/shims/cache-runtime.d.ts +6 -0
- package/dist/shims/cache-runtime.js +4 -1
- package/dist/shims/cache.js +1 -1
- package/dist/shims/document.js +15 -2
- package/dist/shims/error.js +1 -1
- package/dist/shims/fetch-cache.js +1 -1
- package/dist/shims/font-google-base.js +17 -8
- package/dist/shims/font-local.js +41 -10
- package/dist/shims/hash-scroll.d.ts +1 -1
- package/dist/shims/hash-scroll.js +2 -1
- package/dist/shims/headers.d.ts +10 -13
- package/dist/shims/headers.js +85 -36
- package/dist/shims/internal/cookie-serialize.d.ts +10 -9
- package/dist/shims/internal/cookie-serialize.js +9 -8
- package/dist/shims/internal/interpolate-as.d.ts +15 -1
- package/dist/shims/internal/interpolate-as.js +27 -2
- package/dist/shims/link.d.ts +2 -0
- package/dist/shims/link.js +77 -24
- package/dist/shims/metadata.d.ts +18 -34
- package/dist/shims/metadata.js +98 -56
- package/dist/shims/navigation.d.ts +18 -2
- package/dist/shims/navigation.js +70 -21
- package/dist/shims/request-context.d.ts +6 -2
- package/dist/shims/router.js +18 -7
- package/dist/shims/script.js +1 -1
- package/dist/shims/server.d.ts +7 -6
- package/dist/shims/server.js +156 -57
- package/dist/shims/slot.d.ts +2 -1
- package/dist/shims/slot.js +6 -2
- package/dist/shims/streamed-icons.d.ts +9 -0
- package/dist/shims/streamed-icons.js +33 -0
- package/dist/shims/unified-request-context.d.ts +21 -2
- package/dist/shims/unified-request-context.js +82 -1
- package/dist/utils/cache-control-metadata.d.ts +2 -1
- package/dist/utils/cache-control-metadata.js +5 -1
- package/dist/utils/html-limited-bots.js +1 -1
- package/dist/utils/protocol-headers.d.ts +7 -1
- package/dist/utils/protocol-headers.js +7 -1
- package/package.json +1 -1
|
@@ -93,23 +93,71 @@ function stripI18nLocaleForApiRoute(url, i18nConfig) {
|
|
|
93
93
|
*/
|
|
94
94
|
function detectLocaleFromAcceptLanguage(acceptLang, i18nConfig) {
|
|
95
95
|
if (!acceptLang) return null;
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}).sort((a, b) => b.q - a.q);
|
|
104
|
-
for (const { lang } of langs) {
|
|
105
|
-
const exactMatch = i18nConfig.locales.find((locale) => locale.toLowerCase() === lang);
|
|
106
|
-
if (exactMatch) return exactMatch;
|
|
107
|
-
const prefix = lang.split("-")[0];
|
|
108
|
-
const prefixMatch = i18nConfig.locales.find((locale) => {
|
|
109
|
-
const lowered = locale.toLowerCase();
|
|
110
|
-
return lowered === prefix || lowered.startsWith(prefix + "-");
|
|
96
|
+
const configured = /* @__PURE__ */ new Map();
|
|
97
|
+
let position = 0;
|
|
98
|
+
for (const locale of i18nConfig.locales) {
|
|
99
|
+
const lower = locale.toLowerCase();
|
|
100
|
+
configured.set(lower, {
|
|
101
|
+
locale,
|
|
102
|
+
position: position++
|
|
111
103
|
});
|
|
112
|
-
|
|
104
|
+
const parts = lower.split("-");
|
|
105
|
+
while (parts.length > 1) {
|
|
106
|
+
parts.pop();
|
|
107
|
+
const prefix = parts.join("-");
|
|
108
|
+
if (!configured.has(prefix)) configured.set(prefix, {
|
|
109
|
+
locale,
|
|
110
|
+
position: position++
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const selections = [];
|
|
115
|
+
const listedTokens = /* @__PURE__ */ new Set();
|
|
116
|
+
try {
|
|
117
|
+
const parts = acceptLang.replace(/[ \t]/g, "").split(",");
|
|
118
|
+
for (let headerPosition = 0; headerPosition < parts.length; headerPosition++) {
|
|
119
|
+
const part = parts[headerPosition];
|
|
120
|
+
if (!part) continue;
|
|
121
|
+
const params = part.split(";");
|
|
122
|
+
if (params.length > 2) throw new Error("Invalid Accept-Language header");
|
|
123
|
+
const token = params[0].toLowerCase();
|
|
124
|
+
if (!token) throw new Error("Invalid Accept-Language header");
|
|
125
|
+
const selection = {
|
|
126
|
+
token,
|
|
127
|
+
headerPosition,
|
|
128
|
+
quality: 1
|
|
129
|
+
};
|
|
130
|
+
const configuredMatch = configured.get(token);
|
|
131
|
+
if (configuredMatch) selection.preference = configuredMatch.position;
|
|
132
|
+
listedTokens.add(token);
|
|
133
|
+
if (params.length === 2) {
|
|
134
|
+
const [key, value] = params[1].split("=");
|
|
135
|
+
if (!value || key !== "q" && key !== "Q") throw new Error("Invalid Accept-Language header");
|
|
136
|
+
const quality = parseFloat(value);
|
|
137
|
+
if (quality === 0) continue;
|
|
138
|
+
if (Number.isFinite(quality) && quality >= .001 && quality <= 1) selection.quality = quality;
|
|
139
|
+
}
|
|
140
|
+
selections.push(selection);
|
|
141
|
+
}
|
|
142
|
+
} catch {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
selections.sort((a, b) => {
|
|
146
|
+
if (b.quality !== a.quality) return b.quality - a.quality;
|
|
147
|
+
if (a.preference !== b.preference) {
|
|
148
|
+
if (a.preference === void 0) return 1;
|
|
149
|
+
if (b.preference === void 0) return -1;
|
|
150
|
+
return a.preference - b.preference;
|
|
151
|
+
}
|
|
152
|
+
return a.headerPosition - b.headerPosition;
|
|
153
|
+
});
|
|
154
|
+
for (const { token } of selections) {
|
|
155
|
+
if (token === "*") {
|
|
156
|
+
for (const [preference, { locale }] of configured) if (!listedTokens.has(preference)) return locale;
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
const match = configured.get(token);
|
|
160
|
+
if (match) return match.locale;
|
|
113
161
|
}
|
|
114
162
|
return null;
|
|
115
163
|
}
|
|
@@ -49,9 +49,11 @@ type PagesRequestCookiesCarrier = {
|
|
|
49
49
|
cookies?: unknown;
|
|
50
50
|
};
|
|
51
51
|
type CreatePagesReqResOptions = {
|
|
52
|
+
allowedRevalidateHeaderKeys?: readonly string[];
|
|
52
53
|
body: unknown;
|
|
53
54
|
query: PagesRequestQuery;
|
|
54
55
|
request: Request;
|
|
56
|
+
trustedRevalidateOrigin?: string;
|
|
55
57
|
url: string;
|
|
56
58
|
};
|
|
57
59
|
type CreatePagesReqResResult = {
|
|
@@ -121,6 +121,8 @@ var PagesResponseStream = class extends Writable {
|
|
|
121
121
|
resolveResponse;
|
|
122
122
|
rejectResponse;
|
|
123
123
|
requestHeaders;
|
|
124
|
+
trustedRevalidateOrigin;
|
|
125
|
+
allowedRevalidateHeaderKeys;
|
|
124
126
|
resStatusCode = 200;
|
|
125
127
|
resHeaders = {};
|
|
126
128
|
setCookieHeaders = [];
|
|
@@ -128,11 +130,13 @@ var PagesResponseStream = class extends Writable {
|
|
|
128
130
|
controller = null;
|
|
129
131
|
bufferedChunks = [];
|
|
130
132
|
streamEnded = false;
|
|
131
|
-
constructor(resolveResponse, rejectResponse, requestHeaders) {
|
|
133
|
+
constructor(resolveResponse, rejectResponse, requestHeaders, trustedRevalidateOrigin, allowedRevalidateHeaderKeys = []) {
|
|
132
134
|
super();
|
|
133
135
|
this.resolveResponse = resolveResponse;
|
|
134
136
|
this.rejectResponse = rejectResponse;
|
|
135
137
|
this.requestHeaders = requestHeaders;
|
|
138
|
+
this.trustedRevalidateOrigin = trustedRevalidateOrigin;
|
|
139
|
+
this.allowedRevalidateHeaderKeys = allowedRevalidateHeaderKeys;
|
|
136
140
|
this.once("error", (err) => {
|
|
137
141
|
if (!this.resolved) {
|
|
138
142
|
this.resolved = true;
|
|
@@ -151,7 +155,7 @@ var PagesResponseStream = class extends Writable {
|
|
|
151
155
|
}
|
|
152
156
|
writeHead(code, headers) {
|
|
153
157
|
this.resStatusCode = code;
|
|
154
|
-
if (headers) for (const [key, value] of Object.entries(headers)) this.setHeaderValue(key, value, { replaceSetCookie:
|
|
158
|
+
if (headers) for (const [key, value] of Object.entries(headers)) this.setHeaderValue(key, value, { replaceSetCookie: true });
|
|
155
159
|
return this;
|
|
156
160
|
}
|
|
157
161
|
setHeader(name, value) {
|
|
@@ -202,7 +206,7 @@ var PagesResponseStream = class extends Writable {
|
|
|
202
206
|
return headers;
|
|
203
207
|
}
|
|
204
208
|
async revalidate(urlPath, opts) {
|
|
205
|
-
await performOnDemandRevalidate(this.requestHeaders, urlPath, opts);
|
|
209
|
+
await performOnDemandRevalidate(this.requestHeaders, urlPath, opts, this.trustedRevalidateOrigin, this.allowedRevalidateHeaderKeys);
|
|
206
210
|
}
|
|
207
211
|
setPreviewData(data, options = {}) {
|
|
208
212
|
setPagesPreviewData(this, data, options);
|
|
@@ -247,9 +251,9 @@ var PagesResponseStream = class extends Writable {
|
|
|
247
251
|
}
|
|
248
252
|
setHeaderValue(name, value, options) {
|
|
249
253
|
if (name.toLowerCase() === "set-cookie") {
|
|
254
|
+
const values = Array.isArray(value) ? value.map(String) : [String(value)];
|
|
250
255
|
if (options.replaceSetCookie) this.setCookieHeaders.length = 0;
|
|
251
|
-
|
|
252
|
-
else this.setCookieHeaders.push(String(value));
|
|
256
|
+
this.setCookieHeaders.push(...values);
|
|
253
257
|
return;
|
|
254
258
|
}
|
|
255
259
|
this.resHeaders[name.toLowerCase()] = Array.isArray(value) ? value.join(", ") : value;
|
|
@@ -299,7 +303,7 @@ function createPagesReqRes(options) {
|
|
|
299
303
|
resolveResponse = resolve;
|
|
300
304
|
rejectResponse = reject;
|
|
301
305
|
});
|
|
302
|
-
const res = new PagesResponseStream(resolveResponse, rejectResponse, options.request.headers);
|
|
306
|
+
const res = new PagesResponseStream(resolveResponse, rejectResponse, options.request.headers, options.trustedRevalidateOrigin ?? new URL(options.request.url).origin, options.allowedRevalidateHeaderKeys);
|
|
303
307
|
attachPagesPreviewApi(req, res);
|
|
304
308
|
return {
|
|
305
309
|
req,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Route } from "../routing/pages-router.js";
|
|
2
2
|
import { VinextNextData } from "../client/vinext-next-data.js";
|
|
3
|
-
import { CachedPagesValue } from "../shims/cache-handler.js";
|
|
3
|
+
import { CachedPagesValue, CachedRedirectValue } from "../shims/cache-handler.js";
|
|
4
4
|
import { ISRCacheEntry } from "./isr-cache.js";
|
|
5
5
|
import { PagesPreviewData } from "./pages-preview.js";
|
|
6
6
|
import { PagesGetInitialPropsRouter } from "./pages-get-initial-props.js";
|
|
@@ -12,6 +12,12 @@ type PagesRedirectResult = {
|
|
|
12
12
|
destination: string;
|
|
13
13
|
permanent?: boolean;
|
|
14
14
|
statusCode?: number;
|
|
15
|
+
basePath?: boolean;
|
|
16
|
+
};
|
|
17
|
+
type ResolvedPagesRedirect = {
|
|
18
|
+
destination: string;
|
|
19
|
+
statusCode: number;
|
|
20
|
+
basePath?: boolean;
|
|
15
21
|
};
|
|
16
22
|
type PagesStaticPathsEntry = string | {
|
|
17
23
|
params?: Record<string, unknown>;
|
|
@@ -22,11 +28,23 @@ type PagesStaticPathsResult = {
|
|
|
22
28
|
paths?: PagesStaticPathsEntry[];
|
|
23
29
|
};
|
|
24
30
|
type PagesPagePropsResult = {
|
|
25
|
-
props?: Record<string, unknown
|
|
31
|
+
props?: Record<string, unknown> | Promise<Record<string, unknown>>;
|
|
26
32
|
redirect?: PagesRedirectResult;
|
|
27
33
|
notFound?: boolean;
|
|
28
|
-
revalidate?:
|
|
34
|
+
revalidate?: unknown;
|
|
29
35
|
};
|
|
36
|
+
declare function assertPages404DoesNotReturnNotFound(routePattern: string, result: Pick<PagesPagePropsResult, "notFound"> | null | undefined): void;
|
|
37
|
+
/**
|
|
38
|
+
* Next.js preserves an omitted/false Pages `revalidate` result as an indefinite
|
|
39
|
+
* cache lifetime. The one-year sentinel is only an HTTP Cache-Control detail;
|
|
40
|
+
* storing it as a revalidation deadline would incorrectly regenerate static
|
|
41
|
+
* pages after one year.
|
|
42
|
+
*
|
|
43
|
+
* Next.js source:
|
|
44
|
+
* - packages/next/src/server/render.tsx (`metadata.cacheControl`)
|
|
45
|
+
* - packages/next/src/server/route-modules/pages/pages-handler.ts
|
|
46
|
+
*/
|
|
47
|
+
declare function resolvePagesRevalidateSeconds(result: PagesPagePropsResult, routeUrl?: string): number | false;
|
|
30
48
|
type PagesMutableGsspResponse = {
|
|
31
49
|
headersSent: boolean;
|
|
32
50
|
} & PagesGsspResponse;
|
|
@@ -36,8 +54,16 @@ type PagesGsspContextResponse = {
|
|
|
36
54
|
responsePromise: Promise<Response>;
|
|
37
55
|
};
|
|
38
56
|
type PagesRenderProps = Record<string, unknown> & {
|
|
39
|
-
pageProps
|
|
57
|
+
pageProps?: unknown;
|
|
40
58
|
};
|
|
59
|
+
/**
|
|
60
|
+
* Merge gSP/gSSP data into the custom App's raw pageProps value.
|
|
61
|
+
*
|
|
62
|
+
* Next.js deliberately uses Object.assign rather than object spread, so
|
|
63
|
+
* enumerable keys from arrays and primitive wrapper objects are retained.
|
|
64
|
+
* https://github.com/vercel/next.js/blob/canary/packages/next/src/server/render.tsx
|
|
65
|
+
*/
|
|
66
|
+
declare function mergePagesDataProps(appPageProps: unknown, dataProps: unknown): Record<string, unknown>;
|
|
41
67
|
type PagesPageModule = {
|
|
42
68
|
default?: unknown;
|
|
43
69
|
getStaticPaths?: (context: {
|
|
@@ -106,6 +132,7 @@ type RenderPagesIsrHtmlOptions = {
|
|
|
106
132
|
};
|
|
107
133
|
type ResolvePagesPageDataOptions = {
|
|
108
134
|
applyRequestContexts: () => void;
|
|
135
|
+
basePath?: string;
|
|
109
136
|
buildId: string | null;
|
|
110
137
|
/**
|
|
111
138
|
* When true, this is a `/_next/data/<buildId>/<page>.json` request. Callers
|
|
@@ -124,7 +151,7 @@ type ResolvePagesPageDataOptions = {
|
|
|
124
151
|
i18n: PagesI18nRenderContext;
|
|
125
152
|
isrCacheKey: (router: string, pathname: string) => string;
|
|
126
153
|
isrGet: (key: string) => Promise<ISRCacheEntry | null>;
|
|
127
|
-
isrSet: (key: string, data: CachedPagesValue, revalidateSeconds: number, tags?: string[], expireSeconds?: number) => Promise<void>;
|
|
154
|
+
isrSet: (key: string, data: CachedPagesValue | CachedRedirectValue | null, revalidateSeconds: number | false, tags?: string[], expireSeconds?: number) => Promise<void>;
|
|
128
155
|
expireSeconds?: number;
|
|
129
156
|
/**
|
|
130
157
|
* When true, this dispatch corresponds to a build-time prerender (the
|
|
@@ -152,6 +179,12 @@ type ResolvePagesPageDataOptions = {
|
|
|
152
179
|
* presence — see the security note in `isr-cache.ts`.
|
|
153
180
|
*/
|
|
154
181
|
isOnDemandRevalidate?: boolean;
|
|
182
|
+
/**
|
|
183
|
+
* When true alongside an authenticated on-demand request, return a
|
|
184
|
+
* successful 404 no-op if no cache entry exists instead of generating a new
|
|
185
|
+
* fallback path. Mirrors Next.js `unstable_onlyGenerated`.
|
|
186
|
+
*/
|
|
187
|
+
revalidateOnlyGenerated?: boolean;
|
|
155
188
|
previewData?: PagesPreviewData | false;
|
|
156
189
|
/**
|
|
157
190
|
* The deployment ID used for deployment-skew protection. When set, it is
|
|
@@ -171,6 +204,12 @@ type ResolvePagesPageDataOptions = {
|
|
|
171
204
|
route: Pick<Route, "isDynamic">;
|
|
172
205
|
routePattern: string;
|
|
173
206
|
routeUrl: string;
|
|
207
|
+
/**
|
|
208
|
+
* Filesystem-route identity used for Pages ISR reads and writes. Error pages
|
|
209
|
+
* render against the original request URL but cache under /404, /500, or
|
|
210
|
+
* /_error, matching Next.js's error-page cache-key override.
|
|
211
|
+
*/
|
|
212
|
+
isrCachePathname?: string;
|
|
174
213
|
runInFreshUnifiedContext: <T>(callback: () => Promise<T>) => Promise<T>;
|
|
175
214
|
safeJsonStringify: (value: unknown) => string;
|
|
176
215
|
sanitizeDestination: (destination: string) => string;
|
|
@@ -210,7 +249,8 @@ type ResolvePagesPageDataRenderResult = {
|
|
|
210
249
|
kind: "render";
|
|
211
250
|
documentReqRes: PagesGsspContextResponse | null;
|
|
212
251
|
gsspRes: PagesGsspResponse | null;
|
|
213
|
-
isrRevalidateSeconds: number | null;
|
|
252
|
+
isrRevalidateSeconds: number | false | null;
|
|
253
|
+
isrExpireSeconds?: number;
|
|
214
254
|
pageProps: Record<string, unknown>;
|
|
215
255
|
props: PagesRenderProps;
|
|
216
256
|
/**
|
|
@@ -223,12 +263,24 @@ type ResolvePagesPageDataRenderResult = {
|
|
|
223
263
|
};
|
|
224
264
|
type ResolvePagesPageDataResponseResult = {
|
|
225
265
|
kind: "response";
|
|
226
|
-
response: Response;
|
|
266
|
+
response: Response; /** False when an on-demand request must be reported as a failed revalidation. */
|
|
267
|
+
onDemandRevalidateSuccess?: boolean;
|
|
227
268
|
};
|
|
228
269
|
type ResolvePagesPageDataNotFoundResult = {
|
|
229
|
-
kind: "notFound";
|
|
270
|
+
kind: "notFound"; /** Current getStaticProps cache lifetime, when this is an SSG result. */
|
|
271
|
+
revalidateSeconds?: number | false;
|
|
272
|
+
expireSeconds?: number;
|
|
273
|
+
cacheState?: "MISS" | "HIT" | "STALE";
|
|
230
274
|
};
|
|
231
275
|
type ResolvePagesPageDataResult = ResolvePagesPageDataRenderResult | ResolvePagesPageDataResponseResult | ResolvePagesPageDataNotFoundResult;
|
|
276
|
+
/** Validate and normalize the redirect metadata returned by gSP/gSSP. */
|
|
277
|
+
declare function resolvePagesRedirect(redirect: PagesRedirectResult, options: {
|
|
278
|
+
method: "getStaticProps" | "getServerSideProps";
|
|
279
|
+
routeUrl: string;
|
|
280
|
+
sanitizeDestination: (destination: string) => string;
|
|
281
|
+
}): ResolvedPagesRedirect;
|
|
282
|
+
declare function resolvePagesRedirectLocation(redirect: ResolvedPagesRedirect, configuredBasePath?: string): string;
|
|
283
|
+
declare function buildPagesRedirectProps(redirect: ResolvedPagesRedirect, props: PagesRenderProps): PagesRenderProps;
|
|
232
284
|
/**
|
|
233
285
|
* Compare a `getStaticPaths` entry against the actual request params.
|
|
234
286
|
*
|
|
@@ -254,4 +306,4 @@ declare function matchesPagesStaticPath(pathEntry: PagesStaticPathsEntry, params
|
|
|
254
306
|
declare function renderPagesIsrHtml(options: RenderPagesIsrHtmlOptions): Promise<string>;
|
|
255
307
|
declare function resolvePagesPageData(options: ResolvePagesPageDataOptions): Promise<ResolvePagesPageDataResult>;
|
|
256
308
|
//#endregion
|
|
257
|
-
export { PagesPageModule, PagesRouteParam, PagesStaticPathsEntry, ResolvePagesPageDataOptions, getPagesRouteParams, matchesPagesStaticPath, renderPagesIsrHtml, resolvePagesPageData };
|
|
309
|
+
export { PagesPageModule, PagesRedirectResult, PagesRouteParam, PagesStaticPathsEntry, ResolvePagesPageDataOptions, ResolvedPagesRedirect, assertPages404DoesNotReturnNotFound, buildPagesRedirectProps, getPagesRouteParams, matchesPagesStaticPath, mergePagesDataProps, renderPagesIsrHtml, resolvePagesPageData, resolvePagesRedirect, resolvePagesRedirectLocation, resolvePagesRevalidateSeconds };
|