init
This commit is contained in:
		
							
								
								
									
										141
									
								
								node_modules/semver/classes/comparator.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								node_modules/semver/classes/comparator.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,141 @@
 | 
			
		||||
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')
 | 
			
		||||
							
								
								
									
										5
									
								
								node_modules/semver/classes/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								node_modules/semver/classes/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
module.exports = {
 | 
			
		||||
  SemVer: require('./semver.js'),
 | 
			
		||||
  Range: require('./range.js'),
 | 
			
		||||
  Comparator: require('./comparator.js'),
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										539
									
								
								node_modules/semver/classes/range.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										539
									
								
								node_modules/semver/classes/range.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,539 @@
 | 
			
		||||
// hoisted class for cyclic dependency
 | 
			
		||||
class Range {
 | 
			
		||||
  constructor (range, options) {
 | 
			
		||||
    options = parseOptions(options)
 | 
			
		||||
 | 
			
		||||
    if (range instanceof Range) {
 | 
			
		||||
      if (
 | 
			
		||||
        range.loose === !!options.loose &&
 | 
			
		||||
        range.includePrerelease === !!options.includePrerelease
 | 
			
		||||
      ) {
 | 
			
		||||
        return range
 | 
			
		||||
      } else {
 | 
			
		||||
        return new Range(range.raw, options)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (range instanceof Comparator) {
 | 
			
		||||
      // just put it in the set and return
 | 
			
		||||
      this.raw = range.value
 | 
			
		||||
      this.set = [[range]]
 | 
			
		||||
      this.format()
 | 
			
		||||
      return this
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.options = options
 | 
			
		||||
    this.loose = !!options.loose
 | 
			
		||||
    this.includePrerelease = !!options.includePrerelease
 | 
			
		||||
 | 
			
		||||
    // First reduce all whitespace as much as possible so we do not have to rely
 | 
			
		||||
    // on potentially slow regexes like \s*. This is then stored and used for
 | 
			
		||||
    // future error messages as well.
 | 
			
		||||
    this.raw = range
 | 
			
		||||
      .trim()
 | 
			
		||||
      .split(/\s+/)
 | 
			
		||||
      .join(' ')
 | 
			
		||||
 | 
			
		||||
    // First, split on ||
 | 
			
		||||
    this.set = this.raw
 | 
			
		||||
      .split('||')
 | 
			
		||||
      // map the range to a 2d array of comparators
 | 
			
		||||
      .map(r => this.parseRange(r.trim()))
 | 
			
		||||
      // throw out any comparator lists that are empty
 | 
			
		||||
      // this generally means that it was not a valid range, which is allowed
 | 
			
		||||
      // in loose mode, but will still throw if the WHOLE range is invalid.
 | 
			
		||||
      .filter(c => c.length)
 | 
			
		||||
 | 
			
		||||
    if (!this.set.length) {
 | 
			
		||||
      throw new TypeError(`Invalid SemVer Range: ${this.raw}`)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // if we have any that are not the null set, throw out null sets.
 | 
			
		||||
    if (this.set.length > 1) {
 | 
			
		||||
      // keep the first one, in case they're all null sets
 | 
			
		||||
      const first = this.set[0]
 | 
			
		||||
      this.set = this.set.filter(c => !isNullSet(c[0]))
 | 
			
		||||
      if (this.set.length === 0) {
 | 
			
		||||
        this.set = [first]
 | 
			
		||||
      } else if (this.set.length > 1) {
 | 
			
		||||
        // if we have any that are *, then the range is just *
 | 
			
		||||
        for (const c of this.set) {
 | 
			
		||||
          if (c.length === 1 && isAny(c[0])) {
 | 
			
		||||
            this.set = [c]
 | 
			
		||||
            break
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.format()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  format () {
 | 
			
		||||
    this.range = this.set
 | 
			
		||||
      .map((comps) => comps.join(' ').trim())
 | 
			
		||||
      .join('||')
 | 
			
		||||
      .trim()
 | 
			
		||||
    return this.range
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  toString () {
 | 
			
		||||
    return this.range
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  parseRange (range) {
 | 
			
		||||
    // memoize range parsing for performance.
 | 
			
		||||
    // this is a very hot path, and fully deterministic.
 | 
			
		||||
    const memoOpts =
 | 
			
		||||
      (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |
 | 
			
		||||
      (this.options.loose && FLAG_LOOSE)
 | 
			
		||||
    const memoKey = memoOpts + ':' + range
 | 
			
		||||
    const cached = cache.get(memoKey)
 | 
			
		||||
    if (cached) {
 | 
			
		||||
      return cached
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const loose = this.options.loose
 | 
			
		||||
    // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
 | 
			
		||||
    const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]
 | 
			
		||||
    range = range.replace(hr, hyphenReplace(this.options.includePrerelease))
 | 
			
		||||
    debug('hyphen replace', range)
 | 
			
		||||
 | 
			
		||||
    // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
 | 
			
		||||
    range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)
 | 
			
		||||
    debug('comparator trim', range)
 | 
			
		||||
 | 
			
		||||
    // `~ 1.2.3` => `~1.2.3`
 | 
			
		||||
    range = range.replace(re[t.TILDETRIM], tildeTrimReplace)
 | 
			
		||||
    debug('tilde trim', range)
 | 
			
		||||
 | 
			
		||||
    // `^ 1.2.3` => `^1.2.3`
 | 
			
		||||
    range = range.replace(re[t.CARETTRIM], caretTrimReplace)
 | 
			
		||||
    debug('caret trim', range)
 | 
			
		||||
 | 
			
		||||
    // At this point, the range is completely trimmed and
 | 
			
		||||
    // ready to be split into comparators.
 | 
			
		||||
 | 
			
		||||
    let rangeList = range
 | 
			
		||||
      .split(' ')
 | 
			
		||||
      .map(comp => parseComparator(comp, this.options))
 | 
			
		||||
      .join(' ')
 | 
			
		||||
      .split(/\s+/)
 | 
			
		||||
      // >=0.0.0 is equivalent to *
 | 
			
		||||
      .map(comp => replaceGTE0(comp, this.options))
 | 
			
		||||
 | 
			
		||||
    if (loose) {
 | 
			
		||||
      // in loose mode, throw out any that are not valid comparators
 | 
			
		||||
      rangeList = rangeList.filter(comp => {
 | 
			
		||||
        debug('loose invalid filter', comp, this.options)
 | 
			
		||||
        return !!comp.match(re[t.COMPARATORLOOSE])
 | 
			
		||||
      })
 | 
			
		||||
    }
 | 
			
		||||
    debug('range list', rangeList)
 | 
			
		||||
 | 
			
		||||
    // if any comparators are the null set, then replace with JUST null set
 | 
			
		||||
    // if more than one comparator, remove any * comparators
 | 
			
		||||
    // also, don't include the same comparator more than once
 | 
			
		||||
    const rangeMap = new Map()
 | 
			
		||||
    const comparators = rangeList.map(comp => new Comparator(comp, this.options))
 | 
			
		||||
    for (const comp of comparators) {
 | 
			
		||||
      if (isNullSet(comp)) {
 | 
			
		||||
        return [comp]
 | 
			
		||||
      }
 | 
			
		||||
      rangeMap.set(comp.value, comp)
 | 
			
		||||
    }
 | 
			
		||||
    if (rangeMap.size > 1 && rangeMap.has('')) {
 | 
			
		||||
      rangeMap.delete('')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const result = [...rangeMap.values()]
 | 
			
		||||
    cache.set(memoKey, result)
 | 
			
		||||
    return result
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  intersects (range, options) {
 | 
			
		||||
    if (!(range instanceof Range)) {
 | 
			
		||||
      throw new TypeError('a Range is required')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return this.set.some((thisComparators) => {
 | 
			
		||||
      return (
 | 
			
		||||
        isSatisfiable(thisComparators, options) &&
 | 
			
		||||
        range.set.some((rangeComparators) => {
 | 
			
		||||
          return (
 | 
			
		||||
            isSatisfiable(rangeComparators, options) &&
 | 
			
		||||
            thisComparators.every((thisComparator) => {
 | 
			
		||||
              return rangeComparators.every((rangeComparator) => {
 | 
			
		||||
                return thisComparator.intersects(rangeComparator, options)
 | 
			
		||||
              })
 | 
			
		||||
            })
 | 
			
		||||
          )
 | 
			
		||||
        })
 | 
			
		||||
      )
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // if ANY of the sets match ALL of its comparators, then pass
 | 
			
		||||
  test (version) {
 | 
			
		||||
    if (!version) {
 | 
			
		||||
      return false
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (typeof version === 'string') {
 | 
			
		||||
      try {
 | 
			
		||||
        version = new SemVer(version, this.options)
 | 
			
		||||
      } catch (er) {
 | 
			
		||||
        return false
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (let i = 0; i < this.set.length; i++) {
 | 
			
		||||
      if (testSet(this.set[i], version, this.options)) {
 | 
			
		||||
        return true
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return false
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = Range
 | 
			
		||||
 | 
			
		||||
const LRU = require('lru-cache')
 | 
			
		||||
const cache = new LRU({ max: 1000 })
 | 
			
		||||
 | 
			
		||||
const parseOptions = require('../internal/parse-options')
 | 
			
		||||
const Comparator = require('./comparator')
 | 
			
		||||
const debug = require('../internal/debug')
 | 
			
		||||
const SemVer = require('./semver')
 | 
			
		||||
const {
 | 
			
		||||
  safeRe: re,
 | 
			
		||||
  t,
 | 
			
		||||
  comparatorTrimReplace,
 | 
			
		||||
  tildeTrimReplace,
 | 
			
		||||
  caretTrimReplace,
 | 
			
		||||
} = require('../internal/re')
 | 
			
		||||
const { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')
 | 
			
		||||
 | 
			
		||||
const isNullSet = c => c.value === '<0.0.0-0'
 | 
			
		||||
const isAny = c => c.value === ''
 | 
			
		||||
 | 
			
		||||
// take a set of comparators and determine whether there
 | 
			
		||||
// exists a version which can satisfy it
 | 
			
		||||
const isSatisfiable = (comparators, options) => {
 | 
			
		||||
  let result = true
 | 
			
		||||
  const remainingComparators = comparators.slice()
 | 
			
		||||
  let testComparator = remainingComparators.pop()
 | 
			
		||||
 | 
			
		||||
  while (result && remainingComparators.length) {
 | 
			
		||||
    result = remainingComparators.every((otherComparator) => {
 | 
			
		||||
      return testComparator.intersects(otherComparator, options)
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    testComparator = remainingComparators.pop()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// comprised of xranges, tildes, stars, and gtlt's at this point.
 | 
			
		||||
// already replaced the hyphen ranges
 | 
			
		||||
// turn into a set of JUST comparators.
 | 
			
		||||
const parseComparator = (comp, options) => {
 | 
			
		||||
  debug('comp', comp, options)
 | 
			
		||||
  comp = replaceCarets(comp, options)
 | 
			
		||||
  debug('caret', comp)
 | 
			
		||||
  comp = replaceTildes(comp, options)
 | 
			
		||||
  debug('tildes', comp)
 | 
			
		||||
  comp = replaceXRanges(comp, options)
 | 
			
		||||
  debug('xrange', comp)
 | 
			
		||||
  comp = replaceStars(comp, options)
 | 
			
		||||
  debug('stars', comp)
 | 
			
		||||
  return comp
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const isX = id => !id || id.toLowerCase() === 'x' || id === '*'
 | 
			
		||||
 | 
			
		||||
// ~, ~> --> * (any, kinda silly)
 | 
			
		||||
// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0
 | 
			
		||||
// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0
 | 
			
		||||
// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0
 | 
			
		||||
// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0
 | 
			
		||||
// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0
 | 
			
		||||
// ~0.0.1 --> >=0.0.1 <0.1.0-0
 | 
			
		||||
const replaceTildes = (comp, options) => {
 | 
			
		||||
  return comp
 | 
			
		||||
    .trim()
 | 
			
		||||
    .split(/\s+/)
 | 
			
		||||
    .map((c) => replaceTilde(c, options))
 | 
			
		||||
    .join(' ')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const replaceTilde = (comp, options) => {
 | 
			
		||||
  const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]
 | 
			
		||||
  return comp.replace(r, (_, M, m, p, pr) => {
 | 
			
		||||
    debug('tilde', comp, _, M, m, p, pr)
 | 
			
		||||
    let ret
 | 
			
		||||
 | 
			
		||||
    if (isX(M)) {
 | 
			
		||||
      ret = ''
 | 
			
		||||
    } else if (isX(m)) {
 | 
			
		||||
      ret = `>=${M}.0.0 <${+M + 1}.0.0-0`
 | 
			
		||||
    } else if (isX(p)) {
 | 
			
		||||
      // ~1.2 == >=1.2.0 <1.3.0-0
 | 
			
		||||
      ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`
 | 
			
		||||
    } else if (pr) {
 | 
			
		||||
      debug('replaceTilde pr', pr)
 | 
			
		||||
      ret = `>=${M}.${m}.${p}-${pr
 | 
			
		||||
      } <${M}.${+m + 1}.0-0`
 | 
			
		||||
    } else {
 | 
			
		||||
      // ~1.2.3 == >=1.2.3 <1.3.0-0
 | 
			
		||||
      ret = `>=${M}.${m}.${p
 | 
			
		||||
      } <${M}.${+m + 1}.0-0`
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    debug('tilde return', ret)
 | 
			
		||||
    return ret
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ^ --> * (any, kinda silly)
 | 
			
		||||
// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0
 | 
			
		||||
// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0
 | 
			
		||||
// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0
 | 
			
		||||
// ^1.2.3 --> >=1.2.3 <2.0.0-0
 | 
			
		||||
// ^1.2.0 --> >=1.2.0 <2.0.0-0
 | 
			
		||||
// ^0.0.1 --> >=0.0.1 <0.0.2-0
 | 
			
		||||
// ^0.1.0 --> >=0.1.0 <0.2.0-0
 | 
			
		||||
const replaceCarets = (comp, options) => {
 | 
			
		||||
  return comp
 | 
			
		||||
    .trim()
 | 
			
		||||
    .split(/\s+/)
 | 
			
		||||
    .map((c) => replaceCaret(c, options))
 | 
			
		||||
    .join(' ')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const replaceCaret = (comp, options) => {
 | 
			
		||||
  debug('caret', comp, options)
 | 
			
		||||
  const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]
 | 
			
		||||
  const z = options.includePrerelease ? '-0' : ''
 | 
			
		||||
  return comp.replace(r, (_, M, m, p, pr) => {
 | 
			
		||||
    debug('caret', comp, _, M, m, p, pr)
 | 
			
		||||
    let ret
 | 
			
		||||
 | 
			
		||||
    if (isX(M)) {
 | 
			
		||||
      ret = ''
 | 
			
		||||
    } else if (isX(m)) {
 | 
			
		||||
      ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`
 | 
			
		||||
    } else if (isX(p)) {
 | 
			
		||||
      if (M === '0') {
 | 
			
		||||
        ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`
 | 
			
		||||
      } else {
 | 
			
		||||
        ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`
 | 
			
		||||
      }
 | 
			
		||||
    } else if (pr) {
 | 
			
		||||
      debug('replaceCaret pr', pr)
 | 
			
		||||
      if (M === '0') {
 | 
			
		||||
        if (m === '0') {
 | 
			
		||||
          ret = `>=${M}.${m}.${p}-${pr
 | 
			
		||||
          } <${M}.${m}.${+p + 1}-0`
 | 
			
		||||
        } else {
 | 
			
		||||
          ret = `>=${M}.${m}.${p}-${pr
 | 
			
		||||
          } <${M}.${+m + 1}.0-0`
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        ret = `>=${M}.${m}.${p}-${pr
 | 
			
		||||
        } <${+M + 1}.0.0-0`
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      debug('no pr')
 | 
			
		||||
      if (M === '0') {
 | 
			
		||||
        if (m === '0') {
 | 
			
		||||
          ret = `>=${M}.${m}.${p
 | 
			
		||||
          }${z} <${M}.${m}.${+p + 1}-0`
 | 
			
		||||
        } else {
 | 
			
		||||
          ret = `>=${M}.${m}.${p
 | 
			
		||||
          }${z} <${M}.${+m + 1}.0-0`
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        ret = `>=${M}.${m}.${p
 | 
			
		||||
        } <${+M + 1}.0.0-0`
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    debug('caret return', ret)
 | 
			
		||||
    return ret
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const replaceXRanges = (comp, options) => {
 | 
			
		||||
  debug('replaceXRanges', comp, options)
 | 
			
		||||
  return comp
 | 
			
		||||
    .split(/\s+/)
 | 
			
		||||
    .map((c) => replaceXRange(c, options))
 | 
			
		||||
    .join(' ')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const replaceXRange = (comp, options) => {
 | 
			
		||||
  comp = comp.trim()
 | 
			
		||||
  const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]
 | 
			
		||||
  return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
 | 
			
		||||
    debug('xRange', comp, ret, gtlt, M, m, p, pr)
 | 
			
		||||
    const xM = isX(M)
 | 
			
		||||
    const xm = xM || isX(m)
 | 
			
		||||
    const xp = xm || isX(p)
 | 
			
		||||
    const anyX = xp
 | 
			
		||||
 | 
			
		||||
    if (gtlt === '=' && anyX) {
 | 
			
		||||
      gtlt = ''
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // if we're including prereleases in the match, then we need
 | 
			
		||||
    // to fix this to -0, the lowest possible prerelease value
 | 
			
		||||
    pr = options.includePrerelease ? '-0' : ''
 | 
			
		||||
 | 
			
		||||
    if (xM) {
 | 
			
		||||
      if (gtlt === '>' || gtlt === '<') {
 | 
			
		||||
        // nothing is allowed
 | 
			
		||||
        ret = '<0.0.0-0'
 | 
			
		||||
      } else {
 | 
			
		||||
        // nothing is forbidden
 | 
			
		||||
        ret = '*'
 | 
			
		||||
      }
 | 
			
		||||
    } else if (gtlt && anyX) {
 | 
			
		||||
      // we know patch is an x, because we have any x at all.
 | 
			
		||||
      // replace X with 0
 | 
			
		||||
      if (xm) {
 | 
			
		||||
        m = 0
 | 
			
		||||
      }
 | 
			
		||||
      p = 0
 | 
			
		||||
 | 
			
		||||
      if (gtlt === '>') {
 | 
			
		||||
        // >1 => >=2.0.0
 | 
			
		||||
        // >1.2 => >=1.3.0
 | 
			
		||||
        gtlt = '>='
 | 
			
		||||
        if (xm) {
 | 
			
		||||
          M = +M + 1
 | 
			
		||||
          m = 0
 | 
			
		||||
          p = 0
 | 
			
		||||
        } else {
 | 
			
		||||
          m = +m + 1
 | 
			
		||||
          p = 0
 | 
			
		||||
        }
 | 
			
		||||
      } else if (gtlt === '<=') {
 | 
			
		||||
        // <=0.7.x is actually <0.8.0, since any 0.7.x should
 | 
			
		||||
        // pass.  Similarly, <=7.x is actually <8.0.0, etc.
 | 
			
		||||
        gtlt = '<'
 | 
			
		||||
        if (xm) {
 | 
			
		||||
          M = +M + 1
 | 
			
		||||
        } else {
 | 
			
		||||
          m = +m + 1
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (gtlt === '<') {
 | 
			
		||||
        pr = '-0'
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      ret = `${gtlt + M}.${m}.${p}${pr}`
 | 
			
		||||
    } else if (xm) {
 | 
			
		||||
      ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`
 | 
			
		||||
    } else if (xp) {
 | 
			
		||||
      ret = `>=${M}.${m}.0${pr
 | 
			
		||||
      } <${M}.${+m + 1}.0-0`
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    debug('xRange return', ret)
 | 
			
		||||
 | 
			
		||||
    return ret
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Because * is AND-ed with everything else in the comparator,
 | 
			
		||||
// and '' means "any version", just remove the *s entirely.
 | 
			
		||||
const replaceStars = (comp, options) => {
 | 
			
		||||
  debug('replaceStars', comp, options)
 | 
			
		||||
  // Looseness is ignored here.  star is always as loose as it gets!
 | 
			
		||||
  return comp
 | 
			
		||||
    .trim()
 | 
			
		||||
    .replace(re[t.STAR], '')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const replaceGTE0 = (comp, options) => {
 | 
			
		||||
  debug('replaceGTE0', comp, options)
 | 
			
		||||
  return comp
 | 
			
		||||
    .trim()
 | 
			
		||||
    .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// This function is passed to string.replace(re[t.HYPHENRANGE])
 | 
			
		||||
// M, m, patch, prerelease, build
 | 
			
		||||
// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
 | 
			
		||||
// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do
 | 
			
		||||
// 1.2 - 3.4 => >=1.2.0 <3.5.0-0
 | 
			
		||||
const hyphenReplace = incPr => ($0,
 | 
			
		||||
  from, fM, fm, fp, fpr, fb,
 | 
			
		||||
  to, tM, tm, tp, tpr, tb) => {
 | 
			
		||||
  if (isX(fM)) {
 | 
			
		||||
    from = ''
 | 
			
		||||
  } else if (isX(fm)) {
 | 
			
		||||
    from = `>=${fM}.0.0${incPr ? '-0' : ''}`
 | 
			
		||||
  } else if (isX(fp)) {
 | 
			
		||||
    from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`
 | 
			
		||||
  } else if (fpr) {
 | 
			
		||||
    from = `>=${from}`
 | 
			
		||||
  } else {
 | 
			
		||||
    from = `>=${from}${incPr ? '-0' : ''}`
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (isX(tM)) {
 | 
			
		||||
    to = ''
 | 
			
		||||
  } else if (isX(tm)) {
 | 
			
		||||
    to = `<${+tM + 1}.0.0-0`
 | 
			
		||||
  } else if (isX(tp)) {
 | 
			
		||||
    to = `<${tM}.${+tm + 1}.0-0`
 | 
			
		||||
  } else if (tpr) {
 | 
			
		||||
    to = `<=${tM}.${tm}.${tp}-${tpr}`
 | 
			
		||||
  } else if (incPr) {
 | 
			
		||||
    to = `<${tM}.${tm}.${+tp + 1}-0`
 | 
			
		||||
  } else {
 | 
			
		||||
    to = `<=${to}`
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return `${from} ${to}`.trim()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const testSet = (set, version, options) => {
 | 
			
		||||
  for (let i = 0; i < set.length; i++) {
 | 
			
		||||
    if (!set[i].test(version)) {
 | 
			
		||||
      return false
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (version.prerelease.length && !options.includePrerelease) {
 | 
			
		||||
    // Find the set of versions that are allowed to have prereleases
 | 
			
		||||
    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
 | 
			
		||||
    // That should allow `1.2.3-pr.2` to pass.
 | 
			
		||||
    // However, `1.2.4-alpha.notready` should NOT be allowed,
 | 
			
		||||
    // even though it's within the range set by the comparators.
 | 
			
		||||
    for (let i = 0; i < set.length; i++) {
 | 
			
		||||
      debug(set[i].semver)
 | 
			
		||||
      if (set[i].semver === Comparator.ANY) {
 | 
			
		||||
        continue
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (set[i].semver.prerelease.length > 0) {
 | 
			
		||||
        const allowed = set[i].semver
 | 
			
		||||
        if (allowed.major === version.major &&
 | 
			
		||||
            allowed.minor === version.minor &&
 | 
			
		||||
            allowed.patch === version.patch) {
 | 
			
		||||
          return true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Version has a -pre, but it's not one of the ones we like.
 | 
			
		||||
    return false
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return true
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										302
									
								
								node_modules/semver/classes/semver.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										302
									
								
								node_modules/semver/classes/semver.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,302 @@
 | 
			
		||||
const debug = require('../internal/debug')
 | 
			
		||||
const { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')
 | 
			
		||||
const { safeRe: re, t } = require('../internal/re')
 | 
			
		||||
 | 
			
		||||
const parseOptions = require('../internal/parse-options')
 | 
			
		||||
const { compareIdentifiers } = require('../internal/identifiers')
 | 
			
		||||
class SemVer {
 | 
			
		||||
  constructor (version, options) {
 | 
			
		||||
    options = parseOptions(options)
 | 
			
		||||
 | 
			
		||||
    if (version instanceof SemVer) {
 | 
			
		||||
      if (version.loose === !!options.loose &&
 | 
			
		||||
          version.includePrerelease === !!options.includePrerelease) {
 | 
			
		||||
        return version
 | 
			
		||||
      } else {
 | 
			
		||||
        version = version.version
 | 
			
		||||
      }
 | 
			
		||||
    } else if (typeof version !== 'string') {
 | 
			
		||||
      throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (version.length > MAX_LENGTH) {
 | 
			
		||||
      throw new TypeError(
 | 
			
		||||
        `version is longer than ${MAX_LENGTH} characters`
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    debug('SemVer', version, options)
 | 
			
		||||
    this.options = options
 | 
			
		||||
    this.loose = !!options.loose
 | 
			
		||||
    // this isn't actually relevant for versions, but keep it so that we
 | 
			
		||||
    // don't run into trouble passing this.options around.
 | 
			
		||||
    this.includePrerelease = !!options.includePrerelease
 | 
			
		||||
 | 
			
		||||
    const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])
 | 
			
		||||
 | 
			
		||||
    if (!m) {
 | 
			
		||||
      throw new TypeError(`Invalid Version: ${version}`)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.raw = version
 | 
			
		||||
 | 
			
		||||
    // these are actually numbers
 | 
			
		||||
    this.major = +m[1]
 | 
			
		||||
    this.minor = +m[2]
 | 
			
		||||
    this.patch = +m[3]
 | 
			
		||||
 | 
			
		||||
    if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
 | 
			
		||||
      throw new TypeError('Invalid major version')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
 | 
			
		||||
      throw new TypeError('Invalid minor version')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
 | 
			
		||||
      throw new TypeError('Invalid patch version')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // numberify any prerelease numeric ids
 | 
			
		||||
    if (!m[4]) {
 | 
			
		||||
      this.prerelease = []
 | 
			
		||||
    } else {
 | 
			
		||||
      this.prerelease = m[4].split('.').map((id) => {
 | 
			
		||||
        if (/^[0-9]+$/.test(id)) {
 | 
			
		||||
          const num = +id
 | 
			
		||||
          if (num >= 0 && num < MAX_SAFE_INTEGER) {
 | 
			
		||||
            return num
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        return id
 | 
			
		||||
      })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.build = m[5] ? m[5].split('.') : []
 | 
			
		||||
    this.format()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  format () {
 | 
			
		||||
    this.version = `${this.major}.${this.minor}.${this.patch}`
 | 
			
		||||
    if (this.prerelease.length) {
 | 
			
		||||
      this.version += `-${this.prerelease.join('.')}`
 | 
			
		||||
    }
 | 
			
		||||
    return this.version
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  toString () {
 | 
			
		||||
    return this.version
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  compare (other) {
 | 
			
		||||
    debug('SemVer.compare', this.version, this.options, other)
 | 
			
		||||
    if (!(other instanceof SemVer)) {
 | 
			
		||||
      if (typeof other === 'string' && other === this.version) {
 | 
			
		||||
        return 0
 | 
			
		||||
      }
 | 
			
		||||
      other = new SemVer(other, this.options)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (other.version === this.version) {
 | 
			
		||||
      return 0
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return this.compareMain(other) || this.comparePre(other)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  compareMain (other) {
 | 
			
		||||
    if (!(other instanceof SemVer)) {
 | 
			
		||||
      other = new SemVer(other, this.options)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
      compareIdentifiers(this.major, other.major) ||
 | 
			
		||||
      compareIdentifiers(this.minor, other.minor) ||
 | 
			
		||||
      compareIdentifiers(this.patch, other.patch)
 | 
			
		||||
    )
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  comparePre (other) {
 | 
			
		||||
    if (!(other instanceof SemVer)) {
 | 
			
		||||
      other = new SemVer(other, this.options)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // NOT having a prerelease is > having one
 | 
			
		||||
    if (this.prerelease.length && !other.prerelease.length) {
 | 
			
		||||
      return -1
 | 
			
		||||
    } else if (!this.prerelease.length && other.prerelease.length) {
 | 
			
		||||
      return 1
 | 
			
		||||
    } else if (!this.prerelease.length && !other.prerelease.length) {
 | 
			
		||||
      return 0
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let i = 0
 | 
			
		||||
    do {
 | 
			
		||||
      const a = this.prerelease[i]
 | 
			
		||||
      const b = other.prerelease[i]
 | 
			
		||||
      debug('prerelease compare', i, a, b)
 | 
			
		||||
      if (a === undefined && b === undefined) {
 | 
			
		||||
        return 0
 | 
			
		||||
      } else if (b === undefined) {
 | 
			
		||||
        return 1
 | 
			
		||||
      } else if (a === undefined) {
 | 
			
		||||
        return -1
 | 
			
		||||
      } else if (a === b) {
 | 
			
		||||
        continue
 | 
			
		||||
      } else {
 | 
			
		||||
        return compareIdentifiers(a, b)
 | 
			
		||||
      }
 | 
			
		||||
    } while (++i)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  compareBuild (other) {
 | 
			
		||||
    if (!(other instanceof SemVer)) {
 | 
			
		||||
      other = new SemVer(other, this.options)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let i = 0
 | 
			
		||||
    do {
 | 
			
		||||
      const a = this.build[i]
 | 
			
		||||
      const b = other.build[i]
 | 
			
		||||
      debug('prerelease compare', i, a, b)
 | 
			
		||||
      if (a === undefined && b === undefined) {
 | 
			
		||||
        return 0
 | 
			
		||||
      } else if (b === undefined) {
 | 
			
		||||
        return 1
 | 
			
		||||
      } else if (a === undefined) {
 | 
			
		||||
        return -1
 | 
			
		||||
      } else if (a === b) {
 | 
			
		||||
        continue
 | 
			
		||||
      } else {
 | 
			
		||||
        return compareIdentifiers(a, b)
 | 
			
		||||
      }
 | 
			
		||||
    } while (++i)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // preminor will bump the version up to the next minor release, and immediately
 | 
			
		||||
  // down to pre-release. premajor and prepatch work the same way.
 | 
			
		||||
  inc (release, identifier, identifierBase) {
 | 
			
		||||
    switch (release) {
 | 
			
		||||
      case 'premajor':
 | 
			
		||||
        this.prerelease.length = 0
 | 
			
		||||
        this.patch = 0
 | 
			
		||||
        this.minor = 0
 | 
			
		||||
        this.major++
 | 
			
		||||
        this.inc('pre', identifier, identifierBase)
 | 
			
		||||
        break
 | 
			
		||||
      case 'preminor':
 | 
			
		||||
        this.prerelease.length = 0
 | 
			
		||||
        this.patch = 0
 | 
			
		||||
        this.minor++
 | 
			
		||||
        this.inc('pre', identifier, identifierBase)
 | 
			
		||||
        break
 | 
			
		||||
      case 'prepatch':
 | 
			
		||||
        // If this is already a prerelease, it will bump to the next version
 | 
			
		||||
        // drop any prereleases that might already exist, since they are not
 | 
			
		||||
        // relevant at this point.
 | 
			
		||||
        this.prerelease.length = 0
 | 
			
		||||
        this.inc('patch', identifier, identifierBase)
 | 
			
		||||
        this.inc('pre', identifier, identifierBase)
 | 
			
		||||
        break
 | 
			
		||||
      // If the input is a non-prerelease version, this acts the same as
 | 
			
		||||
      // prepatch.
 | 
			
		||||
      case 'prerelease':
 | 
			
		||||
        if (this.prerelease.length === 0) {
 | 
			
		||||
          this.inc('patch', identifier, identifierBase)
 | 
			
		||||
        }
 | 
			
		||||
        this.inc('pre', identifier, identifierBase)
 | 
			
		||||
        break
 | 
			
		||||
 | 
			
		||||
      case 'major':
 | 
			
		||||
        // If this is a pre-major version, bump up to the same major version.
 | 
			
		||||
        // Otherwise increment major.
 | 
			
		||||
        // 1.0.0-5 bumps to 1.0.0
 | 
			
		||||
        // 1.1.0 bumps to 2.0.0
 | 
			
		||||
        if (
 | 
			
		||||
          this.minor !== 0 ||
 | 
			
		||||
          this.patch !== 0 ||
 | 
			
		||||
          this.prerelease.length === 0
 | 
			
		||||
        ) {
 | 
			
		||||
          this.major++
 | 
			
		||||
        }
 | 
			
		||||
        this.minor = 0
 | 
			
		||||
        this.patch = 0
 | 
			
		||||
        this.prerelease = []
 | 
			
		||||
        break
 | 
			
		||||
      case 'minor':
 | 
			
		||||
        // If this is a pre-minor version, bump up to the same minor version.
 | 
			
		||||
        // Otherwise increment minor.
 | 
			
		||||
        // 1.2.0-5 bumps to 1.2.0
 | 
			
		||||
        // 1.2.1 bumps to 1.3.0
 | 
			
		||||
        if (this.patch !== 0 || this.prerelease.length === 0) {
 | 
			
		||||
          this.minor++
 | 
			
		||||
        }
 | 
			
		||||
        this.patch = 0
 | 
			
		||||
        this.prerelease = []
 | 
			
		||||
        break
 | 
			
		||||
      case 'patch':
 | 
			
		||||
        // If this is not a pre-release version, it will increment the patch.
 | 
			
		||||
        // If it is a pre-release it will bump up to the same patch version.
 | 
			
		||||
        // 1.2.0-5 patches to 1.2.0
 | 
			
		||||
        // 1.2.0 patches to 1.2.1
 | 
			
		||||
        if (this.prerelease.length === 0) {
 | 
			
		||||
          this.patch++
 | 
			
		||||
        }
 | 
			
		||||
        this.prerelease = []
 | 
			
		||||
        break
 | 
			
		||||
      // This probably shouldn't be used publicly.
 | 
			
		||||
      // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.
 | 
			
		||||
      case 'pre': {
 | 
			
		||||
        const base = Number(identifierBase) ? 1 : 0
 | 
			
		||||
 | 
			
		||||
        if (!identifier && identifierBase === false) {
 | 
			
		||||
          throw new Error('invalid increment argument: identifier is empty')
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (this.prerelease.length === 0) {
 | 
			
		||||
          this.prerelease = [base]
 | 
			
		||||
        } else {
 | 
			
		||||
          let i = this.prerelease.length
 | 
			
		||||
          while (--i >= 0) {
 | 
			
		||||
            if (typeof this.prerelease[i] === 'number') {
 | 
			
		||||
              this.prerelease[i]++
 | 
			
		||||
              i = -2
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          if (i === -1) {
 | 
			
		||||
            // didn't increment anything
 | 
			
		||||
            if (identifier === this.prerelease.join('.') && identifierBase === false) {
 | 
			
		||||
              throw new Error('invalid increment argument: identifier already exists')
 | 
			
		||||
            }
 | 
			
		||||
            this.prerelease.push(base)
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        if (identifier) {
 | 
			
		||||
          // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
 | 
			
		||||
          // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
 | 
			
		||||
          let prerelease = [identifier, base]
 | 
			
		||||
          if (identifierBase === false) {
 | 
			
		||||
            prerelease = [identifier]
 | 
			
		||||
          }
 | 
			
		||||
          if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
 | 
			
		||||
            if (isNaN(this.prerelease[1])) {
 | 
			
		||||
              this.prerelease = prerelease
 | 
			
		||||
            }
 | 
			
		||||
          } else {
 | 
			
		||||
            this.prerelease = prerelease
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        break
 | 
			
		||||
      }
 | 
			
		||||
      default:
 | 
			
		||||
        throw new Error(`invalid increment argument: ${release}`)
 | 
			
		||||
    }
 | 
			
		||||
    this.raw = this.format()
 | 
			
		||||
    if (this.build.length) {
 | 
			
		||||
      this.raw += `+${this.build.join('.')}`
 | 
			
		||||
    }
 | 
			
		||||
    return this
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = SemVer
 | 
			
		||||
		Reference in New Issue
	
	Block a user