UNPKG

2.19 kBJavaScriptView Raw
1const SemVer = require('../classes/semver')
2const Comparator = require('../classes/comparator')
3const {ANY} = Comparator
4const Range = require('../classes/range')
5const satisfies = require('../functions/satisfies')
6const gt = require('../functions/gt')
7const lt = require('../functions/lt')
8const lte = require('../functions/lte')
9const gte = require('../functions/gte')
10
11const outside = (version, range, hilo, options) => {
12 version = new SemVer(version, options)
13 range = new Range(range, options)
14
15 let gtfn, ltefn, ltfn, comp, ecomp
16 switch (hilo) {
17 case '>':
18 gtfn = gt
19 ltefn = lte
20 ltfn = lt
21 comp = '>'
22 ecomp = '>='
23 break
24 case '<':
25 gtfn = lt
26 ltefn = gte
27 ltfn = gt
28 comp = '<'
29 ecomp = '<='
30 break
31 default:
32 throw new TypeError('Must provide a hilo val of "<" or ">"')
33 }
34
35 // If it satisfies the range it is not outside
36 if (satisfies(version, range, options)) {
37 return false
38 }
39
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.
42
43 for (let i = 0; i < range.set.length; ++i) {
44 const comparators = range.set[i]
45
46 let high = null
47 let low = null
48
49 comparators.forEach((comparator) => {
50 if (comparator.semver === ANY) {
51 comparator = new Comparator('>=0.0.0')
52 }
53 high = high || comparator
54 low = low || comparator
55 if (gtfn(comparator.semver, high.semver, options)) {
56 high = comparator
57 } else if (ltfn(comparator.semver, low.semver, options)) {
58 low = comparator
59 }
60 })
61
62 // If the edge version comparator has a operator then our version
63 // isn't outside it
64 if (high.operator === comp || high.operator === ecomp) {
65 return false
66 }
67
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)) {
72 return false
73 } else if (low.operator === ecomp && ltfn(version, low.semver)) {
74 return false
75 }
76 }
77 return true
78}
79
80module.exports = outside