vinext 1.0.0-beta.0 → 1.0.0-beta.2

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