62 lines
1.5 KiB
JavaScript
62 lines
1.5 KiB
JavaScript
const SemVer = require('../classes/semver');
|
|
const Range = require('../classes/range');
|
|
const gt = require('../functions/gt');
|
|
|
|
const minVersion = (range, loose) => {
|
|
range = new Range(range, loose);
|
|
|
|
let minver = new SemVer('0.0.0');
|
|
if (range.test(minver)) {
|
|
return minver;
|
|
}
|
|
|
|
minver = new SemVer('0.0.0-0');
|
|
if (range.test(minver)) {
|
|
return minver;
|
|
}
|
|
|
|
minver = null;
|
|
for (let i = 0; i < range.set.length; ++i) {
|
|
const comparators = range.set[i];
|
|
|
|
let setMin = null;
|
|
comparators.forEach((comparator) => {
|
|
// Clone to avoid manipulating the comparator's semver object.
|
|
const compver = new SemVer(comparator.semver.version);
|
|
switch (comparator.operator) {
|
|
case '>':
|
|
if (compver.prerelease.length === 0) {
|
|
compver.patch++;
|
|
} else {
|
|
compver.prerelease.push(0);
|
|
}
|
|
compver.raw = compver.format();
|
|
/* fallthrough */
|
|
case '':
|
|
case '>=':
|
|
if (!setMin || gt(compver, setMin)) {
|
|
setMin = compver;
|
|
}
|
|
break;
|
|
case '<':
|
|
case '<=':
|
|
/* Ignore maximum versions */
|
|
break;
|
|
/* istanbul ignore next */
|
|
default:
|
|
throw new Error(`Unexpected operation: ${comparator.operator}`);
|
|
}
|
|
});
|
|
if (setMin && (!minver || gt(minver, setMin))) {
|
|
minver = setMin;
|
|
}
|
|
}
|
|
|
|
if (minver && range.test(minver)) {
|
|
return minver;
|
|
}
|
|
|
|
return null;
|
|
};
|
|
module.exports = minVersion;
|