diff --git a/scripts/release.ts b/scripts/release.ts index b664bf1..9b347cd 100644 --- a/scripts/release.ts +++ b/scripts/release.ts @@ -162,8 +162,7 @@ async function stepNpmPublish(): Promise { const answer = await ask("确认发布到 npm? [y/N]: "); if (answer.toLowerCase() !== "y") { - console.log("已取消发布"); - process.exit(0); + throw new CancelledError("已取消发布"); } const proc = Bun.spawn(["bun", "publish", "--access", "public"], { @@ -184,6 +183,24 @@ function writeVersion(version: string): void { writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n"); } +async function revertVersion(): Promise { + console.log("\n回退 package.json 到原始状态..."); + const proc = Bun.spawn(["git", "checkout", "package.json"], { + stdio: ["inherit", "inherit", "inherit"], + }); + const exitCode = await proc.exited; + if (exitCode !== 0) { + throw new Error("git checkout package.json 失败,请手动检查工作区状态"); + } +} + +class CancelledError extends Error { + constructor(message: string) { + super(message); + this.name = "CancelledError"; + } +} + async function main(): Promise { await checkWorkingTree(); @@ -196,10 +213,23 @@ async function main(): Promise { writeVersion(newVersion); console.log(`[2/3] 版本号已更新: ${newVersion}`); + try { + await stepNpmPublish(); + } catch (err) { + if (err instanceof CancelledError) { + console.log(err.message); + await revertVersion(); + console.log("工作区已恢复,无事发生"); + process.exit(0); + } + console.error("npm 发布失败,正在回退..."); + await revertVersion(); + throw err; + } + await stepGitCommitTag(newVersion); console.log(`[3/3] git commit 和 tag v${newVersion} 完成`); - await stepNpmPublish(); console.log("npm 发布完成"); }