vinext 0.0.0 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -0
  3. package/dist/build/static-export.d.ts +78 -0
  4. package/dist/build/static-export.d.ts.map +1 -0
  5. package/dist/build/static-export.js +553 -0
  6. package/dist/build/static-export.js.map +1 -0
  7. package/dist/check.d.ts +52 -0
  8. package/dist/check.d.ts.map +1 -0
  9. package/dist/check.js +483 -0
  10. package/dist/check.js.map +1 -0
  11. package/dist/cli.d.ts +15 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +565 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/client/entry.d.ts +2 -0
  16. package/dist/client/entry.d.ts.map +1 -0
  17. package/dist/client/entry.js +85 -0
  18. package/dist/client/entry.js.map +1 -0
  19. package/dist/cloudflare/index.d.ts +8 -0
  20. package/dist/cloudflare/index.d.ts.map +1 -0
  21. package/dist/cloudflare/index.js +8 -0
  22. package/dist/cloudflare/index.js.map +1 -0
  23. package/dist/cloudflare/kv-cache-handler.d.ts +68 -0
  24. package/dist/cloudflare/kv-cache-handler.d.ts.map +1 -0
  25. package/dist/cloudflare/kv-cache-handler.js +304 -0
  26. package/dist/cloudflare/kv-cache-handler.js.map +1 -0
  27. package/dist/cloudflare/tpr.d.ts +78 -0
  28. package/dist/cloudflare/tpr.d.ts.map +1 -0
  29. package/dist/cloudflare/tpr.js +672 -0
  30. package/dist/cloudflare/tpr.js.map +1 -0
  31. package/dist/config/config-matchers.d.ts +106 -0
  32. package/dist/config/config-matchers.d.ts.map +1 -0
  33. package/dist/config/config-matchers.js +499 -0
  34. package/dist/config/config-matchers.js.map +1 -0
  35. package/dist/config/next-config.d.ts +153 -0
  36. package/dist/config/next-config.d.ts.map +1 -0
  37. package/dist/config/next-config.js +274 -0
  38. package/dist/config/next-config.js.map +1 -0
  39. package/dist/deploy.d.ts +87 -0
  40. package/dist/deploy.d.ts.map +1 -0
  41. package/dist/deploy.js +644 -0
  42. package/dist/deploy.js.map +1 -0
  43. package/dist/index.d.ts +156 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +3296 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/init.d.ts +55 -0
  48. package/dist/init.d.ts.map +1 -0
  49. package/dist/init.js +201 -0
  50. package/dist/init.js.map +1 -0
  51. package/dist/routing/app-router.d.ts +96 -0
  52. package/dist/routing/app-router.d.ts.map +1 -0
  53. package/dist/routing/app-router.js +815 -0
  54. package/dist/routing/app-router.js.map +1 -0
  55. package/dist/routing/pages-router.d.ts +52 -0
  56. package/dist/routing/pages-router.d.ts.map +1 -0
  57. package/dist/routing/pages-router.js +239 -0
  58. package/dist/routing/pages-router.js.map +1 -0
  59. package/dist/server/api-handler.d.ts +18 -0
  60. package/dist/server/api-handler.d.ts.map +1 -0
  61. package/dist/server/api-handler.js +169 -0
  62. package/dist/server/api-handler.js.map +1 -0
  63. package/dist/server/app-dev-server.d.ts +42 -0
  64. package/dist/server/app-dev-server.d.ts.map +1 -0
  65. package/dist/server/app-dev-server.js +2718 -0
  66. package/dist/server/app-dev-server.js.map +1 -0
  67. package/dist/server/app-router-entry.d.ts +18 -0
  68. package/dist/server/app-router-entry.d.ts.map +1 -0
  69. package/dist/server/app-router-entry.js +34 -0
  70. package/dist/server/app-router-entry.js.map +1 -0
  71. package/dist/server/dev-server.d.ts +40 -0
  72. package/dist/server/dev-server.d.ts.map +1 -0
  73. package/dist/server/dev-server.js +758 -0
  74. package/dist/server/dev-server.js.map +1 -0
  75. package/dist/server/html.d.ts +22 -0
  76. package/dist/server/html.d.ts.map +1 -0
  77. package/dist/server/html.js +29 -0
  78. package/dist/server/html.js.map +1 -0
  79. package/dist/server/image-optimization.d.ts +56 -0
  80. package/dist/server/image-optimization.d.ts.map +1 -0
  81. package/dist/server/image-optimization.js +103 -0
  82. package/dist/server/image-optimization.js.map +1 -0
  83. package/dist/server/instrumentation.d.ts +68 -0
  84. package/dist/server/instrumentation.d.ts.map +1 -0
  85. package/dist/server/instrumentation.js +90 -0
  86. package/dist/server/instrumentation.js.map +1 -0
  87. package/dist/server/isr-cache.d.ts +61 -0
  88. package/dist/server/isr-cache.d.ts.map +1 -0
  89. package/dist/server/isr-cache.js +134 -0
  90. package/dist/server/isr-cache.js.map +1 -0
  91. package/dist/server/metadata-routes.d.ts +103 -0
  92. package/dist/server/metadata-routes.d.ts.map +1 -0
  93. package/dist/server/metadata-routes.js +270 -0
  94. package/dist/server/metadata-routes.js.map +1 -0
  95. package/dist/server/middleware.d.ts +77 -0
  96. package/dist/server/middleware.d.ts.map +1 -0
  97. package/dist/server/middleware.js +228 -0
  98. package/dist/server/middleware.js.map +1 -0
  99. package/dist/server/prod-server.d.ts +78 -0
  100. package/dist/server/prod-server.d.ts.map +1 -0
  101. package/dist/server/prod-server.js +712 -0
  102. package/dist/server/prod-server.js.map +1 -0
  103. package/dist/shims/amp.d.ts +17 -0
  104. package/dist/shims/amp.d.ts.map +1 -0
  105. package/dist/shims/amp.js +21 -0
  106. package/dist/shims/amp.js.map +1 -0
  107. package/dist/shims/app.d.ts +12 -0
  108. package/dist/shims/app.d.ts.map +1 -0
  109. package/dist/shims/app.js +2 -0
  110. package/dist/shims/app.js.map +1 -0
  111. package/dist/shims/cache-runtime.d.ts +68 -0
  112. package/dist/shims/cache-runtime.d.ts.map +1 -0
  113. package/dist/shims/cache-runtime.js +437 -0
  114. package/dist/shims/cache-runtime.js.map +1 -0
  115. package/dist/shims/cache.d.ts +243 -0
  116. package/dist/shims/cache.d.ts.map +1 -0
  117. package/dist/shims/cache.js +415 -0
  118. package/dist/shims/cache.js.map +1 -0
  119. package/dist/shims/client-only.d.ts +18 -0
  120. package/dist/shims/client-only.d.ts.map +1 -0
  121. package/dist/shims/client-only.js +18 -0
  122. package/dist/shims/client-only.js.map +1 -0
  123. package/dist/shims/config.d.ts +27 -0
  124. package/dist/shims/config.d.ts.map +1 -0
  125. package/dist/shims/config.js +30 -0
  126. package/dist/shims/config.js.map +1 -0
  127. package/dist/shims/constants.d.ts +13 -0
  128. package/dist/shims/constants.d.ts.map +1 -0
  129. package/dist/shims/constants.js +13 -0
  130. package/dist/shims/constants.js.map +1 -0
  131. package/dist/shims/document.d.ts +33 -0
  132. package/dist/shims/document.d.ts.map +1 -0
  133. package/dist/shims/document.js +32 -0
  134. package/dist/shims/document.js.map +1 -0
  135. package/dist/shims/dynamic.d.ts +33 -0
  136. package/dist/shims/dynamic.d.ts.map +1 -0
  137. package/dist/shims/dynamic.js +149 -0
  138. package/dist/shims/dynamic.js.map +1 -0
  139. package/dist/shims/error-boundary.d.ts +33 -0
  140. package/dist/shims/error-boundary.d.ts.map +1 -0
  141. package/dist/shims/error-boundary.js +88 -0
  142. package/dist/shims/error-boundary.js.map +1 -0
  143. package/dist/shims/error.d.ts +16 -0
  144. package/dist/shims/error.d.ts.map +1 -0
  145. package/dist/shims/error.js +45 -0
  146. package/dist/shims/error.js.map +1 -0
  147. package/dist/shims/fetch-cache.d.ts +61 -0
  148. package/dist/shims/fetch-cache.d.ts.map +1 -0
  149. package/dist/shims/fetch-cache.js +307 -0
  150. package/dist/shims/fetch-cache.js.map +1 -0
  151. package/dist/shims/font-google.d.ts +122 -0
  152. package/dist/shims/font-google.d.ts.map +1 -0
  153. package/dist/shims/font-google.js +387 -0
  154. package/dist/shims/font-google.js.map +1 -0
  155. package/dist/shims/font-local.d.ts +61 -0
  156. package/dist/shims/font-local.d.ts.map +1 -0
  157. package/dist/shims/font-local.js +303 -0
  158. package/dist/shims/font-local.js.map +1 -0
  159. package/dist/shims/form.d.ts +30 -0
  160. package/dist/shims/form.d.ts.map +1 -0
  161. package/dist/shims/form.js +78 -0
  162. package/dist/shims/form.js.map +1 -0
  163. package/dist/shims/head-state.d.ts +11 -0
  164. package/dist/shims/head-state.d.ts.map +1 -0
  165. package/dist/shims/head-state.js +47 -0
  166. package/dist/shims/head-state.js.map +1 -0
  167. package/dist/shims/head.d.ts +28 -0
  168. package/dist/shims/head.d.ts.map +1 -0
  169. package/dist/shims/head.js +148 -0
  170. package/dist/shims/head.js.map +1 -0
  171. package/dist/shims/headers.d.ts +150 -0
  172. package/dist/shims/headers.d.ts.map +1 -0
  173. package/dist/shims/headers.js +412 -0
  174. package/dist/shims/headers.js.map +1 -0
  175. package/dist/shims/image-config.d.ts +30 -0
  176. package/dist/shims/image-config.d.ts.map +1 -0
  177. package/dist/shims/image-config.js +91 -0
  178. package/dist/shims/image-config.js.map +1 -0
  179. package/dist/shims/image.d.ts +63 -0
  180. package/dist/shims/image.d.ts.map +1 -0
  181. package/dist/shims/image.js +284 -0
  182. package/dist/shims/image.js.map +1 -0
  183. package/dist/shims/internal/api-utils.d.ts +12 -0
  184. package/dist/shims/internal/api-utils.d.ts.map +1 -0
  185. package/dist/shims/internal/api-utils.js +7 -0
  186. package/dist/shims/internal/api-utils.js.map +1 -0
  187. package/dist/shims/internal/app-router-context.d.ts +21 -0
  188. package/dist/shims/internal/app-router-context.d.ts.map +1 -0
  189. package/dist/shims/internal/app-router-context.js +15 -0
  190. package/dist/shims/internal/app-router-context.js.map +1 -0
  191. package/dist/shims/internal/cookies.d.ts +9 -0
  192. package/dist/shims/internal/cookies.d.ts.map +1 -0
  193. package/dist/shims/internal/cookies.js +9 -0
  194. package/dist/shims/internal/cookies.js.map +1 -0
  195. package/dist/shims/internal/router-context.d.ts +2 -0
  196. package/dist/shims/internal/router-context.d.ts.map +1 -0
  197. package/dist/shims/internal/router-context.js +9 -0
  198. package/dist/shims/internal/router-context.js.map +1 -0
  199. package/dist/shims/internal/utils.d.ts +48 -0
  200. package/dist/shims/internal/utils.d.ts.map +1 -0
  201. package/dist/shims/internal/utils.js +35 -0
  202. package/dist/shims/internal/utils.js.map +1 -0
  203. package/dist/shims/internal/work-unit-async-storage.d.ts +12 -0
  204. package/dist/shims/internal/work-unit-async-storage.d.ts.map +1 -0
  205. package/dist/shims/internal/work-unit-async-storage.js +13 -0
  206. package/dist/shims/internal/work-unit-async-storage.js.map +1 -0
  207. package/dist/shims/layout-segment-context.d.ts +21 -0
  208. package/dist/shims/layout-segment-context.d.ts.map +1 -0
  209. package/dist/shims/layout-segment-context.js +27 -0
  210. package/dist/shims/layout-segment-context.js.map +1 -0
  211. package/dist/shims/legacy-image.d.ts +52 -0
  212. package/dist/shims/legacy-image.d.ts.map +1 -0
  213. package/dist/shims/legacy-image.js +46 -0
  214. package/dist/shims/legacy-image.js.map +1 -0
  215. package/dist/shims/link.d.ts +48 -0
  216. package/dist/shims/link.d.ts.map +1 -0
  217. package/dist/shims/link.js +395 -0
  218. package/dist/shims/link.js.map +1 -0
  219. package/dist/shims/metadata.d.ts +184 -0
  220. package/dist/shims/metadata.d.ts.map +1 -0
  221. package/dist/shims/metadata.js +472 -0
  222. package/dist/shims/metadata.js.map +1 -0
  223. package/dist/shims/navigation-state.d.ts +14 -0
  224. package/dist/shims/navigation-state.d.ts.map +1 -0
  225. package/dist/shims/navigation-state.js +77 -0
  226. package/dist/shims/navigation-state.js.map +1 -0
  227. package/dist/shims/navigation.d.ts +201 -0
  228. package/dist/shims/navigation.d.ts.map +1 -0
  229. package/dist/shims/navigation.js +672 -0
  230. package/dist/shims/navigation.js.map +1 -0
  231. package/dist/shims/og.d.ts +20 -0
  232. package/dist/shims/og.d.ts.map +1 -0
  233. package/dist/shims/og.js +19 -0
  234. package/dist/shims/og.js.map +1 -0
  235. package/dist/shims/router-state.d.ts +11 -0
  236. package/dist/shims/router-state.d.ts.map +1 -0
  237. package/dist/shims/router-state.js +56 -0
  238. package/dist/shims/router-state.js.map +1 -0
  239. package/dist/shims/router.d.ts +103 -0
  240. package/dist/shims/router.d.ts.map +1 -0
  241. package/dist/shims/router.js +536 -0
  242. package/dist/shims/router.js.map +1 -0
  243. package/dist/shims/script.d.ts +58 -0
  244. package/dist/shims/script.d.ts.map +1 -0
  245. package/dist/shims/script.js +163 -0
  246. package/dist/shims/script.js.map +1 -0
  247. package/dist/shims/server-only.d.ts +19 -0
  248. package/dist/shims/server-only.d.ts.map +1 -0
  249. package/dist/shims/server-only.js +19 -0
  250. package/dist/shims/server-only.js.map +1 -0
  251. package/dist/shims/server.d.ts +178 -0
  252. package/dist/shims/server.d.ts.map +1 -0
  253. package/dist/shims/server.js +377 -0
  254. package/dist/shims/server.js.map +1 -0
  255. package/dist/shims/web-vitals.d.ts +24 -0
  256. package/dist/shims/web-vitals.d.ts.map +1 -0
  257. package/dist/shims/web-vitals.js +17 -0
  258. package/dist/shims/web-vitals.js.map +1 -0
  259. package/dist/utils/hash.d.ts +6 -0
  260. package/dist/utils/hash.d.ts.map +1 -0
  261. package/dist/utils/hash.js +20 -0
  262. package/dist/utils/hash.js.map +1 -0
  263. package/dist/utils/project.d.ts +36 -0
  264. package/dist/utils/project.d.ts.map +1 -0
  265. package/dist/utils/project.js +112 -0
  266. package/dist/utils/project.js.map +1 -0
  267. package/dist/utils/query.d.ts +10 -0
  268. package/dist/utils/query.d.ts.map +1 -0
  269. package/dist/utils/query.js +27 -0
  270. package/dist/utils/query.js.map +1 -0
  271. package/package.json +65 -7
  272. package/index.js +0 -1
package/dist/cli.js ADDED
@@ -0,0 +1,565 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * vinext CLI — drop-in replacement for the `next` command
4
+ *
5
+ * vinext dev Start development server (Vite)
6
+ * vinext build Build for production
7
+ * vinext start Start production server
8
+ * vinext deploy Deploy to Cloudflare Workers
9
+ * vinext lint Run linter (delegates to eslint/oxlint)
10
+ *
11
+ * Automatically configures Vite with the vinext plugin — no vite.config.ts
12
+ * needed for most Next.js apps.
13
+ */
14
+ import vinext, { clientOutputConfig, clientTreeshakeConfig } from "./index.js";
15
+ import path from "node:path";
16
+ import fs from "node:fs";
17
+ import { createRequire } from "node:module";
18
+ import { execSync } from "node:child_process";
19
+ import { deploy as runDeploy } from "./deploy.js";
20
+ import { runCheck, formatReport } from "./check.js";
21
+ import { init as runInit } from "./init.js";
22
+ let _viteModule = null;
23
+ /**
24
+ * Dynamically load Vite from the project root. Falls back to the bundled
25
+ * copy if the project doesn't have its own Vite installation.
26
+ */
27
+ async function loadVite() {
28
+ if (_viteModule)
29
+ return _viteModule;
30
+ const projectRoot = process.cwd();
31
+ let vitePath;
32
+ try {
33
+ // Resolve "vite" from the project root, not from vinext's location
34
+ const require = createRequire(path.join(projectRoot, "package.json"));
35
+ vitePath = require.resolve("vite");
36
+ }
37
+ catch {
38
+ // Fallback: use the Vite that ships with vinext (works for non-linked installs)
39
+ vitePath = "vite";
40
+ }
41
+ const vite = (await import(/* @vite-ignore */ vitePath));
42
+ _viteModule = vite;
43
+ return vite;
44
+ }
45
+ /**
46
+ * Get the Vite version string. Returns "unknown" before loadVite() is called.
47
+ */
48
+ function getViteVersion() {
49
+ return _viteModule?.version ?? "unknown";
50
+ }
51
+ const VERSION = "0.0.1";
52
+ // ─── CLI Argument Parsing ──────────────────────────────────────────────────────
53
+ const command = process.argv[2];
54
+ const rawArgs = process.argv.slice(3);
55
+ function parseArgs(args) {
56
+ const result = {};
57
+ for (let i = 0; i < args.length; i++) {
58
+ const arg = args[i];
59
+ if (arg === "--help" || arg === "-h") {
60
+ result.help = true;
61
+ }
62
+ else if (arg === "--turbopack") {
63
+ result.turbopack = true; // no-op, accepted for script compat
64
+ }
65
+ else if (arg === "--experimental-https") {
66
+ result.experimental = true; // no-op
67
+ }
68
+ else if (arg === "--port" || arg === "-p") {
69
+ result.port = parseInt(args[++i], 10);
70
+ }
71
+ else if (arg.startsWith("--port=")) {
72
+ result.port = parseInt(arg.split("=")[1], 10);
73
+ }
74
+ else if (arg === "--hostname" || arg === "-H") {
75
+ result.hostname = args[++i];
76
+ }
77
+ else if (arg.startsWith("--hostname=")) {
78
+ result.hostname = arg.split("=")[1];
79
+ }
80
+ }
81
+ return result;
82
+ }
83
+ /** Parse a numeric flag like --tpr-coverage 95 or --tpr-coverage=95. */
84
+ function parseNumericFlag(args, flag) {
85
+ const idx = args.indexOf(flag);
86
+ if (idx !== -1 && args[idx + 1]) {
87
+ const val = parseInt(args[idx + 1], 10);
88
+ if (!isNaN(val))
89
+ return val;
90
+ }
91
+ const eq = args.find((a) => a.startsWith(`${flag}=`));
92
+ if (eq) {
93
+ const val = parseInt(eq.split("=")[1], 10);
94
+ if (!isNaN(val))
95
+ return val;
96
+ }
97
+ return undefined;
98
+ }
99
+ // ─── Auto-configuration ───────────────────────────────────────────────────────
100
+ /**
101
+ * Build the Vite config automatically. If a vite.config.ts exists in the
102
+ * project, Vite will merge our config with it (theirs takes precedence).
103
+ * If there's no vite.config, this provides everything needed.
104
+ */
105
+ function hasAppDir() {
106
+ return (fs.existsSync(path.join(process.cwd(), "app")) ||
107
+ fs.existsSync(path.join(process.cwd(), "src", "app")));
108
+ }
109
+ function hasViteConfig() {
110
+ return (fs.existsSync(path.join(process.cwd(), "vite.config.ts")) ||
111
+ fs.existsSync(path.join(process.cwd(), "vite.config.js")) ||
112
+ fs.existsSync(path.join(process.cwd(), "vite.config.mjs")));
113
+ }
114
+ function buildViteConfig(overrides = {}) {
115
+ const hasConfig = hasViteConfig();
116
+ // If a vite.config exists, let Vite load it — only set root and overrides.
117
+ // The user's config already has vinext() + rsc() plugins configured.
118
+ // Adding them here too would duplicate the RSC transform (causes
119
+ // "Identifier has already been declared" errors in production builds).
120
+ if (hasConfig) {
121
+ return {
122
+ root: process.cwd(),
123
+ ...overrides,
124
+ };
125
+ }
126
+ // No vite.config — auto-configure everything.
127
+ // vinext() auto-registers @vitejs/plugin-rsc when app/ is detected,
128
+ // so we only need vinext() in the plugins array.
129
+ const config = {
130
+ root: process.cwd(),
131
+ configFile: false,
132
+ plugins: [vinext()],
133
+ // Deduplicate React packages to prevent "Invalid hook call" errors
134
+ // when vinext is symlinked (bun link / npm link) and both vinext's
135
+ // and the project's node_modules contain React.
136
+ resolve: {
137
+ dedupe: [
138
+ "react",
139
+ "react-dom",
140
+ "react/jsx-runtime",
141
+ "react/jsx-dev-runtime",
142
+ ],
143
+ },
144
+ ...overrides,
145
+ };
146
+ return config;
147
+ }
148
+ // ─── Commands ─────────────────────────────────────────────────────────────────
149
+ async function dev() {
150
+ const parsed = parseArgs(rawArgs);
151
+ if (parsed.help)
152
+ return printHelp("dev");
153
+ const vite = await loadVite();
154
+ const port = parsed.port ?? 3000;
155
+ const host = parsed.hostname ?? "localhost";
156
+ console.log(`\n vinext dev (Vite ${getViteVersion()})\n`);
157
+ const config = buildViteConfig({
158
+ server: { port, host },
159
+ });
160
+ const server = await vite.createServer(config);
161
+ await server.listen();
162
+ server.printUrls();
163
+ }
164
+ async function buildApp() {
165
+ const parsed = parseArgs(rawArgs);
166
+ if (parsed.help)
167
+ return printHelp("build");
168
+ const vite = await loadVite();
169
+ console.log(`\n vinext build (Vite ${getViteVersion()})\n`);
170
+ const isApp = hasAppDir();
171
+ if (isApp) {
172
+ // App Router: use createBuilder for multi-environment RSC builds
173
+ const config = buildViteConfig();
174
+ const builder = await vite.createBuilder(config);
175
+ await builder.buildApp();
176
+ }
177
+ else {
178
+ // Pages Router: client + SSR builds
179
+ const appRoot = process.cwd();
180
+ console.log(" Building client...");
181
+ await vite.build({
182
+ root: appRoot,
183
+ plugins: [vinext()],
184
+ build: {
185
+ outDir: "dist/client",
186
+ manifest: true,
187
+ ssrManifest: true,
188
+ rollupOptions: {
189
+ input: "virtual:vinext-client-entry",
190
+ output: clientOutputConfig,
191
+ treeshake: clientTreeshakeConfig,
192
+ },
193
+ },
194
+ });
195
+ console.log(" Building server...");
196
+ await vite.build({
197
+ root: appRoot,
198
+ plugins: [vinext()],
199
+ build: {
200
+ outDir: "dist/server",
201
+ ssr: "virtual:vinext-server-entry",
202
+ rollupOptions: {
203
+ output: {
204
+ entryFileNames: "entry.js",
205
+ },
206
+ },
207
+ },
208
+ });
209
+ }
210
+ console.log("\n Build complete. Run `vinext start` to start the production server.\n");
211
+ }
212
+ async function start() {
213
+ const parsed = parseArgs(rawArgs);
214
+ if (parsed.help)
215
+ return printHelp("start");
216
+ const port = parsed.port ?? parseInt(process.env.PORT ?? "3000", 10);
217
+ const host = parsed.hostname ?? "0.0.0.0";
218
+ console.log(`\n vinext start (port ${port})\n`);
219
+ const { startProdServer } = (await import(
220
+ /* @vite-ignore */ "./server/prod-server.js"));
221
+ await startProdServer({
222
+ port,
223
+ host,
224
+ outDir: path.resolve(process.cwd(), "dist"),
225
+ });
226
+ }
227
+ async function lint() {
228
+ const parsed = parseArgs(rawArgs);
229
+ if (parsed.help)
230
+ return printHelp("lint");
231
+ console.log(`\n vinext lint\n`);
232
+ // Try oxlint first (fast), fall back to eslint
233
+ const cwd = process.cwd();
234
+ const hasOxlint = fs.existsSync(path.join(cwd, "node_modules", ".bin", "oxlint"));
235
+ const hasEslint = fs.existsSync(path.join(cwd, "node_modules", ".bin", "eslint"));
236
+ // Check for next lint config (eslint-config-next)
237
+ const hasNextLintConfig = fs.existsSync(path.join(cwd, ".eslintrc.json")) ||
238
+ fs.existsSync(path.join(cwd, ".eslintrc.js")) ||
239
+ fs.existsSync(path.join(cwd, ".eslintrc.cjs")) ||
240
+ fs.existsSync(path.join(cwd, "eslint.config.js")) ||
241
+ fs.existsSync(path.join(cwd, "eslint.config.mjs"));
242
+ try {
243
+ if (hasEslint && hasNextLintConfig) {
244
+ console.log(" Using eslint (with existing config)\n");
245
+ execSync("npx eslint .", { cwd, stdio: "inherit" });
246
+ }
247
+ else if (hasOxlint) {
248
+ console.log(" Using oxlint\n");
249
+ execSync("npx oxlint .", { cwd, stdio: "inherit" });
250
+ }
251
+ else if (hasEslint) {
252
+ console.log(" Using eslint\n");
253
+ execSync("npx eslint .", { cwd, stdio: "inherit" });
254
+ }
255
+ else {
256
+ console.log(" No linter found. Install eslint or oxlint:\n\n" +
257
+ " npm install -D eslint eslint-config-next\n" +
258
+ " # or\n" +
259
+ " npm install -D oxlint\n");
260
+ process.exit(1);
261
+ }
262
+ console.log("\n Lint passed.\n");
263
+ }
264
+ catch {
265
+ process.exit(1);
266
+ }
267
+ }
268
+ async function deployCommand() {
269
+ const parsed = parseArgs(rawArgs);
270
+ if (parsed.help)
271
+ return printHelp("deploy");
272
+ await loadVite();
273
+ console.log(`\n vinext deploy (Vite ${getViteVersion()})\n`);
274
+ // Parse deploy-specific flags
275
+ const preview = rawArgs.includes("--preview");
276
+ const skipBuild = rawArgs.includes("--skip-build");
277
+ const dryRun = rawArgs.includes("--dry-run");
278
+ const experimentalTPR = rawArgs.includes("--experimental-tpr");
279
+ // Parse --name flag
280
+ let name;
281
+ const nameIdx = rawArgs.indexOf("--name");
282
+ if (nameIdx !== -1 && rawArgs[nameIdx + 1]) {
283
+ name = rawArgs[nameIdx + 1];
284
+ }
285
+ else {
286
+ const nameEq = rawArgs.find((a) => a.startsWith("--name="));
287
+ if (nameEq)
288
+ name = nameEq.split("=")[1];
289
+ }
290
+ // Parse TPR flags
291
+ const tprCoverage = parseNumericFlag(rawArgs, "--tpr-coverage");
292
+ const tprLimit = parseNumericFlag(rawArgs, "--tpr-limit");
293
+ const tprWindow = parseNumericFlag(rawArgs, "--tpr-window");
294
+ await runDeploy({
295
+ root: process.cwd(),
296
+ preview,
297
+ skipBuild,
298
+ dryRun,
299
+ name,
300
+ experimentalTPR,
301
+ tprCoverage,
302
+ tprLimit,
303
+ tprWindow,
304
+ });
305
+ }
306
+ async function check() {
307
+ const parsed = parseArgs(rawArgs);
308
+ if (parsed.help)
309
+ return printHelp("check");
310
+ const root = process.cwd();
311
+ console.log(`\n vinext check\n`);
312
+ console.log(" Scanning project...\n");
313
+ const result = runCheck(root);
314
+ console.log(formatReport(result));
315
+ }
316
+ async function initCommand() {
317
+ const parsed = parseArgs(rawArgs);
318
+ if (parsed.help)
319
+ return printHelp("init");
320
+ console.log(`\n vinext init\n`);
321
+ // Parse init-specific flags
322
+ const port = parsed.port ?? 3001;
323
+ const skipCheck = rawArgs.includes("--skip-check");
324
+ const force = rawArgs.includes("--force");
325
+ await runInit({
326
+ root: process.cwd(),
327
+ port,
328
+ skipCheck,
329
+ force,
330
+ });
331
+ }
332
+ // ─── Help ─────────────────────────────────────────────────────────────────────
333
+ function printHelp(cmd) {
334
+ if (cmd === "dev") {
335
+ console.log(`
336
+ vinext dev - Start development server
337
+
338
+ Usage: vinext dev [options]
339
+
340
+ Options:
341
+ -p, --port <port> Port to listen on (default: 3000)
342
+ -H, --hostname <host> Hostname to bind to (default: localhost)
343
+ --turbopack Accepted for compatibility (no-op, Vite is always used)
344
+ -h, --help Show this help
345
+ `);
346
+ return;
347
+ }
348
+ if (cmd === "build") {
349
+ console.log(`
350
+ vinext build - Build for production
351
+
352
+ Usage: vinext build [options]
353
+
354
+ Automatically detects App Router (app/) or Pages Router (pages/) and
355
+ runs the appropriate multi-environment build via Vite.
356
+
357
+ Options:
358
+ -h, --help Show this help
359
+ `);
360
+ return;
361
+ }
362
+ if (cmd === "start") {
363
+ console.log(`
364
+ vinext start - Start production server
365
+
366
+ Usage: vinext start [options]
367
+
368
+ Serves the output from \`vinext build\`. Supports SSR, static files,
369
+ compression, and all middleware.
370
+
371
+ Options:
372
+ -p, --port <port> Port to listen on (default: 3000, or PORT env)
373
+ -H, --hostname <host> Hostname to bind to (default: 0.0.0.0)
374
+ -h, --help Show this help
375
+ `);
376
+ return;
377
+ }
378
+ if (cmd === "deploy") {
379
+ console.log(`
380
+ vinext deploy - Deploy to Cloudflare Workers
381
+
382
+ Usage: vinext deploy [options]
383
+
384
+ One-command deployment to Cloudflare Workers. Automatically:
385
+ - Detects App Router or Pages Router
386
+ - Generates wrangler.jsonc, worker/index.ts, vite.config.ts if missing
387
+ - Installs @cloudflare/vite-plugin and wrangler if needed
388
+ - Builds the project with Vite
389
+ - Deploys via wrangler
390
+
391
+ Options:
392
+ --preview Deploy to a preview environment
393
+ --name <name> Custom Worker name (default: from package.json)
394
+ --skip-build Skip the build step (use existing dist/)
395
+ --dry-run Generate config files without building or deploying
396
+ -h, --help Show this help
397
+
398
+ Experimental:
399
+ --experimental-tpr Enable Traffic-aware Pre-Rendering
400
+ --tpr-coverage <pct> Traffic coverage target, 0–100 (default: 90)
401
+ --tpr-limit <count> Hard cap on pages to pre-render (default: 1000)
402
+ --tpr-window <hours> Analytics lookback window in hours (default: 24)
403
+
404
+ TPR (Traffic-aware Pre-Rendering) uses Cloudflare zone analytics to determine
405
+ which pages get the most traffic and pre-renders them into KV cache during
406
+ deploy. This feature is experimental and must be explicitly enabled. Requires
407
+ a custom domain (zone analytics are unavailable on *.workers.dev) and the
408
+ CLOUDFLARE_API_TOKEN environment variable with Zone.Analytics read permission.
409
+
410
+ Examples:
411
+ vinext deploy Build and deploy to production
412
+ vinext deploy --preview Deploy to a preview URL
413
+ vinext deploy --dry-run See what files would be generated
414
+ vinext deploy --name my-app Deploy with a custom Worker name
415
+ vinext deploy --experimental-tpr Enable TPR during deploy
416
+ vinext deploy --experimental-tpr --tpr-coverage 95 Cover 95% of traffic
417
+ vinext deploy --experimental-tpr --tpr-limit 500 Cap at 500 pages
418
+ `);
419
+ return;
420
+ }
421
+ if (cmd === "check") {
422
+ console.log(`
423
+ vinext check - Scan Next.js app for compatibility
424
+
425
+ Usage: vinext check [options]
426
+
427
+ Scans your Next.js project and produces a compatibility report showing
428
+ which imports, config options, libraries, and conventions are supported,
429
+ partially supported, or unsupported by vinext.
430
+
431
+ Options:
432
+ -h, --help Show this help
433
+ `);
434
+ return;
435
+ }
436
+ if (cmd === "init") {
437
+ console.log(`
438
+ vinext init - Migrate a Next.js project to run under vinext
439
+
440
+ Usage: vinext init [options]
441
+
442
+ One-command migration: installs dependencies, configures ESM,
443
+ generates vite.config.ts, and adds npm scripts. Your Next.js
444
+ setup continues to work alongside vinext.
445
+
446
+ Options:
447
+ -p, --port <port> Dev server port for the vinext script (default: 3001)
448
+ --skip-check Skip the compatibility check step
449
+ --force Overwrite existing vite.config.ts
450
+ -h, --help Show this help
451
+
452
+ Examples:
453
+ vinext init Migrate with defaults
454
+ vinext init -p 4000 Use port 4000 for dev:vinext
455
+ vinext init --force Overwrite existing vite.config.ts
456
+ vinext init --skip-check Skip the compatibility report
457
+ `);
458
+ return;
459
+ }
460
+ if (cmd === "lint") {
461
+ console.log(`
462
+ vinext lint - Run linter
463
+
464
+ Usage: vinext lint [options]
465
+
466
+ Delegates to your project's eslint (with eslint-config-next) or oxlint.
467
+ If neither is installed, suggests how to add one.
468
+
469
+ Options:
470
+ -h, --help Show this help
471
+ `);
472
+ return;
473
+ }
474
+ console.log(`
475
+ vinext v${VERSION} - Run Next.js apps on Vite
476
+
477
+ Usage: vinext <command> [options]
478
+
479
+ Commands:
480
+ dev Start development server
481
+ build Build for production
482
+ start Start production server
483
+ deploy Deploy to Cloudflare Workers
484
+ init Migrate a Next.js project to vinext
485
+ check Scan Next.js app for compatibility
486
+ lint Run linter
487
+
488
+ Options:
489
+ -h, --help Show this help
490
+ --version Show version
491
+
492
+ Examples:
493
+ vinext dev Start dev server on port 3000
494
+ vinext dev -p 4000 Start dev server on port 4000
495
+ vinext build Build for production
496
+ vinext start Start production server
497
+ vinext deploy Deploy to Cloudflare Workers
498
+ vinext init Migrate a Next.js project
499
+ vinext check Check compatibility
500
+ vinext lint Run linter
501
+
502
+ vinext is a drop-in replacement for the \`next\` CLI.
503
+ No vite.config.ts needed — just run \`vinext dev\` in your Next.js project.
504
+ `);
505
+ }
506
+ // ─── Entry ────────────────────────────────────────────────────────────────────
507
+ if (command === "--version" || command === "-v") {
508
+ console.log(`vinext v${VERSION}`);
509
+ process.exit(0);
510
+ }
511
+ if (command === "--help" || command === "-h" || !command) {
512
+ printHelp();
513
+ if (!command)
514
+ process.exit(0);
515
+ process.exit(0);
516
+ }
517
+ switch (command) {
518
+ case "dev":
519
+ dev().catch((e) => {
520
+ console.error(e);
521
+ process.exit(1);
522
+ });
523
+ break;
524
+ case "build":
525
+ buildApp().catch((e) => {
526
+ console.error(e);
527
+ process.exit(1);
528
+ });
529
+ break;
530
+ case "start":
531
+ start().catch((e) => {
532
+ console.error(e);
533
+ process.exit(1);
534
+ });
535
+ break;
536
+ case "deploy":
537
+ deployCommand().catch((e) => {
538
+ console.error(e);
539
+ process.exit(1);
540
+ });
541
+ break;
542
+ case "init":
543
+ initCommand().catch((e) => {
544
+ console.error(e);
545
+ process.exit(1);
546
+ });
547
+ break;
548
+ case "check":
549
+ check().catch((e) => {
550
+ console.error(e);
551
+ process.exit(1);
552
+ });
553
+ break;
554
+ case "lint":
555
+ lint().catch((e) => {
556
+ console.error(e);
557
+ process.exit(1);
558
+ });
559
+ break;
560
+ default:
561
+ console.error(`\n Unknown command: ${command}\n`);
562
+ printHelp();
563
+ process.exit(1);
564
+ }
565
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n\n/**\n * vinext CLI — drop-in replacement for the `next` command\n *\n * vinext dev Start development server (Vite)\n * vinext build Build for production\n * vinext start Start production server\n * vinext deploy Deploy to Cloudflare Workers\n * vinext lint Run linter (delegates to eslint/oxlint)\n *\n * Automatically configures Vite with the vinext plugin — no vite.config.ts\n * needed for most Next.js apps.\n */\n\nimport vinext, { clientOutputConfig, clientTreeshakeConfig } from \"./index.js\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { execSync } from \"node:child_process\";\nimport { deploy as runDeploy } from \"./deploy.js\";\nimport { runCheck, formatReport } from \"./check.js\";\nimport { init as runInit } from \"./init.js\";\n\n// ─── Resolve Vite from the project root ────────────────────────────────────────\n//\n// When vinext is installed via `bun link` or `npm link`, Node follows the\n// symlink back to the monorepo and resolves `vite` from the monorepo's\n// node_modules — not the project's. This causes dual Vite instances, dual\n// React copies, and plugin resolution failures.\n//\n// To fix this, we resolve Vite dynamically from `process.cwd()` at runtime\n// using `createRequire`. This ensures we always use the project's Vite.\n\ninterface ViteModule {\n createServer: typeof import(\"vite\").createServer;\n build: typeof import(\"vite\").build;\n createBuilder: typeof import(\"vite\").createBuilder;\n version: string;\n}\n\nlet _viteModule: ViteModule | null = null;\n\n/**\n * Dynamically load Vite from the project root. Falls back to the bundled\n * copy if the project doesn't have its own Vite installation.\n */\nasync function loadVite(): Promise<ViteModule> {\n if (_viteModule) return _viteModule;\n\n const projectRoot = process.cwd();\n let vitePath: string;\n\n try {\n // Resolve \"vite\" from the project root, not from vinext's location\n const require = createRequire(path.join(projectRoot, \"package.json\"));\n vitePath = require.resolve(\"vite\");\n } catch {\n // Fallback: use the Vite that ships with vinext (works for non-linked installs)\n vitePath = \"vite\";\n }\n\n const vite = (await import(/* @vite-ignore */ vitePath)) as ViteModule;\n _viteModule = vite;\n return vite;\n}\n\n/**\n * Get the Vite version string. Returns \"unknown\" before loadVite() is called.\n */\nfunction getViteVersion(): string {\n return _viteModule?.version ?? \"unknown\";\n}\n\nconst VERSION = \"0.0.1\";\n\n// ─── CLI Argument Parsing ──────────────────────────────────────────────────────\n\nconst command = process.argv[2];\nconst rawArgs = process.argv.slice(3);\n\ninterface ParsedArgs {\n port?: number;\n hostname?: string;\n help?: boolean;\n turbopack?: boolean; // accepted for compat, always ignored\n experimental?: boolean; // accepted for compat, always ignored\n}\n\nfunction parseArgs(args: string[]): ParsedArgs {\n const result: ParsedArgs = {};\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--help\" || arg === \"-h\") {\n result.help = true;\n } else if (arg === \"--turbopack\") {\n result.turbopack = true; // no-op, accepted for script compat\n } else if (arg === \"--experimental-https\") {\n result.experimental = true; // no-op\n } else if (arg === \"--port\" || arg === \"-p\") {\n result.port = parseInt(args[++i], 10);\n } else if (arg.startsWith(\"--port=\")) {\n result.port = parseInt(arg.split(\"=\")[1], 10);\n } else if (arg === \"--hostname\" || arg === \"-H\") {\n result.hostname = args[++i];\n } else if (arg.startsWith(\"--hostname=\")) {\n result.hostname = arg.split(\"=\")[1];\n }\n }\n return result;\n}\n\n/** Parse a numeric flag like --tpr-coverage 95 or --tpr-coverage=95. */\nfunction parseNumericFlag(args: string[], flag: string): number | undefined {\n const idx = args.indexOf(flag);\n if (idx !== -1 && args[idx + 1]) {\n const val = parseInt(args[idx + 1], 10);\n if (!isNaN(val)) return val;\n }\n const eq = args.find((a) => a.startsWith(`${flag}=`));\n if (eq) {\n const val = parseInt(eq.split(\"=\")[1], 10);\n if (!isNaN(val)) return val;\n }\n return undefined;\n}\n\n// ─── Auto-configuration ───────────────────────────────────────────────────────\n\n/**\n * Build the Vite config automatically. If a vite.config.ts exists in the\n * project, Vite will merge our config with it (theirs takes precedence).\n * If there's no vite.config, this provides everything needed.\n */\nfunction hasAppDir(): boolean {\n return (\n fs.existsSync(path.join(process.cwd(), \"app\")) ||\n fs.existsSync(path.join(process.cwd(), \"src\", \"app\"))\n );\n}\n\nfunction hasViteConfig(): boolean {\n return (\n fs.existsSync(path.join(process.cwd(), \"vite.config.ts\")) ||\n fs.existsSync(path.join(process.cwd(), \"vite.config.js\")) ||\n fs.existsSync(path.join(process.cwd(), \"vite.config.mjs\"))\n );\n}\n\nfunction buildViteConfig(overrides: Record<string, unknown> = {}) {\n const hasConfig = hasViteConfig();\n\n // If a vite.config exists, let Vite load it — only set root and overrides.\n // The user's config already has vinext() + rsc() plugins configured.\n // Adding them here too would duplicate the RSC transform (causes\n // \"Identifier has already been declared\" errors in production builds).\n if (hasConfig) {\n return {\n root: process.cwd(),\n ...overrides,\n };\n }\n\n // No vite.config — auto-configure everything.\n // vinext() auto-registers @vitejs/plugin-rsc when app/ is detected,\n // so we only need vinext() in the plugins array.\n const config: Record<string, unknown> = {\n root: process.cwd(),\n configFile: false,\n plugins: [vinext()],\n // Deduplicate React packages to prevent \"Invalid hook call\" errors\n // when vinext is symlinked (bun link / npm link) and both vinext's\n // and the project's node_modules contain React.\n resolve: {\n dedupe: [\n \"react\",\n \"react-dom\",\n \"react/jsx-runtime\",\n \"react/jsx-dev-runtime\",\n ],\n },\n ...overrides,\n };\n\n return config;\n}\n\n// ─── Commands ─────────────────────────────────────────────────────────────────\n\nasync function dev() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"dev\");\n\n const vite = await loadVite();\n\n const port = parsed.port ?? 3000;\n const host = parsed.hostname ?? \"localhost\";\n\n console.log(`\\n vinext dev (Vite ${getViteVersion()})\\n`);\n\n const config = buildViteConfig({\n server: { port, host },\n });\n\n const server = await vite.createServer(config);\n await server.listen();\n server.printUrls();\n}\n\nasync function buildApp() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"build\");\n\n const vite = await loadVite();\n\n console.log(`\\n vinext build (Vite ${getViteVersion()})\\n`);\n\n const isApp = hasAppDir();\n\n if (isApp) {\n // App Router: use createBuilder for multi-environment RSC builds\n const config = buildViteConfig();\n const builder = await vite.createBuilder(config);\n await builder.buildApp();\n } else {\n // Pages Router: client + SSR builds\n const appRoot = process.cwd();\n\n console.log(\" Building client...\");\n await vite.build({\n root: appRoot,\n plugins: [vinext()],\n build: {\n outDir: \"dist/client\",\n manifest: true,\n ssrManifest: true,\n rollupOptions: {\n input: \"virtual:vinext-client-entry\",\n output: clientOutputConfig,\n treeshake: clientTreeshakeConfig,\n },\n },\n });\n\n console.log(\" Building server...\");\n await vite.build({\n root: appRoot,\n plugins: [vinext()],\n build: {\n outDir: \"dist/server\",\n ssr: \"virtual:vinext-server-entry\",\n rollupOptions: {\n output: {\n entryFileNames: \"entry.js\",\n },\n },\n },\n });\n }\n\n console.log(\"\\n Build complete. Run `vinext start` to start the production server.\\n\");\n}\n\nasync function start() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"start\");\n\n const port = parsed.port ?? parseInt(process.env.PORT ?? \"3000\", 10);\n const host = parsed.hostname ?? \"0.0.0.0\";\n\n console.log(`\\n vinext start (port ${port})\\n`);\n\n const { startProdServer } = (await import(\n /* @vite-ignore */ \"./server/prod-server.js\"\n )) as {\n startProdServer: (opts: {\n port: number;\n host: string;\n outDir: string;\n }) => Promise<unknown>;\n };\n\n await startProdServer({\n port,\n host,\n outDir: path.resolve(process.cwd(), \"dist\"),\n });\n}\n\nasync function lint() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"lint\");\n\n console.log(`\\n vinext lint\\n`);\n\n // Try oxlint first (fast), fall back to eslint\n const cwd = process.cwd();\n const hasOxlint = fs.existsSync(path.join(cwd, \"node_modules\", \".bin\", \"oxlint\"));\n const hasEslint = fs.existsSync(path.join(cwd, \"node_modules\", \".bin\", \"eslint\"));\n\n // Check for next lint config (eslint-config-next)\n const hasNextLintConfig =\n fs.existsSync(path.join(cwd, \".eslintrc.json\")) ||\n fs.existsSync(path.join(cwd, \".eslintrc.js\")) ||\n fs.existsSync(path.join(cwd, \".eslintrc.cjs\")) ||\n fs.existsSync(path.join(cwd, \"eslint.config.js\")) ||\n fs.existsSync(path.join(cwd, \"eslint.config.mjs\"));\n\n try {\n if (hasEslint && hasNextLintConfig) {\n console.log(\" Using eslint (with existing config)\\n\");\n execSync(\"npx eslint .\", { cwd, stdio: \"inherit\" });\n } else if (hasOxlint) {\n console.log(\" Using oxlint\\n\");\n execSync(\"npx oxlint .\", { cwd, stdio: \"inherit\" });\n } else if (hasEslint) {\n console.log(\" Using eslint\\n\");\n execSync(\"npx eslint .\", { cwd, stdio: \"inherit\" });\n } else {\n console.log(\n \" No linter found. Install eslint or oxlint:\\n\\n\" +\n \" npm install -D eslint eslint-config-next\\n\" +\n \" # or\\n\" +\n \" npm install -D oxlint\\n\",\n );\n process.exit(1);\n }\n console.log(\"\\n Lint passed.\\n\");\n } catch {\n process.exit(1);\n }\n}\n\nasync function deployCommand() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"deploy\");\n\n await loadVite();\n console.log(`\\n vinext deploy (Vite ${getViteVersion()})\\n`);\n\n // Parse deploy-specific flags\n const preview = rawArgs.includes(\"--preview\");\n const skipBuild = rawArgs.includes(\"--skip-build\");\n const dryRun = rawArgs.includes(\"--dry-run\");\n const experimentalTPR = rawArgs.includes(\"--experimental-tpr\");\n\n // Parse --name flag\n let name: string | undefined;\n const nameIdx = rawArgs.indexOf(\"--name\");\n if (nameIdx !== -1 && rawArgs[nameIdx + 1]) {\n name = rawArgs[nameIdx + 1];\n } else {\n const nameEq = rawArgs.find((a) => a.startsWith(\"--name=\"));\n if (nameEq) name = nameEq.split(\"=\")[1];\n }\n\n // Parse TPR flags\n const tprCoverage = parseNumericFlag(rawArgs, \"--tpr-coverage\");\n const tprLimit = parseNumericFlag(rawArgs, \"--tpr-limit\");\n const tprWindow = parseNumericFlag(rawArgs, \"--tpr-window\");\n\n await runDeploy({\n root: process.cwd(),\n preview,\n skipBuild,\n dryRun,\n name,\n experimentalTPR,\n tprCoverage,\n tprLimit,\n tprWindow,\n });\n}\n\nasync function check() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"check\");\n\n const root = process.cwd();\n console.log(`\\n vinext check\\n`);\n console.log(\" Scanning project...\\n\");\n\n const result = runCheck(root);\n console.log(formatReport(result));\n}\n\nasync function initCommand() {\n const parsed = parseArgs(rawArgs);\n if (parsed.help) return printHelp(\"init\");\n\n console.log(`\\n vinext init\\n`);\n\n // Parse init-specific flags\n const port = parsed.port ?? 3001;\n const skipCheck = rawArgs.includes(\"--skip-check\");\n const force = rawArgs.includes(\"--force\");\n\n await runInit({\n root: process.cwd(),\n port,\n skipCheck,\n force,\n });\n}\n\n// ─── Help ─────────────────────────────────────────────────────────────────────\n\nfunction printHelp(cmd?: string) {\n if (cmd === \"dev\") {\n console.log(`\n vinext dev - Start development server\n\n Usage: vinext dev [options]\n\n Options:\n -p, --port <port> Port to listen on (default: 3000)\n -H, --hostname <host> Hostname to bind to (default: localhost)\n --turbopack Accepted for compatibility (no-op, Vite is always used)\n -h, --help Show this help\n`);\n return;\n }\n\n if (cmd === \"build\") {\n console.log(`\n vinext build - Build for production\n\n Usage: vinext build [options]\n\n Automatically detects App Router (app/) or Pages Router (pages/) and\n runs the appropriate multi-environment build via Vite.\n\n Options:\n -h, --help Show this help\n`);\n return;\n }\n\n if (cmd === \"start\") {\n console.log(`\n vinext start - Start production server\n\n Usage: vinext start [options]\n\n Serves the output from \\`vinext build\\`. Supports SSR, static files,\n compression, and all middleware.\n\n Options:\n -p, --port <port> Port to listen on (default: 3000, or PORT env)\n -H, --hostname <host> Hostname to bind to (default: 0.0.0.0)\n -h, --help Show this help\n`);\n return;\n }\n\n if (cmd === \"deploy\") {\n console.log(`\n vinext deploy - Deploy to Cloudflare Workers\n\n Usage: vinext deploy [options]\n\n One-command deployment to Cloudflare Workers. Automatically:\n - Detects App Router or Pages Router\n - Generates wrangler.jsonc, worker/index.ts, vite.config.ts if missing\n - Installs @cloudflare/vite-plugin and wrangler if needed\n - Builds the project with Vite\n - Deploys via wrangler\n\n Options:\n --preview Deploy to a preview environment\n --name <name> Custom Worker name (default: from package.json)\n --skip-build Skip the build step (use existing dist/)\n --dry-run Generate config files without building or deploying\n -h, --help Show this help\n\n Experimental:\n --experimental-tpr Enable Traffic-aware Pre-Rendering\n --tpr-coverage <pct> Traffic coverage target, 0–100 (default: 90)\n --tpr-limit <count> Hard cap on pages to pre-render (default: 1000)\n --tpr-window <hours> Analytics lookback window in hours (default: 24)\n\n TPR (Traffic-aware Pre-Rendering) uses Cloudflare zone analytics to determine\n which pages get the most traffic and pre-renders them into KV cache during\n deploy. This feature is experimental and must be explicitly enabled. Requires\n a custom domain (zone analytics are unavailable on *.workers.dev) and the\n CLOUDFLARE_API_TOKEN environment variable with Zone.Analytics read permission.\n\n Examples:\n vinext deploy Build and deploy to production\n vinext deploy --preview Deploy to a preview URL\n vinext deploy --dry-run See what files would be generated\n vinext deploy --name my-app Deploy with a custom Worker name\n vinext deploy --experimental-tpr Enable TPR during deploy\n vinext deploy --experimental-tpr --tpr-coverage 95 Cover 95% of traffic\n vinext deploy --experimental-tpr --tpr-limit 500 Cap at 500 pages\n`);\n return;\n }\n\n if (cmd === \"check\") {\n console.log(`\n vinext check - Scan Next.js app for compatibility\n\n Usage: vinext check [options]\n\n Scans your Next.js project and produces a compatibility report showing\n which imports, config options, libraries, and conventions are supported,\n partially supported, or unsupported by vinext.\n\n Options:\n -h, --help Show this help\n`);\n return;\n }\n\n if (cmd === \"init\") {\n console.log(`\n vinext init - Migrate a Next.js project to run under vinext\n\n Usage: vinext init [options]\n\n One-command migration: installs dependencies, configures ESM,\n generates vite.config.ts, and adds npm scripts. Your Next.js\n setup continues to work alongside vinext.\n\n Options:\n -p, --port <port> Dev server port for the vinext script (default: 3001)\n --skip-check Skip the compatibility check step\n --force Overwrite existing vite.config.ts\n -h, --help Show this help\n\n Examples:\n vinext init Migrate with defaults\n vinext init -p 4000 Use port 4000 for dev:vinext\n vinext init --force Overwrite existing vite.config.ts\n vinext init --skip-check Skip the compatibility report\n`);\n return;\n }\n\n if (cmd === \"lint\") {\n console.log(`\n vinext lint - Run linter\n\n Usage: vinext lint [options]\n\n Delegates to your project's eslint (with eslint-config-next) or oxlint.\n If neither is installed, suggests how to add one.\n\n Options:\n -h, --help Show this help\n`);\n return;\n }\n\n console.log(`\n vinext v${VERSION} - Run Next.js apps on Vite\n\n Usage: vinext <command> [options]\n\n Commands:\n dev Start development server\n build Build for production\n start Start production server\n deploy Deploy to Cloudflare Workers\n init Migrate a Next.js project to vinext\n check Scan Next.js app for compatibility\n lint Run linter\n\n Options:\n -h, --help Show this help\n --version Show version\n\n Examples:\n vinext dev Start dev server on port 3000\n vinext dev -p 4000 Start dev server on port 4000\n vinext build Build for production\n vinext start Start production server\n vinext deploy Deploy to Cloudflare Workers\n vinext init Migrate a Next.js project\n vinext check Check compatibility\n vinext lint Run linter\n\n vinext is a drop-in replacement for the \\`next\\` CLI.\n No vite.config.ts needed — just run \\`vinext dev\\` in your Next.js project.\n`);\n}\n\n// ─── Entry ────────────────────────────────────────────────────────────────────\n\nif (command === \"--version\" || command === \"-v\") {\n console.log(`vinext v${VERSION}`);\n process.exit(0);\n}\n\nif (command === \"--help\" || command === \"-h\" || !command) {\n printHelp();\n if (!command) process.exit(0);\n process.exit(0);\n}\n\nswitch (command) {\n case \"dev\":\n dev().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n case \"build\":\n buildApp().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n case \"start\":\n start().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n case \"deploy\":\n deployCommand().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n case \"init\":\n initCommand().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n case \"check\":\n check().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n case \"lint\":\n lint().catch((e) => {\n console.error(e);\n process.exit(1);\n });\n break;\n\n default:\n console.error(`\\n Unknown command: ${command}\\n`);\n printHelp();\n process.exit(1);\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import "next/router";
2
+ //# sourceMappingURL=entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../src/client/entry.ts"],"names":[],"mappings":"AAeA,OAAO,aAAa,CAAC"}