semver 6.3.0 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/README.md +58 -2
- package/bin/semver.js +78 -79
- package/classes/comparator.js +139 -0
- package/classes/index.js +5 -0
- package/classes/range.js +448 -0
- package/classes/semver.js +290 -0
- package/functions/clean.js +6 -0
- package/functions/cmp.js +48 -0
- package/functions/coerce.js +51 -0
- package/functions/compare-build.js +7 -0
- package/functions/compare-loose.js +3 -0
- package/functions/compare.js +5 -0
- package/functions/diff.js +25 -0
- package/functions/eq.js +3 -0
- package/functions/gt.js +3 -0
- package/functions/gte.js +3 -0
- package/functions/inc.js +15 -0
- package/functions/lt.js +3 -0
- package/functions/lte.js +3 -0
- package/functions/major.js +3 -0
- package/functions/minor.js +3 -0
- package/functions/neq.js +3 -0
- package/functions/parse.js +37 -0
- package/functions/patch.js +3 -0
- package/functions/prerelease.js +6 -0
- package/functions/rcompare.js +3 -0
- package/functions/rsort.js +3 -0
- package/functions/satisfies.js +10 -0
- package/functions/sort.js +3 -0
- package/functions/valid.js +6 -0
- package/index.js +64 -0
- package/internal/constants.js +17 -0
- package/internal/debug.js +9 -0
- package/internal/identifiers.js +23 -0
- package/internal/re.js +179 -0
- package/package.json +11 -5
- package/ranges/gtr.js +4 -0
- package/ranges/intersects.js +7 -0
- package/ranges/ltr.js +4 -0
- package/ranges/max-satisfying.js +25 -0
- package/ranges/min-satisfying.js +24 -0
- package/ranges/min-version.js +57 -0
- package/ranges/outside.js +80 -0
- package/ranges/to-comparators.js +8 -0
- package/ranges/valid.js +11 -0
- package/semver.js +0 -1596
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -417,7 +417,7 @@ surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes
|
|
|
417
417
|
is not valid). The maximum length for any semver component considered for
|
|
418
418
|
coercion is 16 characters; longer components will be ignored
|
|
419
419
|
(`10000000000000000.4.7.4` becomes `4.7.4`). The maximum value for any
|
|
420
|
-
semver component is `
|
|
420
|
+
semver component is `Number.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value
|
|
421
421
|
components are invalid (`9999999999999999.4.7.4` is likely invalid).
|
|
422
422
|
|
|
423
423
|
If the `options.rtl` flag is set, then `coerce` will return the right-most
|
|
@@ -430,7 +430,9 @@ any other overlapping SemVer tuple.
|
|
|
430
430
|
|
|
431
431
|
* `clean(version)`: Clean a string to be a valid semver if possible
|
|
432
432
|
|
|
433
|
-
This will return a cleaned and trimmed semver version. If the provided
|
|
433
|
+
This will return a cleaned and trimmed semver version. If the provided
|
|
434
|
+
version is not valid a null will be returned. This does not work for
|
|
435
|
+
ranges.
|
|
434
436
|
|
|
435
437
|
ex.
|
|
436
438
|
* `s.clean(' = v 2.1.5foo')`: `null`
|
|
@@ -441,3 +443,57 @@ ex.
|
|
|
441
443
|
* `s.clean(' =v2.1.5')`: `2.1.5`
|
|
442
444
|
* `s.clean(' 2.1.5 ')`: `'2.1.5'`
|
|
443
445
|
* `s.clean('~1.0.0')`: `null`
|
|
446
|
+
|
|
447
|
+
## Exported Modules
|
|
448
|
+
|
|
449
|
+
<!--
|
|
450
|
+
TODO: Make sure that all of these items are documented (classes aren't,
|
|
451
|
+
eg), and then pull the module name into the documentation for that specific
|
|
452
|
+
thing.
|
|
453
|
+
-->
|
|
454
|
+
|
|
455
|
+
You may pull in just the part of this semver utility that you need, if you
|
|
456
|
+
are sensitive to packing and tree-shaking concerns. The main
|
|
457
|
+
`require('semver')` export uses getter functions to lazily load the parts
|
|
458
|
+
of the API that are used.
|
|
459
|
+
|
|
460
|
+
The following modules are available:
|
|
461
|
+
|
|
462
|
+
* `require('semver')`
|
|
463
|
+
* `require('semver/classes')`
|
|
464
|
+
* `require('semver/classes/comparator')`
|
|
465
|
+
* `require('semver/classes/range')`
|
|
466
|
+
* `require('semver/classes/semver')`
|
|
467
|
+
* `require('semver/functions/clean')`
|
|
468
|
+
* `require('semver/functions/cmp')`
|
|
469
|
+
* `require('semver/functions/coerce')`
|
|
470
|
+
* `require('semver/functions/compare')`
|
|
471
|
+
* `require('semver/functions/compare-build')`
|
|
472
|
+
* `require('semver/functions/compare-loose')`
|
|
473
|
+
* `require('semver/functions/diff')`
|
|
474
|
+
* `require('semver/functions/eq')`
|
|
475
|
+
* `require('semver/functions/gt')`
|
|
476
|
+
* `require('semver/functions/gte')`
|
|
477
|
+
* `require('semver/functions/inc')`
|
|
478
|
+
* `require('semver/functions/lt')`
|
|
479
|
+
* `require('semver/functions/lte')`
|
|
480
|
+
* `require('semver/functions/major')`
|
|
481
|
+
* `require('semver/functions/minor')`
|
|
482
|
+
* `require('semver/functions/neq')`
|
|
483
|
+
* `require('semver/functions/parse')`
|
|
484
|
+
* `require('semver/functions/patch')`
|
|
485
|
+
* `require('semver/functions/prerelease')`
|
|
486
|
+
* `require('semver/functions/rcompare')`
|
|
487
|
+
* `require('semver/functions/rsort')`
|
|
488
|
+
* `require('semver/functions/satisfies')`
|
|
489
|
+
* `require('semver/functions/sort')`
|
|
490
|
+
* `require('semver/functions/valid')`
|
|
491
|
+
* `require('semver/ranges/gtr')`
|
|
492
|
+
* `require('semver/ranges/intersects')`
|
|
493
|
+
* `require('semver/ranges/ltr')`
|
|
494
|
+
* `require('semver/ranges/max-satisfying')`
|
|
495
|
+
* `require('semver/ranges/min-satisfying')`
|
|
496
|
+
* `require('semver/ranges/min-version')`
|
|
497
|
+
* `require('semver/ranges/outside')`
|
|
498
|
+
* `require('semver/ranges/to-comparators')`
|
|
499
|
+
* `require('semver/ranges/valid')`
|
package/bin/semver.js
CHANGED
|
@@ -3,39 +3,37 @@
|
|
|
3
3
|
// Exits successfully and prints matching version(s) if
|
|
4
4
|
// any supplied version is valid and passes all tests.
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
const argv = process.argv.slice(2)
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
let versions = []
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
const range = []
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
let inc = null
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
const version = require('../package.json').version
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
let loose = false
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
let includePrerelease = false
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
let coerce = false
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
let rtl = false
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
let identifier
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
const semver = require('../')
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
let reverse = false
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
const options = {}
|
|
31
31
|
|
|
32
|
-
main()
|
|
33
|
-
|
|
34
|
-
function main () {
|
|
32
|
+
const main = () => {
|
|
35
33
|
if (!argv.length) return help()
|
|
36
34
|
while (argv.length) {
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
let a = argv.shift()
|
|
36
|
+
const indexOfEqualSign = a.indexOf('=')
|
|
39
37
|
if (indexOfEqualSign !== -1) {
|
|
40
38
|
a = a.slice(0, indexOfEqualSign)
|
|
41
39
|
argv.unshift(a.slice(indexOfEqualSign + 1))
|
|
@@ -87,18 +85,18 @@ function main () {
|
|
|
87
85
|
}
|
|
88
86
|
}
|
|
89
87
|
|
|
90
|
-
|
|
88
|
+
const options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl }
|
|
91
89
|
|
|
92
|
-
versions = versions.map(
|
|
90
|
+
versions = versions.map((v) => {
|
|
93
91
|
return coerce ? (semver.coerce(v, options) || { version: v }).version : v
|
|
94
|
-
}).filter(
|
|
92
|
+
}).filter((v) => {
|
|
95
93
|
return semver.valid(v)
|
|
96
94
|
})
|
|
97
95
|
if (!versions.length) return fail()
|
|
98
96
|
if (inc && (versions.length !== 1 || range.length)) { return failInc() }
|
|
99
97
|
|
|
100
|
-
for (
|
|
101
|
-
versions = versions.filter(
|
|
98
|
+
for (let i = 0, l = range.length; i < l; i++) {
|
|
99
|
+
versions = versions.filter((v) => {
|
|
102
100
|
return semver.satisfies(v, range[i], options)
|
|
103
101
|
})
|
|
104
102
|
if (!versions.length) return fail()
|
|
@@ -106,69 +104,70 @@ function main () {
|
|
|
106
104
|
return success(versions)
|
|
107
105
|
}
|
|
108
106
|
|
|
109
|
-
|
|
107
|
+
|
|
108
|
+
const failInc = () => {
|
|
110
109
|
console.error('--inc can only be used on a single version with no range')
|
|
111
110
|
fail()
|
|
112
111
|
}
|
|
113
112
|
|
|
114
|
-
|
|
113
|
+
const fail = () => process.exit(1)
|
|
115
114
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
versions.sort(
|
|
115
|
+
const success = () => {
|
|
116
|
+
const compare = reverse ? 'rcompare' : 'compare'
|
|
117
|
+
versions.sort((a, b) => {
|
|
119
118
|
return semver[compare](a, b, options)
|
|
120
|
-
}).map(
|
|
119
|
+
}).map((v) => {
|
|
121
120
|
return semver.clean(v, options)
|
|
122
|
-
}).map(
|
|
121
|
+
}).map((v) => {
|
|
123
122
|
return inc ? semver.inc(v, inc, options, identifier) : v
|
|
124
|
-
}).forEach(
|
|
123
|
+
}).forEach((v, i, _) => { console.log(v) })
|
|
125
124
|
}
|
|
126
125
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
126
|
+
const help = () => console.log(
|
|
127
|
+
`SemVer ${version}
|
|
128
|
+
|
|
129
|
+
A JavaScript implementation of the https://semver.org/ specification
|
|
130
|
+
Copyright Isaac Z. Schlueter
|
|
131
|
+
|
|
132
|
+
Usage: semver [options] <version> [<version> [...]]
|
|
133
|
+
Prints valid versions sorted by SemVer precedence
|
|
134
|
+
|
|
135
|
+
Options:
|
|
136
|
+
-r --range <range>
|
|
137
|
+
Print versions that match the specified range.
|
|
138
|
+
|
|
139
|
+
-i --increment [<level>]
|
|
140
|
+
Increment a version by the specified level. Level can
|
|
141
|
+
be one of: major, minor, patch, premajor, preminor,
|
|
142
|
+
prepatch, or prerelease. Default level is 'patch'.
|
|
143
|
+
Only one version may be specified.
|
|
144
|
+
|
|
145
|
+
--preid <identifier>
|
|
146
|
+
Identifier to be used to prefix premajor, preminor,
|
|
147
|
+
prepatch or prerelease version increments.
|
|
148
|
+
|
|
149
|
+
-l --loose
|
|
150
|
+
Interpret versions and ranges loosely
|
|
151
|
+
|
|
152
|
+
-p --include-prerelease
|
|
153
|
+
Always include prerelease versions in range matching
|
|
154
|
+
|
|
155
|
+
-c --coerce
|
|
156
|
+
Coerce a string into SemVer if possible
|
|
157
|
+
(does not imply --loose)
|
|
158
|
+
|
|
159
|
+
--rtl
|
|
160
|
+
Coerce version strings right to left
|
|
161
|
+
|
|
162
|
+
--ltr
|
|
163
|
+
Coerce version strings left to right (default)
|
|
164
|
+
|
|
165
|
+
Program exits successfully if any valid version satisfies
|
|
166
|
+
all supplied ranges, and prints all satisfying versions.
|
|
167
|
+
|
|
168
|
+
If no satisfying versions are found, then exits failure.
|
|
169
|
+
|
|
170
|
+
Versions are printed in ascending order, so supplying
|
|
171
|
+
multiple versions to the utility will just sort them.`)
|
|
172
|
+
|
|
173
|
+
main()
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
const ANY = Symbol('SemVer ANY')
|
|
2
|
+
// hoisted class for cyclic dependency
|
|
3
|
+
class Comparator {
|
|
4
|
+
static get ANY () {
|
|
5
|
+
return ANY
|
|
6
|
+
}
|
|
7
|
+
constructor (comp, options) {
|
|
8
|
+
if (!options || typeof options !== 'object') {
|
|
9
|
+
options = {
|
|
10
|
+
loose: !!options,
|
|
11
|
+
includePrerelease: false
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (comp instanceof Comparator) {
|
|
16
|
+
if (comp.loose === !!options.loose) {
|
|
17
|
+
return comp
|
|
18
|
+
} else {
|
|
19
|
+
comp = comp.value
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
debug('comparator', comp, options)
|
|
24
|
+
this.options = options
|
|
25
|
+
this.loose = !!options.loose
|
|
26
|
+
this.parse(comp)
|
|
27
|
+
|
|
28
|
+
if (this.semver === ANY) {
|
|
29
|
+
this.value = ''
|
|
30
|
+
} else {
|
|
31
|
+
this.value = this.operator + this.semver.version
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
debug('comp', this)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
parse (comp) {
|
|
38
|
+
const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
|
|
39
|
+
const m = comp.match(r)
|
|
40
|
+
|
|
41
|
+
if (!m) {
|
|
42
|
+
throw new TypeError(`Invalid comparator: ${comp}`)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
this.operator = m[1] !== undefined ? m[1] : ''
|
|
46
|
+
if (this.operator === '=') {
|
|
47
|
+
this.operator = ''
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// if it literally is just '>' or '' then allow anything.
|
|
51
|
+
if (!m[2]) {
|
|
52
|
+
this.semver = ANY
|
|
53
|
+
} else {
|
|
54
|
+
this.semver = new SemVer(m[2], this.options.loose)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
toString () {
|
|
59
|
+
return this.value
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
test (version) {
|
|
63
|
+
debug('Comparator.test', version, this.options.loose)
|
|
64
|
+
|
|
65
|
+
if (this.semver === ANY || version === ANY) {
|
|
66
|
+
return true
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (typeof version === 'string') {
|
|
70
|
+
try {
|
|
71
|
+
version = new SemVer(version, this.options)
|
|
72
|
+
} catch (er) {
|
|
73
|
+
return false
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return cmp(version, this.operator, this.semver, this.options)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
intersects (comp, options) {
|
|
81
|
+
if (!(comp instanceof Comparator)) {
|
|
82
|
+
throw new TypeError('a Comparator is required')
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (!options || typeof options !== 'object') {
|
|
86
|
+
options = {
|
|
87
|
+
loose: !!options,
|
|
88
|
+
includePrerelease: false
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (this.operator === '') {
|
|
93
|
+
if (this.value === '') {
|
|
94
|
+
return true
|
|
95
|
+
}
|
|
96
|
+
return new Range(comp.value, options).test(this.value)
|
|
97
|
+
} else if (comp.operator === '') {
|
|
98
|
+
if (comp.value === '') {
|
|
99
|
+
return true
|
|
100
|
+
}
|
|
101
|
+
return new Range(this.value, options).test(comp.semver)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const sameDirectionIncreasing =
|
|
105
|
+
(this.operator === '>=' || this.operator === '>') &&
|
|
106
|
+
(comp.operator === '>=' || comp.operator === '>')
|
|
107
|
+
const sameDirectionDecreasing =
|
|
108
|
+
(this.operator === '<=' || this.operator === '<') &&
|
|
109
|
+
(comp.operator === '<=' || comp.operator === '<')
|
|
110
|
+
const sameSemVer = this.semver.version === comp.semver.version
|
|
111
|
+
const differentDirectionsInclusive =
|
|
112
|
+
(this.operator === '>=' || this.operator === '<=') &&
|
|
113
|
+
(comp.operator === '>=' || comp.operator === '<=')
|
|
114
|
+
const oppositeDirectionsLessThan =
|
|
115
|
+
cmp(this.semver, '<', comp.semver, options) &&
|
|
116
|
+
(this.operator === '>=' || this.operator === '>') &&
|
|
117
|
+
(comp.operator === '<=' || comp.operator === '<')
|
|
118
|
+
const oppositeDirectionsGreaterThan =
|
|
119
|
+
cmp(this.semver, '>', comp.semver, options) &&
|
|
120
|
+
(this.operator === '<=' || this.operator === '<') &&
|
|
121
|
+
(comp.operator === '>=' || comp.operator === '>')
|
|
122
|
+
|
|
123
|
+
return (
|
|
124
|
+
sameDirectionIncreasing ||
|
|
125
|
+
sameDirectionDecreasing ||
|
|
126
|
+
(sameSemVer && differentDirectionsInclusive) ||
|
|
127
|
+
oppositeDirectionsLessThan ||
|
|
128
|
+
oppositeDirectionsGreaterThan
|
|
129
|
+
)
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
module.exports = Comparator
|
|
134
|
+
|
|
135
|
+
const {re, t} = require('../internal/re')
|
|
136
|
+
const cmp = require('../functions/cmp')
|
|
137
|
+
const debug = require('../internal/debug')
|
|
138
|
+
const SemVer = require('./semver')
|
|
139
|
+
const Range = require('./range')
|