Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,8 @@ strings that they parse.
* `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.
If the version is already a prerelease of that release type, the
numeric version is not incremented again (same as `major`/`minor`/`patch`).
* If called from a non-prerelease version, `prerelease` will work the
same as `prepatch`. It increments the patch version and then makes a
prerelease. If the input version is already a prerelease it simply
Expand Down
15 changes: 4 additions & 11 deletions classes/semver.js
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,8 @@ class SemVer {

// preminor will bump the version up to the next minor release, and immediately
// down to pre-release. premajor and prepatch work the same way.
// These compose as major/minor/patch (which already skip a numeric bump when
// the version is a prerelease of that release type) followed by pre.
inc (release, identifier, identifierBase) {
if (release.startsWith('pre')) {
if (!identifier && identifierBase === false) {
Expand All @@ -223,23 +225,14 @@ class SemVer {

switch (release) {
case 'premajor':
this.prerelease.length = 0
this.patch = 0
this.minor = 0
this.major++
this.inc('major', identifier, identifierBase)
this.inc('pre', identifier, identifierBase)
break
case 'preminor':
this.prerelease.length = 0
this.patch = 0
this.minor++
this.inc('minor', identifier, identifierBase)
this.inc('pre', identifier, identifierBase)
break
case 'prepatch':
// If this is already a prerelease, it will bump to the next version
// drop any prereleases that might already exist, since they are not
// relevant at this point.
this.prerelease.length = 0
this.inc('patch', identifier, identifierBase)
this.inc('pre', identifier, identifierBase)
break
Expand Down
28 changes: 22 additions & 6 deletions test/fixtures/increments.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ module.exports = [
['1.2.3-alpha.11.beta', 'prerelease', '1.2.3-alpha.12.beta'],
['1.0.0', 'prepatch', '1.0.1-alpha.1.1a.0', null, 'alpha.1.1a'],
['1.2.0', 'prepatch', '1.2.1-0'],
['1.2.0-1', 'prepatch', '1.2.1-0'],
['1.2.0-1', 'prepatch', '1.2.0-0'],
['1.2.0', 'preminor', '1.3.0-0'],
['1.2.3-1', 'preminor', '1.3.0-0'],
['1.2.0', 'premajor', '2.0.0-0'],
Expand Down Expand Up @@ -88,7 +88,7 @@ module.exports = [
['1.2.3-alpha.10.beta', 'prerelease', '1.2.3-alpha.11.beta', false, 'alpha'],
['1.2.3-alpha.11.beta', 'prerelease', '1.2.3-alpha.12.beta', false, 'alpha'],
['1.2.0', 'prepatch', '1.2.1-dev.0', false, 'dev'],
['1.2.0-1', 'prepatch', '1.2.1-dev.0', false, 'dev'],
['1.2.0-1', 'prepatch', '1.2.0-dev.0', false, 'dev'],
['1.2.0', 'preminor', '1.3.0-dev.0', false, 'dev'],
['1.2.3-1', 'preminor', '1.3.0-dev.0', false, 'dev'],
['1.2.0', 'premajor', '2.0.0-dev.0', false, 'dev'],
Expand All @@ -110,7 +110,7 @@ module.exports = [
['1.2.3', 'prerelease', '1.2.4-alpha.1', false, 'alpha', '1'],
['1.2.4', 'prerelease', '1.2.5-alpha.1', false, 'alpha', '1'],
['1.2.0', 'prepatch', '1.2.1-dev.1', false, 'dev', '1'],
['1.2.0-1', 'prepatch', '1.2.1-dev.1', false, 'dev', '1'],
['1.2.0-1', 'prepatch', '1.2.0-dev.1', false, 'dev', '1'],
['1.2.0', 'premajor', '2.0.0-dev.0', false, 'dev', '0'],
['1.2.3-1', 'premajor', '2.0.0-dev.0', false, 'dev', '0'],
['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.0', false, 'dev', '0'],
Expand All @@ -125,7 +125,7 @@ module.exports = [
['1.2.1', 'prerelease', '1.2.2-alpha', false, 'alpha', false],
['1.2.2', 'prerelease', '1.2.3-alpha', false, 'alpha', false],
['1.2.0', 'prepatch', '1.2.1-dev', false, 'dev', false],
['1.2.0-1', 'prepatch', '1.2.1-dev', false, 'dev', false],
['1.2.0-1', 'prepatch', '1.2.0-dev', false, 'dev', false],
['1.2.0', 'premajor', '2.0.0-dev', false, 'dev', false],
['1.2.3-1', 'premajor', '2.0.0-dev', false, 'dev', false],
['1.2.3-dev.bar', 'prerelease', '1.2.3-dev', false, 'dev', false],
Expand All @@ -134,9 +134,25 @@ module.exports = [
['1.2.3-1', 'preminor', '1.3.0-dev', false, 'dev', false],
['1.2.3-dev', 'prerelease', null, false, 'dev', false],
['1.2.0-dev', 'premajor', '2.0.0-dev', false, 'dev', false],
['1.2.0-dev', 'preminor', '1.3.0-beta', false, 'beta', false],
['1.2.0-dev', 'prepatch', '1.2.1-dev', false, 'dev', false],
['1.2.0-dev', 'preminor', '1.2.0-beta', false, 'beta', false],
['1.2.0-dev', 'prepatch', '1.2.0-dev', false, 'dev', false],
['1.2.0', 'prerelease', null, false, '', false],

// #751: premajor/preminor/prepatch should compose as major/minor/patch then pre,
// and must not jump an extra version when already a prerelease of that type.
['2.0.0-pre', 'major', '2.0.0'],
['2.0.0', 'pre', '2.0.0-0'],
['2.0.0-pre', 'premajor', '2.0.0-0'],
['2.0.0-pre.1', 'premajor', '2.0.0-0'],
['2.0.0-pre', 'premajor', '2.0.0-alpha.0', false, 'alpha'],
['1.2.0-pre', 'preminor', '1.2.0-0'],
['1.2.3-pre', 'prepatch', '1.2.3-0'],
// still bump when the current prerelease is not already of that release type
['2.1.0-pre', 'premajor', '3.0.0-0'],
['2.0.1-pre', 'premajor', '3.0.0-0'],
['1.2.1-pre', 'preminor', '1.3.0-0'],
['1.2.3-pre', 'preminor', '1.3.0-0'],

['1.0.0-rc.1+build.4', 'prerelease', '1.0.0-rc.2', 'rc', false],
['1.2.0', 'prerelease', null, false, 'invalid/preid'],
['1.2.0', 'prerelease', null, false, 'invalid+build'],
Expand Down