@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,12 +1,13 @@
1
- import { __export } from "./chunk-Cl8Af3a2.js";
1
+ import { __export, __require } from "./chunk-DAa1jVm7.js";
2
2
  import { existsSync, readFileSync, writeFileSync } from "node:fs";
3
3
  import { createRequire } from "node:module";
4
4
  import { dirname, join, resolve } from "node:path";
5
5
  import { consola } from "consola";
6
6
  import ora from "ora";
7
7
  import { execSync } from "node:child_process";
8
- import process from "node:process";
8
+ import * as toml from "@iarna/toml";
9
9
  import semver from "semver";
10
+ import process from "node:process";
10
11
 
11
12
  //#region src/utils/logger.ts
12
13
  const logger = consola.create({ formatOptions: { date: false } });
@@ -228,8 +229,8 @@ const parsers = {
228
229
  } },
229
230
  js: { parse(_, configPath) {
230
231
  try {
231
- const require = createRequire(import.meta.url);
232
- const jsModule = require(configPath);
232
+ const require$1 = createRequire(import.meta.url);
233
+ const jsModule = require$1(configPath);
233
234
  return jsModule.default || jsModule;
234
235
  } catch {
235
236
  return null;
@@ -272,9 +273,9 @@ async function loadConfigAsyncImpl(rootDir) {
272
273
  let config;
273
274
  try {
274
275
  if (configPath.endsWith(".ts")) {
275
- const require = createRequire(import.meta.url);
276
- require("tsx");
277
- const tsModule = require(absPath);
276
+ const require$1 = createRequire(import.meta.url);
277
+ require$1("tsx");
278
+ const tsModule = require$1(absPath);
278
279
  config = tsModule.default || tsModule;
279
280
  } else if (configPath.endsWith(".mjs")) {
280
281
  const jsModule = await import(`file://${absPath}`);
@@ -283,13 +284,13 @@ async function loadConfigAsyncImpl(rootDir) {
283
284
  const jsModule = await import(`file://${absPath}`);
284
285
  config = jsModule.default || jsModule;
285
286
  } catch {
286
- const require = createRequire(import.meta.url);
287
- const cjsModule = require(absPath);
287
+ const require$1 = createRequire(import.meta.url);
288
+ const cjsModule = require$1(absPath);
288
289
  config = cjsModule.default || cjsModule;
289
290
  }
290
291
  else if (configPath.endsWith(".cjs")) {
291
- const require = createRequire(import.meta.url);
292
- const cjsModule = require(absPath);
292
+ const require$1 = createRequire(import.meta.url);
293
+ const cjsModule = require$1(absPath);
293
294
  config = cjsModule.default || cjsModule;
294
295
  }
295
296
  if (typeof config === "function") config = config();
@@ -340,8 +341,8 @@ function loadConfigSyncImpl(rootDir) {
340
341
  for (const configPath of configPaths) try {
341
342
  const ext = getFileExtension(configPath);
342
343
  if (ext === "js") try {
343
- const require = createRequire(import.meta.url);
344
- const jsModule = require(configPath);
344
+ const require$1 = createRequire(import.meta.url);
345
+ const jsModule = require$1(configPath);
345
346
  let config = jsModule.default || jsModule;
346
347
  if (typeof config === "function") config = config();
347
348
  if (config && typeof config === "object") return {
@@ -577,7 +578,7 @@ var ChangelogManager = class {
577
578
  const today = new Date().toISOString().split("T")[0];
578
579
  const versionTitle = packageName ? `${packageName}@${newVersion}` : newVersion;
579
580
  const categorized = {};
580
- for (const { message, files } of commits) {
581
+ for (const { hash, message, files } of commits) {
581
582
  const typeConfig = this.getTypeConfig(message);
582
583
  const typeKey = typeConfig.title;
583
584
  if (!categorized[typeKey]) categorized[typeKey] = {
@@ -587,7 +588,7 @@ var ChangelogManager = class {
587
588
  const fileNames = this.formatFileNames(files);
588
589
  const fileTag = fileNames.length > 0 ? ` (${fileNames.join(", ")})` : "";
589
590
  categorized[typeKey].items.push({
590
- message: message + fileTag,
591
+ message: `${hash} ${message}${fileTag}`,
591
592
  files
592
593
  });
593
594
  }
@@ -692,7 +693,7 @@ var GitManager = class {
692
693
  try {
693
694
  const lastTag = this.getLastTag();
694
695
  const range = lastTag ? `${lastTag}..HEAD` : "--max-count=50";
695
- const output = execSync(`git log ${range} --format="COMMIT_START%n%s" --name-only`, {
696
+ const output = execSync(`git log ${range} --format="COMMIT_START%n%H%n%s" --name-only`, {
696
697
  cwd: this.rootDir,
697
698
  encoding: "utf8",
698
699
  stdio: "pipe"
@@ -702,11 +703,12 @@ var GitManager = class {
702
703
  for (const block of blocks) {
703
704
  const lines = block.trim().split("\n");
704
705
  if (lines.length === 0) continue;
705
- const messageLines = lines.filter((line) => line.trim());
706
- if (messageLines.length === 0) continue;
707
- const message = messageLines[0].trim();
708
- const files = lines.slice(1).map((f) => f.trim()).filter((f) => f && !f.startsWith("COMMIT_START"));
706
+ const hash = lines[0]?.trim() || "";
707
+ const message = lines[1]?.trim() || "";
708
+ if (!hash || !message) continue;
709
+ const files = lines.slice(2).map((f) => f.trim()).filter((f) => f && !f.startsWith("COMMIT_START"));
709
710
  commits.push({
711
+ hash,
710
712
  message,
711
713
  files
712
714
  });
@@ -716,9 +718,10 @@ var GitManager = class {
716
718
  return [];
717
719
  }
718
720
  }
719
- checkVersionExists(version, tagPrefix = "v") {
721
+ checkVersionExists(version, tagPrefix = "v", packageName) {
720
722
  try {
721
- execSync(`git rev-parse --verify ${tagPrefix}${version}`, {
723
+ const tag = packageName ? `${packageName}@${version}` : `${tagPrefix}${version}`;
724
+ execSync(`git rev-parse --verify ${tag}`, {
722
725
  cwd: this.rootDir,
723
726
  stdio: "pipe"
724
727
  });
@@ -798,6 +801,182 @@ var GitManager = class {
798
801
  }
799
802
  };
800
803
 
804
+ //#endregion
805
+ //#region src/core/RustManager.ts
806
+ var RustManager = class {
807
+ cargoTomlPath;
808
+ gitManager;
809
+ changelogManager;
810
+ rootDir;
811
+ constructor(rootDir) {
812
+ this.rootDir = rootDir;
813
+ this.cargoTomlPath = join(rootDir, "Cargo.toml");
814
+ this.gitManager = new GitManager(rootDir);
815
+ this.changelogManager = new ChangelogManager(rootDir);
816
+ }
817
+ exists() {
818
+ return existsSync(this.cargoTomlPath);
819
+ }
820
+ getCurrentVersion() {
821
+ try {
822
+ const content = readFileSync(this.cargoTomlPath, "utf8");
823
+ const parsed = toml.parse(content);
824
+ if (parsed.package && typeof parsed.package.version === "string") return parsed.package.version;
825
+ return null;
826
+ } catch {
827
+ return null;
828
+ }
829
+ }
830
+ getPackageName() {
831
+ try {
832
+ const content = readFileSync(this.cargoTomlPath, "utf8");
833
+ const parsed = toml.parse(content);
834
+ if (parsed.package && typeof parsed.package.name === "string") return parsed.package.name;
835
+ return null;
836
+ } catch {
837
+ return null;
838
+ }
839
+ }
840
+ updateVersion(releaseType, options = {}) {
841
+ const { dryRun: dryRun$1 = false, verbose = false, customVersion = null, autoCommit = true, push = true, tag = true, tagPrefix = "v", changelog = true, allowUncommitted = false } = options;
842
+ if (!this.exists()) throw new Error(`Cargo.toml 文件不存在: ${this.cargoTomlPath}`);
843
+ const oldVersion = this.getCurrentVersion();
844
+ if (!oldVersion) throw new Error(`Cargo.toml 文件中未找到 [package] 部分的 version 字段`);
845
+ const packageName = this.getPackageName() || "rust";
846
+ let newVersion = null;
847
+ if (customVersion) {
848
+ if (!semver.valid(customVersion)) throw new Error(`无效的自定义版本号: ${customVersion}`);
849
+ newVersion = customVersion;
850
+ } else {
851
+ let semverType = releaseType;
852
+ let prerelease;
853
+ if (releaseType === "pre-patch") {
854
+ semverType = "prepatch";
855
+ prerelease = "beta";
856
+ } else if (releaseType === "pre-minor") {
857
+ semverType = "preminor";
858
+ prerelease = "beta";
859
+ } else if (releaseType === "pre-major") {
860
+ semverType = "premajor";
861
+ prerelease = "beta";
862
+ } else if (releaseType === "prerelease") {
863
+ semverType = "prerelease";
864
+ prerelease = "beta";
865
+ }
866
+ if (prerelease) newVersion = semver.inc(oldVersion, semverType, prerelease);
867
+ else newVersion = semver.inc(oldVersion, semverType);
868
+ if (!newVersion) throw new Error(`无法计算新版本,当前版本 "${oldVersion}",版本类型 "${releaseType}"`);
869
+ }
870
+ if (!semver.valid(newVersion)) throw new Error(`计算出的新版本 "${newVersion}" 不是有效的 semver 版本号`);
871
+ if (verbose) {
872
+ logger_default.info(`读取 Cargo.toml: ${this.cargoTomlPath}`);
873
+ logger_default.info(`当前版本: ${oldVersion}`);
874
+ logger_default.info(`新版本: ${newVersion}`);
875
+ }
876
+ if (!dryRun$1 && autoCommit && !allowUncommitted && this.gitManager.hasUncommittedChanges()) throw new Error("存在未提交的更改,请先提交或使用 --allow-uncommitted 选项");
877
+ if (dryRun$1) {
878
+ const tagName = `${packageName}@${newVersion}`;
879
+ logger_default.info(`\n🔍 Dry-run 模式 - Cargo.toml 版本更新预览:`);
880
+ logger_default.info(` 当前版本: ${oldVersion}`);
881
+ logger_default.info(` 新版本: ${newVersion}`);
882
+ logger_default.info(` Tag: ${tag ? tagName : "跳过"}`);
883
+ logger_default.info(` CHANGELOG: ${changelog ? "是" : "跳过"}`);
884
+ logger_default.info(` Git Commit: ${autoCommit ? "是" : "否"}`);
885
+ logger_default.info(` Git Push: ${push ? "是" : "否"}`);
886
+ logger_default.info(`\n✅ 以上为预览,未执行任何实际操作`);
887
+ return {
888
+ success: true,
889
+ oldVersion,
890
+ newVersion
891
+ };
892
+ }
893
+ this.writeVersion(newVersion);
894
+ const verifiedVersion = this.getCurrentVersion();
895
+ if (verifiedVersion !== newVersion) throw new Error(`版本更新验证失败,期望版本 "${newVersion}",实际版本 "${verifiedVersion}"`);
896
+ logger_default.success(`Cargo.toml 版本更新完成: ${oldVersion} → ${newVersion}`);
897
+ if (changelog) try {
898
+ const commits = this.gitManager.getCommitsSinceLastTag();
899
+ this.changelogManager.updateChangelog(newVersion, commits);
900
+ logger_default.success(`已更新 CHANGELOG.md`);
901
+ } catch (error$1) {
902
+ logger_default.warn(`更新 CHANGELOG.md 失败: ${error$1.message}`);
903
+ }
904
+ if (autoCommit) {
905
+ try {
906
+ this.gitManager.addFiles(["-u"]);
907
+ this.gitManager.commit(`chore: bump version to ${newVersion}`);
908
+ logger_default.success(`已提交更改`);
909
+ } catch (error$1) {
910
+ logger_default.warn(`提交更改失败: ${error$1.message}`);
911
+ }
912
+ if (tag) {
913
+ const tagName = `${packageName}@${newVersion}`;
914
+ try {
915
+ execSync(`git tag -a ${tagName} -m "Release ${tagName}"`, {
916
+ cwd: this.rootDir,
917
+ stdio: "pipe"
918
+ });
919
+ logger_default.success(`已创建 tag: ${tagName}`);
920
+ } catch (error$1) {
921
+ logger_default.warn(`创建 tag ${tagName} 失败: ${error$1.message}`);
922
+ }
923
+ }
924
+ if (push) try {
925
+ this.gitManager.push(tag);
926
+ logger_default.success(`已推送 commits 和 tags`);
927
+ } catch (error$1) {
928
+ logger_default.warn(`推送失败: ${error$1.message}`);
929
+ }
930
+ }
931
+ return {
932
+ success: true,
933
+ oldVersion,
934
+ newVersion
935
+ };
936
+ }
937
+ writeVersion(newVersion) {
938
+ try {
939
+ const content = readFileSync(this.cargoTomlPath, "utf8");
940
+ const lines = content.split("\n");
941
+ let inPackageSection = false;
942
+ let versionUpdated = false;
943
+ const newLines = lines.map((line) => {
944
+ const trimmedLine = line.trim();
945
+ if (trimmedLine.startsWith("[package]")) {
946
+ inPackageSection = true;
947
+ return line;
948
+ }
949
+ if (trimmedLine.startsWith("[") && inPackageSection) {
950
+ inPackageSection = false;
951
+ return line;
952
+ }
953
+ if (inPackageSection) {
954
+ const versionMatch = trimmedLine.match(/^version\s*=\s*["'](.+?)["']/);
955
+ if (versionMatch) {
956
+ versionUpdated = true;
957
+ const spaces = line.match(/^\s*/)?.[0] || "";
958
+ const quote = versionMatch[0].includes("\"") ? "\"" : "'";
959
+ return `${spaces}version = ${quote}${newVersion}${quote}`;
960
+ }
961
+ }
962
+ return line;
963
+ });
964
+ if (!versionUpdated) {
965
+ let packageSectionIndex = -1;
966
+ for (let i = 0; i < lines.length; i++) if (lines[i].trim().startsWith("[package]")) {
967
+ packageSectionIndex = i;
968
+ break;
969
+ }
970
+ if (packageSectionIndex !== -1) newLines.splice(packageSectionIndex + 1, 0, `version = "${newVersion}"`);
971
+ else newLines.unshift("[package]", `version = "${newVersion}"`);
972
+ }
973
+ writeFileSync(this.cargoTomlPath, newLines.join("\n"), { encoding: "utf8" });
974
+ } catch (error$1) {
975
+ throw new Error(`写入 Cargo.toml 失败: ${error$1.message}`);
976
+ }
977
+ }
978
+ };
979
+
801
980
  //#endregion
802
981
  //#region src/utils/security.ts
803
982
  var security_exports = {};
@@ -825,6 +1004,61 @@ function sanitizeFileName(name) {
825
1004
  return name.replace(/[<>:"/\\|?*]/g, "_");
826
1005
  }
827
1006
 
1007
+ //#endregion
1008
+ //#region src/utils/semver.ts
1009
+ var semver_exports = {};
1010
+ __export(semver_exports, {
1011
+ coerceVersion: () => coerceVersion,
1012
+ compareVersions: () => compareVersions,
1013
+ getMajor: () => getMajor,
1014
+ getMinor: () => getMinor,
1015
+ getPatch: () => getPatch,
1016
+ getVersionDiff: () => getVersionDiff,
1017
+ incrementVersion: () => incrementVersion,
1018
+ isPrerelease: () => isPrerelease,
1019
+ isValidVersion: () => isValidVersion,
1020
+ parseVersion: () => parseVersion
1021
+ });
1022
+ function isValidVersion(version) {
1023
+ return semver.valid(version) !== null;
1024
+ }
1025
+ function parseVersion(version) {
1026
+ return semver.parse(version);
1027
+ }
1028
+ function incrementVersion(currentVersion, releaseType, identifier) {
1029
+ if (identifier) return semver.inc(currentVersion, releaseType, identifier);
1030
+ return semver.inc(currentVersion, releaseType);
1031
+ }
1032
+ function compareVersions(v1, v2) {
1033
+ return semver.compare(v1, v2);
1034
+ }
1035
+ function getVersionDiff(oldVersion, newVersion) {
1036
+ if (!semver.valid(oldVersion) || !semver.valid(newVersion)) return null;
1037
+ if (semver.major(newVersion) > semver.major(oldVersion)) return "major";
1038
+ if (semver.minor(newVersion) > semver.minor(oldVersion)) return "minor";
1039
+ if (semver.patch(newVersion) > semver.patch(oldVersion)) return "patch";
1040
+ return null;
1041
+ }
1042
+ function isPrerelease(version) {
1043
+ return semver.prerelease(version) !== null;
1044
+ }
1045
+ function coerceVersion(version) {
1046
+ const coerced = semver.coerce(version);
1047
+ return coerced?.version || null;
1048
+ }
1049
+ function getMajor(version) {
1050
+ const parsed = semver.parse(version);
1051
+ return parsed?.major ?? null;
1052
+ }
1053
+ function getMinor(version) {
1054
+ const parsed = semver.parse(version);
1055
+ return parsed?.minor ?? null;
1056
+ }
1057
+ function getPatch(version) {
1058
+ const parsed = semver.parse(version);
1059
+ return parsed?.patch ?? null;
1060
+ }
1061
+
828
1062
  //#endregion
829
1063
  //#region src/core/VersionManager.ts
830
1064
  var VersionManager = class {
@@ -891,6 +1125,140 @@ var VersionManager = class {
891
1125
  packages: Array.from(this.packageCache.keys())
892
1126
  };
893
1127
  }
1128
+ async previewUpdate(pkgName, releaseType = "patch", options = {}) {
1129
+ const { packagePaths = this.packagePaths, customVersion = null, autoCommit = this.gitConfig.autoCommit !== false, push = this.gitConfig.push !== false, npm = false, changelog = this.gitConfig.changelog !== false, tagPrefix = this.gitConfig.tagPrefix || "v", packageVersionSelections } = options;
1130
+ const packages = [];
1131
+ if (pkgName === "all" && packageVersionSelections) for (const [packageName, selection] of Object.entries(packageVersionSelections)) {
1132
+ const pkgPath = packagePaths[packageName];
1133
+ if (!pkgPath) throw new Error(`无效的包名: ${packageName}`);
1134
+ const pkg = this.getPackageInfo(pkgPath);
1135
+ let newVersion = null;
1136
+ if (selection.customVersion) {
1137
+ if (!isValidVersion(selection.customVersion)) throw new Error(`无效的自定义版本号: ${selection.customVersion}`);
1138
+ newVersion = selection.customVersion;
1139
+ } else try {
1140
+ switch (selection.type) {
1141
+ case "major":
1142
+ case "minor":
1143
+ case "patch":
1144
+ newVersion = incrementVersion(pkg.version, selection.type);
1145
+ break;
1146
+ case "next":
1147
+ newVersion = incrementVersion(pkg.version, "patch");
1148
+ break;
1149
+ case "pre-patch":
1150
+ if (isPrerelease(pkg.version)) newVersion = incrementVersion(pkg.version, "prerelease", "beta");
1151
+ else newVersion = incrementVersion(pkg.version, "prepatch", "beta");
1152
+ break;
1153
+ case "pre-minor":
1154
+ if (isPrerelease(pkg.version)) {
1155
+ const currentMinor = getMinor(pkg.version) ?? 0;
1156
+ const potentialVersion = incrementVersion(pkg.version, "preminor", "beta");
1157
+ if (potentialVersion && (getMinor(potentialVersion) ?? 0) > currentMinor) newVersion = potentialVersion;
1158
+ else newVersion = incrementVersion(pkg.version, "prerelease", "beta");
1159
+ } else newVersion = incrementVersion(pkg.version, "preminor", "beta");
1160
+ break;
1161
+ case "pre-major":
1162
+ if (isPrerelease(pkg.version)) {
1163
+ const currentMajor = getMajor(pkg.version) ?? 0;
1164
+ const potentialVersion = incrementVersion(pkg.version, "premajor", "beta");
1165
+ if (potentialVersion && (getMajor(potentialVersion) ?? 0) > currentMajor) newVersion = potentialVersion;
1166
+ else newVersion = incrementVersion(pkg.version, "prerelease", "beta");
1167
+ } else newVersion = incrementVersion(pkg.version, "premajor", "beta");
1168
+ break;
1169
+ case "as-is":
1170
+ newVersion = pkg.version;
1171
+ break;
1172
+ case "conventional":
1173
+ newVersion = incrementVersion(pkg.version, "patch");
1174
+ break;
1175
+ default: throw new Error(`不支持的版本类型: ${selection.type}`);
1176
+ }
1177
+ } catch (error$1) {
1178
+ throw new Error(`版本计算失败: ${error$1.message}`);
1179
+ }
1180
+ if (!newVersion) throw new Error(`无法计算新版本号,当前版本: ${pkg.version},类型: ${selection.type}`);
1181
+ const isDefaultPackage = packageName === "default" || packagePaths[packageName] === "package.json";
1182
+ const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`;
1183
+ packages.push({
1184
+ name: packageName,
1185
+ oldVersion: pkg.version,
1186
+ newVersion,
1187
+ tagName,
1188
+ changelogEnabled: changelog && isDefaultPackage,
1189
+ isDefaultPackage
1190
+ });
1191
+ }
1192
+ else {
1193
+ const targets = pkgName === "all" ? Object.values(packagePaths) : [packagePaths[pkgName]];
1194
+ if (!targets.length || targets.some((path) => !path)) throw new Error(`无效的包名: ${pkgName}`);
1195
+ for (const pkgPath of targets) {
1196
+ const pkg = this.getPackageInfo(pkgPath);
1197
+ let newVersion = null;
1198
+ if (customVersion) {
1199
+ if (!isValidVersion(customVersion)) throw new Error(`无效的自定义版本号: ${customVersion}`);
1200
+ newVersion = customVersion;
1201
+ } else try {
1202
+ switch (releaseType) {
1203
+ case "major":
1204
+ case "minor":
1205
+ case "patch":
1206
+ newVersion = incrementVersion(pkg.version, releaseType);
1207
+ break;
1208
+ case "next":
1209
+ newVersion = incrementVersion(pkg.version, "patch");
1210
+ break;
1211
+ case "pre-patch":
1212
+ if (isPrerelease(pkg.version)) newVersion = incrementVersion(pkg.version, "prerelease", "beta");
1213
+ else newVersion = incrementVersion(pkg.version, "prepatch", "beta");
1214
+ break;
1215
+ case "pre-minor":
1216
+ if (isPrerelease(pkg.version)) {
1217
+ const currentMinor = getMinor(pkg.version) ?? 0;
1218
+ const potentialVersion = incrementVersion(pkg.version, "preminor", "beta");
1219
+ if (potentialVersion && (getMinor(potentialVersion) ?? 0) > currentMinor) newVersion = potentialVersion;
1220
+ else newVersion = incrementVersion(pkg.version, "prerelease", "beta");
1221
+ } else newVersion = incrementVersion(pkg.version, "preminor", "beta");
1222
+ break;
1223
+ case "pre-major":
1224
+ if (isPrerelease(pkg.version)) {
1225
+ const currentMajor = getMajor(pkg.version) ?? 0;
1226
+ const potentialVersion = incrementVersion(pkg.version, "premajor", "beta");
1227
+ if (potentialVersion && (getMajor(potentialVersion) ?? 0) > currentMajor) newVersion = potentialVersion;
1228
+ else newVersion = incrementVersion(pkg.version, "prerelease", "beta");
1229
+ } else newVersion = incrementVersion(pkg.version, "premajor", "beta");
1230
+ break;
1231
+ case "as-is":
1232
+ newVersion = pkg.version;
1233
+ break;
1234
+ case "conventional":
1235
+ newVersion = incrementVersion(pkg.version, "patch");
1236
+ break;
1237
+ default: throw new Error(`不支持的版本类型: ${releaseType}`);
1238
+ }
1239
+ } catch (error$1) {
1240
+ throw new Error(`版本计算失败: ${error$1.message}`);
1241
+ }
1242
+ if (!newVersion) throw new Error(`无法计算新版本号,当前版本: ${pkg.version},类型: ${releaseType}`);
1243
+ const isDefaultPackage = pkgName === "default" || packagePaths[pkgName] === "package.json";
1244
+ const tagName = isDefaultPackage ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`;
1245
+ packages.push({
1246
+ name: pkg.name,
1247
+ oldVersion: pkg.version,
1248
+ newVersion,
1249
+ tagName,
1250
+ changelogEnabled: changelog && isDefaultPackage,
1251
+ isDefaultPackage
1252
+ });
1253
+ }
1254
+ }
1255
+ return {
1256
+ packages,
1257
+ autoCommit,
1258
+ push,
1259
+ npm
1260
+ };
1261
+ }
894
1262
  async updateVersion(pkgName, releaseType = "patch", options = {}) {
895
1263
  const { dryRun: dryRun$1 = false, verbose = false, packagePaths = this.packagePaths, customVersion = null, autoCommit = this.gitConfig.autoCommit !== false, npm = false, changelog = this.gitConfig.changelog !== false, tag = this.gitConfig.tag !== false, tagPrefix = this.gitConfig.tagPrefix || "v", isBatchMode = false } = options;
896
1264
  const result = {
@@ -908,43 +1276,43 @@ var VersionManager = class {
908
1276
  const pkg = this.getPackageInfo(pkgPath);
909
1277
  let newVersion = null;
910
1278
  if (customVersion) {
911
- if (!semver.valid(customVersion)) throw new Error(`无效的自定义版本号: ${customVersion}`);
1279
+ if (!isValidVersion(customVersion)) throw new Error(`无效的自定义版本号: ${customVersion}`);
912
1280
  newVersion = customVersion;
913
1281
  } else try {
914
1282
  switch (releaseType) {
915
1283
  case "major":
916
1284
  case "minor":
917
1285
  case "patch":
918
- newVersion = semver.inc(pkg.version, releaseType);
1286
+ newVersion = incrementVersion(pkg.version, releaseType);
919
1287
  break;
920
1288
  case "next":
921
- newVersion = semver.inc(pkg.version, "patch");
1289
+ newVersion = incrementVersion(pkg.version, "patch");
922
1290
  break;
923
1291
  case "pre-patch":
924
- if (semver.prerelease(pkg.version)) newVersion = semver.inc(pkg.version, "prerelease");
925
- else newVersion = semver.inc(pkg.version, "prepatch", "beta");
1292
+ if (isPrerelease(pkg.version)) newVersion = incrementVersion(pkg.version, "prerelease", "beta");
1293
+ else newVersion = incrementVersion(pkg.version, "prepatch", "beta");
926
1294
  break;
927
1295
  case "pre-minor":
928
- if (semver.prerelease(pkg.version)) {
929
- const currentMinor = semver.minor(pkg.version);
930
- const potentialVersion = semver.inc(pkg.version, "preminor", "beta");
931
- if (potentialVersion && semver.minor(potentialVersion) > currentMinor) newVersion = potentialVersion;
932
- else newVersion = semver.inc(pkg.version, "prerelease");
933
- } else newVersion = semver.inc(pkg.version, "preminor", "beta");
1296
+ if (isPrerelease(pkg.version)) {
1297
+ const currentMinor = getMinor(pkg.version) ?? 0;
1298
+ const potentialVersion = incrementVersion(pkg.version, "preminor", "beta");
1299
+ if (potentialVersion && (getMinor(potentialVersion) ?? 0) > currentMinor) newVersion = potentialVersion;
1300
+ else newVersion = incrementVersion(pkg.version, "prerelease", "beta");
1301
+ } else newVersion = incrementVersion(pkg.version, "preminor", "beta");
934
1302
  break;
935
1303
  case "pre-major":
936
- if (semver.prerelease(pkg.version)) {
937
- const currentMajor = semver.major(pkg.version);
938
- const potentialVersion = semver.inc(pkg.version, "premajor", "beta");
939
- if (potentialVersion && semver.major(potentialVersion) > currentMajor) newVersion = potentialVersion;
940
- else newVersion = semver.inc(pkg.version, "prerelease");
941
- } else newVersion = semver.inc(pkg.version, "premajor", "beta");
1304
+ if (isPrerelease(pkg.version)) {
1305
+ const currentMajor = getMajor(pkg.version) ?? 0;
1306
+ const potentialVersion = incrementVersion(pkg.version, "premajor", "beta");
1307
+ if (potentialVersion && (getMajor(potentialVersion) ?? 0) > currentMajor) newVersion = potentialVersion;
1308
+ else newVersion = incrementVersion(pkg.version, "prerelease", "beta");
1309
+ } else newVersion = incrementVersion(pkg.version, "premajor", "beta");
942
1310
  break;
943
1311
  case "as-is":
944
1312
  newVersion = pkg.version;
945
1313
  break;
946
1314
  case "conventional":
947
- newVersion = semver.inc(pkg.version, "patch");
1315
+ newVersion = incrementVersion(pkg.version, "patch");
948
1316
  break;
949
1317
  default: throw new Error(`不支持的版本类型: ${releaseType}`);
950
1318
  }
@@ -954,7 +1322,9 @@ var VersionManager = class {
954
1322
  if (!newVersion) throw new Error(`无法计算新版本号,当前版本: ${pkg.version},类型: ${releaseType}`);
955
1323
  if (!finalVersion) {
956
1324
  finalVersion = newVersion;
957
- if (!dryRun$1 && this.gitManager.checkVersionExists(newVersion, tagPrefix)) throw new Error(`版本 ${tagPrefix}${newVersion} 已存在,请使用其他版本`);
1325
+ const isDefaultPackage$1 = pkgName === "default" || this.config.packagePaths[pkgName] === "package.json";
1326
+ const versionTag = isDefaultPackage$1 ? `${tagPrefix}${newVersion}` : `${pkg.name}@${newVersion}`;
1327
+ if (!dryRun$1 && this.gitManager.checkVersionExists(newVersion, tagPrefix, isDefaultPackage$1 ? void 0 : pkg.name)) throw new Error(`版本 ${versionTag} 已存在,请使用其他版本`);
958
1328
  }
959
1329
  if (dryRun$1) logger_default.dryRun(`将更新 ${pkg.name} 从 v${pkg.version} 到 v${newVersion}`);
960
1330
  else {
@@ -968,7 +1338,8 @@ var VersionManager = class {
968
1338
  result.updatedPackages.push({
969
1339
  name: pkg.name,
970
1340
  oldVersion: pkg.version,
971
- newVersion
1341
+ newVersion,
1342
+ pkgKey: pkgName
972
1343
  });
973
1344
  }
974
1345
  const isDefaultPackage = pkgName === "default" || this.config.packagePaths[pkgName] === "package.json";
@@ -1116,17 +1487,37 @@ var VersionManager = class {
1116
1487
  }
1117
1488
  }
1118
1489
  isValidVersion(version) {
1119
- return semver.valid(version) !== null;
1490
+ return isValidVersion(version);
1120
1491
  }
1121
1492
  getVersionDiff(oldVersion, newVersion) {
1122
- if (!semver.valid(oldVersion) || !semver.valid(newVersion)) return null;
1123
- if (semver.major(newVersion) > semver.major(oldVersion)) return "major";
1124
- if (semver.minor(newVersion) > semver.minor(oldVersion)) return "minor";
1125
- if (semver.patch(newVersion) > semver.patch(oldVersion)) return "patch";
1493
+ if (!isValidVersion(oldVersion) || !isValidVersion(newVersion)) return null;
1494
+ if ((getMajor(newVersion) ?? 0) > (getMajor(oldVersion) ?? 0)) return "major";
1495
+ if ((getMinor(newVersion) ?? 0) > (getMinor(oldVersion) ?? 0)) return "minor";
1496
+ if ((getPatch(newVersion) ?? 0) > (getPatch(oldVersion) ?? 0)) return "patch";
1126
1497
  return null;
1127
1498
  }
1128
1499
  };
1129
1500
 
1130
1501
  //#endregion
1131
- export { BASE_CONFIG, ChangelogManager, GitManager, VersionManager, clearConfigCache, loadConfig, loadConfigAsync, logger_default, security_exports };
1132
- //# sourceMappingURL=VersionManager-CwsuNWyP.js.map
1502
+ //#region src/utils/path.ts
1503
+ var path_exports = {};
1504
+ __export(path_exports, {
1505
+ isAbsolutePath: () => isAbsolutePath,
1506
+ isPathLike: () => isPathLike,
1507
+ resolvePath: () => resolvePath
1508
+ });
1509
+ function isPathLike(arg) {
1510
+ 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(".");
1511
+ }
1512
+ function resolvePath(basePath, targetPath) {
1513
+ const { resolve: resolve$1 } = __require("node:path");
1514
+ if (targetPath.startsWith("/") || /^[a-z]:\\/i.test(targetPath)) return resolve$1(targetPath);
1515
+ return resolve$1(basePath, targetPath);
1516
+ }
1517
+ function isAbsolutePath(path) {
1518
+ return path.startsWith("/") || /^[a-z]:\\/i.test(path) || path.startsWith("\\\\") || path.startsWith("//");
1519
+ }
1520
+
1521
+ //#endregion
1522
+ export { BASE_CONFIG, ChangelogManager, GitManager, RustManager, VersionManager, clearConfigCache, isPathLike, loadConfig, loadConfigAsync, logger_default, path_exports, security_exports, semver_exports };
1523
+ //# sourceMappingURL=path-Dxq6zEl-.js.map