vinext 0.0.51 → 0.0.52

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 (307) hide show
  1. package/dist/build/precompress.d.ts +7 -7
  2. package/dist/build/precompress.js +18 -17
  3. package/dist/build/precompress.js.map +1 -1
  4. package/dist/build/prerender.d.ts +3 -14
  5. package/dist/build/prerender.js +40 -40
  6. package/dist/build/prerender.js.map +1 -1
  7. package/dist/check.js +4 -0
  8. package/dist/check.js.map +1 -1
  9. package/dist/cli-args.d.ts +1 -0
  10. package/dist/cli-args.js +5 -0
  11. package/dist/cli-args.js.map +1 -1
  12. package/dist/cli.js +39 -0
  13. package/dist/cli.js.map +1 -1
  14. package/dist/client/navigation-runtime.d.ts +47 -0
  15. package/dist/client/navigation-runtime.js +156 -0
  16. package/dist/client/navigation-runtime.js.map +1 -0
  17. package/dist/client/pages-router-link-navigation.d.ts +26 -0
  18. package/dist/client/pages-router-link-navigation.js +14 -0
  19. package/dist/client/pages-router-link-navigation.js.map +1 -0
  20. package/dist/client/vinext-next-data.d.ts +12 -2
  21. package/dist/client/vinext-next-data.js +50 -1
  22. package/dist/client/vinext-next-data.js.map +1 -0
  23. package/dist/cloudflare/kv-cache-handler.js +2 -1
  24. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  25. package/dist/config/config-matchers.d.ts +63 -16
  26. package/dist/config/config-matchers.js +143 -8
  27. package/dist/config/config-matchers.js.map +1 -1
  28. package/dist/config/next-config.d.ts +20 -2
  29. package/dist/config/next-config.js +11 -1
  30. package/dist/config/next-config.js.map +1 -1
  31. package/dist/deploy.js +101 -39
  32. package/dist/deploy.js.map +1 -1
  33. package/dist/entries/app-browser-entry.js +9 -3
  34. package/dist/entries/app-browser-entry.js.map +1 -1
  35. package/dist/entries/app-rsc-entry.js +53 -13
  36. package/dist/entries/app-rsc-entry.js.map +1 -1
  37. package/dist/entries/app-rsc-manifest.d.ts +1 -0
  38. package/dist/entries/app-rsc-manifest.js +53 -6
  39. package/dist/entries/app-rsc-manifest.js.map +1 -1
  40. package/dist/entries/app-ssr-entry.d.ts +3 -3
  41. package/dist/entries/app-ssr-entry.js +4 -4
  42. package/dist/entries/app-ssr-entry.js.map +1 -1
  43. package/dist/entries/pages-client-entry.js +18 -2
  44. package/dist/entries/pages-client-entry.js.map +1 -1
  45. package/dist/entries/pages-server-entry.js +58 -8
  46. package/dist/entries/pages-server-entry.js.map +1 -1
  47. package/dist/entries/runtime-entry-module.d.ts +2 -1
  48. package/dist/entries/runtime-entry-module.js +9 -3
  49. package/dist/entries/runtime-entry-module.js.map +1 -1
  50. package/dist/index.js +132 -40
  51. package/dist/index.js.map +1 -1
  52. package/dist/plugins/css-data-url.d.ts +7 -0
  53. package/dist/plugins/css-data-url.js +81 -0
  54. package/dist/plugins/css-data-url.js.map +1 -0
  55. package/dist/plugins/fonts.js +5 -3
  56. package/dist/plugins/fonts.js.map +1 -1
  57. package/dist/plugins/middleware-server-only.d.ts +54 -0
  58. package/dist/plugins/middleware-server-only.js +91 -0
  59. package/dist/plugins/middleware-server-only.js.map +1 -0
  60. package/dist/plugins/optimize-imports.js +4 -4
  61. package/dist/plugins/optimize-imports.js.map +1 -1
  62. package/dist/plugins/strip-server-exports.js +5 -8
  63. package/dist/plugins/strip-server-exports.js.map +1 -1
  64. package/dist/routing/app-route-graph.d.ts +20 -1
  65. package/dist/routing/app-route-graph.js +58 -6
  66. package/dist/routing/app-route-graph.js.map +1 -1
  67. package/dist/routing/app-router.d.ts +2 -2
  68. package/dist/routing/app-router.js +2 -2
  69. package/dist/routing/app-router.js.map +1 -1
  70. package/dist/routing/utils.d.ts +2 -1
  71. package/dist/routing/utils.js +4 -1
  72. package/dist/routing/utils.js.map +1 -1
  73. package/dist/server/api-handler.js +139 -37
  74. package/dist/server/api-handler.js.map +1 -1
  75. package/dist/server/app-browser-entry.js +293 -149
  76. package/dist/server/app-browser-entry.js.map +1 -1
  77. package/dist/server/app-browser-interception-context.d.ts +24 -0
  78. package/dist/server/app-browser-interception-context.js +32 -0
  79. package/dist/server/app-browser-interception-context.js.map +1 -0
  80. package/dist/server/app-browser-navigation-controller.d.ts +3 -1
  81. package/dist/server/app-browser-navigation-controller.js +5 -1
  82. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  83. package/dist/server/app-browser-rsc-redirect.d.ts +2 -1
  84. package/dist/server/app-browser-rsc-redirect.js +2 -2
  85. package/dist/server/app-browser-rsc-redirect.js.map +1 -1
  86. package/dist/server/app-browser-state.d.ts +18 -1
  87. package/dist/server/app-browser-state.js +19 -1
  88. package/dist/server/app-browser-state.js.map +1 -1
  89. package/dist/server/app-browser-stream.d.ts +5 -14
  90. package/dist/server/app-browser-stream.js +13 -7
  91. package/dist/server/app-browser-stream.js.map +1 -1
  92. package/dist/server/app-browser-visible-commit.d.ts +2 -1
  93. package/dist/server/app-browser-visible-commit.js +1 -0
  94. package/dist/server/app-browser-visible-commit.js.map +1 -1
  95. package/dist/server/app-elements-wire.d.ts +10 -5
  96. package/dist/server/app-elements-wire.js +84 -2
  97. package/dist/server/app-elements-wire.js.map +1 -1
  98. package/dist/server/app-elements.d.ts +3 -2
  99. package/dist/server/app-elements.js +3 -2
  100. package/dist/server/app-elements.js.map +1 -1
  101. package/dist/server/app-fallback-renderer.js +5 -3
  102. package/dist/server/app-fallback-renderer.js.map +1 -1
  103. package/dist/server/app-middleware.d.ts +13 -0
  104. package/dist/server/app-middleware.js +3 -1
  105. package/dist/server/app-middleware.js.map +1 -1
  106. package/dist/server/app-optimistic-routing.d.ts +54 -0
  107. package/dist/server/app-optimistic-routing.js +200 -0
  108. package/dist/server/app-optimistic-routing.js.map +1 -0
  109. package/dist/server/app-page-cache.d.ts +13 -1
  110. package/dist/server/app-page-cache.js +61 -6
  111. package/dist/server/app-page-cache.js.map +1 -1
  112. package/dist/server/app-page-dispatch.d.ts +2 -0
  113. package/dist/server/app-page-dispatch.js +28 -1
  114. package/dist/server/app-page-dispatch.js.map +1 -1
  115. package/dist/server/app-page-element-builder.js +2 -1
  116. package/dist/server/app-page-element-builder.js.map +1 -1
  117. package/dist/server/app-page-execution.d.ts +28 -1
  118. package/dist/server/app-page-execution.js +89 -4
  119. package/dist/server/app-page-execution.js.map +1 -1
  120. package/dist/server/app-page-head.js +21 -2
  121. package/dist/server/app-page-head.js.map +1 -1
  122. package/dist/server/app-page-probe.js +1 -1
  123. package/dist/server/app-page-render.d.ts +2 -0
  124. package/dist/server/app-page-render.js +2 -1
  125. package/dist/server/app-page-render.js.map +1 -1
  126. package/dist/server/app-page-response.js +4 -3
  127. package/dist/server/app-page-response.js.map +1 -1
  128. package/dist/server/app-page-route-wiring.js +17 -10
  129. package/dist/server/app-page-route-wiring.js.map +1 -1
  130. package/dist/server/app-page-stream.d.ts +3 -0
  131. package/dist/server/app-page-stream.js +1 -0
  132. package/dist/server/app-page-stream.js.map +1 -1
  133. package/dist/server/app-prerender-static-params.d.ts +2 -1
  134. package/dist/server/app-prerender-static-params.js +44 -8
  135. package/dist/server/app-prerender-static-params.js.map +1 -1
  136. package/dist/server/app-route-handler-cache.d.ts +2 -2
  137. package/dist/server/app-route-handler-cache.js +3 -2
  138. package/dist/server/app-route-handler-cache.js.map +1 -1
  139. package/dist/server/app-route-handler-dispatch.d.ts +6 -1
  140. package/dist/server/app-route-handler-dispatch.js +1 -1
  141. package/dist/server/app-route-handler-dispatch.js.map +1 -1
  142. package/dist/server/app-route-handler-execution.d.ts +17 -2
  143. package/dist/server/app-route-handler-execution.js.map +1 -1
  144. package/dist/server/app-route-handler-response.js +5 -4
  145. package/dist/server/app-route-handler-response.js.map +1 -1
  146. package/dist/server/app-router-entry.js +6 -2
  147. package/dist/server/app-router-entry.js.map +1 -1
  148. package/dist/server/app-rsc-handler.d.ts +9 -1
  149. package/dist/server/app-rsc-handler.js +32 -14
  150. package/dist/server/app-rsc-handler.js.map +1 -1
  151. package/dist/server/app-rsc-render-mode.d.ts +4 -3
  152. package/dist/server/app-rsc-render-mode.js +7 -1
  153. package/dist/server/app-rsc-render-mode.js.map +1 -1
  154. package/dist/server/app-rsc-request-normalization.d.ts +4 -1
  155. package/dist/server/app-rsc-request-normalization.js +4 -1
  156. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  157. package/dist/server/app-rsc-response-finalizer.d.ts +8 -1
  158. package/dist/server/app-rsc-response-finalizer.js +10 -3
  159. package/dist/server/app-rsc-response-finalizer.js.map +1 -1
  160. package/dist/server/app-rsc-route-matching.js +2 -2
  161. package/dist/server/app-rsc-route-matching.js.map +1 -1
  162. package/dist/server/app-server-action-execution.js +1 -1
  163. package/dist/server/app-ssr-entry.d.ts +2 -0
  164. package/dist/server/app-ssr-entry.js +56 -55
  165. package/dist/server/app-ssr-entry.js.map +1 -1
  166. package/dist/server/app-ssr-stream.d.ts +6 -1
  167. package/dist/server/app-ssr-stream.js +17 -3
  168. package/dist/server/app-ssr-stream.js.map +1 -1
  169. package/dist/server/artifact-compatibility.d.ts +1 -1
  170. package/dist/server/artifact-compatibility.js.map +1 -1
  171. package/dist/server/cache-headers.d.ts +7 -0
  172. package/dist/server/cache-headers.js +19 -0
  173. package/dist/server/cache-headers.js.map +1 -0
  174. package/dist/server/cache-proof.d.ts +49 -3
  175. package/dist/server/cache-proof.js +78 -22
  176. package/dist/server/cache-proof.js.map +1 -1
  177. package/dist/server/client-reuse-manifest.d.ts +99 -0
  178. package/dist/server/client-reuse-manifest.js +212 -0
  179. package/dist/server/client-reuse-manifest.js.map +1 -0
  180. package/dist/server/default-global-error-module.d.ts +20 -0
  181. package/dist/server/default-global-error-module.js +20 -0
  182. package/dist/server/default-global-error-module.js.map +1 -0
  183. package/dist/server/dev-server.d.ts +9 -1
  184. package/dist/server/dev-server.js +76 -29
  185. package/dist/server/dev-server.js.map +1 -1
  186. package/dist/server/edge-api-runtime.d.ts +5 -0
  187. package/dist/server/edge-api-runtime.js +8 -0
  188. package/dist/server/edge-api-runtime.js.map +1 -0
  189. package/dist/server/headers.d.ts +18 -1
  190. package/dist/server/headers.js +18 -1
  191. package/dist/server/headers.js.map +1 -1
  192. package/dist/server/http-error-responses.d.ts +16 -1
  193. package/dist/server/http-error-responses.js +21 -1
  194. package/dist/server/http-error-responses.js.map +1 -1
  195. package/dist/server/isr-cache.d.ts +6 -2
  196. package/dist/server/isr-cache.js +20 -4
  197. package/dist/server/isr-cache.js.map +1 -1
  198. package/dist/server/middleware-runtime.d.ts +15 -0
  199. package/dist/server/middleware-runtime.js +59 -7
  200. package/dist/server/middleware-runtime.js.map +1 -1
  201. package/dist/server/middleware.d.ts +1 -1
  202. package/dist/server/middleware.js +4 -2
  203. package/dist/server/middleware.js.map +1 -1
  204. package/dist/server/navigation-planner.d.ts +9 -3
  205. package/dist/server/navigation-planner.js +98 -25
  206. package/dist/server/navigation-planner.js.map +1 -1
  207. package/dist/server/navigation-trace.d.ts +2 -1
  208. package/dist/server/navigation-trace.js +1 -0
  209. package/dist/server/navigation-trace.js.map +1 -1
  210. package/dist/server/pages-api-route.d.ts +27 -1
  211. package/dist/server/pages-api-route.js +24 -3
  212. package/dist/server/pages-api-route.js.map +1 -1
  213. package/dist/server/pages-data-route.d.ts +77 -0
  214. package/dist/server/pages-data-route.js +97 -0
  215. package/dist/server/pages-data-route.js.map +1 -0
  216. package/dist/server/pages-i18n.d.ts +51 -1
  217. package/dist/server/pages-i18n.js +61 -1
  218. package/dist/server/pages-i18n.js.map +1 -1
  219. package/dist/server/pages-page-data.d.ts +29 -2
  220. package/dist/server/pages-page-data.js +31 -17
  221. package/dist/server/pages-page-data.js.map +1 -1
  222. package/dist/server/pages-page-response.d.ts +11 -1
  223. package/dist/server/pages-page-response.js +5 -3
  224. package/dist/server/pages-page-response.js.map +1 -1
  225. package/dist/server/prod-server.d.ts +13 -15
  226. package/dist/server/prod-server.js +109 -56
  227. package/dist/server/prod-server.js.map +1 -1
  228. package/dist/server/request-pipeline.d.ts +11 -2
  229. package/dist/server/request-pipeline.js +28 -11
  230. package/dist/server/request-pipeline.js.map +1 -1
  231. package/dist/server/seed-cache.d.ts +12 -31
  232. package/dist/server/seed-cache.js +22 -35
  233. package/dist/server/seed-cache.js.map +1 -1
  234. package/dist/server/server-action-not-found.js +8 -3
  235. package/dist/server/server-action-not-found.js.map +1 -1
  236. package/dist/server/skip-cache-proof.d.ts +41 -0
  237. package/dist/server/skip-cache-proof.js +101 -0
  238. package/dist/server/skip-cache-proof.js.map +1 -0
  239. package/dist/server/static-file-cache.d.ts +1 -1
  240. package/dist/server/static-file-cache.js +7 -6
  241. package/dist/server/static-file-cache.js.map +1 -1
  242. package/dist/shims/client-locale.d.ts +15 -0
  243. package/dist/shims/client-locale.js +13 -0
  244. package/dist/shims/client-locale.js.map +1 -0
  245. package/dist/shims/default-global-error.d.ts +32 -0
  246. package/dist/shims/default-global-error.js +181 -0
  247. package/dist/shims/default-global-error.js.map +1 -0
  248. package/dist/shims/document.d.ts +59 -3
  249. package/dist/shims/document.js +36 -5
  250. package/dist/shims/document.js.map +1 -1
  251. package/dist/shims/error-boundary.d.ts +2 -2
  252. package/dist/shims/form.js +13 -6
  253. package/dist/shims/form.js.map +1 -1
  254. package/dist/shims/link.d.ts +21 -3
  255. package/dist/shims/link.js +131 -22
  256. package/dist/shims/link.js.map +1 -1
  257. package/dist/shims/metadata.js +4 -4
  258. package/dist/shims/metadata.js.map +1 -1
  259. package/dist/shims/navigation.d.ts +8 -2
  260. package/dist/shims/navigation.js +36 -15
  261. package/dist/shims/navigation.js.map +1 -1
  262. package/dist/shims/og.d.ts +18 -2
  263. package/dist/shims/og.js +49 -1
  264. package/dist/shims/og.js.map +1 -0
  265. package/dist/shims/request-state-types.d.ts +1 -1
  266. package/dist/shims/root-params.d.ts +3 -1
  267. package/dist/shims/root-params.js +11 -3
  268. package/dist/shims/root-params.js.map +1 -1
  269. package/dist/shims/router-state.d.ts +1 -0
  270. package/dist/shims/router-state.js.map +1 -1
  271. package/dist/shims/router.d.ts +12 -5
  272. package/dist/shims/router.js +172 -22
  273. package/dist/shims/router.js.map +1 -1
  274. package/dist/shims/server.d.ts +21 -4
  275. package/dist/shims/server.js +29 -9
  276. package/dist/shims/server.js.map +1 -1
  277. package/dist/shims/slot.js +5 -1
  278. package/dist/shims/slot.js.map +1 -1
  279. package/dist/shims/unified-request-context.d.ts +1 -1
  280. package/dist/shims/url-safety.d.ts +23 -1
  281. package/dist/shims/url-safety.js +29 -2
  282. package/dist/shims/url-safety.js.map +1 -1
  283. package/dist/typegen.d.ts +10 -0
  284. package/dist/typegen.js +242 -0
  285. package/dist/typegen.js.map +1 -0
  286. package/dist/utils/asset-prefix.d.ts +33 -5
  287. package/dist/utils/asset-prefix.js +39 -6
  288. package/dist/utils/asset-prefix.js.map +1 -1
  289. package/dist/utils/cache-control-metadata.d.ts +2 -1
  290. package/dist/utils/cache-control-metadata.js +1 -3
  291. package/dist/utils/cache-control-metadata.js.map +1 -1
  292. package/dist/utils/domain-locale.d.ts +2 -1
  293. package/dist/utils/domain-locale.js +9 -1
  294. package/dist/utils/domain-locale.js.map +1 -1
  295. package/dist/utils/lazy-chunks.d.ts +1 -1
  296. package/dist/utils/lazy-chunks.js +1 -1
  297. package/dist/utils/lazy-chunks.js.map +1 -1
  298. package/dist/utils/prerender-output-paths.d.ts +15 -0
  299. package/dist/utils/prerender-output-paths.js +24 -0
  300. package/dist/utils/prerender-output-paths.js.map +1 -0
  301. package/dist/utils/query.d.ts +17 -1
  302. package/dist/utils/query.js +36 -1
  303. package/dist/utils/query.js.map +1 -1
  304. package/dist/utils/record.d.ts +5 -0
  305. package/dist/utils/record.js +8 -0
  306. package/dist/utils/record.js.map +1 -0
  307. package/package.json +11 -3
@@ -1,21 +1,24 @@
1
1
  import { normalizePathnameForRouteMatchStrict } from "../routing/utils.js";
2
- import { hasBasePath, removeTrailingSlash, stripBasePath } from "../utils/base-path.js";
2
+ import { hasBasePath, stripBasePath } from "../utils/base-path.js";
3
3
  import { VINEXT_PRERENDER_SECRET_HEADER, VINEXT_STATIC_FILE_HEADER } from "./headers.js";
4
4
  import { normalizePath } from "./normalize-path.js";
5
5
  import { applyMiddlewareRequestHeaders, isExternalUrl, matchRedirect, matchRewrite, proxyExternalRequest, requestContextFromRequest, sanitizeDestination } from "../config/config-matchers.js";
6
6
  import { notFoundResponse } from "./http-error-responses.js";
7
- import { applyConfigHeadersToHeaderRecord, filterInternalHeaders, isOpenRedirectShaped } from "./request-pipeline.js";
7
+ import { applyConfigHeadersToHeaderRecord, filterInternalHeaders, isOpenRedirectShaped, normalizeTrailingSlash } from "./request-pipeline.js";
8
+ import { mergeRewriteQuery } from "../utils/query.js";
9
+ import { normalizeDefaultLocalePathname, stripI18nLocaleForApiRoute } from "./pages-i18n.js";
8
10
  import { installSocketErrorBackstop } from "./socket-error-backstop.js";
11
+ import { ASSET_PREFIX_URL_DIR, assetPrefixPathname, isAbsoluteAssetPrefix } from "../utils/asset-prefix.js";
9
12
  import { CONTENT_TYPES, StaticFileCache, etagFromFilenameHash } from "./static-file-cache.js";
13
+ import { buildNextDataNotFoundResponse, isNextDataPathname, parseNextDataPathname } from "./pages-data-route.js";
10
14
  import { manifestFileWithBase } from "../utils/manifest-paths.js";
11
- import { ASSET_PREFIX_URL_DIR, assetPrefixPathname, isAbsoluteAssetPrefix } from "../utils/asset-prefix.js";
12
15
  import { DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES, isSafeImageContentType, parseImageParams } from "./image-optimization.js";
13
16
  import { computeLazyChunks } from "../utils/lazy-chunks.js";
14
17
  import { readPrerenderSecret } from "../build/server-manifest.js";
15
18
  import { seedMemoryCacheFromPrerender } from "./seed-cache.js";
16
19
  import fs from "node:fs";
17
20
  import path from "node:path";
18
- import fsp from "node:fs/promises";
21
+ import fs$1 from "node:fs/promises";
19
22
  import { pathToFileURL } from "node:url";
20
23
  import zlib from "node:zlib";
21
24
  import { createServer } from "node:http";
@@ -325,7 +328,7 @@ async function tryServeStatic(req, res, clientDir, pathname, compress, cache, ex
325
328
  if (!resolved) return false;
326
329
  const ext = path.extname(resolved.path);
327
330
  const ct = CONTENT_TYPES[ext] ?? "application/octet-stream";
328
- const isHashed = pathname.startsWith("/assets/") || pathname.includes("/_next/static/");
331
+ const isHashed = pathname.includes(`/${ASSET_PREFIX_URL_DIR}/`);
329
332
  const cacheControl = isHashed ? "public, max-age=31536000, immutable" : "public, max-age=3600";
330
333
  const etag = isHashed && etagFromFilenameHash(resolved.path, ext) || `W/"${resolved.size}-${Math.floor(resolved.mtimeMs / 1e3)}"`;
331
334
  const baseType = ct.split(";")[0].trim();
@@ -415,7 +418,7 @@ async function resolveStaticFile(staticFile) {
415
418
  }
416
419
  async function statIfFile(filePath) {
417
420
  try {
418
- const stat = await fsp.stat(filePath);
421
+ const stat = await fs$1.stat(filePath);
419
422
  return stat.isFile() ? {
420
423
  size: stat.size,
421
424
  mtimeMs: stat.mtimeMs
@@ -584,6 +587,22 @@ function resolveAppRouterHandler(entry) {
584
587
  console.error("[vinext] App Router entry must export either a default handler function or a Worker-style default export with fetch()");
585
588
  process.exit(1);
586
589
  }
590
+ function isAppRouterPrerenderSeederExport(value) {
591
+ return typeof value === "function";
592
+ }
593
+ function resolveAppRouterPrerenderSeeder(entryModule) {
594
+ if (typeof entryModule !== "object" || entryModule === null) return seedMemoryCacheFromPrerender;
595
+ const seedExport = Object.getOwnPropertyDescriptor(entryModule, "seedMemoryCacheFromPrerender")?.value;
596
+ if (!isAppRouterPrerenderSeederExport(seedExport)) {
597
+ if (process.env.NEXT_PRIVATE_DEBUG_CACHE) console.debug("[vinext] ISR: using fallback prerender cache seeder");
598
+ return seedMemoryCacheFromPrerender;
599
+ }
600
+ if (process.env.NEXT_PRIVATE_DEBUG_CACHE) console.debug("[vinext] ISR: using App Router entry prerender cache seeder");
601
+ return async (serverDir) => {
602
+ const result = await Promise.resolve(seedExport(serverDir));
603
+ return typeof result === "number" ? result : 0;
604
+ };
605
+ }
587
606
  /**
588
607
  * Resolve a request pathname to a static-asset lookup path inside `clientDir`.
589
608
  *
@@ -592,27 +611,21 @@ function resolveAppRouterHandler(entry) {
592
611
  *
593
612
  * Three URL shapes are recognised:
594
613
  *
595
- * - `/assets/...` — the historical Vite default, used when `assetPrefix` is
596
- * unset. Returns the pathname verbatim.
614
+ * - `/_next/static/...` — the default layout. Files land on disk at
615
+ * `dist/client/_next/static/...`, so the pathname maps 1:1. Also covers
616
+ * absolute-URL `assetPrefix` with no path component (same on-disk and
617
+ * URL shape).
597
618
  * - `<assetPathPrefix>/_next/static/...` — when `assetPrefix` is a path
598
619
  * prefix (e.g. `/custom-asset-prefix`). The on-disk layout is
599
620
  * `dist/client/<prefix>/_next/static/...`, so the pathname maps 1:1.
600
- * - `/_next/static/...` — when `assetPrefix` is an absolute URL with no
601
- * path component (e.g. `https://cdn.example.com`). Files land on disk
602
- * at `dist/client/_next/static/...`. This branch is mostly a fallback
603
- * for setups that don't actually route asset requests to the CDN.
604
- *
605
- * When `assetPrefix` is an absolute URL with a non-empty pathname
606
- * (e.g. `https://cdn.example.com/sub`), files are written to
607
- * `dist/client/_next/static/...` but emitted URLs prepend the full URL
608
- * (`https://cdn.example.com/sub/_next/static/...`). Requests for those
609
- * URLs do not normally arrive at this server — they go to the CDN. We
610
- * still accept `<pathname>/_next/static/...` so a same-origin reverse
611
- * proxy can route through.
621
+ * - `<absoluteURLPathname>/_next/static/...` — when `assetPrefix` is an
622
+ * absolute URL with a non-empty pathname (e.g. `https://cdn/sub`).
623
+ * Files are written to `dist/client/_next/static/...` but emitted URLs
624
+ * prepend the full URL. Requests do not normally arrive here — they go
625
+ * to the CDN — but we accept them so a same-origin reverse proxy can
626
+ * route through; the on-disk path is just `_next/static/...`.
612
627
  */
613
628
  function resolveAppRouterAssetPath(pathname, assetPathPrefix, assetPrefix) {
614
- if (pathname.startsWith("/assets/")) return pathname;
615
- if (!assetPrefix) return null;
616
629
  const nextStaticDir = `/${ASSET_PREFIX_URL_DIR}/`;
617
630
  if (assetPathPrefix) {
618
631
  if (pathname === assetPathPrefix || pathname.startsWith(assetPathPrefix + "/")) {
@@ -657,7 +670,7 @@ async function startAppRouterServer(options) {
657
670
  const rscHandler = resolveAppRouterHandler(rscModule.default);
658
671
  const appRouterAssetPrefix = typeof rscModule.__assetPrefix === "string" ? rscModule.__assetPrefix : "";
659
672
  const appAssetPathPrefix = assetPrefixPathname(appRouterAssetPrefix);
660
- const seededRoutes = await seedMemoryCacheFromPrerender(path.dirname(rscEntryPath));
673
+ const seededRoutes = await resolveAppRouterPrerenderSeeder(rscModule)(path.dirname(rscEntryPath));
661
674
  if (seededRoutes > 0) console.log(`[vinext] Seeded ${seededRoutes} pre-rendered route${seededRoutes !== 1 ? "s" : ""} into memory cache`);
662
675
  const staticCache = await StaticFileCache.create(clientDir);
663
676
  const handleRequest = async (req, res) => {
@@ -687,7 +700,12 @@ async function startAppRouterServer(options) {
687
700
  }
688
701
  {
689
702
  const assetLookupPath = resolveAppRouterAssetPath(pathname, appAssetPathPrefix, appRouterAssetPrefix);
690
- if (assetLookupPath && await tryServeStatic(req, res, clientDir, assetLookupPath, compress, staticCache)) return;
703
+ if (assetLookupPath) {
704
+ if (await tryServeStatic(req, res, clientDir, assetLookupPath, compress, staticCache)) return;
705
+ res.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
706
+ res.end("Not Found");
707
+ return;
708
+ }
691
709
  }
692
710
  if (pathname === "/_vinext/image") {
693
711
  const params = parseImageParams(new URL(rawUrl, "http://localhost"), [...DEFAULT_DEVICE_SIZES, ...DEFAULT_IMAGE_SIZES]);
@@ -775,7 +793,7 @@ function readPagesServerEntryPageRoutes(value) {
775
793
  *
776
794
  * Uses the server entry (dist/server/entry.js) which exports:
777
795
  * - renderPage(request, url, manifest, ctx?, middlewareHeaders?) — SSR rendering (Web Request → Response)
778
- * - handleApiRoute(request, url) — API route handling (Web Request Response)
796
+ * - handleApiRoute(request, url, ctx?) — API route handling (ctx optional; pass for ctx.waitUntil() on Workers)
779
797
  * - runMiddleware(request, ctx?) — middleware execution (ctx optional; pass for ctx.waitUntil() on Workers)
780
798
  * - vinextConfig — embedded next.config.js settings
781
799
  */
@@ -783,7 +801,7 @@ async function startPagesRouterServer(options) {
783
801
  const { port, host, clientDir, serverEntryPath, compress, purpose } = options;
784
802
  const serverMtime = fs.statSync(serverEntryPath).mtimeMs;
785
803
  const serverEntry = await import(`${pathToFileURL(serverEntryPath).href}?t=${serverMtime}`);
786
- const { renderPage, handleApiRoute: handleApi, runMiddleware, vinextConfig } = serverEntry;
804
+ const { renderPage, handleApiRoute: handleApi, runMiddleware, vinextConfig, buildId: pagesBuildId } = serverEntry;
787
805
  const matchPageRoute = typeof serverEntry.matchPageRoute === "function" ? serverEntry.matchPageRoute : void 0;
788
806
  const pageRoutes = readPagesServerEntryPageRoutes(serverEntry.pageRoutes);
789
807
  const prerenderSecret = readPrerenderSecret(path.dirname(serverEntryPath));
@@ -792,6 +810,7 @@ async function startPagesRouterServer(options) {
792
810
  const pagesAssetPathPrefix = assetPrefixPathname(assetPrefix);
793
811
  const assetBase = basePath ? `${basePath}/` : "/";
794
812
  const trailingSlash = vinextConfig?.trailingSlash ?? false;
813
+ const i18nConfig = vinextConfig?.i18n ?? null;
795
814
  const configRedirects = vinextConfig?.redirects ?? [];
796
815
  const configRewrites = vinextConfig?.rewrites ?? {
797
816
  beforeFiles: [],
@@ -867,7 +886,12 @@ async function startPagesRouterServer(options) {
867
886
  }
868
887
  const staticLookupPath = stripBasePath(pathname, basePath);
869
888
  const pagesAssetLookup = resolveAppRouterAssetPath(pathname, pagesAssetPathPrefix, assetPrefix);
870
- if (pagesAssetLookup && await tryServeStatic(req, res, clientDir, pagesAssetLookup, compress, staticCache)) return;
889
+ if (pagesAssetLookup) {
890
+ if (await tryServeStatic(req, res, clientDir, pagesAssetLookup, compress, staticCache)) return;
891
+ res.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
892
+ res.end("Not Found");
893
+ return;
894
+ }
871
895
  if (pathname === "/_vinext/image" || staticLookupPath === "/_vinext/image") {
872
896
  const params = parseImageParams(new URL(rawUrl, "http://localhost"), allowedImageWidths);
873
897
  if (!params) {
@@ -891,6 +915,7 @@ async function startPagesRouterServer(options) {
891
915
  return;
892
916
  }
893
917
  try {
918
+ const hadBasePath = !basePath || hasBasePath(pathname, basePath);
894
919
  {
895
920
  const stripped = stripBasePath(pathname, basePath);
896
921
  if (stripped !== pathname) {
@@ -898,27 +923,41 @@ async function startPagesRouterServer(options) {
898
923
  pathname = stripped;
899
924
  }
900
925
  }
901
- if (pathname !== "/" && pathname !== "/api" && !pathname.startsWith("/api/")) {
902
- const hasTrailing = pathname.endsWith("/");
903
- if (trailingSlash && !hasTrailing) {
904
- const qs = url.includes("?") ? url.slice(url.indexOf("?")) : "";
905
- res.writeHead(308, { Location: basePath + pathname + "/" + qs });
926
+ const basePathState = {
927
+ basePath,
928
+ hadBasePath
929
+ };
930
+ {
931
+ const qs = url.includes("?") ? url.slice(url.indexOf("?")) : "";
932
+ const trailingSlashRedirect = normalizeTrailingSlash(pathname, basePath, trailingSlash, qs);
933
+ if (trailingSlashRedirect) {
934
+ const location = trailingSlashRedirect.headers.get("Location");
935
+ res.writeHead(trailingSlashRedirect.status, location ? { Location: location } : void 0);
906
936
  res.end();
907
937
  return;
908
- } else if (!trailingSlash && hasTrailing) {
909
- const qs = url.includes("?") ? url.slice(url.indexOf("?")) : "";
910
- res.writeHead(308, { Location: basePath + removeTrailingSlash(pathname) + qs });
911
- res.end();
938
+ }
939
+ }
940
+ let isDataReq = false;
941
+ if (isNextDataPathname(pathname)) {
942
+ const dataMatch = pagesBuildId ? parseNextDataPathname(pathname, pagesBuildId) : null;
943
+ if (!dataMatch) {
944
+ await sendWebResponse(buildNextDataNotFoundResponse(), req, res, compress);
912
945
  return;
913
946
  }
947
+ isDataReq = true;
948
+ const qs = url.includes("?") ? url.slice(url.indexOf("?")) : "";
949
+ url = dataMatch.pagePathname + qs;
950
+ pathname = dataMatch.pagePathname;
914
951
  }
915
952
  const rawProtocol = trustProxy ? req.headers["x-forwarded-proto"]?.split(",")[0]?.trim() : void 0;
916
953
  const protocol = rawProtocol === "https" || rawProtocol === "http" ? rawProtocol : "http";
917
954
  const hostHeader = resolveHost(req, `${host}:${port}`);
918
- const reqHeaders = filterInternalHeaders(Object.entries(req.headers).reduce((h, [k, v]) => {
955
+ const rawReqHeaders = Object.entries(req.headers).reduce((h, [k, v]) => {
919
956
  if (v) h.set(k, Array.isArray(v) ? v.join(", ") : v);
920
957
  return h;
921
- }, new Headers()));
958
+ }, new Headers());
959
+ const isDataRequest = rawReqHeaders.get("x-nextjs-data") === "1";
960
+ const reqHeaders = filterInternalHeaders(rawReqHeaders);
922
961
  const method = req.method ?? "GET";
923
962
  const hasBody = method !== "GET" && method !== "HEAD";
924
963
  let webRequest = new Request(`${protocol}://${hostHeader}${url}`, {
@@ -928,10 +967,12 @@ async function startPagesRouterServer(options) {
928
967
  duplex: hasBody ? "half" : void 0
929
968
  });
930
969
  const reqCtx = requestContextFromRequest(webRequest);
970
+ const requestHostname = i18nConfig ? new URL(webRequest.url).hostname : "";
971
+ const matchPathname = i18nConfig ? normalizeDefaultLocalePathname(pathname, i18nConfig, { hostname: requestHostname }) : pathname;
931
972
  if (configRedirects.length) {
932
- const redirect = matchRedirect(pathname, configRedirects, reqCtx);
973
+ const redirect = matchRedirect(matchPathname, configRedirects, reqCtx, basePathState);
933
974
  if (redirect) {
934
- const dest = sanitizeDestination(basePath && !isExternalUrl(redirect.destination) && !hasBasePath(redirect.destination, basePath) ? basePath + redirect.destination : redirect.destination);
975
+ const dest = sanitizeDestination(basePath && hadBasePath && !isExternalUrl(redirect.destination) && !hasBasePath(redirect.destination, basePath) ? basePath + redirect.destination : redirect.destination);
935
976
  res.writeHead(redirect.permanent ? 308 : 307, { Location: dest });
936
977
  res.end();
937
978
  return;
@@ -941,7 +982,7 @@ async function startPagesRouterServer(options) {
941
982
  const middlewareHeaders = {};
942
983
  let middlewareStatus;
943
984
  if (typeof runMiddleware === "function") {
944
- const result = await runMiddleware(webRequest, void 0);
985
+ const result = await runMiddleware(webRequest, void 0, { isDataRequest });
945
986
  if (result.waitUntilPromises && result.waitUntilPromises.length > 0) Promise.allSettled(result.waitUntilPromises);
946
987
  if (!result.continue) {
947
988
  if (result.redirectUrl) {
@@ -983,30 +1024,41 @@ async function startPagesRouterServer(options) {
983
1024
  const { postMwReqCtx, request: postMwReq } = applyMiddlewareRequestHeaders(middlewareHeaders, webRequest, { preserveCredentialHeaders: isExternalUrl(resolvedUrl) });
984
1025
  webRequest = postMwReq;
985
1026
  let resolvedPathname = resolvedUrl.split("?")[0];
1027
+ const matchResolvedPathname = (p) => i18nConfig ? normalizeDefaultLocalePathname(p, i18nConfig, { hostname: requestHostname }) : p;
986
1028
  if (configHeaders.length) applyConfigHeadersToHeaderRecord(middlewareHeaders, {
987
1029
  configHeaders,
988
- pathname,
989
- requestContext: reqCtx
1030
+ pathname: matchPathname,
1031
+ requestContext: reqCtx,
1032
+ basePathState
990
1033
  });
991
1034
  if (isExternalUrl(resolvedUrl)) {
992
1035
  await sendWebResponse(mergeWebResponse(middlewareHeaders, await proxyExternalRequest(webRequest, resolvedUrl), void 0), req, res, compress);
993
1036
  return;
994
1037
  }
995
- if (staticLookupPath !== "/" && !staticLookupPath.startsWith("/api/") && !staticLookupPath.startsWith("/assets/") && await tryServeStatic(req, res, clientDir, staticLookupPath, compress, staticCache, middlewareHeaders)) return;
1038
+ if (staticLookupPath !== "/" && !staticLookupPath.startsWith("/api/") && !staticLookupPath.startsWith(`/_next/static/`) && await tryServeStatic(req, res, clientDir, staticLookupPath, compress, staticCache, middlewareHeaders)) return;
1039
+ let configRewriteFired = false;
996
1040
  if (configRewrites.beforeFiles?.length) {
997
- const rewritten = matchRewrite(resolvedPathname, configRewrites.beforeFiles, postMwReqCtx);
1041
+ const rewritten = matchRewrite(matchResolvedPathname(resolvedPathname), configRewrites.beforeFiles, postMwReqCtx, basePathState);
998
1042
  if (rewritten) {
999
1043
  if (isExternalUrl(rewritten)) {
1000
1044
  await sendWebResponse(await proxyExternalRequest(webRequest, rewritten), req, res, compress);
1001
1045
  return;
1002
1046
  }
1003
- resolvedUrl = rewritten;
1004
- resolvedPathname = rewritten.split("?")[0];
1047
+ resolvedUrl = mergeRewriteQuery(resolvedUrl, rewritten);
1048
+ resolvedPathname = resolvedUrl.split("?")[0];
1049
+ configRewriteFired = true;
1005
1050
  }
1006
1051
  }
1007
- if (resolvedPathname.startsWith("/api/") || resolvedPathname === "/api") {
1052
+ if (basePath && !hadBasePath && !configRewriteFired) {
1053
+ res.writeHead(404, { "Content-Type": "text/html; charset=utf-8" });
1054
+ res.end("This page could not be found");
1055
+ return;
1056
+ }
1057
+ const apiLookupUrl = stripI18nLocaleForApiRoute(resolvedUrl, vinextConfig?.i18n ?? null);
1058
+ const apiLookupPathname = apiLookupUrl.split("?")[0];
1059
+ if (apiLookupPathname.startsWith("/api/") || apiLookupPathname === "/api") {
1008
1060
  let response;
1009
- if (typeof handleApi === "function") response = await handleApi(webRequest, resolvedUrl);
1061
+ if (typeof handleApi === "function") response = await handleApi(webRequest, apiLookupUrl, createNodeExecutionContext());
1010
1062
  else response = new Response("404 - API route not found", { status: 404 });
1011
1063
  const mergedResponse = mergeWebResponse(middlewareHeaders, response, middlewareStatus);
1012
1064
  if (!mergedResponse.body) {
@@ -1022,28 +1074,29 @@ async function startPagesRouterServer(options) {
1022
1074
  }
1023
1075
  const pageMatch = matchPageRoute ? matchPageRoute(resolvedPathname, webRequest) : null;
1024
1076
  if ((!pageMatch || pageMatch.route.isDynamic) && configRewrites.afterFiles?.length) {
1025
- const rewritten = matchRewrite(resolvedPathname, configRewrites.afterFiles, postMwReqCtx);
1077
+ const rewritten = matchRewrite(matchResolvedPathname(resolvedPathname), configRewrites.afterFiles, postMwReqCtx, basePathState);
1026
1078
  if (rewritten) {
1027
1079
  if (isExternalUrl(rewritten)) {
1028
1080
  await sendWebResponse(await proxyExternalRequest(webRequest, rewritten), req, res, compress);
1029
1081
  return;
1030
1082
  }
1031
- resolvedUrl = rewritten;
1032
- resolvedPathname = rewritten.split("?")[0];
1083
+ resolvedUrl = mergeRewriteQuery(resolvedUrl, rewritten);
1084
+ resolvedPathname = resolvedUrl.split("?")[0];
1033
1085
  }
1034
1086
  }
1035
1087
  let response;
1036
1088
  if (typeof renderPage === "function") {
1037
1089
  const middlewareResponseHeaders = toWebHeaders(middlewareHeaders);
1038
- response = await renderPage(webRequest, resolvedUrl, ssrManifest, void 0, middlewareResponseHeaders);
1090
+ const renderOptions = isDataReq ? { isDataReq: true } : void 0;
1091
+ response = await renderPage(webRequest, resolvedUrl, ssrManifest, void 0, middlewareResponseHeaders, renderOptions);
1039
1092
  if (response && response.status === 404 && configRewrites.fallback?.length) {
1040
- const fallbackRewrite = matchRewrite(resolvedPathname, configRewrites.fallback, postMwReqCtx);
1093
+ const fallbackRewrite = matchRewrite(matchResolvedPathname(resolvedPathname), configRewrites.fallback, postMwReqCtx, basePathState);
1041
1094
  if (fallbackRewrite) {
1042
1095
  if (isExternalUrl(fallbackRewrite)) {
1043
1096
  await sendWebResponse(await proxyExternalRequest(webRequest, fallbackRewrite), req, res, compress);
1044
1097
  return;
1045
1098
  }
1046
- response = await renderPage(webRequest, fallbackRewrite, ssrManifest, void 0, middlewareResponseHeaders);
1099
+ response = await renderPage(webRequest, mergeRewriteQuery(resolvedUrl, fallbackRewrite), ssrManifest, void 0, middlewareResponseHeaders, renderOptions);
1047
1100
  }
1048
1101
  }
1049
1102
  }
@@ -1088,6 +1141,6 @@ async function startPagesRouterServer(options) {
1088
1141
  };
1089
1142
  }
1090
1143
  //#endregion
1091
- export { COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, mergeResponseHeaders, mergeWebResponse, negotiateEncoding, nodeToWebRequest, resolveAppRouterAssetPath, resolveHost, sendCompressed, sendWebResponse, startProdServer, trustProxy, trustedHosts, tryServeStatic };
1144
+ export { COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, mergeResponseHeaders, mergeWebResponse, negotiateEncoding, nodeToWebRequest, resolveAppRouterAssetPath, resolveAppRouterPrerenderSeeder, resolveHost, sendCompressed, sendWebResponse, startProdServer, trustProxy, trustedHosts, tryServeStatic };
1092
1145
 
1093
1146
  //# sourceMappingURL=prod-server.js.map