@mznjs/mbump 2.0.2 → 2.1.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/CHANGELOG.md +30 -0
- package/README.md +192 -239
- package/dist/{VersionManager-DSOVXsFt.js → VersionManager-CwsuNWyP.js} +26 -12
- package/dist/VersionManager-CwsuNWyP.js.map +1 -0
- package/dist/cli.js +171 -49
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +3 -3
- package/dist/VersionManager-DSOVXsFt.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { VersionManager, loadConfigAsync, logger_default } from "./VersionManager-
|
|
2
|
+
import { VersionManager, loadConfigAsync, logger_default } from "./VersionManager-CwsuNWyP.js";
|
|
3
3
|
import { existsSync, readFileSync } from "node:fs";
|
|
4
|
-
import { dirname, join } from "node:path";
|
|
4
|
+
import { dirname, join, resolve } from "node:path";
|
|
5
5
|
import { execSync } from "node:child_process";
|
|
6
6
|
import process from "node:process";
|
|
7
7
|
import semver from "semver";
|
|
@@ -94,12 +94,17 @@ async function selectAllVersionsInteractive(config, rootDir) {
|
|
|
94
94
|
|
|
95
95
|
//#endregion
|
|
96
96
|
//#region src/cli/parser.ts
|
|
97
|
+
function isPathLike(arg) {
|
|
98
|
+
return arg.startsWith("./") || arg.startsWith("../") || arg.startsWith(".\\") || arg.startsWith("..\\") || arg.startsWith("/") || arg.startsWith("\\") || /^[A-Za-z]:[\\/].*/.test(arg) || arg.startsWith("~") || arg === "." || arg.startsWith("\\\\") || arg.startsWith("//") || arg.includes("/") || arg.includes("\\") || arg.includes(".");
|
|
99
|
+
}
|
|
97
100
|
function parseArgs(args, defaults = {}) {
|
|
98
101
|
const parsed = {
|
|
99
102
|
package: null,
|
|
103
|
+
projectPath: null,
|
|
100
104
|
type: defaults.releaseType || defaults.type || "patch",
|
|
101
105
|
dryRun: defaults.dryRun || false,
|
|
102
106
|
help: false,
|
|
107
|
+
version: false,
|
|
103
108
|
verbose: defaults.verbose || false,
|
|
104
109
|
autoCommit: defaults.git?.autoCommit !== false,
|
|
105
110
|
push: defaults.git?.push !== false,
|
|
@@ -136,12 +141,15 @@ function parseArgs(args, defaults = {}) {
|
|
|
136
141
|
} else if (arg === "--allow-uncommitted" || arg === "-u") {
|
|
137
142
|
parsed.allowUncommitted = true;
|
|
138
143
|
i++;
|
|
139
|
-
} else if (arg === "--npm" || arg === "-
|
|
144
|
+
} else if (arg === "--npm" || arg === "-N") {
|
|
140
145
|
parsed.npm = true;
|
|
141
146
|
i++;
|
|
142
|
-
} else if (arg === "--show-config") {
|
|
147
|
+
} else if (arg === "--show-config" || arg === "-c") {
|
|
143
148
|
parsed.showConfig = true;
|
|
144
149
|
i++;
|
|
150
|
+
} else if (arg === "--version" || arg === "-V") {
|
|
151
|
+
parsed.version = true;
|
|
152
|
+
i++;
|
|
145
153
|
} else if (arg === "--type" || arg === "-t") if (i + 1 < args.length) {
|
|
146
154
|
const typeValue = args[i + 1];
|
|
147
155
|
if (allowedTypes.includes(typeValue)) {
|
|
@@ -155,8 +163,10 @@ function parseArgs(args, defaults = {}) {
|
|
|
155
163
|
else throw new Error(`不支持的版本类型: ${typeValue},支持的类型: ${allowedTypes.join(", ")}`);
|
|
156
164
|
i++;
|
|
157
165
|
} else if (!arg.startsWith("-")) {
|
|
158
|
-
if (!parsed.package) parsed.
|
|
166
|
+
if (!parsed.projectPath && !parsed.package) if (isPathLike(arg)) parsed.projectPath = arg;
|
|
167
|
+
else parsed.package = arg;
|
|
159
168
|
else if (allowedTypes.includes(arg)) parsed.type = arg;
|
|
169
|
+
else if (!parsed.package && !isPathLike(arg)) parsed.package = arg;
|
|
160
170
|
i++;
|
|
161
171
|
} else i++;
|
|
162
172
|
}
|
|
@@ -259,10 +269,11 @@ function showHelp() {
|
|
|
259
269
|
========================
|
|
260
270
|
企业级版本管理工具,支持单包和monorepo场景
|
|
261
271
|
|
|
262
|
-
用法: mbump [package] [type] [options]
|
|
272
|
+
用法: mbump [package|path] [type] [options]
|
|
263
273
|
|
|
264
274
|
参数:
|
|
265
275
|
[package] 要更新的包名称或 "all" 更新所有包
|
|
276
|
+
[path] 项目目录路径(支持 ./path, ../path, /path, C:\\path),自动查找该目录下的 package.json
|
|
266
277
|
[type] 版本升级类型: major, minor, patch, pre-patch, pre-minor, pre-major
|
|
267
278
|
|
|
268
279
|
选项:
|
|
@@ -271,8 +282,9 @@ function showHelp() {
|
|
|
271
282
|
--no-commit, -n 禁用自动git提交
|
|
272
283
|
--no-push, -p 禁用自动推送到远程仓库
|
|
273
284
|
--allow-uncommitted, -u 允许在有未提交更改的情况下继续操作
|
|
274
|
-
--npm, -
|
|
275
|
-
--show-config 显示当前加载的完整配置信息
|
|
285
|
+
--npm, -N 启用npm包发布功能(默认不发布)
|
|
286
|
+
--show-config, -c 显示当前加载的完整配置信息
|
|
287
|
+
--version, -V 显示版本信息
|
|
276
288
|
--help, -h 显示此帮助信息
|
|
277
289
|
|
|
278
290
|
示例:
|
|
@@ -281,6 +293,11 @@ function showHelp() {
|
|
|
281
293
|
mbump plugins major --dry-run # 试运行升级plugins包主版本
|
|
282
294
|
mbump core patch --no-push # 更新版本并提交到本地,但不推送到远程
|
|
283
295
|
mbump components patch --npm # 更新版本并发布到npm
|
|
296
|
+
|
|
297
|
+
# 路径模式(直接指定项目目录)
|
|
298
|
+
mbump ./packages/my-pkg # 更新 ./packages/my-pkg 目录下的 package.json
|
|
299
|
+
mbump ./packages/my-pkg patch # 指定版本类型
|
|
300
|
+
mbump ../other-project minor # 更新上级目录的项目
|
|
284
301
|
`;
|
|
285
302
|
logger_default.info(helpText);
|
|
286
303
|
}
|
|
@@ -302,13 +319,64 @@ async function main() {
|
|
|
302
319
|
showHelp();
|
|
303
320
|
process.exit(0);
|
|
304
321
|
}
|
|
322
|
+
if (args.includes("--version") || args.includes("-V")) {
|
|
323
|
+
logger_default.info(`mbump v${packageVersion}`);
|
|
324
|
+
process.exit(0);
|
|
325
|
+
}
|
|
326
|
+
const parsedArgs = parseArgs(args);
|
|
327
|
+
if (parsedArgs.projectPath) {
|
|
328
|
+
const resolvedProjectPath = resolve(process.cwd(), parsedArgs.projectPath);
|
|
329
|
+
if (!existsSync(resolvedProjectPath)) throw new Error(`路径 "${parsedArgs.projectPath}" 不存在`);
|
|
330
|
+
const pkgJsonPath = join(resolvedProjectPath, "package.json");
|
|
331
|
+
if (!existsSync(pkgJsonPath)) throw new Error(`路径 "${parsedArgs.projectPath}" 中不存在 package.json`);
|
|
332
|
+
logger_default.info(`切换到项目路径: ${resolvedProjectPath}`);
|
|
333
|
+
const projectConfig = await loadConfigAsync(resolvedProjectPath);
|
|
334
|
+
parsedArgs.package = "default";
|
|
335
|
+
const projectVersionManager = new VersionManager({
|
|
336
|
+
config: projectConfig,
|
|
337
|
+
rootDir: resolvedProjectPath
|
|
338
|
+
});
|
|
339
|
+
logger_default.setLevel(parsedArgs.verbose ? "debug" : "info");
|
|
340
|
+
const pkgPath = projectConfig.packagePaths[parsedArgs.package];
|
|
341
|
+
const pkg = projectVersionManager.getPackageInfo(pkgPath);
|
|
342
|
+
const newVersion = semver.inc(pkg.version, parsedArgs.type);
|
|
343
|
+
if (!newVersion) {
|
|
344
|
+
displayError(new Error(`无法计算新版本,当前版本 "${pkg.version}",版本类型 "${parsedArgs.type}"`), { operation: "版本计算" });
|
|
345
|
+
process.exit(1);
|
|
346
|
+
}
|
|
347
|
+
const isDefaultPackage = parsedArgs.package === "default" || pkgPath === "package.json";
|
|
348
|
+
const tagPrefix = projectConfig.git?.tagPrefix || "v";
|
|
349
|
+
const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`;
|
|
350
|
+
if (parsedArgs.dryRun) {
|
|
351
|
+
logger_default.info("🔍 Dry-run 模式 - 以下操作将被执行:\n");
|
|
352
|
+
logger_default.info(` 📦 ${parsedArgs.package}`);
|
|
353
|
+
logger_default.info(` 当前版本: ${pkg.version}`);
|
|
354
|
+
logger_default.info(` 新版本: ${newVersion}`);
|
|
355
|
+
logger_default.info(` Tag: ${tagName}`);
|
|
356
|
+
logger_default.info(` CHANGELOG: ${projectConfig.git?.changelog !== false ? "是" : "否(配置禁用)"}`);
|
|
357
|
+
logger_default.info(` Git Commit: ${parsedArgs.autoCommit ? "是" : "否"}`);
|
|
358
|
+
logger_default.info(` Git Push: ${parsedArgs.push ? "是" : "否"}`);
|
|
359
|
+
logger_default.info(` NPM Publish: ${parsedArgs.npm ? "是" : "否"}`);
|
|
360
|
+
logger_default.info("\n✅ 以上为预览,未执行任何实际操作");
|
|
361
|
+
process.exit(0);
|
|
362
|
+
}
|
|
363
|
+
await projectVersionManager.updateVersion(parsedArgs.package, parsedArgs.type, {
|
|
364
|
+
dryRun: parsedArgs.dryRun,
|
|
365
|
+
verbose: parsedArgs.verbose,
|
|
366
|
+
autoCommit: parsedArgs.autoCommit,
|
|
367
|
+
push: parsedArgs.push,
|
|
368
|
+
npm: parsedArgs.npm
|
|
369
|
+
});
|
|
370
|
+
logger_default.success(`版本更新完成`);
|
|
371
|
+
process.exit(0);
|
|
372
|
+
}
|
|
305
373
|
const rootDir = process.cwd();
|
|
306
374
|
const config = await logger_default.withSpinner("正在加载配置...", () => loadConfigAsync(rootDir), {
|
|
307
375
|
succeedText: "配置加载完成",
|
|
308
376
|
failText: "配置加载失败"
|
|
309
377
|
});
|
|
310
|
-
const
|
|
311
|
-
if (
|
|
378
|
+
const parsedArgsWithDefaults = parseArgs(args, config.defaults);
|
|
379
|
+
if (parsedArgsWithDefaults.showConfig) {
|
|
312
380
|
logger_default.info("📋 当前加载的配置:");
|
|
313
381
|
logger_default.info("");
|
|
314
382
|
if (config.usedConfigPath) {
|
|
@@ -317,10 +385,7 @@ async function main() {
|
|
|
317
385
|
} else logger_default.info(" 配置文件: (默认配置)");
|
|
318
386
|
logger_default.info("");
|
|
319
387
|
logger_default.info("📦 包路径:");
|
|
320
|
-
for (const [name, path] of Object.entries(config.packagePaths)) {
|
|
321
|
-
const relativePath = path.split(/[/\\]/).pop();
|
|
322
|
-
logger_default.info(` ${name}: ${relativePath}`);
|
|
323
|
-
}
|
|
388
|
+
for (const [name, path] of Object.entries(config.packagePaths)) logger_default.info(` ${name}: ${path}`);
|
|
324
389
|
logger_default.info("");
|
|
325
390
|
logger_default.info("⚙️ 默认选项:");
|
|
326
391
|
logger_default.info(` releaseType: ${config.defaults?.releaseType}`);
|
|
@@ -342,30 +407,87 @@ async function main() {
|
|
|
342
407
|
process.exit(0);
|
|
343
408
|
}
|
|
344
409
|
const packageNames = Object.keys(config.packagePaths);
|
|
345
|
-
if (!
|
|
346
|
-
else if (packageNames.length === 1)
|
|
347
|
-
else
|
|
348
|
-
|
|
349
|
-
|
|
410
|
+
if (!parsedArgsWithDefaults.package) if (packageNames.includes("default")) parsedArgsWithDefaults.package = "default";
|
|
411
|
+
else if (packageNames.length === 1) parsedArgsWithDefaults.package = packageNames[0];
|
|
412
|
+
else {
|
|
413
|
+
displayError(new Error(`未指定包名\n可用的包名: ${packageNames.join(", ")} 或使用 "all" 更新所有包`));
|
|
414
|
+
process.exit(1);
|
|
415
|
+
}
|
|
416
|
+
else if (parsedArgsWithDefaults.package !== "all" && !packageNames.includes(parsedArgsWithDefaults.package)) {
|
|
417
|
+
const maybePath = parsedArgsWithDefaults.package;
|
|
418
|
+
if (maybePath) {
|
|
419
|
+
const resolvedPath = resolve(process.cwd(), maybePath);
|
|
420
|
+
const pkgJsonPath = join(resolvedPath, "package.json");
|
|
421
|
+
if (existsSync(resolvedPath) && existsSync(pkgJsonPath)) {
|
|
422
|
+
logger_default.info(`切换到项目路径: ${resolvedPath}`);
|
|
423
|
+
const projectConfig = await loadConfigAsync(resolvedPath);
|
|
424
|
+
const projectVersionManager = new VersionManager({
|
|
425
|
+
config: projectConfig,
|
|
426
|
+
rootDir: resolvedPath
|
|
427
|
+
});
|
|
428
|
+
logger_default.setLevel(parsedArgsWithDefaults.verbose ? "debug" : "info");
|
|
429
|
+
const pkgPath = projectConfig.packagePaths.default;
|
|
430
|
+
const pkg = projectVersionManager.getPackageInfo(pkgPath);
|
|
431
|
+
const newVersion = semver.inc(pkg.version, parsedArgsWithDefaults.type);
|
|
432
|
+
if (!newVersion) {
|
|
433
|
+
displayError(new Error(`无法计算新版本,当前版本 "${pkg.version}",版本类型 "${parsedArgsWithDefaults.type}"`), { operation: "版本计算" });
|
|
434
|
+
process.exit(1);
|
|
435
|
+
}
|
|
436
|
+
const tagPrefix = projectConfig.git?.tagPrefix || "v";
|
|
437
|
+
const tagName = `${tagPrefix}${newVersion}`;
|
|
438
|
+
if (parsedArgsWithDefaults.dryRun) {
|
|
439
|
+
logger_default.info("🔍 Dry-run 模式 - 以下操作将被执行:\n");
|
|
440
|
+
logger_default.info(` 📦 default`);
|
|
441
|
+
logger_default.info(` 当前版本: ${pkg.version}`);
|
|
442
|
+
logger_default.info(` 新版本: ${newVersion}`);
|
|
443
|
+
logger_default.info(` Tag: ${tagName}`);
|
|
444
|
+
logger_default.info(` CHANGELOG: ${projectConfig.git?.changelog !== false ? "是" : "否(配置禁用)"}`);
|
|
445
|
+
logger_default.info(` Git Commit: ${parsedArgsWithDefaults.autoCommit ? "是" : "否"}`);
|
|
446
|
+
logger_default.info(` Git Push: ${parsedArgsWithDefaults.push ? "是" : "否"}`);
|
|
447
|
+
logger_default.info(` NPM Publish: ${parsedArgsWithDefaults.npm ? "是" : "否"}`);
|
|
448
|
+
logger_default.info("\n✅ 以上为预览,未执行任何实际操作");
|
|
449
|
+
process.exit(0);
|
|
450
|
+
}
|
|
451
|
+
await projectVersionManager.updateVersion("default", parsedArgsWithDefaults.type, {
|
|
452
|
+
dryRun: parsedArgsWithDefaults.dryRun,
|
|
453
|
+
verbose: parsedArgsWithDefaults.verbose,
|
|
454
|
+
autoCommit: parsedArgsWithDefaults.autoCommit,
|
|
455
|
+
push: parsedArgsWithDefaults.push,
|
|
456
|
+
npm: parsedArgsWithDefaults.npm
|
|
457
|
+
});
|
|
458
|
+
logger_default.success(`版本更新完成`);
|
|
459
|
+
process.exit(0);
|
|
460
|
+
} else {
|
|
461
|
+
displayError(new Error(`包名 "${parsedArgsWithDefaults.package}" 未在配置中找到,且路径 "${resolvedPath}" 不是有效的项目目录`), { operation: "包名/路径解析" });
|
|
462
|
+
logger_default.info(`💡 可用的包名: ${packageNames.join(", ")} 或使用 "all" 更新所有包`);
|
|
463
|
+
logger_default.info(`💡 也可以使用路径模式: mbump ./packages/my-pkg`);
|
|
464
|
+
process.exit(1);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
displayError(new Error(`包名 "${parsedArgsWithDefaults.package}" 未在配置中找到`), { operation: "包名解析" });
|
|
468
|
+
logger_default.info(`💡 可用的包名: ${packageNames.join(", ")} 或使用 "all" 更新所有包`);
|
|
469
|
+
logger_default.info(`💡 也可以使用路径模式: mbump ./packages/my-pkg`);
|
|
470
|
+
process.exit(1);
|
|
471
|
+
}
|
|
350
472
|
const versionManager = new VersionManager({
|
|
351
473
|
config,
|
|
352
474
|
rootDir
|
|
353
475
|
});
|
|
354
|
-
logger_default.setLevel(
|
|
355
|
-
if (hasUncommittedChanges()) if (!
|
|
476
|
+
logger_default.setLevel(parsedArgsWithDefaults.verbose ? "debug" : "info");
|
|
477
|
+
if (hasUncommittedChanges()) if (!parsedArgsWithDefaults.allowUncommitted) {
|
|
356
478
|
logger_default.warn("警告: 检测到未提交的Git更改");
|
|
357
479
|
const inquirer$1 = await import("inquirer");
|
|
358
480
|
const answers = await inquirer$1.default.prompt([{
|
|
359
481
|
type: "confirm",
|
|
360
482
|
name: "continue",
|
|
361
|
-
message:
|
|
483
|
+
message: parsedArgsWithDefaults.dryRun ? "是否继续(dry-run模式不会实际提交更改)?" : "是否提交这些更改并继续?",
|
|
362
484
|
default: true
|
|
363
485
|
}]);
|
|
364
486
|
if (!answers.continue) {
|
|
365
487
|
logger_default.info("操作已取消");
|
|
366
488
|
process.exit(0);
|
|
367
489
|
}
|
|
368
|
-
if (!
|
|
490
|
+
if (!parsedArgsWithDefaults.dryRun) {
|
|
369
491
|
const commitMessage = "chore: update mbump config and settings";
|
|
370
492
|
execSync(`git add . && git commit -m "${commitMessage}"`, {
|
|
371
493
|
encoding: "utf8",
|
|
@@ -374,21 +496,21 @@ async function main() {
|
|
|
374
496
|
logger_default.success(`已提交更改: ${commitMessage}`);
|
|
375
497
|
} else logger_default.info("dry-run模式: 跳过实际提交操作");
|
|
376
498
|
} else logger_default.warn("警告: 存在未提交的Git更改,您选择了忽略此检查。请注意这可能导致不一致的版本状态。");
|
|
377
|
-
if (
|
|
499
|
+
if (parsedArgsWithDefaults.verbose) {
|
|
378
500
|
if (config.usedConfigPath) {
|
|
379
501
|
const fileName = config.usedConfigPath.split("\\").pop() || config.usedConfigPath;
|
|
380
502
|
logger_default.info(`使用配置文件: ${fileName}`);
|
|
381
503
|
}
|
|
382
|
-
logger_default.info(`更新信息: 包=${
|
|
504
|
+
logger_default.info(`更新信息: 包=${parsedArgsWithDefaults.package}, 类型=${parsedArgsWithDefaults.type}${parsedArgsWithDefaults.dryRun ? " (试运行)" : ""}`);
|
|
383
505
|
}
|
|
384
|
-
let selectedType =
|
|
506
|
+
let selectedType = parsedArgsWithDefaults.type;
|
|
385
507
|
let customVersion = null;
|
|
386
508
|
const packageVersionSelections = {};
|
|
387
|
-
if (!args.some((arg) => arg === "--type" || arg.startsWith("--type=") || arg === "-t" || arg.startsWith("-t="))) if (
|
|
509
|
+
if (!args.some((arg) => arg === "--type" || arg.startsWith("--type=") || arg === "-t" || arg.startsWith("-t="))) if (parsedArgsWithDefaults.package === "all") {
|
|
388
510
|
const selections = await selectAllVersionsInteractive(config, rootDir);
|
|
389
511
|
Object.assign(packageVersionSelections, selections);
|
|
390
512
|
} else {
|
|
391
|
-
const packageName =
|
|
513
|
+
const packageName = parsedArgsWithDefaults.package;
|
|
392
514
|
const currentVersion = versionManager.getPackageVersion(packageName);
|
|
393
515
|
if (currentVersion) {
|
|
394
516
|
const selection = await selectVersionInteractive(config, packageName, currentVersion);
|
|
@@ -396,8 +518,8 @@ async function main() {
|
|
|
396
518
|
customVersion = selection.customVersion;
|
|
397
519
|
}
|
|
398
520
|
}
|
|
399
|
-
if (
|
|
400
|
-
if (
|
|
521
|
+
if (parsedArgsWithDefaults.package === "all" && Object.keys(packageVersionSelections).length > 0) {
|
|
522
|
+
if (parsedArgsWithDefaults.dryRun) {
|
|
401
523
|
logger_default.info("🔍 Dry-run 模式 - 以下操作将被执行:\n");
|
|
402
524
|
for (const [packageName, selection] of Object.entries(packageVersionSelections)) {
|
|
403
525
|
const pkgPath = config.packagePaths[packageName];
|
|
@@ -427,8 +549,8 @@ async function main() {
|
|
|
427
549
|
updateProgress(current, total, packageName, "processing");
|
|
428
550
|
try {
|
|
429
551
|
const result = await versionManager.updateVersion(packageName, selection.type, {
|
|
430
|
-
dryRun:
|
|
431
|
-
verbose:
|
|
552
|
+
dryRun: parsedArgsWithDefaults.dryRun,
|
|
553
|
+
verbose: parsedArgsWithDefaults.verbose,
|
|
432
554
|
customVersion: selection.customVersion,
|
|
433
555
|
autoCommit: false,
|
|
434
556
|
push: false,
|
|
@@ -461,8 +583,8 @@ async function main() {
|
|
|
461
583
|
});
|
|
462
584
|
logger_default.info("\n💡 提示: 可以单独重试失败的包,或检查错误信息后重新运行");
|
|
463
585
|
}
|
|
464
|
-
if (!
|
|
465
|
-
if (
|
|
586
|
+
if (!parsedArgsWithDefaults.dryRun && parsedArgsWithDefaults.autoCommit && updatedPackagesInfo.length > 0) await versionManager.gitCommitAndPush(parsedArgsWithDefaults.push, updatedPackagesInfo, config.git?.tag !== false, config.git?.tagPrefix || "v");
|
|
587
|
+
if (parsedArgsWithDefaults.npm && !parsedArgsWithDefaults.dryRun) {
|
|
466
588
|
const npmErrors = [];
|
|
467
589
|
const npmPackages = Object.entries(packageVersionSelections);
|
|
468
590
|
const npmTotal = npmPackages.length;
|
|
@@ -474,7 +596,7 @@ async function main() {
|
|
|
474
596
|
try {
|
|
475
597
|
await versionManager.updateVersion(packageName, selection.type, {
|
|
476
598
|
dryRun: false,
|
|
477
|
-
verbose:
|
|
599
|
+
verbose: parsedArgsWithDefaults.verbose,
|
|
478
600
|
customVersion: selection.customVersion,
|
|
479
601
|
autoCommit: false,
|
|
480
602
|
push: false,
|
|
@@ -502,35 +624,35 @@ async function main() {
|
|
|
502
624
|
}
|
|
503
625
|
}
|
|
504
626
|
} else {
|
|
505
|
-
if (
|
|
506
|
-
const pkgPath = config.packagePaths[
|
|
627
|
+
if (parsedArgsWithDefaults.dryRun && parsedArgsWithDefaults.package) {
|
|
628
|
+
const pkgPath = config.packagePaths[parsedArgsWithDefaults.package];
|
|
507
629
|
const pkg = versionManager.getPackageInfo(pkgPath);
|
|
508
630
|
const newVersion = customVersion || semver.inc(pkg.version, selectedType);
|
|
509
|
-
const isDefaultPackage =
|
|
631
|
+
const isDefaultPackage = parsedArgsWithDefaults.package === "default" || pkgPath === "package.json";
|
|
510
632
|
const tagPrefix = config.git?.tagPrefix || "v";
|
|
511
633
|
const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`;
|
|
512
634
|
logger_default.info("🔍 Dry-run 模式 - 以下操作将被执行:\n");
|
|
513
|
-
logger_default.info(` 📦 ${
|
|
635
|
+
logger_default.info(` 📦 ${parsedArgsWithDefaults.package}`);
|
|
514
636
|
logger_default.info(` 当前版本: ${pkg.version}`);
|
|
515
637
|
logger_default.info(` 新版本: ${newVersion}`);
|
|
516
638
|
logger_default.info(` Tag: ${tagName}`);
|
|
517
639
|
logger_default.info(` CHANGELOG: ${config.git?.changelog !== false ? "是" : "否(配置禁用)"}`);
|
|
518
|
-
logger_default.info(` Git Commit: ${
|
|
519
|
-
logger_default.info(` Git Push: ${
|
|
520
|
-
logger_default.info(` NPM Publish: ${
|
|
640
|
+
logger_default.info(` Git Commit: ${parsedArgsWithDefaults.autoCommit ? "是" : "否"}`);
|
|
641
|
+
logger_default.info(` Git Push: ${parsedArgsWithDefaults.push ? "是" : "否"}`);
|
|
642
|
+
logger_default.info(` NPM Publish: ${parsedArgsWithDefaults.npm ? "是" : "否"}`);
|
|
521
643
|
logger_default.info("\n✅ 以上为预览,未执行任何实际操作");
|
|
522
644
|
process.exit(0);
|
|
523
645
|
}
|
|
524
|
-
await versionManager.updateVersion(
|
|
525
|
-
dryRun:
|
|
526
|
-
verbose:
|
|
646
|
+
await versionManager.updateVersion(parsedArgsWithDefaults.package, selectedType, {
|
|
647
|
+
dryRun: parsedArgsWithDefaults.dryRun,
|
|
648
|
+
verbose: parsedArgsWithDefaults.verbose,
|
|
527
649
|
customVersion,
|
|
528
|
-
autoCommit:
|
|
529
|
-
push:
|
|
530
|
-
npm:
|
|
650
|
+
autoCommit: parsedArgsWithDefaults.autoCommit,
|
|
651
|
+
push: parsedArgsWithDefaults.push,
|
|
652
|
+
npm: parsedArgsWithDefaults.npm
|
|
531
653
|
});
|
|
532
654
|
}
|
|
533
|
-
logger_default.success(`版本更新完成${
|
|
655
|
+
logger_default.success(`版本更新完成${parsedArgsWithDefaults.dryRun ? " (试运行模式)" : ""}`);
|
|
534
656
|
process.exit(0);
|
|
535
657
|
} catch (error) {
|
|
536
658
|
displayError(error);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","names":["config: Config","packageName: string","currentVersion: string","customVersion: string | null","input: string","rootDir: string","selections: PackageVersionSelections","args: string[]","defaults: DefaultsConfig","parsed: ParsedArgs","allowedTypes: ReleaseType[]","error: Error","context?: { packageName?: string, operation?: string }","current: number","total: number","width: number","packageName: string","status: 'processing' | 'success' | 'failed'","config: Config","inquirer","customVersion: string | null","packageVersionSelections: PackageVersionSelections","updatedPackagesInfo: Array<{ name: string, newVersion: string, pkgKey: string }>","errors: Array<{ packageName: string, error: Error }>","npmErrors: Array<{ packageName: string, error: Error }>","error: any"],"sources":["../src/cli/interactive.ts","../src/cli/parser.ts","../src/cli/index.ts"],"sourcesContent":["import type { Config, PackageVersionSelections, ReleaseType } from '@/types'\nimport inquirer from 'inquirer'\nimport semver from 'semver'\nimport { VersionManager } from '@/core/VersionManager'\n\nexport async function selectVersionInteractive(\n config: Config,\n packageName: string,\n currentVersion: string,\n): Promise<{ type: ReleaseType, customVersion: string | null }> {\n const choices = [\n { name: `major ${semver.inc(currentVersion, 'major')}`, value: 'major' },\n { name: `minor ${semver.inc(currentVersion, 'minor')}`, value: 'minor' },\n { name: `patch ${semver.inc(currentVersion, 'patch')}`, value: 'patch' },\n { name: `next ${semver.inc(currentVersion, 'patch')}`, value: 'next' },\n { name: `conventional ${semver.inc(currentVersion, 'patch')}`, value: 'conventional' },\n {\n name: `pre-patch ${\n semver.prerelease(currentVersion)\n ? semver.inc(currentVersion, 'prerelease')\n : semver.inc(semver.coerce(currentVersion)!.version, 'prepatch', 'beta')\n }`,\n value: 'pre-patch',\n },\n {\n name: `pre-minor ${semver.inc(semver.coerce(currentVersion)!.version, 'preminor', 'beta')}`,\n value: 'pre-minor',\n },\n {\n name: `pre-major ${semver.inc(semver.coerce(currentVersion)!.version, 'premajor', 'beta')}`,\n value: 'pre-major',\n },\n { name: `as-is ${currentVersion}`, value: 'as-is' },\n { name: 'custom ...', value: 'custom' },\n ]\n\n const answers = await inquirer.prompt([\n {\n type: 'list',\n name: 'versionType',\n message: `[${packageName}] Current version ${currentVersion} »`,\n choices,\n default: config.defaults?.releaseType || 'patch',\n },\n ])\n\n const selectedType = answers.versionType as ReleaseType\n let customVersion: string | null = null\n\n if (selectedType === 'custom') {\n const customAnswer = await inquirer.prompt([\n {\n type: 'input',\n name: 'customVersion',\n message: 'Enter custom version:',\n validate: (input: string) => (semver.valid(input) ? true : 'Please enter a valid semver version'),\n },\n ])\n customVersion = customAnswer.customVersion\n }\n\n return { type: selectedType, customVersion }\n}\n\nexport async function selectAllVersionsInteractive(\n config: Config,\n rootDir: string,\n): Promise<PackageVersionSelections> {\n const versionManager = new VersionManager({ config, rootDir })\n const allPackageNames = Object.keys(config.packagePaths)\n const selections: PackageVersionSelections = {}\n\n for (const packageName of allPackageNames) {\n const currentVersion = versionManager.getPackageVersion(packageName)\n if (currentVersion) {\n const selection = await selectVersionInteractive(config, packageName, currentVersion)\n selections[packageName] = selection\n }\n }\n\n return selections\n}\n","import type { DefaultsConfig, ParsedArgs, ReleaseType } from '@/types'\n\nexport function parseArgs(args: string[], defaults: DefaultsConfig = {}): ParsedArgs {\n const parsed: ParsedArgs = {\n package: null,\n type: (defaults.releaseType || defaults.type || 'patch') as ReleaseType,\n dryRun: defaults.dryRun || false,\n help: false,\n verbose: defaults.verbose || false,\n autoCommit: (defaults as any).git?.autoCommit !== false,\n push: (defaults as any).git?.push !== false,\n allowUncommitted: defaults.allowUncommitted || false,\n npm: defaults.npm || false,\n showConfig: false,\n }\n\n const allowedTypes: ReleaseType[] = [\n 'major',\n 'minor',\n 'patch',\n 'pre-patch',\n 'pre-minor',\n 'pre-major',\n 'as-is',\n 'next',\n 'conventional',\n ]\n\n let i = 0\n while (i < args.length) {\n const arg = args[i]\n\n if (arg === '--dry-run' || arg === '-d') {\n parsed.dryRun = true\n i++\n }\n else if (arg === '--verbose' || arg === '-v') {\n parsed.verbose = true\n i++\n }\n else if (arg === '--no-commit' || arg === '-n') {\n parsed.autoCommit = false\n i++\n }\n else if (arg === '--no-push' || arg === '-p') {\n parsed.push = false\n i++\n }\n else if (arg === '--allow-uncommitted' || arg === '-u') {\n parsed.allowUncommitted = true\n i++\n }\n else if (arg === '--npm' || arg === '-npm') {\n parsed.npm = true\n i++\n }\n else if (arg === '--show-config') {\n parsed.showConfig = true\n i++\n }\n else if (arg === '--type' || arg === '-t') {\n if (i + 1 < args.length) {\n const typeValue = args[i + 1] as ReleaseType\n if (allowedTypes.includes(typeValue)) {\n parsed.type = typeValue\n i += 2\n }\n else {\n throw new Error(`不支持的版本类型: ${typeValue},支持的类型: ${allowedTypes.join(', ')}`)\n }\n }\n else {\n throw new Error('--type 参数需要一个值')\n }\n }\n else if (arg.startsWith('--type=') || arg.startsWith('-t=')) {\n const typeValue = arg.split('=')[1] as ReleaseType\n if (allowedTypes.includes(typeValue)) {\n parsed.type = typeValue\n }\n else {\n throw new Error(`不支持的版本类型: ${typeValue},支持的类型: ${allowedTypes.join(', ')}`)\n }\n i++\n }\n else if (!arg.startsWith('-')) {\n if (!parsed.package) {\n parsed.package = arg\n }\n else if (allowedTypes.includes(arg as ReleaseType)) {\n parsed.type = arg as ReleaseType\n }\n i++\n }\n else {\n i++\n }\n }\n\n return parsed\n}\n","#!/usr/bin/env node\nimport type { Config, PackageVersionSelections } from '@/types'\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport process from 'node:process'\nimport { fileURLToPath } from 'node:url'\nimport semver from 'semver'\nimport { loadConfigAsync } from '@/config/loader'\nimport { VersionManager } from '@/core/VersionManager'\nimport log from '@/utils/logger'\nimport { selectAllVersionsInteractive, selectVersionInteractive } from './interactive'\nimport { parseArgs } from './parser'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\n\nlet packageVersion = '1.0.0'\n// 尝试多个可能的路径查找package.json\nconst possiblePaths = [\n join(__dirname, '..', '..', 'package.json'),\n join(__dirname, '..', 'package.json'),\n join(process.cwd(), 'package.json'),\n]\n\n/**\n * 获取友好的错误提示和解决方案\n */\nfunction getFriendlyErrorMessage(error: Error): { message: string, solution?: string } {\n const errorMessage = error.message\n\n // 版本已存在\n if (errorMessage.includes('已存在')) {\n return {\n message: `⚠️ 版本 ${errorMessage.match(/版本 (.+?) 已存在/)?.[1] || ''} 已存在`,\n solution: '💡 请使用其他版本号,或运行 git tag -d <tag> 删除已有标签',\n }\n }\n\n // Git 冲突\n if (errorMessage.includes('Git conflict') || errorMessage.includes('conflict')) {\n return {\n message: '⚠️ 检测到 Git 冲突',\n solution: '💡 请先解决冲突后重试:git add . && git commit -m \"resolve conflicts\"',\n }\n }\n\n // NPM 认证失败\n if (errorMessage.includes('npm ERR! code E401') || errorMessage.includes('authentication')) {\n return {\n message: '🔐 NPM 认证失败',\n solution: '💡 请运行 npm login 或 pnpm login 登录后重试',\n }\n }\n\n // NPM 包已存在\n if (errorMessage.includes('npm ERR! code E403') || errorMessage.includes('cannot publish')) {\n return {\n message: '📦 NPM 包已存在或无权限',\n solution: '💡 检查包名是否已被占用,或确认是否有发布权限',\n }\n }\n\n // 网络错误\n if (errorMessage.includes('network') || errorMessage.includes('ENOTFOUND') || errorMessage.includes('ECONNREFUSED')) {\n return {\n message: '🌐 网络连接失败',\n solution: '💡 请检查网络连接,或配置 NPM 镜像源',\n }\n }\n\n // 文件路径安全\n if (errorMessage.includes('不安全的文件路径')) {\n return {\n message: '🔒 检测到不安全的文件路径',\n solution: '💡 请确保配置文件中的路径在项目根目录内',\n }\n }\n\n // 无效的包名\n if (errorMessage.includes('无效的包名')) {\n return {\n message: '❌ 无效的包名',\n solution: '💡 请检查配置文件中的 packagePaths 是否正确设置',\n }\n }\n\n // 默认错误消息\n return {\n message: `❌ ${errorMessage}`,\n solution: '💡 请检查错误信息,或使用 --verbose 模式查看更多详情',\n }\n}\n\n/**\n * 显示友好的错误信息\n */\nfunction displayError(error: Error, context?: { packageName?: string, operation?: string }): void {\n const { message, solution } = getFriendlyErrorMessage(error)\n\n if (context?.packageName) {\n log.error(`包 ${context.packageName} ${context.operation || '操作'} 失败:`)\n }\n\n log.error(` ${message}`)\n\n if (solution) {\n log.info(` ${solution}`)\n }\n\n // 调试模式下显示详细错误\n if (process.env.DEBUG) {\n log.debug(`详细错误信息: ${JSON.stringify(error, null, 2)}`)\n }\n}\n\n/**\n * 渲染进度条\n * @param current 当前进度\n * @param total 总数量\n * @param width 进度条宽度(字符数)\n * @returns 进度条字符串\n */\nfunction renderProgressBar(current: number, total: number, width: number = 30): string {\n const percentage = Math.round((current / total) * 100)\n const filledLength = Math.round((width * current) / total)\n const emptyLength = width - filledLength\n\n const filled = '█'.repeat(filledLength)\n const empty = '░'.repeat(emptyLength)\n\n return `[${filled}${empty}] ${percentage}% | ${current}/${total}`\n}\n\n/**\n * 显示批量更新进度\n */\nfunction updateProgress(\n current: number,\n total: number,\n packageName: string,\n status: 'processing' | 'success' | 'failed',\n): void {\n const progressBar = renderProgressBar(current, total)\n const statusIcon = status === 'success' ? '✓' : status === 'failed' ? '✗' : '⟳'\n const statusText = status === 'processing' ? '处理中' : status === 'success' ? '完成' : '失败'\n\n // 清除当前行并显示新进度\n process.stdout.write(`\\r${progressBar} | ${statusIcon} ${packageName} - ${statusText} `)\n\n // 如果是最后一个或失败/成功,换行\n if (current === total || status !== 'processing') {\n process.stdout.write('\\n')\n }\n}\n\nfor (const packageJsonPath of possiblePaths) {\n try {\n if (existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'))\n packageVersion = packageJson.version || packageVersion\n break\n }\n }\n catch {\n // 继续尝试下一个路径\n }\n}\n\nprocess.env.NODE_NO_WARNINGS = '1'\n\nexport function showHelp(): void {\n const helpText = `🔧 mbump v${packageVersion}\n========================\n企业级版本管理工具,支持单包和monorepo场景\n\n用法: mbump [package] [type] [options]\n\n参数:\n [package] 要更新的包名称或 \"all\" 更新所有包\n [type] 版本升级类型: major, minor, patch, pre-patch, pre-minor, pre-major\n\n选项:\n --dry-run, -d 试运行模式,只显示将要执行的操作\n --verbose, -v 详细输出模式,显示更多执行细节\n --no-commit, -n 禁用自动git提交\n --no-push, -p 禁用自动推送到远程仓库\n --allow-uncommitted, -u 允许在有未提交更改的情况下继续操作\n --npm, -npm 启用npm包发布功能(默认不发布)\n --show-config 显示当前加载的完整配置信息\n --help, -h 显示此帮助信息\n\n示例:\n mbump components patch # 将components包升级一个补丁版本\n mbump all minor # 将所有包升级一个小版本\n mbump plugins major --dry-run # 试运行升级plugins包主版本\n mbump core patch --no-push # 更新版本并提交到本地,但不推送到远程\n mbump components patch --npm # 更新版本并发布到npm\n`\n log.info(helpText)\n}\n\nfunction hasUncommittedChanges(): boolean {\n try {\n const output = execSync('git status --porcelain', { encoding: 'utf8', stdio: 'pipe' })\n return output.trim() !== ''\n }\n catch {\n return false\n }\n}\n\nasync function main(): Promise<void> {\n try {\n const args = process.argv.slice(2)\n\n if (args.includes('--help') || args.includes('-h')) {\n showHelp()\n process.exit(0)\n }\n\n const rootDir = process.cwd()\n const config: Config = await log.withSpinner('正在加载配置...', () => loadConfigAsync(rootDir), {\n succeedText: '配置加载完成',\n failText: '配置加载失败',\n })\n\n const parsedArgs = parseArgs(args, config.defaults)\n\n if (parsedArgs.showConfig) {\n log.info('📋 当前加载的配置:')\n log.info('')\n\n // 显示配置文件路径\n if (config.usedConfigPath) {\n const fileName = config.usedConfigPath.split(/[/\\\\]/).pop()\n log.info(` 配置文件: ${fileName}`)\n }\n else {\n log.info(' 配置文件: (默认配置)')\n }\n\n // 显示包路径\n log.info('')\n log.info('📦 包路径:')\n for (const [name, path] of Object.entries(config.packagePaths)) {\n const relativePath = path.split(/[/\\\\]/).pop()\n log.info(` ${name}: ${relativePath}`)\n }\n\n // 显示默认选项\n log.info('')\n log.info('⚙️ 默认选项:')\n log.info(` releaseType: ${config.defaults?.releaseType}`)\n log.info(` dryRun: ${config.defaults?.dryRun}`)\n log.info(` verbose: ${config.defaults?.verbose}`)\n log.info(` allowUncommitted: ${config.defaults?.allowUncommitted}`)\n log.info(` npm: ${config.defaults?.npm}`)\n\n // 显示 Git 选项\n log.info('')\n log.info('🔧 Git 选项:')\n log.info(` commit: ${config.git?.autoCommit}`)\n log.info(` push: ${config.git?.push}`)\n log.info(` tag: ${config.git?.tag}`)\n log.info(` changelog: ${config.git?.changelog}`)\n\n // 显示 Publish 选项\n log.info('')\n log.info('🚀 发布选项:')\n log.info(` command: ${config.publish?.command}`)\n log.info(` skipChecks: ${config.publish?.skipChecks}`)\n\n log.info('')\n process.exit(0)\n }\n\n const packageNames = Object.keys(config.packagePaths)\n if (!parsedArgs.package) {\n if (packageNames.includes('default')) {\n parsedArgs.package = 'default'\n }\n else if (packageNames.length === 1) {\n parsedArgs.package = packageNames[0]\n }\n else {\n throw new Error(\n '未指定包名\\n' + `请指定要更新的包名,可选包: ${packageNames.join(', ')} 或使用 \"all\" 更新所有包`,\n )\n }\n }\n else if (parsedArgs.package !== 'all' && !packageNames.includes(parsedArgs.package)) {\n throw new Error(\n `包名 \"${parsedArgs.package}\" 未在配置中找到\\n` + `可用的包名: ${packageNames.join(', ')} 或使用 \"all\" 更新所有包`,\n )\n }\n\n const versionManager = new VersionManager({ config, rootDir })\n log.setLevel(parsedArgs.verbose ? 'debug' : 'info')\n\n if (hasUncommittedChanges()) {\n if (!parsedArgs.allowUncommitted) {\n log.warn('警告: 检测到未提交的Git更改')\n\n const inquirer = await import('inquirer')\n const answers = await inquirer.default.prompt([\n {\n type: 'confirm',\n name: 'continue',\n message: parsedArgs.dryRun\n ? '是否继续(dry-run模式不会实际提交更改)?'\n : '是否提交这些更改并继续?',\n default: true,\n },\n ])\n\n if (!answers.continue) {\n log.info('操作已取消')\n process.exit(0)\n }\n\n if (!parsedArgs.dryRun) {\n const commitMessage = 'chore: update mbump config and settings'\n execSync(`git add . && git commit -m \"${commitMessage}\"`, { encoding: 'utf8', stdio: 'pipe' })\n log.success(`已提交更改: ${commitMessage}`)\n }\n else {\n log.info('dry-run模式: 跳过实际提交操作')\n }\n }\n else {\n log.warn('警告: 存在未提交的Git更改,您选择了忽略此检查。请注意这可能导致不一致的版本状态。')\n }\n }\n\n if (parsedArgs.verbose) {\n if (config.usedConfigPath) {\n const fileName = config.usedConfigPath.split('\\\\').pop() || config.usedConfigPath\n log.info(`使用配置文件: ${fileName}`)\n }\n log.info(`更新信息: 包=${parsedArgs.package}, 类型=${parsedArgs.type}${parsedArgs.dryRun ? ' (试运行)' : ''}`)\n }\n\n let selectedType = parsedArgs.type\n let customVersion: string | null = null\n const packageVersionSelections: PackageVersionSelections = {}\n\n if (\n !args.some(arg => arg === '--type' || arg.startsWith('--type=') || arg === '-t' || arg.startsWith('-t='))\n ) {\n if (parsedArgs.package === 'all') {\n const selections = await selectAllVersionsInteractive(config, rootDir)\n Object.assign(packageVersionSelections, selections)\n }\n else {\n const packageName = parsedArgs.package!\n const currentVersion = versionManager.getPackageVersion(packageName)\n\n if (currentVersion) {\n const selection = await selectVersionInteractive(config, packageName, currentVersion)\n selectedType = selection.type\n customVersion = selection.customVersion\n }\n }\n }\n\n if (parsedArgs.package === 'all' && Object.keys(packageVersionSelections).length > 0) {\n // Dry-run 模式:显示详细预览\n if (parsedArgs.dryRun) {\n log.info('🔍 Dry-run 模式 - 以下操作将被执行:\\n')\n\n for (const [packageName, selection] of Object.entries(packageVersionSelections)) {\n const pkgPath = config.packagePaths[packageName]\n const pkg = versionManager.getPackageInfo(pkgPath)\n // 使用 as any 绕过类型检查,因为我们的 ReleaseType 包含额外的选项\n const newVersion = selection.customVersion || semver.inc(pkg.version, selection.type as any)!\n\n // 判断是否为主项目包\n const isDefaultPackage = packageName === 'default' || pkgPath === 'package.json'\n const tagPrefix = config.git?.tagPrefix || 'v'\n const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`\n\n log.info(` 📦 ${packageName}`)\n log.info(` 当前版本: ${pkg.version}`)\n log.info(` 新版本: ${newVersion}`)\n log.info(` Tag: ${tagName}`)\n log.info(` CHANGELOG: ${isDefaultPackage && config.git?.changelog !== false ? '是' : '跳过(子包或配置禁用)'}`)\n log.info('')\n }\n\n log.info('✅ 以上为预览,未执行任何实际操作')\n process.exit(0)\n }\n\n const updatedPackagesInfo: Array<{ name: string, newVersion: string, pkgKey: string }> = []\n const errors: Array<{ packageName: string, error: Error }> = []\n const packages = Object.entries(packageVersionSelections)\n const total = packages.length\n\n log.info(`\\n📦 开始批量更新 ${total} 个包...\\n`)\n\n for (let i = 0; i < packages.length; i++) {\n const [packageName, selection] = packages[i]\n const current = i + 1\n\n // 显示进度\n updateProgress(current, total, packageName, 'processing')\n\n try {\n const result = await versionManager.updateVersion(packageName, selection.type, {\n dryRun: parsedArgs.dryRun,\n verbose: parsedArgs.verbose,\n customVersion: selection.customVersion,\n autoCommit: false,\n push: false,\n isBatchMode: true, // 标识这是批量更新模式\n })\n\n // 收集更新的包信息,同时记录包名 key\n if (result.success && result.updatedPackages.length > 0) {\n updatedPackagesInfo.push(...result.updatedPackages.map(pkg => ({\n ...pkg,\n pkgKey: packageName,\n })))\n updateProgress(current, total, packageName, 'success')\n }\n else {\n updateProgress(current, total, packageName, 'failed')\n }\n }\n catch (error) {\n errors.push({ packageName, error: error as Error })\n displayError(error as Error, { packageName, operation: '更新' })\n updateProgress(current, total, packageName, 'failed')\n }\n }\n\n log.info('') // 空行分隔\n\n // 报告所有错误\n if (errors.length > 0) {\n log.error(`\\n❌ 批量更新完成,但有 ${errors.length} 个包更新失败:`)\n errors.forEach(({ packageName, error }) => {\n log.error(` - ${packageName}: ${error.message}`)\n })\n log.info('\\n💡 提示: 可以单独重试失败的包,或检查错误信息后重新运行')\n }\n\n if (!parsedArgs.dryRun && parsedArgs.autoCommit && updatedPackagesInfo.length > 0) {\n await versionManager.gitCommitAndPush(\n parsedArgs.push,\n updatedPackagesInfo,\n config.git?.tag !== false,\n config.git?.tagPrefix || 'v',\n )\n }\n\n if (parsedArgs.npm && !parsedArgs.dryRun) {\n const npmErrors: Array<{ packageName: string, error: Error }> = []\n const npmPackages = Object.entries(packageVersionSelections)\n const npmTotal = npmPackages.length\n\n log.info(`\\n🚀 开始发布 ${npmTotal} 个包到 NPM...\\n`)\n\n for (let i = 0; i < npmPackages.length; i++) {\n const [packageName, selection] = npmPackages[i]\n const npmCurrent = i + 1\n\n // 显示进度\n updateProgress(npmCurrent, npmTotal, packageName, 'processing')\n\n try {\n await versionManager.updateVersion(packageName, selection.type, {\n dryRun: false,\n verbose: parsedArgs.verbose,\n customVersion: selection.customVersion,\n autoCommit: false,\n push: false,\n npm: true,\n })\n\n updateProgress(npmCurrent, npmTotal, packageName, 'success')\n }\n catch (error) {\n npmErrors.push({ packageName, error: error as Error })\n displayError(error as Error, { packageName, operation: '发布' })\n updateProgress(npmCurrent, npmTotal, packageName, 'failed')\n }\n }\n\n log.info('') // 空行分隔\n\n // 报告 NPM 发布错误\n if (npmErrors.length > 0) {\n log.error(`\\n❌ NPM 发布完成,但有 ${npmErrors.length} 个包发布失败:`)\n npmErrors.forEach(({ packageName, error }) => {\n log.error(` - ${packageName}: ${error.message}`)\n })\n }\n }\n }\n else {\n // 单包更新的 dry-run 预览\n if (parsedArgs.dryRun && parsedArgs.package) {\n const pkgPath = config.packagePaths[parsedArgs.package]\n const pkg = versionManager.getPackageInfo(pkgPath)\n // 使用 as any 绕过类型检查\n const newVersion = customVersion || semver.inc(pkg.version, selectedType as any)!\n\n // 判断是否为主项目包\n const isDefaultPackage = parsedArgs.package === 'default' || pkgPath === 'package.json'\n const tagPrefix = config.git?.tagPrefix || 'v'\n const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`\n\n log.info('🔍 Dry-run 模式 - 以下操作将被执行:\\n')\n log.info(` 📦 ${parsedArgs.package}`)\n log.info(` 当前版本: ${pkg.version}`)\n log.info(` 新版本: ${newVersion}`)\n log.info(` Tag: ${tagName}`)\n log.info(` CHANGELOG: ${config.git?.changelog !== false ? '是' : '否(配置禁用)'}`)\n log.info(` Git Commit: ${parsedArgs.autoCommit ? '是' : '否'}`)\n log.info(` Git Push: ${parsedArgs.push ? '是' : '否'}`)\n log.info(` NPM Publish: ${parsedArgs.npm ? '是' : '否'}`)\n log.info('\\n✅ 以上为预览,未执行任何实际操作')\n process.exit(0)\n }\n\n await versionManager.updateVersion(parsedArgs.package!, selectedType, {\n dryRun: parsedArgs.dryRun,\n verbose: parsedArgs.verbose,\n customVersion,\n autoCommit: parsedArgs.autoCommit,\n push: parsedArgs.push,\n npm: parsedArgs.npm,\n })\n }\n\n log.success(`版本更新完成${parsedArgs.dryRun ? ' (试运行模式)' : ''}`)\n process.exit(0)\n }\n catch (error: any) {\n displayError(error as Error)\n process.exit(1)\n }\n}\n\nmain().catch((error: any) => {\n displayError(error as Error, { operation: 'CLI执行' })\n process.exit(1)\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","names":["config: Config","packageName: string","currentVersion: string","customVersion: string | null","input: string","rootDir: string","selections: PackageVersionSelections","arg: string","args: string[]","defaults: DefaultsConfig","parsed: ParsedArgs","allowedTypes: ReleaseType[]","error: Error","context?: { packageName?: string, operation?: string }","current: number","total: number","width: number","packageName: string","status: 'processing' | 'success' | 'failed'","config: Config","inquirer","customVersion: string | null","packageVersionSelections: PackageVersionSelections","updatedPackagesInfo: Array<{ name: string, newVersion: string, pkgKey: string }>","errors: Array<{ packageName: string, error: Error }>","npmErrors: Array<{ packageName: string, error: Error }>","error: any"],"sources":["../src/cli/interactive.ts","../src/cli/parser.ts","../src/cli/index.ts"],"sourcesContent":["import type { Config, PackageVersionSelections, ReleaseType } from '@/types'\nimport inquirer from 'inquirer'\nimport semver from 'semver'\nimport { VersionManager } from '@/core/VersionManager'\n\nexport async function selectVersionInteractive(\n config: Config,\n packageName: string,\n currentVersion: string,\n): Promise<{ type: ReleaseType, customVersion: string | null }> {\n const choices = [\n { name: `major ${semver.inc(currentVersion, 'major')}`, value: 'major' },\n { name: `minor ${semver.inc(currentVersion, 'minor')}`, value: 'minor' },\n { name: `patch ${semver.inc(currentVersion, 'patch')}`, value: 'patch' },\n { name: `next ${semver.inc(currentVersion, 'patch')}`, value: 'next' },\n { name: `conventional ${semver.inc(currentVersion, 'patch')}`, value: 'conventional' },\n {\n name: `pre-patch ${\n semver.prerelease(currentVersion)\n ? semver.inc(currentVersion, 'prerelease')\n : semver.inc(semver.coerce(currentVersion)!.version, 'prepatch', 'beta')\n }`,\n value: 'pre-patch',\n },\n {\n name: `pre-minor ${semver.inc(semver.coerce(currentVersion)!.version, 'preminor', 'beta')}`,\n value: 'pre-minor',\n },\n {\n name: `pre-major ${semver.inc(semver.coerce(currentVersion)!.version, 'premajor', 'beta')}`,\n value: 'pre-major',\n },\n { name: `as-is ${currentVersion}`, value: 'as-is' },\n { name: 'custom ...', value: 'custom' },\n ]\n\n const answers = await inquirer.prompt([\n {\n type: 'list',\n name: 'versionType',\n message: `[${packageName}] Current version ${currentVersion} »`,\n choices,\n default: config.defaults?.releaseType || 'patch',\n },\n ])\n\n const selectedType = answers.versionType as ReleaseType\n let customVersion: string | null = null\n\n if (selectedType === 'custom') {\n const customAnswer = await inquirer.prompt([\n {\n type: 'input',\n name: 'customVersion',\n message: 'Enter custom version:',\n validate: (input: string) => (semver.valid(input) ? true : 'Please enter a valid semver version'),\n },\n ])\n customVersion = customAnswer.customVersion\n }\n\n return { type: selectedType, customVersion }\n}\n\nexport async function selectAllVersionsInteractive(\n config: Config,\n rootDir: string,\n): Promise<PackageVersionSelections> {\n const versionManager = new VersionManager({ config, rootDir })\n const allPackageNames = Object.keys(config.packagePaths)\n const selections: PackageVersionSelections = {}\n\n for (const packageName of allPackageNames) {\n const currentVersion = versionManager.getPackageVersion(packageName)\n if (currentVersion) {\n const selection = await selectVersionInteractive(config, packageName, currentVersion)\n selections[packageName] = selection\n }\n }\n\n return selections\n}\n","import type { DefaultsConfig, ParsedArgs, ReleaseType } from '@/types'\n\nfunction isPathLike(arg: string): boolean {\n return (\n arg.startsWith('./') ||\n arg.startsWith('../') ||\n arg.startsWith('.\\\\') ||\n arg.startsWith('..\\\\') ||\n arg.startsWith('/') ||\n arg.startsWith('\\\\') ||\n /^[A-Za-z]:[\\\\/].*/.test(arg) ||\n arg.startsWith('~') ||\n arg === '.' ||\n arg.startsWith('\\\\\\\\') ||\n arg.startsWith('//') ||\n arg.includes('/') ||\n arg.includes('\\\\') ||\n arg.includes('.')\n )\n}\n\nexport function parseArgs(args: string[], defaults: DefaultsConfig = {}): ParsedArgs {\n const parsed: ParsedArgs = {\n package: null,\n projectPath: null,\n type: (defaults.releaseType || defaults.type || 'patch') as ReleaseType,\n dryRun: defaults.dryRun || false,\n help: false,\n version: false,\n verbose: defaults.verbose || false,\n autoCommit: (defaults as any).git?.autoCommit !== false,\n push: (defaults as any).git?.push !== false,\n allowUncommitted: defaults.allowUncommitted || false,\n npm: defaults.npm || false,\n showConfig: false,\n }\n\n const allowedTypes: ReleaseType[] = [\n 'major',\n 'minor',\n 'patch',\n 'pre-patch',\n 'pre-minor',\n 'pre-major',\n 'as-is',\n 'next',\n 'conventional',\n ]\n\n let i = 0\n while (i < args.length) {\n const arg = args[i]\n\n if (arg === '--dry-run' || arg === '-d') {\n parsed.dryRun = true\n i++\n }\n else if (arg === '--verbose' || arg === '-v') {\n parsed.verbose = true\n i++\n }\n else if (arg === '--no-commit' || arg === '-n') {\n parsed.autoCommit = false\n i++\n }\n else if (arg === '--no-push' || arg === '-p') {\n parsed.push = false\n i++\n }\n else if (arg === '--allow-uncommitted' || arg === '-u') {\n parsed.allowUncommitted = true\n i++\n }\n else if (arg === '--npm' || arg === '-N') {\n parsed.npm = true\n i++\n }\n else if (arg === '--show-config' || arg === '-c') {\n parsed.showConfig = true\n i++\n }\n else if (arg === '--version' || arg === '-V') {\n parsed.version = true\n i++\n }\n else if (arg === '--type' || arg === '-t') {\n if (i + 1 < args.length) {\n const typeValue = args[i + 1] as ReleaseType\n if (allowedTypes.includes(typeValue)) {\n parsed.type = typeValue\n i += 2\n }\n else {\n throw new Error(`不支持的版本类型: ${typeValue},支持的类型: ${allowedTypes.join(', ')}`)\n }\n }\n else {\n throw new Error('--type 参数需要一个值')\n }\n }\n else if (arg.startsWith('--type=') || arg.startsWith('-t=')) {\n const typeValue = arg.split('=')[1] as ReleaseType\n if (allowedTypes.includes(typeValue)) {\n parsed.type = typeValue\n }\n else {\n throw new Error(`不支持的版本类型: ${typeValue},支持的类型: ${allowedTypes.join(', ')}`)\n }\n i++\n }\n else if (!arg.startsWith('-')) {\n if (!parsed.projectPath && !parsed.package) {\n if (isPathLike(arg)) {\n parsed.projectPath = arg\n }\n else {\n parsed.package = arg\n }\n }\n else if (allowedTypes.includes(arg as ReleaseType)) {\n parsed.type = arg as ReleaseType\n }\n else if (!parsed.package && !isPathLike(arg)) {\n parsed.package = arg\n }\n i++\n }\n else {\n i++\n }\n }\n\n return parsed\n}\n","#!/usr/bin/env node\nimport type { Config, PackageVersionSelections } from '@/types'\nimport { execSync } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join, resolve } from 'node:path'\nimport process from 'node:process'\nimport { fileURLToPath } from 'node:url'\nimport semver from 'semver'\nimport { loadConfigAsync } from '@/config/loader'\nimport { VersionManager } from '@/core/VersionManager'\nimport log from '@/utils/logger'\nimport { selectAllVersionsInteractive, selectVersionInteractive } from './interactive'\nimport { parseArgs } from './parser'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\n\nlet packageVersion = '1.0.0'\n// 尝试多个可能的路径查找package.json\nconst possiblePaths = [\n join(__dirname, '..', '..', 'package.json'),\n join(__dirname, '..', 'package.json'),\n join(process.cwd(), 'package.json'),\n]\n\n/**\n * 获取友好的错误提示和解决方案\n */\nfunction getFriendlyErrorMessage(error: Error): { message: string, solution?: string } {\n const errorMessage = error.message\n\n // 版本已存在\n if (errorMessage.includes('已存在')) {\n return {\n message: `⚠️ 版本 ${errorMessage.match(/版本 (.+?) 已存在/)?.[1] || ''} 已存在`,\n solution: '💡 请使用其他版本号,或运行 git tag -d <tag> 删除已有标签',\n }\n }\n\n // Git 冲突\n if (errorMessage.includes('Git conflict') || errorMessage.includes('conflict')) {\n return {\n message: '⚠️ 检测到 Git 冲突',\n solution: '💡 请先解决冲突后重试:git add . && git commit -m \"resolve conflicts\"',\n }\n }\n\n // NPM 认证失败\n if (errorMessage.includes('npm ERR! code E401') || errorMessage.includes('authentication')) {\n return {\n message: '🔐 NPM 认证失败',\n solution: '💡 请运行 npm login 或 pnpm login 登录后重试',\n }\n }\n\n // NPM 包已存在\n if (errorMessage.includes('npm ERR! code E403') || errorMessage.includes('cannot publish')) {\n return {\n message: '📦 NPM 包已存在或无权限',\n solution: '💡 检查包名是否已被占用,或确认是否有发布权限',\n }\n }\n\n // 网络错误\n if (errorMessage.includes('network') || errorMessage.includes('ENOTFOUND') || errorMessage.includes('ECONNREFUSED')) {\n return {\n message: '🌐 网络连接失败',\n solution: '💡 请检查网络连接,或配置 NPM 镜像源',\n }\n }\n\n // 文件路径安全\n if (errorMessage.includes('不安全的文件路径')) {\n return {\n message: '🔒 检测到不安全的文件路径',\n solution: '💡 请确保配置文件中的路径在项目根目录内',\n }\n }\n\n // 无效的包名\n if (errorMessage.includes('无效的包名')) {\n return {\n message: '❌ 无效的包名',\n solution: '💡 请检查配置文件中的 packagePaths 是否正确设置',\n }\n }\n\n // 默认错误消息\n return {\n message: `❌ ${errorMessage}`,\n solution: '💡 请检查错误信息,或使用 --verbose 模式查看更多详情',\n }\n}\n\n/**\n * 显示友好的错误信息\n */\nfunction displayError(error: Error, context?: { packageName?: string, operation?: string }): void {\n const { message, solution } = getFriendlyErrorMessage(error)\n\n if (context?.packageName) {\n log.error(`包 ${context.packageName} ${context.operation || '操作'} 失败:`)\n }\n\n log.error(` ${message}`)\n\n if (solution) {\n log.info(` ${solution}`)\n }\n\n // 调试模式下显示详细错误\n if (process.env.DEBUG) {\n log.debug(`详细错误信息: ${JSON.stringify(error, null, 2)}`)\n }\n}\n\n/**\n * 渲染进度条\n * @param current 当前进度\n * @param total 总数量\n * @param width 进度条宽度(字符数)\n * @returns 进度条字符串\n */\nfunction renderProgressBar(current: number, total: number, width: number = 30): string {\n const percentage = Math.round((current / total) * 100)\n const filledLength = Math.round((width * current) / total)\n const emptyLength = width - filledLength\n\n const filled = '█'.repeat(filledLength)\n const empty = '░'.repeat(emptyLength)\n\n return `[${filled}${empty}] ${percentage}% | ${current}/${total}`\n}\n\n/**\n * 显示批量更新进度\n */\nfunction updateProgress(\n current: number,\n total: number,\n packageName: string,\n status: 'processing' | 'success' | 'failed',\n): void {\n const progressBar = renderProgressBar(current, total)\n const statusIcon = status === 'success' ? '✓' : status === 'failed' ? '✗' : '⟳'\n const statusText = status === 'processing' ? '处理中' : status === 'success' ? '完成' : '失败'\n\n // 清除当前行并显示新进度\n process.stdout.write(`\\r${progressBar} | ${statusIcon} ${packageName} - ${statusText} `)\n\n // 如果是最后一个或失败/成功,换行\n if (current === total || status !== 'processing') {\n process.stdout.write('\\n')\n }\n}\n\nfor (const packageJsonPath of possiblePaths) {\n try {\n if (existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'))\n packageVersion = packageJson.version || packageVersion\n break\n }\n }\n catch {\n // 继续尝试下一个路径\n }\n}\n\nprocess.env.NODE_NO_WARNINGS = '1'\n\nexport function showHelp(): void {\n const helpText = `🔧 mbump v${packageVersion}\n========================\n企业级版本管理工具,支持单包和monorepo场景\n\n用法: mbump [package|path] [type] [options]\n\n参数:\n [package] 要更新的包名称或 \"all\" 更新所有包\n [path] 项目目录路径(支持 ./path, ../path, /path, C:\\\\path),自动查找该目录下的 package.json\n [type] 版本升级类型: major, minor, patch, pre-patch, pre-minor, pre-major\n\n选项:\n --dry-run, -d 试运行模式,只显示将要执行的操作\n --verbose, -v 详细输出模式,显示更多执行细节\n --no-commit, -n 禁用自动git提交\n --no-push, -p 禁用自动推送到远程仓库\n --allow-uncommitted, -u 允许在有未提交更改的情况下继续操作\n --npm, -N 启用npm包发布功能(默认不发布)\n --show-config, -c 显示当前加载的完整配置信息\n --version, -V 显示版本信息\n --help, -h 显示此帮助信息\n\n示例:\n mbump components patch # 将components包升级一个补丁版本\n mbump all minor # 将所有包升级一个小版本\n mbump plugins major --dry-run # 试运行升级plugins包主版本\n mbump core patch --no-push # 更新版本并提交到本地,但不推送到远程\n mbump components patch --npm # 更新版本并发布到npm\n\n # 路径模式(直接指定项目目录)\n mbump ./packages/my-pkg # 更新 ./packages/my-pkg 目录下的 package.json\n mbump ./packages/my-pkg patch # 指定版本类型\n mbump ../other-project minor # 更新上级目录的项目\n`\n log.info(helpText)\n}\n\nfunction hasUncommittedChanges(): boolean {\n try {\n const output = execSync('git status --porcelain', { encoding: 'utf8', stdio: 'pipe' })\n return output.trim() !== ''\n }\n catch {\n return false\n }\n}\n\nasync function main(): Promise<void> {\n try {\n const args = process.argv.slice(2)\n\n if (args.includes('--help') || args.includes('-h')) {\n showHelp()\n process.exit(0)\n }\n\n if (args.includes('--version') || args.includes('-V')) {\n log.info(`mbump v${packageVersion}`)\n process.exit(0)\n }\n\n const parsedArgs = parseArgs(args)\n\n if (parsedArgs.projectPath) {\n const resolvedProjectPath = resolve(process.cwd(), parsedArgs.projectPath)\n if (!existsSync(resolvedProjectPath)) {\n throw new Error(`路径 \"${parsedArgs.projectPath}\" 不存在`)\n }\n const pkgJsonPath = join(resolvedProjectPath, 'package.json')\n if (!existsSync(pkgJsonPath)) {\n throw new Error(`路径 \"${parsedArgs.projectPath}\" 中不存在 package.json`)\n }\n\n log.info(`切换到项目路径: ${resolvedProjectPath}`)\n const projectConfig = await loadConfigAsync(resolvedProjectPath)\n\n parsedArgs.package = 'default'\n\n const projectVersionManager = new VersionManager({ config: projectConfig, rootDir: resolvedProjectPath })\n log.setLevel(parsedArgs.verbose ? 'debug' : 'info')\n\n const pkgPath = projectConfig.packagePaths[parsedArgs.package!]\n const pkg = projectVersionManager.getPackageInfo(pkgPath)\n const newVersion = semver.inc(pkg.version, parsedArgs.type as semver.ReleaseType)\n\n if (!newVersion) {\n displayError(new Error(`无法计算新版本,当前版本 \"${pkg.version}\",版本类型 \"${parsedArgs.type}\"`), {\n operation: '版本计算',\n })\n process.exit(1)\n }\n\n const isDefaultPackage = parsedArgs.package === 'default' || pkgPath === 'package.json'\n const tagPrefix = projectConfig.git?.tagPrefix || 'v'\n const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`\n\n if (parsedArgs.dryRun) {\n log.info('🔍 Dry-run 模式 - 以下操作将被执行:\\n')\n log.info(` 📦 ${parsedArgs.package}`)\n log.info(` 当前版本: ${pkg.version}`)\n log.info(` 新版本: ${newVersion}`)\n log.info(` Tag: ${tagName}`)\n log.info(` CHANGELOG: ${projectConfig.git?.changelog !== false ? '是' : '否(配置禁用)'}`)\n log.info(` Git Commit: ${parsedArgs.autoCommit ? '是' : '否'}`)\n log.info(` Git Push: ${parsedArgs.push ? '是' : '否'}`)\n log.info(` NPM Publish: ${parsedArgs.npm ? '是' : '否'}`)\n log.info('\\n✅ 以上为预览,未执行任何实际操作')\n process.exit(0)\n }\n\n await projectVersionManager.updateVersion(parsedArgs.package!, parsedArgs.type, {\n dryRun: parsedArgs.dryRun,\n verbose: parsedArgs.verbose,\n autoCommit: parsedArgs.autoCommit,\n push: parsedArgs.push,\n npm: parsedArgs.npm,\n })\n\n log.success(`版本更新完成`)\n process.exit(0)\n }\n\n const rootDir = process.cwd()\n const config: Config = await log.withSpinner('正在加载配置...', () => loadConfigAsync(rootDir), {\n succeedText: '配置加载完成',\n failText: '配置加载失败',\n })\n\n const parsedArgsWithDefaults = parseArgs(args, config.defaults)\n\n if (parsedArgsWithDefaults.showConfig) {\n log.info('📋 当前加载的配置:')\n log.info('')\n\n // 显示配置文件路径\n if (config.usedConfigPath) {\n const fileName = config.usedConfigPath.split(/[/\\\\]/).pop()\n log.info(` 配置文件: ${fileName}`)\n }\n else {\n log.info(' 配置文件: (默认配置)')\n }\n\n // 显示包路径\n log.info('')\n log.info('📦 包路径:')\n for (const [name, path] of Object.entries(config.packagePaths)) {\n log.info(` ${name}: ${path}`)\n }\n\n // 显示默认选项\n log.info('')\n log.info('⚙️ 默认选项:')\n log.info(` releaseType: ${config.defaults?.releaseType}`)\n log.info(` dryRun: ${config.defaults?.dryRun}`)\n log.info(` verbose: ${config.defaults?.verbose}`)\n log.info(` allowUncommitted: ${config.defaults?.allowUncommitted}`)\n log.info(` npm: ${config.defaults?.npm}`)\n\n // 显示 Git 选项\n log.info('')\n log.info('🔧 Git 选项:')\n log.info(` commit: ${config.git?.autoCommit}`)\n log.info(` push: ${config.git?.push}`)\n log.info(` tag: ${config.git?.tag}`)\n log.info(` changelog: ${config.git?.changelog}`)\n\n // 显示 Publish 选项\n log.info('')\n log.info('🚀 发布选项:')\n log.info(` command: ${config.publish?.command}`)\n log.info(` skipChecks: ${config.publish?.skipChecks}`)\n\n log.info('')\n process.exit(0)\n }\n\n const packageNames = Object.keys(config.packagePaths)\n if (!parsedArgsWithDefaults.package) {\n if (packageNames.includes('default')) {\n parsedArgsWithDefaults.package = 'default'\n }\n else if (packageNames.length === 1) {\n parsedArgsWithDefaults.package = packageNames[0]\n }\n else {\n displayError(new Error(`未指定包名\\n可用的包名: ${packageNames.join(', ')} 或使用 \"all\" 更新所有包`))\n process.exit(1)\n }\n }\n else if (parsedArgsWithDefaults.package !== 'all' && !packageNames.includes(parsedArgsWithDefaults.package)) {\n const maybePath = parsedArgsWithDefaults.package\n if (maybePath) {\n const resolvedPath = resolve(process.cwd(), maybePath)\n const pkgJsonPath = join(resolvedPath, 'package.json')\n if (existsSync(resolvedPath) && existsSync(pkgJsonPath)) {\n log.info(`切换到项目路径: ${resolvedPath}`)\n const projectConfig = await loadConfigAsync(resolvedPath)\n\n const projectVersionManager = new VersionManager({ config: projectConfig, rootDir: resolvedPath })\n log.setLevel(parsedArgsWithDefaults.verbose ? 'debug' : 'info')\n\n const pkgPath = projectConfig.packagePaths.default\n const pkg = projectVersionManager.getPackageInfo(pkgPath)\n const newVersion = semver.inc(pkg.version, parsedArgsWithDefaults.type as semver.ReleaseType)\n\n if (!newVersion) {\n displayError(new Error(`无法计算新版本,当前版本 \"${pkg.version}\",版本类型 \"${parsedArgsWithDefaults.type}\"`), {\n operation: '版本计算',\n })\n process.exit(1)\n }\n\n const tagPrefix = projectConfig.git?.tagPrefix || 'v'\n const tagName = `${tagPrefix}${newVersion}`\n\n if (parsedArgsWithDefaults.dryRun) {\n log.info('🔍 Dry-run 模式 - 以下操作将被执行:\\n')\n log.info(` 📦 default`)\n log.info(` 当前版本: ${pkg.version}`)\n log.info(` 新版本: ${newVersion}`)\n log.info(` Tag: ${tagName}`)\n log.info(` CHANGELOG: ${projectConfig.git?.changelog !== false ? '是' : '否(配置禁用)'}`)\n log.info(` Git Commit: ${parsedArgsWithDefaults.autoCommit ? '是' : '否'}`)\n log.info(` Git Push: ${parsedArgsWithDefaults.push ? '是' : '否'}`)\n log.info(` NPM Publish: ${parsedArgsWithDefaults.npm ? '是' : '否'}`)\n log.info('\\n✅ 以上为预览,未执行任何实际操作')\n process.exit(0)\n }\n\n await projectVersionManager.updateVersion('default', parsedArgsWithDefaults.type, {\n dryRun: parsedArgsWithDefaults.dryRun,\n verbose: parsedArgsWithDefaults.verbose,\n autoCommit: parsedArgsWithDefaults.autoCommit,\n push: parsedArgsWithDefaults.push,\n npm: parsedArgsWithDefaults.npm,\n })\n\n log.success(`版本更新完成`)\n process.exit(0)\n }\n else {\n displayError(new Error(`包名 \"${parsedArgsWithDefaults.package}\" 未在配置中找到,且路径 \"${resolvedPath}\" 不是有效的项目目录`), {\n operation: '包名/路径解析',\n })\n log.info(`💡 可用的包名: ${packageNames.join(', ')} 或使用 \"all\" 更新所有包`)\n log.info(`💡 也可以使用路径模式: mbump ./packages/my-pkg`)\n process.exit(1)\n }\n }\n\n displayError(new Error(`包名 \"${parsedArgsWithDefaults.package}\" 未在配置中找到`), {\n operation: '包名解析',\n })\n log.info(`💡 可用的包名: ${packageNames.join(', ')} 或使用 \"all\" 更新所有包`)\n log.info(`💡 也可以使用路径模式: mbump ./packages/my-pkg`)\n process.exit(1)\n }\n\n const versionManager = new VersionManager({ config, rootDir })\n log.setLevel(parsedArgsWithDefaults.verbose ? 'debug' : 'info')\n\n if (hasUncommittedChanges()) {\n if (!parsedArgsWithDefaults.allowUncommitted) {\n log.warn('警告: 检测到未提交的Git更改')\n\n const inquirer = await import('inquirer')\n const answers = await inquirer.default.prompt([\n {\n type: 'confirm',\n name: 'continue',\n message: parsedArgsWithDefaults.dryRun\n ? '是否继续(dry-run模式不会实际提交更改)?'\n : '是否提交这些更改并继续?',\n default: true,\n },\n ])\n\n if (!answers.continue) {\n log.info('操作已取消')\n process.exit(0)\n }\n\n if (!parsedArgsWithDefaults.dryRun) {\n const commitMessage = 'chore: update mbump config and settings'\n execSync(`git add . && git commit -m \"${commitMessage}\"`, { encoding: 'utf8', stdio: 'pipe' })\n log.success(`已提交更改: ${commitMessage}`)\n }\n else {\n log.info('dry-run模式: 跳过实际提交操作')\n }\n }\n else {\n log.warn('警告: 存在未提交的Git更改,您选择了忽略此检查。请注意这可能导致不一致的版本状态。')\n }\n }\n\n if (parsedArgsWithDefaults.verbose) {\n if (config.usedConfigPath) {\n const fileName = config.usedConfigPath.split('\\\\').pop() || config.usedConfigPath\n log.info(`使用配置文件: ${fileName}`)\n }\n log.info(`更新信息: 包=${parsedArgsWithDefaults.package}, 类型=${parsedArgsWithDefaults.type}${parsedArgsWithDefaults.dryRun ? ' (试运行)' : ''}`)\n }\n\n let selectedType = parsedArgsWithDefaults.type\n let customVersion: string | null = null\n const packageVersionSelections: PackageVersionSelections = {}\n\n if (\n !args.some(arg => arg === '--type' || arg.startsWith('--type=') || arg === '-t' || arg.startsWith('-t='))\n ) {\n if (parsedArgsWithDefaults.package === 'all') {\n const selections = await selectAllVersionsInteractive(config, rootDir)\n Object.assign(packageVersionSelections, selections)\n }\n else {\n const packageName = parsedArgsWithDefaults.package!\n const currentVersion = versionManager.getPackageVersion(packageName)\n\n if (currentVersion) {\n const selection = await selectVersionInteractive(config, packageName, currentVersion)\n selectedType = selection.type\n customVersion = selection.customVersion\n }\n }\n }\n\n if (parsedArgsWithDefaults.package === 'all' && Object.keys(packageVersionSelections).length > 0) {\n // Dry-run 模式:显示详细预览\n if (parsedArgsWithDefaults.dryRun) {\n log.info('🔍 Dry-run 模式 - 以下操作将被执行:\\n')\n\n for (const [packageName, selection] of Object.entries(packageVersionSelections)) {\n const pkgPath = config.packagePaths[packageName]\n const pkg = versionManager.getPackageInfo(pkgPath)\n // 使用 as any 绕过类型检查,因为我们的 ReleaseType 包含额外的选项\n const newVersion = selection.customVersion || semver.inc(pkg.version, selection.type as any)!\n\n // 判断是否为主项目包\n const isDefaultPackage = packageName === 'default' || pkgPath === 'package.json'\n const tagPrefix = config.git?.tagPrefix || 'v'\n const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`\n\n log.info(` 📦 ${packageName}`)\n log.info(` 当前版本: ${pkg.version}`)\n log.info(` 新版本: ${newVersion}`)\n log.info(` Tag: ${tagName}`)\n log.info(` CHANGELOG: ${isDefaultPackage && config.git?.changelog !== false ? '是' : '跳过(子包或配置禁用)'}`)\n log.info('')\n }\n\n log.info('✅ 以上为预览,未执行任何实际操作')\n process.exit(0)\n }\n\n const updatedPackagesInfo: Array<{ name: string, newVersion: string, pkgKey: string }> = []\n const errors: Array<{ packageName: string, error: Error }> = []\n const packages = Object.entries(packageVersionSelections)\n const total = packages.length\n\n log.info(`\\n📦 开始批量更新 ${total} 个包...\\n`)\n\n for (let i = 0; i < packages.length; i++) {\n const [packageName, selection] = packages[i]\n const current = i + 1\n\n // 显示进度\n updateProgress(current, total, packageName, 'processing')\n\n try {\n const result = await versionManager.updateVersion(packageName, selection.type, {\n dryRun: parsedArgsWithDefaults.dryRun,\n verbose: parsedArgsWithDefaults.verbose,\n customVersion: selection.customVersion,\n autoCommit: false,\n push: false,\n isBatchMode: true, // 标识这是批量更新模式\n })\n\n // 收集更新的包信息,同时记录包名 key\n if (result.success && result.updatedPackages.length > 0) {\n updatedPackagesInfo.push(...result.updatedPackages.map(pkg => ({\n ...pkg,\n pkgKey: packageName,\n })))\n updateProgress(current, total, packageName, 'success')\n }\n else {\n updateProgress(current, total, packageName, 'failed')\n }\n }\n catch (error) {\n errors.push({ packageName, error: error as Error })\n displayError(error as Error, { packageName, operation: '更新' })\n updateProgress(current, total, packageName, 'failed')\n }\n }\n\n log.info('') // 空行分隔\n\n // 报告所有错误\n if (errors.length > 0) {\n log.error(`\\n❌ 批量更新完成,但有 ${errors.length} 个包更新失败:`)\n errors.forEach(({ packageName, error }) => {\n log.error(` - ${packageName}: ${error.message}`)\n })\n log.info('\\n💡 提示: 可以单独重试失败的包,或检查错误信息后重新运行')\n }\n\n if (!parsedArgsWithDefaults.dryRun && parsedArgsWithDefaults.autoCommit && updatedPackagesInfo.length > 0) {\n await versionManager.gitCommitAndPush(\n parsedArgsWithDefaults.push,\n updatedPackagesInfo,\n config.git?.tag !== false,\n config.git?.tagPrefix || 'v',\n )\n }\n\n if (parsedArgsWithDefaults.npm && !parsedArgsWithDefaults.dryRun) {\n const npmErrors: Array<{ packageName: string, error: Error }> = []\n const npmPackages = Object.entries(packageVersionSelections)\n const npmTotal = npmPackages.length\n\n log.info(`\\n🚀 开始发布 ${npmTotal} 个包到 NPM...\\n`)\n\n for (let i = 0; i < npmPackages.length; i++) {\n const [packageName, selection] = npmPackages[i]\n const npmCurrent = i + 1\n\n // 显示进度\n updateProgress(npmCurrent, npmTotal, packageName, 'processing')\n\n try {\n await versionManager.updateVersion(packageName, selection.type, {\n dryRun: false,\n verbose: parsedArgsWithDefaults.verbose,\n customVersion: selection.customVersion,\n autoCommit: false,\n push: false,\n npm: true,\n })\n\n updateProgress(npmCurrent, npmTotal, packageName, 'success')\n }\n catch (error) {\n npmErrors.push({ packageName, error: error as Error })\n displayError(error as Error, { packageName, operation: '发布' })\n updateProgress(npmCurrent, npmTotal, packageName, 'failed')\n }\n }\n\n log.info('') // 空行分隔\n\n // 报告 NPM 发布错误\n if (npmErrors.length > 0) {\n log.error(`\\n❌ NPM 发布完成,但有 ${npmErrors.length} 个包发布失败:`)\n npmErrors.forEach(({ packageName, error }) => {\n log.error(` - ${packageName}: ${error.message}`)\n })\n }\n }\n }\n else {\n // 单包更新的 dry-run 预览\n if (parsedArgsWithDefaults.dryRun && parsedArgsWithDefaults.package) {\n const pkgPath = config.packagePaths[parsedArgsWithDefaults.package]\n const pkg = versionManager.getPackageInfo(pkgPath)\n // 使用 as any 绕过类型检查\n const newVersion = customVersion || semver.inc(pkg.version, selectedType as any)!\n\n // 判断是否为主项目包\n const isDefaultPackage = parsedArgsWithDefaults.package === 'default' || pkgPath === 'package.json'\n const tagPrefix = config.git?.tagPrefix || 'v'\n const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`\n\n log.info('🔍 Dry-run 模式 - 以下操作将被执行:\\n')\n log.info(` 📦 ${parsedArgsWithDefaults.package}`)\n log.info(` 当前版本: ${pkg.version}`)\n log.info(` 新版本: ${newVersion}`)\n log.info(` Tag: ${tagName}`)\n log.info(` CHANGELOG: ${config.git?.changelog !== false ? '是' : '否(配置禁用)'}`)\n log.info(` Git Commit: ${parsedArgsWithDefaults.autoCommit ? '是' : '否'}`)\n log.info(` Git Push: ${parsedArgsWithDefaults.push ? '是' : '否'}`)\n log.info(` NPM Publish: ${parsedArgsWithDefaults.npm ? '是' : '否'}`)\n log.info('\\n✅ 以上为预览,未执行任何实际操作')\n process.exit(0)\n }\n\n await versionManager.updateVersion(parsedArgsWithDefaults.package!, selectedType, {\n dryRun: parsedArgsWithDefaults.dryRun,\n verbose: parsedArgsWithDefaults.verbose,\n customVersion,\n autoCommit: parsedArgsWithDefaults.autoCommit,\n push: parsedArgsWithDefaults.push,\n npm: parsedArgsWithDefaults.npm,\n })\n }\n\n log.success(`版本更新完成${parsedArgsWithDefaults.dryRun ? ' (试运行模式)' : ''}`)\n process.exit(0)\n }\n catch (error: any) {\n displayError(error as Error)\n process.exit(1)\n }\n}\n\nmain().catch((error: any) => {\n displayError(error as Error, { operation: 'CLI执行' })\n process.exit(1)\n})\n"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -73,9 +73,11 @@ interface UpdateResult {
|
|
|
73
73
|
}
|
|
74
74
|
interface ParsedArgs {
|
|
75
75
|
package: string | null;
|
|
76
|
+
projectPath: string | null;
|
|
76
77
|
type: ReleaseType;
|
|
77
78
|
dryRun: boolean;
|
|
78
79
|
help: boolean;
|
|
80
|
+
version: boolean;
|
|
79
81
|
verbose: boolean;
|
|
80
82
|
autoCommit: boolean;
|
|
81
83
|
push: boolean;
|
|
@@ -189,7 +191,6 @@ declare class VersionManager {
|
|
|
189
191
|
size: number;
|
|
190
192
|
packages: string[];
|
|
191
193
|
};
|
|
192
|
-
private _resolvePackagePaths;
|
|
193
194
|
updateVersion(pkgName: string, releaseType?: ReleaseType, options?: UpdateOptions): Promise<UpdateResult>;
|
|
194
195
|
gitCommitAndPush(push?: boolean, updatedPackages?: Array<{
|
|
195
196
|
name: string;
|