diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 3115b067..3ebad252 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "7.8.1" + ".": "7.8.2" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e249e38..e7ee8ad4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [7.8.2](https://github.com/npm/node-semver/compare/v7.8.1...v7.8.2) (2026-06-04) +### Bug Fixes +* [`bea6028`](https://github.com/npm/node-semver/commit/bea6028694a75e840f48b288ac019e9644cfe6e8) [#870](https://github.com/npm/node-semver/pull/870) increment dotted prerelease identifiers (#870) (@liuzemei, @SheldonNeo) + ## [7.8.1](https://github.com/npm/node-semver/compare/v7.8.0...v7.8.1) (2026-05-21) ### Bug Fixes * [`17aa702`](https://github.com/npm/node-semver/commit/17aa702d91166472b197a2ea768f085083bee2e4) [#869](https://github.com/npm/node-semver/pull/869) strip build metadata before comparator trimming (#869) (@owlstronaut) 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/package.json b/package.json index 6edb9ab4..bcb65da6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "semver", - "version": "7.8.1", + "version": "7.8.2", "description": "The semantic version parser used by npm.", "main": "index.js", "scripts": { 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'],