142 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			142 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								const ANY = Symbol('SemVer ANY')
							 | 
						||
| 
								 | 
							
								// hoisted class for cyclic dependency
							 | 
						||
| 
								 | 
							
								class Comparator {
							 | 
						||
| 
								 | 
							
								  static get ANY () {
							 | 
						||
| 
								 | 
							
								    return ANY
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  constructor (comp, options) {
							 | 
						||
| 
								 | 
							
								    options = parseOptions(options)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (comp instanceof Comparator) {
							 | 
						||
| 
								 | 
							
								      if (comp.loose === !!options.loose) {
							 | 
						||
| 
								 | 
							
								        return comp
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        comp = comp.value
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    comp = comp.trim().split(/\s+/).join(' ')
							 | 
						||
| 
								 | 
							
								    debug('comparator', comp, options)
							 | 
						||
| 
								 | 
							
								    this.options = options
							 | 
						||
| 
								 | 
							
								    this.loose = !!options.loose
							 | 
						||
| 
								 | 
							
								    this.parse(comp)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (this.semver === ANY) {
							 | 
						||
| 
								 | 
							
								      this.value = ''
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      this.value = this.operator + this.semver.version
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    debug('comp', this)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  parse (comp) {
							 | 
						||
| 
								 | 
							
								    const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
							 | 
						||
| 
								 | 
							
								    const m = comp.match(r)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (!m) {
							 | 
						||
| 
								 | 
							
								      throw new TypeError(`Invalid comparator: ${comp}`)
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this.operator = m[1] !== undefined ? m[1] : ''
							 | 
						||
| 
								 | 
							
								    if (this.operator === '=') {
							 | 
						||
| 
								 | 
							
								      this.operator = ''
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // if it literally is just '>' or '' then allow anything.
							 | 
						||
| 
								 | 
							
								    if (!m[2]) {
							 | 
						||
| 
								 | 
							
								      this.semver = ANY
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      this.semver = new SemVer(m[2], this.options.loose)
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  toString () {
							 | 
						||
| 
								 | 
							
								    return this.value
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  test (version) {
							 | 
						||
| 
								 | 
							
								    debug('Comparator.test', version, this.options.loose)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (this.semver === ANY || version === ANY) {
							 | 
						||
| 
								 | 
							
								      return true
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (typeof version === 'string') {
							 | 
						||
| 
								 | 
							
								      try {
							 | 
						||
| 
								 | 
							
								        version = new SemVer(version, this.options)
							 | 
						||
| 
								 | 
							
								      } catch (er) {
							 | 
						||
| 
								 | 
							
								        return false
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return cmp(version, this.operator, this.semver, this.options)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  intersects (comp, options) {
							 | 
						||
| 
								 | 
							
								    if (!(comp instanceof Comparator)) {
							 | 
						||
| 
								 | 
							
								      throw new TypeError('a Comparator is required')
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (this.operator === '') {
							 | 
						||
| 
								 | 
							
								      if (this.value === '') {
							 | 
						||
| 
								 | 
							
								        return true
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      return new Range(comp.value, options).test(this.value)
							 | 
						||
| 
								 | 
							
								    } else if (comp.operator === '') {
							 | 
						||
| 
								 | 
							
								      if (comp.value === '') {
							 | 
						||
| 
								 | 
							
								        return true
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      return new Range(this.value, options).test(comp.semver)
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    options = parseOptions(options)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Special cases where nothing can possibly be lower
							 | 
						||
| 
								 | 
							
								    if (options.includePrerelease &&
							 | 
						||
| 
								 | 
							
								      (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {
							 | 
						||
| 
								 | 
							
								      return false
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (!options.includePrerelease &&
							 | 
						||
| 
								 | 
							
								      (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {
							 | 
						||
| 
								 | 
							
								      return false
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Same direction increasing (> or >=)
							 | 
						||
| 
								 | 
							
								    if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {
							 | 
						||
| 
								 | 
							
								      return true
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    // Same direction decreasing (< or <=)
							 | 
						||
| 
								 | 
							
								    if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {
							 | 
						||
| 
								 | 
							
								      return true
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    // same SemVer and both sides are inclusive (<= or >=)
							 | 
						||
| 
								 | 
							
								    if (
							 | 
						||
| 
								 | 
							
								      (this.semver.version === comp.semver.version) &&
							 | 
						||
| 
								 | 
							
								      this.operator.includes('=') && comp.operator.includes('=')) {
							 | 
						||
| 
								 | 
							
								      return true
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    // opposite directions less than
							 | 
						||
| 
								 | 
							
								    if (cmp(this.semver, '<', comp.semver, options) &&
							 | 
						||
| 
								 | 
							
								      this.operator.startsWith('>') && comp.operator.startsWith('<')) {
							 | 
						||
| 
								 | 
							
								      return true
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    // opposite directions greater than
							 | 
						||
| 
								 | 
							
								    if (cmp(this.semver, '>', comp.semver, options) &&
							 | 
						||
| 
								 | 
							
								      this.operator.startsWith('<') && comp.operator.startsWith('>')) {
							 | 
						||
| 
								 | 
							
								      return true
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return false
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = Comparator
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const parseOptions = require('../internal/parse-options')
							 | 
						||
| 
								 | 
							
								const { safeRe: re, t } = require('../internal/re')
							 | 
						||
| 
								 | 
							
								const cmp = require('../functions/cmp')
							 | 
						||
| 
								 | 
							
								const debug = require('../internal/debug')
							 | 
						||
| 
								 | 
							
								const SemVer = require('./semver')
							 | 
						||
| 
								 | 
							
								const Range = require('./range')
							 |