You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

132 lines
4.2 KiB

var nodeSemver = require('semver');
var sver = require('./sver');
var Semver = sver.Semver;
var SemverRange = sver.SemverRange;
var forOf = require('es6-iterator/for-of');
module.exports = function nodeRangeToSemverRange (range) {
var parsed = nodeSemver.validRange(range);
// tag version
if (!parsed)
return new SemverRange(range);
if (parsed === '*')
return new SemverRange(parsed);
try {
var semverRange = new SemverRange(range);
if (!semverRange.version.tag)
return semverRange;
}
catch (e) {
if (e.code !== 'ENOTSEMVER')
throw e;
}
var outRange;
forOf(parsed.split('||'), function(union) {
// compute the intersection into a lowest upper bound and a highest lower bound
var upperBound, lowerBound, upperEq, lowerEq;
forOf(union.split(' '), function(intersection, doBreak) {
var lt = intersection[0] === '<';
var gt = intersection[0] === '>';
if (!lt && !gt) {
upperBound = intersection;
upperEq = true;
return doBreak();
}
var eq = intersection[1] === '=';
if (!gt) {
var version = new Semver(intersection.substr(1 + eq));
if (!upperBound || upperBound.gt(version)) {
upperBound = version;
upperEq = eq;
}
}
else if (!lt) {
var eq = intersection[1] === '=';
var version = new Semver(intersection.substr(1 + eq));
if (!lowerBound || lowerBound.lt(version)) {
lowerBound = version;
lowerEq = eq;
}
}
});
// if the lower bound is greater than the upper bound then just return the lower bound exactly
if (lowerBound && upperBound && lowerBound.gt(upperBound)) {
var curRange = new SemverRange(lowerBound.toString());
// the largest or highest union range wins
if (!outRange || !outRange.contains(curRange) && (curRange.gt(outRange) || curRange.contains(outRange)))
outRange = curRange;
return;
}
// determine the largest semver range satisfying the upper bound
var upperRange;
if (upperBound) {
// if the upper bound has an equality then we return it directly
if (upperEq) {
var curRange = new SemverRange(upperBound.toString());
// the largest or highest union range wins
if (!outRange || !outRange.contains(curRange) && (curRange.gt(outRange) || curRange.contains(outRange)))
outRange = curRange;
return;
}
// prerelease ignored in upper bound
var major = 0, minor = 0, patch = 0, rangeType = '';
// <2.0.0 -> ^1.0.0
if (upperBound.patch === 0) {
if (upperBound.minor === 0) {
if (upperBound.major > 0) {
major = upperBound.major - 1;
rangeType = '^';
}
}
// <1.2.0 -> ~1.1.0
else {
major = upperBound.major;
minor = upperBound.minor - 1;
rangeType = '~';
}
}
// <1.2.3 -> ~1.2.0
else {
major = upperBound.major;
minor = upperBound.minor;
patch = 0;
rangeType = '~';
}
if (major === 0 && rangeType === '^')
upperRange = new SemverRange('0');
else
upperRange = new SemverRange(rangeType + major + '.' + minor + '.' + patch);
}
// determine the lower range semver range
var lowerRange;
if (!lowerEq) {
if (lowerBound.pre)
lowerRange = new SemverRange('^' + lowerBound.major + '.' + lowerBound.minor + '.' + lowerBound.patch + '-' + lowerBound.pre.join('.') + '.1');
else
lowerRange = new SemverRange('^' + lowerBound.major + '.' + lowerBound.minor + '.' + (lowerBound.patch + 1));
}
else {
lowerRange = new SemverRange('^' + lowerBound.toString());
}
// we then intersect the upper semver range with the lower semver range
// if the intersection is empty, we return the upper range only
var curRange = upperRange ? lowerRange.intersect(upperRange) || upperRange : lowerRange;
// the largest or highest union range wins
if (!outRange || !outRange.contains(curRange) && (curRange.gt(outRange) || curRange.contains(outRange)))
outRange = curRange;
});
return outRange;
}