From 6e06694fd6acab185432bccf57bd5c9c3b68f218 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 19 Jan 2023 13:53:24 +0100 Subject: [PATCH] Fix semver comparison --- server/tests/helpers/index.ts | 1 + server/tests/helpers/version.ts | 31 +++++++++++++++++++++++++++++ shared/core-utils/common/version.ts | 17 ++++------------ 3 files changed, 36 insertions(+), 13 deletions(-) create mode 100644 server/tests/helpers/version.ts diff --git a/server/tests/helpers/index.ts b/server/tests/helpers/index.ts index 1b5c6d15b..073ae6455 100644 --- a/server/tests/helpers/index.ts +++ b/server/tests/helpers/index.ts @@ -6,3 +6,4 @@ import './image' import './markdown' import './request' import './validator' +import './version' diff --git a/server/tests/helpers/version.ts b/server/tests/helpers/version.ts new file mode 100644 index 000000000..7d5600715 --- /dev/null +++ b/server/tests/helpers/version.ts @@ -0,0 +1,31 @@ +/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ + +import { expect } from 'chai' +import { compareSemVer } from '@shared/core-utils' + +describe('Version', function () { + + it('Should correctly compare two stable versions', async function () { + expect(compareSemVer('3.4.0', '3.5.0')).to.be.below(0) + expect(compareSemVer('3.5.0', '3.4.0')).to.be.above(0) + + expect(compareSemVer('3.4.0', '4.1.0')).to.be.below(0) + expect(compareSemVer('4.1.0', '3.4.0')).to.be.above(0) + + expect(compareSemVer('3.4.0', '3.4.1')).to.be.below(0) + expect(compareSemVer('3.4.1', '3.4.0')).to.be.above(0) + }) + + it('Should correctly compare two unstable version', async function () { + expect(compareSemVer('3.4.0-alpha', '3.4.0-beta.1')).to.be.below(0) + expect(compareSemVer('3.4.0-alpha.1', '3.4.0-beta.1')).to.be.below(0) + expect(compareSemVer('3.4.0-beta.1', '3.4.0-beta.2')).to.be.below(0) + expect(compareSemVer('3.4.0-beta.1', '3.5.0-alpha.1')).to.be.below(0) + }) + + it('Should correctly compare a stable and unstable versions', async function () { + expect(compareSemVer('3.4.0', '3.4.1-beta.1')).to.be.below(0) + expect(compareSemVer('3.4.0-beta.1', '3.4.0-beta.2')).to.be.below(0) + expect(compareSemVer('3.4.0-beta.1', '3.4.0')).to.be.below(0) + }) +}) diff --git a/shared/core-utils/common/version.ts b/shared/core-utils/common/version.ts index 8a64f8c4d..305287233 100644 --- a/shared/core-utils/common/version.ts +++ b/shared/core-utils/common/version.ts @@ -1,18 +1,9 @@ -// Thanks https://stackoverflow.com/a/16187766 +// Thanks https://gist.github.com/iwill/a83038623ba4fef6abb9efca87ae9ccb function compareSemVer (a: string, b: string) { - const regExStrip0 = /(\.0+)+$/ - const segmentsA = a.replace(regExStrip0, '').split('.') - const segmentsB = b.replace(regExStrip0, '').split('.') + if (a.startsWith(b + '-')) return -1 + if (b.startsWith(a + '-')) return 1 - const l = Math.min(segmentsA.length, segmentsB.length) - - for (let i = 0; i < l; i++) { - const diff = parseInt(segmentsA[i], 10) - parseInt(segmentsB[i], 10) - - if (diff) return diff - } - - return segmentsA.length - segmentsB.length + return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'case', caseFirst: 'upper' }) } export {