vinext 0.1.7 → 0.2.0

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 (279) hide show
  1. package/README.md +51 -30
  2. package/dist/build/inject-pregenerated-paths.d.ts +4 -0
  3. package/dist/build/inject-pregenerated-paths.js +18 -0
  4. package/dist/build/layout-classification.js +1 -1
  5. package/dist/build/nitro-route-rules.js +1 -1
  6. package/dist/build/pages-client-assets-module.d.ts +11 -0
  7. package/dist/build/pages-client-assets-module.js +27 -0
  8. package/dist/build/prerender.d.ts +2 -1
  9. package/dist/build/prerender.js +13 -6
  10. package/dist/build/report.d.ts +13 -2
  11. package/dist/build/report.js +99 -2
  12. package/dist/build/run-prerender.d.ts +7 -0
  13. package/dist/build/run-prerender.js +10 -1
  14. package/dist/build/standalone.js +2 -0
  15. package/dist/cache/cache-adapters-virtual.js +3 -3
  16. package/dist/check.d.ts +18 -0
  17. package/dist/check.js +77 -19
  18. package/dist/cli-args.d.ts +1 -2
  19. package/dist/cli-args.js +1 -1
  20. package/dist/cli-dev-config.d.ts +12 -0
  21. package/dist/cli-dev-config.js +23 -0
  22. package/dist/cli.js +113 -97
  23. package/dist/{server → client}/dev-error-overlay-store.d.ts +1 -1
  24. package/dist/{server → client}/dev-error-overlay-store.js +1 -1
  25. package/dist/{server → client}/dev-error-overlay.d.ts +1 -1
  26. package/dist/{server → client}/dev-error-overlay.js +2 -2
  27. package/dist/client/navigation-runtime.d.ts +2 -0
  28. package/dist/client/navigation-runtime.js +3 -1
  29. package/dist/client/window-next.d.ts +2 -1
  30. package/dist/cloudflare/index.d.ts +2 -2
  31. package/dist/cloudflare/index.js +2 -2
  32. package/dist/config/config-matchers.js +14 -10
  33. package/dist/config/next-config.d.ts +6 -3
  34. package/dist/config/next-config.js +47 -1
  35. package/dist/config/prerender.d.ts +34 -0
  36. package/dist/config/prerender.js +55 -0
  37. package/dist/config/server-external-packages.d.ts +4 -0
  38. package/dist/config/server-external-packages.js +91 -0
  39. package/dist/entries/app-rsc-entry.d.ts +2 -1
  40. package/dist/entries/app-rsc-entry.js +89 -15
  41. package/dist/entries/app-rsc-manifest.js +10 -0
  42. package/dist/entries/pages-client-entry.d.ts +3 -0
  43. package/dist/entries/pages-client-entry.js +16 -1
  44. package/dist/entries/pages-server-entry.js +6 -2
  45. package/dist/image/image-adapters-virtual.d.ts +59 -0
  46. package/dist/image/image-adapters-virtual.js +59 -0
  47. package/dist/index.d.ts +33 -0
  48. package/dist/index.js +211 -118
  49. package/dist/init-cloudflare.d.ts +43 -0
  50. package/dist/init-cloudflare.js +839 -0
  51. package/dist/init-platform.d.ts +40 -0
  52. package/dist/init-platform.js +195 -0
  53. package/dist/init.d.ts +16 -38
  54. package/dist/init.js +208 -97
  55. package/dist/node_modules/.pnpm/am-i-vibing@0.5.0/node_modules/am-i-vibing/dist/detector-1yx2Hoe0.js +294 -0
  56. package/dist/node_modules/.pnpm/process-ancestry@0.1.0/node_modules/process-ancestry/dist/index.js +94 -0
  57. package/dist/{cloudflare → packages/cloudflare}/src/cache/cdn-adapter.runtime.js +1 -1
  58. package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.d.ts +2 -2
  59. package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.js +1 -1
  60. package/dist/packages/cloudflare/src/deploy-config.js +150 -0
  61. package/dist/packages/cloudflare/src/deploy-help.js +55 -0
  62. package/dist/packages/cloudflare/src/deploy.js +276 -0
  63. package/dist/{cloudflare → packages/cloudflare/src}/tpr.d.ts +4 -41
  64. package/dist/{cloudflare → packages/cloudflare/src}/tpr.js +18 -15
  65. package/dist/plugins/ast-scope.d.ts +16 -0
  66. package/dist/plugins/ast-scope.js +62 -0
  67. package/dist/plugins/ast-utils.d.ts +27 -1
  68. package/dist/plugins/ast-utils.js +32 -1
  69. package/dist/plugins/css-module-imports.d.ts +14 -0
  70. package/dist/plugins/css-module-imports.js +59 -0
  71. package/dist/plugins/extensionless-dynamic-import.js +2 -2
  72. package/dist/plugins/ignore-dynamic-requests.d.ts +11 -0
  73. package/dist/plugins/ignore-dynamic-requests.js +530 -0
  74. package/dist/plugins/middleware-server-only.d.ts +8 -6
  75. package/dist/plugins/middleware-server-only.js +8 -7
  76. package/dist/plugins/optimize-imports.js +1 -1
  77. package/dist/plugins/typeof-window.d.ts +1 -1
  78. package/dist/plugins/typeof-window.js +28 -56
  79. package/dist/routing/app-route-graph.d.ts +29 -4
  80. package/dist/routing/app-route-graph.js +182 -40
  81. package/dist/routing/app-router.d.ts +5 -0
  82. package/dist/routing/app-router.js +5 -0
  83. package/dist/routing/file-matcher.d.ts +8 -0
  84. package/dist/routing/file-matcher.js +10 -1
  85. package/dist/routing/pages-router.js +2 -2
  86. package/dist/server/api-handler.js +9 -14
  87. package/dist/server/app-browser-action-result.d.ts +4 -1
  88. package/dist/server/app-browser-action-result.js +8 -1
  89. package/dist/server/app-browser-entry.js +194 -190
  90. package/dist/server/app-browser-history-controller.d.ts +2 -1
  91. package/dist/server/app-browser-history-controller.js +6 -2
  92. package/dist/server/app-browser-interception-context.d.ts +1 -0
  93. package/dist/server/app-browser-interception-context.js +4 -2
  94. package/dist/server/app-browser-navigation-controller.d.ts +2 -0
  95. package/dist/server/app-browser-navigation-controller.js +60 -31
  96. package/dist/server/app-browser-server-action-client.d.ts +32 -0
  97. package/dist/server/app-browser-server-action-client.js +127 -0
  98. package/dist/server/app-browser-state.d.ts +11 -1
  99. package/dist/server/app-browser-state.js +25 -8
  100. package/dist/server/app-browser-visible-commit.d.ts +6 -1
  101. package/dist/server/app-browser-visible-commit.js +43 -25
  102. package/dist/server/app-elements-wire.d.ts +9 -2
  103. package/dist/server/app-elements-wire.js +8 -1
  104. package/dist/server/app-elements.d.ts +2 -2
  105. package/dist/server/app-elements.js +4 -3
  106. package/dist/server/app-fallback-renderer.d.ts +5 -2
  107. package/dist/server/app-fallback-renderer.js +15 -7
  108. package/dist/server/app-hydration-cache-publication.d.ts +11 -0
  109. package/dist/server/app-hydration-cache-publication.js +43 -0
  110. package/dist/server/app-middleware.d.ts +4 -3
  111. package/dist/server/app-middleware.js +8 -3
  112. package/dist/server/app-optimistic-routing.js +11 -4
  113. package/dist/server/app-page-boundary-render.d.ts +3 -0
  114. package/dist/server/app-page-boundary-render.js +14 -3
  115. package/dist/server/app-page-cache-finalizer.d.ts +1 -0
  116. package/dist/server/app-page-cache-finalizer.js +10 -3
  117. package/dist/server/app-page-cache-render.d.ts +1 -0
  118. package/dist/server/app-page-cache-render.js +8 -4
  119. package/dist/server/app-page-cache.d.ts +1 -0
  120. package/dist/server/app-page-cache.js +5 -2
  121. package/dist/server/app-page-dispatch.d.ts +33 -4
  122. package/dist/server/app-page-dispatch.js +63 -90
  123. package/dist/server/app-page-element-builder.d.ts +9 -2
  124. package/dist/server/app-page-element-builder.js +114 -23
  125. package/dist/server/app-page-head.d.ts +16 -1
  126. package/dist/server/app-page-head.js +44 -22
  127. package/dist/server/app-page-params.d.ts +2 -1
  128. package/dist/server/app-page-params.js +8 -1
  129. package/dist/server/app-page-ppr-runtime.d.ts +7 -0
  130. package/dist/server/app-page-ppr-runtime.js +70 -0
  131. package/dist/server/app-page-probe.d.ts +1 -0
  132. package/dist/server/app-page-probe.js +6 -1
  133. package/dist/server/app-page-render-identity.d.ts +1 -0
  134. package/dist/server/app-page-render-identity.js +1 -1
  135. package/dist/server/app-page-render.d.ts +4 -1
  136. package/dist/server/app-page-render.js +26 -3
  137. package/dist/server/app-page-request.d.ts +22 -1
  138. package/dist/server/app-page-request.js +92 -15
  139. package/dist/server/app-page-route-wiring.d.ts +14 -2
  140. package/dist/server/app-page-route-wiring.js +61 -25
  141. package/dist/server/app-page-search-params-observation.d.ts +4 -2
  142. package/dist/server/app-page-search-params-observation.js +11 -7
  143. package/dist/server/app-page-segment-state.d.ts +2 -1
  144. package/dist/server/app-page-segment-state.js +3 -1
  145. package/dist/server/app-page-stream.d.ts +5 -0
  146. package/dist/server/app-page-stream.js +3 -1
  147. package/dist/server/app-ppr-fallback-shell-render.d.ts +4 -3
  148. package/dist/server/app-route-handler-dispatch.js +1 -0
  149. package/dist/server/app-route-handler-execution.js +7 -2
  150. package/dist/server/app-route-handler-response.js +1 -0
  151. package/dist/server/app-route-handler-runtime.js +1 -1
  152. package/dist/server/app-route-module-loader.d.ts +2 -0
  153. package/dist/server/app-route-module-loader.js +1 -0
  154. package/dist/server/app-router-entry.js +16 -8
  155. package/dist/server/app-rsc-errors.js +7 -1
  156. package/dist/server/app-rsc-handler.d.ts +3 -1
  157. package/dist/server/app-rsc-handler.js +67 -39
  158. package/dist/server/app-rsc-request-normalization.d.ts +3 -2
  159. package/dist/server/app-rsc-request-normalization.js +6 -3
  160. package/dist/server/app-rsc-route-matching.d.ts +7 -0
  161. package/dist/server/app-rsc-route-matching.js +36 -3
  162. package/dist/server/app-segment-config.d.ts +12 -0
  163. package/dist/server/app-segment-config.js +91 -5
  164. package/dist/server/app-server-action-execution.d.ts +5 -0
  165. package/dist/server/app-server-action-execution.js +94 -33
  166. package/dist/server/app-ssr-entry.d.ts +3 -0
  167. package/dist/server/app-ssr-entry.js +19 -8
  168. package/dist/server/app-ssr-stream.d.ts +7 -3
  169. package/dist/server/app-ssr-stream.js +10 -6
  170. package/dist/server/app-static-generation.d.ts +1 -0
  171. package/dist/server/app-static-generation.js +1 -0
  172. package/dist/server/app-visited-response-cache.d.ts +6 -0
  173. package/dist/server/app-visited-response-cache.js +3 -1
  174. package/dist/server/client-trace-metadata.js +26 -0
  175. package/dist/server/default-global-not-found-module.d.ts +14 -0
  176. package/dist/server/default-global-not-found-module.js +14 -0
  177. package/dist/server/dev-route-files.js +4 -0
  178. package/dist/server/dev-server.js +19 -18
  179. package/dist/server/dev-stack-sourcemap.d.ts +1 -1
  180. package/dist/server/dev-stack-sourcemap.js +1 -1
  181. package/dist/server/fetch-handler.d.ts +2 -0
  182. package/dist/server/fetch-handler.js +18 -0
  183. package/dist/server/headers.d.ts +5 -15
  184. package/dist/server/headers.js +4 -15
  185. package/dist/server/image-optimization.d.ts +51 -1
  186. package/dist/server/image-optimization.js +52 -2
  187. package/dist/server/implicit-tags.js +1 -1
  188. package/dist/server/isr-cache.d.ts +1 -1
  189. package/dist/server/isr-cache.js +2 -2
  190. package/dist/server/metadata-routes.d.ts +3 -1
  191. package/dist/server/metadata-routes.js +12 -2
  192. package/dist/server/middleware-runtime.js +6 -1
  193. package/dist/server/navigation-planner.d.ts +1 -0
  194. package/dist/server/navigation-planner.js +14 -3
  195. package/dist/server/pages-api-route.js +2 -2
  196. package/dist/server/pages-asset-tags.d.ts +4 -6
  197. package/dist/server/pages-asset-tags.js +12 -12
  198. package/dist/server/pages-client-assets.d.ts +12 -0
  199. package/dist/server/pages-client-assets.js +10 -0
  200. package/dist/server/pages-node-compat.d.ts +8 -1
  201. package/dist/server/pages-node-compat.js +32 -4
  202. package/dist/server/pages-page-data.d.ts +24 -1
  203. package/dist/server/pages-page-data.js +45 -24
  204. package/dist/server/pages-page-handler.d.ts +2 -1
  205. package/dist/server/pages-page-handler.js +19 -12
  206. package/dist/server/pages-page-response.d.ts +7 -0
  207. package/dist/server/pages-page-response.js +4 -1
  208. package/dist/server/pages-request-pipeline.d.ts +2 -0
  209. package/dist/server/pages-request-pipeline.js +25 -1
  210. package/dist/server/pages-router-entry.d.ts +30 -0
  211. package/dist/server/pages-router-entry.js +108 -0
  212. package/dist/server/prerender-manifest.d.ts +3 -1
  213. package/dist/server/prerender-route-params.js +1 -1
  214. package/dist/server/prod-server.d.ts +1 -1
  215. package/dist/server/prod-server.js +48 -26
  216. package/dist/server/request-pipeline.js +1 -0
  217. package/dist/server/seed-cache.js +4 -4
  218. package/dist/server/worker-utils.d.ts +2 -1
  219. package/dist/server/worker-utils.js +7 -1
  220. package/dist/shims/app-router-scroll-state.d.ts +1 -0
  221. package/dist/shims/app-router-scroll-state.js +1 -0
  222. package/dist/shims/app-router-scroll.js +2 -1
  223. package/dist/shims/cache.js +19 -15
  224. package/dist/shims/cdn-cache.js +1 -1
  225. package/dist/shims/dynamic-preload-chunks.js +2 -1
  226. package/dist/shims/error-boundary.d.ts +19 -1
  227. package/dist/shims/error-boundary.js +11 -1
  228. package/dist/shims/form.d.ts +3 -1
  229. package/dist/shims/form.js +37 -43
  230. package/dist/shims/headers.d.ts +9 -1
  231. package/dist/shims/headers.js +31 -6
  232. package/dist/shims/image.js +75 -14
  233. package/dist/shims/internal/app-route-detection.d.ts +2 -17
  234. package/dist/shims/internal/app-route-detection.js +4 -17
  235. package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +23 -0
  236. package/dist/shims/internal/hybrid-client-route-owner-direct.js +51 -0
  237. package/dist/shims/internal/hybrid-client-route-owner.d.ts +2 -15
  238. package/dist/shims/internal/hybrid-client-route-owner.js +9 -60
  239. package/dist/shims/internal/pages-data-fetch-dedup.d.ts +9 -5
  240. package/dist/shims/internal/pages-data-fetch-dedup.js +73 -14
  241. package/dist/shims/internal/pages-data-target.d.ts +10 -9
  242. package/dist/shims/internal/pages-data-target.js +91 -12
  243. package/dist/shims/internal/pages-router-components.d.ts +7 -0
  244. package/dist/shims/internal/pages-router-components.js +13 -0
  245. package/dist/shims/layout-segment-context.d.ts +4 -1
  246. package/dist/shims/layout-segment-context.js +18 -4
  247. package/dist/shims/link.js +70 -37
  248. package/dist/shims/metadata.d.ts +3 -2
  249. package/dist/shims/metadata.js +8 -4
  250. package/dist/shims/navigation.d.ts +5 -1
  251. package/dist/shims/navigation.js +45 -10
  252. package/dist/shims/navigation.react-server.js +1 -1
  253. package/dist/shims/root-params.d.ts +15 -1
  254. package/dist/shims/root-params.js +21 -1
  255. package/dist/shims/router.d.ts +5 -7
  256. package/dist/shims/router.js +374 -94
  257. package/dist/shims/server.js +3 -2
  258. package/dist/shims/slot.js +3 -6
  259. package/dist/typegen.js +6 -5
  260. package/dist/utils/client-runtime-metadata.d.ts +2 -18
  261. package/dist/utils/client-runtime-metadata.js +31 -22
  262. package/dist/utils/dev-stack-sourcemap-endpoint.d.ts +4 -0
  263. package/dist/{server → utils}/dev-stack-sourcemap-endpoint.js +1 -1
  264. package/dist/utils/domain-locale.d.ts +6 -3
  265. package/dist/{server → utils}/middleware-request-headers.d.ts +1 -1
  266. package/dist/{server → utils}/middleware-request-headers.js +2 -2
  267. package/dist/utils/path.d.ts +2 -1
  268. package/dist/utils/path.js +1 -1
  269. package/dist/utils/project.d.ts +52 -2
  270. package/dist/utils/project.js +230 -5
  271. package/dist/utils/protocol-headers.d.ts +17 -0
  272. package/dist/utils/protocol-headers.js +17 -0
  273. package/dist/utils/react-version.d.ts +4 -0
  274. package/dist/utils/react-version.js +44 -0
  275. package/package.json +53 -4
  276. package/dist/deploy.d.ts +0 -190
  277. package/dist/deploy.js +0 -1033
  278. package/dist/server/dev-stack-sourcemap-endpoint.d.ts +0 -4
  279. /package/dist/{cloudflare → packages/cloudflare}/src/utils/cache-control-metadata.js +0 -0
package/dist/cli.js CHANGED
@@ -2,14 +2,21 @@
2
2
  import { detectPackageManager, ensureViteConfigCompatibility, hasAppDir, hasViteConfig } from "./utils/project.js";
3
3
  import { formatReport, runCheck } from "./check.js";
4
4
  import { parseArgs } from "./cli-args.js";
5
+ import { createDevServerConfigPlugin, normalizeDevServerHostname } from "./cli-dev-config.js";
6
+ import { normalizePathSeparators } from "./utils/path.js";
5
7
  import { PHASE_PRODUCTION_BUILD } from "./shims/constants.js";
6
8
  import { createRscCompatibilityId, loadNextConfig, resolveNextConfig } from "./config/next-config.js";
7
9
  import { generateRouteTypes } from "./typegen.js";
8
- import { getReactUpgradeDeps, init } from "./init.js";
10
+ import { clearPagesClientAssetsBuildMetadata } from "./build/pages-client-assets-module.js";
11
+ import { findVinextPrerenderConfigInPlugins, formatVinextPrerenderLabel, resolveVinextPrerenderDecision } from "./config/prerender.js";
12
+ import vinext from "./index.js";
9
13
  import { runPrerender } from "./build/run-prerender.js";
10
14
  import { loadDotenv } from "./config/dotenv.js";
11
- import { deploy, parseDeployArgs } from "./deploy.js";
12
- import vinext from "./index.js";
15
+ import { deploy, parseDeployArgs } from "./packages/cloudflare/src/deploy.js";
16
+ import { printDeployHelp } from "./packages/cloudflare/src/deploy-help.js";
17
+ import { getReactUpgradeDeps } from "./utils/react-version.js";
18
+ import { init } from "./init.js";
19
+ import { INIT_PLATFORMS, resolveInitPlatform, resolveInitPrerender } from "./init-platform.js";
13
20
  import { resolveVinextPackageRoot } from "./utils/vinext-root.js";
14
21
  import { emitStandaloneOutput } from "./build/standalone.js";
15
22
  import { cleanBuildOutput } from "./build/clean-output.js";
@@ -27,7 +34,7 @@ import { execFileSync } from "node:child_process";
27
34
  * vinext dev Start development server (Vite)
28
35
  * vinext build Build for production
29
36
  * vinext start Start production server
30
- * vinext deploy Deploy to Cloudflare Workers
37
+ * vinext deploy Deprecated Cloudflare deploy shim
31
38
  * vinext typegen Generate App Router route helper types
32
39
  * vinext lint Run linter (delegates to eslint/oxlint)
33
40
  *
@@ -120,13 +127,17 @@ function createBuildLogger(vite) {
120
127
  function hasPagesDir() {
121
128
  return fs.existsSync(path.join(process.cwd(), "pages")) || fs.existsSync(path.join(process.cwd(), "src", "pages"));
122
129
  }
123
- async function loadBuildEmptyOutDir(vite, root) {
124
- if (!hasViteConfig(root)) return void 0;
125
- const emptyOutDir = (await vite.loadConfigFromFile({
130
+ async function loadBuildViteConfigMetadata(vite, root) {
131
+ if (!hasViteConfig(root)) return { prerenderConfig: null };
132
+ const loaded = await vite.loadConfigFromFile({
126
133
  command: "build",
127
134
  mode: "production"
128
- }, void 0, root))?.config.build?.emptyOutDir;
129
- return typeof emptyOutDir === "boolean" ? emptyOutDir : void 0;
135
+ }, void 0, root);
136
+ const emptyOutDir = loaded?.config.build?.emptyOutDir;
137
+ return {
138
+ emptyOutDir: typeof emptyOutDir === "boolean" ? emptyOutDir : void 0,
139
+ prerenderConfig: findVinextPrerenderConfigInPlugins(loaded?.config.plugins)
140
+ };
130
141
  }
131
142
  /**
132
143
  * Build the Vite config automatically. If a vite.config.ts exists in the
@@ -179,20 +190,20 @@ async function dev() {
179
190
  });
180
191
  applyViteConfigCompatibility(process.cwd());
181
192
  const vite = await loadVite();
182
- const port = parsed.port ?? 3e3;
183
- const host = parsed.hostname ?? "localhost";
193
+ const initialPort = parsed.port ?? 3e3;
194
+ const initialHost = parsed.hostname ?? "localhost";
184
195
  let lockfile;
185
196
  const startedAt = Date.now();
186
197
  if (process.env.VINEXT_NO_DEV_LOCK !== "1") {
187
198
  const root = process.cwd();
188
- const initialDisplayHost = host === "0.0.0.0" ? "localhost" : host;
199
+ const initialDisplayHost = initialHost === "0.0.0.0" ? "localhost" : initialHost;
189
200
  const acquired = tryAcquireLockfile({
190
201
  root,
191
202
  info: {
192
203
  pid: process.pid,
193
- port,
194
- hostname: host,
195
- appUrl: `http://${initialDisplayHost}:${port}`,
204
+ port: initialPort,
205
+ hostname: initialHost,
206
+ appUrl: `http://${initialDisplayHost}:${initialPort}`,
196
207
  startedAt,
197
208
  cwd: root
198
209
  }
@@ -208,13 +219,21 @@ async function dev() {
208
219
  lockfile = acquired.lockfile;
209
220
  }
210
221
  console.log(`\n vinext dev (Vite ${getViteVersion()})\n`);
211
- const config = buildViteConfig({ server: {
212
- port,
213
- host
214
- } });
222
+ const config = buildViteConfig();
223
+ (config.plugins ??= []).push(createDevServerConfigPlugin(parsed));
215
224
  let server;
216
225
  try {
217
226
  server = await vite.createServer(config);
227
+ const port = server.config.server.port ?? 3e3;
228
+ const host = normalizeDevServerHostname(server.config.server.host);
229
+ lockfile?.update({
230
+ pid: process.pid,
231
+ port,
232
+ hostname: host,
233
+ appUrl: `http://${host === "0.0.0.0" ? "localhost" : host}:${port}`,
234
+ startedAt,
235
+ cwd: process.cwd()
236
+ });
218
237
  await server.listen();
219
238
  } catch (err) {
220
239
  lockfile?.release();
@@ -222,8 +241,10 @@ async function dev() {
222
241
  }
223
242
  server.printUrls();
224
243
  if (lockfile) {
244
+ const configuredPort = server.config.server.port ?? 3e3;
245
+ const configuredHost = normalizeDevServerHostname(server.config.server.host);
225
246
  const resolved = server.resolvedUrls?.local[0];
226
- let actualPort = port;
247
+ let actualPort = configuredPort;
227
248
  let appUrl;
228
249
  if (resolved) {
229
250
  appUrl = resolved.replace(/\/$/, "");
@@ -233,13 +254,13 @@ async function dev() {
233
254
  } catch {}
234
255
  } else {
235
256
  const address = server.httpServer?.address();
236
- actualPort = typeof address === "object" && address ? address.port : port;
237
- appUrl = `http://${host === "0.0.0.0" ? "localhost" : host}:${actualPort}`;
257
+ actualPort = typeof address === "object" && address ? address.port : configuredPort;
258
+ appUrl = `http://${configuredHost === "0.0.0.0" ? "localhost" : configuredHost}:${actualPort}`;
238
259
  }
239
260
  lockfile.update({
240
261
  pid: process.pid,
241
262
  port: actualPort,
242
- hostname: host,
263
+ hostname: configuredHost,
243
264
  appUrl,
244
265
  startedAt,
245
266
  cwd: process.cwd()
@@ -260,7 +281,7 @@ async function buildApp() {
260
281
  const withBuildBundlerOptions = (bundlerOptions) => viteMajorVersion >= 8 ? { rolldownOptions: bundlerOptions } : { rollupOptions: bundlerOptions };
261
282
  console.log(`\n vinext build (Vite ${getViteVersion()})\n`);
262
283
  const root = process.cwd();
263
- const isApp = hasAppDir(process.cwd());
284
+ const isApp = hasAppDir(normalizePathSeparators(root));
264
285
  const resolvedNextConfig = await resolveNextConfig(await loadNextConfig(root, PHASE_PRODUCTION_BUILD), root);
265
286
  process.env.__VINEXT_SHARED_BUILD_ID = resolvedNextConfig.buildId;
266
287
  process.env.__VINEXT_SHARED_RSC_COMPATIBILITY_ID = createRscCompatibilityId(resolvedNextConfig);
@@ -287,15 +308,19 @@ async function buildApp() {
287
308
  });
288
309
  }
289
310
  }
311
+ const buildConfigMetadata = await loadBuildViteConfigMetadata(vite, root);
290
312
  cleanBuildOutput({
291
313
  root,
292
314
  outDir: distDir,
293
- emptyOutDir: await loadBuildEmptyOutDir(vite, root)
315
+ emptyOutDir: buildConfigMetadata.emptyOutDir
294
316
  });
295
- const config = buildViteConfig({}, logger);
296
- await (await vite.createBuilder(config)).buildApp();
297
- if (isApp) {
298
- if (hasPagesDir()) {
317
+ const isHybrid = isApp && hasPagesDir();
318
+ const pagesClientAssetsBuildSession = isHybrid ? randomBytes(16).toString("hex") : null;
319
+ if (pagesClientAssetsBuildSession) process.env.__VINEXT_PAGES_CLIENT_ASSETS_BUILD_SESSION = pagesClientAssetsBuildSession;
320
+ try {
321
+ const config = buildViteConfig({}, logger);
322
+ await (await vite.createBuilder(config)).buildApp();
323
+ if (isHybrid) {
299
324
  console.log(" Building Pages Router server (hybrid)...");
300
325
  const root = process.cwd();
301
326
  let userTransformPlugins = [];
@@ -326,6 +351,11 @@ async function buildApp() {
326
351
  }
327
352
  });
328
353
  }
354
+ } finally {
355
+ if (pagesClientAssetsBuildSession) {
356
+ clearPagesClientAssetsBuildMetadata(pagesClientAssetsBuildSession);
357
+ if (process.env.__VINEXT_PAGES_CLIENT_ASSETS_BUILD_SESSION === pagesClientAssetsBuildSession) delete process.env.__VINEXT_PAGES_CLIENT_ASSETS_BUILD_SESSION;
358
+ }
329
359
  }
330
360
  if (outputMode === "standalone") {
331
361
  const standalone = emitStandaloneOutput({
@@ -337,23 +367,27 @@ async function buildApp() {
337
367
  return process.exit(0);
338
368
  }
339
369
  let prerenderResult;
340
- if (parsed.prerenderAll || resolvedNextConfig.output === "export") {
370
+ const prerenderDecision = resolveVinextPrerenderDecision({
371
+ prerenderAllFlag: parsed.prerenderAll,
372
+ vinextPrerenderConfig: buildConfigMetadata.prerenderConfig,
373
+ nextOutput: resolvedNextConfig.output
374
+ });
375
+ if (prerenderDecision) {
341
376
  if (resolvedNextConfig.enablePrerenderSourceMaps) {
342
377
  process.setSourceMapsEnabled(true);
343
378
  Error.stackTraceLimit = Math.max(Error.stackTraceLimit, 50);
344
379
  }
345
- const label = parsed.prerenderAll ? "Pre-rendering all routes..." : "Pre-rendering all routes (output: 'export')...";
346
380
  process.stdout.write("\x1B[0m");
347
- console.log(` ${label}`);
381
+ console.log(` ${formatVinextPrerenderLabel(prerenderDecision)}`);
348
382
  prerenderResult = await runPrerender({
349
- root: process.cwd(),
383
+ root: normalizePathSeparators(process.cwd()),
350
384
  concurrency: parsed.prerenderConcurrency
351
385
  });
352
386
  }
353
387
  process.stdout.write("\x1B[0m");
354
388
  const { printBuildReport } = await import("./build/report.js");
355
389
  await printBuildReport({
356
- root: process.cwd(),
390
+ root: normalizePathSeparators(process.cwd()),
357
391
  pageExtensions: resolvedNextConfig.pageExtensions,
358
392
  prerenderResult: prerenderResult ?? void 0
359
393
  });
@@ -420,7 +454,12 @@ async function lint() {
420
454
  }
421
455
  async function deployCommand() {
422
456
  const parsed = parseDeployArgs(rawArgs);
423
- if (parsed.help) return printHelp("deploy");
457
+ if (parsed.help) {
458
+ printDeployDeprecationWarning();
459
+ printDeployHelp();
460
+ return;
461
+ }
462
+ printDeployDeprecationWarning();
424
463
  await loadVite();
425
464
  console.log(`\n vinext deploy (Vite ${getViteVersion()})\n`);
426
465
  await deploy({
@@ -438,12 +477,14 @@ async function deployCommand() {
438
477
  tprWindow: parsed.tprWindow
439
478
  });
440
479
  }
480
+ function printDeployDeprecationWarning() {
481
+ console.log(" ⚠️ Warning: `vinext deploy` has moved to the `@vinext/cloudflare` package.\n Please switch to `npx @vinext/cloudflare deploy` or `vp exec vinext-cloudflare deploy`; this compatibility command will be removed in a future release.\n");
482
+ }
441
483
  async function check() {
442
484
  if (parseArgs(rawArgs).help) return printHelp("check");
443
- const root = process.cwd();
444
485
  console.log(`\n vinext check\n`);
445
486
  console.log(" Scanning project...\n");
446
- const result = runCheck(root);
487
+ const result = runCheck(normalizePathSeparators(process.cwd()));
447
488
  console.log(formatReport(result));
448
489
  }
449
490
  async function typegen() {
@@ -467,11 +508,17 @@ async function initCommand() {
467
508
  const port = parsed.port ?? 3001;
468
509
  const skipCheck = rawArgs.includes("--skip-check");
469
510
  const force = rawArgs.includes("--force");
511
+ const platform = await resolveInitPlatform(rawArgs);
512
+ const platformOptions = await INIT_PLATFORMS[platform].options(rawArgs);
513
+ const prerender = await resolveInitPrerender(rawArgs);
470
514
  await init({
471
515
  root: process.cwd(),
472
516
  port,
473
517
  skipCheck,
474
- force
518
+ force,
519
+ platform,
520
+ prerender,
521
+ cloudflare: platform === "cloudflare" ? platformOptions : void 0
475
522
  });
476
523
  }
477
524
  function printHelp(cmd) {
@@ -501,8 +548,8 @@ function printHelp(cmd) {
501
548
 
502
549
  Options:
503
550
  --verbose Show full Vite/Rollup build output (suppressed by default)
504
- --prerender-all Pre-render discovered routes after building (future releases
505
- will serve these files in vinext start)
551
+ --prerender-all Pre-render discovered routes after building. Equivalent
552
+ to vinext({ prerender: true }) and takes priority.
506
553
  --prerender-concurrency <count>
507
554
  Maximum number of routes to pre-render in parallel
508
555
  --precompress Precompress static assets at build time (.br, .gz, .zst)
@@ -528,52 +575,8 @@ function printHelp(cmd) {
528
575
  return;
529
576
  }
530
577
  if (cmd === "deploy") {
531
- console.log(`
532
- vinext deploy - Deploy to Cloudflare Workers
533
-
534
- Usage: vinext deploy [options]
535
-
536
- One-command deployment to Cloudflare Workers. Automatically:
537
- - Detects App Router or Pages Router
538
- - Generates wrangler.jsonc, worker/index.ts, vite.config.ts if missing
539
- - Installs @cloudflare/vite-plugin and wrangler if needed
540
- - Builds the project with Vite
541
- - Deploys via wrangler
542
-
543
- Options:
544
- --preview Deploy to preview environment (same as --env preview)
545
- --env <name> Deploy using wrangler env.<name>
546
- --name <name> Custom Worker name (default: from package.json)
547
- --skip-build Skip the build step (use existing dist/)
548
- --dry-run Generate config files without building or deploying
549
- --prerender-all Pre-render discovered routes after building (future
550
- releases will auto-populate the remote cache)
551
- --prerender-concurrency <count>
552
- Maximum number of routes to pre-render in parallel
553
- -h, --help Show this help
554
-
555
- Experimental:
556
- --experimental-tpr Enable Traffic-aware Pre-Rendering
557
- --tpr-coverage <pct> Traffic coverage target, 0–100 (default: 90)
558
- --tpr-limit <count> Hard cap on pages to pre-render (default: 1000)
559
- --tpr-window <hours> Analytics lookback window in hours (default: 24)
560
-
561
- TPR (Traffic-aware Pre-Rendering) uses Cloudflare zone analytics to determine
562
- which pages get the most traffic and pre-renders them into KV cache during
563
- deploy. This feature is experimental and must be explicitly enabled. Requires
564
- a custom domain (zone analytics are unavailable on *.workers.dev) and the
565
- CLOUDFLARE_API_TOKEN environment variable with Zone.Analytics read permission.
566
-
567
- Examples:
568
- vinext deploy Build and deploy to production
569
- vinext deploy --preview Deploy to a preview URL
570
- vinext deploy --env staging Deploy using wrangler env.staging
571
- vinext deploy --dry-run See what files would be generated
572
- vinext deploy --name my-app Deploy with a custom Worker name
573
- vinext deploy --experimental-tpr Enable TPR during deploy
574
- vinext deploy --experimental-tpr --tpr-coverage 95 Cover 95% of traffic
575
- vinext deploy --experimental-tpr --tpr-limit 500 Cap at 500 pages
576
- `);
578
+ printDeployDeprecationWarning();
579
+ printDeployHelp();
577
580
  return;
578
581
  }
579
582
  if (cmd === "check") {
@@ -605,10 +608,23 @@ function printHelp(cmd) {
605
608
  -p, --port <port> Dev server port for the vinext script (default: 3001)
606
609
  --skip-check Skip the compatibility check step
607
610
  --force Overwrite existing vite.config.ts
611
+ --platform <target> Deployment target: cloudflare or node
612
+ --prerender Configure vinext build to pre-render all static routes
613
+ (default: prompt, with No selected by default)
614
+ --data-cache <type> Cloudflare data cache: kv or none (default: kv)
615
+ --image-optimization <type>
616
+ Cloudflare image optimization: cloudflare-images or none
608
617
  -h, --help Show this help
609
618
 
610
619
  Examples:
611
- vinext init Migrate with defaults
620
+ vinext init Prompt for a deployment platform
621
+ vinext init --platform=cloudflare Configure Cloudflare Workers (default)
622
+ vinext init --platform=cloudflare --data-cache=kv
623
+ Configure the default Cloudflare cache handlers
624
+ vinext init --platform=cloudflare --image-optimization=none
625
+ Do not configure Cloudflare Images
626
+ vinext init --prerender Add prerender: { routes: "*" } to vite.config.ts
627
+ vinext init --platform=node Configure a Node deployment
612
628
  vinext init -p 4000 Use port 4000 for dev:vinext
613
629
  vinext init --force Overwrite existing vite.config.ts
614
630
  vinext init --skip-check Skip the compatibility report
@@ -653,7 +669,6 @@ function printHelp(cmd) {
653
669
  dev Start development server
654
670
  build Build for production
655
671
  start Start production server
656
- deploy Deploy to Cloudflare Workers
657
672
  typegen Generate App Router route helper types
658
673
  init Migrate a Next.js project to vinext
659
674
  check Scan Next.js app for compatibility
@@ -664,15 +679,16 @@ function printHelp(cmd) {
664
679
  --version Show version
665
680
 
666
681
  Examples:
667
- vinext dev Start dev server on port 3000
668
- vinext dev -p 4000 Start dev server on port 4000
669
- vinext build Build for production
670
- vinext typegen Generate route helper types
671
- vinext start Start production server
672
- vinext deploy Deploy to Cloudflare Workers
673
- vinext init Migrate a Next.js project
674
- vinext check Check compatibility
675
- vinext lint Run linter
682
+ vinext dev Start dev server on port 3000
683
+ vinext dev -p 4000 Start dev server on port 4000
684
+ vinext build Build for production
685
+ vinext typegen Generate route helper types
686
+ vinext start Start production server
687
+ vinext init Migrate a Next.js project
688
+ vinext check Check compatibility
689
+ vinext lint Run linter
690
+ npx @vinext/cloudflare deploy Deploy to Cloudflare Workers
691
+ vp exec vinext-cloudflare deploy Deploy to Cloudflare Workers with Vite+
676
692
 
677
693
  vinext is a drop-in replacement for the \`next\` CLI.
678
694
  No vite.config.ts needed — just run \`vinext dev\` in your Next.js project.
@@ -1,4 +1,4 @@
1
- //#region src/server/dev-error-overlay-store.d.ts
1
+ //#region src/client/dev-error-overlay-store.d.ts
2
2
  type Source = "server" | "vite" | "uncaught" | "caught" | "window-error" | "unhandledrejection";
3
3
  type ReportedError = {
4
4
  id: number;
@@ -1,4 +1,4 @@
1
- //#region src/server/dev-error-overlay-store.ts
1
+ //#region src/client/dev-error-overlay-store.ts
2
2
  const MAX_DEV_OVERLAY_ERRORS = 50;
3
3
  let snapshot = {
4
4
  errors: [],
@@ -1,6 +1,6 @@
1
1
  import { ReportedError, dismissOverlay } from "./dev-error-overlay-store.js";
2
2
 
3
- //#region src/server/dev-error-overlay.d.ts
3
+ //#region src/client/dev-error-overlay.d.ts
4
4
  declare const DEV_ERROR_OVERLAY_HOST_ID = "__vinext_dev_error_overlay_root";
5
5
  declare const DEV_ERROR_OVERLAY_MOUNT_ID = "__vinext_dev_error_overlay_mount";
6
6
  declare function installDevErrorOverlay(): void;
@@ -1,11 +1,11 @@
1
1
  import { VINEXT_DEV_ERROR_RECOVERY_EVENT } from "../utils/dev-error-recovery-event.js";
2
2
  import { isNavigationSignalError } from "../utils/navigation-signal.js";
3
- import { VINEXT_ORIGINAL_STACK_TRACE_ENDPOINT } from "./dev-stack-sourcemap-endpoint.js";
3
+ import { VINEXT_ORIGINAL_STACK_TRACE_ENDPOINT } from "../utils/dev-stack-sourcemap-endpoint.js";
4
4
  import { dismissOverlay, expandOverlay, getOverlaySnapshot, minimizeOverlay, reportToOverlay, setOverlayIndex, subscribeOverlay, updateOverlayErrorStack } from "./dev-error-overlay-store.js";
5
5
  import { Fragment, useEffect, useMemo, useState, useSyncExternalStore } from "react";
6
6
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
7
7
  import { createRoot } from "react-dom/client";
8
- //#region src/server/dev-error-overlay.tsx
8
+ //#region src/client/dev-error-overlay.tsx
9
9
  const DEV_ERROR_OVERLAY_HOST_ID = "__vinext_dev_error_overlay_root";
10
10
  const DEV_ERROR_OVERLAY_MOUNT_ID = "__vinext_dev_error_overlay_mount";
11
11
  const VITE_ERROR_HANDLER_DATA_KEY = "__vinext_vite_error_handler__";
@@ -9,6 +9,8 @@ type NavigationRuntimeSnapshot = {
9
9
  type NavigationRuntimeRscChunk = string | [3, string];
10
10
  type NavigationRuntimeRscBootstrap = {
11
11
  done?: boolean;
12
+ dynamicStaleTimeSeconds?: number;
13
+ initialCacheKind?: "dynamic" | "static";
12
14
  nav?: NavigationRuntimeSnapshot;
13
15
  params?: Record<string, string | string[]>;
14
16
  rsc: NavigationRuntimeRscChunk[];
@@ -50,10 +50,12 @@ function isNavigationRuntimeParams(value) {
50
50
  function isNavigationRuntimeRscBootstrap(value) {
51
51
  if (!isUnknownRecord(value)) return false;
52
52
  const done = Reflect.get(value, "done");
53
+ const dynamicStaleTimeSeconds = Reflect.get(value, "dynamicStaleTimeSeconds");
54
+ const initialCacheKind = Reflect.get(value, "initialCacheKind");
53
55
  const nav = Reflect.get(value, "nav");
54
56
  const params = Reflect.get(value, "params");
55
57
  const rsc = Reflect.get(value, "rsc");
56
- return (done === void 0 || typeof done === "boolean") && (nav === void 0 || isNavigationRuntimeSnapshot(nav)) && (params === void 0 || isNavigationRuntimeParams(params)) && Array.isArray(rsc) && rsc.every(isNavigationRuntimeRscChunk);
58
+ return (done === void 0 || typeof done === "boolean") && (dynamicStaleTimeSeconds === void 0 || typeof dynamicStaleTimeSeconds === "number" && Number.isFinite(dynamicStaleTimeSeconds) && dynamicStaleTimeSeconds >= 0) && (initialCacheKind === void 0 || initialCacheKind === "dynamic" || initialCacheKind === "static") && (nav === void 0 || isNavigationRuntimeSnapshot(nav)) && (params === void 0 || isNavigationRuntimeParams(params)) && Array.isArray(rsc) && rsc.every(isNavigationRuntimeRscChunk);
57
59
  }
58
60
  function isReadonlyStringArray(value) {
59
61
  return Array.isArray(value) && value.every((entry) => typeof entry === "string");
@@ -97,7 +97,8 @@ type PagesRouterPublicInstance = {
97
97
  * prefetch — App Router targets land here as `{ __appRouter: true }`.
98
98
  * See: `packages/next/src/shared/lib/router/router.ts:2525`.
99
99
  */
100
- components: Record<string, unknown>;
100
+ components: Record<string, unknown>; /** Persistent Pages Router static-data cache, matching Next.js `Router.sdc`. */
101
+ sdc: Record<string, Promise<Response>>;
101
102
  };
102
103
  declare global {
103
104
  interface Window {
@@ -1,3 +1,3 @@
1
- import { KVCacheHandler } from "./src/cache/kv-data-adapter.runtime.js";
2
- import { TPROptions, TPRResult, runTPR } from "./tpr.js";
1
+ import { KVCacheHandler } from "../packages/cloudflare/src/cache/kv-data-adapter.runtime.js";
2
+ import { TPROptions, TPRResult, runTPR } from "../packages/cloudflare/src/tpr.js";
3
3
  export { KVCacheHandler, type TPROptions, type TPRResult, runTPR };
@@ -1,3 +1,3 @@
1
- import { KVCacheHandler } from "./src/cache/kv-data-adapter.runtime.js";
2
- import { runTPR } from "./tpr.js";
1
+ import { KVCacheHandler } from "../packages/cloudflare/src/cache/kv-data-adapter.runtime.js";
2
+ import { runTPR } from "../packages/cloudflare/src/tpr.js";
3
3
  export { KVCacheHandler, runTPR };
@@ -1,5 +1,5 @@
1
- import { VINEXT_MW_CTX_HEADER, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER } from "../server/headers.js";
2
- import { buildRequestHeadersFromMiddlewareResponse } from "../server/middleware-request-headers.js";
1
+ import { VINEXT_MW_CTX_HEADER, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER } from "../utils/protocol-headers.js";
2
+ import { buildRequestHeadersFromMiddlewareResponse } from "../utils/middleware-request-headers.js";
3
3
  import { parseCookieHeader } from "../utils/parse-cookie.js";
4
4
  //#region src/config/config-matchers.ts
5
5
  /**
@@ -526,11 +526,13 @@ function extractConstraint(str, re) {
526
526
  *
527
527
  * The root path `"/"` is preserved as-is.
528
528
  */
529
- function stripTrailingSlashForConfigMatch(pathname) {
530
- return pathname.length > 1 && pathname.endsWith("/") ? pathname.slice(0, -1) : pathname;
529
+ function stripTrailingSlashForConfigMatch(value) {
530
+ return value.length > 1 && value.endsWith("/") ? value.slice(0, -1) : value;
531
531
  }
532
532
  function matchConfigPattern(pathname, pattern) {
533
+ const pathnameHadTrailingSlash = pathname.length > 1 && pathname.endsWith("/");
533
534
  pathname = stripTrailingSlashForConfigMatch(pathname);
535
+ if (pathnameHadTrailingSlash) pattern = stripTrailingSlashForConfigMatch(pattern);
534
536
  const catchAllAnchor = /:[\w-]+[*+]/.test(pattern);
535
537
  const namedParamCount = (pattern.match(/:[\w-]+/g) || []).length;
536
538
  if (pattern.includes("(") || pattern.includes("\\") || /:[\w-]+[*+][^/]/.test(pattern) || /:[\w-]+\./.test(pattern) || /[^/]:[\w-]+/.test(pattern) || catchAllAnchor && namedParamCount > 1) try {
@@ -628,12 +630,12 @@ function matchConfigPattern(pathname, pattern) {
628
630
  */
629
631
  function matchRedirect(pathname, redirects, ctx, basePathState = _BASEPATH_DEFAULT) {
630
632
  if (redirects.length === 0) return null;
631
- pathname = stripTrailingSlashForConfigMatch(pathname);
633
+ const normalizedPathname = stripTrailingSlashForConfigMatch(pathname);
632
634
  const index = _getRedirectIndex(redirects);
633
635
  let localeMatch = null;
634
636
  let localeMatchIndex = Infinity;
635
637
  if (index.localeStatic.size > 0) {
636
- const noLocaleBucket = index.localeStatic.get(pathname);
638
+ const noLocaleBucket = index.localeStatic.get(normalizedPathname);
637
639
  if (noLocaleBucket) for (const entry of noLocaleBucket) {
638
640
  if (!entry.optional) continue;
639
641
  if (entry.originalIndex >= localeMatchIndex) continue;
@@ -651,10 +653,10 @@ function matchRedirect(pathname, redirects, ctx, basePathState = _BASEPATH_DEFAU
651
653
  localeMatchIndex = entry.originalIndex;
652
654
  break;
653
655
  }
654
- const slashTwo = pathname.indexOf("/", 1);
656
+ const slashTwo = normalizedPathname.indexOf("/", 1);
655
657
  if (slashTwo !== -1) {
656
- const suffix = pathname.slice(slashTwo);
657
- const localePart = pathname.slice(1, slashTwo);
658
+ const suffix = normalizedPathname.slice(slashTwo);
659
+ const localePart = normalizedPathname.slice(1, slashTwo);
658
660
  const localeBucket = index.localeStatic.get(suffix);
659
661
  if (localeBucket) for (const entry of localeBucket) {
660
662
  if (entry.originalIndex >= localeMatchIndex) continue;
@@ -956,11 +958,13 @@ async function proxyExternalRequest(request, externalUrl) {
956
958
  * when evaluating headers, so this parameter is required.
957
959
  */
958
960
  function matchHeaders(pathname, headers, ctx, basePathState = _BASEPATH_DEFAULT) {
961
+ const pathnameHadTrailingSlash = pathname.length > 1 && pathname.endsWith("/");
959
962
  pathname = stripTrailingSlashForConfigMatch(pathname);
960
963
  const result = [];
961
964
  for (const rule of headers) {
962
965
  if (!shouldEvaluateRule(rule.basePath, basePathState)) continue;
963
- const sourceRegex = getCachedRegex(_compiledHeaderSourceCache, rule.source, () => safeRegExp("^" + escapeHeaderSource(rule.source) + "$"));
966
+ const source = pathnameHadTrailingSlash ? stripTrailingSlashForConfigMatch(rule.source) : rule.source;
967
+ const sourceRegex = getCachedRegex(_compiledHeaderSourceCache, source, () => safeRegExp("^" + escapeHeaderSource(source) + "$"));
964
968
  if (sourceRegex && sourceRegex.test(pathname)) {
965
969
  if (rule.has || rule.missing) {
966
970
  if (!checkHasConditions(rule.has, rule.missing, ctx)) continue;
@@ -107,7 +107,7 @@ type NextConfig = {
107
107
  }; /** Custom response headers */
108
108
  headers?: () => Promise<NextHeader[]> | NextHeader[]; /** Image optimization config */
109
109
  images?: {
110
- remotePatterns?: Array<{
110
+ remotePatterns?: Array<URL | {
111
111
  protocol?: string;
112
112
  hostname: string;
113
113
  port?: string;
@@ -272,8 +272,11 @@ type ResolvedNextConfig = {
272
272
  aliases: Record<string, string>; /** Extra allowed origins for dev server access (from allowedDevOrigins). */
273
273
  allowedDevOrigins: string[]; /** Extra allowed origins for server action CSRF validation (from experimental.serverActions.allowedOrigins). */
274
274
  serverActionsAllowedOrigins: string[]; /** Packages whose barrel imports should be optimized (from experimental.optimizePackageImports). */
275
- optimizePackageImports: string[]; /** Inline app CSS into production HTML (from experimental.inlineCss). */
276
- inlineCss: boolean; /** Parsed body size limit for server actions in bytes (from experimental.serverActions.bodySizeLimit). Defaults to 1MB. */
275
+ optimizePackageImports: string[]; /** Packages explicitly requested for server/client transpilation. */
276
+ transpilePackages: string[]; /** Packages treated as application code by Turbopack's foreign-code condition. */
277
+ turbopackTranspilePackages: string[]; /** Inline app CSS into production HTML (from experimental.inlineCss). */
278
+ inlineCss: boolean; /** Enable standalone route-miss 404 handling (from experimental.globalNotFound). */
279
+ globalNotFound: boolean; /** Parsed body size limit for server actions in bytes (from experimental.serverActions.bodySizeLimit). Defaults to 1MB. */
277
280
  serverActionsBodySizeLimit: number; /** Verbatim body size limit config value (e.g. "2mb") for the "Body exceeded {limit} limit" error. Defaults to "1 MB". */
278
281
  serverActionsBodySizeLimitLabel: string; /** Route-level expire fallback in seconds for ISR entries with numeric revalidate. */
279
282
  expireTime: number;