@ruan-cat/vercel-deploy-tool 0.12.2 → 1.0.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.
package/dist/cli.js ADDED
@@ -0,0 +1,523 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/cli.ts
4
+ import { readFileSync as readFileSync2 } from "fs";
5
+ import { fileURLToPath as fileURLToPath2 } from "url";
6
+ import path from "path";
7
+ import { Command as Command3 } from "commander";
8
+
9
+ // src/commands/deploy.ts
10
+ import { Command } from "commander";
11
+ import { consola as consola10 } from "consola";
12
+
13
+ // src/config/loader.ts
14
+ import { loadConfig as c12LoadConfig } from "c12";
15
+ import { resolve } from "pathe";
16
+ import { consola } from "consola";
17
+ import { isUndefined } from "lodash-es";
18
+ import { printFormat } from "@ruan-cat/utils";
19
+ var CONFIG_NAME = "vercel-deploy-tool";
20
+ var DEFAULT_CONFIG = {
21
+ vercelProjectName: "",
22
+ vercelToken: "",
23
+ vercelOrgId: "",
24
+ vercelProjectId: "",
25
+ deployTargets: []
26
+ };
27
+ async function loadConfig() {
28
+ const { config: config2 } = await c12LoadConfig({
29
+ cwd: resolve("."),
30
+ name: CONFIG_NAME,
31
+ dotenv: true,
32
+ defaults: DEFAULT_CONFIG
33
+ });
34
+ const vercelOrgId = process.env.VERCEL_ORG_ID;
35
+ const vercelProjectId = process.env.VERCEL_PROJECT_ID;
36
+ const vercelToken = process.env.VERCEL_TOKEN;
37
+ if (!isUndefined(vercelOrgId)) {
38
+ config2.vercelOrgId = vercelOrgId;
39
+ }
40
+ if (!isUndefined(vercelProjectId)) {
41
+ config2.vercelProjectId = vercelProjectId;
42
+ }
43
+ if (!isUndefined(vercelToken)) {
44
+ config2.vercelToken = vercelToken;
45
+ }
46
+ consola.success("\u914D\u7F6E\u52A0\u8F7D\u5B8C\u6210");
47
+ consola.box(printFormat(config2));
48
+ return config2;
49
+ }
50
+ var config = await loadConfig();
51
+
52
+ // src/core/tasks/index.ts
53
+ import fs from "fs";
54
+ import { consola as consola9 } from "consola";
55
+
56
+ // src/core/executor.ts
57
+ import task from "tasuku";
58
+ async function executeSequential(title, tasks) {
59
+ const results = [];
60
+ for (const t of tasks) {
61
+ const result = await task(t.name, t.fn);
62
+ results.push(result.result);
63
+ }
64
+ return results;
65
+ }
66
+
67
+ // src/utils/type-guards.ts
68
+ function isDeployTargetWithUserCommands(target) {
69
+ return target.type === "userCommands";
70
+ }
71
+ function getIsCopyDist(target) {
72
+ return target.isCopyDist ?? true;
73
+ }
74
+ function isNeedVercelBuild(target) {
75
+ return target.isNeedVercelBuild ?? true;
76
+ }
77
+
78
+ // src/utils/vercel-null-config.ts
79
+ var VERCEL_NULL_CONFIG = {
80
+ framework: null,
81
+ buildCommand: null,
82
+ installCommand: null,
83
+ outputDirectory: null,
84
+ devCommand: null,
85
+ public: false,
86
+ /**
87
+ * 部署后提供干净的链接
88
+ * @see https://vercel.com/docs/projects/project-configuration#cleanurls
89
+ *
90
+ * @description
91
+ * 暂无效果
92
+ *
93
+ * 目前在 build-output-api 中,实现cleanUrls需要手动地写入配置文件
94
+ *
95
+ * 成本较大,目前不做投入。
96
+ */
97
+ cleanUrls: true,
98
+ git: {
99
+ deploymentEnabled: {
100
+ main: false
101
+ }
102
+ }
103
+ };
104
+ var VERCEL_NULL_CONFIG_PATH = "./vercel.null.def.json";
105
+ var VERCEL_OUTPUT_STATIC = ".vercel/output/static";
106
+
107
+ // src/core/tasks/link.ts
108
+ import { spawnSync } from "child_process";
109
+ import { concat } from "lodash-es";
110
+ import { consola as consola2 } from "consola";
111
+
112
+ // src/core/vercel.ts
113
+ function getVercelProjectNameArg(config2) {
114
+ return ["--name", config2.vercelProjectName];
115
+ }
116
+ function getVercelScopeArg(config2) {
117
+ return ["--scope", config2.vercelOrgId];
118
+ }
119
+ function getVercelTokenArg(config2) {
120
+ return ["--token", config2.vercelToken];
121
+ }
122
+ function getVercelLocalConfigArg() {
123
+ return ["--local-config", VERCEL_NULL_CONFIG_PATH];
124
+ }
125
+ function getTargetCWDArg(target) {
126
+ return ["--cwd", target.targetCWD];
127
+ }
128
+
129
+ // src/core/tasks/link.ts
130
+ function createLinkTask(config2, target) {
131
+ return {
132
+ name: `Link: ${target.targetCWD}`,
133
+ fn: async () => {
134
+ const args = concat(
135
+ ["link"],
136
+ ["--yes"],
137
+ getTargetCWDArg(target),
138
+ getVercelProjectNameArg(config2),
139
+ getVercelTokenArg(config2)
140
+ );
141
+ consola2.start(`\u5F00\u59CB link \u4EFB\u52A1: ${target.targetCWD}`);
142
+ const result = spawnSync("vercel", args, {
143
+ encoding: "utf-8",
144
+ stdio: "inherit"
145
+ });
146
+ if (result.error) {
147
+ consola2.error(`link \u4EFB\u52A1\u5931\u8D25: ${target.targetCWD}`);
148
+ throw result.error;
149
+ }
150
+ consola2.success(`\u5B8C\u6210 link \u4EFB\u52A1: ${target.targetCWD}`);
151
+ return result.stdout;
152
+ }
153
+ };
154
+ }
155
+
156
+ // src/core/tasks/build.ts
157
+ import { spawnSync as spawnSync2 } from "child_process";
158
+ import { concat as concat2 } from "lodash-es";
159
+ import { consola as consola3 } from "consola";
160
+ function createBuildTask(config2, target) {
161
+ return {
162
+ name: `Build: ${target.targetCWD}`,
163
+ fn: async () => {
164
+ const args = concat2(
165
+ ["build"],
166
+ ["--yes"],
167
+ ["--prod"],
168
+ getTargetCWDArg(target),
169
+ getVercelLocalConfigArg(),
170
+ getVercelTokenArg(config2)
171
+ );
172
+ consola3.start(`\u5F00\u59CB build \u4EFB\u52A1: ${target.targetCWD}`);
173
+ const result = spawnSync2("vercel", args, {
174
+ encoding: "utf-8",
175
+ stdio: "inherit"
176
+ });
177
+ if (result.error) {
178
+ consola3.error(`build \u4EFB\u52A1\u5931\u8D25: ${target.targetCWD}`);
179
+ throw result.error;
180
+ }
181
+ consola3.success(`\u5B8C\u6210 build \u4EFB\u52A1: ${target.targetCWD}`);
182
+ return result.stdout;
183
+ }
184
+ };
185
+ }
186
+
187
+ // src/core/tasks/after-build.ts
188
+ import { spawnSync as spawnSync3 } from "child_process";
189
+ import { consola as consola4 } from "consola";
190
+ import { isUndefined as isUndefined2, isEmpty } from "lodash-es";
191
+ function createAfterBuildTasks(config2) {
192
+ const afterBuildTasks = config2.afterBuildTasks;
193
+ if (isUndefined2(afterBuildTasks) || isEmpty(afterBuildTasks)) {
194
+ return [
195
+ {
196
+ name: "AfterBuild: \u65E0\u4EFB\u52A1",
197
+ fn: async () => {
198
+ consola4.warn("\u5F53\u524D\u6CA1\u6709\u6709\u610F\u4E49\u7684 afterBuildTasks \u4EFB\u52A1\u914D\u7F6E");
199
+ return void 0;
200
+ }
201
+ }
202
+ ];
203
+ }
204
+ return afterBuildTasks.map((command) => ({
205
+ name: `AfterBuild: ${command}`,
206
+ fn: async () => {
207
+ consola4.start(`\u5F00\u59CB afterBuild \u4EFB\u52A1: ${command}`);
208
+ const result = spawnSync3(command, [], {
209
+ encoding: "utf-8",
210
+ stdio: "inherit",
211
+ shell: true
212
+ });
213
+ if (result.error) {
214
+ consola4.error(`afterBuild \u4EFB\u52A1\u5931\u8D25: ${command}`);
215
+ throw result.error;
216
+ }
217
+ consola4.success(`\u5B8C\u6210 afterBuild \u4EFB\u52A1: ${command}`);
218
+ return result.stdout;
219
+ }
220
+ }));
221
+ }
222
+
223
+ // src/core/tasks/user-commands.ts
224
+ import { spawnSync as spawnSync4 } from "child_process";
225
+ import { consola as consola5 } from "consola";
226
+ function createUserCommandTasks(target) {
227
+ return target.userCommands.map((command) => ({
228
+ name: `UserCommand: ${command}`,
229
+ fn: async () => {
230
+ consola5.start(`\u5F00\u59CB\u7528\u6237\u547D\u4EE4\u4EFB\u52A1: ${command}`);
231
+ const result = spawnSync4(command, [], {
232
+ encoding: "utf-8",
233
+ stdio: "inherit",
234
+ shell: true
235
+ });
236
+ if (result.error) {
237
+ consola5.error(`\u7528\u6237\u547D\u4EE4\u4EFB\u52A1\u5931\u8D25: ${command}`);
238
+ throw result.error;
239
+ }
240
+ consola5.success(`\u5B8C\u6210\u7528\u6237\u547D\u4EE4\u4EFB\u52A1: ${command}`);
241
+ return result.stdout;
242
+ }
243
+ }));
244
+ }
245
+
246
+ // src/core/tasks/copy-dist.ts
247
+ import { resolve as resolve2 } from "path";
248
+ import { rmSync, mkdirSync, cpSync } from "fs";
249
+ import { consola as consola6 } from "consola";
250
+ function createCopyDistTasks(target) {
251
+ const targetCWD = target.targetCWD;
252
+ const outputDirectory = target.outputDirectory;
253
+ function joinPath(dir) {
254
+ return resolve2(process.cwd(), targetCWD, dir);
255
+ }
256
+ const pathVercelOutputStatic = joinPath(VERCEL_OUTPUT_STATIC);
257
+ const pathOutputDirectory = joinPath(outputDirectory);
258
+ return [
259
+ {
260
+ name: `\u5220\u9664\u76EE\u5F55: ${pathVercelOutputStatic}`,
261
+ fn: async () => {
262
+ consola6.start(`\u5F00\u59CB\u5220\u9664\u6587\u4EF6\u4EFB\u52A1: ${pathVercelOutputStatic}`);
263
+ rmSync(pathVercelOutputStatic, { recursive: true, force: true });
264
+ consola6.success(`\u5220\u9664\u8BE5\u8DEF\u5F84\u7684\u6587\u4EF6: ${pathVercelOutputStatic}`);
265
+ }
266
+ },
267
+ {
268
+ name: `\u521B\u5EFA\u76EE\u5F55: ${pathVercelOutputStatic}`,
269
+ fn: async () => {
270
+ consola6.start(`\u5F00\u59CB\u521B\u5EFA\u6587\u4EF6\u5939\u4EFB\u52A1: ${pathVercelOutputStatic}`);
271
+ mkdirSync(pathVercelOutputStatic, { recursive: true });
272
+ consola6.success(`\u521B\u5EFA\u7684\u65B0\u76EE\u5F55\u4E3A: ${pathVercelOutputStatic}`);
273
+ }
274
+ },
275
+ {
276
+ name: `\u590D\u5236\u6587\u4EF6: ${pathOutputDirectory} -> ${pathVercelOutputStatic}`,
277
+ fn: async () => {
278
+ consola6.start(`\u5F00\u59CB\u6587\u4EF6\u590D\u5236\u4EFB\u52A1`);
279
+ consola6.info(`\u4ECE ${pathOutputDirectory} \u5F00\u59CB`);
280
+ consola6.info(`\u590D\u5236\u5230 ${pathVercelOutputStatic} \u5185`);
281
+ cpSync(pathOutputDirectory, pathVercelOutputStatic, { recursive: true });
282
+ consola6.success(`\u5B8C\u6210\u6587\u4EF6\u590D\u5236\u4EFB\u52A1`);
283
+ }
284
+ }
285
+ ];
286
+ }
287
+
288
+ // src/core/tasks/deploy.ts
289
+ import { spawnSync as spawnSync5 } from "child_process";
290
+ import { concat as concat3 } from "lodash-es";
291
+ import { consola as consola7 } from "consola";
292
+ function createDeployTask(config2, target) {
293
+ return {
294
+ name: `Deploy: ${target.targetCWD}`,
295
+ fn: async () => {
296
+ const args = concat3(
297
+ ["deploy"],
298
+ ["--yes"],
299
+ ["--prebuilt"],
300
+ ["--prod"],
301
+ getTargetCWDArg(target),
302
+ getVercelTokenArg(config2)
303
+ );
304
+ consola7.start(`\u5F00\u59CB\u90E8\u7F72\u4EFB\u52A1: ${target.targetCWD}`);
305
+ const result = spawnSync5("vercel", args, {
306
+ encoding: "utf-8"
307
+ });
308
+ if (result.error) {
309
+ consola7.error(`\u90E8\u7F72\u5931\u8D25\u4E86: ${target.targetCWD}`);
310
+ consola7.error(result.error);
311
+ throw result.error;
312
+ }
313
+ const vercelUrl = result.stdout.toString().trim();
314
+ consola7.success(`\u5B8C\u6210\u90E8\u7F72\u4EFB\u52A1\uFF0C\u751F\u6210\u7684url\u4E3A:`);
315
+ consola7.box(vercelUrl);
316
+ return vercelUrl;
317
+ }
318
+ };
319
+ }
320
+
321
+ // src/core/tasks/alias.ts
322
+ import { spawnSync as spawnSync6 } from "child_process";
323
+ import { concat as concat4 } from "lodash-es";
324
+ import { consola as consola8 } from "consola";
325
+ function createAliasTask(config2, vercelUrl, userUrl) {
326
+ return {
327
+ name: `Alias: ${userUrl}`,
328
+ fn: async () => {
329
+ const args = concat4(["alias", "set", vercelUrl, userUrl], getVercelTokenArg(config2), getVercelScopeArg(config2));
330
+ consola8.start(`\u5F00\u59CB\u522B\u540D\u4EFB\u52A1: ${userUrl}`);
331
+ const result = spawnSync6("vercel", args, {
332
+ encoding: "utf-8",
333
+ stdio: "inherit"
334
+ });
335
+ if (result.error) {
336
+ consola8.error(`\u522B\u540D\u4EFB\u52A1\u5931\u8D25: ${userUrl}`);
337
+ throw result.error;
338
+ }
339
+ consola8.success(`\u5B8C\u6210\u522B\u540D\u4EFB\u52A1\uFF0C\u53EF\u7528\u7684\u522B\u540D\u5730\u5740\u4E3A:`);
340
+ consola8.box(`https://${userUrl}`);
341
+ return result.stdout;
342
+ }
343
+ };
344
+ }
345
+
346
+ // src/core/tasks/index.ts
347
+ async function generateVercelNullConfig() {
348
+ fs.writeFileSync(VERCEL_NULL_CONFIG_PATH, JSON.stringify(VERCEL_NULL_CONFIG, null, 2));
349
+ consola9.success(`\u751F\u6210 Vercel \u7A7A\u914D\u7F6E\u6587\u4EF6: ${VERCEL_NULL_CONFIG_PATH}`);
350
+ }
351
+ async function executeDeploymentWorkflow(config2) {
352
+ await generateVercelNullConfig();
353
+ const { deployTargets } = config2;
354
+ await task("Vercel \u90E8\u7F72\u5DE5\u4F5C\u6D41", async ({ task: task2 }) => {
355
+ await task2("1. Link \u9879\u76EE", async () => {
356
+ const linkTasks = deployTargets.map((target) => createLinkTask(config2, target));
357
+ await task2.group((task3) => linkTasks.map((t) => task3(t.name, t.fn)));
358
+ });
359
+ await task2("2. \u6784\u5EFA\u9879\u76EE", async () => {
360
+ const buildTasks = deployTargets.filter(isNeedVercelBuild).map((target) => createBuildTask(config2, target));
361
+ if (buildTasks.length === 0) {
362
+ consola9.warn("\u6CA1\u6709\u9700\u8981\u6267\u884C build \u7684\u76EE\u6807");
363
+ return;
364
+ }
365
+ await task2.group((task3) => buildTasks.map((t) => task3(t.name, t.fn)));
366
+ });
367
+ await task2("3. \u6267\u884C AfterBuild \u4EFB\u52A1", async () => {
368
+ const afterBuildTasks = createAfterBuildTasks(config2);
369
+ await executeSequential("AfterBuild", afterBuildTasks);
370
+ });
371
+ await task2("4. \u6267\u884C\u7528\u6237\u547D\u4EE4\u4E0E\u6587\u4EF6\u590D\u5236", async () => {
372
+ const targetTasks = deployTargets.map((target) => ({
373
+ name: `\u5904\u7406\u76EE\u6807: ${target.targetCWD}`,
374
+ fn: async () => {
375
+ if (!isDeployTargetWithUserCommands(target)) {
376
+ consola9.warn(`\u76EE\u6807 ${target.targetCWD} \u4E0D\u5C5E\u4E8E userCommands \u7C7B\u578B`);
377
+ return;
378
+ }
379
+ const userCommandTasks = createUserCommandTasks(target);
380
+ await executeSequential(`UserCommands: ${target.targetCWD}`, userCommandTasks);
381
+ if (getIsCopyDist(target)) {
382
+ const copyDistTasks = createCopyDistTasks(target);
383
+ await executeSequential(`CopyDist: ${target.targetCWD}`, copyDistTasks);
384
+ } else {
385
+ consola9.warn(`\u76EE\u6807 ${target.targetCWD} \u4E0D\u9700\u8981\u590D\u5236\u6587\u4EF6`);
386
+ }
387
+ }
388
+ }));
389
+ await task2.group((task3) => targetTasks.map((t) => task3(t.name, t.fn)));
390
+ });
391
+ await task2("5. \u90E8\u7F72\u4E0E\u8BBE\u7F6E\u522B\u540D", async () => {
392
+ const deployAliasTasks = deployTargets.map((target) => ({
393
+ name: `\u90E8\u7F72\u4E0E\u522B\u540D: ${target.targetCWD}`,
394
+ fn: async () => {
395
+ const deployTask = createDeployTask(config2, target);
396
+ const deployResult = await task2(deployTask.name, deployTask.fn);
397
+ const vercelUrl = deployResult.result;
398
+ if (target.url && target.url.length > 0) {
399
+ const aliasTasks = target.url.map((userUrl) => createAliasTask(config2, vercelUrl, userUrl));
400
+ await task2.group((task3) => aliasTasks.map((t) => task3(t.name, t.fn)));
401
+ } else {
402
+ consola9.warn(`\u76EE\u6807 ${target.targetCWD} \u6CA1\u6709\u914D\u7F6E\u522B\u540D`);
403
+ }
404
+ }
405
+ }));
406
+ await task2.group((task3) => deployAliasTasks.map((t) => task3(t.name, t.fn)));
407
+ });
408
+ });
409
+ consola9.success("\u{1F389} Vercel \u90E8\u7F72\u5DE5\u4F5C\u6D41\u5B8C\u6210\uFF01");
410
+ }
411
+
412
+ // src/commands/deploy.ts
413
+ function createDeployCommand() {
414
+ const command = new Command("deploy");
415
+ command.description("\u90E8\u7F72\u9879\u76EE\u5230 Vercel").action(async () => {
416
+ try {
417
+ consola10.start("\u5F00\u59CB\u52A0\u8F7D\u914D\u7F6E...");
418
+ const config2 = await loadConfig();
419
+ consola10.start("\u5F00\u59CB\u6267\u884C\u90E8\u7F72\u5DE5\u4F5C\u6D41...");
420
+ await executeDeploymentWorkflow(config2);
421
+ consola10.success("\u90E8\u7F72\u5B8C\u6210\uFF01");
422
+ } catch (error) {
423
+ consola10.error("\u90E8\u7F72\u5931\u8D25:");
424
+ consola10.error(error);
425
+ process.exit(1);
426
+ }
427
+ });
428
+ return command;
429
+ }
430
+
431
+ // src/commands/init.ts
432
+ import { Command as Command2 } from "commander";
433
+ import { readFileSync, writeFileSync, existsSync } from "fs";
434
+ import { join, dirname } from "path";
435
+ import { fileURLToPath } from "url";
436
+ import { consola as consola11 } from "consola";
437
+ var __filename2 = fileURLToPath(import.meta.url);
438
+ var __dirname2 = dirname(__filename2);
439
+ function createInitCommand() {
440
+ const command = new Command2("init");
441
+ command.description("\u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6").option("-f, --force", "\u5F3A\u5236\u8986\u76D6\u5DF2\u5B58\u5728\u7684\u6587\u4EF6").action((options) => {
442
+ const cwd = process.cwd();
443
+ const configFile = "vercel-deploy-tool.config.ts";
444
+ const targetPath = join(cwd, configFile);
445
+ if (existsSync(targetPath) && !options.force) {
446
+ consola11.warn(`\u914D\u7F6E\u6587\u4EF6\u5DF2\u5B58\u5728: ${configFile}`);
447
+ consola11.info("\u4F7F\u7528 --force \u9009\u9879\u53EF\u4EE5\u8986\u76D6");
448
+ return;
449
+ }
450
+ const templatePath = join(__dirname2, "..", "templates", configFile);
451
+ if (!existsSync(templatePath)) {
452
+ consola11.error(`\u6A21\u677F\u6587\u4EF6\u4E0D\u5B58\u5728: ${templatePath}`);
453
+ consola11.error("\u8BF7\u786E\u4FDD @ruan-cat/vercel-deploy-tool \u5305\u5DF2\u6B63\u786E\u5B89\u88C5");
454
+ process.exit(1);
455
+ }
456
+ const content = readFileSync(templatePath, "utf-8");
457
+ writeFileSync(targetPath, content, "utf-8");
458
+ consola11.success(`\u5DF2\u521B\u5EFA\u914D\u7F6E\u6587\u4EF6: ${configFile}`);
459
+ const pkgPath = join(cwd, "package.json");
460
+ if (existsSync(pkgPath)) {
461
+ try {
462
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
463
+ if (!pkg.scripts) pkg.scripts = {};
464
+ pkg.scripts["deploy-vercel"] = "vercel-deploy-tool deploy";
465
+ writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n", "utf-8");
466
+ consola11.success('\u5DF2\u6DFB\u52A0\u811A\u672C: "deploy-vercel"');
467
+ } catch (error) {
468
+ consola11.warn("\u66F4\u65B0 package.json \u5931\u8D25:", error);
469
+ }
470
+ }
471
+ consola11.box(`\u{1F389} \u521D\u59CB\u5316\u5B8C\u6210\uFF01
472
+
473
+ \u521B\u5EFA\u7684\u6587\u4EF6:
474
+ \u2022 ${configFile} - Vercel \u90E8\u7F72\u914D\u7F6E\u6587\u4EF6
475
+
476
+ \u6DFB\u52A0\u7684\u811A\u672C:
477
+ \u2022 deploy-vercel: vercel-deploy-tool deploy
478
+
479
+ \u4E0B\u4E00\u6B65:
480
+ 1. \u7F16\u8F91 ${configFile} \u586B\u5199\u4F60\u7684\u914D\u7F6E
481
+ 2. \u786E\u4FDD\u73AF\u5883\u53D8\u91CF\u5DF2\u8BBE\u7F6E:
482
+ - VERCEL_TOKEN
483
+ - VERCEL_ORG_ID
484
+ - VERCEL_PROJECT_ID
485
+ 3. \u8FD0\u884C\u90E8\u7F72:
486
+ pnpm run deploy-vercel`);
487
+ });
488
+ return command;
489
+ }
490
+
491
+ // src/cli.ts
492
+ var __filename3 = fileURLToPath2(import.meta.url);
493
+ var __dirname3 = path.dirname(__filename3);
494
+ var packageJsonPath = path.join(__dirname3, "..", "package.json");
495
+ var packageJson = JSON.parse(readFileSync2(packageJsonPath, "utf-8"));
496
+ var { version } = packageJson;
497
+ var program = new Command3();
498
+ program.name("vercel-deploy-tool").description("Vercel \u90E8\u7F72\u5DE5\u5177 - \u652F\u6301 monorepo \u7684\u81EA\u52A8\u5316\u90E8\u7F72").version(version);
499
+ program.addCommand(createDeployCommand());
500
+ program.addCommand(createInitCommand());
501
+ program.on("--help", () => {
502
+ console.log("");
503
+ console.log("\u4F7F\u7528\u793A\u4F8B / Usage Examples:");
504
+ console.log("");
505
+ console.log(" # \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6");
506
+ console.log(" vercel-deploy-tool init");
507
+ console.log(" vdt init");
508
+ console.log("");
509
+ console.log(" # \u90E8\u7F72\u9879\u76EE");
510
+ console.log(" vercel-deploy-tool deploy");
511
+ console.log(" vdt deploy");
512
+ console.log("");
513
+ console.log(" # \u67E5\u770B\u5E2E\u52A9");
514
+ console.log(" vercel-deploy-tool --help");
515
+ console.log(" vdt --help");
516
+ console.log("");
517
+ console.log("\u73AF\u5883\u53D8\u91CF / Environment Variables:");
518
+ console.log(" VERCEL_TOKEN - Vercel API Token");
519
+ console.log(" VERCEL_ORG_ID - Vercel \u7EC4\u7EC7 ID");
520
+ console.log(" VERCEL_PROJECT_ID - Vercel \u9879\u76EE ID");
521
+ console.log("");
522
+ });
523
+ program.parse();