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.
80 lines
2.1 KiB
80 lines
2.1 KiB
const SemVer = require('../classes/semver') |
|
const Comparator = require('../classes/comparator') |
|
const { ANY } = Comparator |
|
const Range = require('../classes/range') |
|
const satisfies = require('../functions/satisfies') |
|
const gt = require('../functions/gt') |
|
const lt = require('../functions/lt') |
|
const lte = require('../functions/lte') |
|
const gte = require('../functions/gte') |
|
|
|
const outside = (version, range, hilo, options) => { |
|
version = new SemVer(version, options) |
|
range = new Range(range, options) |
|
|
|
let gtfn, ltefn, ltfn, comp, ecomp |
|
switch (hilo) { |
|
case '>': |
|
gtfn = gt |
|
ltefn = lte |
|
ltfn = lt |
|
comp = '>' |
|
ecomp = '>=' |
|
break |
|
case '<': |
|
gtfn = lt |
|
ltefn = gte |
|
ltfn = gt |
|
comp = '<' |
|
ecomp = '<=' |
|
break |
|
default: |
|
throw new TypeError('Must provide a hilo val of "<" or ">"') |
|
} |
|
|
|
// If it satisfies the range it is not outside |
|
if (satisfies(version, range, options)) { |
|
return false |
|
} |
|
|
|
// From now on, variable terms are as if we're in "gtr" mode. |
|
// but note that everything is flipped for the "ltr" function. |
|
|
|
for (let i = 0; i < range.set.length; ++i) { |
|
const comparators = range.set[i] |
|
|
|
let high = null |
|
let low = null |
|
|
|
comparators.forEach((comparator) => { |
|
if (comparator.semver === ANY) { |
|
comparator = new Comparator('>=0.0.0') |
|
} |
|
high = high || comparator |
|
low = low || comparator |
|
if (gtfn(comparator.semver, high.semver, options)) { |
|
high = comparator |
|
} else if (ltfn(comparator.semver, low.semver, options)) { |
|
low = comparator |
|
} |
|
}) |
|
|
|
// If the edge version comparator has a operator then our version |
|
// isn't outside it |
|
if (high.operator === comp || high.operator === ecomp) { |
|
return false |
|
} |
|
|
|
// If the lowest version comparator has an operator and our version |
|
// is less than it then it isn't higher than the range |
|
if ((!low.operator || low.operator === comp) && |
|
ltefn(version, low.semver)) { |
|
return false |
|
} else if (low.operator === ecomp && ltfn(version, low.semver)) { |
|
return false |
|
} |
|
} |
|
return true |
|
} |
|
|
|
module.exports = outside
|
|
|