Permalink
Please sign in to comment.
Showing
with
293 additions
and 21 deletions.
- +22 −7 cli.js
- +1 −1 index.js
- +10 −12 lib/prerequisite.js
- +104 −0 lib/ui.js
- +36 −0 lib/version.js
- +2 −0 package.json
- +1 −0 readme.md
- +1 −1 test.js
- +116 −0 test/version.js
| @@ -0,0 +1,104 @@ | ||
| +'use strict'; | ||
| +const execa = require('execa'); | ||
| +const inquirer = require('inquirer'); | ||
| +const readPkgUp = require('read-pkg-up'); | ||
| +const chalk = require('chalk'); | ||
| +const version = require('./version'); | ||
| + | ||
| +module.exports = options => { | ||
| + const pkg = readPkgUp.sync().pkg; | ||
| + const oldVersion = pkg.version; | ||
| + | ||
| + console.log('\n'); | ||
| + console.log(`Releasing a new version of ${chalk.bold(pkg.name)} ${chalk.gray.dim(`(current version: ${oldVersion})`)}`); | ||
| + console.log('\n'); | ||
| + | ||
| + const prompts = [ | ||
| + { | ||
| + type: 'list', | ||
| + name: 'version', | ||
| + message: 'Select semver increment or specify new version', | ||
| + choices: version.SEMVER_INCREMENTS | ||
| + .map(inc => ({ | ||
| + name: `${inc} ${chalk.gray.dim(`(${version.getNewVersion(oldVersion, inc)})`)}`, | ||
| + value: inc | ||
| + })) | ||
| + .concat([ | ||
| + new inquirer.Separator(), | ||
| + { | ||
| + name: 'Other (specify)', | ||
| + value: null | ||
| + } | ||
| + ]), | ||
| + filter: input => version.isValidVersionInput(input) ? version.getNewVersion(oldVersion, input) : input | ||
| + }, | ||
| + { | ||
| + type: 'input', | ||
| + name: 'version', | ||
| + message: 'Version', | ||
| + when: answers => !answers.version, | ||
| + filter: input => version.isValidVersionInput(input) ? version.getNewVersion(pkg.version, input) : input, | ||
| + validate: input => { | ||
| + if (!version.isValidVersionInput(input)) { | ||
| + return 'Please specify a valid semver, e.g. 1.2.3. See http://semver.org'; | ||
| + } else if (!version.isVersionGreater(oldVersion, input)) { | ||
| + return `Version must be greater than ${oldVersion}`; | ||
| + } | ||
| + return true; | ||
| + } | ||
| + }, | ||
| + { | ||
| + type: 'list', | ||
| + name: 'tag', | ||
| + message: 'How should this pre-release version be tagged in npm?', | ||
| + when: answers => !pkg.private && version.isPrereleaseVersion(answers.version) && !options.tag, | ||
| + choices: () => execa.stdout('npm', ['dist-tag', 'ls']) | ||
| + .then(stdout => { | ||
| + const existingPrereleaseTags = stdout.split('\n') | ||
| + .map(line => line.split(':')[0].replace(/^\s|\s$/, '')) | ||
| + .filter(line => line.toLowerCase() !== 'latest'); | ||
| + | ||
| + if (existingPrereleaseTags.length === 0) { | ||
| + existingPrereleaseTags.push('next'); | ||
| + } | ||
| + | ||
| + return existingPrereleaseTags | ||
| + .concat([ | ||
| + new inquirer.Separator(), | ||
| + { | ||
| + name: 'Other (specify)', | ||
| + value: null | ||
| + } | ||
| + ]); | ||
| + }) | ||
| + }, | ||
| + { | ||
| + type: 'input', | ||
| + name: 'tag', | ||
| + message: 'Tag', | ||
| + when: answers => !pkg.private && version.isPrereleaseVersion(answers.version) && !options.tag && !answers.tag, | ||
| + validate: input => { | ||
| + if (input.length === 0) { | ||
| + return 'Please specify a tag, e.g. next.'; | ||
| + } else if (input.toLowerCase() === 'latest') { | ||
| + return 'It\'s not possible to publish pre-releases under the latest tag. Please specifiy something else, e.g. next.'; | ||
| + } | ||
| + return true; | ||
| + } | ||
| + }, | ||
| + { | ||
| + type: 'confirm', | ||
| + name: 'confirm', | ||
| + message: answers => { | ||
| + const tag = answers.tag || options.tag; | ||
| + const tagPart = tag ? ` and tag this release in npm as ${tag}` : ''; | ||
| + | ||
| + return `Will bump from ${oldVersion} to ${answers.version}${tagPart}. Continue?`; | ||
| + } | ||
| + } | ||
| + ]; | ||
| + | ||
| + return inquirer | ||
| + .prompt(prompts) | ||
| + .then(answers => Object.assign({}, options, answers)); | ||
| +}; |
| @@ -0,0 +1,36 @@ | ||
| +'use strict'; | ||
| +const semver = require('semver'); | ||
| + | ||
| +exports.SEMVER_INCREMENTS = ['patch', 'minor', 'major', 'prepatch', 'preminor', 'premajor', 'prerelease']; | ||
| +exports.PRERELEASE_VERSIONS = ['prepatch', 'preminor', 'premajor', 'prerelease']; | ||
| + | ||
| +function isValidVersion(input) { | ||
| + return Boolean(semver.valid(input)); | ||
| +} | ||
| + | ||
| +exports.isValidVersionInput = input => exports.SEMVER_INCREMENTS.indexOf(input) !== -1 || isValidVersion(input); | ||
| + | ||
| +exports.isPrereleaseVersion = version => exports.PRERELEASE_VERSIONS.indexOf(version) !== -1 || Boolean(semver.prerelease(version)); | ||
| + | ||
| +exports.getNewVersion = (oldVersion, input) => { | ||
| + if (!exports.isValidVersionInput(input)) { | ||
| + throw new Error(`Version should be either ${exports.SEMVER_INCREMENTS.join(', ')} or a valid semver version.`); | ||
| + } | ||
| + return exports.SEMVER_INCREMENTS.indexOf(input) === -1 ? input : semver.inc(oldVersion, input); | ||
| +}; | ||
| + | ||
| +exports.isVersionGreater = (oldVersion, newVersion) => { | ||
| + if (!isValidVersion(newVersion)) { | ||
| + throw new Error('Version should be a valid semver version.'); | ||
| + } | ||
| + return semver.gt(newVersion, oldVersion); | ||
| +}; | ||
| + | ||
| +exports.isVersionLower = (oldVersion, newVersion) => { | ||
| + if (!isValidVersion(newVersion)) { | ||
| + throw new Error('Version should be a valid semver version.'); | ||
| + } | ||
| + return semver.lt(newVersion, oldVersion); | ||
| +}; | ||
| + | ||
| +exports.satisfies = (version, range) => semver.satisfies(version, range); |
Oops, something went wrong.
0 comments on commit
df32774