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 CHANGED
@@ -1,19 +1,26 @@
1
1
  {
2
2
  "name": "semver",
3
- "version": "6.2.0",
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
- "preversion": "npm test",
9
- "postversion": "npm publish",
10
- "postpublish": "git push origin --follow-tags"
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
- "tap": "^14.3.1"
16
+ "@npmcli/template-oss": "4.17.0",
17
+ "tap": "^12.7.0"
14
18
  },
15
19
  "license": "ISC",
16
- "repository": "https://github.com/npm/node-semver",
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
- "tap": {
26
- "check-coverage": true
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
- var NUMERICIDENTIFIER = R++
41
- src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'
42
- var NUMERICIDENTIFIERLOOSE = R++
43
- src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'
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
- var NONNUMERICIDENTIFIER = R++
50
- src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'
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
- var MAINVERSION = R++
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
- var MAINVERSIONLOOSE = R++
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
- var PRERELEASEIDENTIFIER = R++
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
- var PRERELEASEIDENTIFIERLOOSE = R++
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
- var PRERELEASE = R++
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
- var PRERELEASELOOSE = R++
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
- var BUILDIDENTIFIER = R++
92
- src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'
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
- var BUILD = R++
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
- var FULL = R++
112
- var FULLPLAIN = 'v?' + src[MAINVERSION] +
113
- src[PRERELEASE] + '?' +
114
- src[BUILD] + '?'
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
- var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] +
122
- src[PRERELEASELOOSE] + '?' +
123
- src[BUILD] + '?'
155
+ tok('LOOSEPLAIN')
156
+ src[t.LOOSEPLAIN] = '[v=\\s]*' + src[t.MAINVERSIONLOOSE] +
157
+ src[t.PRERELEASELOOSE] + '?' +
158
+ src[t.BUILD] + '?'
124
159
 
125
- var LOOSE = R++
126
- src[LOOSE] = '^' + LOOSEPLAIN + '$'
160
+ tok('LOOSE')
161
+ src[t.LOOSE] = '^' + src[t.LOOSEPLAIN] + '$'
127
162
 
128
- var GTLT = R++
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
- var XRANGEIDENTIFIERLOOSE = R++
135
- src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'
136
- var XRANGEIDENTIFIER = R++
137
- src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'
138
-
139
- var XRANGEPLAIN = R++
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
- var XRANGEPLAINLOOSE = R++
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
- var XRANGE = R++
156
- src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'
157
- var XRANGELOOSE = R++
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
- var COERCE = R++
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
- var COERCERTL = R++
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
- var LONETILDE = R++
174
- src[LONETILDE] = '(?:~>?)'
209
+ tok('LONETILDE')
210
+ src[t.LONETILDE] = '(?:~>?)'
175
211
 
176
- var TILDETRIM = R++
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
- var TILDE = R++
182
- src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'
183
- var TILDELOOSE = R++
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
- var LONECARET = R++
189
- src[LONECARET] = '(?:\\^)'
225
+ tok('LONECARET')
226
+ src[t.LONECARET] = '(?:\\^)'
190
227
 
191
- var CARETTRIM = R++
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
- var CARET = R++
197
- src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'
198
- var CARETLOOSE = R++
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
- var COMPARATORLOOSE = R++
203
- src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'
204
- var COMPARATOR = R++
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
- var COMPARATORTRIM = R++
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
- var HYPHENRANGE = R++
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
- var HYPHENRANGELOOSE = R++
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
- var STAR = R++
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 ? re[LOOSE] : re[FULL]
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 ? re[LOOSE] : re[FULL])
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 ? re[COMPARATORLOOSE] : re[COMPARATOR]
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, split based on boolean or ||
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
- this.set = range.split(/\s*\|\|\s*/).map(function (range) {
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: ' + 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 ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]
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(re[COMPARATORTRIM], comparatorTrimReplace)
943
- debug('comparator trim', range, re[COMPARATORTRIM])
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(re[TILDETRIM], tildeTrimReplace)
1000
+ range = range.replace(safeRe[t.TILDETRIM], tildeTrimReplace)
947
1001
 
948
1002
  // `^ 1.2.3` => `^1.2.3`
949
- range = range.replace(re[CARETTRIM], caretTrimReplace)
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 ? re[COMPARATORLOOSE] : re[COMPARATOR]
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 ? re[TILDELOOSE] : re[TILDE]
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 ? re[CARETLOOSE] : re[CARET]
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 ? re[XRANGELOOSE] : re[XRANGE]
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(re[STAR], '')
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(re[COERCE])
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 = re[COERCERTL].exec(version)) &&
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
- re[COERCERTL].lastIndex = next.index + next[1].length + next[2].length
1630
+ safeRe[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length
1577
1631
  }
1578
1632
  // leave it in a clean state
1579
- re[COERCERTL].lastIndex = -1
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
Binary file