From 508e481f4d7391a0fb3b802d252d0d6093f63c6b Mon Sep 17 00:00:00 2001 From: Marceli Pawlinski Date: Wed, 29 Jul 2026 02:05:43 +0100 Subject: [PATCH] fix: premajor/preminor/prepatch should respect prerelease status (#751) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit premajor, preminor, and prepatch now delegate to their non-pre counterparts (major/minor/patch) first, which correctly handle the case where the version is already a prerelease. Previously they would unconditionally bump the version number, even when the current version is a prerelease at x.0.0-something. Behavior change: prepatch on a prerelease no longer bumps patch (e.g., 1.2.0-1 → prepatch → 1.2.0-0 instead of 1.2.1-0), which is consistent with how patch strips the prerelease without bumping. --- classes/semver.js | 13 ++----------- test/fixtures/increments.js | 12 ++++++------ 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/classes/semver.js b/classes/semver.js index 54381272..33480a0f 100644 --- a/classes/semver.js +++ b/classes/semver.js @@ -223,23 +223,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 diff --git a/test/fixtures/increments.js b/test/fixtures/increments.js index 31ea6974..744db26f 100644 --- a/test/fixtures/increments.js +++ b/test/fixtures/increments.js @@ -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'], @@ -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'], @@ -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'], @@ -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], @@ -134,8 +134,8 @@ 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], ['1.0.0-rc.1+build.4', 'prerelease', '1.0.0-rc.2', 'rc', false], ['1.2.0', 'prerelease', null, false, 'invalid/preid'],