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.
Files changed (47) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +58 -2
  3. package/bin/semver.js +78 -79
  4. package/classes/comparator.js +139 -0
  5. package/classes/index.js +5 -0
  6. package/classes/range.js +448 -0
  7. package/classes/semver.js +290 -0
  8. package/functions/clean.js +6 -0
  9. package/functions/cmp.js +48 -0
  10. package/functions/coerce.js +51 -0
  11. package/functions/compare-build.js +7 -0
  12. package/functions/compare-loose.js +3 -0
  13. package/functions/compare.js +5 -0
  14. package/functions/diff.js +25 -0
  15. package/functions/eq.js +3 -0
  16. package/functions/gt.js +3 -0
  17. package/functions/gte.js +3 -0
  18. package/functions/inc.js +15 -0
  19. package/functions/lt.js +3 -0
  20. package/functions/lte.js +3 -0
  21. package/functions/major.js +3 -0
  22. package/functions/minor.js +3 -0
  23. package/functions/neq.js +3 -0
  24. package/functions/parse.js +37 -0
  25. package/functions/patch.js +3 -0
  26. package/functions/prerelease.js +6 -0
  27. package/functions/rcompare.js +3 -0
  28. package/functions/rsort.js +3 -0
  29. package/functions/satisfies.js +10 -0
  30. package/functions/sort.js +3 -0
  31. package/functions/valid.js +6 -0
  32. package/index.js +64 -0
  33. package/internal/constants.js +17 -0
  34. package/internal/debug.js +9 -0
  35. package/internal/identifiers.js +23 -0
  36. package/internal/re.js +179 -0
  37. package/package.json +11 -5
  38. package/ranges/gtr.js +4 -0
  39. package/ranges/intersects.js +7 -0
  40. package/ranges/ltr.js +4 -0
  41. package/ranges/max-satisfying.js +25 -0
  42. package/ranges/min-satisfying.js +24 -0
  43. package/ranges/min-version.js +57 -0
  44. package/ranges/outside.js +80 -0
  45. package/ranges/to-comparators.js +8 -0
  46. package/ranges/valid.js +11 -0
  47. package/semver.js +0 -1596
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # changes log
2
2
 
3
+ ## 6.3.0
4
+
5
+ * Expose the token enum on the exports
6
+
3
7
  ## 6.2.0
4
8
 
5
9
  * Coerce numbers to strings when passed to semver.coerce()
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 `Integer.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value
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 version is not valid a null will be returned. This does not work for ranges.
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
- var argv = process.argv.slice(2)
6
+ const argv = process.argv.slice(2)
7
7
 
8
- var versions = []
8
+ let versions = []
9
9
 
10
- var range = []
10
+ const range = []
11
11
 
12
- var inc = null
12
+ let inc = null
13
13
 
14
- var version = require('../package.json').version
14
+ const version = require('../package.json').version
15
15
 
16
- var loose = false
16
+ let loose = false
17
17
 
18
- var includePrerelease = false
18
+ let includePrerelease = false
19
19
 
20
- var coerce = false
20
+ let coerce = false
21
21
 
22
- var rtl = false
22
+ let rtl = false
23
23
 
24
- var identifier
24
+ let identifier
25
25
 
26
- var semver = require('../semver')
26
+ const semver = require('../')
27
27
 
28
- var reverse = false
28
+ let reverse = false
29
29
 
30
- var options = {}
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
- var a = argv.shift()
38
- var indexOfEqualSign = a.indexOf('=')
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
- var options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl }
88
+ const options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl }
91
89
 
92
- versions = versions.map(function (v) {
90
+ versions = versions.map((v) => {
93
91
  return coerce ? (semver.coerce(v, options) || { version: v }).version : v
94
- }).filter(function (v) {
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 (var i = 0, l = range.length; i < l; i++) {
101
- versions = versions.filter(function (v) {
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
- function failInc () {
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
- function fail () { process.exit(1) }
113
+ const fail = () => process.exit(1)
115
114
 
116
- function success () {
117
- var compare = reverse ? 'rcompare' : 'compare'
118
- versions.sort(function (a, b) {
115
+ const success = () => {
116
+ const compare = reverse ? 'rcompare' : 'compare'
117
+ versions.sort((a, b) => {
119
118
  return semver[compare](a, b, options)
120
- }).map(function (v) {
119
+ }).map((v) => {
121
120
  return semver.clean(v, options)
122
- }).map(function (v) {
121
+ }).map((v) => {
123
122
  return inc ? semver.inc(v, inc, options, identifier) : v
124
- }).forEach(function (v, i, _) { console.log(v) })
123
+ }).forEach((v, i, _) => { console.log(v) })
125
124
  }
126
125
 
127
- function help () {
128
- console.log(['SemVer ' + version,
129
- '',
130
- 'A JavaScript implementation of the https://semver.org/ specification',
131
- 'Copyright Isaac Z. Schlueter',
132
- '',
133
- 'Usage: semver [options] <version> [<version> [...]]',
134
- 'Prints valid versions sorted by SemVer precedence',
135
- '',
136
- 'Options:',
137
- '-r --range <range>',
138
- ' Print versions that match the specified range.',
139
- '',
140
- '-i --increment [<level>]',
141
- ' Increment a version by the specified level. Level can',
142
- ' be one of: major, minor, patch, premajor, preminor,',
143
- " prepatch, or prerelease. Default level is 'patch'.",
144
- ' Only one version may be specified.',
145
- '',
146
- '--preid <identifier>',
147
- ' Identifier to be used to prefix premajor, preminor,',
148
- ' prepatch or prerelease version increments.',
149
- '',
150
- '-l --loose',
151
- ' Interpret versions and ranges loosely',
152
- '',
153
- '-p --include-prerelease',
154
- ' Always include prerelease versions in range matching',
155
- '',
156
- '-c --coerce',
157
- ' Coerce a string into SemVer if possible',
158
- ' (does not imply --loose)',
159
- '',
160
- '--rtl',
161
- ' Coerce version strings right to left',
162
- '',
163
- '--ltr',
164
- ' Coerce version strings left to right (default)',
165
- '',
166
- 'Program exits successfully if any valid version satisfies',
167
- 'all supplied ranges, and prints all satisfying versions.',
168
- '',
169
- 'If no satisfying versions are found, then exits failure.',
170
- '',
171
- 'Versions are printed in ascending order, so supplying',
172
- 'multiple versions to the utility will just sort them.'
173
- ].join('\n'))
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')
@@ -0,0 +1,5 @@
1
+ module.exports = {
2
+ SemVer: require('./semver.js'),
3
+ Range: require('./range.js'),
4
+ Comparator: require('./comparator.js')
5
+ }