Files
payloadcms/scripts/publish-multiple.ts
2023-10-08 13:20:43 -04:00

87 lines
2.3 KiB
TypeScript
Executable File

import fse from 'fs-extra'
import { ExecSyncOptions, execSync } from 'child_process'
import chalk from 'chalk'
import prompts from 'prompts'
import minimist from 'minimist'
const execOpts: ExecSyncOptions = { stdio: 'inherit' }
async function main() {
const args = minimist(process.argv.slice(2))
const { _: packageNames } = args
// If packageNames contains a comma, parse
if (packageNames[0]?.includes(',')) {
packageNames.length = 0
const splitNames = process.argv[2].split(',')
packageNames.push(...splitNames)
}
if (packageNames.length === 0) {
console.error('Please specify a package to publish')
process.exit(1)
}
console.log(`\n${chalk.bold.green('Publishing packages:')}\n`)
console.log(`${packageNames.map((p) => ` ${p}`).join('\n')}`)
console.log('\n')
const { confirm } = await prompts(
{
name: 'confirm',
initial: false,
message: `Publish ${packageNames.length} package(s)?`,
type: 'confirm',
},
{
onCancel: () => {
console.log(chalk.bold.red('\nAborted'))
process.exit(0)
},
},
)
if (!confirm) {
console.log(chalk.bold.red('\nAborted\n'))
process.exit(0)
}
const results: { name: string; success: boolean }[] = []
for (const packageName of packageNames) {
const packageDir = `packages/${packageName}`
try {
console.log(chalk.bold(`Publishing ${packageName}...`))
execSync(`npm --prefix ${packageDir} version pre --preid beta`, execOpts)
execSync(`git add ${packageDir}/package.json`, execOpts)
const packageObj = await fse.readJson(`${packageDir}/package.json`)
const newVersion = packageObj.version
execSync(`git commit -m "chore(release): ${packageName}@${newVersion}"`, execOpts)
execSync(`pnpm publish -C ${packageDir} --tag beta --no-git-checks`, execOpts)
results.push({ name: packageName, success: true })
} catch (error) {
console.error(`ERROR: ${error.message}`)
results.push({ name: packageName, success: false })
}
}
console.log('\n')
console.log(`${chalk.bold('Results:')}\n`)
console.log(
results
.map(
({ name, success }) =>
` ${success ? chalk.bold.green('✔') : chalk.bold.red('✘')} ${name}`,
)
.join('\n'),
)
console.log('\n')
}
main().catch((error) => {
console.error(error)
process.exit(1)
})