| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 | 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;}
 |