Reuse the existing draft release and tagged snapshot, skip already-published packages on retry, and sync dev before undrafting so release reruns stop rewriting history and can recover cleanly from partial failures.
43 lines
1.4 KiB
TypeScript
Executable File
43 lines
1.4 KiB
TypeScript
Executable File
#!/usr/bin/env bun
|
|
|
|
import { Script } from "@opencode-ai/script"
|
|
import { $ } from "bun"
|
|
import { fileURLToPath } from "url"
|
|
|
|
const dir = fileURLToPath(new URL("..", import.meta.url))
|
|
process.chdir(dir)
|
|
|
|
async function published(name: string, version: string) {
|
|
return (await $`npm view ${name}@${version} version`.nothrow()).exitCode === 0
|
|
}
|
|
|
|
const pkg = (await import("../package.json").then((m) => m.default)) as {
|
|
name: string
|
|
version: string
|
|
exports: Record<string, unknown>
|
|
}
|
|
const original = JSON.parse(JSON.stringify(pkg))
|
|
function transformExports(exports: Record<string, unknown>) {
|
|
return Object.fromEntries(
|
|
Object.entries(exports).map(([key, value]) => {
|
|
if (typeof value === "string") {
|
|
const file = value.replace("./src/", "./dist/").replace(".ts", "")
|
|
return [key, { import: file + ".js", types: file + ".d.ts" }]
|
|
}
|
|
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
|
|
return [key, transformExports(value)]
|
|
}
|
|
return [key, value]
|
|
}),
|
|
)
|
|
}
|
|
if (await published(pkg.name, pkg.version)) {
|
|
console.log(`already published ${pkg.name}@${pkg.version}`)
|
|
process.exit(0)
|
|
}
|
|
pkg.exports = transformExports(pkg.exports)
|
|
await Bun.write("package.json", JSON.stringify(pkg, null, 2))
|
|
await $`bun pm pack`
|
|
await $`npm publish *.tgz --tag ${Script.channel} --access public`
|
|
await Bun.write("package.json", JSON.stringify(original, null, 2))
|