@mznjs/mbump 2.1.0 → 2.2.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.
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","names":[],"sources":["../src/cli/index.ts"],"sourcesContent":null,"mappings":";;iBA2KgB,QAAA,CAAA;;;AAAhB"}
1
+ {"version":3,"file":"cli.d.ts","names":[],"sources":["../src/cli/index.ts"],"sourcesContent":null,"mappings":";;iBA6RgB,QAAA,CAAA;;;AAAhB"}
package/dist/cli.js CHANGED
@@ -1,15 +1,24 @@
1
1
  #!/usr/bin/env node
2
- import { VersionManager, loadConfigAsync, logger_default } from "./VersionManager-CwsuNWyP.js";
2
+ import { RustManager, VersionManager, clearConfigCache, isPathLike, loadConfigAsync, logger_default } from "./path-BvKf4Pq-.js";
3
3
  import { existsSync, readFileSync } from "node:fs";
4
4
  import { dirname, join, resolve } from "node:path";
5
5
  import { execSync } from "node:child_process";
6
- import process from "node:process";
7
6
  import semver from "semver";
7
+ import process from "node:process";
8
8
  import { fileURLToPath } from "node:url";
9
9
  import inquirer from "inquirer";
10
10
 
11
11
  //#region src/cli/interactive.ts
12
- async function selectVersionInteractive(config, packageName, currentVersion) {
12
+ async function selectVersionInteractive(config, packageName, currentVersion, rootDir) {
13
+ let displayName = packageName;
14
+ if (rootDir && packageName !== "default") {
15
+ const pkgPath = config.packagePaths[packageName];
16
+ if (pkgPath) try {
17
+ const fullPath = resolve(rootDir, pkgPath);
18
+ const pkgContent = JSON.parse(readFileSync(fullPath, "utf8"));
19
+ if (pkgContent.name) displayName = pkgContent.name;
20
+ } catch {}
21
+ }
13
22
  const choices = [
14
23
  {
15
24
  name: `major ${semver.inc(currentVersion, "major")}`,
@@ -55,7 +64,7 @@ async function selectVersionInteractive(config, packageName, currentVersion) {
55
64
  const answers = await inquirer.prompt([{
56
65
  type: "list",
57
66
  name: "versionType",
58
- message: `[${packageName}] Current version ${currentVersion} »`,
67
+ message: `[${displayName}] Current version ${currentVersion} »`,
59
68
  choices,
60
69
  default: config.defaults?.releaseType || "patch"
61
70
  }]);
@@ -85,7 +94,7 @@ async function selectAllVersionsInteractive(config, rootDir) {
85
94
  for (const packageName of allPackageNames) {
86
95
  const currentVersion = versionManager.getPackageVersion(packageName);
87
96
  if (currentVersion) {
88
- const selection = await selectVersionInteractive(config, packageName, currentVersion);
97
+ const selection = await selectVersionInteractive(config, packageName, currentVersion, rootDir);
89
98
  selections[packageName] = selection;
90
99
  }
91
100
  }
@@ -94,14 +103,11 @@ async function selectAllVersionsInteractive(config, rootDir) {
94
103
 
95
104
  //#endregion
96
105
  //#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
- }
100
106
  function parseArgs(args, defaults = {}) {
101
107
  const parsed = {
102
108
  package: null,
103
109
  projectPath: null,
104
- type: defaults.releaseType || defaults.type || "patch",
110
+ type: void 0,
105
111
  dryRun: defaults.dryRun || false,
106
112
  help: false,
107
113
  version: false,
@@ -110,7 +116,11 @@ function parseArgs(args, defaults = {}) {
110
116
  push: defaults.git?.push !== false,
111
117
  allowUncommitted: defaults.allowUncommitted || false,
112
118
  npm: defaults.npm || false,
113
- showConfig: false
119
+ showConfig: false,
120
+ rust: false,
121
+ tag: defaults.git?.tag !== false,
122
+ tagPrefix: defaults.git?.tagPrefix || "v",
123
+ changelog: defaults.git?.changelog !== false
114
124
  };
115
125
  const allowedTypes = [
116
126
  "major",
@@ -147,6 +157,9 @@ function parseArgs(args, defaults = {}) {
147
157
  } else if (arg === "--show-config" || arg === "-c") {
148
158
  parsed.showConfig = true;
149
159
  i++;
160
+ } else if (arg === "--rust" || arg === "-r") {
161
+ parsed.rust = true;
162
+ i++;
150
163
  } else if (arg === "--version" || arg === "-V") {
151
164
  parsed.version = true;
152
165
  i++;
@@ -177,6 +190,21 @@ function parseArgs(args, defaults = {}) {
177
190
  //#region src/cli/index.ts
178
191
  const __filename = fileURLToPath(import.meta.url);
179
192
  const __dirname = dirname(__filename);
193
+ function renderPreview(preview) {
194
+ logger_default.info("🔍 Dry-run 模式 - 以下操作将被执行:\n");
195
+ for (const pkg of preview.packages) {
196
+ logger_default.info(` 📦 ${pkg.name}`);
197
+ logger_default.info(` 当前版本: ${pkg.oldVersion}`);
198
+ logger_default.info(` 新版本: ${pkg.newVersion}`);
199
+ logger_default.info(` Tag: ${pkg.tagName}`);
200
+ logger_default.info(` CHANGELOG: ${pkg.changelogEnabled ? "是" : pkg.isDefaultPackage ? "否(配置禁用)" : "跳过(子包)"}`);
201
+ logger_default.info("");
202
+ }
203
+ logger_default.info(` Git Commit: ${preview.autoCommit ? "是" : "否"}`);
204
+ logger_default.info(` Git Push: ${preview.push ? "是" : "否"}`);
205
+ logger_default.info(` NPM Publish: ${preview.npm ? "是" : "否"}`);
206
+ logger_default.info("\n✅ 以上为预览,未执行任何实际操作");
207
+ }
180
208
  let packageVersion = "1.0.0";
181
209
  const possiblePaths = [
182
210
  join(__dirname, "..", "..", "package.json"),
@@ -216,6 +244,54 @@ function getFriendlyErrorMessage(error) {
216
244
  message: "❌ 无效的包名",
217
245
  solution: "💡 请检查配置文件中的 packagePaths 是否正确设置"
218
246
  };
247
+ if (errorMessage.includes("不支持的版本类型")) return {
248
+ message: "❌ 不支持的版本类型",
249
+ solution: "💡 支持的版本类型: major, minor, patch, pre-patch, pre-minor, pre-major, next, as-is, conventional"
250
+ };
251
+ if (errorMessage.includes("无效的自定义版本号")) return {
252
+ message: "❌ 无效的自定义版本号",
253
+ solution: "💡 请使用符合 semver 规范的版本号,如 1.0.0, 1.0.1-beta.1"
254
+ };
255
+ if (errorMessage.includes("版本计算失败")) return {
256
+ message: "❌ 版本计算失败",
257
+ solution: "💡 请检查当前版本号是否符合 semver 规范,或使用 --verbose 模式查看详细错误"
258
+ };
259
+ if (errorMessage.includes("无法计算新版本号")) return {
260
+ message: "❌ 无法计算新版本号",
261
+ solution: "💡 请检查当前版本号是否符合 semver 规范,或尝试使用不同的版本类型"
262
+ };
263
+ if (errorMessage.includes("读取文件失败")) return {
264
+ message: "📁 文件读取失败",
265
+ solution: "💡 请检查文件路径是否正确,文件是否存在且有读取权限"
266
+ };
267
+ if (errorMessage.includes("写入文件失败")) return {
268
+ message: "📁 文件写入失败",
269
+ solution: "💡 请检查文件路径是否正确,是否有写入权限,磁盘空间是否充足"
270
+ };
271
+ if (errorMessage.includes("Git") && errorMessage.includes("失败")) return {
272
+ message: "🔧 Git 操作失败",
273
+ solution: "💡 请检查 Git 仓库状态,确保有提交权限,或使用 --verbose 模式查看详细错误"
274
+ };
275
+ if (errorMessage.includes("发布失败")) return {
276
+ message: "🚀 NPM 发布失败",
277
+ solution: "💡 请检查 NPM 配置、认证状态和网络连接,或使用 --verbose 模式查看详细错误"
278
+ };
279
+ if (errorMessage.includes("Cargo.toml")) return {
280
+ message: "🦀 Cargo.toml 操作失败",
281
+ solution: "💡 请检查 Cargo.toml 文件是否存在,格式是否正确,或使用 --verbose 模式查看详细错误"
282
+ };
283
+ if (errorMessage.includes("不存在 package.json")) return {
284
+ message: "📦 package.json 不存在",
285
+ solution: "💡 请确保指定的路径是一个有效的 Node.js 项目目录"
286
+ };
287
+ if (errorMessage.includes("路径") && errorMessage.includes("不存在") && !errorMessage.includes("package.json")) return {
288
+ message: "📂 路径不存在",
289
+ solution: "💡 请检查路径是否正确,确保目录存在"
290
+ };
291
+ if (errorMessage.includes("配置错误")) return {
292
+ message: "⚙️ 配置错误",
293
+ solution: "💡 请检查配置文件是否正确,或使用 --show-config 查看当前配置"
294
+ };
219
295
  return {
220
296
  message: `❌ ${errorMessage}`,
221
297
  solution: "💡 请检查错误信息,或使用 --verbose 模式查看更多详情"
@@ -284,6 +360,7 @@ function showHelp() {
284
360
  --allow-uncommitted, -u 允许在有未提交更改的情况下继续操作
285
361
  --npm, -N 启用npm包发布功能(默认不发布)
286
362
  --show-config, -c 显示当前加载的完整配置信息
363
+ --rust, -r 启用 Rust 项目模式,更新 Cargo.toml 中的版本号
287
364
  --version, -V 显示版本信息
288
365
  --help, -h 显示此帮助信息
289
366
 
@@ -298,6 +375,13 @@ function showHelp() {
298
375
  mbump ./packages/my-pkg # 更新 ./packages/my-pkg 目录下的 package.json
299
376
  mbump ./packages/my-pkg patch # 指定版本类型
300
377
  mbump ../other-project minor # 更新上级目录的项目
378
+
379
+ # Rust 项目模式(更新 Cargo.toml)
380
+ mbump --rust patch # 更新当前目录 Rust 项目的补丁版本
381
+ mbump -r minor # 更新当前目录 Rust 项目的小版本
382
+ mbump -r major --dry-run # 试运行升级当前目录 Rust 项目的主版本
383
+ mbump ./backend -r patch # 更新指定目录下的 Rust 项目
384
+ mbump ./backend -r -d # 试运行模式更新指定目录下的 Rust 项目
301
385
  `;
302
386
  logger_default.info(helpText);
303
387
  }
@@ -324,48 +408,147 @@ async function main() {
324
408
  process.exit(0);
325
409
  }
326
410
  const parsedArgs = parseArgs(args);
411
+ if (parsedArgs.rust) {
412
+ const rootDir$1 = parsedArgs.projectPath ? resolve(process.cwd(), parsedArgs.projectPath) : process.cwd();
413
+ if (parsedArgs.projectPath && !existsSync(rootDir$1)) {
414
+ displayError(new Error(`路径 "${parsedArgs.projectPath}" 不存在`), { operation: "路径验证" });
415
+ process.exit(1);
416
+ }
417
+ const rustManager = new RustManager(rootDir$1);
418
+ if (parsedArgs.projectPath) logger_default.info(`切换到项目路径: ${rootDir$1}`);
419
+ if (hasUncommittedChanges()) if (!parsedArgs.allowUncommitted) {
420
+ logger_default.warn("警告: 检测到未提交的Git更改");
421
+ const inquirer$1 = await import("inquirer");
422
+ const answers = await inquirer$1.default.prompt([{
423
+ type: "confirm",
424
+ name: "continue",
425
+ message: parsedArgs.dryRun ? "是否继续(dry-run模式不会实际提交更改)?" : "是否提交这些更改并继续?",
426
+ default: true
427
+ }]);
428
+ if (!answers.continue) {
429
+ logger_default.info("操作已取消");
430
+ process.exit(0);
431
+ }
432
+ if (!parsedArgs.dryRun) {
433
+ const commitMessage = "chore: update mbump config and settings";
434
+ execSync(`git add . && git commit -m "${commitMessage}"`, {
435
+ encoding: "utf8",
436
+ stdio: "pipe"
437
+ });
438
+ logger_default.success(`已提交更改: ${commitMessage}`);
439
+ } else logger_default.info("dry-run模式: 跳过实际提交操作");
440
+ } else logger_default.warn("警告: 存在未提交的Git更改,您选择了忽略此检查。请注意这可能导致不一致的版本状态。");
441
+ if (!rustManager.exists()) {
442
+ displayError(new Error(`Cargo.toml 文件不存在于路径 "${rootDir$1}"`), { operation: "Rust 项目检测" });
443
+ logger_default.info(`💡 请确保指定的路径是 Rust 项目根目录`);
444
+ process.exit(1);
445
+ }
446
+ const currentVersion = rustManager.getCurrentVersion();
447
+ if (!currentVersion) {
448
+ displayError(new Error(`Cargo.toml 文件中未找到 [package] 部分的 version 字段`), { operation: "版本读取" });
449
+ process.exit(1);
450
+ }
451
+ let selectedType$1 = parsedArgs.type;
452
+ let customVersion$1 = null;
453
+ if (!parsedArgs.type) {
454
+ const config$1 = {
455
+ defaults: { releaseType: "patch" },
456
+ packagePaths: {}
457
+ };
458
+ const selection = await selectVersionInteractive(config$1, "rust", currentVersion);
459
+ selectedType$1 = selection.type;
460
+ customVersion$1 = selection.customVersion;
461
+ }
462
+ try {
463
+ rustManager.updateVersion(selectedType$1, {
464
+ dryRun: parsedArgs.dryRun,
465
+ verbose: parsedArgs.verbose,
466
+ autoCommit: parsedArgs.autoCommit,
467
+ push: parsedArgs.push,
468
+ customVersion: customVersion$1,
469
+ tag: parsedArgs.tag,
470
+ changelog: parsedArgs.changelog,
471
+ allowUncommitted: parsedArgs.allowUncommitted
472
+ });
473
+ process.exit(0);
474
+ } catch (error) {
475
+ displayError(error, { operation: "Rust 版本更新" });
476
+ process.exit(1);
477
+ }
478
+ }
327
479
  if (parsedArgs.projectPath) {
328
480
  const resolvedProjectPath = resolve(process.cwd(), parsedArgs.projectPath);
329
- if (!existsSync(resolvedProjectPath)) throw new Error(`路径 "${parsedArgs.projectPath}" 不存在`);
481
+ if (!existsSync(resolvedProjectPath)) {
482
+ displayError(new Error(`路径 "${parsedArgs.projectPath}" 不存在`), { operation: "路径验证" });
483
+ process.exit(1);
484
+ }
330
485
  const pkgJsonPath = join(resolvedProjectPath, "package.json");
331
- if (!existsSync(pkgJsonPath)) throw new Error(`路径 "${parsedArgs.projectPath}" 中不存在 package.json`);
486
+ if (!existsSync(pkgJsonPath)) {
487
+ displayError(new Error(`路径 "${parsedArgs.projectPath}" 中不存在 package.json`), { operation: "package.json 检测" });
488
+ logger_default.info(`💡 请确保指定的路径是一个有效的 Node.js 项目目录`);
489
+ process.exit(1);
490
+ }
332
491
  logger_default.info(`切换到项目路径: ${resolvedProjectPath}`);
492
+ const pkgJsonContent = JSON.parse(readFileSync(pkgJsonPath, "utf8"));
493
+ const packageName = pkgJsonContent.name || "default";
494
+ parsedArgs.package = packageName;
495
+ clearConfigCache(resolvedProjectPath);
333
496
  const projectConfig = await loadConfigAsync(resolvedProjectPath);
334
- parsedArgs.package = "default";
497
+ projectConfig.packagePaths = { [packageName]: pkgJsonPath };
335
498
  const projectVersionManager = new VersionManager({
336
499
  config: projectConfig,
337
500
  rootDir: resolvedProjectPath
338
501
  });
339
502
  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);
503
+ if (hasUncommittedChanges()) if (!parsedArgs.allowUncommitted) {
504
+ logger_default.warn("警告: 检测到未提交的Git更改");
505
+ const inquirer$1 = await import("inquirer");
506
+ const answers = await inquirer$1.default.prompt([{
507
+ type: "confirm",
508
+ name: "continue",
509
+ message: parsedArgs.dryRun ? "是否继续(dry-run模式不会实际提交更改)?" : "是否提交这些更改并继续?",
510
+ default: true
511
+ }]);
512
+ if (!answers.continue) {
513
+ logger_default.info("操作已取消");
514
+ process.exit(0);
515
+ }
516
+ if (!parsedArgs.dryRun) {
517
+ const commitMessage = "chore: update mbump config and settings";
518
+ execSync(`git add . && git commit -m "${commitMessage}"`, {
519
+ encoding: "utf8",
520
+ stdio: "pipe"
521
+ });
522
+ logger_default.success(`已提交更改: ${commitMessage}`);
523
+ } else logger_default.info("dry-run模式: 跳过实际提交操作");
524
+ } else logger_default.warn("警告: 存在未提交的Git更改,您选择了忽略此检查。请注意这可能导致不一致的版本状态。");
525
+ let selectedType$1 = parsedArgs.type;
526
+ let customVersion$1 = null;
527
+ if (!parsedArgs.type) {
528
+ const currentVersion = projectVersionManager.getPackageVersion(packageName);
529
+ if (currentVersion) {
530
+ const selection = await selectVersionInteractive(projectConfig, packageName, currentVersion, resolvedProjectPath);
531
+ selectedType$1 = selection.type;
532
+ customVersion$1 = selection.customVersion;
533
+ }
346
534
  }
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
535
  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✅ 以上为预览,未执行任何实际操作");
536
+ const preview = await projectVersionManager.previewUpdate(parsedArgs.package, selectedType$1, {
537
+ customVersion: customVersion$1,
538
+ autoCommit: parsedArgs.autoCommit,
539
+ push: parsedArgs.push,
540
+ npm: parsedArgs.npm
541
+ });
542
+ renderPreview(preview);
361
543
  process.exit(0);
362
544
  }
363
- await projectVersionManager.updateVersion(parsedArgs.package, parsedArgs.type, {
545
+ await projectVersionManager.updateVersion(parsedArgs.package, selectedType$1, {
364
546
  dryRun: parsedArgs.dryRun,
365
547
  verbose: parsedArgs.verbose,
366
548
  autoCommit: parsedArgs.autoCommit,
367
549
  push: parsedArgs.push,
368
- npm: parsedArgs.npm
550
+ npm: parsedArgs.npm,
551
+ customVersion: customVersion$1
369
552
  });
370
553
  logger_default.success(`版本更新完成`);
371
554
  process.exit(0);
@@ -420,40 +603,43 @@ async function main() {
420
603
  const pkgJsonPath = join(resolvedPath, "package.json");
421
604
  if (existsSync(resolvedPath) && existsSync(pkgJsonPath)) {
422
605
  logger_default.info(`切换到项目路径: ${resolvedPath}`);
606
+ const pkgJsonContent = JSON.parse(readFileSync(pkgJsonPath, "utf8"));
607
+ const packageName = pkgJsonContent.name || "default";
608
+ clearConfigCache(resolvedPath);
423
609
  const projectConfig = await loadConfigAsync(resolvedPath);
610
+ projectConfig.packagePaths = { [packageName]: pkgJsonPath };
424
611
  const projectVersionManager = new VersionManager({
425
612
  config: projectConfig,
426
613
  rootDir: resolvedPath
427
614
  });
428
615
  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);
616
+ let selectedType$1 = parsedArgsWithDefaults.type;
617
+ let customVersion$1 = null;
618
+ if (!parsedArgsWithDefaults.type) {
619
+ const currentVersion = projectVersionManager.getPackageVersion(packageName);
620
+ if (currentVersion) {
621
+ const selection = await selectVersionInteractive(projectConfig, packageName, currentVersion, resolvedPath);
622
+ selectedType$1 = selection.type;
623
+ customVersion$1 = selection.customVersion;
624
+ }
435
625
  }
436
- const tagPrefix = projectConfig.git?.tagPrefix || "v";
437
- const tagName = `${tagPrefix}${newVersion}`;
438
626
  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✅ 以上为预览,未执行任何实际操作");
627
+ const preview = await projectVersionManager.previewUpdate(packageName, selectedType$1, {
628
+ customVersion: customVersion$1,
629
+ autoCommit: parsedArgsWithDefaults.autoCommit,
630
+ push: parsedArgsWithDefaults.push,
631
+ npm: parsedArgsWithDefaults.npm
632
+ });
633
+ renderPreview(preview);
449
634
  process.exit(0);
450
635
  }
451
- await projectVersionManager.updateVersion("default", parsedArgsWithDefaults.type, {
636
+ await projectVersionManager.updateVersion(packageName, selectedType$1, {
452
637
  dryRun: parsedArgsWithDefaults.dryRun,
453
638
  verbose: parsedArgsWithDefaults.verbose,
454
639
  autoCommit: parsedArgsWithDefaults.autoCommit,
455
640
  push: parsedArgsWithDefaults.push,
456
- npm: parsedArgsWithDefaults.npm
641
+ npm: parsedArgsWithDefaults.npm,
642
+ customVersion: customVersion$1
457
643
  });
458
644
  logger_default.success(`版本更新完成`);
459
645
  process.exit(0);
@@ -506,7 +692,7 @@ async function main() {
506
692
  let selectedType = parsedArgsWithDefaults.type;
507
693
  let customVersion = null;
508
694
  const packageVersionSelections = {};
509
- if (!args.some((arg) => arg === "--type" || arg.startsWith("--type=") || arg === "-t" || arg.startsWith("-t="))) if (parsedArgsWithDefaults.package === "all") {
695
+ if (!parsedArgsWithDefaults.type) if (parsedArgsWithDefaults.package === "all") {
510
696
  const selections = await selectAllVersionsInteractive(config, rootDir);
511
697
  Object.assign(packageVersionSelections, selections);
512
698
  } else {
@@ -520,22 +706,13 @@ async function main() {
520
706
  }
521
707
  if (parsedArgsWithDefaults.package === "all" && Object.keys(packageVersionSelections).length > 0) {
522
708
  if (parsedArgsWithDefaults.dryRun) {
523
- logger_default.info("🔍 Dry-run 模式 - 以下操作将被执行:\n");
524
- for (const [packageName, selection] of Object.entries(packageVersionSelections)) {
525
- const pkgPath = config.packagePaths[packageName];
526
- const pkg = versionManager.getPackageInfo(pkgPath);
527
- const newVersion = selection.customVersion || semver.inc(pkg.version, selection.type);
528
- const isDefaultPackage = packageName === "default" || pkgPath === "package.json";
529
- const tagPrefix = config.git?.tagPrefix || "v";
530
- const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`;
531
- logger_default.info(` 📦 ${packageName}`);
532
- logger_default.info(` 当前版本: ${pkg.version}`);
533
- logger_default.info(` 新版本: ${newVersion}`);
534
- logger_default.info(` Tag: ${tagName}`);
535
- logger_default.info(` CHANGELOG: ${isDefaultPackage && config.git?.changelog !== false ? "是" : "跳过(子包或配置禁用)"}`);
536
- logger_default.info("");
537
- }
538
- logger_default.info("✅ 以上为预览,未执行任何实际操作");
709
+ const preview = await versionManager.previewUpdate("all", "patch", {
710
+ packageVersionSelections,
711
+ autoCommit: parsedArgsWithDefaults.autoCommit,
712
+ push: parsedArgsWithDefaults.push,
713
+ npm: parsedArgsWithDefaults.npm
714
+ });
715
+ renderPreview(preview);
539
716
  process.exit(0);
540
717
  }
541
718
  const updatedPackagesInfo = [];
@@ -625,22 +802,13 @@ async function main() {
625
802
  }
626
803
  } else {
627
804
  if (parsedArgsWithDefaults.dryRun && parsedArgsWithDefaults.package) {
628
- const pkgPath = config.packagePaths[parsedArgsWithDefaults.package];
629
- const pkg = versionManager.getPackageInfo(pkgPath);
630
- const newVersion = customVersion || semver.inc(pkg.version, selectedType);
631
- const isDefaultPackage = parsedArgsWithDefaults.package === "default" || pkgPath === "package.json";
632
- const tagPrefix = config.git?.tagPrefix || "v";
633
- const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`;
634
- logger_default.info("🔍 Dry-run 模式 - 以下操作将被执行:\n");
635
- logger_default.info(` 📦 ${parsedArgsWithDefaults.package}`);
636
- logger_default.info(` 当前版本: ${pkg.version}`);
637
- logger_default.info(` 新版本: ${newVersion}`);
638
- logger_default.info(` Tag: ${tagName}`);
639
- logger_default.info(` CHANGELOG: ${config.git?.changelog !== false ? "是" : "否(配置禁用)"}`);
640
- logger_default.info(` Git Commit: ${parsedArgsWithDefaults.autoCommit ? "是" : "否"}`);
641
- logger_default.info(` Git Push: ${parsedArgsWithDefaults.push ? "是" : "否"}`);
642
- logger_default.info(` NPM Publish: ${parsedArgsWithDefaults.npm ? "是" : "否"}`);
643
- logger_default.info("\n✅ 以上为预览,未执行任何实际操作");
805
+ const preview = await versionManager.previewUpdate(parsedArgsWithDefaults.package, selectedType, {
806
+ customVersion,
807
+ autoCommit: parsedArgsWithDefaults.autoCommit,
808
+ push: parsedArgsWithDefaults.push,
809
+ npm: parsedArgsWithDefaults.npm
810
+ });
811
+ renderPreview(preview);
644
812
  process.exit(0);
645
813
  }
646
814
  await versionManager.updateVersion(parsedArgsWithDefaults.package, selectedType, {