import { readFileSync, writeFileSync } from 'fs' import { resolve } from 'path' import c from 'picocolors' import { inc as _inc, valid } from 'semver' import prompts from 'prompts' import { execa } from 'execa' import { version as currentVersion } from '../package.json' import { fileURLToPath } from 'url' const versionIncrements = ['patch', 'minor', 'major'] const dir = dirname(fileURLToPath(import.meta.url)) const inc = (i) => _inc(currentVersion, i) const run = (bin, args, opts = {}) => execa(bin, args, { stdio: 'inherit', ...opts }) const step = (msg) => console.log(c.cyan(msg)) async function main() { let targetVersion const { release } = await prompts({ type: 'select', name: 'release', message: 'Select release type', choices: versionIncrements.map((i) => `${i} (${inc(i)})`).concat(['custom']) }) if (release === 'custom') { targetVersion = ( await prompts({ type: 'input', name: 'version', message: 'Input custom version', initial: currentVersion }) ).version } else { targetVersion = release.match(/\((.*)\)/)[1] } if (!valid(targetVersion)) { throw new Error(`Invalid target version: ${targetVersion}`) } const { yes: tagOk } = await prompts({ type: 'confirm', name: 'yes', message: `Releasing v${targetVersion}. Confirm?` }) if (!tagOk) { return } // Update the package version. step('\nUpdating the package version...') updatePackage(targetVersion) // Build the package. step('\nBuilding the package...') await run('pnpm', ['build']) // Generate the changelog. step('\nGenerating the changelog...') await run('pnpm', ['changelog']) await run('pnpm', ['prettier', '--write', 'CHANGELOG.md']) const { yes: changelogOk } = await prompts({ type: 'confirm', name: 'yes', message: `Changelog generated. Does it look good?` }) if (!changelogOk) { return } // Commit changes to the Git and create a tag. step('\nCommitting changes...') await run('git', ['add', 'CHANGELOG.md', 'package.json']) await run('git', ['commit', '-m', `release: v${targetVersion}`]) await run('git', ['tag', `v${targetVersion}`]) // Publish the package. step('\nPublishing the package...') await run('pnpm', ['publish', '--ignore-scripts', '--no-git-checks']) // Push to GitHub. step('\nPushing to GitHub...') await run('git', ['push', 'origin', `refs/tags/v${targetVersion}`]) await run('git', ['push']) } function updatePackage(version) { const pkgPath = resolve(resolve(dir, '..'), 'package.json') const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) pkg.version = version writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n') } main().catch((err) => console.error(err))