From 3686ea030078bbffa88ee670a4009e005381e040 Mon Sep 17 00:00:00 2001 From: Yarchik Date: Thu, 23 Jul 2026 14:31:07 +0100 Subject: [PATCH] fix: minVersion returns the true minimum for `>` in includePrerelease mode `minVersion` is documented to return the lowest version that can match a range, but for a `>X.Y.Z` bound in includePrerelease mode it skipped the lowest prerelease: minVersion('>1.0.0', { includePrerelease: true }) // 1.0.1 `1.0.1-0` also satisfies `>1.0.0` under includePrerelease and is lower than `1.0.1`, so `1.0.1` is not the minimum. For a `>` comparator that already carries a prerelease, minVersion already appends `.0` (`>1.0.0-0` -> `1.0.0-0.0`); the plain `>X.Y.Z` case only did `patch++` and never considered prereleases, even when they are in scope. Append the `-0` prerelease after bumping the patch when the range includes prereleases, so `>1.0.0` yields `1.0.1-0`. Default mode is unchanged (`>1.0.0` still yields `1.0.1`). --- ranges/min-version.js | 6 ++++++ test/ranges/min-version.js | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/ranges/min-version.js b/ranges/min-version.js index 09a65aa3..01d54c09 100644 --- a/ranges/min-version.js +++ b/ranges/min-version.js @@ -29,6 +29,12 @@ const minVersion = (range, loose) => { case '>': if (compver.prerelease.length === 0) { compver.patch++ + // in includePrerelease mode the next patch's lowest prerelease + // (e.g. 1.0.1-0) also satisfies `>1.0.0` and is lower than 1.0.1, + // so it is the true minimum -- matching the prerelease `>` case below + if (range.includePrerelease) { + compver.prerelease.push(0) + } } else { compver.prerelease.push(0) } diff --git a/test/ranges/min-version.js b/test/ranges/min-version.js index eeb9b725..2e6eb6ee 100644 --- a/test/ranges/min-version.js +++ b/test/ranges/min-version.js @@ -64,6 +64,11 @@ test('minimum version in range tests', (t) => { ['>2 || >1.0.0-0', '1.0.0-0.0'], ['>2 || >1.0.0-beta', '1.0.0-beta.0'], + // includePrerelease: the lowest prerelease of the next version is the true + // minimum for a `>` bound (and lower than the plain next version) + ['>1.0.0', '1.0.1-0', { includePrerelease: true }], + ['>2 || >1.0.0', '1.0.1-0', { includePrerelease: true }], + // Impossible range ['>4 <3', null], ].forEach((tuple) => {