semver 6.2.0 → 7.1.1
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 +38 -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 +15 -5
- package/preload.js +46 -0
- 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/bin/.semver.js.swp +0 -0
- package/semver.js +0 -1589
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const numeric = /^[0-9]+$/
|
|
2
|
+
const compareIdentifiers = (a, b) => {
|
|
3
|
+
const anum = numeric.test(a)
|
|
4
|
+
const bnum = numeric.test(b)
|
|
5
|
+
|
|
6
|
+
if (anum && bnum) {
|
|
7
|
+
a = +a
|
|
8
|
+
b = +b
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
return a === b ? 0
|
|
12
|
+
: (anum && !bnum) ? -1
|
|
13
|
+
: (bnum && !anum) ? 1
|
|
14
|
+
: a < b ? -1
|
|
15
|
+
: 1
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)
|
|
19
|
+
|
|
20
|
+
module.exports = {
|
|
21
|
+
compareIdentifiers,
|
|
22
|
+
rcompareIdentifiers
|
|
23
|
+
}
|
package/internal/re.js
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
const { MAX_SAFE_COMPONENT_LENGTH } = require('./constants')
|
|
2
|
+
const debug = require('./debug')
|
|
3
|
+
exports = module.exports = {}
|
|
4
|
+
|
|
5
|
+
// The actual regexps go on exports.re
|
|
6
|
+
const re = exports.re = []
|
|
7
|
+
const src = exports.src = []
|
|
8
|
+
const t = exports.t = {}
|
|
9
|
+
let R = 0
|
|
10
|
+
|
|
11
|
+
const createToken = (name, value, isGlobal) => {
|
|
12
|
+
const index = R++
|
|
13
|
+
debug(index, value)
|
|
14
|
+
t[name] = index
|
|
15
|
+
src[index] = value
|
|
16
|
+
re[index] = new RegExp(value, isGlobal ? 'g' : undefined)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// The following Regular Expressions can be used for tokenizing,
|
|
20
|
+
// validating, and parsing SemVer version strings.
|
|
21
|
+
|
|
22
|
+
// ## Numeric Identifier
|
|
23
|
+
// A single `0`, or a non-zero digit followed by zero or more digits.
|
|
24
|
+
|
|
25
|
+
createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*')
|
|
26
|
+
createToken('NUMERICIDENTIFIERLOOSE', '[0-9]+')
|
|
27
|
+
|
|
28
|
+
// ## Non-numeric Identifier
|
|
29
|
+
// Zero or more digits, followed by a letter or hyphen, and then zero or
|
|
30
|
+
// more letters, digits, or hyphens.
|
|
31
|
+
|
|
32
|
+
createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*')
|
|
33
|
+
|
|
34
|
+
// ## Main Version
|
|
35
|
+
// Three dot-separated numeric identifiers.
|
|
36
|
+
|
|
37
|
+
createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` +
|
|
38
|
+
`(${src[t.NUMERICIDENTIFIER]})\\.` +
|
|
39
|
+
`(${src[t.NUMERICIDENTIFIER]})`)
|
|
40
|
+
|
|
41
|
+
createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
|
|
42
|
+
`(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
|
|
43
|
+
`(${src[t.NUMERICIDENTIFIERLOOSE]})`)
|
|
44
|
+
|
|
45
|
+
// ## Pre-release Version Identifier
|
|
46
|
+
// A numeric identifier, or a non-numeric identifier.
|
|
47
|
+
|
|
48
|
+
createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER]
|
|
49
|
+
}|${src[t.NONNUMERICIDENTIFIER]})`)
|
|
50
|
+
|
|
51
|
+
createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE]
|
|
52
|
+
}|${src[t.NONNUMERICIDENTIFIER]})`)
|
|
53
|
+
|
|
54
|
+
// ## Pre-release Version
|
|
55
|
+
// Hyphen, followed by one or more dot-separated pre-release version
|
|
56
|
+
// identifiers.
|
|
57
|
+
|
|
58
|
+
createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]
|
|
59
|
+
}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`)
|
|
60
|
+
|
|
61
|
+
createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]
|
|
62
|
+
}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)
|
|
63
|
+
|
|
64
|
+
// ## Build Metadata Identifier
|
|
65
|
+
// Any combination of digits, letters, or hyphens.
|
|
66
|
+
|
|
67
|
+
createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+')
|
|
68
|
+
|
|
69
|
+
// ## Build Metadata
|
|
70
|
+
// Plus sign, followed by one or more period-separated build metadata
|
|
71
|
+
// identifiers.
|
|
72
|
+
|
|
73
|
+
createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER]
|
|
74
|
+
}(?:\\.${src[t.BUILDIDENTIFIER]})*))`)
|
|
75
|
+
|
|
76
|
+
// ## Full Version String
|
|
77
|
+
// A main version, followed optionally by a pre-release version and
|
|
78
|
+
// build metadata.
|
|
79
|
+
|
|
80
|
+
// Note that the only major, minor, patch, and pre-release sections of
|
|
81
|
+
// the version string are capturing groups. The build metadata is not a
|
|
82
|
+
// capturing group, because it should not ever be used in version
|
|
83
|
+
// comparison.
|
|
84
|
+
|
|
85
|
+
createToken('FULLPLAIN', `v?${src[t.MAINVERSION]
|
|
86
|
+
}${src[t.PRERELEASE]}?${
|
|
87
|
+
src[t.BUILD]}?`)
|
|
88
|
+
|
|
89
|
+
createToken('FULL', `^${src[t.FULLPLAIN]}$`)
|
|
90
|
+
|
|
91
|
+
// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
|
|
92
|
+
// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
|
|
93
|
+
// common in the npm registry.
|
|
94
|
+
createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE]
|
|
95
|
+
}${src[t.PRERELEASELOOSE]}?${
|
|
96
|
+
src[t.BUILD]}?`)
|
|
97
|
+
|
|
98
|
+
createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)
|
|
99
|
+
|
|
100
|
+
createToken('GTLT', '((?:<|>)?=?)')
|
|
101
|
+
|
|
102
|
+
// Something like "2.*" or "1.2.x".
|
|
103
|
+
// Note that "x.x" is a valid xRange identifer, meaning "any version"
|
|
104
|
+
// Only the first item is strictly required.
|
|
105
|
+
createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`)
|
|
106
|
+
createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`)
|
|
107
|
+
|
|
108
|
+
createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` +
|
|
109
|
+
`(?:\\.(${src[t.XRANGEIDENTIFIER]})` +
|
|
110
|
+
`(?:\\.(${src[t.XRANGEIDENTIFIER]})` +
|
|
111
|
+
`(?:${src[t.PRERELEASE]})?${
|
|
112
|
+
src[t.BUILD]}?` +
|
|
113
|
+
`)?)?`)
|
|
114
|
+
|
|
115
|
+
createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +
|
|
116
|
+
`(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +
|
|
117
|
+
`(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +
|
|
118
|
+
`(?:${src[t.PRERELEASELOOSE]})?${
|
|
119
|
+
src[t.BUILD]}?` +
|
|
120
|
+
`)?)?`)
|
|
121
|
+
|
|
122
|
+
createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`)
|
|
123
|
+
createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`)
|
|
124
|
+
|
|
125
|
+
// Coercion.
|
|
126
|
+
// Extract anything that could conceivably be a part of a valid semver
|
|
127
|
+
createToken('COERCE', `${'(^|[^\\d])' +
|
|
128
|
+
'(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +
|
|
129
|
+
`(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +
|
|
130
|
+
`(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +
|
|
131
|
+
`(?:$|[^\\d])`)
|
|
132
|
+
createToken('COERCERTL', src[t.COERCE], true)
|
|
133
|
+
|
|
134
|
+
// Tilde ranges.
|
|
135
|
+
// Meaning is "reasonably at or greater than"
|
|
136
|
+
createToken('LONETILDE', '(?:~>?)')
|
|
137
|
+
|
|
138
|
+
createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true)
|
|
139
|
+
exports.tildeTrimReplace = '$1~'
|
|
140
|
+
|
|
141
|
+
createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)
|
|
142
|
+
createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)
|
|
143
|
+
|
|
144
|
+
// Caret ranges.
|
|
145
|
+
// Meaning is "at least and backwards compatible with"
|
|
146
|
+
createToken('LONECARET', '(?:\\^)')
|
|
147
|
+
|
|
148
|
+
createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true)
|
|
149
|
+
exports.caretTrimReplace = '$1^'
|
|
150
|
+
|
|
151
|
+
createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)
|
|
152
|
+
createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)
|
|
153
|
+
|
|
154
|
+
// A simple gt/lt/eq thing, or just "" to indicate "any version"
|
|
155
|
+
createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`)
|
|
156
|
+
createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`)
|
|
157
|
+
|
|
158
|
+
// An expression to strip any whitespace between the gtlt and the thing
|
|
159
|
+
// it modifies, so that `> 1.2.3` ==> `>1.2.3`
|
|
160
|
+
createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT]
|
|
161
|
+
}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)
|
|
162
|
+
exports.comparatorTrimReplace = '$1$2$3'
|
|
163
|
+
|
|
164
|
+
// Something like `1.2.3 - 1.2.4`
|
|
165
|
+
// Note that these all use the loose form, because they'll be
|
|
166
|
+
// checked against either the strict or loose comparator form
|
|
167
|
+
// later.
|
|
168
|
+
createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` +
|
|
169
|
+
`\\s+-\\s+` +
|
|
170
|
+
`(${src[t.XRANGEPLAIN]})` +
|
|
171
|
+
`\\s*$`)
|
|
172
|
+
|
|
173
|
+
createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` +
|
|
174
|
+
`\\s+-\\s+` +
|
|
175
|
+
`(${src[t.XRANGEPLAINLOOSE]})` +
|
|
176
|
+
`\\s*$`)
|
|
177
|
+
|
|
178
|
+
// Star ranges basically just allow anything at all.
|
|
179
|
+
createToken('STAR', '(<|>)?=?\\s*\\*')
|
package/package.json
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "semver",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.1.1",
|
|
4
4
|
"description": "The semantic version parser used by npm.",
|
|
5
|
-
"main": "
|
|
5
|
+
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"test": "tap",
|
|
8
|
+
"snap": "tap",
|
|
8
9
|
"preversion": "npm test",
|
|
9
10
|
"postversion": "npm publish",
|
|
10
11
|
"postpublish": "git push origin --follow-tags"
|
|
11
12
|
},
|
|
12
13
|
"devDependencies": {
|
|
13
|
-
"tap": "^14.
|
|
14
|
+
"tap": "^14.10.2"
|
|
14
15
|
},
|
|
15
16
|
"license": "ISC",
|
|
16
17
|
"repository": "https://github.com/npm/node-semver",
|
|
@@ -20,9 +21,18 @@
|
|
|
20
21
|
"files": [
|
|
21
22
|
"bin",
|
|
22
23
|
"range.bnf",
|
|
23
|
-
"
|
|
24
|
+
"classes",
|
|
25
|
+
"functions",
|
|
26
|
+
"internal",
|
|
27
|
+
"ranges",
|
|
28
|
+
"index.js",
|
|
29
|
+
"preload.js"
|
|
24
30
|
],
|
|
25
31
|
"tap": {
|
|
26
|
-
"check-coverage": true
|
|
32
|
+
"check-coverage": true,
|
|
33
|
+
"coverage-map": "map.js"
|
|
34
|
+
},
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=10"
|
|
27
37
|
}
|
|
28
38
|
}
|
package/preload.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// just pre-load all the stuff that index.js lazily exports
|
|
2
|
+
const internalRe = require('./internal/re')
|
|
3
|
+
module.exports = {
|
|
4
|
+
re: internalRe.re,
|
|
5
|
+
src: internalRe.src,
|
|
6
|
+
tokens: internalRe.t,
|
|
7
|
+
SEMVER_SPEC_VERSION: require('./internal/constants').SEMVER_SPEC_VERSION,
|
|
8
|
+
SemVer: require('./classes/semver'),
|
|
9
|
+
compareIdentifiers: require('./internal/identifiers').compareIdentifiers,
|
|
10
|
+
rcompareIdentifiers: require('./internal/identifiers').rcompareIdentifiers,
|
|
11
|
+
parse: require('./functions/parse'),
|
|
12
|
+
valid: require('./functions/valid'),
|
|
13
|
+
clean: require('./functions/clean'),
|
|
14
|
+
inc: require('./functions/inc'),
|
|
15
|
+
diff: require('./functions/diff'),
|
|
16
|
+
major: require('./functions/major'),
|
|
17
|
+
minor: require('./functions/minor'),
|
|
18
|
+
patch: require('./functions/patch'),
|
|
19
|
+
prerelease: require('./functions/prerelease'),
|
|
20
|
+
compare: require('./functions/compare'),
|
|
21
|
+
rcompare: require('./functions/rcompare'),
|
|
22
|
+
compareLoose: require('./functions/compare-loose'),
|
|
23
|
+
compareBuild: require('./functions/compare-build'),
|
|
24
|
+
sort: require('./functions/sort'),
|
|
25
|
+
rsort: require('./functions/rsort'),
|
|
26
|
+
gt: require('./functions/gt'),
|
|
27
|
+
lt: require('./functions/lt'),
|
|
28
|
+
eq: require('./functions/eq'),
|
|
29
|
+
neq: require('./functions/neq'),
|
|
30
|
+
gte: require('./functions/gte'),
|
|
31
|
+
lte: require('./functions/lte'),
|
|
32
|
+
cmp: require('./functions/cmp'),
|
|
33
|
+
coerce: require('./functions/coerce'),
|
|
34
|
+
Comparator: require('./classes/comparator'),
|
|
35
|
+
Range: require('./classes/range'),
|
|
36
|
+
satisfies: require('./functions/satisfies'),
|
|
37
|
+
toComparators: require('./ranges/to-comparators'),
|
|
38
|
+
maxSatisfying: require('./ranges/max-satisfying'),
|
|
39
|
+
minSatisfying: require('./ranges/min-satisfying'),
|
|
40
|
+
minVersion: require('./ranges/min-version'),
|
|
41
|
+
validRange: require('./ranges/valid'),
|
|
42
|
+
outside: require('./ranges/outside'),
|
|
43
|
+
gtr: require('./ranges/gtr'),
|
|
44
|
+
ltr: require('./ranges/ltr'),
|
|
45
|
+
intersects: require('./ranges/intersects'),
|
|
46
|
+
}
|
package/ranges/gtr.js
ADDED
package/ranges/ltr.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const SemVer = require('../classes/semver')
|
|
2
|
+
const Range = require('../classes/range')
|
|
3
|
+
|
|
4
|
+
const maxSatisfying = (versions, range, options) => {
|
|
5
|
+
let max = null
|
|
6
|
+
let maxSV = null
|
|
7
|
+
let rangeObj = null
|
|
8
|
+
try {
|
|
9
|
+
rangeObj = new Range(range, options)
|
|
10
|
+
} catch (er) {
|
|
11
|
+
return null
|
|
12
|
+
}
|
|
13
|
+
versions.forEach((v) => {
|
|
14
|
+
if (rangeObj.test(v)) {
|
|
15
|
+
// satisfies(v, range, options)
|
|
16
|
+
if (!max || maxSV.compare(v) === -1) {
|
|
17
|
+
// compare(max, v, true)
|
|
18
|
+
max = v
|
|
19
|
+
maxSV = new SemVer(max, options)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
})
|
|
23
|
+
return max
|
|
24
|
+
}
|
|
25
|
+
module.exports = maxSatisfying
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const SemVer = require('../classes/semver')
|
|
2
|
+
const Range = require('../classes/range')
|
|
3
|
+
const minSatisfying = (versions, range, options) => {
|
|
4
|
+
let min = null
|
|
5
|
+
let minSV = null
|
|
6
|
+
let rangeObj = null
|
|
7
|
+
try {
|
|
8
|
+
rangeObj = new Range(range, options)
|
|
9
|
+
} catch (er) {
|
|
10
|
+
return null
|
|
11
|
+
}
|
|
12
|
+
versions.forEach((v) => {
|
|
13
|
+
if (rangeObj.test(v)) {
|
|
14
|
+
// satisfies(v, range, options)
|
|
15
|
+
if (!min || minSV.compare(v) === 1) {
|
|
16
|
+
// compare(min, v, true)
|
|
17
|
+
min = v
|
|
18
|
+
minSV = new SemVer(min, options)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
})
|
|
22
|
+
return min
|
|
23
|
+
}
|
|
24
|
+
module.exports = minSatisfying
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
const SemVer = require('../classes/semver')
|
|
2
|
+
const Range = require('../classes/range')
|
|
3
|
+
const gt = require('../functions/gt')
|
|
4
|
+
|
|
5
|
+
const minVersion = (range, loose) => {
|
|
6
|
+
range = new Range(range, loose)
|
|
7
|
+
|
|
8
|
+
let minver = new SemVer('0.0.0')
|
|
9
|
+
if (range.test(minver)) {
|
|
10
|
+
return minver
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
minver = new SemVer('0.0.0-0')
|
|
14
|
+
if (range.test(minver)) {
|
|
15
|
+
return minver
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
minver = null
|
|
19
|
+
for (let i = 0; i < range.set.length; ++i) {
|
|
20
|
+
const comparators = range.set[i]
|
|
21
|
+
|
|
22
|
+
comparators.forEach((comparator) => {
|
|
23
|
+
// Clone to avoid manipulating the comparator's semver object.
|
|
24
|
+
const compver = new SemVer(comparator.semver.version)
|
|
25
|
+
switch (comparator.operator) {
|
|
26
|
+
case '>':
|
|
27
|
+
if (compver.prerelease.length === 0) {
|
|
28
|
+
compver.patch++
|
|
29
|
+
} else {
|
|
30
|
+
compver.prerelease.push(0)
|
|
31
|
+
}
|
|
32
|
+
compver.raw = compver.format()
|
|
33
|
+
/* fallthrough */
|
|
34
|
+
case '':
|
|
35
|
+
case '>=':
|
|
36
|
+
if (!minver || gt(minver, compver)) {
|
|
37
|
+
minver = compver
|
|
38
|
+
}
|
|
39
|
+
break
|
|
40
|
+
case '<':
|
|
41
|
+
case '<=':
|
|
42
|
+
/* Ignore maximum versions */
|
|
43
|
+
break
|
|
44
|
+
/* istanbul ignore next */
|
|
45
|
+
default:
|
|
46
|
+
throw new Error(`Unexpected operation: ${comparator.operator}`)
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (minver && range.test(minver)) {
|
|
52
|
+
return minver
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return null
|
|
56
|
+
}
|
|
57
|
+
module.exports = minVersion
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
const SemVer = require('../classes/semver')
|
|
2
|
+
const Comparator = require('../classes/comparator')
|
|
3
|
+
const {ANY} = Comparator
|
|
4
|
+
const Range = require('../classes/range')
|
|
5
|
+
const satisfies = require('../functions/satisfies')
|
|
6
|
+
const gt = require('../functions/gt')
|
|
7
|
+
const lt = require('../functions/lt')
|
|
8
|
+
const lte = require('../functions/lte')
|
|
9
|
+
const gte = require('../functions/gte')
|
|
10
|
+
|
|
11
|
+
const outside = (version, range, hilo, options) => {
|
|
12
|
+
version = new SemVer(version, options)
|
|
13
|
+
range = new Range(range, options)
|
|
14
|
+
|
|
15
|
+
let gtfn, ltefn, ltfn, comp, ecomp
|
|
16
|
+
switch (hilo) {
|
|
17
|
+
case '>':
|
|
18
|
+
gtfn = gt
|
|
19
|
+
ltefn = lte
|
|
20
|
+
ltfn = lt
|
|
21
|
+
comp = '>'
|
|
22
|
+
ecomp = '>='
|
|
23
|
+
break
|
|
24
|
+
case '<':
|
|
25
|
+
gtfn = lt
|
|
26
|
+
ltefn = gte
|
|
27
|
+
ltfn = gt
|
|
28
|
+
comp = '<'
|
|
29
|
+
ecomp = '<='
|
|
30
|
+
break
|
|
31
|
+
default:
|
|
32
|
+
throw new TypeError('Must provide a hilo val of "<" or ">"')
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// If it satisifes the range it is not outside
|
|
36
|
+
if (satisfies(version, range, options)) {
|
|
37
|
+
return false
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// From now on, variable terms are as if we're in "gtr" mode.
|
|
41
|
+
// but note that everything is flipped for the "ltr" function.
|
|
42
|
+
|
|
43
|
+
for (let i = 0; i < range.set.length; ++i) {
|
|
44
|
+
const comparators = range.set[i]
|
|
45
|
+
|
|
46
|
+
let high = null
|
|
47
|
+
let low = null
|
|
48
|
+
|
|
49
|
+
comparators.forEach((comparator) => {
|
|
50
|
+
if (comparator.semver === ANY) {
|
|
51
|
+
comparator = new Comparator('>=0.0.0')
|
|
52
|
+
}
|
|
53
|
+
high = high || comparator
|
|
54
|
+
low = low || comparator
|
|
55
|
+
if (gtfn(comparator.semver, high.semver, options)) {
|
|
56
|
+
high = comparator
|
|
57
|
+
} else if (ltfn(comparator.semver, low.semver, options)) {
|
|
58
|
+
low = comparator
|
|
59
|
+
}
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
// If the edge version comparator has a operator then our version
|
|
63
|
+
// isn't outside it
|
|
64
|
+
if (high.operator === comp || high.operator === ecomp) {
|
|
65
|
+
return false
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// If the lowest version comparator has an operator and our version
|
|
69
|
+
// is less than it then it isn't higher than the range
|
|
70
|
+
if ((!low.operator || low.operator === comp) &&
|
|
71
|
+
ltefn(version, low.semver)) {
|
|
72
|
+
return false
|
|
73
|
+
} else if (low.operator === ecomp && ltfn(version, low.semver)) {
|
|
74
|
+
return false
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return true
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
module.exports = outside
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const Range = require('../classes/range')
|
|
2
|
+
|
|
3
|
+
// Mostly just for testing and legacy API reasons
|
|
4
|
+
const toComparators = (range, options) =>
|
|
5
|
+
new Range(range, options).set
|
|
6
|
+
.map(comp => comp.map(c => c.value).join(' ').trim().split(' '))
|
|
7
|
+
|
|
8
|
+
module.exports = toComparators
|
package/ranges/valid.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const Range = require('../classes/range')
|
|
2
|
+
const validRange = (range, options) => {
|
|
3
|
+
try {
|
|
4
|
+
// Return '*' instead of '' so that truthiness works.
|
|
5
|
+
// This will throw if it's invalid anyway
|
|
6
|
+
return new Range(range, options).range || '*'
|
|
7
|
+
} catch (er) {
|
|
8
|
+
return null
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
module.exports = validRange
|
package/bin/.semver.js.swp
DELETED
|
Binary file
|