diff --git a/scripts/publish.ts b/scripts/publish.ts index b3676c2f5..78d952717 100755 --- a/scripts/publish.ts +++ b/scripts/publish.ts @@ -1,39 +1,58 @@ #!/usr/bin/env ts-node import compare from "semver/functions/compare" -import { execSync } from "child_process" +import { spawn } from "child_process" import contractsPkgJson from "@semaphore-protocol/contracts/package.json" const { version: contractsLocalVersion } = contractsPkgJson +interface SoldeerResponse { + data: { version: string }[] +} + +function run(command: string, args: string[] = []) { + return new Promise((resolve, reject) => { + const child = spawn(command, args, { stdio: "inherit", shell: true }) + child.on("exit", (code) => { + if (code === 0) resolve() + else reject(new Error(`${command} ${args.join(" ")} failed with code ${code}`)) + }) + }) +} + async function maybePushToSoldeer() { - // api not documented, may change, found by inspecting the network tab const response = await fetch( "https://api.soldeer.xyz/api/v1/revision?project_name=semaphore-protocol-contracts&limit=1" ) - const { data } = await response.json() + const { data }: SoldeerResponse = await response.json() - if ( - data.length === 0 || // data = [] if no version has ever been published yet - compare(contractsLocalVersion, data[0].version) === 1 - ) - execSync(`soldeer push semaphore-protocol-contracts~${contractsLocalVersion} packages/contracts/contracts`, { - stdio: "inherit" - }) + if (data.length === 0 || compare(contractsLocalVersion, data[0].version) === 1) { + await run("soldeer", [ + "push", + `semaphore-protocol-contracts~${contractsLocalVersion}`, + "packages/contracts/contracts", + ]) + } } async function main() { - execSync(`yarn build:libraries`, { stdio: "inherit" }) - execSync(`yarn clean:cli-templates`) - execSync(`yarn workspaces foreach -A --no-private npm publish --tolerate-republish --access public`, { - stdio: "inherit" - }) + await run("yarn", ["build:libraries"]) + await run("yarn", ["clean:cli-templates"]) + await run("yarn", [ + "workspaces", + "foreach", + "-A", + "--no-private", + "npm", + "publish", + "--tolerate-republish", + "--access", + "public", + ]) await maybePushToSoldeer() } -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error) - process.exit(1) - }) +main().catch((error) => { + console.error(error) + process.exitCode = 1 +})