semver 6.2.0 → 6.3.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/package.json +19 -9
- package/semver.js +178 -124
- package/CHANGELOG.md +0 -47
- package/bin/.semver.js.swp +0 -0
package/package.json
CHANGED
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "semver",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.3.1",
|
|
4
4
|
"description": "The semantic version parser used by npm.",
|
|
5
5
|
"main": "semver.js",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"test": "tap",
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
7
|
+
"test": "tap test/ --100 --timeout=30",
|
|
8
|
+
"lint": "echo linting disabled",
|
|
9
|
+
"postlint": "template-oss-check",
|
|
10
|
+
"template-oss-apply": "template-oss-apply --force",
|
|
11
|
+
"lintfix": "npm run lint -- --fix",
|
|
12
|
+
"snap": "tap test/ --100 --timeout=30",
|
|
13
|
+
"posttest": "npm run lint"
|
|
11
14
|
},
|
|
12
15
|
"devDependencies": {
|
|
13
|
-
"
|
|
16
|
+
"@npmcli/template-oss": "4.17.0",
|
|
17
|
+
"tap": "^12.7.0"
|
|
14
18
|
},
|
|
15
19
|
"license": "ISC",
|
|
16
|
-
"repository":
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "https://github.com/npm/node-semver.git"
|
|
23
|
+
},
|
|
17
24
|
"bin": {
|
|
18
25
|
"semver": "./bin/semver.js"
|
|
19
26
|
},
|
|
@@ -22,7 +29,10 @@
|
|
|
22
29
|
"range.bnf",
|
|
23
30
|
"semver.js"
|
|
24
31
|
],
|
|
25
|
-
"
|
|
26
|
-
|
|
32
|
+
"author": "GitHub Inc.",
|
|
33
|
+
"templateOSS": {
|
|
34
|
+
"//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
|
|
35
|
+
"content": "./scripts/template-oss",
|
|
36
|
+
"version": "4.17.0"
|
|
27
37
|
}
|
|
28
38
|
}
|
package/semver.js
CHANGED
|
@@ -26,78 +26,111 @@ var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
|
|
|
26
26
|
// Max safe segment length for coercion.
|
|
27
27
|
var MAX_SAFE_COMPONENT_LENGTH = 16
|
|
28
28
|
|
|
29
|
+
var MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6
|
|
30
|
+
|
|
29
31
|
// The actual regexps go on exports.re
|
|
30
32
|
var re = exports.re = []
|
|
33
|
+
var safeRe = exports.safeRe = []
|
|
31
34
|
var src = exports.src = []
|
|
35
|
+
var t = exports.tokens = {}
|
|
32
36
|
var R = 0
|
|
33
37
|
|
|
38
|
+
function tok (n) {
|
|
39
|
+
t[n] = R++
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
var LETTERDASHNUMBER = '[a-zA-Z0-9-]'
|
|
43
|
+
|
|
44
|
+
// Replace some greedy regex tokens to prevent regex dos issues. These regex are
|
|
45
|
+
// used internally via the safeRe object since all inputs in this library get
|
|
46
|
+
// normalized first to trim and collapse all extra whitespace. The original
|
|
47
|
+
// regexes are exported for userland consumption and lower level usage. A
|
|
48
|
+
// future breaking change could export the safer regex only with a note that
|
|
49
|
+
// all input should have extra whitespace removed.
|
|
50
|
+
var safeRegexReplacements = [
|
|
51
|
+
['\\s', 1],
|
|
52
|
+
['\\d', MAX_LENGTH],
|
|
53
|
+
[LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
function makeSafeRe (value) {
|
|
57
|
+
for (var i = 0; i < safeRegexReplacements.length; i++) {
|
|
58
|
+
var token = safeRegexReplacements[i][0]
|
|
59
|
+
var max = safeRegexReplacements[i][1]
|
|
60
|
+
value = value
|
|
61
|
+
.split(token + '*').join(token + '{0,' + max + '}')
|
|
62
|
+
.split(token + '+').join(token + '{1,' + max + '}')
|
|
63
|
+
}
|
|
64
|
+
return value
|
|
65
|
+
}
|
|
66
|
+
|
|
34
67
|
// The following Regular Expressions can be used for tokenizing,
|
|
35
68
|
// validating, and parsing SemVer version strings.
|
|
36
69
|
|
|
37
70
|
// ## Numeric Identifier
|
|
38
71
|
// A single `0`, or a non-zero digit followed by zero or more digits.
|
|
39
72
|
|
|
40
|
-
|
|
41
|
-
src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'
|
|
42
|
-
|
|
43
|
-
src[NUMERICIDENTIFIERLOOSE] = '
|
|
73
|
+
tok('NUMERICIDENTIFIER')
|
|
74
|
+
src[t.NUMERICIDENTIFIER] = '0|[1-9]\\d*'
|
|
75
|
+
tok('NUMERICIDENTIFIERLOOSE')
|
|
76
|
+
src[t.NUMERICIDENTIFIERLOOSE] = '\\d+'
|
|
44
77
|
|
|
45
78
|
// ## Non-numeric Identifier
|
|
46
79
|
// Zero or more digits, followed by a letter or hyphen, and then zero or
|
|
47
80
|
// more letters, digits, or hyphens.
|
|
48
81
|
|
|
49
|
-
|
|
50
|
-
src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-]
|
|
82
|
+
tok('NONNUMERICIDENTIFIER')
|
|
83
|
+
src[t.NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-]' + LETTERDASHNUMBER + '*'
|
|
51
84
|
|
|
52
85
|
// ## Main Version
|
|
53
86
|
// Three dot-separated numeric identifiers.
|
|
54
87
|
|
|
55
|
-
|
|
56
|
-
src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' +
|
|
57
|
-
'(' + src[NUMERICIDENTIFIER] + ')\\.' +
|
|
58
|
-
'(' + src[NUMERICIDENTIFIER] + ')'
|
|
88
|
+
tok('MAINVERSION')
|
|
89
|
+
src[t.MAINVERSION] = '(' + src[t.NUMERICIDENTIFIER] + ')\\.' +
|
|
90
|
+
'(' + src[t.NUMERICIDENTIFIER] + ')\\.' +
|
|
91
|
+
'(' + src[t.NUMERICIDENTIFIER] + ')'
|
|
59
92
|
|
|
60
|
-
|
|
61
|
-
src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
|
|
62
|
-
'(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
|
|
63
|
-
'(' + src[NUMERICIDENTIFIERLOOSE] + ')'
|
|
93
|
+
tok('MAINVERSIONLOOSE')
|
|
94
|
+
src[t.MAINVERSIONLOOSE] = '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' +
|
|
95
|
+
'(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' +
|
|
96
|
+
'(' + src[t.NUMERICIDENTIFIERLOOSE] + ')'
|
|
64
97
|
|
|
65
98
|
// ## Pre-release Version Identifier
|
|
66
99
|
// A numeric identifier, or a non-numeric identifier.
|
|
67
100
|
|
|
68
|
-
|
|
69
|
-
src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +
|
|
70
|
-
'|' + src[NONNUMERICIDENTIFIER] + ')'
|
|
101
|
+
tok('PRERELEASEIDENTIFIER')
|
|
102
|
+
src[t.PRERELEASEIDENTIFIER] = '(?:' + src[t.NUMERICIDENTIFIER] +
|
|
103
|
+
'|' + src[t.NONNUMERICIDENTIFIER] + ')'
|
|
71
104
|
|
|
72
|
-
|
|
73
|
-
src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +
|
|
74
|
-
'|' + src[NONNUMERICIDENTIFIER] + ')'
|
|
105
|
+
tok('PRERELEASEIDENTIFIERLOOSE')
|
|
106
|
+
src[t.PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[t.NUMERICIDENTIFIERLOOSE] +
|
|
107
|
+
'|' + src[t.NONNUMERICIDENTIFIER] + ')'
|
|
75
108
|
|
|
76
109
|
// ## Pre-release Version
|
|
77
110
|
// Hyphen, followed by one or more dot-separated pre-release version
|
|
78
111
|
// identifiers.
|
|
79
112
|
|
|
80
|
-
|
|
81
|
-
src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +
|
|
82
|
-
'(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'
|
|
113
|
+
tok('PRERELEASE')
|
|
114
|
+
src[t.PRERELEASE] = '(?:-(' + src[t.PRERELEASEIDENTIFIER] +
|
|
115
|
+
'(?:\\.' + src[t.PRERELEASEIDENTIFIER] + ')*))'
|
|
83
116
|
|
|
84
|
-
|
|
85
|
-
src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +
|
|
86
|
-
'(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'
|
|
117
|
+
tok('PRERELEASELOOSE')
|
|
118
|
+
src[t.PRERELEASELOOSE] = '(?:-?(' + src[t.PRERELEASEIDENTIFIERLOOSE] +
|
|
119
|
+
'(?:\\.' + src[t.PRERELEASEIDENTIFIERLOOSE] + ')*))'
|
|
87
120
|
|
|
88
121
|
// ## Build Metadata Identifier
|
|
89
122
|
// Any combination of digits, letters, or hyphens.
|
|
90
123
|
|
|
91
|
-
|
|
92
|
-
src[BUILDIDENTIFIER] = '
|
|
124
|
+
tok('BUILDIDENTIFIER')
|
|
125
|
+
src[t.BUILDIDENTIFIER] = LETTERDASHNUMBER + '+'
|
|
93
126
|
|
|
94
127
|
// ## Build Metadata
|
|
95
128
|
// Plus sign, followed by one or more period-separated build metadata
|
|
96
129
|
// identifiers.
|
|
97
130
|
|
|
98
|
-
|
|
99
|
-
src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] +
|
|
100
|
-
'(?:\\.' + src[BUILDIDENTIFIER] + ')*))'
|
|
131
|
+
tok('BUILD')
|
|
132
|
+
src[t.BUILD] = '(?:\\+(' + src[t.BUILDIDENTIFIER] +
|
|
133
|
+
'(?:\\.' + src[t.BUILDIDENTIFIER] + ')*))'
|
|
101
134
|
|
|
102
135
|
// ## Full Version String
|
|
103
136
|
// A main version, followed optionally by a pre-release version and
|
|
@@ -108,131 +141,137 @@ src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] +
|
|
|
108
141
|
// capturing group, because it should not ever be used in version
|
|
109
142
|
// comparison.
|
|
110
143
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
144
|
+
tok('FULL')
|
|
145
|
+
tok('FULLPLAIN')
|
|
146
|
+
src[t.FULLPLAIN] = 'v?' + src[t.MAINVERSION] +
|
|
147
|
+
src[t.PRERELEASE] + '?' +
|
|
148
|
+
src[t.BUILD] + '?'
|
|
115
149
|
|
|
116
|
-
src[FULL] = '^' + FULLPLAIN + '$'
|
|
150
|
+
src[t.FULL] = '^' + src[t.FULLPLAIN] + '$'
|
|
117
151
|
|
|
118
152
|
// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
|
|
119
153
|
// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
|
|
120
154
|
// common in the npm registry.
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
155
|
+
tok('LOOSEPLAIN')
|
|
156
|
+
src[t.LOOSEPLAIN] = '[v=\\s]*' + src[t.MAINVERSIONLOOSE] +
|
|
157
|
+
src[t.PRERELEASELOOSE] + '?' +
|
|
158
|
+
src[t.BUILD] + '?'
|
|
124
159
|
|
|
125
|
-
|
|
126
|
-
src[LOOSE] = '^' + LOOSEPLAIN + '$'
|
|
160
|
+
tok('LOOSE')
|
|
161
|
+
src[t.LOOSE] = '^' + src[t.LOOSEPLAIN] + '$'
|
|
127
162
|
|
|
128
|
-
|
|
129
|
-
src[GTLT] = '((?:<|>)?=?)'
|
|
163
|
+
tok('GTLT')
|
|
164
|
+
src[t.GTLT] = '((?:<|>)?=?)'
|
|
130
165
|
|
|
131
166
|
// Something like "2.*" or "1.2.x".
|
|
132
167
|
// Note that "x.x" is a valid xRange identifer, meaning "any version"
|
|
133
168
|
// Only the first item is strictly required.
|
|
134
|
-
|
|
135
|
-
src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'
|
|
136
|
-
|
|
137
|
-
src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' +
|
|
141
|
-
'(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
|
|
142
|
-
'(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
|
|
143
|
-
'(?:' + src[PRERELEASE] + ')?' +
|
|
144
|
-
src[BUILD] + '?' +
|
|
169
|
+
tok('XRANGEIDENTIFIERLOOSE')
|
|
170
|
+
src[t.XRANGEIDENTIFIERLOOSE] = src[t.NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'
|
|
171
|
+
tok('XRANGEIDENTIFIER')
|
|
172
|
+
src[t.XRANGEIDENTIFIER] = src[t.NUMERICIDENTIFIER] + '|x|X|\\*'
|
|
173
|
+
|
|
174
|
+
tok('XRANGEPLAIN')
|
|
175
|
+
src[t.XRANGEPLAIN] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIER] + ')' +
|
|
176
|
+
'(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' +
|
|
177
|
+
'(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' +
|
|
178
|
+
'(?:' + src[t.PRERELEASE] + ')?' +
|
|
179
|
+
src[t.BUILD] + '?' +
|
|
145
180
|
')?)?'
|
|
146
181
|
|
|
147
|
-
|
|
148
|
-
src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
|
|
149
|
-
'(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
|
|
150
|
-
'(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
|
|
151
|
-
'(?:' + src[PRERELEASELOOSE] + ')?' +
|
|
152
|
-
src[BUILD] + '?' +
|
|
182
|
+
tok('XRANGEPLAINLOOSE')
|
|
183
|
+
src[t.XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
|
|
184
|
+
'(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
|
|
185
|
+
'(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
|
|
186
|
+
'(?:' + src[t.PRERELEASELOOSE] + ')?' +
|
|
187
|
+
src[t.BUILD] + '?' +
|
|
153
188
|
')?)?'
|
|
154
189
|
|
|
155
|
-
|
|
156
|
-
src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'
|
|
157
|
-
|
|
158
|
-
src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'
|
|
190
|
+
tok('XRANGE')
|
|
191
|
+
src[t.XRANGE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAIN] + '$'
|
|
192
|
+
tok('XRANGELOOSE')
|
|
193
|
+
src[t.XRANGELOOSE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAINLOOSE] + '$'
|
|
159
194
|
|
|
160
195
|
// Coercion.
|
|
161
196
|
// Extract anything that could conceivably be a part of a valid semver
|
|
162
|
-
|
|
163
|
-
src[COERCE] = '(^|[^\\d])' +
|
|
197
|
+
tok('COERCE')
|
|
198
|
+
src[t.COERCE] = '(^|[^\\d])' +
|
|
164
199
|
'(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +
|
|
165
200
|
'(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
|
|
166
201
|
'(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
|
|
167
202
|
'(?:$|[^\\d])'
|
|
168
|
-
|
|
169
|
-
re[COERCERTL] = new RegExp(src[COERCE], 'g')
|
|
203
|
+
tok('COERCERTL')
|
|
204
|
+
re[t.COERCERTL] = new RegExp(src[t.COERCE], 'g')
|
|
205
|
+
safeRe[t.COERCERTL] = new RegExp(makeSafeRe(src[t.COERCE]), 'g')
|
|
170
206
|
|
|
171
207
|
// Tilde ranges.
|
|
172
208
|
// Meaning is "reasonably at or greater than"
|
|
173
|
-
|
|
174
|
-
src[LONETILDE] = '(?:~>?)'
|
|
209
|
+
tok('LONETILDE')
|
|
210
|
+
src[t.LONETILDE] = '(?:~>?)'
|
|
175
211
|
|
|
176
|
-
|
|
177
|
-
src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'
|
|
178
|
-
re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g')
|
|
212
|
+
tok('TILDETRIM')
|
|
213
|
+
src[t.TILDETRIM] = '(\\s*)' + src[t.LONETILDE] + '\\s+'
|
|
214
|
+
re[t.TILDETRIM] = new RegExp(src[t.TILDETRIM], 'g')
|
|
215
|
+
safeRe[t.TILDETRIM] = new RegExp(makeSafeRe(src[t.TILDETRIM]), 'g')
|
|
179
216
|
var tildeTrimReplace = '$1~'
|
|
180
217
|
|
|
181
|
-
|
|
182
|
-
src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'
|
|
183
|
-
|
|
184
|
-
src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'
|
|
218
|
+
tok('TILDE')
|
|
219
|
+
src[t.TILDE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAIN] + '$'
|
|
220
|
+
tok('TILDELOOSE')
|
|
221
|
+
src[t.TILDELOOSE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAINLOOSE] + '$'
|
|
185
222
|
|
|
186
223
|
// Caret ranges.
|
|
187
224
|
// Meaning is "at least and backwards compatible with"
|
|
188
|
-
|
|
189
|
-
src[LONECARET] = '(?:\\^)'
|
|
225
|
+
tok('LONECARET')
|
|
226
|
+
src[t.LONECARET] = '(?:\\^)'
|
|
190
227
|
|
|
191
|
-
|
|
192
|
-
src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'
|
|
193
|
-
re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g')
|
|
228
|
+
tok('CARETTRIM')
|
|
229
|
+
src[t.CARETTRIM] = '(\\s*)' + src[t.LONECARET] + '\\s+'
|
|
230
|
+
re[t.CARETTRIM] = new RegExp(src[t.CARETTRIM], 'g')
|
|
231
|
+
safeRe[t.CARETTRIM] = new RegExp(makeSafeRe(src[t.CARETTRIM]), 'g')
|
|
194
232
|
var caretTrimReplace = '$1^'
|
|
195
233
|
|
|
196
|
-
|
|
197
|
-
src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'
|
|
198
|
-
|
|
199
|
-
src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'
|
|
234
|
+
tok('CARET')
|
|
235
|
+
src[t.CARET] = '^' + src[t.LONECARET] + src[t.XRANGEPLAIN] + '$'
|
|
236
|
+
tok('CARETLOOSE')
|
|
237
|
+
src[t.CARETLOOSE] = '^' + src[t.LONECARET] + src[t.XRANGEPLAINLOOSE] + '$'
|
|
200
238
|
|
|
201
239
|
// A simple gt/lt/eq thing, or just "" to indicate "any version"
|
|
202
|
-
|
|
203
|
-
src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'
|
|
204
|
-
|
|
205
|
-
src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'
|
|
240
|
+
tok('COMPARATORLOOSE')
|
|
241
|
+
src[t.COMPARATORLOOSE] = '^' + src[t.GTLT] + '\\s*(' + src[t.LOOSEPLAIN] + ')$|^$'
|
|
242
|
+
tok('COMPARATOR')
|
|
243
|
+
src[t.COMPARATOR] = '^' + src[t.GTLT] + '\\s*(' + src[t.FULLPLAIN] + ')$|^$'
|
|
206
244
|
|
|
207
245
|
// An expression to strip any whitespace between the gtlt and the thing
|
|
208
246
|
// it modifies, so that `> 1.2.3` ==> `>1.2.3`
|
|
209
|
-
|
|
210
|
-
src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] +
|
|
211
|
-
'\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'
|
|
247
|
+
tok('COMPARATORTRIM')
|
|
248
|
+
src[t.COMPARATORTRIM] = '(\\s*)' + src[t.GTLT] +
|
|
249
|
+
'\\s*(' + src[t.LOOSEPLAIN] + '|' + src[t.XRANGEPLAIN] + ')'
|
|
212
250
|
|
|
213
251
|
// this one has to use the /g flag
|
|
214
|
-
re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g')
|
|
252
|
+
re[t.COMPARATORTRIM] = new RegExp(src[t.COMPARATORTRIM], 'g')
|
|
253
|
+
safeRe[t.COMPARATORTRIM] = new RegExp(makeSafeRe(src[t.COMPARATORTRIM]), 'g')
|
|
215
254
|
var comparatorTrimReplace = '$1$2$3'
|
|
216
255
|
|
|
217
256
|
// Something like `1.2.3 - 1.2.4`
|
|
218
257
|
// Note that these all use the loose form, because they'll be
|
|
219
258
|
// checked against either the strict or loose comparator form
|
|
220
259
|
// later.
|
|
221
|
-
|
|
222
|
-
src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' +
|
|
260
|
+
tok('HYPHENRANGE')
|
|
261
|
+
src[t.HYPHENRANGE] = '^\\s*(' + src[t.XRANGEPLAIN] + ')' +
|
|
223
262
|
'\\s+-\\s+' +
|
|
224
|
-
'(' + src[XRANGEPLAIN] + ')' +
|
|
263
|
+
'(' + src[t.XRANGEPLAIN] + ')' +
|
|
225
264
|
'\\s*$'
|
|
226
265
|
|
|
227
|
-
|
|
228
|
-
src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' +
|
|
266
|
+
tok('HYPHENRANGELOOSE')
|
|
267
|
+
src[t.HYPHENRANGELOOSE] = '^\\s*(' + src[t.XRANGEPLAINLOOSE] + ')' +
|
|
229
268
|
'\\s+-\\s+' +
|
|
230
|
-
'(' + src[XRANGEPLAINLOOSE] + ')' +
|
|
269
|
+
'(' + src[t.XRANGEPLAINLOOSE] + ')' +
|
|
231
270
|
'\\s*$'
|
|
232
271
|
|
|
233
272
|
// Star ranges basically just allow anything at all.
|
|
234
|
-
|
|
235
|
-
src[STAR] = '(<|>)?=?\\s*\\*'
|
|
273
|
+
tok('STAR')
|
|
274
|
+
src[t.STAR] = '(<|>)?=?\\s*\\*'
|
|
236
275
|
|
|
237
276
|
// Compile to actual regexp objects.
|
|
238
277
|
// All are flag-free, unless they were created above with a flag.
|
|
@@ -240,6 +279,14 @@ for (var i = 0; i < R; i++) {
|
|
|
240
279
|
debug(i, src[i])
|
|
241
280
|
if (!re[i]) {
|
|
242
281
|
re[i] = new RegExp(src[i])
|
|
282
|
+
|
|
283
|
+
// Replace all greedy whitespace to prevent regex dos issues. These regex are
|
|
284
|
+
// used internally via the safeRe object since all inputs in this library get
|
|
285
|
+
// normalized first to trim and collapse all extra whitespace. The original
|
|
286
|
+
// regexes are exported for userland consumption and lower level usage. A
|
|
287
|
+
// future breaking change could export the safer regex only with a note that
|
|
288
|
+
// all input should have extra whitespace removed.
|
|
289
|
+
safeRe[i] = new RegExp(makeSafeRe(src[i]))
|
|
243
290
|
}
|
|
244
291
|
}
|
|
245
292
|
|
|
@@ -264,7 +311,7 @@ function parse (version, options) {
|
|
|
264
311
|
return null
|
|
265
312
|
}
|
|
266
313
|
|
|
267
|
-
var r = options.loose ?
|
|
314
|
+
var r = options.loose ? safeRe[t.LOOSE] : safeRe[t.FULL]
|
|
268
315
|
if (!r.test(version)) {
|
|
269
316
|
return null
|
|
270
317
|
}
|
|
@@ -319,7 +366,7 @@ function SemVer (version, options) {
|
|
|
319
366
|
this.options = options
|
|
320
367
|
this.loose = !!options.loose
|
|
321
368
|
|
|
322
|
-
var m = version.trim().match(options.loose ?
|
|
369
|
+
var m = version.trim().match(options.loose ? safeRe[t.LOOSE] : safeRe[t.FULL])
|
|
323
370
|
|
|
324
371
|
if (!m) {
|
|
325
372
|
throw new TypeError('Invalid Version: ' + version)
|
|
@@ -764,6 +811,7 @@ function Comparator (comp, options) {
|
|
|
764
811
|
return new Comparator(comp, options)
|
|
765
812
|
}
|
|
766
813
|
|
|
814
|
+
comp = comp.trim().split(/\s+/).join(' ')
|
|
767
815
|
debug('comparator', comp, options)
|
|
768
816
|
this.options = options
|
|
769
817
|
this.loose = !!options.loose
|
|
@@ -780,7 +828,7 @@ function Comparator (comp, options) {
|
|
|
780
828
|
|
|
781
829
|
var ANY = {}
|
|
782
830
|
Comparator.prototype.parse = function (comp) {
|
|
783
|
-
var r = this.options.loose ?
|
|
831
|
+
var r = this.options.loose ? safeRe[t.COMPARATORLOOSE] : safeRe[t.COMPARATOR]
|
|
784
832
|
var m = comp.match(r)
|
|
785
833
|
|
|
786
834
|
if (!m) {
|
|
@@ -904,9 +952,16 @@ function Range (range, options) {
|
|
|
904
952
|
this.loose = !!options.loose
|
|
905
953
|
this.includePrerelease = !!options.includePrerelease
|
|
906
954
|
|
|
907
|
-
// First
|
|
955
|
+
// First reduce all whitespace as much as possible so we do not have to rely
|
|
956
|
+
// on potentially slow regexes like \s*. This is then stored and used for
|
|
957
|
+
// future error messages as well.
|
|
908
958
|
this.raw = range
|
|
909
|
-
|
|
959
|
+
.trim()
|
|
960
|
+
.split(/\s+/)
|
|
961
|
+
.join(' ')
|
|
962
|
+
|
|
963
|
+
// First, split based on boolean or ||
|
|
964
|
+
this.set = this.raw.split('||').map(function (range) {
|
|
910
965
|
return this.parseRange(range.trim())
|
|
911
966
|
}, this).filter(function (c) {
|
|
912
967
|
// throw out any that are not relevant for whatever reason
|
|
@@ -914,7 +969,7 @@ function Range (range, options) {
|
|
|
914
969
|
})
|
|
915
970
|
|
|
916
971
|
if (!this.set.length) {
|
|
917
|
-
throw new TypeError('Invalid SemVer Range: ' +
|
|
972
|
+
throw new TypeError('Invalid SemVer Range: ' + this.raw)
|
|
918
973
|
}
|
|
919
974
|
|
|
920
975
|
this.format()
|
|
@@ -933,20 +988,19 @@ Range.prototype.toString = function () {
|
|
|
933
988
|
|
|
934
989
|
Range.prototype.parseRange = function (range) {
|
|
935
990
|
var loose = this.options.loose
|
|
936
|
-
range = range.trim()
|
|
937
991
|
// `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
|
|
938
|
-
var hr = loose ?
|
|
992
|
+
var hr = loose ? safeRe[t.HYPHENRANGELOOSE] : safeRe[t.HYPHENRANGE]
|
|
939
993
|
range = range.replace(hr, hyphenReplace)
|
|
940
994
|
debug('hyphen replace', range)
|
|
941
995
|
// `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
|
|
942
|
-
range = range.replace(
|
|
943
|
-
debug('comparator trim', range,
|
|
996
|
+
range = range.replace(safeRe[t.COMPARATORTRIM], comparatorTrimReplace)
|
|
997
|
+
debug('comparator trim', range, safeRe[t.COMPARATORTRIM])
|
|
944
998
|
|
|
945
999
|
// `~ 1.2.3` => `~1.2.3`
|
|
946
|
-
range = range.replace(
|
|
1000
|
+
range = range.replace(safeRe[t.TILDETRIM], tildeTrimReplace)
|
|
947
1001
|
|
|
948
1002
|
// `^ 1.2.3` => `^1.2.3`
|
|
949
|
-
range = range.replace(
|
|
1003
|
+
range = range.replace(safeRe[t.CARETTRIM], caretTrimReplace)
|
|
950
1004
|
|
|
951
1005
|
// normalize spaces
|
|
952
1006
|
range = range.split(/\s+/).join(' ')
|
|
@@ -954,7 +1008,7 @@ Range.prototype.parseRange = function (range) {
|
|
|
954
1008
|
// At this point, the range is completely trimmed and
|
|
955
1009
|
// ready to be split into comparators.
|
|
956
1010
|
|
|
957
|
-
var compRe = loose ?
|
|
1011
|
+
var compRe = loose ? safeRe[t.COMPARATORLOOSE] : safeRe[t.COMPARATOR]
|
|
958
1012
|
var set = range.split(' ').map(function (comp) {
|
|
959
1013
|
return parseComparator(comp, this.options)
|
|
960
1014
|
}, this).join(' ').split(/\s+/)
|
|
@@ -1054,7 +1108,7 @@ function replaceTildes (comp, options) {
|
|
|
1054
1108
|
}
|
|
1055
1109
|
|
|
1056
1110
|
function replaceTilde (comp, options) {
|
|
1057
|
-
var r = options.loose ?
|
|
1111
|
+
var r = options.loose ? safeRe[t.TILDELOOSE] : safeRe[t.TILDE]
|
|
1058
1112
|
return comp.replace(r, function (_, M, m, p, pr) {
|
|
1059
1113
|
debug('tilde', comp, _, M, m, p, pr)
|
|
1060
1114
|
var ret
|
|
@@ -1095,7 +1149,7 @@ function replaceCarets (comp, options) {
|
|
|
1095
1149
|
|
|
1096
1150
|
function replaceCaret (comp, options) {
|
|
1097
1151
|
debug('caret', comp, options)
|
|
1098
|
-
var r = options.loose ?
|
|
1152
|
+
var r = options.loose ? safeRe[t.CARETLOOSE] : safeRe[t.CARET]
|
|
1099
1153
|
return comp.replace(r, function (_, M, m, p, pr) {
|
|
1100
1154
|
debug('caret', comp, _, M, m, p, pr)
|
|
1101
1155
|
var ret
|
|
@@ -1154,7 +1208,7 @@ function replaceXRanges (comp, options) {
|
|
|
1154
1208
|
|
|
1155
1209
|
function replaceXRange (comp, options) {
|
|
1156
1210
|
comp = comp.trim()
|
|
1157
|
-
var r = options.loose ?
|
|
1211
|
+
var r = options.loose ? safeRe[t.XRANGELOOSE] : safeRe[t.XRANGE]
|
|
1158
1212
|
return comp.replace(r, function (ret, gtlt, M, m, p, pr) {
|
|
1159
1213
|
debug('xRange', comp, ret, gtlt, M, m, p, pr)
|
|
1160
1214
|
var xM = isX(M)
|
|
@@ -1229,10 +1283,10 @@ function replaceXRange (comp, options) {
|
|
|
1229
1283
|
function replaceStars (comp, options) {
|
|
1230
1284
|
debug('replaceStars', comp, options)
|
|
1231
1285
|
// Looseness is ignored here. star is always as loose as it gets!
|
|
1232
|
-
return comp.trim().replace(
|
|
1286
|
+
return comp.trim().replace(safeRe[t.STAR], '')
|
|
1233
1287
|
}
|
|
1234
1288
|
|
|
1235
|
-
// This function is passed to string.replace(re[HYPHENRANGE])
|
|
1289
|
+
// This function is passed to string.replace(re[t.HYPHENRANGE])
|
|
1236
1290
|
// M, m, patch, prerelease, build
|
|
1237
1291
|
// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
|
|
1238
1292
|
// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
|
|
@@ -1555,7 +1609,7 @@ function coerce (version, options) {
|
|
|
1555
1609
|
|
|
1556
1610
|
var match = null
|
|
1557
1611
|
if (!options.rtl) {
|
|
1558
|
-
match = version.match(
|
|
1612
|
+
match = version.match(safeRe[t.COERCE])
|
|
1559
1613
|
} else {
|
|
1560
1614
|
// Find the right-most coercible string that does not share
|
|
1561
1615
|
// a terminus with a more left-ward coercible string.
|
|
@@ -1566,17 +1620,17 @@ function coerce (version, options) {
|
|
|
1566
1620
|
// Stop when we get a match that ends at the string end, since no
|
|
1567
1621
|
// coercible string can be more right-ward without the same terminus.
|
|
1568
1622
|
var next
|
|
1569
|
-
while ((next =
|
|
1623
|
+
while ((next = safeRe[t.COERCERTL].exec(version)) &&
|
|
1570
1624
|
(!match || match.index + match[0].length !== version.length)
|
|
1571
1625
|
) {
|
|
1572
1626
|
if (!match ||
|
|
1573
1627
|
next.index + next[0].length !== match.index + match[0].length) {
|
|
1574
1628
|
match = next
|
|
1575
1629
|
}
|
|
1576
|
-
|
|
1630
|
+
safeRe[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length
|
|
1577
1631
|
}
|
|
1578
1632
|
// leave it in a clean state
|
|
1579
|
-
|
|
1633
|
+
safeRe[t.COERCERTL].lastIndex = -1
|
|
1580
1634
|
}
|
|
1581
1635
|
|
|
1582
1636
|
if (match === null) {
|
package/CHANGELOG.md
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
# changes log
|
|
2
|
-
|
|
3
|
-
## 6.0
|
|
4
|
-
|
|
5
|
-
* Fix `intersects` logic.
|
|
6
|
-
|
|
7
|
-
This is technically a bug fix, but since it is also a change to behavior
|
|
8
|
-
that may require users updating their code, it is marked as a major
|
|
9
|
-
version increment.
|
|
10
|
-
|
|
11
|
-
## 5.7
|
|
12
|
-
|
|
13
|
-
* Add `minVersion` method
|
|
14
|
-
|
|
15
|
-
## 5.6
|
|
16
|
-
|
|
17
|
-
* Move boolean `loose` param to an options object, with
|
|
18
|
-
backwards-compatibility protection.
|
|
19
|
-
* Add ability to opt out of special prerelease version handling with
|
|
20
|
-
the `includePrerelease` option flag.
|
|
21
|
-
|
|
22
|
-
## 5.5
|
|
23
|
-
|
|
24
|
-
* Add version coercion capabilities
|
|
25
|
-
|
|
26
|
-
## 5.4
|
|
27
|
-
|
|
28
|
-
* Add intersection checking
|
|
29
|
-
|
|
30
|
-
## 5.3
|
|
31
|
-
|
|
32
|
-
* Add `minSatisfying` method
|
|
33
|
-
|
|
34
|
-
## 5.2
|
|
35
|
-
|
|
36
|
-
* Add `prerelease(v)` that returns prerelease components
|
|
37
|
-
|
|
38
|
-
## 5.1
|
|
39
|
-
|
|
40
|
-
* Add Backus-Naur for ranges
|
|
41
|
-
* Remove excessively cute inspection methods
|
|
42
|
-
|
|
43
|
-
## 5.0
|
|
44
|
-
|
|
45
|
-
* Remove AMD/Browserified build artifacts
|
|
46
|
-
* Fix ltr and gtr when using the `*` range
|
|
47
|
-
* Fix for range `*` with a prerelease identifier
|
package/bin/.semver.js.swp
DELETED
|
Binary file
|