| 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 |