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,8 +1,10 @@
1
1
  import { createRequestContext, runWithRequestContext } from "../shims/unified-request-context.js";
2
+ import path from "../deps/.pnpm/pathslash@0.1.0/deps/pathslash/dist/index.js";
2
3
  import { createValidFileMatcher, findFileWithExtensions, findFileWithExts } from "../routing/file-matcher.js";
3
4
  import { patternToNextFormat } from "../routing/route-validation.js";
4
5
  import { matchRoute } from "../routing/pages-router.js";
5
6
  import { NEXTJS_DEPLOYMENT_ID_HEADER } from "./headers.js";
7
+ import { isDangerousScheme } from "../shims/url-safety.js";
6
8
  import { importModule, reportRequestError } from "./instrumentation.js";
7
9
  import { buildCacheStateHeaders } from "./cache-headers.js";
8
10
  import { isUnknownRecord } from "../utils/record.js";
@@ -32,9 +34,10 @@ import { isSerializableProps } from "./pages-serializable-props.js";
32
34
  import { isBotUserAgent } from "../utils/html-limited-bots.js";
33
35
  import { getPagesRouteParams, matchesPagesStaticPath } from "./pages-page-data.js";
34
36
  import { createPagesDevAssetUrl, createPagesDevModuleUrl } from "./pages-dev-module-url.js";
37
+ import { createPagesDevHydrationScript } from "./pages-dev-hydration.js";
35
38
  import { getManifestFilesForModule } from "./pages-asset-tags.js";
36
- import { attachPagesRequestCookies, getPagesPreviewDataFromCookieHeader } from "./pages-node-compat.js";
37
- import path from "node:path";
39
+ import { PAGES_PREVIEW_CACHE_CONTROL, appendPagesPreviewClearCookies, getPagesPreviewState } from "./pages-preview.js";
40
+ import { attachPagesRequestCookies } from "./pages-node-compat.js";
38
41
  import React from "react";
39
42
  import { renderToReadableStream } from "react-dom/server.edge";
40
43
  //#region src/server/dev-server.ts
@@ -50,10 +53,37 @@ async function renderToStringAsync(element) {
50
53
  await stream.allReady;
51
54
  return new Response(stream).text();
52
55
  }
56
+ function applyDevPagesPreviewHeaders(headers, preview) {
57
+ const removeHeader = (name) => {
58
+ for (const key of Object.keys(headers)) if (key.toLowerCase() === name) delete headers[key];
59
+ };
60
+ if (preview.data !== false) {
61
+ removeHeader("cache-control");
62
+ headers["Cache-Control"] = PAGES_PREVIEW_CACHE_CONTROL;
63
+ }
64
+ if (preview.shouldClear) {
65
+ const clearHeaders = new Headers();
66
+ for (const [key, value] of Object.entries(headers)) {
67
+ if (key.toLowerCase() !== "set-cookie") continue;
68
+ if (Array.isArray(value)) for (const cookie of value) clearHeaders.append("Set-Cookie", String(cookie));
69
+ else clearHeaders.append("Set-Cookie", String(value));
70
+ delete headers[key];
71
+ }
72
+ appendPagesPreviewClearCookies(clearHeaders);
73
+ headers["Set-Cookie"] = clearHeaders.getSetCookie();
74
+ }
75
+ }
76
+ function applyDevPagesPreviewResponse(res, preview) {
77
+ const headers = res.getHeaders();
78
+ applyDevPagesPreviewHeaders(headers, preview);
79
+ for (const [name, value] of Object.entries(headers)) res.setHeader(name, value);
80
+ }
53
81
  async function renderIsrPassToStringAsync(element) {
54
82
  return await runWithServerInsertedHTMLState(() => runWithHeadState(() => _runWithCacheState(() => runWithPrivateCache(() => runWithFetchCache(async () => renderToStringAsync(element))))));
55
83
  }
56
84
  const DEV_STYLESHEET_ASSET_RE = /\.(?:css|scss|sass)$/i;
85
+ const transformedStylesheetAssetsCache = /* @__PURE__ */ new WeakMap();
86
+ const transformedStylesheetAssetsWatchers = /* @__PURE__ */ new WeakSet();
57
87
  function createDevInitialStylesheetHeadHTML(options) {
58
88
  const { ssrManifest, moduleIds, nonceAttr } = options;
59
89
  if (!ssrManifest || moduleIds.length === 0) return "";
@@ -71,16 +101,64 @@ function createDevInitialStylesheetHeadHTML(options) {
71
101
  }
72
102
  return html;
73
103
  }
74
- async function collectDevInitialStylesheetHeadHTML(runner, moduleIds, nonceAttr) {
104
+ async function collectTransformedStylesheetAssets(server, moduleIds) {
105
+ const clientEnvironment = server.environments.client;
106
+ if (!clientEnvironment) return [];
107
+ const cachedServerAssets = transformedStylesheetAssetsCache.get(server);
108
+ const cache = cachedServerAssets ?? /* @__PURE__ */ new Map();
109
+ if (!cachedServerAssets) transformedStylesheetAssetsCache.set(server, cache);
110
+ if (!transformedStylesheetAssetsWatchers.has(server)) {
111
+ transformedStylesheetAssetsWatchers.add(server);
112
+ const clearCache = () => cache.clear();
113
+ server.watcher.on("add", clearCache);
114
+ server.watcher.on("change", clearCache);
115
+ server.watcher.on("unlink", clearCache);
116
+ }
117
+ const cacheKey = moduleIds.filter((moduleId) => Boolean(moduleId)).join("\0");
118
+ const cachedAssets = cache.get(cacheKey);
119
+ if (cachedAssets) return cachedAssets;
120
+ const assets = /* @__PURE__ */ new Set();
121
+ const seenModules = /* @__PURE__ */ new Set();
122
+ async function visitModule(moduleUrl) {
123
+ if (seenModules.has(moduleUrl)) return;
124
+ seenModules.add(moduleUrl);
125
+ try {
126
+ await clientEnvironment.transformRequest(moduleUrl);
127
+ const moduleNode = await clientEnvironment.moduleGraph.getModuleByUrl(moduleUrl);
128
+ if (!moduleNode) return;
129
+ for (const importedModule of moduleNode.importedModules) if (importedModule.type === "css" || /\.(?:css|scss|sass)(?:$|[?#])/i.test(importedModule.url)) {
130
+ if (importedModule.url.startsWith("//")) continue;
131
+ const assetUrl = importedModule.url.startsWith("\0") ? `/@id/__x00__${importedModule.url.slice(1)}${importedModule.url.includes("?") ? "&" : "?"}direct` : importedModule.url;
132
+ assets.add(assetUrl);
133
+ } else if (importedModule.type === "js") await visitModule(importedModule.url);
134
+ } catch {}
135
+ }
136
+ for (const moduleId of moduleIds) {
137
+ if (!moduleId) continue;
138
+ await visitModule(createPagesDevModuleUrl(server.config.root, moduleId, "/"));
139
+ }
140
+ const result = [...assets];
141
+ cache.set(cacheKey, result);
142
+ return result;
143
+ }
144
+ async function collectDevInitialStylesheetHeadHTML(server, runner, moduleIds, nonceAttr) {
145
+ let manifestHTML = "";
75
146
  try {
76
- return createDevInitialStylesheetHeadHTML({
147
+ manifestHTML = createDevInitialStylesheetHeadHTML({
77
148
  ssrManifest: (await runner.import("virtual:vinext-pages-client-assets")).default?.ssrManifest,
78
149
  moduleIds,
79
150
  nonceAttr
80
151
  });
81
- } catch {
82
- return "";
152
+ } catch {}
153
+ const transformedAssets = await collectTransformedStylesheetAssets(server, moduleIds);
154
+ if (transformedAssets.length === 0) return manifestHTML;
155
+ let html = manifestHTML;
156
+ for (const asset of transformedAssets) {
157
+ const href = asset.startsWith("/") ? asset : createPagesDevAssetUrl(asset);
158
+ if (html.includes(`href="${escapeHtmlAttr(href)}"`)) continue;
159
+ html += `<link rel="stylesheet"${nonceAttr} href="${escapeHtmlAttr(href)}" />\n `;
83
160
  }
161
+ return html;
84
162
  }
85
163
  /**
86
164
  * Emit a `getServerSideProps` / `getStaticProps` `{ redirect }` result.
@@ -98,6 +176,17 @@ function writeGsspRedirect(res, redirect, isDataReq, props) {
98
176
  const status = redirect.statusCode ?? (redirect.permanent ? 308 : 307);
99
177
  let dest = redirect.destination;
100
178
  if (!dest.startsWith("http://") && !dest.startsWith("https://")) dest = dest.replace(/^[\\/]+/, "/");
179
+ if (isDangerousScheme(dest)) {
180
+ const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
181
+ const headers = {
182
+ "Cache-Control": "private, no-cache, no-store, max-age=0, must-revalidate",
183
+ "Content-Type": "text/plain; charset=utf-8"
184
+ };
185
+ if (deploymentId) headers[NEXTJS_DEPLOYMENT_ID_HEADER] = deploymentId;
186
+ res.writeHead(500, headers);
187
+ res.end("Invalid redirect destination");
188
+ return;
189
+ }
101
190
  if (isDataReq) {
102
191
  const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
103
192
  const dataHeaders = { "Content-Type": "application/json" };
@@ -288,7 +377,10 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
288
377
  res.end("{}");
289
378
  return;
290
379
  }
291
- await renderErrorPage(server, runner, req, res, url, pagesDir, 404, void 0, matcher);
380
+ await runWithRequestContext(createRequestContext(), async () => {
381
+ await _alsRegistration;
382
+ await renderErrorPage(server, runner, req, res, url, pagesDir, 404, void 0, matcher, void 0, reactStrictMode);
383
+ });
292
384
  return;
293
385
  }
294
386
  const { route, params } = match;
@@ -296,9 +388,9 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
296
388
  const parsedResolvedUrl = new URL(localeStrippedUrl, "http://vinext.local");
297
389
  const originalRequestSearch = new URL(originalUrl, "http://vinext.local").search;
298
390
  const gsspResolvedUrl = parsedResolvedUrl.pathname + originalRequestSearch;
299
- const requestAsPath = isDataReq ? gsspResolvedUrl : originalUrl;
391
+ let requestAsPath = isDataReq ? gsspResolvedUrl : i18nConfig ? extractLocaleFromUrl$1(originalUrl, i18nConfig, locale).url : originalUrl;
300
392
  const userFacingParams = route.isDynamic ? params : null;
301
- const query = mergeRouteParamsIntoQuery(parseQueryString(url), params);
393
+ let query = mergeRouteParamsIntoQuery(parseQueryString(url), params);
302
394
  return runWithRequestContext(createRequestContext(), async () => {
303
395
  ensureFetchPatch();
304
396
  try {
@@ -316,17 +408,30 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
316
408
  });
317
409
  }
318
410
  const pageModule = await importModule(runner, route.filePath);
411
+ const isStaticPropsRender = typeof pageModule.getStaticProps === "function" && typeof pageModule.getServerSideProps !== "function";
412
+ if (isStaticPropsRender) {
413
+ query = mergeRouteParamsIntoQuery({}, params);
414
+ requestAsPath = localeStrippedUrl.split("?")[0];
415
+ }
416
+ const requestPreview = typeof pageModule.getStaticProps === "function" || typeof pageModule.getServerSideProps === "function" ? getPagesPreviewState(req.headers.cookie, { isOnDemandRevalidate: isOnDemandRevalidateRequest(req.headers[PRERENDER_REVALIDATE_HEADER]) }) : {
417
+ data: false,
418
+ shouldClear: false
419
+ };
420
+ const requestPreviewData = requestPreview.data;
319
421
  let AppComponent = null;
320
422
  const appPath = path.join(pagesDir, "_app");
321
423
  if (findFileWithExtensions(appPath, matcher)) try {
322
424
  AppComponent = (await importModule(runner, appPath)).default ?? null;
323
425
  } catch {}
324
- const pagesNextData = buildPagesReadinessNextData({
325
- pageModule,
326
- appComponent: AppComponent,
327
- hasRewrites
328
- });
329
- const navigationIsReady = typeof routerShim.getPagesNavigationIsReadyFromSerializedState === "function" ? routerShim.getPagesNavigationIsReadyFromSerializedState(patternToNextFormat(route.pattern), new URL(url, "http://_").search, pagesNextData) : true;
426
+ const pagesNextData = {
427
+ ...buildPagesReadinessNextData({
428
+ pageModule,
429
+ appComponent: AppComponent,
430
+ hasRewrites
431
+ }),
432
+ ...requestPreviewData === false ? {} : { isPreview: true }
433
+ };
434
+ const navigationIsReady = isStaticPropsRender ? false : typeof routerShim.getPagesNavigationIsReadyFromSerializedState === "function" ? routerShim.getPagesNavigationIsReadyFromSerializedState(patternToNextFormat(route.pattern), new URL(url, "http://_").search, pagesNextData) : true;
330
435
  if (typeof routerShim.setSSRContext === "function") routerShim.setSSRContext({
331
436
  pathname: patternToNextFormat(route.pattern),
332
437
  query,
@@ -336,7 +441,8 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
336
441
  locale: locale ?? currentDefaultLocale,
337
442
  locales: i18nConfig?.locales,
338
443
  defaultLocale: currentDefaultLocale,
339
- domainLocales
444
+ domainLocales,
445
+ isPreview: requestPreviewData !== false
340
446
  });
341
447
  _compileEnd = now();
342
448
  const PageComponent = pageModule.default;
@@ -365,10 +471,11 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
365
471
  }
366
472
  let pageProps = {};
367
473
  let renderProps = { pageProps };
474
+ if (requestPreviewData !== false) renderProps.__N_PREVIEW = true;
368
475
  let isrRevalidateSeconds = null;
369
476
  let isFallbackRender = false;
370
477
  let shouldPersistFallbackData = false;
371
- let staticPropsPreviewData = false;
478
+ let staticPropsPreviewData = requestPreviewData;
372
479
  if (typeof pageModule.getStaticPaths === "function" && route.isDynamic) {
373
480
  const pathsResult = await pageModule.getStaticPaths({
374
481
  locales: i18nConfig?.locales ?? [],
@@ -378,7 +485,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
378
485
  const paths = pathsResult?.paths ?? [];
379
486
  const routeParams = getPagesRouteParams(patternToNextFormat(route.pattern));
380
487
  const isValidPath = paths.some((pathEntry) => matchesPagesStaticPath(pathEntry, params, routeParams, url));
381
- if (fallback === false && !isValidPath) {
488
+ if (fallback === false && !isValidPath && requestPreviewData === false) {
382
489
  if (isDataReq) {
383
490
  const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
384
491
  const notFoundHeaders = { "Content-Type": "application/json" };
@@ -387,18 +494,18 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
387
494
  res.end("{}");
388
495
  return;
389
496
  }
390
- await renderErrorPage(server, runner, req, res, url, pagesDir, 404, routerShim.wrapWithRouterContext, matcher);
497
+ await renderErrorPage(server, runner, req, res, url, pagesDir, 404, routerShim.wrapWithRouterContext, matcher, void 0, reactStrictMode);
391
498
  return;
392
499
  }
393
500
  const userAgentHeader = req.headers["user-agent"];
394
501
  const userAgent = Array.isArray(userAgentHeader) ? userAgentHeader[0] : userAgentHeader;
395
502
  const isBotRequest = !!userAgent && isBotUserAgent(userAgent, htmlLimitedBots);
396
- if (fallback === true && !isValidPath && !isDataReq && !isBotRequest) {
503
+ if (fallback === true && !isValidPath && !isDataReq && !isBotRequest && requestPreviewData === false) {
397
504
  isFallbackRender = (await isrGet(pagesIsrCacheKey(url.split("?")[0])))?.value.value?.kind !== "PAGES";
398
505
  if (isFallbackRender && typeof routerShim.setSSRContext === "function") routerShim.setSSRContext({
399
506
  pathname: patternToNextFormat(route.pattern),
400
- query,
401
- asPath: requestAsPath,
507
+ query: {},
508
+ asPath: patternToNextFormat(route.pattern),
402
509
  navigationIsReady: false,
403
510
  locale: locale ?? currentDefaultLocale,
404
511
  locales: i18nConfig?.locales,
@@ -430,6 +537,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
430
537
  pathname: patternToNextFormat(route.pattern),
431
538
  query,
432
539
  asPath: requestAsPath,
540
+ router: routerShim.default,
433
541
  locale: locale ?? currentDefaultLocale,
434
542
  locales: i18nConfig?.locales,
435
543
  defaultLocale: currentDefaultLocale
@@ -438,6 +546,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
438
546
  if (appResult.kind === "render") {
439
547
  pageProps = appResult.pageProps;
440
548
  renderProps = appResult.renderProps;
549
+ if (requestPreviewData !== false) renderProps.__N_PREVIEW = true;
441
550
  }
442
551
  return false;
443
552
  }
@@ -448,7 +557,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
448
557
  __N_SSP: true
449
558
  };
450
559
  const headersBeforeGSSP = new Set(Object.keys(res.getHeaders()));
451
- const previewData = getPagesPreviewDataFromCookieHeader(req.headers.cookie);
560
+ const previewData = requestPreviewData;
452
561
  const previewContext = previewData === false ? {} : {
453
562
  draftMode: true,
454
563
  preview: true,
@@ -482,6 +591,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
482
591
  return;
483
592
  }
484
593
  if (result && "notFound" in result && result.notFound) {
594
+ applyDevPagesPreviewResponse(res, requestPreview);
485
595
  if (isDataReq) {
486
596
  const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
487
597
  const notFoundHeaders = { "Content-Type": "application/json" };
@@ -490,7 +600,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
490
600
  res.end("{}");
491
601
  return;
492
602
  }
493
- await renderErrorPage(server, runner, req, res, url, pagesDir, 404, routerShim.wrapWithRouterContext);
603
+ await renderErrorPage(server, runner, req, res, url, pagesDir, 404, routerShim.wrapWithRouterContext, void 0, void 0, reactStrictMode);
494
604
  return;
495
605
  }
496
606
  if (result && "props" in result) isSerializableProps(patternToNextFormat(route.pattern), "getServerSideProps", pageProps);
@@ -519,7 +629,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
519
629
  const cacheKey = pagesIsrCacheKey(url.split("?")[0]);
520
630
  const cached = await isrGet(cacheKey);
521
631
  const isOnDemandRevalidate = isOnDemandRevalidateRequest(req.headers[PRERENDER_REVALIDATE_HEADER]);
522
- const previewData = getPagesPreviewDataFromCookieHeader(req.headers.cookie, { isOnDemandRevalidate });
632
+ const previewData = requestPreviewData;
523
633
  staticPropsPreviewData = previewData;
524
634
  const previewContext = previewData === false ? {} : {
525
635
  draftMode: true,
@@ -600,11 +710,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
600
710
  return typeof routerShim.wrapWithRouterContext === "function" ? routerShim.wrapWithRouterContext(appTree) : appTree;
601
711
  },
602
712
  Component: pageModule.default,
603
- router: {
604
- pathname: patternToNextFormat(route.pattern),
605
- query,
606
- asPath: requestAsPath
607
- },
713
+ router: routerShim.default,
608
714
  ctx: {
609
715
  req: regenReq,
610
716
  res: regenRes,
@@ -679,10 +785,11 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
679
785
  ...pagesNextData.__vinext,
680
786
  pageModuleUrl: regenPageUrl,
681
787
  appModuleUrl: regenAppUrl,
682
- hasMiddleware
788
+ hasMiddleware,
789
+ routeUrl: requestAsPath
683
790
  }
684
791
  };
685
- await isrSet(cacheKey, buildPagesCacheValue(`<!DOCTYPE html><html><head></head><body><div id="__next">${freshBody}</div>${`<script id="__NEXT_DATA__" type="application/json">${safeJsonStringify({
792
+ const freshHtml = `<!DOCTYPE html><html><head></head><body><div id="__next">${freshBody}</div>${`<script id="__NEXT_DATA__" type="application/json">${safeJsonStringify({
686
793
  props: freshRenderProps,
687
794
  page: patternToNextFormat(route.pattern),
688
795
  query: params,
@@ -693,7 +800,8 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
693
800
  defaultLocale: currentDefaultLocale,
694
801
  domainLocales,
695
802
  ...freshPagesNextData
696
- })}<\/script>`}\n ${cachedHtml.match(/<script type="module">[\s\S]*?<\/script>/)?.[0] ?? ""}</body></html>`, freshRenderProps), revalidate);
803
+ })}<\/script>`}\n ${cachedHtml.match(/<script type="module">[\s\S]*?<\/script>/)?.[0] ?? ""}</body></html>`;
804
+ await isrSet(cacheKey, buildPagesCacheValue(freshHtml, freshRenderProps), revalidate);
697
805
  setRevalidateDuration(cacheKey, revalidate);
698
806
  }
699
807
  }
@@ -748,6 +856,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
748
856
  return;
749
857
  }
750
858
  if (result && "notFound" in result && result.notFound) {
859
+ applyDevPagesPreviewResponse(res, requestPreview);
751
860
  if (isDataReq) {
752
861
  const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
753
862
  const notFoundHeaders = { "Content-Type": "application/json" };
@@ -756,7 +865,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
756
865
  res.end("{}");
757
866
  return;
758
867
  }
759
- await renderErrorPage(server, runner, req, res, url, pagesDir, 404, routerShim.wrapWithRouterContext);
868
+ await renderErrorPage(server, runner, req, res, url, pagesDir, 404, routerShim.wrapWithRouterContext, void 0, void 0, reactStrictMode);
760
869
  return;
761
870
  }
762
871
  if (result && "props" in result) isSerializableProps(patternToNextFormat(route.pattern), "getStaticProps", pageProps);
@@ -806,6 +915,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
806
915
  const dataHeaders = { "Content-Type": "application/json" };
807
916
  if ((statusCode ?? 200) === 200) dataHeaders["x-nextjs-matched-path"] = `${locale ? `/${locale}` : ""}${patternToNextFormat(route.pattern)}`;
808
917
  if (gsspExtraHeaders) for (const [k, v] of Object.entries(gsspExtraHeaders)) dataHeaders[k] = v;
918
+ applyDevPagesPreviewHeaders(dataHeaders, requestPreview);
809
919
  const dataRoutePattern = patternToNextFormat(route.pattern);
810
920
  if (dataRoutePattern !== "/_error" && dataRoutePattern !== "/500") {
811
921
  const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
@@ -833,7 +943,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
833
943
  if (typeof dynamicShim.flushPreloads === "function") await dynamicShim.flushPreloads();
834
944
  const nonceAttr = createNonceAttribute(scriptNonce);
835
945
  let fontHeadHTML = "";
836
- const assetHeadHTML = await collectDevInitialStylesheetHeadHTML(runner, [AppComponent ? findFileWithExts(pagesDir, "_app", matcher) : null, route.filePath], nonceAttr);
946
+ const assetHeadHTML = await collectDevInitialStylesheetHeadHTML(server, runner, [AppComponent ? findFileWithExts(pagesDir, "_app", matcher) : null, route.filePath], nonceAttr);
837
947
  const allFontStyles = [];
838
948
  const allFontPreloads = [];
839
949
  try {
@@ -871,84 +981,21 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
871
981
  ...pagesNextData.__vinext,
872
982
  pageModuleUrl,
873
983
  appModuleUrl,
874
- hasMiddleware
984
+ hasMiddleware,
985
+ routeUrl: requestAsPath
875
986
  }
876
987
  };
877
- const hydrationScript = `
878
- <script type="module"${nonceAttr}>
879
- import "vinext/instrumentation-client";
880
- import React from "react";
881
- import { hydrateRoot } from "react-dom/client";
882
- import Router, { wrapWithRouterContext, _initializePagesRouterReadyFromNextData } from "next/router";
883
-
884
- const nextDataElement = document.getElementById("__NEXT_DATA__");
885
- if (nextDataElement?.textContent) {
886
- window.__NEXT_DATA__ = JSON.parse(nextDataElement.textContent);
887
- window.__VINEXT_LOCALE__ = window.__NEXT_DATA__.locale;
888
- window.__VINEXT_LOCALES__ = window.__NEXT_DATA__.locales;
889
- window.__VINEXT_DEFAULT_LOCALE__ = window.__NEXT_DATA__.defaultLocale;
890
- }
891
- const nextData = window.__NEXT_DATA__;
892
- _initializePagesRouterReadyFromNextData(nextData);
893
- const props = nextData.props && typeof nextData.props === "object" ? nextData.props : {};
894
- const rawPageProps = props.pageProps;
895
- const pageProps = rawPageProps && typeof rawPageProps === "object" ? rawPageProps : {};
896
- window.__VINEXT_PAGE_LOADERS__ = { [nextData.page]: () => import("${pageModuleSource}") };
897
- window.__VINEXT_APP_LOADER__ = ${appModuleSource ? `() => import("${appModuleSource}")` : "undefined"};
898
- // reactStrictMode flag — read by wrapWithRouterContext so the <React.StrictMode>
899
- // wrap is applied on initial hydration and every navigation (matches Next.js).
900
- window.__VINEXT_REACT_STRICT_MODE__ = ${JSON.stringify(reactStrictMode === true)};
901
-
902
- async function hydrate() {
903
- let hydrateRootOptions;
904
- if (import.meta.env.DEV) {
905
- const overlay = await import("vinext/dev-error-overlay");
906
- overlay.installDevErrorOverlay();
907
- overlay.installViteHmrErrorHandler(import.meta.hot);
908
- overlay.reportInitialDevServerErrors();
909
- hydrateRootOptions = {
910
- onCaughtError: overlay.devOnCaughtError,
911
- onUncaughtError: overlay.devOnUncaughtError,
912
- };
913
- }
914
-
915
- const pageModule = await import("${pageModuleSource}");
916
- const PageComponent = pageModule.default;
917
- let element;
918
- ${appModuleSource ? `
919
- const appModule = await import("${appModuleSource}");
920
- const AppComponent = appModule.default;
921
- window.__VINEXT_APP__ = AppComponent;
922
- element = React.createElement(AppComponent, {
923
- ...props,
924
- Component: PageComponent,
925
- pageProps: rawPageProps,
926
- router: Router,
927
- });
928
- ` : `
929
- element = React.createElement(PageComponent, pageProps);
930
- `}
931
- let resolveHydrationCommit;
932
- const hydrationCommitted = new Promise((resolve) => { resolveHydrationCommit = resolve; });
933
- element = wrapWithRouterContext(element, resolveHydrationCommit);
934
- const root = hydrateRoot(document.getElementById("__next"), element, hydrateRootOptions);
935
- window.__VINEXT_ROOT__ = root;
936
- await hydrationCommitted;
937
- const hydratedAt = performance.now();
938
- window.__VINEXT_HYDRATED_AT = hydratedAt;
939
- window.__NEXT_HYDRATED = true;
940
- window.__NEXT_HYDRATED_AT = hydratedAt;
941
- window.__NEXT_HYDRATED_CB?.();
942
- if (nextData.isFallback) {
943
- await Router.replace(window.location.pathname + window.location.search + window.location.hash, undefined, { _h: 1, scroll: false });
944
- }
945
- }
946
- hydrate();
947
- <\/script>`;
988
+ const hydrationScript = createPagesDevHydrationScript({
989
+ appModuleSource,
990
+ pageModuleSource,
991
+ reactStrictMode: reactStrictMode === true,
992
+ replaceFallbackRoute: true,
993
+ scriptNonce
994
+ });
948
995
  const nextDataScript = `<script id="__NEXT_DATA__" type="application/json"${nonceAttr}>${safeJsonStringify({
949
996
  props: renderProps,
950
997
  page: patternToNextFormat(route.pattern),
951
- query: params,
998
+ query: isFallbackRender ? {} : params,
952
999
  buildId: process.env.__VINEXT_BUILD_ID,
953
1000
  isFallback: isFallbackRender,
954
1001
  locale: locale ?? currentDefaultLocale,
@@ -964,11 +1011,12 @@ hydrate();
964
1011
  } catch {}
965
1012
  const allScripts = `${nextDataScript}\n ${createInlineScriptTag(`window.__VINEXT_PAGE_PATTERNS__=${safeJsonStringify(pagePatterns)}`, scriptNonce)}\n ${hydrationScript}`;
966
1013
  const extraHeaders = { ...gsspExtraHeaders };
967
- if (isrRevalidateSeconds) if (scriptNonce) extraHeaders["Cache-Control"] = NO_STORE_CACHE_CONTROL;
1014
+ if (requestPreviewData === false && isrRevalidateSeconds) if (scriptNonce) extraHeaders["Cache-Control"] = NO_STORE_CACHE_CONTROL;
968
1015
  else {
969
1016
  extraHeaders["Cache-Control"] = buildMissIsrCacheControl(isrRevalidateSeconds);
970
1017
  Object.assign(extraHeaders, buildCacheStateHeaders("MISS"));
971
1018
  }
1019
+ applyDevPagesPreviewHeaders(extraHeaders, requestPreview);
972
1020
  if (allFontPreloads.length > 0) extraHeaders["Link"] = allFontPreloads.map((p) => `<${p.href}>; rel=preload; as=font; type=${p.type}; crossorigin`).join(", ");
973
1021
  await streamPageToResponse(res, withScriptNonce(element, scriptNonce), {
974
1022
  url,
@@ -1038,7 +1086,7 @@ hydrate();
1038
1086
  routeType: "render"
1039
1087
  }).catch(() => {});
1040
1088
  try {
1041
- await renderErrorPage(server, runner, req, res, url, pagesDir, 500, void 0, matcher, e instanceof Error ? e : new Error(String(e)));
1089
+ await renderErrorPage(server, runner, req, res, url, pagesDir, 500, void 0, matcher, e instanceof Error ? e : new Error(String(e)), reactStrictMode);
1042
1090
  } catch (fallbackErr) {
1043
1091
  res.statusCode = 500;
1044
1092
  res.end(`Internal Server Error: ${fallbackErr.message}`);
@@ -1055,71 +1103,127 @@ hydrate();
1055
1103
  * - 500: pages/500.tsx -> pages/_error.tsx -> default
1056
1104
  * - other: pages/_error.tsx -> default
1057
1105
  */
1058
- async function renderErrorPage(server, runner, req, res, url, pagesDir, statusCode, wrapWithRouterContext, fileMatcher, err) {
1106
+ async function renderErrorPage(server, runner, req, res, url, pagesDir, statusCode, wrapWithRouterContext, fileMatcher, err, reactStrictMode = false) {
1059
1107
  attachPagesRequestCookies(req);
1060
1108
  const matcher = fileMatcher ?? createValidFileMatcher();
1061
1109
  const candidates = statusCode === 404 ? ["404", "_error"] : statusCode === 500 ? ["500", "_error"] : ["_error"];
1062
- for (const candidate of candidates) try {
1063
- const errorAssetPath = findFileWithExts(pagesDir, candidate, matcher);
1064
- if (!errorAssetPath) continue;
1065
- const ErrorComponent = (await importModule(runner, errorAssetPath)).default;
1066
- if (!ErrorComponent) continue;
1067
- let AppComponent = null;
1068
- const appPathErr = path.join(pagesDir, "_app");
1069
- const appAssetPath = findFileWithExts(pagesDir, "_app", matcher);
1070
- if (findFileWithExtensions(appPathErr, matcher)) try {
1071
- AppComponent = (await importModule(runner, appAssetPath ?? appPathErr)).default ?? null;
1072
- } catch {}
1073
- const createElement = React.createElement;
1074
- const initialErrorProps = await loadPagesGetInitialProps(ErrorComponent, {
1075
- req,
1076
- res,
1077
- err,
1078
- pathname: candidate === "_error" ? "/_error" : `/${candidate}`,
1079
- query: parseQueryString(url),
1080
- asPath: url
1081
- });
1082
- if (res.headersSent || res.writableEnded) return;
1083
- const errorProps = {
1084
- ...initialErrorProps,
1085
- statusCode
1086
- };
1087
- let wrapFn = wrapWithRouterContext;
1088
- if (!wrapFn) try {
1089
- wrapFn = (await importModule(runner, "next/router")).wrapWithRouterContext;
1090
- } catch {}
1091
- let DocumentComponent = null;
1092
- const docPathErr = path.join(pagesDir, "_document");
1093
- if (findFileWithExtensions(docPathErr, matcher)) try {
1094
- DocumentComponent = (await importModule(runner, docPathErr)).default ?? null;
1095
- } catch {}
1096
- const createErrorElement = (FinalApp, FinalComponent) => {
1097
- let errorElement = FinalApp ? createElement(FinalApp, {
1098
- Component: FinalComponent,
1099
- pageProps: errorProps
1100
- }) : createElement(FinalComponent, errorProps);
1101
- if (wrapFn) errorElement = wrapFn(errorElement);
1102
- return errorElement;
1103
- };
1104
- const element = createErrorElement(AppComponent, ErrorComponent);
1105
- const headShim = await importModule(runner, "next/head");
1106
- if (typeof headShim.resetSSRHead === "function") headShim.resetSSRHead();
1107
- const responseHeaders = typeof res.getHeaders === "function" ? res.getHeaders() : void 0;
1108
- const nonceAttr = createNonceAttribute(getScriptNonceFromNodeHeaderSources(req.headers, responseHeaders));
1109
- const assetHeadHTML = await collectDevInitialStylesheetHeadHTML(runner, [appAssetPath, errorAssetPath], nonceAttr);
1110
- if (DocumentComponent) {
1111
- const errorPathname = candidate === "_error" ? "/_error" : `/${candidate}`;
1112
- await streamPageToResponse(res, element, {
1110
+ for (const candidate of candidates) {
1111
+ let errorRouterShim = null;
1112
+ try {
1113
+ const errorAssetPath = findFileWithExts(pagesDir, candidate, matcher);
1114
+ if (!errorAssetPath && candidate !== "_error") continue;
1115
+ const ErrorComponent = (await importModule(runner, errorAssetPath ?? "next/error")).default;
1116
+ if (!ErrorComponent) continue;
1117
+ let AppComponent = null;
1118
+ const appPathErr = path.join(pagesDir, "_app");
1119
+ const appAssetPath = findFileWithExts(pagesDir, "_app", matcher);
1120
+ if (findFileWithExtensions(appPathErr, matcher)) try {
1121
+ AppComponent = (await importModule(runner, appAssetPath ?? appPathErr)).default ?? null;
1122
+ } catch {}
1123
+ const createElement = React.createElement;
1124
+ res.statusCode = statusCode;
1125
+ const errorPage = candidate === "_error" ? "/_error" : `/${candidate}`;
1126
+ const errorRouter = {
1127
+ pathname: errorPage,
1128
+ query: parseQueryString(url),
1129
+ asPath: url
1130
+ };
1131
+ try {
1132
+ errorRouterShim = await importModule(runner, "next/router");
1133
+ if (typeof errorRouterShim.setSSRContext === "function") errorRouterShim.setSSRContext({
1134
+ ...errorRouter,
1135
+ navigationIsReady: true
1136
+ });
1137
+ } catch {}
1138
+ const serverRouter = errorRouterShim?.default ?? errorRouter;
1139
+ const wrapFn = wrapWithRouterContext ?? errorRouterShim?.wrapWithRouterContext;
1140
+ const initialErrorProps = await loadPagesGetInitialProps(ErrorComponent, {
1141
+ req,
1142
+ res,
1143
+ err,
1144
+ pathname: errorPage,
1145
+ query: errorRouter.query,
1146
+ asPath: url
1147
+ });
1148
+ if (res.headersSent || res.writableEnded) return;
1149
+ const errorProps = {
1150
+ ...initialErrorProps,
1151
+ statusCode
1152
+ };
1153
+ let renderProps;
1154
+ if (AppComponent && hasPagesGetInitialProps(AppComponent)) {
1155
+ const appInitialProps = await loadPagesGetInitialProps(AppComponent, {
1156
+ AppTree: (appTreeProps) => {
1157
+ const appTree = createElement(AppComponent, {
1158
+ ...appTreeProps,
1159
+ Component: ErrorComponent,
1160
+ router: serverRouter
1161
+ });
1162
+ return wrapFn ? wrapFn(appTree) : appTree;
1163
+ },
1164
+ Component: ErrorComponent,
1165
+ router: serverRouter,
1166
+ ctx: {
1167
+ req,
1168
+ res,
1169
+ err,
1170
+ pathname: errorPage,
1171
+ query: errorRouter.query,
1172
+ asPath: url
1173
+ }
1174
+ });
1175
+ if (res.headersSent || res.writableEnded) return;
1176
+ renderProps = appInitialProps ?? {};
1177
+ } else renderProps = { pageProps: errorProps };
1178
+ let DocumentComponent = null;
1179
+ const docPathErr = path.join(pagesDir, "_document");
1180
+ if (findFileWithExtensions(docPathErr, matcher)) try {
1181
+ DocumentComponent = (await importModule(runner, docPathErr)).default ?? null;
1182
+ } catch {}
1183
+ const createErrorElement = (FinalApp, FinalComponent) => {
1184
+ let errorElement = FinalApp ? createElement(FinalApp, {
1185
+ ...renderProps,
1186
+ Component: FinalComponent,
1187
+ router: serverRouter
1188
+ }) : createElement(FinalComponent, errorProps);
1189
+ if (wrapFn) errorElement = wrapFn(errorElement);
1190
+ return errorElement;
1191
+ };
1192
+ const element = createErrorElement(AppComponent, ErrorComponent);
1193
+ const headShim = await importModule(runner, "next/head");
1194
+ if (typeof headShim.resetSSRHead === "function") headShim.resetSSRHead();
1195
+ const responseHeaders = typeof res.getHeaders === "function" ? res.getHeaders() : void 0;
1196
+ const scriptNonce = getScriptNonceFromNodeHeaderSources(req.headers, responseHeaders);
1197
+ const nonceAttr = createNonceAttribute(scriptNonce);
1198
+ const assetHeadHTML = await collectDevInitialStylesheetHeadHTML(server, runner, [appAssetPath, errorAssetPath], nonceAttr);
1199
+ const errorModuleSource = errorAssetPath ? createPagesDevModuleUrl(server.config.root, errorAssetPath, "/") : "next/error";
1200
+ const appModuleSource = appAssetPath ? createPagesDevModuleUrl(server.config.root, appAssetPath, "/") : null;
1201
+ const errorScripts = `${`<script id="__NEXT_DATA__" type="application/json"${nonceAttr}>${safeJsonStringify({
1202
+ props: renderProps,
1203
+ page: errorPage,
1204
+ query: parseQueryString(url),
1205
+ buildId: process.env.__VINEXT_BUILD_ID,
1206
+ isFallback: false
1207
+ })}<\/script>`}\n${createPagesDevHydrationScript({
1208
+ appModuleSource,
1209
+ forceRouterReady: true,
1210
+ normalizePageProps: false,
1211
+ pageModuleSource: errorModuleSource,
1212
+ reactStrictMode: reactStrictMode === true,
1213
+ scriptNonce,
1214
+ setPagePatternsFromNextData: true
1215
+ })}`;
1216
+ if (DocumentComponent) await streamPageToResponse(res, element, {
1113
1217
  url,
1114
1218
  server,
1115
1219
  fontHeadHTML: "",
1116
1220
  assetHeadHTML,
1117
- scripts: "",
1221
+ scripts: errorScripts,
1118
1222
  DocumentComponent,
1119
1223
  statusCode,
1120
1224
  documentContext: {
1121
1225
  err,
1122
- pathname: errorPathname,
1226
+ pathname: errorPage,
1123
1227
  query: parseQueryString(url),
1124
1228
  asPath: url,
1125
1229
  req,
@@ -1135,8 +1239,8 @@ async function renderErrorPage(server, runner, req, res, url, pagesDir, statusCo
1135
1239
  getHeadHTML: () => typeof headShim.getSSRHeadHTML === "function" ? headShim.getSSRHeadHTML() : "",
1136
1240
  setDocumentInitialHead: typeof headShim.setDocumentInitialHead === "function" ? headShim.setDocumentInitialHead : void 0
1137
1241
  });
1138
- } else {
1139
- const html = `<!DOCTYPE html>
1242
+ else {
1243
+ const html = `<!DOCTYPE html>
1140
1244
  <html>
1141
1245
  <head>
1142
1246
  <meta charset="utf-8" />
@@ -1145,16 +1249,20 @@ async function renderErrorPage(server, runner, req, res, url, pagesDir, statusCo
1145
1249
  </head>
1146
1250
  <body>
1147
1251
  <div id="__next">${await renderToStringAsync(element)}</div>
1252
+ ${errorScripts}
1148
1253
  </body>
1149
1254
  </html>`;
1150
- const transformedHtml = await server.transformIndexHtml(url, html);
1151
- res.writeHead(statusCode, { "Content-Type": "text/html; charset=utf-8" });
1152
- res.end(transformedHtml);
1255
+ const transformedHtml = await server.transformIndexHtml(url, html);
1256
+ res.writeHead(statusCode, { "Content-Type": "text/html; charset=utf-8" });
1257
+ res.end(transformedHtml);
1258
+ }
1259
+ return;
1260
+ } catch {
1261
+ if (res.headersSent || res.writableEnded) return;
1262
+ continue;
1263
+ } finally {
1264
+ if (typeof errorRouterShim?.setSSRContext === "function") errorRouterShim.setSSRContext(null);
1153
1265
  }
1154
- return;
1155
- } catch {
1156
- if (res.headersSent || res.writableEnded) return;
1157
- continue;
1158
1266
  }
1159
1267
  if (statusCode === 404) {
1160
1268
  const defaultResponse = buildDefaultPagesNotFoundResponse();