work-order-monitor/scripts/bump-version.mjs

104 lines
3.0 KiB
JavaScript
Raw Normal View History

2026-03-25 10:06:25 +08:00
/*
* @file /scripts/bump-version.mjs
* @description 统一更新 Tauri 项目版本号
* @author tsl (randy1924@163.com)
* @date 2026-03-23 10:23:42
* @lastModified 2026-03-23 10:25:08
* @lastModifiedBy tsl (randy1924@163.com)
* @example node scripts/bump-version.mjs [patch|minor|major|x.y.z]
* @default patch
*/
import { readFileSync, writeFileSync } from "node:fs";
import { resolve, dirname } from "node:path";
import { fileURLToPath } from "node:url";
const __dirname = dirname(fileURLToPath(import.meta.url));
const root = resolve(__dirname, "..");
// 读取当前版本
function getCurrentVersion() {
const pkg = JSON.parse(readFileSync(resolve(root, "package.json"), "utf-8"));
return pkg.version;
}
// 根据 bump 类型计算新版本
function bumpVersion(current, type) {
const parts = current.replace(/-.*$/, "").split(".").map(Number);
switch (type) {
case "major":
return `${parts[0] + 1}.0.0`;
case "minor":
return `${parts[0]}.${parts[1] + 1}.0`;
case "patch":
return `${parts[0]}.${parts[1]}.${parts[2] + 1}`;
default:
return null;
}
}
const arg = process.argv[2] || "patch";
const BUMP_TYPES = ["patch", "minor", "major"];
const current = getCurrentVersion();
let version;
if (BUMP_TYPES.includes(arg)) {
version = bumpVersion(current, arg);
} else if (/^\d+\.\d+\.\d+(-[a-zA-Z0-9.]+)?$/.test(arg)) {
version = arg;
} else {
console.error(`错误: 无效参数 "${arg}",应为 patch / minor / major 或 x.y.z 格式`);
process.exit(1);
}
const files = [
{
path: "package.json",
update(content) {
const json = JSON.parse(content);
const old = json.version;
json.version = version;
return { result: JSON.stringify(json, null, 2) + "\n", old };
},
},
{
path: "src-tauri/tauri.conf.json",
update(content) {
const json = JSON.parse(content);
const old = json.version;
json.version = version;
return { result: JSON.stringify(json, null, 2) + "\n", old };
},
},
{
path: "src-tauri/Cargo.toml",
update(content) {
let old = "";
let replaced = false;
const result = content.replace(
/^version\s*=\s*"([^"]*)"/m,
(match, v) => {
if (replaced) return match;
replaced = true;
old = v;
return `version = "${version}"`;
}
);
return { result, old };
},
},
];
console.log(`\n${current}${version} (${BUMP_TYPES.includes(arg) ? arg : "指定版本"})\n`);
for (const file of files) {
const filePath = resolve(root, file.path);
const content = readFileSync(filePath, "utf-8");
const { result, old } = file.update(content);
writeFileSync(filePath, result, "utf-8");
console.log(`${file.path} ${old}${version}`);
}
console.log("\n全部更新完成!");
console.log("提示: package-lock.json 和 Cargo.lock 会在下次 install/build 时自动同步\n");