publish.ts 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #!/usr/bin/env bun
  2. import { Script } from "@opencode-ai/script"
  3. import { $ } from "bun"
  4. import { fileURLToPath } from "url"
  5. console.log("=== publishing ===\n")
  6. const tag = `v${Script.version}`
  7. const pkgjsons = await Array.fromAsync(
  8. new Bun.Glob("**/package.json").scan({
  9. absolute: true,
  10. }),
  11. ).then((arr) => arr.filter((x) => !x.includes("node_modules") && !x.includes("dist")))
  12. const extensionToml = fileURLToPath(new URL("../packages/extensions/zed/extension.toml", import.meta.url))
  13. async function hasChanges() {
  14. return (await $`git diff --quiet && git diff --cached --quiet`.nothrow()).exitCode !== 0
  15. }
  16. async function releaseTagExists() {
  17. return (await $`git rev-parse -q --verify refs/tags/${tag}`.nothrow()).exitCode === 0
  18. }
  19. async function prepareReleaseFiles() {
  20. for (const file of pkgjsons) {
  21. let pkg = await Bun.file(file).text()
  22. pkg = pkg.replaceAll(/"version": "[^"]+"/g, `"version": "${Script.version}"`)
  23. console.log("updated:", file)
  24. await Bun.file(file).write(pkg)
  25. }
  26. let toml = await Bun.file(extensionToml).text()
  27. toml = toml.replace(/^version = "[^"]+"/m, `version = "${Script.version}"`)
  28. toml = toml.replaceAll(/releases\/download\/v[^/]+\//g, `releases/download/v${Script.version}/`)
  29. console.log("updated:", extensionToml)
  30. await Bun.file(extensionToml).write(toml)
  31. await $`bun install`
  32. await $`./packages/sdk/js/script/build.ts`
  33. }
  34. if (Script.release && !Script.preview) {
  35. await $`git fetch origin --tags`
  36. await $`git switch --detach`
  37. }
  38. await prepareReleaseFiles()
  39. if (Script.release && !Script.preview) {
  40. if (await releaseTagExists()) {
  41. console.log(`release tag ${tag} already exists, skipping tag creation`)
  42. } else {
  43. await $`git commit -am "release: ${tag}"`
  44. await $`git tag ${tag}`
  45. await $`git push origin refs/tags/${tag} --no-verify`
  46. await new Promise((resolve) => setTimeout(resolve, 5_000))
  47. }
  48. }
  49. console.log("\n=== cli ===\n")
  50. await import(`../packages/opencode/script/publish.ts`)
  51. console.log("\n=== sdk ===\n")
  52. await import(`../packages/sdk/js/script/publish.ts`)
  53. console.log("\n=== plugin ===\n")
  54. await import(`../packages/plugin/script/publish.ts`)
  55. if (Script.release) {
  56. await import(`../packages/desktop/scripts/finalize-latest-json.ts`)
  57. await import(`../packages/desktop-electron/scripts/finalize-latest-yml.ts`)
  58. }
  59. if (Script.release && !Script.preview) {
  60. await $`git fetch origin`
  61. await $`git checkout -B dev origin/dev`
  62. await prepareReleaseFiles()
  63. if (await hasChanges()) {
  64. await $`git commit -am "sync release versions for v${Script.version}"`
  65. await $`git push origin HEAD:dev --no-verify`
  66. } else {
  67. console.log(`dev already synced for ${tag}`)
  68. }
  69. }
  70. if (Script.release) {
  71. await $`gh release edit ${tag} --draft=false --repo ${process.env.GH_REPO}`
  72. }
  73. const dir = fileURLToPath(new URL("..", import.meta.url))
  74. process.chdir(dir)