From ab218f5c01abbd9e2356cb6eb96c464e07561a24 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Sat, 3 Sep 2022 18:04:31 +0200 Subject: [PATCH] Coerce a semver when calculating updatables. Closes #1390 Signed-off-by: Akos Kitta --- .../src/common/protocol/installable.ts | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/src/common/protocol/installable.ts b/arduino-ide-extension/src/common/protocol/installable.ts index 096934ff5..f311f8202 100644 --- a/arduino-ide-extension/src/common/protocol/installable.ts +++ b/arduino-ide-extension/src/common/protocol/installable.ts @@ -27,10 +27,25 @@ export namespace Installable { export namespace Version { /** * Most recent version comes first, then the previous versions. (`1.8.1`, `1.6.3`, `1.6.2`, `1.6.1` and so on.) + * + * If `coerce` is `true` tries to convert any invalid semver strings to a valid semver based on [these](https://github.com/npm/node-semver#coercion) rules. */ - export const COMPARATOR = (left: Version, right: Version): number => { - if (semver.valid(left) && semver.valid(right)) { - return semver.compare(left, right); + export const COMPARATOR = ( + left: Version, + right: Version, + coerce = false + ): number => { + const validLeft = semver.parse(left); + const validRight = semver.parse(right); + if (validLeft && validRight) { + return semver.compare(validLeft, validRight); + } + if (coerce) { + const coercedLeft = validLeft ?? semver.coerce(left); + const coercedRight = validRight ?? semver.coerce(right); + if (coercedLeft && coercedRight) { + return semver.compare(coercedLeft, coercedRight); + } } return naturalCompare(left, right); }; @@ -56,7 +71,8 @@ export namespace Installable { } const result = Installable.Version.COMPARATOR( latestVersion, - installedVersion + installedVersion, + true ); return result > 0; };