summaryrefslogtreecommitdiff
path: root/tools/node_modules/eslint/node_modules/semver/semver.js
diff options
context:
space:
mode:
Diffstat (limited to 'tools/node_modules/eslint/node_modules/semver/semver.js')
-rw-r--r--tools/node_modules/eslint/node_modules/semver/semver.js152
1 files changed, 129 insertions, 23 deletions
diff --git a/tools/node_modules/eslint/node_modules/semver/semver.js b/tools/node_modules/eslint/node_modules/semver/semver.js
index d315d5d68b..fd6453f49e 100644
--- a/tools/node_modules/eslint/node_modules/semver/semver.js
+++ b/tools/node_modules/eslint/node_modules/semver/semver.js
@@ -160,11 +160,13 @@ src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'
// Coercion.
// Extract anything that could conceivably be a part of a valid semver
var COERCE = R++
-src[COERCE] = '(?:^|[^\\d])' +
+src[COERCE] = '(^|[^\\d])' +
'(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +
'(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
'(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
'(?:$|[^\\d])'
+var COERCERTL = R++
+re[COERCERTL] = new RegExp(src[COERCE], 'g')
// Tilde ranges.
// Meaning is "reasonably at or greater than"
@@ -425,6 +427,30 @@ SemVer.prototype.comparePre = function (other) {
} while (++i)
}
+SemVer.prototype.compareBuild = function (other) {
+ if (!(other instanceof SemVer)) {
+ other = new SemVer(other, this.options)
+ }
+
+ var i = 0
+ do {
+ var a = this.build[i]
+ var 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.
SemVer.prototype.inc = function (release, identifier) {
@@ -619,6 +645,13 @@ function compareLoose (a, b) {
return compare(a, b, true)
}
+exports.compareBuild = compareBuild
+function compareBuild (a, b, loose) {
+ var versionA = new SemVer(a, loose)
+ var versionB = new SemVer(b, loose)
+ return versionA.compare(versionB) || versionA.compareBuild(versionB)
+}
+
exports.rcompare = rcompare
function rcompare (a, b, loose) {
return compare(b, a, loose)
@@ -627,14 +660,14 @@ function rcompare (a, b, loose) {
exports.sort = sort
function sort (list, loose) {
return list.sort(function (a, b) {
- return exports.compare(a, b, loose)
+ return exports.compareBuild(a, b, loose)
})
}
exports.rsort = rsort
function rsort (list, loose) {
return list.sort(function (a, b) {
- return exports.rcompare(a, b, loose)
+ return exports.compareBuild(b, a, loose)
})
}
@@ -754,7 +787,7 @@ Comparator.prototype.parse = function (comp) {
throw new TypeError('Invalid comparator: ' + comp)
}
- this.operator = m[1]
+ this.operator = m[1] !== undefined ? m[1] : ''
if (this.operator === '=') {
this.operator = ''
}
@@ -774,12 +807,16 @@ Comparator.prototype.toString = function () {
Comparator.prototype.test = function (version) {
debug('Comparator.test', version, this.options.loose)
- if (this.semver === ANY) {
+ if (this.semver === ANY || version === ANY) {
return true
}
if (typeof version === 'string') {
- version = new SemVer(version, this.options)
+ try {
+ version = new SemVer(version, this.options)
+ } catch (er) {
+ return false
+ }
}
return cmp(version, this.operator, this.semver, this.options)
@@ -800,9 +837,15 @@ Comparator.prototype.intersects = function (comp, options) {
var rangeTmp
if (this.operator === '') {
+ if (this.value === '') {
+ return true
+ }
rangeTmp = new Range(comp.value, options)
return satisfies(this.value, rangeTmp, options)
} else if (comp.operator === '') {
+ if (comp.value === '') {
+ return true
+ }
rangeTmp = new Range(this.value, options)
return satisfies(comp.semver, rangeTmp, options)
}
@@ -934,16 +977,40 @@ Range.prototype.intersects = function (range, options) {
}
return this.set.some(function (thisComparators) {
- return thisComparators.every(function (thisComparator) {
- return range.set.some(function (rangeComparators) {
- return rangeComparators.every(function (rangeComparator) {
- return thisComparator.intersects(rangeComparator, options)
- })
+ return (
+ isSatisfiable(thisComparators, options) &&
+ range.set.some(function (rangeComparators) {
+ return (
+ isSatisfiable(rangeComparators, options) &&
+ thisComparators.every(function (thisComparator) {
+ return rangeComparators.every(function (rangeComparator) {
+ return thisComparator.intersects(rangeComparator, options)
+ })
+ })
+ )
})
- })
+ )
})
}
+// take a set of comparators and determine whether there
+// exists a version which can satisfy it
+function isSatisfiable (comparators, options) {
+ var result = true
+ var remainingComparators = comparators.slice()
+ var testComparator = remainingComparators.pop()
+
+ while (result && remainingComparators.length) {
+ result = remainingComparators.every(function (otherComparator) {
+ return testComparator.intersects(otherComparator, options)
+ })
+
+ testComparator = remainingComparators.pop()
+ }
+
+ return result
+}
+
// Mostly just for testing and legacy API reasons
exports.toComparators = toComparators
function toComparators (range, options) {
@@ -1099,10 +1166,14 @@ function replaceXRange (comp, options) {
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'
+ ret = '<0.0.0-0'
} else {
// nothing is forbidden
ret = '*'
@@ -1139,11 +1210,12 @@ function replaceXRange (comp, options) {
}
}
- ret = gtlt + M + '.' + m + '.' + p
+ ret = gtlt + M + '.' + m + '.' + p + pr
} else if (xm) {
- ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
+ ret = '>=' + M + '.0.0' + pr + ' <' + (+M + 1) + '.0.0' + pr
} else if (xp) {
- ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
+ ret = '>=' + M + '.' + m + '.0' + pr +
+ ' <' + M + '.' + (+m + 1) + '.0' + pr
}
debug('xRange return', ret)
@@ -1200,7 +1272,11 @@ Range.prototype.test = function (version) {
}
if (typeof version === 'string') {
- version = new SemVer(version, this.options)
+ try {
+ version = new SemVer(version, this.options)
+ } catch (er) {
+ return false
+ }
}
for (var i = 0; i < this.set.length; i++) {
@@ -1462,22 +1538,52 @@ function intersects (r1, r2, options) {
}
exports.coerce = coerce
-function coerce (version) {
+function coerce (version, options) {
if (version instanceof SemVer) {
return version
}
+ if (typeof version === 'number') {
+ version = String(version)
+ }
+
if (typeof version !== 'string') {
return null
}
- var match = version.match(re[COERCE])
+ options = options || {}
+
+ var match = null
+ if (!options.rtl) {
+ match = version.match(re[COERCE])
+ } else {
+ // Find the right-most coercible string that does not share
+ // a terminus with a more left-ward coercible string.
+ // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'
+ //
+ // Walk through the string checking with a /g regexp
+ // Manually set the index so as to pick up overlapping matches.
+ // Stop when we get a match that ends at the string end, since no
+ // coercible string can be more right-ward without the same terminus.
+ var next
+ while ((next = re[COERCERTL].exec(version)) &&
+ (!match || match.index + match[0].length !== version.length)
+ ) {
+ if (!match ||
+ next.index + next[0].length !== match.index + match[0].length) {
+ match = next
+ }
+ re[COERCERTL].lastIndex = next.index + next[1].length + next[2].length
+ }
+ // leave it in a clean state
+ re[COERCERTL].lastIndex = -1
+ }
- if (match == null) {
+ if (match === null) {
return null
}
- return parse(match[1] +
- '.' + (match[2] || '0') +
- '.' + (match[3] || '0'))
+ return parse(match[2] +
+ '.' + (match[3] || '0') +
+ '.' + (match[4] || '0'), options)
}