vinext 0.1.8 → 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 (237) 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.js +40 -2
  17. package/dist/cli-args.d.ts +1 -2
  18. package/dist/cli-args.js +1 -1
  19. package/dist/cli-dev-config.d.ts +12 -0
  20. package/dist/cli-dev-config.js +23 -0
  21. package/dist/cli.js +111 -95
  22. package/dist/{server → client}/dev-error-overlay-store.d.ts +1 -1
  23. package/dist/{server → client}/dev-error-overlay-store.js +1 -1
  24. package/dist/{server → client}/dev-error-overlay.d.ts +1 -1
  25. package/dist/{server → client}/dev-error-overlay.js +2 -2
  26. package/dist/client/navigation-runtime.d.ts +2 -0
  27. package/dist/client/navigation-runtime.js +3 -1
  28. package/dist/client/window-next.d.ts +2 -1
  29. package/dist/cloudflare/index.d.ts +2 -2
  30. package/dist/cloudflare/index.js +2 -2
  31. package/dist/config/config-matchers.js +14 -10
  32. package/dist/config/next-config.d.ts +5 -3
  33. package/dist/config/next-config.js +44 -1
  34. package/dist/config/prerender.d.ts +34 -0
  35. package/dist/config/prerender.js +55 -0
  36. package/dist/entries/app-rsc-entry.d.ts +2 -1
  37. package/dist/entries/app-rsc-entry.js +40 -10
  38. package/dist/entries/app-rsc-manifest.js +2 -0
  39. package/dist/entries/pages-client-entry.d.ts +3 -0
  40. package/dist/entries/pages-client-entry.js +15 -1
  41. package/dist/entries/pages-server-entry.js +5 -2
  42. package/dist/image/image-adapters-virtual.d.ts +59 -0
  43. package/dist/image/image-adapters-virtual.js +59 -0
  44. package/dist/index.d.ts +33 -0
  45. package/dist/index.js +167 -100
  46. package/dist/init-cloudflare.d.ts +43 -0
  47. package/dist/init-cloudflare.js +839 -0
  48. package/dist/init-platform.d.ts +40 -0
  49. package/dist/init-platform.js +195 -0
  50. package/dist/init.d.ts +16 -38
  51. package/dist/init.js +209 -99
  52. package/dist/node_modules/.pnpm/am-i-vibing@0.5.0/node_modules/am-i-vibing/dist/detector-1yx2Hoe0.js +294 -0
  53. package/dist/node_modules/.pnpm/process-ancestry@0.1.0/node_modules/process-ancestry/dist/index.js +94 -0
  54. package/dist/{cloudflare → packages/cloudflare}/src/cache/cdn-adapter.runtime.js +1 -1
  55. package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.d.ts +2 -2
  56. package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.js +1 -1
  57. package/dist/packages/cloudflare/src/deploy-config.js +150 -0
  58. package/dist/packages/cloudflare/src/deploy-help.js +55 -0
  59. package/dist/packages/cloudflare/src/deploy.js +276 -0
  60. package/dist/{cloudflare → packages/cloudflare/src}/tpr.d.ts +4 -41
  61. package/dist/{cloudflare → packages/cloudflare/src}/tpr.js +18 -15
  62. package/dist/plugins/ast-scope.d.ts +16 -0
  63. package/dist/plugins/ast-scope.js +62 -0
  64. package/dist/plugins/ast-utils.d.ts +27 -1
  65. package/dist/plugins/ast-utils.js +32 -1
  66. package/dist/plugins/css-module-imports.d.ts +14 -0
  67. package/dist/plugins/css-module-imports.js +59 -0
  68. package/dist/plugins/extensionless-dynamic-import.js +2 -2
  69. package/dist/plugins/ignore-dynamic-requests.d.ts +11 -0
  70. package/dist/plugins/ignore-dynamic-requests.js +530 -0
  71. package/dist/plugins/typeof-window.d.ts +1 -1
  72. package/dist/plugins/typeof-window.js +28 -56
  73. package/dist/routing/app-route-graph.d.ts +23 -2
  74. package/dist/routing/app-route-graph.js +126 -32
  75. package/dist/routing/file-matcher.d.ts +3 -0
  76. package/dist/routing/file-matcher.js +3 -0
  77. package/dist/routing/pages-router.js +2 -2
  78. package/dist/server/api-handler.js +9 -14
  79. package/dist/server/app-browser-action-result.d.ts +4 -1
  80. package/dist/server/app-browser-action-result.js +8 -1
  81. package/dist/server/app-browser-entry.js +161 -52
  82. package/dist/server/app-browser-interception-context.d.ts +1 -0
  83. package/dist/server/app-browser-interception-context.js +4 -2
  84. package/dist/server/app-browser-navigation-controller.d.ts +2 -0
  85. package/dist/server/app-browser-navigation-controller.js +60 -31
  86. package/dist/server/app-browser-server-action-client.d.ts +1 -1
  87. package/dist/server/app-browser-server-action-client.js +3 -4
  88. package/dist/server/app-browser-state.d.ts +11 -1
  89. package/dist/server/app-browser-state.js +25 -8
  90. package/dist/server/app-browser-visible-commit.d.ts +6 -1
  91. package/dist/server/app-browser-visible-commit.js +43 -25
  92. package/dist/server/app-elements-wire.d.ts +9 -2
  93. package/dist/server/app-elements-wire.js +8 -1
  94. package/dist/server/app-elements.d.ts +2 -2
  95. package/dist/server/app-elements.js +4 -3
  96. package/dist/server/app-fallback-renderer.d.ts +2 -1
  97. package/dist/server/app-fallback-renderer.js +10 -6
  98. package/dist/server/app-hydration-cache-publication.d.ts +11 -0
  99. package/dist/server/app-hydration-cache-publication.js +43 -0
  100. package/dist/server/app-middleware.d.ts +4 -3
  101. package/dist/server/app-middleware.js +8 -3
  102. package/dist/server/app-optimistic-routing.js +11 -4
  103. package/dist/server/app-page-cache-finalizer.js +2 -1
  104. package/dist/server/app-page-cache-render.d.ts +1 -0
  105. package/dist/server/app-page-cache-render.js +8 -4
  106. package/dist/server/app-page-cache.d.ts +1 -0
  107. package/dist/server/app-page-cache.js +5 -2
  108. package/dist/server/app-page-dispatch.js +1 -0
  109. package/dist/server/app-page-element-builder.d.ts +2 -1
  110. package/dist/server/app-page-element-builder.js +58 -4
  111. package/dist/server/app-page-probe.js +5 -0
  112. package/dist/server/app-page-render-identity.d.ts +1 -0
  113. package/dist/server/app-page-render-identity.js +1 -1
  114. package/dist/server/app-page-render.js +18 -0
  115. package/dist/server/app-page-request.d.ts +14 -0
  116. package/dist/server/app-page-request.js +69 -4
  117. package/dist/server/app-page-route-wiring.d.ts +8 -1
  118. package/dist/server/app-page-route-wiring.js +32 -18
  119. package/dist/server/app-page-segment-state.d.ts +2 -1
  120. package/dist/server/app-page-segment-state.js +3 -1
  121. package/dist/server/app-page-stream.d.ts +5 -0
  122. package/dist/server/app-page-stream.js +3 -1
  123. package/dist/server/app-route-handler-execution.js +5 -1
  124. package/dist/server/app-route-handler-response.js +1 -0
  125. package/dist/server/app-route-handler-runtime.js +1 -1
  126. package/dist/server/app-router-entry.js +9 -2
  127. package/dist/server/app-rsc-handler.d.ts +1 -0
  128. package/dist/server/app-rsc-handler.js +62 -31
  129. package/dist/server/app-rsc-request-normalization.d.ts +3 -2
  130. package/dist/server/app-rsc-request-normalization.js +6 -3
  131. package/dist/server/app-segment-config.d.ts +11 -0
  132. package/dist/server/app-segment-config.js +62 -6
  133. package/dist/server/app-server-action-execution.d.ts +1 -0
  134. package/dist/server/app-server-action-execution.js +58 -28
  135. package/dist/server/app-ssr-entry.d.ts +3 -0
  136. package/dist/server/app-ssr-entry.js +15 -7
  137. package/dist/server/app-ssr-stream.d.ts +7 -3
  138. package/dist/server/app-ssr-stream.js +10 -6
  139. package/dist/server/app-visited-response-cache.d.ts +6 -0
  140. package/dist/server/app-visited-response-cache.js +3 -1
  141. package/dist/server/client-trace-metadata.js +26 -0
  142. package/dist/server/default-global-not-found-module.d.ts +14 -0
  143. package/dist/server/default-global-not-found-module.js +14 -0
  144. package/dist/server/dev-route-files.js +4 -0
  145. package/dist/server/dev-server.js +19 -18
  146. package/dist/server/dev-stack-sourcemap.d.ts +1 -1
  147. package/dist/server/dev-stack-sourcemap.js +1 -1
  148. package/dist/server/fetch-handler.d.ts +2 -0
  149. package/dist/server/fetch-handler.js +18 -0
  150. package/dist/server/headers.d.ts +3 -15
  151. package/dist/server/headers.js +2 -15
  152. package/dist/server/image-optimization.d.ts +51 -1
  153. package/dist/server/image-optimization.js +52 -2
  154. package/dist/server/implicit-tags.js +1 -1
  155. package/dist/server/isr-cache.d.ts +1 -1
  156. package/dist/server/isr-cache.js +2 -2
  157. package/dist/server/metadata-routes.d.ts +3 -1
  158. package/dist/server/metadata-routes.js +12 -2
  159. package/dist/server/middleware-runtime.js +6 -1
  160. package/dist/server/navigation-planner.d.ts +1 -0
  161. package/dist/server/navigation-planner.js +14 -3
  162. package/dist/server/pages-api-route.js +2 -2
  163. package/dist/server/pages-asset-tags.d.ts +4 -6
  164. package/dist/server/pages-asset-tags.js +12 -12
  165. package/dist/server/pages-client-assets.d.ts +12 -0
  166. package/dist/server/pages-client-assets.js +10 -0
  167. package/dist/server/pages-node-compat.d.ts +8 -1
  168. package/dist/server/pages-node-compat.js +32 -4
  169. package/dist/server/pages-page-data.d.ts +24 -1
  170. package/dist/server/pages-page-data.js +45 -24
  171. package/dist/server/pages-page-handler.d.ts +2 -1
  172. package/dist/server/pages-page-handler.js +19 -12
  173. package/dist/server/pages-page-response.d.ts +7 -0
  174. package/dist/server/pages-page-response.js +4 -1
  175. package/dist/server/pages-request-pipeline.d.ts +2 -0
  176. package/dist/server/pages-request-pipeline.js +25 -1
  177. package/dist/server/pages-router-entry.d.ts +30 -0
  178. package/dist/server/pages-router-entry.js +108 -0
  179. package/dist/server/prerender-manifest.d.ts +3 -1
  180. package/dist/server/prerender-route-params.js +1 -1
  181. package/dist/server/prod-server.d.ts +1 -1
  182. package/dist/server/prod-server.js +33 -20
  183. package/dist/server/request-pipeline.js +1 -0
  184. package/dist/server/seed-cache.js +4 -4
  185. package/dist/shims/app-router-scroll-state.d.ts +1 -0
  186. package/dist/shims/app-router-scroll-state.js +1 -0
  187. package/dist/shims/app-router-scroll.js +2 -1
  188. package/dist/shims/cache.js +19 -15
  189. package/dist/shims/cdn-cache.js +1 -1
  190. package/dist/shims/dynamic-preload-chunks.js +2 -1
  191. package/dist/shims/form.d.ts +3 -1
  192. package/dist/shims/form.js +37 -43
  193. package/dist/shims/headers.d.ts +7 -1
  194. package/dist/shims/headers.js +17 -3
  195. package/dist/shims/image.js +75 -14
  196. package/dist/shims/internal/app-route-detection.d.ts +2 -17
  197. package/dist/shims/internal/app-route-detection.js +4 -17
  198. package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +23 -0
  199. package/dist/shims/internal/hybrid-client-route-owner-direct.js +51 -0
  200. package/dist/shims/internal/hybrid-client-route-owner.d.ts +2 -15
  201. package/dist/shims/internal/hybrid-client-route-owner.js +9 -60
  202. package/dist/shims/internal/pages-data-fetch-dedup.d.ts +9 -5
  203. package/dist/shims/internal/pages-data-fetch-dedup.js +73 -14
  204. package/dist/shims/internal/pages-data-target.d.ts +10 -9
  205. package/dist/shims/internal/pages-data-target.js +91 -12
  206. package/dist/shims/internal/pages-router-components.d.ts +7 -0
  207. package/dist/shims/internal/pages-router-components.js +13 -0
  208. package/dist/shims/layout-segment-context.d.ts +4 -1
  209. package/dist/shims/layout-segment-context.js +18 -4
  210. package/dist/shims/link.js +55 -26
  211. package/dist/shims/navigation.d.ts +5 -1
  212. package/dist/shims/navigation.js +45 -10
  213. package/dist/shims/navigation.react-server.js +1 -1
  214. package/dist/shims/root-params.d.ts +15 -1
  215. package/dist/shims/root-params.js +21 -1
  216. package/dist/shims/router.d.ts +5 -7
  217. package/dist/shims/router.js +362 -93
  218. package/dist/shims/server.js +3 -2
  219. package/dist/shims/slot.js +3 -6
  220. package/dist/utils/client-runtime-metadata.d.ts +2 -18
  221. package/dist/utils/client-runtime-metadata.js +31 -22
  222. package/dist/utils/dev-stack-sourcemap-endpoint.d.ts +4 -0
  223. package/dist/{server → utils}/dev-stack-sourcemap-endpoint.js +1 -1
  224. package/dist/utils/domain-locale.d.ts +6 -3
  225. package/dist/{server → utils}/middleware-request-headers.d.ts +1 -1
  226. package/dist/{server → utils}/middleware-request-headers.js +2 -2
  227. package/dist/utils/project.d.ts +48 -2
  228. package/dist/utils/project.js +225 -4
  229. package/dist/utils/protocol-headers.d.ts +17 -0
  230. package/dist/utils/protocol-headers.js +17 -0
  231. package/dist/utils/react-version.d.ts +4 -0
  232. package/dist/utils/react-version.js +44 -0
  233. package/package.json +47 -2
  234. package/dist/deploy.d.ts +0 -197
  235. package/dist/deploy.js +0 -1040
  236. package/dist/server/dev-stack-sourcemap-endpoint.d.ts +0 -4
  237. /package/dist/{cloudflare → packages/cloudflare}/src/utils/cache-control-metadata.js +0 -0
package/dist/check.js CHANGED
@@ -192,7 +192,7 @@ const CONFIG_SUPPORT = {
192
192
  env: { status: "supported" },
193
193
  images: {
194
194
  status: "partial",
195
- detail: "remotePatterns validated, no local optimization"
195
+ detail: "remotePatterns validated; on-the-fly optimization via images.optimizer (Cloudflare Images), passthrough otherwise"
196
196
  },
197
197
  allowedDevOrigins: {
198
198
  status: "supported",
@@ -258,6 +258,42 @@ const CONFIG_SUPPORT = {
258
258
  status: "partial",
259
259
  detail: "config recognized; vinext does not implement navigation result caching"
260
260
  },
261
+ "experimental.middlewarePrefetch": {
262
+ status: "unsupported",
263
+ detail: "not recognized; use of this option is ignored"
264
+ },
265
+ "experimental.proxyPrefetch": {
266
+ status: "unsupported",
267
+ detail: "not recognized; use of this option is ignored"
268
+ },
269
+ "experimental.middlewareClientMaxBodySize": {
270
+ status: "unsupported",
271
+ detail: "not recognized; use of this option is ignored"
272
+ },
273
+ "experimental.proxyClientMaxBodySize": {
274
+ status: "unsupported",
275
+ detail: "not recognized; use of this option is ignored"
276
+ },
277
+ "experimental.externalMiddlewareRewritesResolve": {
278
+ status: "unsupported",
279
+ detail: "not recognized; use of this option is ignored"
280
+ },
281
+ "experimental.externalProxyRewritesResolve": {
282
+ status: "unsupported",
283
+ detail: "not recognized; use of this option is ignored"
284
+ },
285
+ "experimental.instrumentationHook": {
286
+ status: "unsupported",
287
+ detail: "not recognized; instrumentation files are enabled automatically"
288
+ },
289
+ skipMiddlewareUrlNormalize: {
290
+ status: "unsupported",
291
+ detail: "not recognized; use of this option is ignored"
292
+ },
293
+ skipProxyUrlNormalize: {
294
+ status: "unsupported",
295
+ detail: "not recognized; use of this option is ignored"
296
+ },
261
297
  "i18n.domains": {
262
298
  status: "partial",
263
299
  detail: "supported for Pages Router; App Router unchanged"
@@ -740,7 +776,9 @@ function analyzeConfig(root) {
740
776
  "transpilePackages",
741
777
  "webpack",
742
778
  "reactStrictMode",
743
- "poweredByHeader"
779
+ "poweredByHeader",
780
+ "skipMiddlewareUrlNormalize",
781
+ "skipProxyUrlNormalize"
744
782
  ]) {
745
783
  if (!present.top.has(opt)) continue;
746
784
  const support = CONFIG_SUPPORT[opt];
@@ -18,7 +18,6 @@ type ParsedArgs = {
18
18
  precompress?: boolean;
19
19
  positionals?: string[];
20
20
  };
21
- declare function parsePositiveIntegerArg(raw: string, flag: string): number;
22
21
  /**
23
22
  * Parse CLI arguments into a structured object.
24
23
  *
@@ -30,4 +29,4 @@ declare function parsePositiveIntegerArg(raw: string, flag: string): number;
30
29
  */
31
30
  declare function parseArgs(args: string[]): ParsedArgs;
32
31
  //#endregion
33
- export { parseArgs, parsePositiveIntegerArg };
32
+ export { parseArgs };
package/dist/cli-args.js CHANGED
@@ -121,4 +121,4 @@ function parseArgs(args) {
121
121
  return result;
122
122
  }
123
123
  //#endregion
124
- export { parseArgs, parsePositiveIntegerArg };
124
+ export { parseArgs };
@@ -0,0 +1,12 @@
1
+ import { Plugin, ServerOptions } from "vite";
2
+
3
+ //#region src/cli-dev-config.d.ts
4
+ type DevServerCliOptions = {
5
+ port?: number;
6
+ hostname?: string;
7
+ };
8
+ declare function applyDevServerDefaults(server: ServerOptions, options: DevServerCliOptions): void;
9
+ declare function createDevServerConfigPlugin(options: DevServerCliOptions): Plugin;
10
+ declare function normalizeDevServerHostname(host: string | boolean | undefined): string;
11
+ //#endregion
12
+ export { DevServerCliOptions, applyDevServerDefaults, createDevServerConfigPlugin, normalizeDevServerHostname };
@@ -0,0 +1,23 @@
1
+ //#region src/cli-dev-config.ts
2
+ function applyDevServerDefaults(server, options) {
3
+ server.port = options.port ?? server.port ?? 3e3;
4
+ server.host = options.hostname ?? server.host ?? "localhost";
5
+ }
6
+ function createDevServerConfigPlugin(options) {
7
+ return {
8
+ name: "vinext:dev-server-config",
9
+ enforce: "post",
10
+ config: {
11
+ order: "post",
12
+ handler(config) {
13
+ applyDevServerDefaults(config.server ??= {}, options);
14
+ }
15
+ }
16
+ };
17
+ }
18
+ function normalizeDevServerHostname(host) {
19
+ if (typeof host === "string") return host;
20
+ return host === true ? "0.0.0.0" : "localhost";
21
+ }
22
+ //#endregion
23
+ export { applyDevServerDefaults, createDevServerConfigPlugin, normalizeDevServerHostname };
package/dist/cli.js CHANGED
@@ -2,15 +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";
5
6
  import { normalizePathSeparators } from "./utils/path.js";
6
7
  import { PHASE_PRODUCTION_BUILD } from "./shims/constants.js";
7
8
  import { createRscCompatibilityId, loadNextConfig, resolveNextConfig } from "./config/next-config.js";
8
9
  import { generateRouteTypes } from "./typegen.js";
9
- 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";
10
13
  import { runPrerender } from "./build/run-prerender.js";
11
14
  import { loadDotenv } from "./config/dotenv.js";
12
- import { deploy, parseDeployArgs } from "./deploy.js";
13
- 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";
14
20
  import { resolveVinextPackageRoot } from "./utils/vinext-root.js";
15
21
  import { emitStandaloneOutput } from "./build/standalone.js";
16
22
  import { cleanBuildOutput } from "./build/clean-output.js";
@@ -28,7 +34,7 @@ import { execFileSync } from "node:child_process";
28
34
  * vinext dev Start development server (Vite)
29
35
  * vinext build Build for production
30
36
  * vinext start Start production server
31
- * vinext deploy Deploy to Cloudflare Workers
37
+ * vinext deploy Deprecated Cloudflare deploy shim
32
38
  * vinext typegen Generate App Router route helper types
33
39
  * vinext lint Run linter (delegates to eslint/oxlint)
34
40
  *
@@ -121,13 +127,17 @@ function createBuildLogger(vite) {
121
127
  function hasPagesDir() {
122
128
  return fs.existsSync(path.join(process.cwd(), "pages")) || fs.existsSync(path.join(process.cwd(), "src", "pages"));
123
129
  }
124
- async function loadBuildEmptyOutDir(vite, root) {
125
- if (!hasViteConfig(root)) return void 0;
126
- const emptyOutDir = (await vite.loadConfigFromFile({
130
+ async function loadBuildViteConfigMetadata(vite, root) {
131
+ if (!hasViteConfig(root)) return { prerenderConfig: null };
132
+ const loaded = await vite.loadConfigFromFile({
127
133
  command: "build",
128
134
  mode: "production"
129
- }, void 0, root))?.config.build?.emptyOutDir;
130
- 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
+ };
131
141
  }
132
142
  /**
133
143
  * Build the Vite config automatically. If a vite.config.ts exists in the
@@ -180,20 +190,20 @@ async function dev() {
180
190
  });
181
191
  applyViteConfigCompatibility(process.cwd());
182
192
  const vite = await loadVite();
183
- const port = parsed.port ?? 3e3;
184
- const host = parsed.hostname ?? "localhost";
193
+ const initialPort = parsed.port ?? 3e3;
194
+ const initialHost = parsed.hostname ?? "localhost";
185
195
  let lockfile;
186
196
  const startedAt = Date.now();
187
197
  if (process.env.VINEXT_NO_DEV_LOCK !== "1") {
188
198
  const root = process.cwd();
189
- const initialDisplayHost = host === "0.0.0.0" ? "localhost" : host;
199
+ const initialDisplayHost = initialHost === "0.0.0.0" ? "localhost" : initialHost;
190
200
  const acquired = tryAcquireLockfile({
191
201
  root,
192
202
  info: {
193
203
  pid: process.pid,
194
- port,
195
- hostname: host,
196
- appUrl: `http://${initialDisplayHost}:${port}`,
204
+ port: initialPort,
205
+ hostname: initialHost,
206
+ appUrl: `http://${initialDisplayHost}:${initialPort}`,
197
207
  startedAt,
198
208
  cwd: root
199
209
  }
@@ -209,13 +219,21 @@ async function dev() {
209
219
  lockfile = acquired.lockfile;
210
220
  }
211
221
  console.log(`\n vinext dev (Vite ${getViteVersion()})\n`);
212
- const config = buildViteConfig({ server: {
213
- port,
214
- host
215
- } });
222
+ const config = buildViteConfig();
223
+ (config.plugins ??= []).push(createDevServerConfigPlugin(parsed));
216
224
  let server;
217
225
  try {
218
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
+ });
219
237
  await server.listen();
220
238
  } catch (err) {
221
239
  lockfile?.release();
@@ -223,8 +241,10 @@ async function dev() {
223
241
  }
224
242
  server.printUrls();
225
243
  if (lockfile) {
244
+ const configuredPort = server.config.server.port ?? 3e3;
245
+ const configuredHost = normalizeDevServerHostname(server.config.server.host);
226
246
  const resolved = server.resolvedUrls?.local[0];
227
- let actualPort = port;
247
+ let actualPort = configuredPort;
228
248
  let appUrl;
229
249
  if (resolved) {
230
250
  appUrl = resolved.replace(/\/$/, "");
@@ -234,13 +254,13 @@ async function dev() {
234
254
  } catch {}
235
255
  } else {
236
256
  const address = server.httpServer?.address();
237
- actualPort = typeof address === "object" && address ? address.port : port;
238
- 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}`;
239
259
  }
240
260
  lockfile.update({
241
261
  pid: process.pid,
242
262
  port: actualPort,
243
- hostname: host,
263
+ hostname: configuredHost,
244
264
  appUrl,
245
265
  startedAt,
246
266
  cwd: process.cwd()
@@ -261,7 +281,7 @@ async function buildApp() {
261
281
  const withBuildBundlerOptions = (bundlerOptions) => viteMajorVersion >= 8 ? { rolldownOptions: bundlerOptions } : { rollupOptions: bundlerOptions };
262
282
  console.log(`\n vinext build (Vite ${getViteVersion()})\n`);
263
283
  const root = process.cwd();
264
- const isApp = hasAppDir(process.cwd());
284
+ const isApp = hasAppDir(normalizePathSeparators(root));
265
285
  const resolvedNextConfig = await resolveNextConfig(await loadNextConfig(root, PHASE_PRODUCTION_BUILD), root);
266
286
  process.env.__VINEXT_SHARED_BUILD_ID = resolvedNextConfig.buildId;
267
287
  process.env.__VINEXT_SHARED_RSC_COMPATIBILITY_ID = createRscCompatibilityId(resolvedNextConfig);
@@ -288,15 +308,19 @@ async function buildApp() {
288
308
  });
289
309
  }
290
310
  }
311
+ const buildConfigMetadata = await loadBuildViteConfigMetadata(vite, root);
291
312
  cleanBuildOutput({
292
313
  root,
293
314
  outDir: distDir,
294
- emptyOutDir: await loadBuildEmptyOutDir(vite, root)
315
+ emptyOutDir: buildConfigMetadata.emptyOutDir
295
316
  });
296
- const config = buildViteConfig({}, logger);
297
- await (await vite.createBuilder(config)).buildApp();
298
- if (isApp) {
299
- 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) {
300
324
  console.log(" Building Pages Router server (hybrid)...");
301
325
  const root = process.cwd();
302
326
  let userTransformPlugins = [];
@@ -327,6 +351,11 @@ async function buildApp() {
327
351
  }
328
352
  });
329
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
+ }
330
359
  }
331
360
  if (outputMode === "standalone") {
332
361
  const standalone = emitStandaloneOutput({
@@ -338,23 +367,27 @@ async function buildApp() {
338
367
  return process.exit(0);
339
368
  }
340
369
  let prerenderResult;
341
- 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) {
342
376
  if (resolvedNextConfig.enablePrerenderSourceMaps) {
343
377
  process.setSourceMapsEnabled(true);
344
378
  Error.stackTraceLimit = Math.max(Error.stackTraceLimit, 50);
345
379
  }
346
- const label = parsed.prerenderAll ? "Pre-rendering all routes..." : "Pre-rendering all routes (output: 'export')...";
347
380
  process.stdout.write("\x1B[0m");
348
- console.log(` ${label}`);
381
+ console.log(` ${formatVinextPrerenderLabel(prerenderDecision)}`);
349
382
  prerenderResult = await runPrerender({
350
- root: process.cwd(),
383
+ root: normalizePathSeparators(process.cwd()),
351
384
  concurrency: parsed.prerenderConcurrency
352
385
  });
353
386
  }
354
387
  process.stdout.write("\x1B[0m");
355
388
  const { printBuildReport } = await import("./build/report.js");
356
389
  await printBuildReport({
357
- root: process.cwd(),
390
+ root: normalizePathSeparators(process.cwd()),
358
391
  pageExtensions: resolvedNextConfig.pageExtensions,
359
392
  prerenderResult: prerenderResult ?? void 0
360
393
  });
@@ -421,7 +454,12 @@ async function lint() {
421
454
  }
422
455
  async function deployCommand() {
423
456
  const parsed = parseDeployArgs(rawArgs);
424
- if (parsed.help) return printHelp("deploy");
457
+ if (parsed.help) {
458
+ printDeployDeprecationWarning();
459
+ printDeployHelp();
460
+ return;
461
+ }
462
+ printDeployDeprecationWarning();
425
463
  await loadVite();
426
464
  console.log(`\n vinext deploy (Vite ${getViteVersion()})\n`);
427
465
  await deploy({
@@ -439,6 +477,9 @@ async function deployCommand() {
439
477
  tprWindow: parsed.tprWindow
440
478
  });
441
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
+ }
442
483
  async function check() {
443
484
  if (parseArgs(rawArgs).help) return printHelp("check");
444
485
  console.log(`\n vinext check\n`);
@@ -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 };