|
| 1 | +const resolvePath = require('path').resolve |
| 2 | +const readFileSync = require('fs').readFileSync |
| 3 | +const execSync = require('child_process').execSync |
| 4 | +const prompt = require('readline-sync').question |
| 5 | + |
| 6 | +const exec = (command) => |
| 7 | + execSync(command, { stdio: 'inherit' }) |
| 8 | + |
| 9 | +const getPackageVersion = () => |
| 10 | + JSON.parse(readFileSync(resolvePath(__dirname, '../package.json'))).version |
| 11 | + |
| 12 | +if (process.cwd() !== resolvePath(__dirname, '..')) { |
| 13 | + console.error('The release script must be run from the repo root') |
| 14 | + process.exit(1) |
| 15 | +} |
| 16 | + |
| 17 | +// Get the next version, which may be specified as a semver |
| 18 | +// version number or anything `npm version` recognizes. This |
| 19 | +// is a "pre-release" if nextVersion is premajor, preminor, |
| 20 | +// prepatch, or prerelease |
| 21 | +const nextVersion = prompt(`Next version (current version is ${getPackageVersion()})? `) |
| 22 | +const isPrerelease = nextVersion.substring(0, 3) === 'pre' |
| 23 | + |
| 24 | +// 1) Increment the package version in package.json |
| 25 | +// 2) Create a new commit |
| 26 | +// 3) Create a v* tag that points to that commit |
| 27 | +exec(`npm version ${nextVersion} -m "Version %s"`) |
| 28 | + |
| 29 | +// 4) Push to GitHub master. Do this before we publish in |
| 30 | +// case anyone has pushed to GitHub since we last pulled |
| 31 | +exec('git push origin master') |
| 32 | + |
| 33 | +// 5) Publish to npm. Use the "next" tag for pre-releases, |
| 34 | +// "latest" for all others |
| 35 | +exec(`npm publish --tag ${isPrerelease ? 'next' : 'latest'}`) |
| 36 | + |
| 37 | +// 6) Push the v* tag to GitHub |
| 38 | +exec(`git push -f origin v${getPackageVersion()}`) |
| 39 | + |
| 40 | +// 7) Push the "latest" tag to GitHub |
| 41 | +if (!isPrerelease) { |
| 42 | + exec('git tag -f latest') |
| 43 | + exec('git push -f origin latest') |
| 44 | +} |
0 commit comments