/
semver.js
77 lines (62 loc) · 1.94 KB
/
semver.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
var semver = require('semver');
var mout = require('mout');
function maxSatisfying(versions, range, strictMatch) {
var version;
var filteredVersions;
// Filter only valid versions, since semver.maxSatisfying() throws an error
versions = versions.filter(function(version) {
return semver.valid(version);
});
// Exact version & range match
if (semver.valid(range)) {
version = mout.array.find(versions, function(version) {
return version === range;
});
if (version) {
return version;
}
}
range = typeof range === 'string' ? range.trim() : range;
// When strict match is enabled give priority to non-pre-releases
// We do this by filtering every pre-release version
if (strictMatch) {
filteredVersions = versions.map(function(version) {
return !isPreRelease(version) ? version : null;
});
version = semver.maxSatisfying(filteredVersions, range);
if (version) {
return version;
}
}
// Fallback to regular semver max satisfies
return semver.maxSatisfying(versions, range);
}
function maxSatisfyingIndex(versions, range, strictMatch) {
var version = maxSatisfying(versions, range, strictMatch);
if (!version) {
return -1;
}
return versions.indexOf(version);
}
function clean(version) {
var parsed = semver.parse(version);
if (!parsed) {
return null;
}
// Keep builds!
return (
parsed.version +
(parsed.build.length ? '+' + parsed.build.join('.') : '')
);
}
function isPreRelease(version) {
var parsed = semver.parse(version);
return parsed && parsed.prerelease && parsed.prerelease.length;
}
// Export a semver like object but with our custom functions
mout.object.mixIn(module.exports, semver, {
maxSatisfying: maxSatisfying,
maxSatisfyingIndex: maxSatisfyingIndex,
clean: clean,
valid: clean
});