83 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict'
 | 
						|
 | 
						|
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
 |