vinext 0.1.2 → 0.1.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 (243) hide show
  1. package/dist/build/client-build-config.d.ts +11 -2
  2. package/dist/build/client-build-config.js +17 -6
  3. package/dist/build/prerender.d.ts +9 -1
  4. package/dist/build/prerender.js +42 -12
  5. package/dist/build/run-prerender.d.ts +10 -2
  6. package/dist/build/run-prerender.js +15 -1
  7. package/dist/client/app-nav-failure-handler.d.ts +8 -0
  8. package/dist/client/app-nav-failure-handler.js +44 -0
  9. package/dist/client/pages-router-link-navigation.d.ts +33 -7
  10. package/dist/client/pages-router-link-navigation.js +32 -2
  11. package/dist/client/vinext-next-data.d.ts +18 -1
  12. package/dist/client/vinext-next-data.js +2 -0
  13. package/dist/client/window-next.d.ts +2 -1
  14. package/dist/client/window-next.js +12 -1
  15. package/dist/cloudflare/src/cache/cdn-adapter.runtime.js +6 -1
  16. package/dist/config/config-matchers.d.ts +11 -1
  17. package/dist/config/config-matchers.js +87 -16
  18. package/dist/config/next-config.d.ts +46 -4
  19. package/dist/config/next-config.js +147 -48
  20. package/dist/config/tsconfig-paths.js +14 -1
  21. package/dist/deploy.d.ts +30 -11
  22. package/dist/deploy.js +200 -112
  23. package/dist/entries/app-browser-entry.d.ts +9 -3
  24. package/dist/entries/app-browser-entry.js +21 -3
  25. package/dist/entries/app-rsc-entry.d.ts +2 -0
  26. package/dist/entries/app-rsc-entry.js +65 -5
  27. package/dist/entries/app-rsc-manifest.js +2 -0
  28. package/dist/entries/app-ssr-entry.js +1 -1
  29. package/dist/entries/pages-client-entry.js +66 -20
  30. package/dist/entries/pages-server-entry.js +47 -31
  31. package/dist/index.js +417 -102
  32. package/dist/plugins/dynamic-preload-metadata.js +2 -4
  33. package/dist/plugins/extensionless-dynamic-import.d.ts +6 -0
  34. package/dist/plugins/extensionless-dynamic-import.js +152 -0
  35. package/dist/plugins/fonts.js +5 -4
  36. package/dist/plugins/optimize-imports.d.ts +2 -1
  37. package/dist/plugins/optimize-imports.js +11 -9
  38. package/dist/plugins/postcss.js +7 -7
  39. package/dist/plugins/strip-server-exports.d.ts +9 -7
  40. package/dist/plugins/strip-server-exports.js +493 -46
  41. package/dist/plugins/typeof-window.d.ts +14 -0
  42. package/dist/plugins/typeof-window.js +150 -0
  43. package/dist/routing/app-route-graph.d.ts +2 -1
  44. package/dist/routing/app-route-graph.js +46 -16
  45. package/dist/routing/file-matcher.d.ts +10 -1
  46. package/dist/routing/file-matcher.js +22 -1
  47. package/dist/routing/pages-router.js +3 -3
  48. package/dist/routing/utils.d.ts +35 -6
  49. package/dist/routing/utils.js +59 -7
  50. package/dist/server/api-handler.d.ts +6 -1
  51. package/dist/server/api-handler.js +21 -15
  52. package/dist/server/app-browser-action-result.d.ts +19 -6
  53. package/dist/server/app-browser-action-result.js +20 -11
  54. package/dist/server/app-browser-entry.js +175 -91
  55. package/dist/server/app-browser-error.d.ts +10 -6
  56. package/dist/server/app-browser-error.js +43 -8
  57. package/dist/server/app-browser-hydration.d.ts +2 -0
  58. package/dist/server/app-browser-hydration.js +1 -0
  59. package/dist/server/app-browser-navigation-controller.d.ts +5 -3
  60. package/dist/server/app-browser-navigation-controller.js +23 -2
  61. package/dist/server/app-browser-server-action-navigation.d.ts +6 -0
  62. package/dist/server/app-browser-server-action-navigation.js +9 -0
  63. package/dist/server/app-browser-state.d.ts +1 -1
  64. package/dist/server/app-browser-state.js +19 -11
  65. package/dist/server/app-browser-stream.js +86 -43
  66. package/dist/server/app-browser-visible-commit.d.ts +1 -1
  67. package/dist/server/app-elements-wire.d.ts +6 -1
  68. package/dist/server/app-elements-wire.js +14 -4
  69. package/dist/server/app-elements.d.ts +2 -2
  70. package/dist/server/app-elements.js +2 -2
  71. package/dist/server/app-fallback-renderer.d.ts +1 -0
  72. package/dist/server/app-fallback-renderer.js +3 -1
  73. package/dist/server/app-optimistic-routing.js +2 -2
  74. package/dist/server/app-page-boundary-render.d.ts +1 -0
  75. package/dist/server/app-page-boundary-render.js +27 -14
  76. package/dist/server/app-page-cache-render.d.ts +53 -0
  77. package/dist/server/app-page-cache-render.js +91 -0
  78. package/dist/server/app-page-cache.d.ts +16 -2
  79. package/dist/server/app-page-cache.js +62 -1
  80. package/dist/server/app-page-dispatch.d.ts +26 -0
  81. package/dist/server/app-page-dispatch.js +149 -92
  82. package/dist/server/app-page-element-builder.d.ts +1 -0
  83. package/dist/server/app-page-element-builder.js +5 -2
  84. package/dist/server/app-page-execution.d.ts +6 -1
  85. package/dist/server/app-page-execution.js +21 -1
  86. package/dist/server/app-page-probe.d.ts +1 -0
  87. package/dist/server/app-page-probe.js +4 -0
  88. package/dist/server/app-page-render-observation.d.ts +3 -1
  89. package/dist/server/app-page-render-observation.js +17 -1
  90. package/dist/server/app-page-render.d.ts +12 -1
  91. package/dist/server/app-page-render.js +42 -4
  92. package/dist/server/app-page-request.d.ts +2 -0
  93. package/dist/server/app-page-request.js +2 -1
  94. package/dist/server/app-page-route-wiring.d.ts +3 -1
  95. package/dist/server/app-page-route-wiring.js +14 -5
  96. package/dist/server/app-page-stream.d.ts +15 -3
  97. package/dist/server/app-page-stream.js +11 -5
  98. package/dist/server/app-pages-bridge.d.ts +23 -1
  99. package/dist/server/app-pages-bridge.js +26 -17
  100. package/dist/server/app-ppr-fallback-shell-render.d.ts +17 -0
  101. package/dist/server/app-ppr-fallback-shell-render.js +26 -0
  102. package/dist/server/app-ppr-fallback-shell.d.ts +13 -1
  103. package/dist/server/app-ppr-fallback-shell.js +8 -1
  104. package/dist/server/app-route-handler-dispatch.js +9 -2
  105. package/dist/server/app-route-handler-policy.d.ts +1 -0
  106. package/dist/server/app-router-entry.js +5 -0
  107. package/dist/server/app-rsc-cache-busting.js +2 -0
  108. package/dist/server/app-rsc-handler.d.ts +28 -0
  109. package/dist/server/app-rsc-handler.js +195 -59
  110. package/dist/server/app-rsc-route-matching.d.ts +3 -0
  111. package/dist/server/app-rsc-route-matching.js +8 -2
  112. package/dist/server/app-segment-config.d.ts +9 -1
  113. package/dist/server/app-segment-config.js +12 -3
  114. package/dist/server/app-server-action-execution.d.ts +1 -0
  115. package/dist/server/app-server-action-execution.js +47 -15
  116. package/dist/server/app-ssr-entry.d.ts +2 -0
  117. package/dist/server/app-ssr-entry.js +84 -39
  118. package/dist/server/before-interactive-head.d.ts +17 -0
  119. package/dist/server/before-interactive-head.js +35 -0
  120. package/dist/server/cache-control.js +4 -0
  121. package/dist/server/csp.js +1 -4
  122. package/dist/server/dev-server.d.ts +2 -2
  123. package/dist/server/dev-server.js +321 -83
  124. package/dist/server/hybrid-route-priority.d.ts +22 -0
  125. package/dist/server/hybrid-route-priority.js +33 -0
  126. package/dist/server/image-optimization.d.ts +18 -9
  127. package/dist/server/image-optimization.js +37 -23
  128. package/dist/server/implicit-tags.d.ts +2 -1
  129. package/dist/server/implicit-tags.js +4 -1
  130. package/dist/server/middleware-matcher.js +12 -3
  131. package/dist/server/middleware-runtime.d.ts +3 -4
  132. package/dist/server/middleware-runtime.js +2 -0
  133. package/dist/server/navigation-planner.d.ts +135 -41
  134. package/dist/server/navigation-planner.js +138 -0
  135. package/dist/server/navigation-trace.d.ts +9 -1
  136. package/dist/server/navigation-trace.js +9 -1
  137. package/dist/server/operation-token.d.ts +40 -0
  138. package/dist/server/operation-token.js +85 -0
  139. package/dist/server/pages-api-route.d.ts +6 -0
  140. package/dist/server/pages-api-route.js +13 -2
  141. package/dist/server/pages-asset-tags.d.ts +2 -1
  142. package/dist/server/pages-asset-tags.js +6 -2
  143. package/dist/server/pages-data-route.d.ts +9 -2
  144. package/dist/server/pages-data-route.js +18 -6
  145. package/dist/server/pages-dev-module-url.d.ts +4 -0
  146. package/dist/server/pages-dev-module-url.js +15 -0
  147. package/dist/server/pages-document-initial-props.d.ts +4 -15
  148. package/dist/server/pages-document-initial-props.js +27 -56
  149. package/dist/server/pages-get-initial-props.d.ts +54 -4
  150. package/dist/server/pages-get-initial-props.js +43 -1
  151. package/dist/server/pages-i18n.js +2 -2
  152. package/dist/server/pages-node-compat.js +2 -2
  153. package/dist/server/pages-page-data.d.ts +11 -2
  154. package/dist/server/pages-page-data.js +207 -34
  155. package/dist/server/pages-page-handler.d.ts +4 -2
  156. package/dist/server/pages-page-handler.js +62 -23
  157. package/dist/server/pages-page-response.d.ts +4 -1
  158. package/dist/server/pages-page-response.js +11 -8
  159. package/dist/server/pages-readiness.js +1 -1
  160. package/dist/server/pages-request-pipeline.d.ts +8 -7
  161. package/dist/server/pages-request-pipeline.js +126 -47
  162. package/dist/server/pregenerated-concrete-paths.d.ts +1 -17
  163. package/dist/server/pregenerated-concrete-paths.js +2 -19
  164. package/dist/server/prerender-manifest.d.ts +33 -0
  165. package/dist/server/prerender-manifest.js +54 -0
  166. package/dist/server/prerender-route-params.d.ts +1 -2
  167. package/dist/server/prod-server.d.ts +3 -1
  168. package/dist/server/prod-server.js +50 -13
  169. package/dist/server/request-pipeline.d.ts +3 -15
  170. package/dist/server/request-pipeline.js +58 -47
  171. package/dist/server/rsc-stream-hints.d.ts +5 -1
  172. package/dist/server/rsc-stream-hints.js +6 -1
  173. package/dist/server/seed-cache.js +10 -18
  174. package/dist/server/static-file-cache.js +16 -4
  175. package/dist/shims/app-router-scroll-state.d.ts +3 -1
  176. package/dist/shims/app-router-scroll-state.js +14 -2
  177. package/dist/shims/app-router-scroll.d.ts +3 -0
  178. package/dist/shims/app-router-scroll.js +28 -18
  179. package/dist/shims/before-interactive-context.d.ts +14 -3
  180. package/dist/shims/cache-runtime.js +3 -2
  181. package/dist/shims/cache.d.ts +1 -0
  182. package/dist/shims/cache.js +1 -1
  183. package/dist/shims/cdn-cache.d.ts +5 -5
  184. package/dist/shims/document.d.ts +15 -20
  185. package/dist/shims/document.js +5 -8
  186. package/dist/shims/dynamic-preload-chunks.js +6 -4
  187. package/dist/shims/error-boundary.d.ts +2 -0
  188. package/dist/shims/error-boundary.js +7 -0
  189. package/dist/shims/error.js +3 -2
  190. package/dist/shims/error.react-server.d.ts +9 -0
  191. package/dist/shims/error.react-server.js +6 -0
  192. package/dist/shims/fetch-cache.d.ts +3 -1
  193. package/dist/shims/fetch-cache.js +45 -20
  194. package/dist/shims/hash-scroll.js +6 -1
  195. package/dist/shims/headers.js +29 -4
  196. package/dist/shims/image.js +9 -2
  197. package/dist/shims/internal/als-registry.js +28 -1
  198. package/dist/shims/internal/app-route-detection.js +8 -17
  199. package/dist/shims/internal/hybrid-client-route-owner.d.ts +31 -0
  200. package/dist/shims/internal/hybrid-client-route-owner.js +143 -0
  201. package/dist/shims/internal/navigation-untracked.d.ts +35 -0
  202. package/dist/shims/internal/navigation-untracked.js +55 -0
  203. package/dist/shims/internal/pages-data-fetch-dedup.d.ts +6 -7
  204. package/dist/shims/internal/pages-data-fetch-dedup.js +67 -14
  205. package/dist/shims/internal/pages-data-target.d.ts +7 -2
  206. package/dist/shims/internal/pages-data-target.js +17 -8
  207. package/dist/shims/internal/pages-router-accessor.d.ts +19 -0
  208. package/dist/shims/internal/pages-router-accessor.js +13 -0
  209. package/dist/shims/internal/router-context.d.ts +2 -1
  210. package/dist/shims/internal/router-context.js +3 -1
  211. package/dist/shims/link.js +47 -19
  212. package/dist/shims/metadata.js +4 -4
  213. package/dist/shims/navigation.d.ts +8 -2
  214. package/dist/shims/navigation.js +63 -31
  215. package/dist/shims/ppr-fallback-shell.d.ts +5 -1
  216. package/dist/shims/ppr-fallback-shell.js +28 -7
  217. package/dist/shims/router.d.ts +18 -3
  218. package/dist/shims/router.js +512 -142
  219. package/dist/shims/script.js +8 -4
  220. package/dist/shims/server.d.ts +16 -1
  221. package/dist/shims/server.js +44 -12
  222. package/dist/shims/unified-request-context.js +1 -0
  223. package/dist/utils/built-asset-url.d.ts +4 -0
  224. package/dist/utils/built-asset-url.js +11 -0
  225. package/dist/utils/commonjs-loader.d.ts +16 -0
  226. package/dist/utils/commonjs-loader.js +100 -0
  227. package/dist/utils/deployment-id.d.ts +8 -0
  228. package/dist/utils/deployment-id.js +22 -0
  229. package/dist/utils/has-trailing-comma.d.ts +24 -0
  230. package/dist/utils/has-trailing-comma.js +62 -0
  231. package/dist/utils/html-limited-bots.d.ts +18 -1
  232. package/dist/utils/html-limited-bots.js +23 -1
  233. package/dist/utils/parse-cookie.d.ts +13 -0
  234. package/dist/utils/parse-cookie.js +52 -0
  235. package/dist/utils/path.d.ts +7 -1
  236. package/dist/utils/path.js +9 -1
  237. package/dist/utils/text-stream.d.ts +1 -1
  238. package/dist/utils/text-stream.js +2 -2
  239. package/dist/utils/vite-version.d.ts +12 -1
  240. package/dist/utils/vite-version.js +9 -1
  241. package/package.json +2 -2
  242. package/dist/shims/internal/parse-cookie-header.d.ts +0 -14
  243. package/dist/shims/internal/parse-cookie-header.js +0 -30
@@ -1,12 +1,14 @@
1
1
  import { NEXTJS_DEPLOYMENT_ID_HEADER } from "./headers.js";
2
2
  import { normalizeStaticPathname } from "../routing/route-pattern.js";
3
3
  import { buildCacheStateHeaders } from "./cache-headers.js";
4
+ import { isUnknownRecord } from "../utils/record.js";
4
5
  import { applyCdnResponseHeaders } from "./cache-control.js";
5
6
  import { decideIsr } from "./isr-decision.js";
6
7
  import { buildPagesCacheValue } from "./isr-cache.js";
7
8
  import { isSerializableProps } from "./pages-serializable-props.js";
8
9
  import { hasPagesGetInitialProps, isResponseSent, loadPagesGetInitialProps } from "./pages-get-initial-props.js";
9
- import { buildNextDataJsonResponse } from "./pages-data-route.js";
10
+ import { isBotUserAgent } from "../utils/html-limited-bots.js";
11
+ import { buildNextDataPropsJsonResponse } from "./pages-data-route.js";
10
12
  import { buildPagesNextDataScript, etagMatches, generatePagesETag, isPagesStreamingBot, requestsNoCache } from "./pages-page-response.js";
11
13
  //#region src/server/pages-page-data.ts
12
14
  function buildPagesDataNotFoundResponse(deploymentId) {
@@ -27,6 +29,65 @@ function buildPagesNotFoundResult(options) {
27
29
  function resolvePagesRedirectStatus(redirect) {
28
30
  return redirect.statusCode != null ? redirect.statusCode : redirect.permanent ? 308 : 307;
29
31
  }
32
+ function normalizePagesRenderProps(props) {
33
+ return {
34
+ ...props,
35
+ pageProps: props.pageProps
36
+ };
37
+ }
38
+ /**
39
+ * Load `_app.getInitialProps` and return the normalized render props and the
40
+ * extracted `pageProps`. This is shared between the foreground render path and
41
+ * the stale-while-revalidate background regeneration path so both produce the
42
+ * same full props envelope (app-level props plus the page's `pageProps`).
43
+ *
44
+ * `getSharedReqRes` lets callers share the same mock req/res with other
45
+ * data-fetching steps (e.g. `getServerSideProps`) when they run in the same
46
+ * request context.
47
+ */
48
+ async function loadPagesAppInitialRenderProps(options, getSharedReqRes) {
49
+ let pageProps = {};
50
+ let renderProps = { pageProps };
51
+ if (!hasPagesGetInitialProps(options.AppComponent)) return {
52
+ kind: "props",
53
+ pageProps,
54
+ renderProps
55
+ };
56
+ const { req, res, responsePromise } = getSharedReqRes();
57
+ const initialProps = await loadPagesGetInitialProps(options.AppComponent, {
58
+ AppTree: options.createAppTree ?? options.createPageElement,
59
+ Component: options.pageModule.default,
60
+ router: {
61
+ pathname: options.routePattern,
62
+ query: options.query,
63
+ asPath: options.asPath ?? options.routeUrl
64
+ },
65
+ ctx: {
66
+ req,
67
+ res,
68
+ err: options.err,
69
+ pathname: options.routePattern,
70
+ query: options.query,
71
+ asPath: options.asPath ?? options.routeUrl,
72
+ locale: options.i18n.locale,
73
+ locales: options.i18n.locales,
74
+ defaultLocale: options.i18n.defaultLocale
75
+ }
76
+ });
77
+ if (isResponseSent(res)) return {
78
+ kind: "response",
79
+ response: responsePromise
80
+ };
81
+ if (initialProps) {
82
+ renderProps = normalizePagesRenderProps(initialProps);
83
+ pageProps = isUnknownRecord(renderProps.pageProps) ? renderProps.pageProps : {};
84
+ }
85
+ return {
86
+ kind: "props",
87
+ pageProps,
88
+ renderProps
89
+ };
90
+ }
30
91
  /**
31
92
  * Build the response for a `getServerSideProps` / `getStaticProps`
32
93
  * `{ redirect }` result.
@@ -48,14 +109,18 @@ function resolvePagesRedirectStatus(redirect) {
48
109
  * redirects (search `__N_REDIRECT`), consumed in
49
110
  * `packages/next/src/shared/lib/router/router.ts` (`pageProps.__N_REDIRECT`).
50
111
  */
51
- function buildPagesRedirectResponse(redirect, options) {
112
+ function buildPagesRedirectResponse(redirect, options, props = { pageProps: {} }) {
52
113
  const destination = options.sanitizeDestination(redirect.destination);
53
114
  if (options.isDataReq) {
54
115
  const init = { headers: {} };
55
116
  if (options.deploymentId) init.headers[NEXTJS_DEPLOYMENT_ID_HEADER] = options.deploymentId;
56
- return buildNextDataJsonResponse({
57
- __N_REDIRECT: destination,
58
- __N_REDIRECT_STATUS: resolvePagesRedirectStatus(redirect)
117
+ return buildNextDataPropsJsonResponse({
118
+ ...props,
119
+ pageProps: {
120
+ ...isUnknownRecord(props.pageProps) ? props.pageProps : {},
121
+ __N_REDIRECT: destination,
122
+ __N_REDIRECT_STATUS: resolvePagesRedirectStatus(redirect)
123
+ }
59
124
  }, options.safeJsonStringify, init);
60
125
  }
61
126
  return new Response(null, {
@@ -133,7 +198,9 @@ function applyBotETagAndCheck(cachedResponse, html, options) {
133
198
  function rewritePagesCachedHtml(cachedHtml, freshBody, nextDataScript) {
134
199
  const bodyStart = cachedHtml.indexOf("<div id=\"__next\">");
135
200
  const contentStart = bodyStart >= 0 ? bodyStart + 17 : -1;
136
- const nextDataStart = cachedHtml.indexOf("<script>window.__NEXT_DATA__");
201
+ const canonicalNextDataStart = cachedHtml.search(/<script\b(?=[^>]*\bid=["']__NEXT_DATA__["'])(?=[^>]*\btype=["']application\/json["'])[^>]*>/);
202
+ const legacyNextDataStart = cachedHtml.indexOf("<script>window.__NEXT_DATA__");
203
+ const nextDataStart = canonicalNextDataStart >= 0 ? canonicalNextDataStart : legacyNextDataStart;
137
204
  if (contentStart >= 0 && nextDataStart >= 0) {
138
205
  const region = cachedHtml.slice(contentStart, nextDataStart);
139
206
  const lastCloseDiv = region.lastIndexOf("</div>");
@@ -145,11 +212,13 @@ function rewritePagesCachedHtml(cachedHtml, freshBody, nextDataScript) {
145
212
  return "<!DOCTYPE html>\n<html>\n<head>\n</head>\n<body>\n <div id=\"__next\">" + freshBody + "</div>\n " + nextDataScript + "\n</body>\n</html>";
146
213
  }
147
214
  async function renderPagesIsrHtml(options) {
148
- const freshBody = await options.renderIsrPassToStringAsync(options.createPageElement(options.pageProps));
215
+ const renderProps = options.props ?? { pageProps: options.pageProps };
216
+ const freshBody = await options.renderIsrPassToStringAsync(options.createPageElement(renderProps));
149
217
  const nextDataScript = buildPagesNextDataScript({
150
218
  buildId: options.buildId,
151
219
  i18n: options.i18n,
152
220
  pageProps: options.pageProps,
221
+ props: renderProps,
153
222
  params: options.params,
154
223
  routePattern: options.routePattern,
155
224
  safeJsonStringify: options.safeJsonStringify,
@@ -161,6 +230,7 @@ async function renderPagesIsrHtml(options) {
161
230
  async function resolvePagesPageData(options) {
162
231
  const userFacingParams = options.route.isDynamic ? options.params : null;
163
232
  let isFallback = false;
233
+ let shouldPersistFallbackData = false;
164
234
  if (typeof options.pageModule.getStaticPaths === "function" && options.route.isDynamic) {
165
235
  const pathsResult = await options.pageModule.getStaticPaths({
166
236
  locales: options.i18n.locales ?? [],
@@ -169,25 +239,62 @@ async function resolvePagesPageData(options) {
169
239
  const fallback = pathsResult?.fallback ?? false;
170
240
  const isValidPath = (pathsResult?.paths ?? []).some((pathEntry) => matchesPagesStaticPath(pathEntry, options.params, options.routeUrl));
171
241
  if (fallback === false && !isValidPath) return buildPagesNotFoundResult(options);
172
- if (fallback === true && !isValidPath && !options.isDataReq) isFallback = true;
242
+ const isBotRequest = !!options.userAgent && isBotUserAgent(options.userAgent, options.htmlLimitedBots);
243
+ if (fallback === true && !isValidPath && !options.isDataReq && !isBotRequest) isFallback = true;
244
+ shouldPersistFallbackData = fallback === true && !isValidPath && options.isDataReq === true;
173
245
  }
174
246
  let pageProps = {};
175
247
  let gsspRes = null;
176
- if (isFallback) return {
177
- kind: "render",
178
- gsspRes: null,
179
- isrRevalidateSeconds: null,
180
- pageProps,
181
- isFallback: true
182
- };
248
+ let sharedReqRes = null;
249
+ function getSharedReqRes() {
250
+ sharedReqRes ??= options.createGsspReqRes();
251
+ return sharedReqRes;
252
+ }
253
+ let renderProps = { pageProps };
254
+ async function loadForegroundAppInitialRenderProps() {
255
+ const result = await loadPagesAppInitialRenderProps(options, getSharedReqRes);
256
+ if (result.kind === "response") return {
257
+ kind: "response",
258
+ response: await result.response
259
+ };
260
+ renderProps = result.renderProps;
261
+ pageProps = result.pageProps;
262
+ return null;
263
+ }
264
+ if (isFallback) {
265
+ const pathname = options.routeUrl.split("?")[0];
266
+ if ((await options.isrGet(options.isrCacheKey("pages", pathname)))?.value.value?.kind !== "PAGES") {
267
+ const appShortCircuit = await loadForegroundAppInitialRenderProps();
268
+ if (appShortCircuit) return appShortCircuit;
269
+ pageProps = {};
270
+ renderProps = {
271
+ ...renderProps,
272
+ pageProps
273
+ };
274
+ return {
275
+ kind: "render",
276
+ gsspRes: null,
277
+ isrRevalidateSeconds: null,
278
+ pageProps,
279
+ props: renderProps,
280
+ isFallback: true
281
+ };
282
+ }
283
+ }
183
284
  if (typeof options.pageModule.getServerSideProps === "function") {
184
- const { req, res, responsePromise } = options.createGsspReqRes();
285
+ const shortCircuit = await loadForegroundAppInitialRenderProps();
286
+ if (shortCircuit) return shortCircuit;
287
+ renderProps = {
288
+ ...renderProps,
289
+ __N_SSP: true
290
+ };
291
+ const { req, res, responsePromise } = getSharedReqRes();
185
292
  const result = await options.pageModule.getServerSideProps({
186
293
  params: userFacingParams,
187
294
  req,
188
295
  res,
189
296
  query: options.query,
190
- resolvedUrl: options.routeUrl,
297
+ resolvedUrl: options.resolvedUrl ?? options.routeUrl,
191
298
  locale: options.i18n.locale,
192
299
  locales: options.i18n.locales,
193
300
  defaultLocale: options.i18n.defaultLocale
@@ -196,10 +303,19 @@ async function resolvePagesPageData(options) {
196
303
  kind: "response",
197
304
  response: await responsePromise
198
305
  };
199
- if (result?.props) pageProps = await Promise.resolve(result.props);
306
+ if (result?.props) {
307
+ pageProps = {
308
+ ...pageProps,
309
+ ...await Promise.resolve(result.props)
310
+ };
311
+ renderProps = {
312
+ ...renderProps,
313
+ pageProps
314
+ };
315
+ }
200
316
  if (result?.redirect) return {
201
317
  kind: "response",
202
- response: buildPagesRedirectResponse(result.redirect, options)
318
+ response: buildPagesRedirectResponse(result.redirect, options, renderProps)
203
319
  };
204
320
  if (result?.notFound) return buildPagesNotFoundResult(options);
205
321
  if (result?.props !== void 0) isSerializableProps(options.routePattern, "getServerSideProps", pageProps);
@@ -211,7 +327,7 @@ async function resolvePagesPageData(options) {
211
327
  const cacheKey = options.isrCacheKey("pages", pathname);
212
328
  const cached = await options.isrGet(cacheKey);
213
329
  const cachedValue = cached?.value.value;
214
- if (!options.isOnDemandRevalidate && cachedValue?.kind === "PAGES" && cached && !cached.isStale && !options.scriptNonce && !options.isDataReq) {
330
+ if (!options.isOnDemandRevalidate && cached?.isStale === false && cachedValue?.kind === "PAGES" && !cachedValue.generatedFromDataRequest && cached && !cached.isStale && !options.scriptNonce && !options.isDataReq) {
215
331
  const hitResponse = buildPagesCacheResponse(cachedValue.html, "HIT", options.fontLinkHeader, void 0, options.expireSeconds, cached.value.cacheControl, cachedValue.status);
216
332
  const hitBotResult = applyBotETagAndCheck(hitResponse, cachedValue.html, options);
217
333
  if (hitBotResult) return hitBotResult;
@@ -220,9 +336,14 @@ async function resolvePagesPageData(options) {
220
336
  response: hitResponse
221
337
  };
222
338
  }
223
- if (!options.isOnDemandRevalidate && cachedValue?.kind === "PAGES" && cached && cached.isStale && !options.scriptNonce && !options.isDataReq) {
339
+ if (!options.isOnDemandRevalidate && cachedValue?.kind === "PAGES" && !cachedValue.generatedFromDataRequest && cached && cached.isStale && !options.scriptNonce && !options.isDataReq) {
224
340
  options.triggerBackgroundRegeneration(cacheKey, async function() {
225
341
  return options.runInFreshUnifiedContext(async () => {
342
+ options.applyRequestContexts();
343
+ const freshAppResult = await loadPagesAppInitialRenderProps(options, () => options.createGsspReqRes());
344
+ if (freshAppResult.kind === "response") return;
345
+ let freshPageProps = freshAppResult.pageProps;
346
+ let freshRenderProps = freshAppResult.renderProps;
226
347
  const freshResult = await options.pageModule.getStaticProps?.({
227
348
  params: userFacingParams,
228
349
  locale: options.i18n.locale,
@@ -230,14 +351,25 @@ async function resolvePagesPageData(options) {
230
351
  defaultLocale: options.i18n.defaultLocale,
231
352
  revalidateReason: "stale"
232
353
  });
233
- if (freshResult?.props && typeof freshResult.revalidate === "number" && freshResult.revalidate > 0) {
234
- options.applyRequestContexts();
354
+ if (freshResult?.props) {
355
+ freshPageProps = {
356
+ ...freshPageProps,
357
+ ...freshResult.props
358
+ };
359
+ freshRenderProps = {
360
+ ...freshRenderProps,
361
+ pageProps: freshPageProps
362
+ };
363
+ }
364
+ const freshRevalidateSeconds = typeof freshResult?.revalidate === "number" && freshResult.revalidate > 0 ? freshResult.revalidate : cached.value.cacheControl?.revalidate;
365
+ if (freshResult?.props && freshRevalidateSeconds && freshRevalidateSeconds > 0) {
235
366
  const freshHtml = await renderPagesIsrHtml({
236
367
  buildId: options.buildId,
237
368
  cachedHtml: cachedValue.html,
238
369
  createPageElement: options.createPageElement,
239
370
  i18n: options.i18n,
240
- pageProps: freshResult.props,
371
+ pageProps: freshPageProps,
372
+ props: freshRenderProps,
241
373
  params: options.params,
242
374
  renderIsrPassToStringAsync: options.renderIsrPassToStringAsync,
243
375
  routePattern: options.routePattern,
@@ -245,7 +377,7 @@ async function resolvePagesPageData(options) {
245
377
  nextData: options.nextData,
246
378
  vinext: options.vinext
247
379
  });
248
- await options.isrSet(cacheKey, buildPagesCacheValue(freshHtml, freshResult.props, options.statusCode), freshResult.revalidate, void 0, options.expireSeconds);
380
+ await options.isrSet(cacheKey, buildPagesCacheValue(freshHtml, freshRenderProps, options.statusCode), freshRevalidateSeconds, void 0, options.expireSeconds);
249
381
  }
250
382
  });
251
383
  }, {
@@ -261,24 +393,58 @@ async function resolvePagesPageData(options) {
261
393
  response: staleResponse
262
394
  };
263
395
  }
264
- const result = await options.pageModule.getStaticProps({
396
+ const generatedPageData = !options.isOnDemandRevalidate && cached?.isStale === false && cachedValue?.kind === "PAGES" && cachedValue.generatedFromDataRequest && isUnknownRecord(cachedValue.pageData) ? cachedValue.pageData : null;
397
+ if (!generatedPageData) {
398
+ const shortCircuit = await loadForegroundAppInitialRenderProps();
399
+ if (shortCircuit) return shortCircuit;
400
+ }
401
+ const result = generatedPageData ? null : await options.pageModule.getStaticProps({
265
402
  params: userFacingParams,
266
403
  locale: options.i18n.locale,
267
404
  locales: options.i18n.locales,
268
405
  defaultLocale: options.i18n.defaultLocale,
269
406
  revalidateReason: options.isOnDemandRevalidate ? "on-demand" : options.isBuildTimePrerendering ? "build" : "stale"
270
407
  });
271
- if (result?.props) pageProps = result.props;
408
+ if (generatedPageData) {
409
+ renderProps = generatedPageData;
410
+ pageProps = isUnknownRecord(renderProps.pageProps) ? renderProps.pageProps : {};
411
+ }
412
+ if (result?.props) {
413
+ pageProps = {
414
+ ...pageProps,
415
+ ...result.props
416
+ };
417
+ renderProps = {
418
+ ...renderProps,
419
+ pageProps
420
+ };
421
+ }
272
422
  if (result?.redirect) return {
273
423
  kind: "response",
274
- response: buildPagesRedirectResponse(result.redirect, options)
424
+ response: buildPagesRedirectResponse(result.redirect, options, renderProps)
275
425
  };
276
426
  if (result?.notFound) return buildPagesNotFoundResult(options);
277
427
  if (result?.props !== void 0) isSerializableProps(options.routePattern, "getStaticProps", pageProps);
278
428
  if (typeof result?.revalidate === "number" && result.revalidate > 0) isrRevalidateSeconds = result.revalidate;
429
+ else if (cachedValue?.kind === "PAGES" && cachedValue.generatedFromDataRequest) isrRevalidateSeconds = cached?.value.cacheControl?.revalidate ?? 31536e3;
430
+ if (shouldPersistFallbackData) {
431
+ const revalidateSeconds = isrRevalidateSeconds ?? 31536e3;
432
+ await options.isrSet(cacheKey, {
433
+ kind: "PAGES",
434
+ html: "",
435
+ pageData: renderProps,
436
+ generatedFromDataRequest: true,
437
+ headers: void 0,
438
+ status: void 0
439
+ }, revalidateSeconds, void 0, options.expireSeconds);
440
+ }
279
441
  }
280
- if (typeof options.pageModule.getServerSideProps !== "function" && typeof options.pageModule.getStaticProps !== "function" && hasPagesGetInitialProps(options.pageModule.default)) {
281
- const { req, res, responsePromise } = options.createGsspReqRes();
442
+ if (typeof options.pageModule.getServerSideProps !== "function" && typeof options.pageModule.getStaticProps !== "function" && hasPagesGetInitialProps(options.AppComponent)) {
443
+ const shortCircuit = await loadForegroundAppInitialRenderProps();
444
+ if (shortCircuit) return shortCircuit;
445
+ }
446
+ if (typeof options.pageModule.getServerSideProps !== "function" && typeof options.pageModule.getStaticProps !== "function" && !hasPagesGetInitialProps(options.AppComponent) && hasPagesGetInitialProps(options.pageModule.default)) {
447
+ const { req, res, responsePromise } = getSharedReqRes();
282
448
  const initialProps = await loadPagesGetInitialProps(options.pageModule.default, {
283
449
  req,
284
450
  res,
@@ -294,16 +460,23 @@ async function resolvePagesPageData(options) {
294
460
  kind: "response",
295
461
  response: await responsePromise
296
462
  };
297
- if (initialProps) pageProps = {
298
- ...pageProps,
299
- ...initialProps
300
- };
463
+ if (initialProps) {
464
+ pageProps = {
465
+ ...pageProps,
466
+ ...initialProps
467
+ };
468
+ renderProps = {
469
+ ...renderProps,
470
+ pageProps
471
+ };
472
+ }
301
473
  }
302
474
  return {
303
475
  kind: "render",
304
476
  gsspRes,
305
477
  isrRevalidateSeconds,
306
478
  pageProps,
479
+ props: renderProps,
307
480
  isFallback: false
308
481
  };
309
482
  }
@@ -31,6 +31,7 @@ type VinextConfigSubset = {
31
31
  assetPrefix: string;
32
32
  trailingSlash: boolean;
33
33
  expireTime?: number;
34
+ htmlLimitedBots?: string;
34
35
  clientTraceMetadata?: readonly string[];
35
36
  disableOptimizedLoading: boolean;
36
37
  };
@@ -73,8 +74,8 @@ type CreatePagesPageHandlerOptions = {
73
74
  renderIsrPassToStringAsync: (element: ReactNode) => Promise<string>; /** `safeJsonStringify` from `vinext/html`. */
74
75
  safeJsonStringify: (value: unknown) => string; /** `sanitizeDestination` from the config-matchers module. */
75
76
  sanitizeDestination: (dest: string) => string; /** Build the React page element for a given set of page props. */
76
- createPageElement: (PageComponent: ComponentType, AppComponent: ComponentType | null, pageProps: Record<string, unknown>) => ReactNode; /** Build the element with optional App/Component enhancers (for _document). */
77
- enhancePageElement: (PageComponent: ComponentType, AppComponent: ComponentType | null, pageProps: Record<string, unknown>, opts: RenderPageEnhancers) => ReactNode; /** The `_app` page component (or null). */
77
+ createPageElement: (PageComponent: ComponentType, AppComponent: ComponentType | null, props: Record<string, unknown>) => ReactNode; /** Build the element with optional App/Component enhancers (for _document). */
78
+ enhancePageElement: (PageComponent: ComponentType, AppComponent: ComponentType | null, props: Record<string, unknown>, opts: RenderPageEnhancers) => ReactNode; /** The `_app` page component (or null). */
78
79
  AppComponent: ComponentType | null; /** The `_document` page component (or null). */
79
80
  DocumentComponent: ComponentType | null;
80
81
  };
@@ -82,6 +83,7 @@ type RenderPageOptions = {
82
83
  isDataReq?: boolean;
83
84
  statusCode?: number;
84
85
  asPath?: string;
86
+ originalUrl?: string;
85
87
  renderErrorPageOnMiss?: boolean;
86
88
  __isInternalErrorRender?: boolean;
87
89
  __forcedRoute?: PageRoute;
@@ -7,13 +7,14 @@ import { NEVER_CACHE_CONTROL } from "./cache-control.js";
7
7
  import "./isr-decision.js";
8
8
  import { PRERENDER_REVALIDATE_HEADER, isOnDemandRevalidateRequest, isrCacheKey, isrGet, isrSet, triggerBackgroundRegeneration } from "./isr-cache.js";
9
9
  import { ensureFetchPatch } from "../shims/fetch-cache.js";
10
+ import { appendAssetDeploymentIdQuery } from "../utils/deployment-id.js";
10
11
  import { mergeRouteParamsIntoQuery, parseQueryString } from "../utils/query.js";
11
12
  import { getScriptNonceFromHeaderSources } from "./csp.js";
12
13
  import { resolvePagesI18nRequest } from "./pages-i18n.js";
13
14
  import { buildDefaultPagesNotFoundResponse } from "./pages-default-404.js";
14
15
  import { buildPagesReadinessNextData } from "./pages-readiness.js";
15
16
  import { resolvePagesPageMethodResponse } from "./pages-page-method.js";
16
- import { buildNextDataJsonResponse, buildNextDataNotFoundResponse, normalizePagesDataRequest } from "./pages-data-route.js";
17
+ import { buildNextDataNotFoundResponse, buildNextDataPropsJsonResponse, normalizePagesDataRequest, parseNextDataPathname } from "./pages-data-route.js";
17
18
  import { createPagesReqRes } from "./pages-node-compat.js";
18
19
  import { collectAssetTags, resolveClientModuleUrl } from "./pages-asset-tags.js";
19
20
  import { renderPagesPageResponse } from "./pages-page-response.js";
@@ -48,19 +49,38 @@ function createPagesPageHandler(opts) {
48
49
  }
49
50
  async function renderPage(request, url, manifest, middlewareHeaders, options) {
50
51
  let isDataReq = !!(options && options.isDataReq);
52
+ const requestUrl = new URL(request.url);
53
+ const rawOriginalUrl = options && typeof options.originalUrl === "string" ? options.originalUrl : requestUrl.pathname + requestUrl.search;
54
+ const originalRequestUrl = new URL(rawOriginalUrl, requestUrl);
55
+ const originalRequestPathAndSearch = originalRequestUrl.pathname + originalRequestUrl.search;
56
+ let dataRequestPathname = null;
57
+ let dataRequestSearch = "";
58
+ const initialDataNorm = normalizePagesDataRequest(request, buildId);
51
59
  if (!isDataReq) {
52
- const dataNorm = normalizePagesDataRequest(request, buildId);
53
- if (dataNorm.notFoundResponse) return dataNorm.notFoundResponse;
54
- if (dataNorm.isDataReq) {
60
+ if (initialDataNorm.notFoundResponse) return initialDataNorm.notFoundResponse;
61
+ if (initialDataNorm.isDataReq) {
55
62
  isDataReq = true;
63
+ dataRequestPathname = initialDataNorm.normalizedPathname;
64
+ dataRequestSearch = initialDataNorm.search;
56
65
  if (url && url.startsWith("/_next/data/")) {
57
66
  const qs = url.includes("?") ? url.slice(url.indexOf("?")) : "";
58
- url = dataNorm.normalizedPathname + qs;
67
+ url = initialDataNorm.normalizedPathname + qs;
59
68
  }
60
69
  }
70
+ } else if (initialDataNorm.isDataReq) {
71
+ dataRequestPathname = initialDataNorm.normalizedPathname;
72
+ dataRequestSearch = initialDataNorm.search;
73
+ }
74
+ if (isDataReq && dataRequestPathname === null && buildId) {
75
+ const originalDataMatch = parseNextDataPathname(originalRequestUrl.pathname, buildId);
76
+ if (originalDataMatch) {
77
+ dataRequestPathname = originalDataMatch.pagePathname;
78
+ dataRequestSearch = originalRequestUrl.search;
79
+ }
61
80
  }
62
81
  const statusCode = options && typeof options.statusCode === "number" ? options.statusCode : void 0;
63
- const asPath = options && typeof options.asPath === "string" ? options.asPath : void 0;
82
+ const defaultAsPath = isDataReq && dataRequestPathname ? dataRequestPathname + dataRequestSearch : originalRequestPathAndSearch;
83
+ const asPath = options && typeof options.asPath === "string" ? options.asPath : defaultAsPath;
64
84
  const renderErrorPageOnMiss = !(options && options.renderErrorPageOnMiss === false);
65
85
  const isInternalErrorRender = !!(options && options.__isInternalErrorRender);
66
86
  const err = options && options.err;
@@ -143,8 +163,8 @@ function createPagesPageHandler(opts) {
143
163
  });
144
164
  if (methodResponse) return methodResponse;
145
165
  }
146
- const pageModuleUrl = resolveClientModuleUrl(manifest, route.filePath, vinextConfig.basePath, vinextConfig.assetPrefix);
147
- const appModuleUrl = resolveClientModuleUrl(manifest, appAssetPath, vinextConfig.basePath, vinextConfig.assetPrefix);
166
+ const pageModuleUrl = resolveClientModuleUrl(manifest, route.filePath, vinextConfig.basePath, vinextConfig.assetPrefix, process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID);
167
+ const appModuleUrl = resolveClientModuleUrl(manifest, appAssetPath, vinextConfig.basePath, vinextConfig.assetPrefix, process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID);
148
168
  const serializedPagesNextData = {
149
169
  ...pagesNextData,
150
170
  __vinext: {
@@ -159,24 +179,30 @@ function createPagesPageHandler(opts) {
159
179
  let allFontPreloads = [];
160
180
  try {
161
181
  allFontPreloads = getFontPreloads();
162
- if (allFontPreloads.length > 0) fontLinkHeader = allFontPreloads.map((p) => "<" + p.href + ">; rel=preload; as=font; type=" + p.type + "; crossorigin").join(", ");
182
+ if (allFontPreloads.length > 0) fontLinkHeader = allFontPreloads.map((p) => "<" + appendAssetDeploymentIdQuery(p.href) + ">; rel=preload; as=font; type=" + p.type + "; crossorigin").join(", ");
163
183
  } catch {}
184
+ const pagesResolvedUrl = (new URL(routeUrl, originalRequestUrl).pathname || "/") + originalRequestUrl.search;
164
185
  const pageDataResult = await resolvePagesPageData({
165
186
  isDataReq,
166
- err,
187
+ err: err instanceof Error ? err : void 0,
167
188
  applyRequestContexts: applySSRContext,
168
189
  buildId,
169
190
  deploymentId: process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID,
191
+ htmlLimitedBots: vinextConfig.htmlLimitedBots,
170
192
  createGsspReqRes() {
171
193
  return createPagesReqRes({
172
194
  body: void 0,
173
195
  query,
174
196
  request,
175
- url: routeUrl
197
+ url: originalRequestPathAndSearch
176
198
  });
177
199
  },
178
- createPageElement(currentPageProps) {
179
- const el = createPageElement(PageComponent, AppComponent, currentPageProps);
200
+ createAppTree(appTreeProps) {
201
+ const el = createPageElement(PageComponent, AppComponent, appTreeProps);
202
+ return typeof wrapWithRouterContext === "function" ? wrapWithRouterContext(el) : el;
203
+ },
204
+ createPageElement(currentProps) {
205
+ const el = createPageElement(PageComponent, AppComponent, currentProps);
180
206
  return typeof wrapWithRouterContext === "function" ? wrapWithRouterContext(el) : el;
181
207
  },
182
208
  fontLinkHeader,
@@ -188,15 +214,17 @@ function createPagesPageHandler(opts) {
188
214
  isBuildTimePrerendering: typeof process !== "undefined" && process.env && process.env.VINEXT_PRERENDER === "1",
189
215
  isOnDemandRevalidate: isOnDemandRevalidateRequest(request.headers.get(PRERENDER_REVALIDATE_HEADER)),
190
216
  pageModule,
217
+ AppComponent,
191
218
  params,
192
219
  query,
193
220
  asPath: renderAsPath ?? routeUrl,
221
+ resolvedUrl: pagesResolvedUrl,
194
222
  renderIsrPassToStringAsync,
195
223
  route: { isDynamic: route.isDynamic },
196
224
  routePattern,
197
225
  routeUrl,
198
226
  runInFreshUnifiedContext(callback) {
199
- return runWithRequestContext(createRequestContext({ executionContext: getRequestExecutionContext() }), async () => {
227
+ return runWithRequestContext(createRequestContext({ executionContext: null }), async () => {
200
228
  ensureFetchPatch();
201
229
  return callback();
202
230
  });
@@ -224,10 +252,17 @@ function createPagesPageHandler(opts) {
224
252
  }
225
253
  if (pageDataResult.kind === "response") return pageDataResult.response;
226
254
  let pageProps = pageDataResult.pageProps;
227
- if (routePattern === "/_error" && typeof renderStatusCode === "number") pageProps = {
228
- ...pageProps,
229
- statusCode: renderStatusCode
230
- };
255
+ let renderProps = pageDataResult.props;
256
+ if (routePattern === "/_error" && typeof renderStatusCode === "number") {
257
+ pageProps = {
258
+ ...pageProps,
259
+ statusCode: renderStatusCode
260
+ };
261
+ renderProps = {
262
+ ...renderProps,
263
+ pageProps
264
+ };
265
+ }
231
266
  const gsspRes = pageDataResult.gsspRes;
232
267
  const isrRevalidateSeconds = pageDataResult.isrRevalidateSeconds;
233
268
  const isFallbackRender = pageDataResult.isFallback === true;
@@ -264,7 +299,7 @@ function createPagesPageHandler(opts) {
264
299
  const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
265
300
  if (deploymentId) init.headers[NEXTJS_DEPLOYMENT_ID_HEADER] = deploymentId;
266
301
  }
267
- return buildNextDataJsonResponse(pageProps, safeJsonStringify, init);
302
+ return buildNextDataPropsJsonResponse(renderProps, safeJsonStringify, init);
268
303
  }
269
304
  const pageModuleIds = [];
270
305
  if (route.filePath) pageModuleIds.push(route.filePath);
@@ -276,21 +311,23 @@ function createPagesPageHandler(opts) {
276
311
  scriptNonce,
277
312
  disableOptimizedLoading: vinextConfig.disableOptimizedLoading,
278
313
  basePath: vinextConfig.basePath,
279
- assetPrefix: vinextConfig.assetPrefix
314
+ assetPrefix: vinextConfig.assetPrefix,
315
+ deploymentId: process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID
280
316
  }),
281
317
  buildId,
282
318
  clearSsrContext() {
283
319
  if (typeof setSSRContext === "function") setSSRContext(null);
284
320
  },
285
- createPageElement(currentPageProps) {
286
- const el = createPageElement(PageComponent, AppComponent, currentPageProps);
321
+ createPageElement(currentProps) {
322
+ const el = createPageElement(PageComponent, AppComponent, currentProps);
287
323
  return typeof wrapWithRouterContext === "function" ? wrapWithRouterContext(el) : el;
288
324
  },
289
325
  enhancePageElement(renderPageOpts) {
290
- const el = enhancePageElement(PageComponent, AppComponent, pageProps, renderPageOpts);
326
+ const el = enhancePageElement(PageComponent, AppComponent, renderProps, renderPageOpts);
291
327
  return typeof wrapWithRouterContext === "function" ? wrapWithRouterContext(el) : el;
292
328
  },
293
329
  DocumentComponent,
330
+ err: err instanceof Error ? err : void 0,
294
331
  flushPreloads: typeof flushPreloads === "function" ? flushPreloads : void 0,
295
332
  fontLinkHeader,
296
333
  fontPreloads: allFontPreloads,
@@ -306,7 +343,9 @@ function createPagesPageHandler(opts) {
306
343
  i18n: buildI18nRenderContext(i18nConfig, locale, currentDefaultLocale, domainLocales),
307
344
  isFallback: isFallbackRender,
308
345
  pageProps,
346
+ props: renderProps,
309
347
  params,
348
+ query,
310
349
  renderDocumentToString(element) {
311
350
  return renderToStringAsync(element);
312
351
  },
@@ -66,6 +66,7 @@ type RenderPagesPageResponseOptions = {
66
66
  */
67
67
  enhancePageElement?: ((opts: RenderPageEnhancers) => ReactNode) | undefined;
68
68
  DocumentComponent: ComponentType | null;
69
+ err?: Error;
69
70
  flushPreloads?: (() => Promise<void> | void) | undefined;
70
71
  fontLinkHeader: string;
71
72
  fontPreloads: PagesFontPreload[];
@@ -93,7 +94,9 @@ type RenderPagesPageResponseOptions = {
93
94
  */
94
95
  isFallback?: boolean;
95
96
  pageProps: Record<string, unknown>;
97
+ props?: Record<string, unknown>;
96
98
  params: Record<string, unknown>;
99
+ query?: Record<string, unknown>;
97
100
  renderDocumentToString: (element: ReactNode) => Promise<string>;
98
101
  renderToReadableStream: (element: ReactNode) => Promise<ReadableStream<Uint8Array>>;
99
102
  resetSSRHead?: (() => void) | undefined;
@@ -127,7 +130,7 @@ type RenderPagesPageResponseOptions = {
127
130
  */
128
131
  requestCacheControl?: string;
129
132
  };
130
- declare function buildPagesNextDataScript(options: Pick<RenderPagesPageResponseOptions, "buildId" | "i18n" | "isFallback" | "pageProps" | "params" | "routePattern" | "safeJsonStringify" | "scriptNonce" | "nextData"> & {
133
+ declare function buildPagesNextDataScript(options: Pick<RenderPagesPageResponseOptions, "buildId" | "i18n" | "isFallback" | "pageProps" | "props" | "params" | "routePattern" | "safeJsonStringify" | "scriptNonce" | "nextData"> & {
131
134
  vinext?: VinextNextData["__vinext"];
132
135
  }): string;
133
136
  declare function renderPagesPageResponse(options: RenderPagesPageResponseOptions): Promise<Response>;