diff --git a/classes/semver.js b/classes/semver.js index 92254be1..54381272 100644 --- a/classes/semver.js +++ b/classes/semver.js @@ -6,6 +6,22 @@ const { safeRe: re, t } = require('../internal/re') const parseOptions = require('../internal/parse-options') const { compareIdentifiers } = require('../internal/identifiers') + +const isPrereleaseIdentifier = (prerelease, identifier) => { + const identifiers = identifier.split('.') + if (identifiers.length > prerelease.length) { + return false + } + + for (let i = 0; i < identifiers.length; i++) { + if (compareIdentifiers(prerelease[i], identifiers[i]) !== 0) { + return false + } + } + + return true +} + class SemVer { constructor (version, options) { options = parseOptions(options) @@ -309,8 +325,9 @@ class SemVer { if (identifierBase === false) { prerelease = [identifier] } - if (compareIdentifiers(this.prerelease[0], identifier) === 0) { - if (isNaN(this.prerelease[1])) { + if (isPrereleaseIdentifier(this.prerelease, identifier)) { + const prereleaseBase = this.prerelease[identifier.split('.').length] + if (isNaN(prereleaseBase)) { this.prerelease = prerelease } } else { diff --git a/test/fixtures/increments.js b/test/fixtures/increments.js index bcb582ab..31ea6974 100644 --- a/test/fixtures/increments.js +++ b/test/fixtures/increments.js @@ -31,6 +31,9 @@ module.exports = [ ['1.2.3-alpha.10.beta.0', 'prerelease', '1.2.3-alpha.10.beta.1'], ['1.2.3-alpha.10.beta.1', 'prerelease', '1.2.3-alpha.10.beta.2'], ['1.2.3-alpha.10.beta.2', 'prerelease', '1.2.3-alpha.10.beta.3'], + ['3.0.0-alpha.beta.5.4', 'prerelease', '3.0.0-alpha.beta.5.5', false, 'alpha.beta'], + ['3.0.0-alpha.beta.5.4', 'prerelease', '3.0.0-alpha.beta.5.5', false, 'alpha.beta.5'], + ['3.0.0-alpha.beta.gamma', 'prerelease', '3.0.0-alpha.beta.0', false, 'alpha.beta'], ['1.2.3-alpha.9.beta', 'prerelease', '1.2.3-alpha.10.beta'], ['1.2.3-alpha.10.beta', 'prerelease', '1.2.3-alpha.11.beta'], ['1.2.3-alpha.11.beta', 'prerelease', '1.2.3-alpha.12.beta'], @@ -77,6 +80,9 @@ module.exports = [ ['1.2.3-alpha.10.beta.0', 'prerelease', '1.2.3-alpha.10.beta.1', false, 'alpha'], ['1.2.3-alpha.10.beta.1', 'prerelease', '1.2.3-alpha.10.beta.2', false, 'alpha'], ['1.2.3-alpha.10.beta.2', 'prerelease', '1.2.3-alpha.10.beta.3', false, 'alpha'], + ['3.0.0-alpha.beta.5.4', 'prerelease', '3.0.0-alpha.beta.5.5', false, 'alpha.beta'], + ['3.0.0-alpha.beta.5.4', 'prerelease', '3.0.0-alpha.beta.5.5', false, 'alpha.beta.5'], + ['3.0.0-alpha.beta.gamma', 'prerelease', '3.0.0-alpha.beta.0', false, 'alpha.beta'], ['1.2.3-alpha.9.beta', 'prerelease', '1.2.3-dev.0', false, 'dev'], ['1.2.3-alpha.9.beta', 'prerelease', '1.2.3-alpha.10.beta', false, 'alpha'], ['1.2.3-alpha.10.beta', 'prerelease', '1.2.3-alpha.11.beta', false, 'alpha'],