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.
Files changed (174) hide show
  1. package/README.md +6 -9
  2. package/dist/build/client-build-config.js +7 -1
  3. package/dist/build/precompress.js +1 -1
  4. package/dist/build/prerender.d.ts +2 -1
  5. package/dist/build/prerender.js +12 -2
  6. package/dist/check.js +4 -0
  7. package/dist/cli-args.d.ts +2 -1
  8. package/dist/cli-args.js +10 -0
  9. package/dist/cli.js +14 -8
  10. package/dist/client/navigation-runtime.d.ts +6 -0
  11. package/dist/client/navigation-runtime.js +1 -1
  12. package/dist/config/config-matchers.js +4 -1
  13. package/dist/config/dotenv.d.ts +3 -4
  14. package/dist/config/dotenv.js +30 -22
  15. package/dist/config/next-config.d.ts +16 -5
  16. package/dist/config/next-config.js +7 -0
  17. package/dist/entries/app-browser-entry.d.ts +4 -10
  18. package/dist/entries/app-browser-entry.js +20 -4
  19. package/dist/entries/app-rsc-entry.js +21 -3
  20. package/dist/entries/app-rsc-manifest.js +19 -0
  21. package/dist/entries/pages-client-entry.js +0 -1
  22. package/dist/entries/pages-server-entry.js +13 -3
  23. package/dist/index.js +122 -49
  24. package/dist/init-cloudflare.d.ts +3 -1
  25. package/dist/init-cloudflare.js +59 -5
  26. package/dist/plugins/client-reference-dedup.js +7 -5
  27. package/dist/plugins/extensionless-dynamic-import.js +23 -18
  28. package/dist/plugins/ignore-dynamic-requests.js +3 -1
  29. package/dist/plugins/import-meta-url.js +17 -6
  30. package/dist/plugins/require-context.js +20 -15
  31. package/dist/plugins/sass.js +3 -4
  32. package/dist/plugins/transform-cache.d.ts +19 -0
  33. package/dist/plugins/transform-cache.js +36 -0
  34. package/dist/routing/app-route-graph.d.ts +14 -6
  35. package/dist/routing/app-route-graph.js +106 -16
  36. package/dist/server/api-handler.d.ts +2 -0
  37. package/dist/server/api-handler.js +7 -6
  38. package/dist/server/app-bfcache-identity.js +28 -2
  39. package/dist/server/app-browser-entry.js +175 -75
  40. package/dist/server/app-browser-navigation-controller.d.ts +23 -21
  41. package/dist/server/app-browser-navigation-controller.js +30 -5
  42. package/dist/server/app-browser-prefetch-response.d.ts +9 -0
  43. package/dist/server/app-browser-prefetch-response.js +32 -0
  44. package/dist/server/app-browser-state.d.ts +8 -3
  45. package/dist/server/app-browser-state.js +9 -3
  46. package/dist/server/app-page-cache-finalizer.js +1 -1
  47. package/dist/server/app-page-cache.d.ts +1 -1
  48. package/dist/server/app-page-cache.js +16 -2
  49. package/dist/server/app-page-dispatch.d.ts +9 -1
  50. package/dist/server/app-page-dispatch.js +37 -8
  51. package/dist/server/app-page-element-builder.d.ts +4 -1
  52. package/dist/server/app-page-element-builder.js +34 -7
  53. package/dist/server/app-page-head.d.ts +3 -3
  54. package/dist/server/app-page-head.js +58 -13
  55. package/dist/server/app-page-http-access-fallback-metadata.d.ts +2 -2
  56. package/dist/server/app-page-http-access-fallback-metadata.js +9 -1
  57. package/dist/server/app-page-probe.d.ts +4 -0
  58. package/dist/server/app-page-probe.js +6 -2
  59. package/dist/server/app-page-render.d.ts +1 -1
  60. package/dist/server/app-page-render.js +13 -3
  61. package/dist/server/app-page-request.d.ts +3 -1
  62. package/dist/server/app-page-request.js +4 -13
  63. package/dist/server/app-page-response.d.ts +2 -0
  64. package/dist/server/app-page-response.js +7 -2
  65. package/dist/server/app-page-route-wiring.d.ts +10 -2
  66. package/dist/server/app-page-route-wiring.js +269 -59
  67. package/dist/server/app-pages-bridge.d.ts +2 -1
  68. package/dist/server/app-pages-bridge.js +3 -1
  69. package/dist/server/app-route-handler-cache.js +4 -0
  70. package/dist/server/app-route-handler-dispatch.js +9 -3
  71. package/dist/server/app-route-handler-response.js +1 -1
  72. package/dist/server/app-route-module-loader.d.ts +6 -0
  73. package/dist/server/app-route-module-loader.js +3 -0
  74. package/dist/server/app-router-entry.js +6 -3
  75. package/dist/server/app-rsc-cache-busting.d.ts +7 -0
  76. package/dist/server/app-rsc-cache-busting.js +6 -0
  77. package/dist/server/app-rsc-errors.js +10 -0
  78. package/dist/server/app-rsc-handler.d.ts +2 -0
  79. package/dist/server/app-rsc-handler.js +30 -13
  80. package/dist/server/app-rsc-render-mode.d.ts +3 -2
  81. package/dist/server/app-rsc-render-mode.js +4 -1
  82. package/dist/server/app-rsc-request-normalization.js +65 -4
  83. package/dist/server/app-rsc-route-matching.d.ts +9 -0
  84. package/dist/server/app-rsc-route-matching.js +6 -0
  85. package/dist/server/app-server-action-execution.d.ts +1 -1
  86. package/dist/server/app-ssr-entry.js +4 -4
  87. package/dist/server/app-visited-response-cache.d.ts +6 -1
  88. package/dist/server/app-visited-response-cache.js +49 -1
  89. package/dist/server/cache-control.d.ts +2 -2
  90. package/dist/server/cache-control.js +2 -1
  91. package/dist/server/dev-server.d.ts +3 -1
  92. package/dist/server/dev-server.js +204 -348
  93. package/dist/server/edge-api-runtime.d.ts +10 -1
  94. package/dist/server/edge-api-runtime.js +29 -1
  95. package/dist/server/headers.d.ts +4 -2
  96. package/dist/server/headers.js +6 -3
  97. package/dist/server/isr-cache.d.ts +10 -33
  98. package/dist/server/isr-cache.js +33 -43
  99. package/dist/server/isr-decision.d.ts +2 -2
  100. package/dist/server/pages-api-route.d.ts +4 -0
  101. package/dist/server/pages-api-route.js +6 -3
  102. package/dist/server/pages-asset-tags.d.ts +1 -0
  103. package/dist/server/pages-asset-tags.js +6 -4
  104. package/dist/server/pages-dev-hydration.js +0 -1
  105. package/dist/server/pages-document-asset-props.d.ts +26 -0
  106. package/dist/server/pages-document-asset-props.js +69 -0
  107. package/dist/server/pages-get-initial-props.d.ts +1 -1
  108. package/dist/server/pages-get-initial-props.js +1 -4
  109. package/dist/server/pages-i18n.js +64 -16
  110. package/dist/server/pages-node-compat.d.ts +2 -0
  111. package/dist/server/pages-node-compat.js +10 -6
  112. package/dist/server/pages-page-data.d.ts +61 -9
  113. package/dist/server/pages-page-data.js +334 -74
  114. package/dist/server/pages-page-handler.d.ts +6 -1
  115. package/dist/server/pages-page-handler.js +119 -20
  116. package/dist/server/pages-page-response.d.ts +7 -3
  117. package/dist/server/pages-page-response.js +41 -33
  118. package/dist/server/pages-request-pipeline.d.ts +7 -0
  119. package/dist/server/pages-request-pipeline.js +5 -1
  120. package/dist/server/pages-revalidate.d.ts +1 -1
  121. package/dist/server/pages-revalidate.js +54 -8
  122. package/dist/server/pages-router-entry.d.ts +1 -0
  123. package/dist/server/pages-router-entry.js +10 -4
  124. package/dist/server/prerender-manifest.d.ts +1 -0
  125. package/dist/server/prod-server.d.ts +2 -1
  126. package/dist/server/prod-server.js +38 -13
  127. package/dist/server/revalidation-host.d.ts +11 -0
  128. package/dist/server/revalidation-host.js +19 -0
  129. package/dist/server/seed-cache.js +1 -1
  130. package/dist/server/worker-revalidation-context.d.ts +13 -0
  131. package/dist/server/worker-revalidation-context.js +30 -0
  132. package/dist/shims/app-router-scroll-state.d.ts +2 -1
  133. package/dist/shims/app-router-scroll-state.js +7 -2
  134. package/dist/shims/cache-handler.d.ts +1 -1
  135. package/dist/shims/cache-handler.js +10 -7
  136. package/dist/shims/cache-runtime.d.ts +6 -0
  137. package/dist/shims/cache-runtime.js +4 -1
  138. package/dist/shims/cache.js +1 -1
  139. package/dist/shims/document.js +15 -2
  140. package/dist/shims/error.js +1 -1
  141. package/dist/shims/fetch-cache.js +1 -1
  142. package/dist/shims/font-google-base.js +17 -8
  143. package/dist/shims/font-local.js +41 -10
  144. package/dist/shims/hash-scroll.d.ts +1 -1
  145. package/dist/shims/hash-scroll.js +2 -1
  146. package/dist/shims/headers.d.ts +10 -13
  147. package/dist/shims/headers.js +85 -36
  148. package/dist/shims/internal/cookie-serialize.d.ts +10 -9
  149. package/dist/shims/internal/cookie-serialize.js +9 -8
  150. package/dist/shims/internal/interpolate-as.d.ts +15 -1
  151. package/dist/shims/internal/interpolate-as.js +27 -2
  152. package/dist/shims/link.d.ts +2 -0
  153. package/dist/shims/link.js +77 -24
  154. package/dist/shims/metadata.d.ts +18 -34
  155. package/dist/shims/metadata.js +98 -56
  156. package/dist/shims/navigation.d.ts +18 -2
  157. package/dist/shims/navigation.js +70 -21
  158. package/dist/shims/request-context.d.ts +6 -2
  159. package/dist/shims/router.js +18 -7
  160. package/dist/shims/script.js +1 -1
  161. package/dist/shims/server.d.ts +7 -6
  162. package/dist/shims/server.js +156 -57
  163. package/dist/shims/slot.d.ts +2 -1
  164. package/dist/shims/slot.js +6 -2
  165. package/dist/shims/streamed-icons.d.ts +9 -0
  166. package/dist/shims/streamed-icons.js +33 -0
  167. package/dist/shims/unified-request-context.d.ts +21 -2
  168. package/dist/shims/unified-request-context.js +82 -1
  169. package/dist/utils/cache-control-metadata.d.ts +2 -1
  170. package/dist/utils/cache-control-metadata.js +5 -1
  171. package/dist/utils/html-limited-bots.js +1 -1
  172. package/dist/utils/protocol-headers.d.ts +7 -1
  173. package/dist/utils/protocol-headers.js +7 -1
  174. 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 langs = acceptLang.split(",").map((part) => {
97
- const [lang, qPart] = part.trim().split(";");
98
- const q = qPart ? parseFloat(qPart.replace("q=", "")) : 1;
99
- return {
100
- lang: lang.trim().toLowerCase(),
101
- q
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
- if (prefixMatch) return prefixMatch;
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: false });
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
- if (Array.isArray(value)) this.setCookieHeaders.push(...value.map(String));
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?: number;
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: unknown;
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 };