vinext 1.0.0-beta.3 → 1.0.0-beta.5

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 (436) hide show
  1. package/README.md +44 -3
  2. package/dist/build/client-build-config.d.ts +0 -1
  3. package/dist/build/css-url-assets.d.ts +0 -1
  4. package/dist/build/google-fonts/build-url.d.ts +5 -2
  5. package/dist/build/google-fonts/font-metadata.d.ts +7 -3
  6. package/dist/build/google-fonts/get-axes.d.ts +0 -1
  7. package/dist/build/layout-classification.d.ts +7 -4
  8. package/dist/build/next-client-runtime-manifests.d.ts +0 -1
  9. package/dist/build/next-client-runtime-manifests.js +2 -19
  10. package/dist/build/nitro-route-rules.d.ts +0 -1
  11. package/dist/build/pages-client-assets-module.d.ts +0 -1
  12. package/dist/build/precompress.d.ts +7 -2
  13. package/dist/build/precompress.js +42 -8
  14. package/dist/build/prerender-paths.d.ts +2 -2
  15. package/dist/build/prerender-server-entry.d.ts +1 -1
  16. package/dist/build/prerender-server-pool.d.ts +4 -2
  17. package/dist/build/prerender.d.ts +36 -32
  18. package/dist/build/prerender.js +18 -3
  19. package/dist/build/public-dir-conflict.d.ts +14 -0
  20. package/dist/build/public-dir-conflict.js +25 -0
  21. package/dist/build/report.d.ts +2 -2
  22. package/dist/build/route-classification-injector.d.ts +0 -1
  23. package/dist/build/route-classification-manifest.d.ts +5 -3
  24. package/dist/build/run-prerender.d.ts +3 -2
  25. package/dist/build/static-export.d.ts +23 -12
  26. package/dist/cache/cache-adapters-virtual.d.ts +5 -2
  27. package/dist/check.js +4 -4
  28. package/dist/cli-args.d.ts +2 -1
  29. package/dist/cli-args.js +10 -0
  30. package/dist/cli-dev-config.d.ts +0 -1
  31. package/dist/cli.d.ts +1 -1
  32. package/dist/cli.js +14 -8
  33. package/dist/client/client-rewrite-matcher.d.ts +12 -0
  34. package/dist/client/client-rewrite-matcher.js +20 -0
  35. package/dist/client/client-rewrites.d.ts +31 -0
  36. package/dist/client/client-rewrites.js +41 -0
  37. package/dist/client/dev-error-overlay.d.ts +0 -1
  38. package/dist/client/empty-module.d.ts +1 -1
  39. package/dist/client/index.d.ts +2 -0
  40. package/dist/client/index.js +2 -0
  41. package/dist/client/instrumentation-client-state.d.ts +0 -1
  42. package/dist/client/navigation-runtime.d.ts +12 -1
  43. package/dist/client/navigation-runtime.js +6 -2
  44. package/dist/client/pages-router-link-navigation.d.ts +3 -21
  45. package/dist/client/react-instance-bootstrap.d.ts +1 -0
  46. package/dist/client/react-instance-bootstrap.js +7 -0
  47. package/dist/client/react-instance.d.ts +13 -0
  48. package/dist/client/react-instance.js +20 -0
  49. package/dist/client/vinext-next-data.d.ts +11 -6
  50. package/dist/client/window-next.d.ts +5 -2
  51. package/dist/config/config-matchers.d.ts +3 -5
  52. package/dist/config/config-matchers.js +7 -6
  53. package/dist/config/dotenv.d.ts +4 -9
  54. package/dist/config/dotenv.js +30 -22
  55. package/dist/config/next-config.d.ts +113 -52
  56. package/dist/config/next-config.js +6 -0
  57. package/dist/config/prerender.d.ts +0 -1
  58. package/dist/entries/app-browser-entry.d.ts +0 -1
  59. package/dist/entries/app-browser-entry.js +7 -3
  60. package/dist/entries/app-rsc-entry.d.ts +30 -16
  61. package/dist/entries/app-rsc-entry.js +40 -12
  62. package/dist/entries/app-rsc-manifest.d.ts +0 -1
  63. package/dist/entries/app-rsc-manifest.js +1 -0
  64. package/dist/entries/pages-client-entry.d.ts +0 -1
  65. package/dist/entries/pages-client-entry.js +7 -2
  66. package/dist/entries/pages-server-entry.d.ts +1 -2
  67. package/dist/entries/pages-server-entry.js +25 -6
  68. package/dist/image/image-adapters-virtual.d.ts +4 -2
  69. package/dist/index.d.ts +0 -1
  70. package/dist/index.js +257 -75
  71. package/dist/init-cloudflare.d.ts +0 -1
  72. package/dist/init-platform.d.ts +0 -1
  73. package/dist/init.d.ts +40 -20
  74. package/dist/plugins/ast-scope.d.ts +0 -1
  75. package/dist/plugins/async-hooks-stub.d.ts +0 -1
  76. package/dist/plugins/client-reference-dedup.d.ts +0 -1
  77. package/dist/plugins/client-reference-dedup.js +7 -5
  78. package/dist/plugins/css-data-url.d.ts +0 -1
  79. package/dist/plugins/css-module-imports.d.ts +0 -1
  80. package/dist/plugins/dynamic-preload-metadata.d.ts +0 -1
  81. package/dist/plugins/extensionless-dynamic-import.d.ts +0 -1
  82. package/dist/plugins/extensionless-dynamic-import.js +352 -13
  83. package/dist/plugins/fonts.d.ts +0 -1
  84. package/dist/plugins/ignore-dynamic-requests.d.ts +0 -1
  85. package/dist/plugins/ignore-dynamic-requests.js +28 -4
  86. package/dist/plugins/import-meta-url.d.ts +0 -1
  87. package/dist/plugins/instrumentation-client.d.ts +0 -1
  88. package/dist/plugins/middleware-server-only.d.ts +0 -1
  89. package/dist/plugins/og-asset-ownership.d.ts +0 -1
  90. package/dist/plugins/og-assets.d.ts +0 -1
  91. package/dist/plugins/optimize-imports.d.ts +0 -1
  92. package/dist/plugins/remove-console.d.ts +0 -1
  93. package/dist/plugins/require-context.d.ts +0 -1
  94. package/dist/plugins/require-context.js +143 -26
  95. package/dist/plugins/rsc-client-reference-loaders.d.ts +0 -1
  96. package/dist/plugins/rsc-reference-validation-normalizer.d.ts +0 -1
  97. package/dist/plugins/sass.d.ts +30 -2
  98. package/dist/plugins/sass.js +67 -5
  99. package/dist/plugins/server-externals-manifest.d.ts +0 -1
  100. package/dist/plugins/strip-server-exports.d.ts +0 -1
  101. package/dist/plugins/styled-jsx.d.ts +0 -1
  102. package/dist/plugins/wasm-module-import.d.ts +0 -1
  103. package/dist/routing/app-route-graph.d.ts +115 -56
  104. package/dist/routing/app-route-graph.js +2 -1
  105. package/dist/routing/app-router.d.ts +0 -1
  106. package/dist/routing/pages-router.d.ts +9 -5
  107. package/dist/routing/route-matching.d.ts +0 -1
  108. package/dist/routing/utils.d.ts +1 -23
  109. package/dist/routing/utils.js +1 -30
  110. package/dist/server/accept-encoding.d.ts +0 -1
  111. package/dist/server/api-handler.d.ts +0 -1
  112. package/dist/server/api-handler.js +4 -3
  113. package/dist/server/app-bfcache-identity.d.ts +9 -10
  114. package/dist/server/app-bfcache-identity.js +27 -102
  115. package/dist/server/app-browser-action-result.d.ts +0 -1
  116. package/dist/server/app-browser-client-reuse-manifest.d.ts +0 -1
  117. package/dist/server/app-browser-entry.d.ts +1 -1
  118. package/dist/server/app-browser-entry.js +106 -66
  119. package/dist/server/app-browser-history-controller.d.ts +8 -5
  120. package/dist/server/app-browser-hydration.d.ts +0 -1
  121. package/dist/server/app-browser-interception-context.d.ts +0 -1
  122. package/dist/server/app-browser-mpa-navigation.d.ts +0 -1
  123. package/dist/server/app-browser-navigation-controller.d.ts +3 -6
  124. package/dist/server/app-browser-navigation-controller.js +29 -4
  125. package/dist/server/app-browser-popstate.d.ts +0 -1
  126. package/dist/server/app-browser-prefetch-response.d.ts +25 -0
  127. package/dist/server/app-browser-prefetch-response.js +54 -0
  128. package/dist/server/app-browser-server-action-client.d.ts +1 -1
  129. package/dist/server/app-browser-server-action-client.js +3 -2
  130. package/dist/server/app-browser-server-action-navigation.d.ts +0 -1
  131. package/dist/server/app-browser-state.d.ts +11 -5
  132. package/dist/server/app-browser-state.js +10 -6
  133. package/dist/server/app-browser-stream.d.ts +0 -1
  134. package/dist/server/app-browser-visible-commit.d.ts +1 -1
  135. package/dist/server/app-browser-visible-commit.js +6 -2
  136. package/dist/server/app-elements-wire.d.ts +16 -13
  137. package/dist/server/app-elements-wire.js +37 -10
  138. package/dist/server/app-elements.d.ts +2 -3
  139. package/dist/server/app-elements.js +2 -2
  140. package/dist/server/app-fallback-renderer.d.ts +8 -4
  141. package/dist/server/app-fallback-renderer.js +2 -1
  142. package/dist/server/app-history-state.d.ts +2 -2
  143. package/dist/server/app-history-state.js +1 -1
  144. package/dist/server/app-hook-warning-suppression.d.ts +0 -1
  145. package/dist/server/app-layout-param-observation.d.ts +0 -1
  146. package/dist/server/app-layout-param-observation.js +1 -1
  147. package/dist/server/app-middleware.d.ts +5 -1
  148. package/dist/server/app-middleware.js +96 -31
  149. package/dist/server/app-optimistic-routing.d.ts +1 -0
  150. package/dist/server/app-page-boundary-render.d.ts +8 -4
  151. package/dist/server/app-page-cache-finalizer.d.ts +2 -3
  152. package/dist/server/app-page-cache-finalizer.js +47 -17
  153. package/dist/server/app-page-cache-render.d.ts +2 -2
  154. package/dist/server/app-page-cache-render.js +2 -1
  155. package/dist/server/app-page-cache.d.ts +1 -3
  156. package/dist/server/app-page-cache.js +22 -11
  157. package/dist/server/app-page-dispatch.d.ts +12 -6
  158. package/dist/server/app-page-dispatch.js +14 -6
  159. package/dist/server/app-page-element-builder.d.ts +63 -20
  160. package/dist/server/app-page-element-builder.js +114 -43
  161. package/dist/server/app-page-execution.d.ts +12 -5
  162. package/dist/server/app-page-execution.js +1 -1
  163. package/dist/server/app-page-head.d.ts +2 -2
  164. package/dist/server/app-page-http-access-fallback-metadata.d.ts +2 -2
  165. package/dist/server/app-page-params.d.ts +0 -1
  166. package/dist/server/app-page-ppr-runtime.d.ts +0 -1
  167. package/dist/server/app-page-probe.d.ts +4 -3
  168. package/dist/server/app-page-probe.js +1 -1
  169. package/dist/server/app-page-render-identity.d.ts +1 -0
  170. package/dist/server/app-page-render-observation.d.ts +0 -1
  171. package/dist/server/app-page-render.d.ts +7 -5
  172. package/dist/server/app-page-render.js +59 -24
  173. package/dist/server/app-page-request.d.ts +3 -2
  174. package/dist/server/app-page-request.js +6 -46
  175. package/dist/server/app-page-response.d.ts +15 -3
  176. package/dist/server/app-page-response.js +21 -3
  177. package/dist/server/app-page-route-wiring.d.ts +30 -7
  178. package/dist/server/app-page-route-wiring.js +163 -63
  179. package/dist/server/app-page-search-params-observation.d.ts +0 -1
  180. package/dist/server/app-page-segment-plan.d.ts +56 -0
  181. package/dist/server/app-page-segment-plan.js +177 -0
  182. package/dist/server/app-page-segment-state.d.ts +18 -2
  183. package/dist/server/app-page-segment-state.js +23 -4
  184. package/dist/server/app-page-stream.d.ts +19 -10
  185. package/dist/server/app-pages-bridge.d.ts +2 -2
  186. package/dist/server/app-pages-bridge.js +14 -2
  187. package/dist/server/app-post-middleware-context.d.ts +0 -1
  188. package/dist/server/app-ppr-fallback-shell-render.d.ts +0 -1
  189. package/dist/server/app-prerender-endpoints.d.ts +0 -1
  190. package/dist/server/app-prerender-static-params.d.ts +0 -1
  191. package/dist/server/app-render-dependency.d.ts +11 -4
  192. package/dist/server/app-render-dependency.js +59 -9
  193. package/dist/server/app-request-context.d.ts +1 -0
  194. package/dist/server/app-route-handler-cache.d.ts +2 -2
  195. package/dist/server/app-route-handler-cache.js +5 -1
  196. package/dist/server/app-route-handler-dispatch.d.ts +0 -1
  197. package/dist/server/app-route-handler-execution.d.ts +2 -2
  198. package/dist/server/app-route-handler-execution.js +5 -1
  199. package/dist/server/app-route-handler-policy.d.ts +0 -1
  200. package/dist/server/app-route-handler-response.d.ts +0 -1
  201. package/dist/server/app-route-handler-runtime.d.ts +0 -1
  202. package/dist/server/app-route-handler-runtime.js +1 -2
  203. package/dist/server/app-route-module-loader.d.ts +32 -6
  204. package/dist/server/app-route-module-loader.js +73 -3
  205. package/dist/server/app-router-entry.d.ts +0 -1
  206. package/dist/server/app-router-entry.js +2 -2
  207. package/dist/server/app-rsc-cache-busting.d.ts +7 -1
  208. package/dist/server/app-rsc-cache-busting.js +6 -0
  209. package/dist/server/app-rsc-handler.d.ts +9 -2
  210. package/dist/server/app-rsc-handler.js +173 -41
  211. package/dist/server/app-rsc-redirect-flight.d.ts +0 -1
  212. package/dist/server/app-rsc-render-mode.d.ts +3 -2
  213. package/dist/server/app-rsc-render-mode.js +4 -1
  214. package/dist/server/app-rsc-request-normalization.d.ts +19 -10
  215. package/dist/server/app-rsc-request-normalization.js +65 -4
  216. package/dist/server/app-rsc-response-finalizer.d.ts +5 -2
  217. package/dist/server/app-rsc-response-finalizer.js +31 -18
  218. package/dist/server/app-rsc-route-matching.d.ts +6 -1
  219. package/dist/server/app-rsc-route-matching.js +47 -2
  220. package/dist/server/app-segment-config.d.ts +0 -1
  221. package/dist/server/app-server-action-execution.d.ts +42 -9
  222. package/dist/server/app-server-action-execution.js +189 -111
  223. package/dist/server/app-ssr-entry.d.ts +5 -3
  224. package/dist/server/app-ssr-entry.js +4 -5
  225. package/dist/server/app-ssr-router-instance.d.ts +0 -1
  226. package/dist/server/app-ssr-stream.d.ts +7 -1
  227. package/dist/server/app-ssr-stream.js +2 -1
  228. package/dist/server/app-static-generation.d.ts +0 -1
  229. package/dist/server/app-visited-response-cache.d.ts +7 -2
  230. package/dist/server/app-visited-response-cache.js +49 -1
  231. package/dist/server/before-interactive-head.d.ts +0 -1
  232. package/dist/server/before-interactive-head.js +2 -0
  233. package/dist/server/bfcache-identity.d.ts +45 -0
  234. package/dist/server/bfcache-identity.js +52 -0
  235. package/dist/server/cache-control.d.ts +3 -3
  236. package/dist/server/cache-control.js +3 -2
  237. package/dist/server/cache-proof.d.ts +0 -1
  238. package/dist/server/client-reuse-manifest.d.ts +0 -1
  239. package/dist/server/config-headers.d.ts +2 -2
  240. package/dist/server/csp.d.ts +0 -1
  241. package/dist/server/default-global-error-module.d.ts +0 -1
  242. package/dist/server/default-global-not-found-module.d.ts +0 -1
  243. package/dist/server/default-not-found-module.d.ts +0 -1
  244. package/dist/server/dev-lockfile.d.ts +21 -9
  245. package/dist/server/dev-module-runner.d.ts +0 -1
  246. package/dist/server/dev-route-files.d.ts +0 -1
  247. package/dist/server/dev-server.d.ts +4 -8
  248. package/dist/server/dev-server.js +86 -131
  249. package/dist/server/dev-stack-sourcemap.d.ts +0 -1
  250. package/dist/server/document-initial-head.d.ts +12 -2
  251. package/dist/server/document-initial-head.js +17 -2
  252. package/dist/server/edge-api-runtime.d.ts +10 -1
  253. package/dist/server/edge-api-runtime.js +29 -1
  254. package/dist/server/file-based-metadata.d.ts +0 -1
  255. package/dist/server/headers.d.ts +17 -2
  256. package/dist/server/headers.js +17 -1
  257. package/dist/server/http-conditional.d.ts +22 -0
  258. package/dist/server/http-conditional.js +117 -0
  259. package/dist/server/http-date.d.ts +5 -0
  260. package/dist/server/http-date.js +73 -0
  261. package/dist/server/http-error-responses.d.ts +2 -1
  262. package/dist/server/http-error-responses.js +14 -2
  263. package/dist/server/http-range.d.ts +25 -0
  264. package/dist/server/http-range.js +67 -0
  265. package/dist/server/image-optimization.d.ts +14 -6
  266. package/dist/server/image-optimization.js +0 -1
  267. package/dist/server/instrumentation.d.ts +7 -4
  268. package/dist/server/isr-cache.d.ts +28 -6
  269. package/dist/server/isr-cache.js +19 -13
  270. package/dist/server/isr-decision.d.ts +6 -4
  271. package/dist/server/metadata-route-build-data.d.ts +0 -1
  272. package/dist/server/metadata-route-response.d.ts +0 -1
  273. package/dist/server/metadata-route-response.js +7 -6
  274. package/dist/server/metadata-routes.d.ts +34 -16
  275. package/dist/server/middleware-matcher-pattern.d.ts +0 -1
  276. package/dist/server/middleware-matcher.d.ts +8 -3
  277. package/dist/server/middleware-matcher.js +23 -18
  278. package/dist/server/middleware-runtime.d.ts +6 -1
  279. package/dist/server/middleware-runtime.js +91 -28
  280. package/dist/server/middleware.d.ts +0 -1
  281. package/dist/server/navigation-planner.d.ts +1 -1
  282. package/dist/server/next-error-digest.d.ts +0 -1
  283. package/dist/server/pages-api-route.d.ts +2 -1
  284. package/dist/server/pages-api-route.js +32 -7
  285. package/dist/server/pages-asset-tags.d.ts +3 -1
  286. package/dist/server/pages-asset-tags.js +6 -4
  287. package/dist/server/pages-data-route.d.ts +14 -6
  288. package/dist/server/pages-data-route.js +19 -10
  289. package/dist/server/pages-dev-hydration.js +3 -0
  290. package/dist/server/pages-dev-stylesheets.d.ts +10 -0
  291. package/dist/server/pages-dev-stylesheets.js +150 -0
  292. package/dist/server/pages-document-asset-props.d.ts +26 -0
  293. package/dist/server/pages-document-asset-props.js +69 -0
  294. package/dist/server/pages-document-initial-props.d.ts +10 -6
  295. package/dist/server/pages-get-initial-props.d.ts +2 -2
  296. package/dist/server/pages-i18n.d.ts +1 -7
  297. package/dist/server/pages-node-compat.d.ts +11 -2
  298. package/dist/server/pages-node-compat.js +52 -5
  299. package/dist/server/pages-page-data.d.ts +21 -9
  300. package/dist/server/pages-page-data.js +109 -30
  301. package/dist/server/pages-page-handler.d.ts +70 -32
  302. package/dist/server/pages-page-handler.js +25 -6
  303. package/dist/server/pages-page-response.d.ts +9 -13
  304. package/dist/server/pages-page-response.js +25 -26
  305. package/dist/server/pages-readiness.d.ts +0 -1
  306. package/dist/server/pages-request-pipeline.d.ts +20 -6
  307. package/dist/server/pages-request-pipeline.js +40 -20
  308. package/dist/server/pages-revalidate.d.ts +0 -1
  309. package/dist/server/pages-revalidate.js +1 -1
  310. package/dist/server/pages-router-entry.js +14 -10
  311. package/dist/server/prerender-manifest.d.ts +7 -0
  312. package/dist/server/prod-server.d.ts +13 -7
  313. package/dist/server/prod-server.js +276 -83
  314. package/dist/server/proxy-trust.d.ts +0 -1
  315. package/dist/server/request-log.d.ts +7 -11
  316. package/dist/server/request-pipeline.d.ts +13 -4
  317. package/dist/server/request-pipeline.js +28 -20
  318. package/dist/server/revalidation-host.d.ts +0 -1
  319. package/dist/server/revalidation-host.js +1 -1
  320. package/dist/server/rsc-completion-metadata.d.ts +15 -0
  321. package/dist/server/rsc-completion-metadata.js +183 -0
  322. package/dist/server/seed-cache.d.ts +2 -1
  323. package/dist/server/seed-cache.js +8 -5
  324. package/dist/server/skip-cache-proof.d.ts +0 -1
  325. package/dist/server/static-file-cache.d.ts +23 -9
  326. package/dist/server/static-file-cache.js +47 -23
  327. package/dist/server/static-layout-client-reuse-proof.d.ts +0 -1
  328. package/dist/server/worker-revalidation-context.d.ts +0 -1
  329. package/dist/server/worker-revalidation-context.js +1 -0
  330. package/dist/server/worker-utils.d.ts +3 -1
  331. package/dist/server/worker-utils.js +11 -2
  332. package/dist/shims/app-router-scroll-state.d.ts +2 -1
  333. package/dist/shims/app-router-scroll-state.js +7 -2
  334. package/dist/shims/app-router-scroll.d.ts +2 -8
  335. package/dist/shims/app.d.ts +1 -5
  336. package/dist/shims/before-interactive-context.d.ts +5 -3
  337. package/dist/shims/cache-handler.d.ts +6 -1
  338. package/dist/shims/cache-handler.js +4 -2
  339. package/dist/shims/cache-request-state.d.ts +12 -1
  340. package/dist/shims/cache-request-state.js +22 -1
  341. package/dist/shims/cache-runtime.d.ts +9 -5
  342. package/dist/shims/cache-runtime.js +16 -6
  343. package/dist/shims/cache.d.ts +2 -3
  344. package/dist/shims/cache.js +2 -2
  345. package/dist/shims/cdn-cache.d.ts +0 -1
  346. package/dist/shims/client-locale.d.ts +1 -6
  347. package/dist/shims/client-only.d.ts +1 -1
  348. package/dist/shims/compat-router.d.ts +0 -1
  349. package/dist/shims/constants.d.ts +1 -1
  350. package/dist/shims/default-global-error.d.ts +1 -4
  351. package/dist/shims/default-not-found.d.ts +0 -1
  352. package/dist/shims/document.d.ts +0 -1
  353. package/dist/shims/document.js +17 -3
  354. package/dist/shims/dynamic-preload-chunks.d.ts +0 -1
  355. package/dist/shims/dynamic.d.ts +0 -1
  356. package/dist/shims/error-boundary-navigation.d.ts +0 -1
  357. package/dist/shims/error-boundary.d.ts +7 -32
  358. package/dist/shims/error.d.ts +1 -6
  359. package/dist/shims/fetch-cache.js +112 -63
  360. package/dist/shims/font-google-base.d.ts +0 -1
  361. package/dist/shims/font-local.d.ts +0 -1
  362. package/dist/shims/form.d.ts +5 -3
  363. package/dist/shims/hash-scroll.d.ts +1 -1
  364. package/dist/shims/hash-scroll.js +2 -1
  365. package/dist/shims/head-state.d.ts +0 -1
  366. package/dist/shims/head.d.ts +1 -4
  367. package/dist/shims/headers.d.ts +2 -2
  368. package/dist/shims/headers.js +1 -1
  369. package/dist/shims/i18n-context.d.ts +0 -1
  370. package/dist/shims/i18n-state.d.ts +0 -1
  371. package/dist/shims/image.d.ts +0 -1
  372. package/dist/shims/image.js +1 -2
  373. package/dist/shims/internal/als-registry.d.ts +31 -2
  374. package/dist/shims/internal/als-registry.js +50 -2
  375. package/dist/shims/internal/app-prefetch-fetch-queue.d.ts +17 -2
  376. package/dist/shims/internal/app-prefetch-fetch-queue.js +69 -7
  377. package/dist/shims/internal/app-route-detection.d.ts +0 -1
  378. package/dist/shims/internal/app-route-prefetch-policy.d.ts +31 -0
  379. package/dist/shims/internal/app-route-prefetch-policy.js +57 -0
  380. package/dist/shims/internal/app-router-context.d.ts +0 -1
  381. package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +1 -5
  382. package/dist/shims/internal/hybrid-client-route-owner.d.ts +0 -1
  383. package/dist/shims/internal/hybrid-client-route-owner.js +6 -8
  384. package/dist/shims/internal/interpolate-as.d.ts +3 -2
  385. package/dist/shims/internal/pages-data-target.d.ts +21 -10
  386. package/dist/shims/internal/pages-data-target.js +1 -1
  387. package/dist/shims/internal/pages-data-url.d.ts +3 -1
  388. package/dist/shims/internal/router-context.d.ts +0 -1
  389. package/dist/shims/internal/work-unit-async-storage.d.ts +4 -3
  390. package/dist/shims/internal/work-unit-async-storage.js +2 -0
  391. package/dist/shims/layout-segment-context.d.ts +2 -6
  392. package/dist/shims/legacy-image.d.ts +0 -1
  393. package/dist/shims/link.d.ts +29 -21
  394. package/dist/shims/link.js +52 -97
  395. package/dist/shims/metadata.d.ts +11 -25
  396. package/dist/shims/metadata.js +24 -32
  397. package/dist/shims/navigation-context-state.d.ts +0 -1
  398. package/dist/shims/navigation-state.d.ts +1 -0
  399. package/dist/shims/navigation.d.ts +54 -6
  400. package/dist/shims/navigation.js +325 -73
  401. package/dist/shims/navigation.react-server.d.ts +1 -0
  402. package/dist/shims/og.d.ts +0 -1
  403. package/dist/shims/request-context.d.ts +8 -3
  404. package/dist/shims/request-state-types.d.ts +1 -0
  405. package/dist/shims/router.d.ts +44 -23
  406. package/dist/shims/router.js +8 -7
  407. package/dist/shims/script-nonce-context.d.ts +0 -1
  408. package/dist/shims/script.d.ts +25 -13
  409. package/dist/shims/server-only.d.ts +1 -1
  410. package/dist/shims/server.d.ts +1 -3
  411. package/dist/shims/server.js +5 -6
  412. package/dist/shims/slot.d.ts +23 -11
  413. package/dist/shims/slot.js +103 -19
  414. package/dist/shims/streamed-icons.d.ts +7 -0
  415. package/dist/shims/streamed-icons.js +33 -0
  416. package/dist/shims/unified-request-context.d.ts +44 -4
  417. package/dist/shims/unified-request-context.js +56 -2
  418. package/dist/shims/use-merged-ref.d.ts +0 -1
  419. package/dist/shims/web-vitals.d.ts +0 -1
  420. package/dist/typegen.d.ts +1 -2
  421. package/dist/typegen.js +1 -1
  422. package/dist/utils/cache-control-metadata.d.ts +13 -1
  423. package/dist/utils/cache-control-metadata.js +17 -1
  424. package/dist/utils/client-build-manifest.d.ts +0 -1
  425. package/dist/utils/domain-locale.d.ts +1 -5
  426. package/dist/utils/html-limited-bots.js +1 -1
  427. package/dist/utils/middleware-request-headers.d.ts +17 -5
  428. package/dist/utils/middleware-request-headers.js +32 -23
  429. package/dist/utils/precompressed-variant.d.ts +9 -0
  430. package/dist/utils/precompressed-variant.js +15 -0
  431. package/dist/utils/project.d.ts +12 -7
  432. package/dist/utils/public-file-path.d.ts +5 -0
  433. package/dist/utils/public-file-path.js +12 -0
  434. package/dist/utils/public-routes.d.ts +1 -1
  435. package/dist/utils/public-routes.js +6 -5
  436. package/package.json +7 -3
package/README.md CHANGED
@@ -367,6 +367,49 @@ export default defineConfig({
367
367
  > Adding an explicit `rsc()` call fails the build with `[vinext] Duplicate @vitejs/plugin-rsc detected`.
368
368
  > Pass `rsc: false` to `vinext()` only if you want to own that registration.
369
369
 
370
+ #### Module Federation (client-side)
371
+
372
+ For client-side Module Federation, configure React and React DOM as singleton shared modules in both the host and remotes:
373
+
374
+ ```ts
375
+ import { federation } from "@module-federation/vite";
376
+ import { defineConfig } from "vite";
377
+ import vinext from "vinext";
378
+
379
+ export default defineConfig({
380
+ plugins: [
381
+ federation({
382
+ name: "host",
383
+ shared: {
384
+ react: { singleton: true },
385
+ "react/": { singleton: true },
386
+ "react-dom": { singleton: true },
387
+ "react-dom/": { singleton: true },
388
+ },
389
+ }),
390
+ vinext(),
391
+ ],
392
+ });
393
+ ```
394
+
395
+ In a remote client component, use `getVinextReact()` before reading React hooks. vinext registers the host's browser React instance before application modules execute, and the first registration remains stable across remote evaluation and HMR:
396
+
397
+ ```tsx
398
+ "use client";
399
+
400
+ import * as React from "react";
401
+ import { getVinextReact } from "vinext/client";
402
+
403
+ const { useState } = getVinextReact(React);
404
+
405
+ export function RemoteCounter() {
406
+ const [count, setCount] = useState(0);
407
+ return <button onClick={() => setCount((value) => value + 1)}>{count}</button>;
408
+ }
409
+ ```
410
+
411
+ This bridge is browser-only. It does not provide App Router Module Federation SSR or transparently replace React imports inside third-party packages; compatible React versions remain the responsibility of the Module Federation `shared` configuration.
412
+
370
413
  See the [examples](#live-examples) for complete working configurations.
371
414
 
372
415
  ### Other platforms (via Nitro)
@@ -638,9 +681,7 @@ vinext({
638
681
  cache: {
639
682
  data: {
640
683
  adapter: require.resolve("./my-adapter.js"),
641
- options: {
642
- /* … */
643
- },
684
+ options: {/* … */},
644
685
  },
645
686
  },
646
687
  });
@@ -1,5 +1,4 @@
1
1
  import { UserConfig } from "vite";
2
-
3
2
  //#region src/build/client-build-config.d.ts
4
3
  type ClientAssetFileNameInfo = {
5
4
  readonly name?: string;
@@ -1,5 +1,4 @@
1
1
  import { Rolldown } from "vite";
2
-
3
2
  //#region src/build/css-url-assets.d.ts
4
3
  type BundleAsset = Rolldown.OutputAsset;
5
4
  type CssUrlAssetBundle = Rolldown.OutputBundle;
@@ -1,7 +1,10 @@
1
1
  //#region src/build/google-fonts/build-url.d.ts
2
2
  type FontAxes = {
3
- /** Weight values: explicit faces ("400") or a variable range ("400..800"). */wght?: string[]; /** Ital values, "0" (normal) and/or "1" (italic). */
4
- ital?: string[]; /** Other variable axes the caller wants to include, e.g. `[["opsz","14..32"]]`. */
3
+ /** Weight values: explicit faces ("400") or a variable range ("400..800"). */
4
+ wght?: string[];
5
+ /** Ital values, "0" (normal) and/or "1" (italic). */
6
+ ital?: string[];
7
+ /** Other variable axes the caller wants to include, e.g. `[["opsz","14..32"]]`. */
5
8
  variableAxes?: [string, string][];
6
9
  };
7
10
  declare function buildGoogleFontsUrl(fontFamily: string, axes: FontAxes, display: string): string;
@@ -6,9 +6,13 @@ type VariableAxisDescriptor = {
6
6
  defaultValue: number;
7
7
  };
8
8
  type FontFamilyMetadata = {
9
- /** Available weight values, plus the literal "variable" if a variable face exists. */weights: string[]; /** Available styles, e.g. ["normal"], ["italic"], or both. */
10
- styles: string[]; /** Variable axes for this family. Absent when the family has no variable face. */
11
- axes?: VariableAxisDescriptor[]; /** Preloadable subsets (e.g. "latin", "latin-ext", "vietnamese"). */
9
+ /** Available weight values, plus the literal "variable" if a variable face exists. */
10
+ weights: string[];
11
+ /** Available styles, e.g. ["normal"], ["italic"], or both. */
12
+ styles: string[];
13
+ /** Variable axes for this family. Absent when the family has no variable face. */
14
+ axes?: VariableAxisDescriptor[];
15
+ /** Preloadable subsets (e.g. "latin", "latin-ext", "vietnamese"). */
12
16
  subsets: string[];
13
17
  };
14
18
  declare const googleFontsMetadata: Record<string, FontFamilyMetadata>;
@@ -1,5 +1,4 @@
1
1
  import { FontAxes } from "./build-url.js";
2
-
3
2
  //#region src/build/google-fonts/get-axes.d.ts
4
3
  declare function getFontAxes(fontFamily: string, weights: string[], styles: string[], selectedVariableAxes?: string[]): FontAxes;
5
4
  //#endregion
@@ -1,9 +1,9 @@
1
1
  import { ClassificationReason, LayoutBuildClassification, ModuleGraphStaticReason } from "./layout-classification-types.js";
2
-
3
2
  //#region src/build/layout-classification.d.ts
4
3
  type ModuleGraphClassification = "static" | "needs-probe";
5
4
  type ModuleGraphClassificationResult = {
6
- result: ModuleGraphClassification; /** First dynamic shim module ID encountered during BFS, when any. */
5
+ result: ModuleGraphClassification;
6
+ /** First dynamic shim module ID encountered during BFS, when any. */
7
7
  firstShimMatch?: string;
8
8
  };
9
9
  type ModuleInfoProvider = {
@@ -13,8 +13,11 @@ type ModuleInfoProvider = {
13
13
  } | null;
14
14
  };
15
15
  type LayoutEntry = {
16
- /** Rollup/Vite module ID for the layout file. */moduleId: string; /** Directory depth from the app root, used to build the stable layout ID. */
17
- treePosition: number; /** Segment config source code extracted at build time, or null when absent. */
16
+ /** Rollup/Vite module ID for the layout file. */
17
+ moduleId: string;
18
+ /** Directory depth from the app root, used to build the stable layout ID. */
19
+ treePosition: number;
20
+ /** Segment config source code extracted at build time, or null when absent. */
18
21
  segmentConfig?: {
19
22
  code: string;
20
23
  } | null;
@@ -1,5 +1,4 @@
1
1
  import { ResolvedNextConfig } from "../config/next-config.js";
2
-
3
2
  //#region src/build/next-client-runtime-manifests.d.ts
4
3
  type EmitNextClientRuntimeManifestsOptions = {
5
4
  clientDir: string;
@@ -1,27 +1,10 @@
1
1
  import path from "../deps/.pnpm/pathslash@0.1.0/deps/pathslash/dist/index.js";
2
+ import { toClientRewrites } from "../client/client-rewrites.js";
2
3
  import fs from "node:fs";
3
4
  //#region src/build/next-client-runtime-manifests.ts
4
- function normalizeRewriteForClientManifest(rewrite) {
5
- if (rewrite.destination.startsWith("/")) return {
6
- has: rewrite.has,
7
- source: rewrite.source,
8
- destination: rewrite.destination
9
- };
10
- return {
11
- has: rewrite.has,
12
- source: rewrite.source
13
- };
14
- }
15
- function normalizeRewritesForClientManifest(rewrites) {
16
- return {
17
- beforeFiles: rewrites.beforeFiles.map(normalizeRewriteForClientManifest),
18
- afterFiles: rewrites.afterFiles.map(normalizeRewriteForClientManifest),
19
- fallback: rewrites.fallback.map(normalizeRewriteForClientManifest)
20
- };
21
- }
22
5
  function buildNextClientBuildManifestContent(rewrites) {
23
6
  const manifest = {
24
- __rewrites: normalizeRewritesForClientManifest(rewrites),
7
+ __rewrites: toClientRewrites(rewrites),
25
8
  sortedPages: []
26
9
  };
27
10
  return `self.__BUILD_MANIFEST = ${JSON.stringify(manifest)};self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB()`;
@@ -1,5 +1,4 @@
1
1
  import { RouteRow } from "./report.js";
2
-
3
2
  //#region src/build/nitro-route-rules.d.ts
4
3
  type NitroRouteRuleConfig = Record<string, unknown> & {
5
4
  swr?: boolean | number;
@@ -1,5 +1,4 @@
1
1
  import { PagesClientAssets } from "../server/pages-client-assets.js";
2
-
3
2
  //#region src/build/pages-client-assets-module.d.ts
4
3
  declare const PAGES_CLIENT_ASSETS_MODULE = "vinext-client-assets.js";
5
4
  declare function buildPagesClientAssetsModule(assets: PagesClientAssets): string;
@@ -1,7 +1,11 @@
1
1
  //#region src/build/precompress.d.ts
2
2
  type PrecompressResult = {
3
3
  filesCompressed: number;
4
- totalOriginalBytes: number; /** Sum of brotli-compressed sizes (used for compression ratio reporting). */
4
+ totalOriginalBytes: number;
5
+ /**
6
+ * Sum of the representation sizes Brotli negotiation would serve. Falls
7
+ * back to the original size when Brotli is not beneficial for a file.
8
+ */
5
9
  totalBrotliBytes: number;
6
10
  };
7
11
  /**
@@ -20,7 +24,8 @@ type PrecompressResult = {
20
24
  * emit zero compressed variants.
21
25
  */
22
26
  declare function precompressAssets(clientDir: string, options?: {
23
- /** Subdirectory under `clientDir` containing hashed assets. Defaults to `"_next/static"`. */assetsDir?: string;
27
+ /** Subdirectory under `clientDir` containing hashed assets. Defaults to `"_next/static"`. */
28
+ assetsDir?: string;
24
29
  onProgress?: (completed: number, total: number, file: string) => void;
25
30
  }): Promise<PrecompressResult>;
26
31
  //#endregion
@@ -1,9 +1,11 @@
1
1
  import path from "../deps/.pnpm/pathslash@0.1.0/deps/pathslash/dist/index.js";
2
2
  import { ASSET_PREFIX_URL_DIR } from "../utils/asset-prefix.js";
3
+ import { isPrecompressedVariantBeneficial } from "../utils/precompressed-variant.js";
3
4
  import fsp from "node:fs/promises";
5
+ import { randomUUID } from "node:crypto";
6
+ import { promisify } from "node:util";
4
7
  import os from "node:os";
5
8
  import zlib from "node:zlib";
6
- import { promisify } from "node:util";
7
9
  //#region src/build/precompress.ts
8
10
  /**
9
11
  * Build-time precompression for hashed static assets.
@@ -90,21 +92,53 @@ async function precompressAssets(clientDir, options = {}) {
90
92
  const chunk = filePaths.slice(i, i + CONCURRENCY);
91
93
  await Promise.all(chunk.map(async (fullPath) => {
92
94
  const content = await fsp.readFile(fullPath);
93
- if (content.length < MIN_SIZE) return;
95
+ if (content.length < MIN_SIZE) {
96
+ await removeCompressedVariants(fullPath);
97
+ return;
98
+ }
94
99
  const compressions = [brotliCompress(content, { params: { [zlib.constants.BROTLI_PARAM_QUALITY]: 5 } }), gzip(content, { level: 8 })];
95
100
  if (zstdCompress) compressions.push(zstdCompress(content, { params: { [zlib.constants.ZSTD_c_compressionLevel]: 8 } }));
96
101
  const [brContent, gzContent, zstdContent] = await Promise.all(compressions);
97
- const writes = [fsp.writeFile(fullPath + ".br", brContent), fsp.writeFile(fullPath + ".gz", gzContent)];
98
- if (zstdContent) writes.push(fsp.writeFile(fullPath + ".zst", zstdContent));
99
- await Promise.all(writes);
100
- result.filesCompressed++;
101
- result.totalOriginalBytes += content.length;
102
- result.totalBrotliBytes += brContent.length;
102
+ const outcomes = await Promise.all([
103
+ writeBeneficialVariant(fullPath + ".br", brContent, content.length, "br"),
104
+ writeBeneficialVariant(fullPath + ".gz", gzContent, content.length, "gzip"),
105
+ zstdContent ? writeBeneficialVariant(fullPath + ".zst", zstdContent, content.length, "zstd") : removeFileIfPresent(fullPath + ".zst").then(() => false)
106
+ ]);
107
+ if (outcomes.some(Boolean)) {
108
+ result.filesCompressed++;
109
+ result.totalOriginalBytes += content.length;
110
+ result.totalBrotliBytes += outcomes[0] ? brContent.length : content.length;
111
+ }
103
112
  }));
104
113
  processed += chunk.length;
105
114
  onProgress?.(processed, filePaths.length, path.basename(chunk[chunk.length - 1]));
106
115
  }
107
116
  return result;
108
117
  }
118
+ async function writeBeneficialVariant(destination, compressed, originalSize, encoding) {
119
+ if (!isPrecompressedVariantBeneficial(compressed.length, originalSize, encoding)) {
120
+ await removeFileIfPresent(destination);
121
+ return false;
122
+ }
123
+ const temporary = `${destination}.${process.pid}.${randomUUID()}.tmp`;
124
+ try {
125
+ await fsp.writeFile(temporary, compressed);
126
+ await fsp.rename(temporary, destination);
127
+ } catch (error) {
128
+ await removeFileIfPresent(temporary);
129
+ throw error;
130
+ }
131
+ return true;
132
+ }
133
+ async function removeCompressedVariants(fullPath) {
134
+ await Promise.all([
135
+ removeFileIfPresent(fullPath + ".br"),
136
+ removeFileIfPresent(fullPath + ".gz"),
137
+ removeFileIfPresent(fullPath + ".zst")
138
+ ]);
139
+ }
140
+ async function removeFileIfPresent(filePath) {
141
+ await fsp.rm(filePath, { force: true });
142
+ }
109
143
  //#endregion
110
144
  export { precompressAssets };
@@ -1,6 +1,5 @@
1
1
  import { ResolvedNextConfig } from "../config/next-config.js";
2
2
  import { VinextRouteRootConfig } from "../config/prerender.js";
3
-
4
3
  //#region src/build/prerender-paths.d.ts
5
4
  type PrerenderPathManifest = {
6
5
  buildId?: string;
@@ -10,7 +9,8 @@ type PrerenderPathManifest = {
10
9
  declare const PRERENDER_PATH_DISCOVERY_ENV = "__VINEXT_PRERENDER_PATH_DISCOVERY";
11
10
  declare const PRERENDER_PATHS_MANIFEST = "vinext-prerender-paths.json";
12
11
  type EmitPrerenderPathManifestOptions = {
13
- root: string; /** Fully resolved Next.js config. Loaded from disk when omitted. */
12
+ root: string;
13
+ /** Fully resolved Next.js config. Loaded from disk when omitted. */
14
14
  nextConfig?: ResolvedNextConfig;
15
15
  appDir?: string | null;
16
16
  pagesDir?: string | null;
@@ -1 +1 @@
1
- export { };
1
+ export {}
@@ -7,7 +7,8 @@
7
7
  */
8
8
  declare function prerenderPoolAvailable(): boolean;
9
9
  type PrerenderServerPool = {
10
- /** Ports of the forked render servers, for round-robin per-route fetches. */ports: number[];
10
+ /** Ports of the forked render servers, for round-robin per-route fetches. */
11
+ ports: number[];
11
12
  /**
12
13
  * Throw if any worker exited unexpectedly (i.e. not via `close()`). The
13
14
  * caller MUST call this after the render loop: a crashed worker makes every
@@ -21,7 +22,8 @@ type PrerenderServerPool = {
21
22
  * Record a failed fetch to a render worker. This closes the tiny ordering gap
22
23
  * where the request can fail before Node has delivered the child `exit` event.
23
24
  */
24
- recordRenderError: (err: unknown) => void; /** Kill every forked server. Safe to call more than once. */
25
+ recordRenderError: (err: unknown) => void;
26
+ /** Kill every forked server. Safe to call more than once. */
25
27
  close: () => Promise<void>;
26
28
  };
27
29
  /**
@@ -4,26 +4,35 @@ import { AppRoute } from "../routing/app-route-graph.js";
4
4
  import { MetadataFileRoute } from "../server/metadata-routes.js";
5
5
  import { readPrerenderSecret } from "./server-manifest.js";
6
6
  import { Server } from "node:http";
7
-
8
7
  //#region src/build/prerender.d.ts
9
8
  type PrerenderResult = {
10
- /** One entry per route (including skipped/error routes). */routes: PrerenderRouteResult[]; /** Additional generated files that are not represented as route entries. */
9
+ /** One entry per route (including skipped/error routes). */
10
+ routes: PrerenderRouteResult[];
11
+ /** Additional generated files that are not represented as route entries. */
11
12
  outputFiles?: string[];
12
13
  };
13
14
  type PrerenderRouteResult = {
14
- /** The route's file-system pattern, e.g. `/blog/:slug`. */route: string;
15
+ /** The route's file-system pattern, e.g. `/blog/:slug`. */
16
+ route: string;
15
17
  status: "rendered";
16
18
  outputFiles: string[];
17
19
  revalidate: number | false;
18
20
  expire?: number;
21
+ /** Client-router reuse bound resolved from the prerender's `cacheLife`. */
22
+ stale?: number;
19
23
  /**
20
24
  * The concrete prerendered URL path, e.g. `/blog/hello-world`.
21
25
  * Only present when the route is dynamic and `path` differs from `route`.
22
26
  * Omitted for non-dynamic routes where pattern === path.
23
27
  */
24
- path?: string; /** Which router produced this route. Used by cache seeding. */
25
- router: "app" | "pages"; /** Response headers that must be replayed with the prerendered artifact. */
26
- headers?: Record<string, string>; /** Set to true when this is a PPR fallback shell. */
28
+ path?: string;
29
+ /** Which router produced this route. Used by cache seeding. */
30
+ router: "app" | "pages";
31
+ /** Response headers that must be replayed with the prerendered artifact. */
32
+ headers?: Record<string, string>;
33
+ /** Cache tags collected while rendering this route. */
34
+ tags?: string[];
35
+ /** Set to true when this is a PPR fallback shell. */
27
36
  fallback?: boolean;
28
37
  } | {
29
38
  route: string;
@@ -43,9 +52,13 @@ type PrerenderRouteResult = {
43
52
  };
44
53
  /** Called after each route is resolved (rendered, skipped, or error). */
45
54
  type PrerenderProgressCallback = (update: {
46
- /** Routes completed so far (rendered + skipped + error). */completed: number; /** Total routes queued for rendering. */
47
- total: number; /** The route URL that just finished. */
48
- route: string; /** Its final status. */
55
+ /** Routes completed so far (rendered + skipped + error). */
56
+ completed: number;
57
+ /** Total routes queued for rendering. */
58
+ total: number;
59
+ /** The route URL that just finished. */
60
+ route: string;
61
+ /** Its final status. */
49
62
  status: PrerenderRouteResult["status"];
50
63
  }) => void;
51
64
  type PrerenderOptions = {
@@ -53,7 +66,8 @@ type PrerenderOptions = {
53
66
  * 'default' — prerender static/ISR routes; skip SSR routes
54
67
  * 'export' — same as default but SSR routes are errors
55
68
  */
56
- mode: "default" | "export"; /** Output directory for generated HTML/RSC files. */
69
+ mode: "default" | "export";
70
+ /** Output directory for generated HTML/RSC files. */
57
71
  outDir: string;
58
72
  /**
59
73
  * Directory where `vinext-prerender.json` is written.
@@ -61,7 +75,8 @@ type PrerenderOptions = {
61
75
  * Set this when the manifest should land in a different location than the
62
76
  * generated HTML/RSC files (e.g. `dist/server/` while HTML goes to `dist/server/prerendered-routes/`).
63
77
  */
64
- manifestDir?: string; /** Resolved next.config.js. */
78
+ manifestDir?: string;
79
+ /** Resolved next.config.js. */
65
80
  config: ResolvedNextConfig;
66
81
  /**
67
82
  * Maximum number of routes rendered in parallel.
@@ -81,8 +96,11 @@ type PrerenderOptions = {
81
96
  skipManifest?: boolean;
82
97
  };
83
98
  type PrerenderPagesOptions = {
84
- /** Discovered page routes (non-API). */routes: Route[]; /** Discovered API routes. */
85
- apiRoutes: Route[]; /** Pages directory path. */
99
+ /** Discovered page routes (non-API). */
100
+ routes: Route[];
101
+ /** Discovered API routes. */
102
+ apiRoutes: Route[];
103
+ /** Pages directory path. */
86
104
  pagesDir: string;
87
105
  /**
88
106
  * Absolute path to the pre-built Pages Router server bundle
@@ -94,7 +112,9 @@ type PrerenderPagesOptions = {
94
112
  pagesBundlePath?: string;
95
113
  } & PrerenderOptions;
96
114
  type PrerenderAppOptions = {
97
- /** Discovered app routes. */routes: AppRoute[]; /** Discovered file-based metadata routes. Used by static export. */
115
+ /** Discovered app routes. */
116
+ routes: AppRoute[];
117
+ /** Discovered file-based metadata routes. Used by static export. */
98
118
  metadataRoutes?: readonly MetadataFileRoute[];
99
119
  /**
100
120
  * Absolute path to the pre-built RSC handler bundle (e.g. `dist/server/index.js`).
@@ -171,15 +191,7 @@ declare function resolveParentParams(childRoute: AppRoute, staticParamsMap: Stat
171
191
  * Writes HTML files to `outDir`. If `manifestDir` is set, writes
172
192
  * `vinext-prerender.json` there; otherwise writes it to `outDir`.
173
193
  */
174
- declare function prerenderPages({
175
- routes,
176
- apiRoutes,
177
- pagesDir,
178
- outDir,
179
- config,
180
- mode,
181
- ...options
182
- }: PrerenderPagesOptionsInternal): Promise<PrerenderResult>;
194
+ declare function prerenderPages({ routes, apiRoutes, pagesDir, outDir, config, mode, ...options }: PrerenderPagesOptionsInternal): Promise<PrerenderResult>;
183
195
  /**
184
196
  * Run the prerender phase for App Router.
185
197
  *
@@ -197,15 +209,7 @@ declare function prerenderPages({
197
209
  * If they succeed, they are marked as rendered. If they throw a DynamicUsageError
198
210
  * or fail, they are marked as skipped with reason 'dynamic'.
199
211
  */
200
- declare function prerenderApp({
201
- routes,
202
- metadataRoutes,
203
- outDir,
204
- config,
205
- mode,
206
- rscBundlePath,
207
- ...options
208
- }: PrerenderAppOptionsInternal): Promise<PrerenderResult>;
212
+ declare function prerenderApp({ routes, metadataRoutes, outDir, config, mode, rscBundlePath, ...options }: PrerenderAppOptionsInternal): Promise<PrerenderResult>;
209
213
  /**
210
214
  * Write `vinext-prerender.json` to `outDir`.
211
215
  *
@@ -1,8 +1,9 @@
1
1
  import path from "../deps/.pnpm/pathslash@0.1.0/deps/pathslash/dist/index.js";
2
2
  import { createValidFileMatcher, findFileWithExtensions } from "../routing/file-matcher.js";
3
3
  import { VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER, VINEXT_PRERENDER_SPECULATIVE_HEADER } from "../utils/protocol-headers.js";
4
- import { VINEXT_PRERENDER_CACHE_LIFE_HEADER } from "../server/headers.js";
4
+ import { NEXT_CACHE_TAGS_HEADER, VINEXT_PRERENDER_CACHE_LIFE_HEADER } from "../server/headers.js";
5
5
  import { classifyAppRoute, classifyPagesRoute, getAppRouteRenderEntryPath } from "./report.js";
6
+ import { resolveClientStaleTimeSeconds } from "../utils/cache-control-metadata.js";
6
7
  import { NoOpCacheHandler, getCacheHandler, setCacheHandler } from "../shims/cache-handler.js";
7
8
  import { headersContextFromRequest, runWithHeadersContext } from "../shims/headers.js";
8
9
  import { _consumeRequestScopedCacheLife } from "../shims/cache-request-state.js";
@@ -760,6 +761,7 @@ async function prerenderApp({ routes, metadataRoutes = [], outDir, config, mode,
760
761
  const cacheControl = response.headers.get("cache-control") ?? "";
761
762
  const linkHeader = response.headers.get("link");
762
763
  const responseCacheLife = readPrerenderCacheLifeHeader(response.headers);
764
+ const cacheTags = readPrerenderCacheTagsHeader(response.headers);
763
765
  if (!response.ok || cacheControl.includes("no-store")) {
764
766
  await response.body?.cancel();
765
767
  return {
@@ -768,6 +770,7 @@ async function prerenderApp({ routes, metadataRoutes = [], outDir, config, mode,
768
770
  html: null,
769
771
  ok: response.ok,
770
772
  requestCacheLife: null,
773
+ tags: [],
771
774
  status: response.status
772
775
  };
773
776
  }
@@ -779,7 +782,8 @@ async function prerenderApp({ routes, metadataRoutes = [], outDir, config, mode,
779
782
  html,
780
783
  ok: true,
781
784
  requestCacheLife: responseCacheLife ?? processCacheLife,
782
- status: response.status
785
+ status: response.status,
786
+ tags: cacheTags
783
787
  };
784
788
  });
785
789
  const htmlCacheControl = htmlRender.cacheControl;
@@ -835,13 +839,16 @@ async function prerenderApp({ routes, metadataRoutes = [], outDir, config, mode,
835
839
  outputFiles.push(rscOutputPath);
836
840
  const renderedCacheControl = resolveRenderedCacheControl(htmlRender.requestCacheLife ?? {}, htmlCacheControl, config.expireTime);
837
841
  const renderedRevalidate = typeof revalidate === "number" ? renderedCacheControl.revalidate === void 0 ? revalidate : Math.min(revalidate, renderedCacheControl.revalidate) : renderedCacheControl.revalidate ?? revalidate;
842
+ const renderedStale = resolveClientStaleTimeSeconds(htmlRender.requestCacheLife);
838
843
  return {
839
844
  route: routePattern,
840
845
  status: "rendered",
841
846
  outputFiles,
842
847
  revalidate: renderedRevalidate,
843
848
  ...typeof renderedRevalidate === "number" ? { expire: renderedCacheControl.expire } : {},
849
+ ...renderedStale === void 0 ? {} : { stale: renderedStale },
844
850
  router: "app",
851
+ ...htmlRender.tags.length > 0 ? { tags: htmlRender.tags } : {},
845
852
  ...htmlRender.linkHeader ? { headers: { link: htmlRender.linkHeader } } : {},
846
853
  ...urlPath !== routePattern ? { path: urlPath } : {},
847
854
  ...isFallback ? { fallback: true } : {}
@@ -940,11 +947,17 @@ function readPrerenderCacheLifeHeader(headers) {
940
947
  const cacheLife = {};
941
948
  if (typeof parsed.revalidate === "number" && Number.isFinite(parsed.revalidate)) cacheLife.revalidate = parsed.revalidate;
942
949
  if (typeof parsed.expire === "number" && Number.isFinite(parsed.expire)) cacheLife.expire = parsed.expire;
943
- return cacheLife.revalidate === void 0 && cacheLife.expire === void 0 ? null : cacheLife;
950
+ if (typeof parsed.stale === "number" && Number.isFinite(parsed.stale) && parsed.stale >= 0) cacheLife.stale = parsed.stale;
951
+ return cacheLife.revalidate === void 0 && cacheLife.expire === void 0 && cacheLife.stale === void 0 ? null : cacheLife;
944
952
  } catch {
945
953
  return null;
946
954
  }
947
955
  }
956
+ function readPrerenderCacheTagsHeader(headers) {
957
+ const value = headers.get(NEXT_CACHE_TAGS_HEADER);
958
+ if (!value) return [];
959
+ return [...new Set(value.split(",").filter(Boolean))];
960
+ }
948
961
  function resolveRenderedExpireSeconds(options) {
949
962
  const { fallbackExpireSeconds, sMaxage, staleWhileRevalidate } = options;
950
963
  if (sMaxage === void 0 || staleWhileRevalidate === void 0) return fallbackExpireSeconds;
@@ -975,7 +988,9 @@ function writePrerenderIndex(routes, outDir, options) {
975
988
  status: r.status,
976
989
  revalidate: r.revalidate,
977
990
  ...typeof r.revalidate === "number" ? { expire: r.expire } : {},
991
+ ...typeof r.stale === "number" ? { stale: r.stale } : {},
978
992
  router: r.router,
993
+ ...r.tags && r.tags.length > 0 ? { tags: r.tags } : {},
979
994
  ...r.headers ? { headers: r.headers } : {},
980
995
  ...r.path ? { path: r.path } : {},
981
996
  ...r.fallback ? { fallback: true } : {}
@@ -0,0 +1,14 @@
1
+ //#region src/build/public-dir-conflict.d.ts
2
+ type PublicDirConflictOptions = {
3
+ root: string;
4
+ publicDir: string | null;
5
+ assetsDir: string;
6
+ };
7
+ type PublicNextRequestConflictOptions = Pick<PublicDirConflictOptions, "root" | "publicDir"> & {
8
+ basePath: string;
9
+ requestUrl: string;
10
+ };
11
+ declare function assertNoPublicNextRequestConflict({ root, publicDir, basePath, requestUrl }: PublicNextRequestConflictOptions): void;
12
+ declare function assertNoPublicDirAssetConflict({ root, publicDir, assetsDir }: PublicDirConflictOptions): void;
13
+ //#endregion
14
+ export { PublicDirConflictOptions, PublicNextRequestConflictOptions, assertNoPublicDirAssetConflict, assertNoPublicNextRequestConflict };
@@ -0,0 +1,25 @@
1
+ import path from "../deps/.pnpm/pathslash@0.1.0/deps/pathslash/dist/index.js";
2
+ import { existsSync } from "node:fs";
3
+ //#region src/build/public-dir-conflict.ts
4
+ const PUBLIC_NEXT_CONFLICT_ERROR = "You can not have a '_next' folder inside of your public folder. This conflicts with the internal '/_next' route. https://nextjs.org/docs/messages/public-next-folder-conflict";
5
+ function assertNoPublicNextDir(root, publicDir) {
6
+ if (!publicDir) return;
7
+ if (existsSync(path.join(path.resolve(root, publicDir), "_next"))) throw new Error(PUBLIC_NEXT_CONFLICT_ERROR);
8
+ }
9
+ function assertNoPublicNextRequestConflict({ root, publicDir, basePath, requestUrl }) {
10
+ const internalOrigin = "http://vinext.invalid";
11
+ const parseTarget = requestUrl.startsWith("/") ? internalOrigin + requestUrl : requestUrl;
12
+ let pathname = new URL(parseTarget, internalOrigin).pathname;
13
+ if (basePath && (pathname === basePath || pathname.startsWith(basePath + "/"))) pathname = pathname.slice(basePath.length) || "/";
14
+ if (pathname.startsWith("/_next")) assertNoPublicNextDir(root, publicDir);
15
+ }
16
+ function assertNoPublicDirAssetConflict({ root, publicDir, assetsDir }) {
17
+ assertNoPublicNextDir(root, publicDir);
18
+ if (!publicDir || !assetsDir) return;
19
+ const resolvedPublicDir = path.resolve(root, publicDir);
20
+ const publicAssetsDir = path.resolve(resolvedPublicDir, assetsDir);
21
+ const relativeAssetsDir = path.relative(resolvedPublicDir, publicAssetsDir);
22
+ if (relativeAssetsDir !== "" && !relativeAssetsDir.startsWith("../") && !path.isAbsolute(relativeAssetsDir) && existsSync(publicAssetsDir)) throw new Error(`[vinext] The public directory contains a path reserved for build assets: ${relativeAssetsDir}`);
23
+ }
24
+ //#endregion
25
+ export { assertNoPublicDirAssetConflict, assertNoPublicNextRequestConflict };
@@ -2,12 +2,12 @@ import { LayoutBuildClassification } from "./layout-classification-types.js";
2
2
  import { Route } from "../routing/pages-router.js";
3
3
  import { AppRoute } from "../routing/app-route-graph.js";
4
4
  import { PrerenderResult } from "./prerender.js";
5
-
6
5
  //#region src/build/report.d.ts
7
6
  type RouteType = "static" | "isr" | "ssr" | "unknown" | "api";
8
7
  type RouteRow = {
9
8
  pattern: string;
10
- type: RouteType; /** Only set for `isr` routes. */
9
+ type: RouteType;
10
+ /** Only set for `isr` routes. */
11
11
  revalidate?: number;
12
12
  /**
13
13
  * True when the route was classified as `static` by speculative prerender
@@ -1,6 +1,5 @@
1
1
  import { ModuleInfoProvider } from "./layout-classification.js";
2
2
  import { RouteClassificationManifest } from "./route-classification-manifest.js";
3
-
4
3
  //#region src/build/route-classification-injector.d.ts
5
4
  /**
6
5
  * Build-time route classification injection.
@@ -1,11 +1,13 @@
1
1
  import { ClassificationReason, ModuleGraphStaticReason } from "./layout-classification-types.js";
2
2
  import { AppRoute } from "../routing/app-route-graph.js";
3
-
4
3
  //#region src/build/route-classification-manifest.d.ts
5
4
  type Layer1Class = "static" | "dynamic";
6
5
  type RouteManifestEntry = {
7
- /** Route pattern for diagnostics (e.g. "/blog/:slug"). */pattern: string; /** Absolute file paths for each layout, ordered root → leaf. */
8
- layoutPaths: string[]; /** Layer 1 (segment config) results keyed by numeric layout index. */
6
+ /** Route pattern for diagnostics (e.g. "/blog/:slug"). */
7
+ pattern: string;
8
+ /** Absolute file paths for each layout, ordered root → leaf. */
9
+ layoutPaths: string[];
10
+ /** Layer 1 (segment config) results keyed by numeric layout index. */
9
11
  layer1: Map<number, Layer1Class>;
10
12
  /**
11
13
  * Structured reasons for every Layer 1 decision, keyed by the same layout
@@ -1,9 +1,10 @@
1
1
  import { ResolvedNextConfig } from "../config/next-config.js";
2
2
  import { PrerenderResult, PrerenderRouteResult } from "./prerender.js";
3
-
4
3
  //#region src/build/run-prerender.d.ts
5
4
  type RunPrerenderOptions = {
6
- /** Project root directory. */root: string; /** Fully resolved Next.js config. Loaded from disk when omitted. */
5
+ /** Project root directory. */
6
+ root: string;
7
+ /** Fully resolved Next.js config. Loaded from disk when omitted. */
7
8
  nextConfig?: ResolvedNextConfig;
8
9
  /**
9
10
  * Override the path to the Pages Router server bundle.