1 const SemVer = require('../classes/semver')
2 const Comparator = require('../classes/comparator')
3 const {ANY} = Comparator
4 const Range = require('../classes/range')
5 const satisfies = require('../functions/satisfies')
6 const gt = require('../functions/gt')
7 const lt = require('../functions/lt')
8 const lte = require('../functions/lte')
9 const gte = require('../functions/gte')
11 const outside = (version, range, hilo, options) => {
12 version = new SemVer(version, options)
13 range = new Range(range, options)
15 let gtfn, ltefn, ltfn, comp, ecomp
32 throw new TypeError('Must provide a hilo val of "<" or ">"')
35 // If it satisfies the range it is not outside
36 if (satisfies(version, range, options)) {
40 // From now on, variable terms are as if we're in "gtr" mode.
41 // but note that everything is flipped for the "ltr" function.
43 for (let i = 0; i < range.set.length; ++i) {
44 const comparators = range.set[i]
49 comparators.forEach((comparator) => {
50 if (comparator.semver === ANY) {
51 comparator = new Comparator('>=0.0.0')
53 high = high || comparator
54 low = low || comparator
55 if (gtfn(comparator.semver, high.semver, options)) {
57 } else if (ltfn(comparator.semver, low.semver, options)) {
62 // If the edge version comparator has a operator then our version
64 if (high.operator === comp || high.operator === ecomp) {
68 // If the lowest version comparator has an operator and our version
69 // is less than it then it isn't higher than the range
70 if ((!low.operator || low.operator === comp) &&
71 ltefn(version, low.semver)) {
73 } else if (low.operator === ecomp && ltfn(version, low.semver)) {
80 module.exports = outside