diff options
Diffstat (limited to 'node_modules/semver')
| -rw-r--r-- | node_modules/semver/CHANGELOG.md | 70 | ||||
| -rw-r--r-- | node_modules/semver/LICENSE | 15 | ||||
| -rw-r--r-- | node_modules/semver/README.md | 443 | ||||
| -rwxr-xr-x | node_modules/semver/bin/semver.js | 174 | ||||
| -rw-r--r-- | node_modules/semver/package.json | 28 | ||||
| -rw-r--r-- | node_modules/semver/range.bnf | 16 | ||||
| -rw-r--r-- | node_modules/semver/semver.js | 1596 | 
7 files changed, 2342 insertions, 0 deletions
diff --git a/node_modules/semver/CHANGELOG.md b/node_modules/semver/CHANGELOG.md new file mode 100644 index 0000000..f567dd3 --- /dev/null +++ b/node_modules/semver/CHANGELOG.md @@ -0,0 +1,70 @@ +# changes log + +## 6.2.0 + +* Coerce numbers to strings when passed to semver.coerce() +* Add `rtl` option to coerce from right to left + +## 6.1.3 + +* Handle X-ranges properly in includePrerelease mode + +## 6.1.2 + +* Do not throw when testing invalid version strings + +## 6.1.1 + +* Add options support for semver.coerce() +* Handle undefined version passed to Range.test + +## 6.1.0 + +* Add semver.compareBuild function +* Support `*` in semver.intersects + +## 6.0 + +* Fix `intersects` logic. + +    This is technically a bug fix, but since it is also a change to behavior +    that may require users updating their code, it is marked as a major +    version increment. + +## 5.7 + +* Add `minVersion` method + +## 5.6 + +* Move boolean `loose` param to an options object, with +  backwards-compatibility protection. +* Add ability to opt out of special prerelease version handling with +  the `includePrerelease` option flag. + +## 5.5 + +* Add version coercion capabilities + +## 5.4 + +* Add intersection checking + +## 5.3 + +* Add `minSatisfying` method + +## 5.2 + +* Add `prerelease(v)` that returns prerelease components + +## 5.1 + +* Add Backus-Naur for ranges +* Remove excessively cute inspection methods + +## 5.0 + +* Remove AMD/Browserified build artifacts +* Fix ltr and gtr when using the `*` range +* Fix for range `*` with a prerelease identifier diff --git a/node_modules/semver/LICENSE b/node_modules/semver/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/semver/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/semver/README.md b/node_modules/semver/README.md new file mode 100644 index 0000000..2293a14 --- /dev/null +++ b/node_modules/semver/README.md @@ -0,0 +1,443 @@ +semver(1) -- The semantic versioner for npm +=========================================== + +## Install + +```bash +npm install semver +```` + +## Usage + +As a node module: + +```js +const semver = require('semver') + +semver.valid('1.2.3') // '1.2.3' +semver.valid('a.b.c') // null +semver.clean('  =v1.2.3   ') // '1.2.3' +semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true +semver.gt('1.2.3', '9.8.7') // false +semver.lt('1.2.3', '9.8.7') // true +semver.minVersion('>=1.0.0') // '1.0.0' +semver.valid(semver.coerce('v2')) // '2.0.0' +semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7' +``` + +As a command-line utility: + +``` +$ semver -h + +A JavaScript implementation of the https://semver.org/ specification +Copyright Isaac Z. Schlueter + +Usage: semver [options] <version> [<version> [...]] +Prints valid versions sorted by SemVer precedence + +Options: +-r --range <range> +        Print versions that match the specified range. + +-i --increment [<level>] +        Increment a version by the specified level.  Level can +        be one of: major, minor, patch, premajor, preminor, +        prepatch, or prerelease.  Default level is 'patch'. +        Only one version may be specified. + +--preid <identifier> +        Identifier to be used to prefix premajor, preminor, +        prepatch or prerelease version increments. + +-l --loose +        Interpret versions and ranges loosely + +-p --include-prerelease +        Always include prerelease versions in range matching + +-c --coerce +        Coerce a string into SemVer if possible +        (does not imply --loose) + +--rtl +        Coerce version strings right to left + +--ltr +        Coerce version strings left to right (default) + +Program exits successfully if any valid version satisfies +all supplied ranges, and prints all satisfying versions. + +If no satisfying versions are found, then exits failure. + +Versions are printed in ascending order, so supplying +multiple versions to the utility will just sort them. +``` + +## Versions + +A "version" is described by the `v2.0.0` specification found at +<https://semver.org/>. + +A leading `"="` or `"v"` character is stripped off and ignored. + +## Ranges + +A `version range` is a set of `comparators` which specify versions +that satisfy the range. + +A `comparator` is composed of an `operator` and a `version`.  The set +of primitive `operators` is: + +* `<` Less than +* `<=` Less than or equal to +* `>` Greater than +* `>=` Greater than or equal to +* `=` Equal.  If no operator is specified, then equality is assumed, +  so this operator is optional, but MAY be included. + +For example, the comparator `>=1.2.7` would match the versions +`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6` +or `1.1.0`. + +Comparators can be joined by whitespace to form a `comparator set`, +which is satisfied by the **intersection** of all of the comparators +it includes. + +A range is composed of one or more comparator sets, joined by `||`.  A +version matches a range if and only if every comparator in at least +one of the `||`-separated comparator sets is satisfied by the version. + +For example, the range `>=1.2.7 <1.3.0` would match the versions +`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`, +or `1.1.0`. + +The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`, +`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`. + +### Prerelease Tags + +If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then +it will only be allowed to satisfy comparator sets if at least one +comparator with the same `[major, minor, patch]` tuple also has a +prerelease tag. + +For example, the range `>1.2.3-alpha.3` would be allowed to match the +version `1.2.3-alpha.7`, but it would *not* be satisfied by +`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater +than" `1.2.3-alpha.3` according to the SemVer sort rules.  The version +range only accepts prerelease tags on the `1.2.3` version.  The +version `3.4.5` *would* satisfy the range, because it does not have a +prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`. + +The purpose for this behavior is twofold.  First, prerelease versions +frequently are updated very quickly, and contain many breaking changes +that are (by the author's design) not yet fit for public consumption. +Therefore, by default, they are excluded from range matching +semantics. + +Second, a user who has opted into using a prerelease version has +clearly indicated the intent to use *that specific* set of +alpha/beta/rc versions.  By including a prerelease tag in the range, +the user is indicating that they are aware of the risk.  However, it +is still not appropriate to assume that they have opted into taking a +similar risk on the *next* set of prerelease versions. + +Note that this behavior can be suppressed (treating all prerelease +versions as if they were normal versions, for the purpose of range +matching) by setting the `includePrerelease` flag on the options +object to any +[functions](https://github.com/npm/node-semver#functions) that do +range matching. + +#### Prerelease Identifiers + +The method `.inc` takes an additional `identifier` string argument that +will append the value of the string as a prerelease identifier: + +```javascript +semver.inc('1.2.3', 'prerelease', 'beta') +// '1.2.4-beta.0' +``` + +command-line example: + +```bash +$ semver 1.2.3 -i prerelease --preid beta +1.2.4-beta.0 +``` + +Which then can be used to increment further: + +```bash +$ semver 1.2.4-beta.0 -i prerelease +1.2.4-beta.1 +``` + +### Advanced Range Syntax + +Advanced range syntax desugars to primitive comparators in +deterministic ways. + +Advanced ranges may be combined in the same way as primitive +comparators using white space or `||`. + +#### Hyphen Ranges `X.Y.Z - A.B.C` + +Specifies an inclusive set. + +* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4` + +If a partial version is provided as the first version in the inclusive +range, then the missing pieces are replaced with zeroes. + +* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4` + +If a partial version is provided as the second version in the +inclusive range, then all versions that start with the supplied parts +of the tuple are accepted, but nothing that would be greater than the +provided tuple parts. + +* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0` +* `1.2.3 - 2` := `>=1.2.3 <3.0.0` + +#### X-Ranges `1.2.x` `1.X` `1.2.*` `*` + +Any of `X`, `x`, or `*` may be used to "stand in" for one of the +numeric values in the `[major, minor, patch]` tuple. + +* `*` := `>=0.0.0` (Any version satisfies) +* `1.x` := `>=1.0.0 <2.0.0` (Matching major version) +* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions) + +A partial version range is treated as an X-Range, so the special +character is in fact optional. + +* `""` (empty string) := `*` := `>=0.0.0` +* `1` := `1.x.x` := `>=1.0.0 <2.0.0` +* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0` + +#### Tilde Ranges `~1.2.3` `~1.2` `~1` + +Allows patch-level changes if a minor version is specified on the +comparator.  Allows minor-level changes if not. + +* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0` +* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`) +* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`) +* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0` +* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`) +* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`) +* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in +  the `1.2.3` version will be allowed, if they are greater than or +  equal to `beta.2`.  So, `1.2.3-beta.4` would be allowed, but +  `1.2.4-beta.2` would not, because it is a prerelease of a +  different `[major, minor, patch]` tuple. + +#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4` + +Allows changes that do not modify the left-most non-zero element in the +`[major, minor, patch]` tuple.  In other words, this allows patch and +minor updates for versions `1.0.0` and above, patch updates for +versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`. + +Many authors treat a `0.x` version as if the `x` were the major +"breaking-change" indicator. + +Caret ranges are ideal when an author may make breaking changes +between `0.2.4` and `0.3.0` releases, which is a common practice. +However, it presumes that there will *not* be breaking changes between +`0.2.4` and `0.2.5`.  It allows for changes that are presumed to be +additive (but non-breaking), according to commonly observed practices. + +* `^1.2.3` := `>=1.2.3 <2.0.0` +* `^0.2.3` := `>=0.2.3 <0.3.0` +* `^0.0.3` := `>=0.0.3 <0.0.4` +* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in +  the `1.2.3` version will be allowed, if they are greater than or +  equal to `beta.2`.  So, `1.2.3-beta.4` would be allowed, but +  `1.2.4-beta.2` would not, because it is a prerelease of a +  different `[major, minor, patch]` tuple. +* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4`  Note that prereleases in the +  `0.0.3` version *only* will be allowed, if they are greater than or +  equal to `beta`.  So, `0.0.3-pr.2` would be allowed. + +When parsing caret ranges, a missing `patch` value desugars to the +number `0`, but will allow flexibility within that value, even if the +major and minor versions are both `0`. + +* `^1.2.x` := `>=1.2.0 <2.0.0` +* `^0.0.x` := `>=0.0.0 <0.1.0` +* `^0.0` := `>=0.0.0 <0.1.0` + +A missing `minor` and `patch` values will desugar to zero, but also +allow flexibility within those values, even if the major version is +zero. + +* `^1.x` := `>=1.0.0 <2.0.0` +* `^0.x` := `>=0.0.0 <1.0.0` + +### Range Grammar + +Putting all this together, here is a Backus-Naur grammar for ranges, +for the benefit of parser authors: + +```bnf +range-set  ::= range ( logical-or range ) * +logical-or ::= ( ' ' ) * '||' ( ' ' ) * +range      ::= hyphen | simple ( ' ' simple ) * | '' +hyphen     ::= partial ' - ' partial +simple     ::= primitive | partial | tilde | caret +primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial +partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )? +xr         ::= 'x' | 'X' | '*' | nr +nr         ::= '0' | ['1'-'9'] ( ['0'-'9'] ) * +tilde      ::= '~' partial +caret      ::= '^' partial +qualifier  ::= ( '-' pre )? ( '+' build )? +pre        ::= parts +build      ::= parts +parts      ::= part ( '.' part ) * +part       ::= nr | [-0-9A-Za-z]+ +``` + +## Functions + +All methods and classes take a final `options` object argument.  All +options in this object are `false` by default.  The options supported +are: + +- `loose`  Be more forgiving about not-quite-valid semver strings. +  (Any resulting output will always be 100% strict compliant, of +  course.)  For backwards compatibility reasons, if the `options` +  argument is a boolean value instead of an object, it is interpreted +  to be the `loose` param. +- `includePrerelease`  Set to suppress the [default +  behavior](https://github.com/npm/node-semver#prerelease-tags) of +  excluding prerelease tagged versions from ranges unless they are +  explicitly opted into. + +Strict-mode Comparators and Ranges will be strict about the SemVer +strings that they parse. + +* `valid(v)`: Return the parsed version, or null if it's not valid. +* `inc(v, release)`: Return the version incremented by the release +  type (`major`,   `premajor`, `minor`, `preminor`, `patch`, +  `prepatch`, or `prerelease`), or null if it's not valid +  * `premajor` in one call will bump the version up to the next major +    version and down to a prerelease of that major version. +    `preminor`, and `prepatch` work the same way. +  * If called from a non-prerelease version, the `prerelease` will work the +    same as `prepatch`. It increments the patch version, then makes a +    prerelease. If the input version is already a prerelease it simply +    increments it. +* `prerelease(v)`: Returns an array of prerelease components, or null +  if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]` +* `major(v)`: Return the major version number. +* `minor(v)`: Return the minor version number. +* `patch(v)`: Return the patch version number. +* `intersects(r1, r2, loose)`: Return true if the two supplied ranges +  or comparators intersect. +* `parse(v)`: Attempt to parse a string as a semantic version, returning either +  a `SemVer` object or `null`. + +### Comparison + +* `gt(v1, v2)`: `v1 > v2` +* `gte(v1, v2)`: `v1 >= v2` +* `lt(v1, v2)`: `v1 < v2` +* `lte(v1, v2)`: `v1 <= v2` +* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent, +  even if they're not the exact same string.  You already know how to +  compare strings. +* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`. +* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call +  the corresponding function above.  `"==="` and `"!=="` do simple +  string comparison, but are included for completeness.  Throws if an +  invalid comparison string is provided. +* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if +  `v2` is greater.  Sorts in ascending order if passed to `Array.sort()`. +* `rcompare(v1, v2)`: The reverse of compare.  Sorts an array of versions +  in descending order when passed to `Array.sort()`. +* `compareBuild(v1, v2)`: The same as `compare` but considers `build` when two versions +  are equal.  Sorts in ascending order if passed to `Array.sort()`. +  `v2` is greater.  Sorts in ascending order if passed to `Array.sort()`. +* `diff(v1, v2)`: Returns difference between two versions by the release type +  (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`), +  or null if the versions are the same. + +### Comparators + +* `intersects(comparator)`: Return true if the comparators intersect + +### Ranges + +* `validRange(range)`: Return the valid range or null if it's not valid +* `satisfies(version, range)`: Return true if the version satisfies the +  range. +* `maxSatisfying(versions, range)`: Return the highest version in the list +  that satisfies the range, or `null` if none of them do. +* `minSatisfying(versions, range)`: Return the lowest version in the list +  that satisfies the range, or `null` if none of them do. +* `minVersion(range)`: Return the lowest version that can possibly match +  the given range. +* `gtr(version, range)`: Return `true` if version is greater than all the +  versions possible in the range. +* `ltr(version, range)`: Return `true` if version is less than all the +  versions possible in the range. +* `outside(version, range, hilo)`: Return true if the version is outside +  the bounds of the range in either the high or low direction.  The +  `hilo` argument must be either the string `'>'` or `'<'`.  (This is +  the function called by `gtr` and `ltr`.) +* `intersects(range)`: Return true if any of the ranges comparators intersect + +Note that, since ranges may be non-contiguous, a version might not be +greater than a range, less than a range, *or* satisfy a range!  For +example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9` +until `2.0.0`, so the version `1.2.10` would not be greater than the +range (because `2.0.1` satisfies, which is higher), nor less than the +range (since `1.2.8` satisfies, which is lower), and it also does not +satisfy the range. + +If you want to know if a version satisfies or does not satisfy a +range, use the `satisfies(version, range)` function. + +### Coercion + +* `coerce(version, options)`: Coerces a string to semver if possible + +This aims to provide a very forgiving translation of a non-semver string to +semver. It looks for the first digit in a string, and consumes all +remaining characters which satisfy at least a partial semver (e.g., `1`, +`1.2`, `1.2.3`) up to the max permitted length (256 characters).  Longer +versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`).  All +surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes +`3.4.0`).  Only text which lacks digits will fail coercion (`version one` +is not valid).  The maximum  length for any semver component considered for +coercion is 16 characters; longer components will be ignored +(`10000000000000000.4.7.4` becomes `4.7.4`).  The maximum value for any +semver component is `Integer.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value +components are invalid (`9999999999999999.4.7.4` is likely invalid). + +If the `options.rtl` flag is set, then `coerce` will return the right-most +coercible tuple that does not share an ending index with a longer coercible +tuple.  For example, `1.2.3.4` will return `2.3.4` in rtl mode, not +`4.0.0`.  `1.2.3/4` will return `4.0.0`, because the `4` is not a part of +any other overlapping SemVer tuple. + +### Clean + +* `clean(version)`: Clean a string to be a valid semver if possible + +This will return a cleaned and trimmed semver version. If the provided version is not valid a null will be returned. This does not work for ranges.  + +ex. +* `s.clean(' = v 2.1.5foo')`: `null` +* `s.clean(' = v 2.1.5foo', { loose: true })`: `'2.1.5-foo'` +* `s.clean(' = v 2.1.5-foo')`: `null` +* `s.clean(' = v 2.1.5-foo', { loose: true })`: `'2.1.5-foo'` +* `s.clean('=v2.1.5')`: `'2.1.5'` +* `s.clean('  =v2.1.5')`: `2.1.5` +* `s.clean('      2.1.5   ')`: `'2.1.5'` +* `s.clean('~1.0.0')`: `null` diff --git a/node_modules/semver/bin/semver.js b/node_modules/semver/bin/semver.js new file mode 100755 index 0000000..666034a --- /dev/null +++ b/node_modules/semver/bin/semver.js @@ -0,0 +1,174 @@ +#!/usr/bin/env node +// Standalone semver comparison program. +// Exits successfully and prints matching version(s) if +// any supplied version is valid and passes all tests. + +var argv = process.argv.slice(2) + +var versions = [] + +var range = [] + +var inc = null + +var version = require('../package.json').version + +var loose = false + +var includePrerelease = false + +var coerce = false + +var rtl = false + +var identifier + +var semver = require('../semver') + +var reverse = false + +var options = {} + +main() + +function main () { +  if (!argv.length) return help() +  while (argv.length) { +    var a = argv.shift() +    var indexOfEqualSign = a.indexOf('=') +    if (indexOfEqualSign !== -1) { +      a = a.slice(0, indexOfEqualSign) +      argv.unshift(a.slice(indexOfEqualSign + 1)) +    } +    switch (a) { +      case '-rv': case '-rev': case '--rev': case '--reverse': +        reverse = true +        break +      case '-l': case '--loose': +        loose = true +        break +      case '-p': case '--include-prerelease': +        includePrerelease = true +        break +      case '-v': case '--version': +        versions.push(argv.shift()) +        break +      case '-i': case '--inc': case '--increment': +        switch (argv[0]) { +          case 'major': case 'minor': case 'patch': case 'prerelease': +          case 'premajor': case 'preminor': case 'prepatch': +            inc = argv.shift() +            break +          default: +            inc = 'patch' +            break +        } +        break +      case '--preid': +        identifier = argv.shift() +        break +      case '-r': case '--range': +        range.push(argv.shift()) +        break +      case '-c': case '--coerce': +        coerce = true +        break +      case '--rtl': +        rtl = true +        break +      case '--ltr': +        rtl = false +        break +      case '-h': case '--help': case '-?': +        return help() +      default: +        versions.push(a) +        break +    } +  } + +  var options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl } + +  versions = versions.map(function (v) { +    return coerce ? (semver.coerce(v, options) || { version: v }).version : v +  }).filter(function (v) { +    return semver.valid(v) +  }) +  if (!versions.length) return fail() +  if (inc && (versions.length !== 1 || range.length)) { return failInc() } + +  for (var i = 0, l = range.length; i < l; i++) { +    versions = versions.filter(function (v) { +      return semver.satisfies(v, range[i], options) +    }) +    if (!versions.length) return fail() +  } +  return success(versions) +} + +function failInc () { +  console.error('--inc can only be used on a single version with no range') +  fail() +} + +function fail () { process.exit(1) } + +function success () { +  var compare = reverse ? 'rcompare' : 'compare' +  versions.sort(function (a, b) { +    return semver[compare](a, b, options) +  }).map(function (v) { +    return semver.clean(v, options) +  }).map(function (v) { +    return inc ? semver.inc(v, inc, options, identifier) : v +  }).forEach(function (v, i, _) { console.log(v) }) +} + +function help () { +  console.log(['SemVer ' + version, +    '', +    'A JavaScript implementation of the https://semver.org/ specification', +    'Copyright Isaac Z. Schlueter', +    '', +    'Usage: semver [options] <version> [<version> [...]]', +    'Prints valid versions sorted by SemVer precedence', +    '', +    'Options:', +    '-r --range <range>', +    '        Print versions that match the specified range.', +    '', +    '-i --increment [<level>]', +    '        Increment a version by the specified level.  Level can', +    '        be one of: major, minor, patch, premajor, preminor,', +    "        prepatch, or prerelease.  Default level is 'patch'.", +    '        Only one version may be specified.', +    '', +    '--preid <identifier>', +    '        Identifier to be used to prefix premajor, preminor,', +    '        prepatch or prerelease version increments.', +    '', +    '-l --loose', +    '        Interpret versions and ranges loosely', +    '', +    '-p --include-prerelease', +    '        Always include prerelease versions in range matching', +    '', +    '-c --coerce', +    '        Coerce a string into SemVer if possible', +    '        (does not imply --loose)', +    '', +    '--rtl', +    '        Coerce version strings right to left', +    '', +    '--ltr', +    '        Coerce version strings left to right (default)', +    '', +    'Program exits successfully if any valid version satisfies', +    'all supplied ranges, and prints all satisfying versions.', +    '', +    'If no satisfying versions are found, then exits failure.', +    '', +    'Versions are printed in ascending order, so supplying', +    'multiple versions to the utility will just sort them.' +  ].join('\n')) +} diff --git a/node_modules/semver/package.json b/node_modules/semver/package.json new file mode 100644 index 0000000..bdd442f --- /dev/null +++ b/node_modules/semver/package.json @@ -0,0 +1,28 @@ +{ +  "name": "semver", +  "version": "6.3.0", +  "description": "The semantic version parser used by npm.", +  "main": "semver.js", +  "scripts": { +    "test": "tap", +    "preversion": "npm test", +    "postversion": "npm publish", +    "postpublish": "git push origin --follow-tags" +  }, +  "devDependencies": { +    "tap": "^14.3.1" +  }, +  "license": "ISC", +  "repository": "https://github.com/npm/node-semver", +  "bin": { +    "semver": "./bin/semver.js" +  }, +  "files": [ +    "bin", +    "range.bnf", +    "semver.js" +  ], +  "tap": { +    "check-coverage": true +  } +} diff --git a/node_modules/semver/range.bnf b/node_modules/semver/range.bnf new file mode 100644 index 0000000..d4c6ae0 --- /dev/null +++ b/node_modules/semver/range.bnf @@ -0,0 +1,16 @@ +range-set  ::= range ( logical-or range ) * +logical-or ::= ( ' ' ) * '||' ( ' ' ) * +range      ::= hyphen | simple ( ' ' simple ) * | '' +hyphen     ::= partial ' - ' partial +simple     ::= primitive | partial | tilde | caret +primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial +partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )? +xr         ::= 'x' | 'X' | '*' | nr +nr         ::= '0' | [1-9] ( [0-9] ) * +tilde      ::= '~' partial +caret      ::= '^' partial +qualifier  ::= ( '-' pre )? ( '+' build )? +pre        ::= parts +build      ::= parts +parts      ::= part ( '.' part ) * +part       ::= nr | [-0-9A-Za-z]+ diff --git a/node_modules/semver/semver.js b/node_modules/semver/semver.js new file mode 100644 index 0000000..636fa43 --- /dev/null +++ b/node_modules/semver/semver.js @@ -0,0 +1,1596 @@ +exports = module.exports = SemVer + +var debug +/* istanbul ignore next */ +if (typeof process === 'object' && +    process.env && +    process.env.NODE_DEBUG && +    /\bsemver\b/i.test(process.env.NODE_DEBUG)) { +  debug = function () { +    var args = Array.prototype.slice.call(arguments, 0) +    args.unshift('SEMVER') +    console.log.apply(console, args) +  } +} else { +  debug = function () {} +} + +// Note: this is the semver.org version of the spec that it implements +// Not necessarily the package version of this code. +exports.SEMVER_SPEC_VERSION = '2.0.0' + +var MAX_LENGTH = 256 +var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || +  /* istanbul ignore next */ 9007199254740991 + +// Max safe segment length for coercion. +var MAX_SAFE_COMPONENT_LENGTH = 16 + +// The actual regexps go on exports.re +var re = exports.re = [] +var src = exports.src = [] +var t = exports.tokens = {} +var R = 0 + +function tok (n) { +  t[n] = R++ +} + +// The following Regular Expressions can be used for tokenizing, +// validating, and parsing SemVer version strings. + +// ## Numeric Identifier +// A single `0`, or a non-zero digit followed by zero or more digits. + +tok('NUMERICIDENTIFIER') +src[t.NUMERICIDENTIFIER] = '0|[1-9]\\d*' +tok('NUMERICIDENTIFIERLOOSE') +src[t.NUMERICIDENTIFIERLOOSE] = '[0-9]+' + +// ## Non-numeric Identifier +// Zero or more digits, followed by a letter or hyphen, and then zero or +// more letters, digits, or hyphens. + +tok('NONNUMERICIDENTIFIER') +src[t.NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*' + +// ## Main Version +// Three dot-separated numeric identifiers. + +tok('MAINVERSION') +src[t.MAINVERSION] = '(' + src[t.NUMERICIDENTIFIER] + ')\\.' + +                   '(' + src[t.NUMERICIDENTIFIER] + ')\\.' + +                   '(' + src[t.NUMERICIDENTIFIER] + ')' + +tok('MAINVERSIONLOOSE') +src[t.MAINVERSIONLOOSE] = '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' + +                        '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' + +                        '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')' + +// ## Pre-release Version Identifier +// A numeric identifier, or a non-numeric identifier. + +tok('PRERELEASEIDENTIFIER') +src[t.PRERELEASEIDENTIFIER] = '(?:' + src[t.NUMERICIDENTIFIER] + +                            '|' + src[t.NONNUMERICIDENTIFIER] + ')' + +tok('PRERELEASEIDENTIFIERLOOSE') +src[t.PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[t.NUMERICIDENTIFIERLOOSE] + +                                 '|' + src[t.NONNUMERICIDENTIFIER] + ')' + +// ## Pre-release Version +// Hyphen, followed by one or more dot-separated pre-release version +// identifiers. + +tok('PRERELEASE') +src[t.PRERELEASE] = '(?:-(' + src[t.PRERELEASEIDENTIFIER] + +                  '(?:\\.' + src[t.PRERELEASEIDENTIFIER] + ')*))' + +tok('PRERELEASELOOSE') +src[t.PRERELEASELOOSE] = '(?:-?(' + src[t.PRERELEASEIDENTIFIERLOOSE] + +                       '(?:\\.' + src[t.PRERELEASEIDENTIFIERLOOSE] + ')*))' + +// ## Build Metadata Identifier +// Any combination of digits, letters, or hyphens. + +tok('BUILDIDENTIFIER') +src[t.BUILDIDENTIFIER] = '[0-9A-Za-z-]+' + +// ## Build Metadata +// Plus sign, followed by one or more period-separated build metadata +// identifiers. + +tok('BUILD') +src[t.BUILD] = '(?:\\+(' + src[t.BUILDIDENTIFIER] + +             '(?:\\.' + src[t.BUILDIDENTIFIER] + ')*))' + +// ## Full Version String +// A main version, followed optionally by a pre-release version and +// build metadata. + +// Note that the only major, minor, patch, and pre-release sections of +// the version string are capturing groups.  The build metadata is not a +// capturing group, because it should not ever be used in version +// comparison. + +tok('FULL') +tok('FULLPLAIN') +src[t.FULLPLAIN] = 'v?' + src[t.MAINVERSION] + +                  src[t.PRERELEASE] + '?' + +                  src[t.BUILD] + '?' + +src[t.FULL] = '^' + src[t.FULLPLAIN] + '$' + +// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. +// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty +// common in the npm registry. +tok('LOOSEPLAIN') +src[t.LOOSEPLAIN] = '[v=\\s]*' + src[t.MAINVERSIONLOOSE] + +                  src[t.PRERELEASELOOSE] + '?' + +                  src[t.BUILD] + '?' + +tok('LOOSE') +src[t.LOOSE] = '^' + src[t.LOOSEPLAIN] + '$' + +tok('GTLT') +src[t.GTLT] = '((?:<|>)?=?)' + +// Something like "2.*" or "1.2.x". +// Note that "x.x" is a valid xRange identifer, meaning "any version" +// Only the first item is strictly required. +tok('XRANGEIDENTIFIERLOOSE') +src[t.XRANGEIDENTIFIERLOOSE] = src[t.NUMERICIDENTIFIERLOOSE] + '|x|X|\\*' +tok('XRANGEIDENTIFIER') +src[t.XRANGEIDENTIFIER] = src[t.NUMERICIDENTIFIER] + '|x|X|\\*' + +tok('XRANGEPLAIN') +src[t.XRANGEPLAIN] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIER] + ')' + +                   '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' + +                   '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' + +                   '(?:' + src[t.PRERELEASE] + ')?' + +                   src[t.BUILD] + '?' + +                   ')?)?' + +tok('XRANGEPLAINLOOSE') +src[t.XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' + +                        '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' + +                        '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' + +                        '(?:' + src[t.PRERELEASELOOSE] + ')?' + +                        src[t.BUILD] + '?' + +                        ')?)?' + +tok('XRANGE') +src[t.XRANGE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAIN] + '$' +tok('XRANGELOOSE') +src[t.XRANGELOOSE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAINLOOSE] + '$' + +// Coercion. +// Extract anything that could conceivably be a part of a valid semver +tok('COERCE') +src[t.COERCE] = '(^|[^\\d])' + +              '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + +              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + +              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + +              '(?:$|[^\\d])' +tok('COERCERTL') +re[t.COERCERTL] = new RegExp(src[t.COERCE], 'g') + +// Tilde ranges. +// Meaning is "reasonably at or greater than" +tok('LONETILDE') +src[t.LONETILDE] = '(?:~>?)' + +tok('TILDETRIM') +src[t.TILDETRIM] = '(\\s*)' + src[t.LONETILDE] + '\\s+' +re[t.TILDETRIM] = new RegExp(src[t.TILDETRIM], 'g') +var tildeTrimReplace = '$1~' + +tok('TILDE') +src[t.TILDE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAIN] + '$' +tok('TILDELOOSE') +src[t.TILDELOOSE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAINLOOSE] + '$' + +// Caret ranges. +// Meaning is "at least and backwards compatible with" +tok('LONECARET') +src[t.LONECARET] = '(?:\\^)' + +tok('CARETTRIM') +src[t.CARETTRIM] = '(\\s*)' + src[t.LONECARET] + '\\s+' +re[t.CARETTRIM] = new RegExp(src[t.CARETTRIM], 'g') +var caretTrimReplace = '$1^' + +tok('CARET') +src[t.CARET] = '^' + src[t.LONECARET] + src[t.XRANGEPLAIN] + '$' +tok('CARETLOOSE') +src[t.CARETLOOSE] = '^' + src[t.LONECARET] + src[t.XRANGEPLAINLOOSE] + '$' + +// A simple gt/lt/eq thing, or just "" to indicate "any version" +tok('COMPARATORLOOSE') +src[t.COMPARATORLOOSE] = '^' + src[t.GTLT] + '\\s*(' + src[t.LOOSEPLAIN] + ')$|^$' +tok('COMPARATOR') +src[t.COMPARATOR] = '^' + src[t.GTLT] + '\\s*(' + src[t.FULLPLAIN] + ')$|^$' + +// An expression to strip any whitespace between the gtlt and the thing +// it modifies, so that `> 1.2.3` ==> `>1.2.3` +tok('COMPARATORTRIM') +src[t.COMPARATORTRIM] = '(\\s*)' + src[t.GTLT] + +                      '\\s*(' + src[t.LOOSEPLAIN] + '|' + src[t.XRANGEPLAIN] + ')' + +// this one has to use the /g flag +re[t.COMPARATORTRIM] = new RegExp(src[t.COMPARATORTRIM], 'g') +var comparatorTrimReplace = '$1$2$3' + +// Something like `1.2.3 - 1.2.4` +// Note that these all use the loose form, because they'll be +// checked against either the strict or loose comparator form +// later. +tok('HYPHENRANGE') +src[t.HYPHENRANGE] = '^\\s*(' + src[t.XRANGEPLAIN] + ')' + +                   '\\s+-\\s+' + +                   '(' + src[t.XRANGEPLAIN] + ')' + +                   '\\s*$' + +tok('HYPHENRANGELOOSE') +src[t.HYPHENRANGELOOSE] = '^\\s*(' + src[t.XRANGEPLAINLOOSE] + ')' + +                        '\\s+-\\s+' + +                        '(' + src[t.XRANGEPLAINLOOSE] + ')' + +                        '\\s*$' + +// Star ranges basically just allow anything at all. +tok('STAR') +src[t.STAR] = '(<|>)?=?\\s*\\*' + +// Compile to actual regexp objects. +// All are flag-free, unless they were created above with a flag. +for (var i = 0; i < R; i++) { +  debug(i, src[i]) +  if (!re[i]) { +    re[i] = new RegExp(src[i]) +  } +} + +exports.parse = parse +function parse (version, options) { +  if (!options || typeof options !== 'object') { +    options = { +      loose: !!options, +      includePrerelease: false +    } +  } + +  if (version instanceof SemVer) { +    return version +  } + +  if (typeof version !== 'string') { +    return null +  } + +  if (version.length > MAX_LENGTH) { +    return null +  } + +  var r = options.loose ? re[t.LOOSE] : re[t.FULL] +  if (!r.test(version)) { +    return null +  } + +  try { +    return new SemVer(version, options) +  } catch (er) { +    return null +  } +} + +exports.valid = valid +function valid (version, options) { +  var v = parse(version, options) +  return v ? v.version : null +} + +exports.clean = clean +function clean (version, options) { +  var s = parse(version.trim().replace(/^[=v]+/, ''), options) +  return s ? s.version : null +} + +exports.SemVer = SemVer + +function SemVer (version, options) { +  if (!options || typeof options !== 'object') { +    options = { +      loose: !!options, +      includePrerelease: false +    } +  } +  if (version instanceof SemVer) { +    if (version.loose === options.loose) { +      return version +    } else { +      version = version.version +    } +  } else if (typeof version !== 'string') { +    throw new TypeError('Invalid Version: ' + version) +  } + +  if (version.length > MAX_LENGTH) { +    throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') +  } + +  if (!(this instanceof SemVer)) { +    return new SemVer(version, options) +  } + +  debug('SemVer', version, options) +  this.options = options +  this.loose = !!options.loose + +  var 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(function (id) { +      if (/^[0-9]+$/.test(id)) { +        var num = +id +        if (num >= 0 && num < MAX_SAFE_INTEGER) { +          return num +        } +      } +      return id +    }) +  } + +  this.build = m[5] ? m[5].split('.') : [] +  this.format() +} + +SemVer.prototype.format = function () { +  this.version = this.major + '.' + this.minor + '.' + this.patch +  if (this.prerelease.length) { +    this.version += '-' + this.prerelease.join('.') +  } +  return this.version +} + +SemVer.prototype.toString = function () { +  return this.version +} + +SemVer.prototype.compare = function (other) { +  debug('SemVer.compare', this.version, this.options, other) +  if (!(other instanceof SemVer)) { +    other = new SemVer(other, this.options) +  } + +  return this.compareMain(other) || this.comparePre(other) +} + +SemVer.prototype.compareMain = function (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) +} + +SemVer.prototype.comparePre = function (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 +  } + +  var i = 0 +  do { +    var a = this.prerelease[i] +    var 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) +} + +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) { +  switch (release) { +    case 'premajor': +      this.prerelease.length = 0 +      this.patch = 0 +      this.minor = 0 +      this.major++ +      this.inc('pre', identifier) +      break +    case 'preminor': +      this.prerelease.length = 0 +      this.patch = 0 +      this.minor++ +      this.inc('pre', identifier) +      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) +      this.inc('pre', identifier) +      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) +      } +      this.inc('pre', identifier) +      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': +      if (this.prerelease.length === 0) { +        this.prerelease = [0] +      } else { +        var 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 +          this.prerelease.push(0) +        } +      } +      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 +        if (this.prerelease[0] === identifier) { +          if (isNaN(this.prerelease[1])) { +            this.prerelease = [identifier, 0] +          } +        } else { +          this.prerelease = [identifier, 0] +        } +      } +      break + +    default: +      throw new Error('invalid increment argument: ' + release) +  } +  this.format() +  this.raw = this.version +  return this +} + +exports.inc = inc +function inc (version, release, loose, identifier) { +  if (typeof (loose) === 'string') { +    identifier = loose +    loose = undefined +  } + +  try { +    return new SemVer(version, loose).inc(release, identifier).version +  } catch (er) { +    return null +  } +} + +exports.diff = diff +function diff (version1, version2) { +  if (eq(version1, version2)) { +    return null +  } else { +    var v1 = parse(version1) +    var v2 = parse(version2) +    var prefix = '' +    if (v1.prerelease.length || v2.prerelease.length) { +      prefix = 'pre' +      var defaultResult = 'prerelease' +    } +    for (var key in v1) { +      if (key === 'major' || key === 'minor' || key === 'patch') { +        if (v1[key] !== v2[key]) { +          return prefix + key +        } +      } +    } +    return defaultResult // may be undefined +  } +} + +exports.compareIdentifiers = compareIdentifiers + +var numeric = /^[0-9]+$/ +function compareIdentifiers (a, b) { +  var anum = numeric.test(a) +  var bnum = numeric.test(b) + +  if (anum && bnum) { +    a = +a +    b = +b +  } + +  return a === b ? 0 +    : (anum && !bnum) ? -1 +    : (bnum && !anum) ? 1 +    : a < b ? -1 +    : 1 +} + +exports.rcompareIdentifiers = rcompareIdentifiers +function rcompareIdentifiers (a, b) { +  return compareIdentifiers(b, a) +} + +exports.major = major +function major (a, loose) { +  return new SemVer(a, loose).major +} + +exports.minor = minor +function minor (a, loose) { +  return new SemVer(a, loose).minor +} + +exports.patch = patch +function patch (a, loose) { +  return new SemVer(a, loose).patch +} + +exports.compare = compare +function compare (a, b, loose) { +  return new SemVer(a, loose).compare(new SemVer(b, loose)) +} + +exports.compareLoose = compareLoose +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) +} + +exports.sort = sort +function sort (list, loose) { +  return list.sort(function (a, b) { +    return exports.compareBuild(a, b, loose) +  }) +} + +exports.rsort = rsort +function rsort (list, loose) { +  return list.sort(function (a, b) { +    return exports.compareBuild(b, a, loose) +  }) +} + +exports.gt = gt +function gt (a, b, loose) { +  return compare(a, b, loose) > 0 +} + +exports.lt = lt +function lt (a, b, loose) { +  return compare(a, b, loose) < 0 +} + +exports.eq = eq +function eq (a, b, loose) { +  return compare(a, b, loose) === 0 +} + +exports.neq = neq +function neq (a, b, loose) { +  return compare(a, b, loose) !== 0 +} + +exports.gte = gte +function gte (a, b, loose) { +  return compare(a, b, loose) >= 0 +} + +exports.lte = lte +function lte (a, b, loose) { +  return compare(a, b, loose) <= 0 +} + +exports.cmp = cmp +function cmp (a, op, b, loose) { +  switch (op) { +    case '===': +      if (typeof a === 'object') +        a = a.version +      if (typeof b === 'object') +        b = b.version +      return a === b + +    case '!==': +      if (typeof a === 'object') +        a = a.version +      if (typeof b === 'object') +        b = b.version +      return a !== b + +    case '': +    case '=': +    case '==': +      return eq(a, b, loose) + +    case '!=': +      return neq(a, b, loose) + +    case '>': +      return gt(a, b, loose) + +    case '>=': +      return gte(a, b, loose) + +    case '<': +      return lt(a, b, loose) + +    case '<=': +      return lte(a, b, loose) + +    default: +      throw new TypeError('Invalid operator: ' + op) +  } +} + +exports.Comparator = Comparator +function Comparator (comp, options) { +  if (!options || typeof options !== 'object') { +    options = { +      loose: !!options, +      includePrerelease: false +    } +  } + +  if (comp instanceof Comparator) { +    if (comp.loose === !!options.loose) { +      return comp +    } else { +      comp = comp.value +    } +  } + +  if (!(this instanceof Comparator)) { +    return new Comparator(comp, options) +  } + +  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) +} + +var ANY = {} +Comparator.prototype.parse = function (comp) { +  var r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] +  var 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) +  } +} + +Comparator.prototype.toString = function () { +  return this.value +} + +Comparator.prototype.test = function (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) +} + +Comparator.prototype.intersects = function (comp, options) { +  if (!(comp instanceof Comparator)) { +    throw new TypeError('a Comparator is required') +  } + +  if (!options || typeof options !== 'object') { +    options = { +      loose: !!options, +      includePrerelease: false +    } +  } + +  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) +  } + +  var sameDirectionIncreasing = +    (this.operator === '>=' || this.operator === '>') && +    (comp.operator === '>=' || comp.operator === '>') +  var sameDirectionDecreasing = +    (this.operator === '<=' || this.operator === '<') && +    (comp.operator === '<=' || comp.operator === '<') +  var sameSemVer = this.semver.version === comp.semver.version +  var differentDirectionsInclusive = +    (this.operator === '>=' || this.operator === '<=') && +    (comp.operator === '>=' || comp.operator === '<=') +  var oppositeDirectionsLessThan = +    cmp(this.semver, '<', comp.semver, options) && +    ((this.operator === '>=' || this.operator === '>') && +    (comp.operator === '<=' || comp.operator === '<')) +  var oppositeDirectionsGreaterThan = +    cmp(this.semver, '>', comp.semver, options) && +    ((this.operator === '<=' || this.operator === '<') && +    (comp.operator === '>=' || comp.operator === '>')) + +  return sameDirectionIncreasing || sameDirectionDecreasing || +    (sameSemVer && differentDirectionsInclusive) || +    oppositeDirectionsLessThan || oppositeDirectionsGreaterThan +} + +exports.Range = Range +function Range (range, options) { +  if (!options || typeof options !== 'object') { +    options = { +      loose: !!options, +      includePrerelease: false +    } +  } + +  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) { +    return new Range(range.value, options) +  } + +  if (!(this instanceof Range)) { +    return new Range(range, options) +  } + +  this.options = options +  this.loose = !!options.loose +  this.includePrerelease = !!options.includePrerelease + +  // First, split based on boolean or || +  this.raw = range +  this.set = range.split(/\s*\|\|\s*/).map(function (range) { +    return this.parseRange(range.trim()) +  }, this).filter(function (c) { +    // throw out any that are not relevant for whatever reason +    return c.length +  }) + +  if (!this.set.length) { +    throw new TypeError('Invalid SemVer Range: ' + range) +  } + +  this.format() +} + +Range.prototype.format = function () { +  this.range = this.set.map(function (comps) { +    return comps.join(' ').trim() +  }).join('||').trim() +  return this.range +} + +Range.prototype.toString = function () { +  return this.range +} + +Range.prototype.parseRange = function (range) { +  var loose = this.options.loose +  range = range.trim() +  // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` +  var hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] +  range = range.replace(hr, hyphenReplace) +  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, re[t.COMPARATORTRIM]) + +  // `~ 1.2.3` => `~1.2.3` +  range = range.replace(re[t.TILDETRIM], tildeTrimReplace) + +  // `^ 1.2.3` => `^1.2.3` +  range = range.replace(re[t.CARETTRIM], caretTrimReplace) + +  // normalize spaces +  range = range.split(/\s+/).join(' ') + +  // At this point, the range is completely trimmed and +  // ready to be split into comparators. + +  var compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] +  var set = range.split(' ').map(function (comp) { +    return parseComparator(comp, this.options) +  }, this).join(' ').split(/\s+/) +  if (this.options.loose) { +    // in loose mode, throw out any that are not valid comparators +    set = set.filter(function (comp) { +      return !!comp.match(compRe) +    }) +  } +  set = set.map(function (comp) { +    return new Comparator(comp, this.options) +  }, this) + +  return set +} + +Range.prototype.intersects = function (range, options) { +  if (!(range instanceof Range)) { +    throw new TypeError('a Range is required') +  } + +  return this.set.some(function (thisComparators) { +    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) { +  return new Range(range, options).set.map(function (comp) { +    return comp.map(function (c) { +      return c.value +    }).join(' ').trim().split(' ') +  }) +} + +// comprised of xranges, tildes, stars, and gtlt's at this point. +// already replaced the hyphen ranges +// turn into a set of JUST comparators. +function 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 +} + +function isX (id) { +  return !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 +// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 +// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 +// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 +// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 +function replaceTildes (comp, options) { +  return comp.trim().split(/\s+/).map(function (comp) { +    return replaceTilde(comp, options) +  }).join(' ') +} + +function replaceTilde (comp, options) { +  var r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] +  return comp.replace(r, function (_, M, m, p, pr) { +    debug('tilde', comp, _, M, m, p, pr) +    var ret + +    if (isX(M)) { +      ret = '' +    } else if (isX(m)) { +      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' +    } else if (isX(p)) { +      // ~1.2 == >=1.2.0 <1.3.0 +      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' +    } else if (pr) { +      debug('replaceTilde pr', pr) +      ret = '>=' + M + '.' + m + '.' + p + '-' + pr + +            ' <' + M + '.' + (+m + 1) + '.0' +    } else { +      // ~1.2.3 == >=1.2.3 <1.3.0 +      ret = '>=' + M + '.' + m + '.' + p + +            ' <' + M + '.' + (+m + 1) + '.0' +    } + +    debug('tilde return', ret) +    return ret +  }) +} + +// ^ --> * (any, kinda silly) +// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 +// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 +// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 +// ^1.2.3 --> >=1.2.3 <2.0.0 +// ^1.2.0 --> >=1.2.0 <2.0.0 +function replaceCarets (comp, options) { +  return comp.trim().split(/\s+/).map(function (comp) { +    return replaceCaret(comp, options) +  }).join(' ') +} + +function replaceCaret (comp, options) { +  debug('caret', comp, options) +  var r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] +  return comp.replace(r, function (_, M, m, p, pr) { +    debug('caret', comp, _, M, m, p, pr) +    var ret + +    if (isX(M)) { +      ret = '' +    } else if (isX(m)) { +      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' +    } else if (isX(p)) { +      if (M === '0') { +        ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' +      } else { +        ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0' +      } +    } else if (pr) { +      debug('replaceCaret pr', pr) +      if (M === '0') { +        if (m === '0') { +          ret = '>=' + M + '.' + m + '.' + p + '-' + pr + +                ' <' + M + '.' + m + '.' + (+p + 1) +        } else { +          ret = '>=' + M + '.' + m + '.' + p + '-' + pr + +                ' <' + M + '.' + (+m + 1) + '.0' +        } +      } else { +        ret = '>=' + M + '.' + m + '.' + p + '-' + pr + +              ' <' + (+M + 1) + '.0.0' +      } +    } else { +      debug('no pr') +      if (M === '0') { +        if (m === '0') { +          ret = '>=' + M + '.' + m + '.' + p + +                ' <' + M + '.' + m + '.' + (+p + 1) +        } else { +          ret = '>=' + M + '.' + m + '.' + p + +                ' <' + M + '.' + (+m + 1) + '.0' +        } +      } else { +        ret = '>=' + M + '.' + m + '.' + p + +              ' <' + (+M + 1) + '.0.0' +      } +    } + +    debug('caret return', ret) +    return ret +  }) +} + +function replaceXRanges (comp, options) { +  debug('replaceXRanges', comp, options) +  return comp.split(/\s+/).map(function (comp) { +    return replaceXRange(comp, options) +  }).join(' ') +} + +function replaceXRange (comp, options) { +  comp = comp.trim() +  var r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] +  return comp.replace(r, function (ret, gtlt, M, m, p, pr) { +    debug('xRange', comp, ret, gtlt, M, m, p, pr) +    var xM = isX(M) +    var xm = xM || isX(m) +    var xp = xm || isX(p) +    var 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 +        // >1.2.3 => >= 1.2.4 +        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 +        } +      } + +      ret = gtlt + M + '.' + m + '.' + p + pr +    } else if (xm) { +      ret = '>=' + M + '.0.0' + pr + ' <' + (+M + 1) + '.0.0' + pr +    } else if (xp) { +      ret = '>=' + M + '.' + m + '.0' + pr + +        ' <' + M + '.' + (+m + 1) + '.0' + pr +    } + +    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. +function 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], '') +} + +// 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 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0 <3.5.0 +function hyphenReplace ($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' +  } else if (isX(fp)) { +    from = '>=' + fM + '.' + fm + '.0' +  } else { +    from = '>=' + from +  } + +  if (isX(tM)) { +    to = '' +  } else if (isX(tm)) { +    to = '<' + (+tM + 1) + '.0.0' +  } else if (isX(tp)) { +    to = '<' + tM + '.' + (+tm + 1) + '.0' +  } else if (tpr) { +    to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr +  } else { +    to = '<=' + to +  } + +  return (from + ' ' + to).trim() +} + +// if ANY of the sets match ALL of its comparators, then pass +Range.prototype.test = function (version) { +  if (!version) { +    return false +  } + +  if (typeof version === 'string') { +    try { +      version = new SemVer(version, this.options) +    } catch (er) { +      return false +    } +  } + +  for (var i = 0; i < this.set.length; i++) { +    if (testSet(this.set[i], version, this.options)) { +      return true +    } +  } +  return false +} + +function testSet (set, version, options) { +  for (var 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 (i = 0; i < set.length; i++) { +      debug(set[i].semver) +      if (set[i].semver === ANY) { +        continue +      } + +      if (set[i].semver.prerelease.length > 0) { +        var 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 +} + +exports.satisfies = satisfies +function satisfies (version, range, options) { +  try { +    range = new Range(range, options) +  } catch (er) { +    return false +  } +  return range.test(version) +} + +exports.maxSatisfying = maxSatisfying +function maxSatisfying (versions, range, options) { +  var max = null +  var maxSV = null +  try { +    var rangeObj = new Range(range, options) +  } catch (er) { +    return null +  } +  versions.forEach(function (v) { +    if (rangeObj.test(v)) { +      // satisfies(v, range, options) +      if (!max || maxSV.compare(v) === -1) { +        // compare(max, v, true) +        max = v +        maxSV = new SemVer(max, options) +      } +    } +  }) +  return max +} + +exports.minSatisfying = minSatisfying +function minSatisfying (versions, range, options) { +  var min = null +  var minSV = null +  try { +    var rangeObj = new Range(range, options) +  } catch (er) { +    return null +  } +  versions.forEach(function (v) { +    if (rangeObj.test(v)) { +      // satisfies(v, range, options) +      if (!min || minSV.compare(v) === 1) { +        // compare(min, v, true) +        min = v +        minSV = new SemVer(min, options) +      } +    } +  }) +  return min +} + +exports.minVersion = minVersion +function minVersion (range, loose) { +  range = new Range(range, loose) + +  var minver = new SemVer('0.0.0') +  if (range.test(minver)) { +    return minver +  } + +  minver = new SemVer('0.0.0-0') +  if (range.test(minver)) { +    return minver +  } + +  minver = null +  for (var i = 0; i < range.set.length; ++i) { +    var comparators = range.set[i] + +    comparators.forEach(function (comparator) { +      // Clone to avoid manipulating the comparator's semver object. +      var compver = new SemVer(comparator.semver.version) +      switch (comparator.operator) { +        case '>': +          if (compver.prerelease.length === 0) { +            compver.patch++ +          } else { +            compver.prerelease.push(0) +          } +          compver.raw = compver.format() +          /* fallthrough */ +        case '': +        case '>=': +          if (!minver || gt(minver, compver)) { +            minver = compver +          } +          break +        case '<': +        case '<=': +          /* Ignore maximum versions */ +          break +        /* istanbul ignore next */ +        default: +          throw new Error('Unexpected operation: ' + comparator.operator) +      } +    }) +  } + +  if (minver && range.test(minver)) { +    return minver +  } + +  return null +} + +exports.validRange = validRange +function validRange (range, options) { +  try { +    // Return '*' instead of '' so that truthiness works. +    // This will throw if it's invalid anyway +    return new Range(range, options).range || '*' +  } catch (er) { +    return null +  } +} + +// Determine if version is less than all the versions possible in the range +exports.ltr = ltr +function ltr (version, range, options) { +  return outside(version, range, '<', options) +} + +// Determine if version is greater than all the versions possible in the range. +exports.gtr = gtr +function gtr (version, range, options) { +  return outside(version, range, '>', options) +} + +exports.outside = outside +function outside (version, range, hilo, options) { +  version = new SemVer(version, options) +  range = new Range(range, options) + +  var 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 satisifes 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 (var i = 0; i < range.set.length; ++i) { +    var comparators = range.set[i] + +    var high = null +    var low = null + +    comparators.forEach(function (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 +} + +exports.prerelease = prerelease +function prerelease (version, options) { +  var parsed = parse(version, options) +  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null +} + +exports.intersects = intersects +function intersects (r1, r2, options) { +  r1 = new Range(r1, options) +  r2 = new Range(r2, options) +  return r1.intersects(r2) +} + +exports.coerce = coerce +function coerce (version, options) { +  if (version instanceof SemVer) { +    return version +  } + +  if (typeof version === 'number') { +    version = String(version) +  } + +  if (typeof version !== 'string') { +    return null +  } + +  options = options || {} + +  var match = null +  if (!options.rtl) { +    match = version.match(re[t.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[t.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[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length +    } +    // leave it in a clean state +    re[t.COERCERTL].lastIndex = -1 +  } + +  if (match === null) { +    return null +  } + +  return parse(match[2] + +    '.' + (match[3] || '0') + +    '.' + (match[4] || '0'), options) +}  | 
