#!/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(); }); });