diff --git a/publish-package.mjs b/publish-package.mjs index 9a1c6c5a513..a33da872af6 100644 --- a/publish-package.mjs +++ b/publish-package.mjs @@ -1,24 +1,63 @@ import { execa } from 'execa'; +import fs from 'fs/promises'; +import glob from 'glob'; +import path from 'path'; + +const MAX_RETRIES = 3; +const RETRY_DELAY = 10000; // 10 seconds async function run() { const { stdout: branchName } = await execa('git', ['rev-parse', '--abbrev-ref', 'HEAD']); - // using the environment variable NPM_TOKEN, create a .npmrc file - // and set the token to the value of the environment variable - // Publishing each package, if on master/main branch publish beta versions - // otherwise publish latest - if (branchName === 'release') { - await execa('npx', ['lerna', 'publish', 'from-package', '--no-verify-access', '--yes']); - } else { - await execa('npx', [ - 'lerna', - 'publish', - 'from-package', - '--no-verify-access', - '--yes', - '--dist-tag', - 'beta', - ]); + const lernaJson = JSON.parse(await fs.readFile('lerna.json', 'utf8')); + + const packages = lernaJson.packages; + + const rootDir = process.cwd(); + + for (const packagePathPattern of packages) { + const matchingDirectories = glob.sync(packagePathPattern); + + for (const packageDirectory of matchingDirectories) { + // change back to the root directory + process.chdir(rootDir); + + const packageJsonPath = path.join(packageDirectory, 'package.json'); + + try { + const packageJsonContent = JSON.parse(await fs.readFile(packageJsonPath, 'utf8')); + + if (packageJsonContent.private) { + console.log(`Skipping private package at ${packageDirectory}`); + continue; + } + + process.chdir(packageDirectory); + + let retries = 0; + while (retries < MAX_RETRIES) { + try { + const publishArgs = ['publish']; + + if (branchName === 'master') { + publishArgs.push('--tag', 'beta'); + } + + await execa('npm', publishArgs); + console.log(`Successfully published package at ${packageDirectory}`); + break; + } catch (error) { + retries++; + console.error( + `Failed to publish package at ${packageDirectory} with error ${error}, retrying... (${retries}/${MAX_RETRIES})` + ); + await new Promise(resolve => setTimeout(resolve, RETRY_DELAY)); + } + } + } catch (error) { + console.error(`An error occurred while processing ${packageDirectory}: ${error}`); + } + } } console.log('Finished');