moyf_easy-copy/scripts/bump.mjs
2025-09-15 20:21:55 +08:00

194 lines
No EOL
5.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env node
import { readFileSync, writeFileSync, existsSync } from "fs";
import { createInterface } from "readline";
const rl = createInterface({
input: process.stdin,
output: process.stdout,
});
/**
* 从 package.json 获取当前版本号
* @returns {string} 当前版本号
*/
function getCurrentVersion() {
try {
const packageJson = JSON.parse(readFileSync("package.json", "utf8"));
return packageJson.version;
} catch (error) {
console.error("读取 package.json 失败:", error);
process.exit(1);
}
}
/**
* 解析版本号
* @param {string} version 版本号字符串
* @returns {object} 包含 major, minor, patch 的对象
*/
function parseVersion(version) {
const cleanVersion = version.replace(/-beta.*$/, "");
const parts = cleanVersion.split(".").map(Number);
return {
major: parts[0] || 0,
minor: parts[1] || 0,
patch: parts[2] || 0,
};
}
/**
* 更新所有相关文件的版本号
* @param {string} version 新版本号
*/
function updateAllFiles(version) {
try {
console.log(`\n正在更新至版本 ${version}...`);
// 1. 更新 package.json
updatePackageJson(version);
// 2. 更新 manifest.json
const minAppVersion = updateManifestJson(version);
// 3. 更新 versions.json
updateVersionsJson(version, minAppVersion);
console.log("\n✅ 版本更新完成!");
console.log("\n建议执行以下命令:");
console.log(`git add package.json manifest.json versions.json`);
console.log(`git commit -m "build: bump version to ${version}"`);
console.log(`git tag ${version}`);
console.log(`git push && git push --tags`);
} catch (error) {
console.error("❌ 更新版本时出错:", error);
process.exit(1);
}
}
/**
* 更新 package.json 文件
* @param {string} version 新版本号
*/
function updatePackageJson(version) {
try {
const packageJson = JSON.parse(readFileSync("package.json", "utf8"));
packageJson.version = version;
writeFileSync(
"package.json",
JSON.stringify(packageJson, null, "\t") + "\n"
);
console.log(`📦 已更新 package.json 版本至 ${version}`);
} catch (error) {
console.error("更新 package.json 时出错:", error);
throw error;
}
}
/**
* 更新 manifest.json 文件
* @param {string} version 新版本号
* @returns {string} 最低应用版本
*/
function updateManifestJson(version) {
try {
const manifest = JSON.parse(readFileSync("manifest.json", "utf8"));
const { minAppVersion } = manifest;
manifest.version = version;
writeFileSync(
"manifest.json",
JSON.stringify(manifest, null, "\t") + "\n"
);
console.log(`📋 已更新 manifest.json 版本至 ${version}`);
return minAppVersion;
} catch (error) {
console.error("更新 manifest.json 时出错:", error);
throw error;
}
}
/**
* 更新 versions.json 文件
* @param {string} version 新版本号
* @param {string} minAppVersion 最低应用版本
*/
function updateVersionsJson(version, minAppVersion) {
try {
// 读取或创建 versions.json
let versions = {};
try {
if (existsSync("versions.json")) {
const versionsContent = readFileSync("versions.json", "utf8");
if (versionsContent.trim()) {
versions = JSON.parse(versionsContent);
}
}
} catch (error) {
console.log("创建新的 versions.json 文件");
}
// 更新版本信息
versions[version] = minAppVersion;
writeFileSync(
"versions.json",
JSON.stringify(versions, null, "\t") + "\n"
);
console.log(
`📄 已更新 versions.json添加版本 ${version} -> ${minAppVersion}`
);
} catch (error) {
console.error("更新 versions.json 时出错:", error);
throw error;
}
}
// 主逻辑
const currentVersion = getCurrentVersion();
const { major, minor, patch } = parseVersion(currentVersion);
console.log(`🏷️ 当前版本: ${currentVersion}`);
console.log("\n请选择版本更新类型:");
console.log("1. 📈 大版本 (major) - 不兼容的 API 修改");
console.log("2. ✨ 小版本 (minor) - 新增功能,向后兼容");
console.log("3. 🔧 补丁版本 (patch) - 问题修复,向后兼容");
console.log("4. ✏️ 自定义版本号");
rl.question("\n选择 (1-4): ", (choice) => {
let newVersion;
switch (choice.trim()) {
case "1":
newVersion = `${major + 1}.0.0`;
break;
case "2":
newVersion = `${major}.${minor + 1}.0`;
break;
case "3":
newVersion = `${major}.${minor}.${patch + 1}`;
break;
case "4":
rl.question("请输入自定义版本号 (x.y.z): ", (customVersion) => {
const versionRegex = /^\d+\.\d+\.\d+$/;
if (!versionRegex.test(customVersion.trim())) {
console.log("❌ 版本号格式错误,请使用 x.y.z 格式");
process.exit(1);
}
updateAllFiles(customVersion.trim());
rl.close();
});
return;
default:
console.log("❌ 无效选项,退出...");
process.exit(1);
}
console.log(`\n即将从 ${currentVersion} 更新到 ${newVersion}`);
rl.question("确认更新? (y/N): ", (confirm) => {
if (confirm.toLowerCase() === "y" || confirm.toLowerCase() === "yes") {
updateAllFiles(newVersion);
} else {
console.log("❌ 已取消版本更新");
}
rl.close();
});
});