Skip to content

Commit a0f8f56

Browse files
committed
fix(core): handle semver ranges containing 1.x.x
1 parent 09f9e6d commit a0f8f56

2 files changed

Lines changed: 59 additions & 33 deletions

File tree

src/version.spec.ts

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,24 @@ import { getNewest, getVersionRange, sortBySemver } from './version';
33

44
describe('getNewest', () => {
55
it('returns the newest version from an array of versions', () => {
6-
expect(getNewest(['<=1.0.0', '<1.0.0'])).toEqual('<=1.0.0');
7-
expect(getNewest(['1.0.0', '<=1.0.0', '<1.0.0'])).toEqual('1.0.0');
8-
expect(getNewest(['~1.0.0', '1.0.0', '<=1.0.0', '<1.0.0'])).toEqual('~1.0.0');
9-
expect(getNewest(['^1.0.0', '~1.0.0', '1.0.0', '<=1.0.0', '<1.0.0'])).toEqual('^1.0.0');
10-
expect(getNewest(['>=1.0.0', '^1.0.0', '~1.0.0', '1.0.0', '<=1.0.0', '<1.0.0'])).toEqual('>=1.0.0');
11-
expect(getNewest(['>1.0.0', '>=1.0.0', '^1.0.0', '~1.0.0', '1.0.0', '<=1.0.0', '<1.0.0'])).toEqual('>1.0.0');
12-
expect(getNewest(['>1.0.0', '>=1.0.0', '^1.0.0', '*', '~1.0.0', '1.0.0', '<=1.0.0', '<1.0.0'])).toEqual('*');
6+
const a = ['<1.0.0'];
7+
const b = _.shuffle(a.concat('<=1.0.0'));
8+
const c = _.shuffle(b.concat('1.0.0'));
9+
const d = _.shuffle(c.concat('~1.0.0'));
10+
const e = _.shuffle(d.concat('1.x.x'));
11+
const f = _.shuffle(e.concat('^1.0.0'));
12+
const g = _.shuffle(f.concat('>=1.0.0'));
13+
const h = _.shuffle(g.concat('>1.0.0'));
14+
const i = _.shuffle(h.concat('*'));
15+
expect(getNewest(a)).toEqual('<1.0.0');
16+
expect(getNewest(b)).toEqual('<=1.0.0');
17+
expect(getNewest(c)).toEqual('1.0.0');
18+
expect(getNewest(d)).toEqual('~1.0.0');
19+
expect(getNewest(e)).toEqual('1.x.x');
20+
expect(getNewest(f)).toEqual('^1.0.0');
21+
expect(getNewest(g)).toEqual('>=1.0.0');
22+
expect(getNewest(h)).toEqual('>1.0.0');
23+
expect(getNewest(i)).toEqual('*');
1324
});
1425
});
1526

src/version.ts

Lines changed: 41 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,31 +12,46 @@ export const getVersionRange: GetVersionRange = (version) => version.split(/[0-9
1212

1313
export const isValid = (version: string) => semver.valid(version) !== null;
1414

15-
export const sortBySemver: SortBySemver = (versions: string[]) =>
16-
versions.concat().sort((a: string, b: string) => {
17-
const ar = getVersionRange(a);
18-
const br = getVersionRange(b);
19-
const ac = getVersionNumber(a);
20-
const bc = getVersionNumber(b);
21-
if (a === '*') {
22-
return GREATER;
23-
}
24-
if (b === '*') {
25-
return LESSER;
26-
}
27-
if (semver.gtr(ac, bc)) {
28-
return GREATER;
29-
}
30-
if (semver.ltr(ac, bc)) {
31-
return LESSER;
32-
}
33-
if (SEMVER_ORDER.indexOf(ar) > SEMVER_ORDER.indexOf(br)) {
34-
return GREATER;
35-
}
36-
if (SEMVER_ORDER.indexOf(ar) < SEMVER_ORDER.indexOf(br)) {
37-
return LESSER;
38-
}
39-
return SAME;
40-
});
15+
export const sortBySemver: SortBySemver = (versions: string[]) => {
16+
return versions
17+
.concat()
18+
.sort()
19+
.sort((a: string, b: string) => {
20+
if (a === '*') {
21+
return GREATER;
22+
}
23+
if (b === '*') {
24+
return LESSER;
25+
}
26+
if (a === b) {
27+
return SAME;
28+
}
29+
let aRange = getVersionRange(a);
30+
let bRange = getVersionRange(b);
31+
let aNumber = getVersionNumber(a);
32+
let bNumber = getVersionNumber(b);
33+
if (aNumber.indexOf('.x') !== -1) {
34+
aNumber = aNumber.split('.x').join('.0');
35+
aRange = '^';
36+
}
37+
if (bNumber.indexOf('.x') !== -1) {
38+
bNumber = bNumber.split('.x').join('.0');
39+
bRange = '^';
40+
}
41+
if (semver.gt(aNumber, bNumber)) {
42+
return GREATER;
43+
}
44+
if (semver.lt(aNumber, bNumber)) {
45+
return LESSER;
46+
}
47+
if (SEMVER_ORDER.indexOf(aRange) > SEMVER_ORDER.indexOf(bRange)) {
48+
return GREATER;
49+
}
50+
if (SEMVER_ORDER.indexOf(aRange) < SEMVER_ORDER.indexOf(bRange)) {
51+
return LESSER;
52+
}
53+
return SAME;
54+
});
55+
};
4156

4257
export const getNewest: GetNewest = (versions: string[]) => _(sortBySemver(versions)).last();

0 commit comments

Comments
 (0)