diff --git a/README.md b/README.md index f588ab49..e9522153 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ Options: -i --increment [] Increment a version by the specified level. Level can be one of: major, minor, patch, premajor, preminor, - prepatch, or prerelease. Default level is 'patch'. + prepatch, prerelease, or release. Default level is 'patch'. Only one version may be specified. --preid @@ -239,6 +239,13 @@ $ semver 1.2.4-beta.0 -i prerelease 1.2.4-beta.1 ``` +To get out of the prerelease phase, use the `release` option: + +```bash +$ semver 1.2.4-beta.1 -i release +1.2.4 +``` + #### Prerelease Identifier Base The method `.inc` takes an optional parameter 'identifierBase' string @@ -417,10 +424,10 @@ Strict-mode Comparators and Ranges will be strict about the SemVer strings that they parse. * `valid(v)`: Return the parsed version, or null if it's not valid. -* `inc(v, release, options, identifier, identifierBase)`: +* `inc(v, releaseType, options, identifier, identifierBase)`: Return the version incremented by the release type (`major`, `premajor`, `minor`, `preminor`, `patch`, - `prepatch`, or `prerelease`), or null if it's not valid + `prepatch`, `prerelease`, or `release`), or null if it's not valid * `premajor` in one call will bump the version up to the next major version and down to a prerelease of that major version. `preminor`, and `prepatch` work the same way. @@ -428,6 +435,7 @@ strings that they parse. same as `prepatch`. It increments the patch version and then makes a prerelease. If the input version is already a prerelease it simply increments it. + * `release` will remove any prerelease part of the version. * `identifier` can be used to prefix `premajor`, `preminor`, `prepatch`, or `prerelease` version increments. `identifierBase` is the base to be used for the `prerelease` identifier. diff --git a/bin/semver.js b/bin/semver.js index f62b566f..22fc76ea 100755 --- a/bin/semver.js +++ b/bin/semver.js @@ -61,6 +61,7 @@ const main = () => { switch (argv[0]) { case 'major': case 'minor': case 'patch': case 'prerelease': case 'premajor': case 'preminor': case 'prepatch': + case 'release': inc = argv.shift() break default: @@ -149,7 +150,7 @@ Options: -i --increment [] Increment a version by the specified level. Level can be one of: major, minor, patch, premajor, preminor, - prepatch, or prerelease. Default level is 'patch'. + prepatch, prerelease, or release. Default level is 'patch'. Only one version may be specified. --preid diff --git a/classes/semver.js b/classes/semver.js index 13e66ce4..fd90f0c2 100644 --- a/classes/semver.js +++ b/classes/semver.js @@ -10,7 +10,7 @@ class SemVer { if (version instanceof SemVer) { if (version.loose === !!options.loose && - version.includePrerelease === !!options.includePrerelease) { + version.includePrerelease === !!options.includePrerelease) { return version } else { version = version.version @@ -206,6 +206,12 @@ class SemVer { } this.inc('pre', identifier, identifierBase) break + case 'release': + if (this.prerelease.length === 0) { + throw new Error(`version ${this.raw} is not a prerelease`) + } + this.prerelease.length = 0 + break case 'major': // If this is a pre-major version, bump up to the same major version. diff --git a/tap-snapshots/test/bin/semver.js.test.cjs b/tap-snapshots/test/bin/semver.js.test.cjs index e820ca47..4938f10d 100644 --- a/tap-snapshots/test/bin/semver.js.test.cjs +++ b/tap-snapshots/test/bin/semver.js.test.cjs @@ -70,7 +70,7 @@ Object { -i --increment [] Increment a version by the specified level. Level can be one of: major, minor, patch, premajor, preminor, - prepatch, or prerelease. Default level is 'patch'. + prepatch, prerelease, or release. Default level is 'patch'. Only one version may be specified. --preid @@ -131,7 +131,7 @@ Object { -i --increment [] Increment a version by the specified level. Level can be one of: major, minor, patch, premajor, preminor, - prepatch, or prerelease. Default level is 'patch'. + prepatch, prerelease, or release. Default level is 'patch'. Only one version may be specified. --preid @@ -192,7 +192,7 @@ Object { -i --increment [] Increment a version by the specified level. Level can be one of: major, minor, patch, premajor, preminor, - prepatch, or prerelease. Default level is 'patch'. + prepatch, prerelease, or release. Default level is 'patch'. Only one version may be specified. --preid @@ -253,7 +253,7 @@ Object { -i --increment [] Increment a version by the specified level. Level can be one of: major, minor, patch, premajor, preminor, - prepatch, or prerelease. Default level is 'patch'. + prepatch, prerelease, or release. Default level is 'patch'. Only one version may be specified. --preid @@ -348,6 +348,15 @@ Object { } ` +exports[`test/bin/semver.js TAP inc tests > -i release 1.0.0-pre`] = ` +Object { + "code": 0, + "err": "", + "out": "1.0.0\\n", + "signal": null, +} +` + exports[`test/bin/semver.js TAP sorting and filtering > 1.2.3 -v 3.2.1 --version 2.3.4 -rv 1`] = ` Object { "code": 0, diff --git a/test/fixtures/increments.js b/test/fixtures/increments.js index 65e9530b..bb143a39 100644 --- a/test/fixtures/increments.js +++ b/test/fixtures/increments.js @@ -40,7 +40,12 @@ module.exports = [ ['1.2.3-1', 'premajor', '2.0.0-0'], ['1.2.0-1', 'minor', '1.2.0'], ['1.0.0-1', 'major', '1.0.0'], + ['1.0.0-1', 'release', '1.0.0'], + ['1.2.0-1', 'release', '1.2.0'], + ['1.2.3-1', 'release', '1.2.3'], + ['1.2.3', 'release', null], + // [version, inc, result, identifierIndex, loose, identifier] ['1.2.3', 'major', '2.0.0', false, 'dev'], ['1.2.3', 'minor', '1.3.0', false, 'dev'], ['1.2.3', 'patch', '1.2.4', false, 'dev'], @@ -88,7 +93,7 @@ module.exports = [ ['1.2.3-1.1', 'prerelease', '1.2.3-1.2', false, '1'], ['1.2.3-1.1', 'prerelease', '1.2.3-2.0', false, '2'], - // [version, inc, result, identifierIndex, loose, identifier] + // [version, inc, result, identifierIndex, loose, identifier, identifierBase] ['1.2.0-1', 'prerelease', '1.2.0-alpha.0', false, 'alpha', '0'], ['1.2.1', 'prerelease', '1.2.2-alpha.0', false, 'alpha', '0'], ['0.2.0', 'prerelease', '0.2.1-alpha.0', false, 'alpha', '0'],