@mznjs/mbump 2.1.0 → 2.2.0

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