semver 5.6.0 → 6.1.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/semver.js CHANGED
@@ -1,33 +1,35 @@
1
- exports = module.exports = SemVer;
2
-
3
- // The debug function is excluded entirely from the minified version.
4
- /* nomin */ var debug;
5
- /* nomin */ if (typeof process === 'object' &&
6
- /* nomin */ process.env &&
7
- /* nomin */ process.env.NODE_DEBUG &&
8
- /* nomin */ /\bsemver\b/i.test(process.env.NODE_DEBUG))
9
- /* nomin */ debug = function() {
10
- /* nomin */ var args = Array.prototype.slice.call(arguments, 0);
11
- /* nomin */ args.unshift('SEMVER');
12
- /* nomin */ console.log.apply(console, args);
13
- /* nomin */ };
14
- /* nomin */ else
15
- /* nomin */ debug = function() {};
1
+ exports = module.exports = SemVer
2
+
3
+ var debug
4
+ /* istanbul ignore next */
5
+ if (typeof process === 'object' &&
6
+ process.env &&
7
+ process.env.NODE_DEBUG &&
8
+ /\bsemver\b/i.test(process.env.NODE_DEBUG)) {
9
+ debug = function () {
10
+ var args = Array.prototype.slice.call(arguments, 0)
11
+ args.unshift('SEMVER')
12
+ console.log.apply(console, args)
13
+ }
14
+ } else {
15
+ debug = function () {}
16
+ }
16
17
 
17
18
  // Note: this is the semver.org version of the spec that it implements
18
19
  // Not necessarily the package version of this code.
19
- exports.SEMVER_SPEC_VERSION = '2.0.0';
20
+ exports.SEMVER_SPEC_VERSION = '2.0.0'
20
21
 
21
- var MAX_LENGTH = 256;
22
- var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
22
+ var MAX_LENGTH = 256
23
+ var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
24
+ /* istanbul ignore next */ 9007199254740991
23
25
 
24
26
  // Max safe segment length for coercion.
25
- var MAX_SAFE_COMPONENT_LENGTH = 16;
27
+ var MAX_SAFE_COMPONENT_LENGTH = 16
26
28
 
27
29
  // The actual regexps go on exports.re
28
- var re = exports.re = [];
29
- var src = exports.src = [];
30
- var R = 0;
30
+ var re = exports.re = []
31
+ var src = exports.src = []
32
+ var R = 0
31
33
 
32
34
  // The following Regular Expressions can be used for tokenizing,
33
35
  // validating, and parsing SemVer version strings.
@@ -35,71 +37,67 @@ var R = 0;
35
37
  // ## Numeric Identifier
36
38
  // A single `0`, or a non-zero digit followed by zero or more digits.
37
39
 
38
- var NUMERICIDENTIFIER = R++;
39
- src[NUMERICIDENTIFIER] = '0|[1-9]\\d*';
40
- var NUMERICIDENTIFIERLOOSE = R++;
41
- src[NUMERICIDENTIFIERLOOSE] = '[0-9]+';
42
-
40
+ var NUMERICIDENTIFIER = R++
41
+ src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'
42
+ var NUMERICIDENTIFIERLOOSE = R++
43
+ src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'
43
44
 
44
45
  // ## Non-numeric Identifier
45
46
  // Zero or more digits, followed by a letter or hyphen, and then zero or
46
47
  // more letters, digits, or hyphens.
47
48
 
48
- var NONNUMERICIDENTIFIER = R++;
49
- src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*';
50
-
49
+ var NONNUMERICIDENTIFIER = R++
50
+ src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'
51
51
 
52
52
  // ## Main Version
53
53
  // Three dot-separated numeric identifiers.
54
54
 
55
- var MAINVERSION = R++;
55
+ var MAINVERSION = R++
56
56
  src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' +
57
57
  '(' + src[NUMERICIDENTIFIER] + ')\\.' +
58
- '(' + src[NUMERICIDENTIFIER] + ')';
58
+ '(' + src[NUMERICIDENTIFIER] + ')'
59
59
 
60
- var MAINVERSIONLOOSE = R++;
60
+ var MAINVERSIONLOOSE = R++
61
61
  src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
62
62
  '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
63
- '(' + src[NUMERICIDENTIFIERLOOSE] + ')';
63
+ '(' + src[NUMERICIDENTIFIERLOOSE] + ')'
64
64
 
65
65
  // ## Pre-release Version Identifier
66
66
  // A numeric identifier, or a non-numeric identifier.
67
67
 
68
- var PRERELEASEIDENTIFIER = R++;
68
+ var PRERELEASEIDENTIFIER = R++
69
69
  src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +
70
- '|' + src[NONNUMERICIDENTIFIER] + ')';
70
+ '|' + src[NONNUMERICIDENTIFIER] + ')'
71
71
 
72
- var PRERELEASEIDENTIFIERLOOSE = R++;
72
+ var PRERELEASEIDENTIFIERLOOSE = R++
73
73
  src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +
74
- '|' + src[NONNUMERICIDENTIFIER] + ')';
75
-
74
+ '|' + src[NONNUMERICIDENTIFIER] + ')'
76
75
 
77
76
  // ## Pre-release Version
78
77
  // Hyphen, followed by one or more dot-separated pre-release version
79
78
  // identifiers.
80
79
 
81
- var PRERELEASE = R++;
80
+ var PRERELEASE = R++
82
81
  src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +
83
- '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))';
82
+ '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'
84
83
 
85
- var PRERELEASELOOSE = R++;
84
+ var PRERELEASELOOSE = R++
86
85
  src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +
87
- '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))';
86
+ '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'
88
87
 
89
88
  // ## Build Metadata Identifier
90
89
  // Any combination of digits, letters, or hyphens.
91
90
 
92
- var BUILDIDENTIFIER = R++;
93
- src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+';
91
+ var BUILDIDENTIFIER = R++
92
+ src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'
94
93
 
95
94
  // ## Build Metadata
96
95
  // Plus sign, followed by one or more period-separated build metadata
97
96
  // identifiers.
98
97
 
99
- var BUILD = R++;
98
+ var BUILD = R++
100
99
  src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] +
101
- '(?:\\.' + src[BUILDIDENTIFIER] + ')*))';
102
-
100
+ '(?:\\.' + src[BUILDIDENTIFIER] + ')*))'
103
101
 
104
102
  // ## Full Version String
105
103
  // A main version, followed optionally by a pre-release version and
@@ -110,802 +108,931 @@ src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] +
110
108
  // capturing group, because it should not ever be used in version
111
109
  // comparison.
112
110
 
113
- var FULL = R++;
111
+ var FULL = R++
114
112
  var FULLPLAIN = 'v?' + src[MAINVERSION] +
115
113
  src[PRERELEASE] + '?' +
116
- src[BUILD] + '?';
114
+ src[BUILD] + '?'
117
115
 
118
- src[FULL] = '^' + FULLPLAIN + '$';
116
+ src[FULL] = '^' + FULLPLAIN + '$'
119
117
 
120
118
  // like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
121
119
  // also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
122
120
  // common in the npm registry.
123
121
  var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] +
124
122
  src[PRERELEASELOOSE] + '?' +
125
- src[BUILD] + '?';
123
+ src[BUILD] + '?'
126
124
 
127
- var LOOSE = R++;
128
- src[LOOSE] = '^' + LOOSEPLAIN + '$';
125
+ var LOOSE = R++
126
+ src[LOOSE] = '^' + LOOSEPLAIN + '$'
129
127
 
130
- var GTLT = R++;
131
- src[GTLT] = '((?:<|>)?=?)';
128
+ var GTLT = R++
129
+ src[GTLT] = '((?:<|>)?=?)'
132
130
 
133
131
  // Something like "2.*" or "1.2.x".
134
132
  // Note that "x.x" is a valid xRange identifer, meaning "any version"
135
133
  // Only the first item is strictly required.
136
- var XRANGEIDENTIFIERLOOSE = R++;
137
- src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*';
138
- var XRANGEIDENTIFIER = R++;
139
- src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*';
134
+ var XRANGEIDENTIFIERLOOSE = R++
135
+ src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'
136
+ var XRANGEIDENTIFIER = R++
137
+ src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'
140
138
 
141
- var XRANGEPLAIN = R++;
139
+ var XRANGEPLAIN = R++
142
140
  src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' +
143
141
  '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
144
142
  '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
145
143
  '(?:' + src[PRERELEASE] + ')?' +
146
144
  src[BUILD] + '?' +
147
- ')?)?';
145
+ ')?)?'
148
146
 
149
- var XRANGEPLAINLOOSE = R++;
147
+ var XRANGEPLAINLOOSE = R++
150
148
  src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
151
149
  '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
152
150
  '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
153
151
  '(?:' + src[PRERELEASELOOSE] + ')?' +
154
152
  src[BUILD] + '?' +
155
- ')?)?';
153
+ ')?)?'
156
154
 
157
- var XRANGE = R++;
158
- src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$';
159
- var XRANGELOOSE = R++;
160
- src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$';
155
+ var XRANGE = R++
156
+ src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'
157
+ var XRANGELOOSE = R++
158
+ src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'
161
159
 
162
160
  // Coercion.
163
161
  // Extract anything that could conceivably be a part of a valid semver
164
- var COERCE = R++;
162
+ var COERCE = R++
165
163
  src[COERCE] = '(?:^|[^\\d])' +
166
164
  '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +
167
165
  '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
168
166
  '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
169
- '(?:$|[^\\d])';
167
+ '(?:$|[^\\d])'
170
168
 
171
169
  // Tilde ranges.
172
170
  // Meaning is "reasonably at or greater than"
173
- var LONETILDE = R++;
174
- src[LONETILDE] = '(?:~>?)';
171
+ var LONETILDE = R++
172
+ src[LONETILDE] = '(?:~>?)'
175
173
 
176
- var TILDETRIM = R++;
177
- src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+';
178
- re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g');
179
- var tildeTrimReplace = '$1~';
174
+ var TILDETRIM = R++
175
+ src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'
176
+ re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g')
177
+ var tildeTrimReplace = '$1~'
180
178
 
181
- var TILDE = R++;
182
- src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$';
183
- var TILDELOOSE = R++;
184
- src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$';
179
+ var TILDE = R++
180
+ src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'
181
+ var TILDELOOSE = R++
182
+ src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'
185
183
 
186
184
  // Caret ranges.
187
185
  // Meaning is "at least and backwards compatible with"
188
- var LONECARET = R++;
189
- src[LONECARET] = '(?:\\^)';
186
+ var LONECARET = R++
187
+ src[LONECARET] = '(?:\\^)'
190
188
 
191
- var CARETTRIM = R++;
192
- src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+';
193
- re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g');
194
- var caretTrimReplace = '$1^';
189
+ var CARETTRIM = R++
190
+ src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'
191
+ re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g')
192
+ var caretTrimReplace = '$1^'
195
193
 
196
- var CARET = R++;
197
- src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$';
198
- var CARETLOOSE = R++;
199
- src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$';
194
+ var CARET = R++
195
+ src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'
196
+ var CARETLOOSE = R++
197
+ src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'
200
198
 
201
199
  // 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 + ')$|^$';
206
-
200
+ var COMPARATORLOOSE = R++
201
+ src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'
202
+ var COMPARATOR = R++
203
+ src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'
207
204
 
208
205
  // An expression to strip any whitespace between the gtlt and the thing
209
206
  // it modifies, so that `> 1.2.3` ==> `>1.2.3`
210
- var COMPARATORTRIM = R++;
207
+ var COMPARATORTRIM = R++
211
208
  src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] +
212
- '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')';
209
+ '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'
213
210
 
214
211
  // this one has to use the /g flag
215
- re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g');
216
- var comparatorTrimReplace = '$1$2$3';
217
-
212
+ re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g')
213
+ var comparatorTrimReplace = '$1$2$3'
218
214
 
219
215
  // Something like `1.2.3 - 1.2.4`
220
216
  // Note that these all use the loose form, because they'll be
221
217
  // checked against either the strict or loose comparator form
222
218
  // later.
223
- var HYPHENRANGE = R++;
219
+ var HYPHENRANGE = R++
224
220
  src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' +
225
221
  '\\s+-\\s+' +
226
222
  '(' + src[XRANGEPLAIN] + ')' +
227
- '\\s*$';
223
+ '\\s*$'
228
224
 
229
- var HYPHENRANGELOOSE = R++;
225
+ var HYPHENRANGELOOSE = R++
230
226
  src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' +
231
227
  '\\s+-\\s+' +
232
228
  '(' + src[XRANGEPLAINLOOSE] + ')' +
233
- '\\s*$';
229
+ '\\s*$'
234
230
 
235
231
  // Star ranges basically just allow anything at all.
236
- var STAR = R++;
237
- src[STAR] = '(<|>)?=?\\s*\\*';
232
+ var STAR = R++
233
+ src[STAR] = '(<|>)?=?\\s*\\*'
238
234
 
239
235
  // Compile to actual regexp objects.
240
236
  // All are flag-free, unless they were created above with a flag.
241
237
  for (var i = 0; i < R; i++) {
242
- debug(i, src[i]);
243
- if (!re[i])
244
- re[i] = new RegExp(src[i]);
238
+ debug(i, src[i])
239
+ if (!re[i]) {
240
+ re[i] = new RegExp(src[i])
241
+ }
245
242
  }
246
243
 
247
- exports.parse = parse;
248
- function parse(version, options) {
249
- if (!options || typeof options !== 'object')
250
- options = { loose: !!options, includePrerelease: false }
244
+ exports.parse = parse
245
+ function parse (version, options) {
246
+ if (!options || typeof options !== 'object') {
247
+ options = {
248
+ loose: !!options,
249
+ includePrerelease: false
250
+ }
251
+ }
251
252
 
252
- if (version instanceof SemVer)
253
- return version;
253
+ if (version instanceof SemVer) {
254
+ return version
255
+ }
254
256
 
255
- if (typeof version !== 'string')
256
- return null;
257
+ if (typeof version !== 'string') {
258
+ return null
259
+ }
257
260
 
258
- if (version.length > MAX_LENGTH)
259
- return null;
261
+ if (version.length > MAX_LENGTH) {
262
+ return null
263
+ }
260
264
 
261
- var r = options.loose ? re[LOOSE] : re[FULL];
262
- if (!r.test(version))
263
- return null;
265
+ var r = options.loose ? re[LOOSE] : re[FULL]
266
+ if (!r.test(version)) {
267
+ return null
268
+ }
264
269
 
265
270
  try {
266
- return new SemVer(version, options);
271
+ return new SemVer(version, options)
267
272
  } catch (er) {
268
- return null;
273
+ return null
269
274
  }
270
275
  }
271
276
 
272
- exports.valid = valid;
273
- function valid(version, options) {
274
- var v = parse(version, options);
275
- return v ? v.version : null;
277
+ exports.valid = valid
278
+ function valid (version, options) {
279
+ var v = parse(version, options)
280
+ return v ? v.version : null
276
281
  }
277
282
 
278
-
279
- exports.clean = clean;
280
- function clean(version, options) {
281
- var s = parse(version.trim().replace(/^[=v]+/, ''), options);
282
- return s ? s.version : null;
283
+ exports.clean = clean
284
+ function clean (version, options) {
285
+ var s = parse(version.trim().replace(/^[=v]+/, ''), options)
286
+ return s ? s.version : null
283
287
  }
284
288
 
285
- exports.SemVer = SemVer;
289
+ exports.SemVer = SemVer
286
290
 
287
- function SemVer(version, options) {
288
- if (!options || typeof options !== 'object')
289
- options = { loose: !!options, includePrerelease: false }
291
+ function SemVer (version, options) {
292
+ if (!options || typeof options !== 'object') {
293
+ options = {
294
+ loose: !!options,
295
+ includePrerelease: false
296
+ }
297
+ }
290
298
  if (version instanceof SemVer) {
291
- if (version.loose === options.loose)
292
- return version;
293
- else
294
- version = version.version;
299
+ if (version.loose === options.loose) {
300
+ return version
301
+ } else {
302
+ version = version.version
303
+ }
295
304
  } else if (typeof version !== 'string') {
296
- throw new TypeError('Invalid Version: ' + version);
305
+ throw new TypeError('Invalid Version: ' + version)
297
306
  }
298
307
 
299
- if (version.length > MAX_LENGTH)
308
+ if (version.length > MAX_LENGTH) {
300
309
  throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')
310
+ }
301
311
 
302
- if (!(this instanceof SemVer))
303
- return new SemVer(version, options);
312
+ if (!(this instanceof SemVer)) {
313
+ return new SemVer(version, options)
314
+ }
304
315
 
305
- debug('SemVer', version, options);
306
- this.options = options;
307
- this.loose = !!options.loose;
316
+ debug('SemVer', version, options)
317
+ this.options = options
318
+ this.loose = !!options.loose
308
319
 
309
- var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL]);
320
+ var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL])
310
321
 
311
- if (!m)
312
- throw new TypeError('Invalid Version: ' + version);
322
+ if (!m) {
323
+ throw new TypeError('Invalid Version: ' + version)
324
+ }
313
325
 
314
- this.raw = version;
326
+ this.raw = version
315
327
 
316
328
  // these are actually numbers
317
- this.major = +m[1];
318
- this.minor = +m[2];
319
- this.patch = +m[3];
329
+ this.major = +m[1]
330
+ this.minor = +m[2]
331
+ this.patch = +m[3]
320
332
 
321
- if (this.major > MAX_SAFE_INTEGER || this.major < 0)
333
+ if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
322
334
  throw new TypeError('Invalid major version')
335
+ }
323
336
 
324
- if (this.minor > MAX_SAFE_INTEGER || this.minor < 0)
337
+ if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
325
338
  throw new TypeError('Invalid minor version')
339
+ }
326
340
 
327
- if (this.patch > MAX_SAFE_INTEGER || this.patch < 0)
341
+ if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
328
342
  throw new TypeError('Invalid patch version')
343
+ }
329
344
 
330
345
  // numberify any prerelease numeric ids
331
- if (!m[4])
332
- this.prerelease = [];
333
- else
334
- this.prerelease = m[4].split('.').map(function(id) {
346
+ if (!m[4]) {
347
+ this.prerelease = []
348
+ } else {
349
+ this.prerelease = m[4].split('.').map(function (id) {
335
350
  if (/^[0-9]+$/.test(id)) {
336
- var num = +id;
337
- if (num >= 0 && num < MAX_SAFE_INTEGER)
338
- return num;
351
+ var num = +id
352
+ if (num >= 0 && num < MAX_SAFE_INTEGER) {
353
+ return num
354
+ }
339
355
  }
340
- return id;
341
- });
356
+ return id
357
+ })
358
+ }
342
359
 
343
- this.build = m[5] ? m[5].split('.') : [];
344
- this.format();
360
+ this.build = m[5] ? m[5].split('.') : []
361
+ this.format()
345
362
  }
346
363
 
347
- SemVer.prototype.format = function() {
348
- this.version = this.major + '.' + this.minor + '.' + this.patch;
349
- if (this.prerelease.length)
350
- this.version += '-' + this.prerelease.join('.');
351
- return this.version;
352
- };
364
+ SemVer.prototype.format = function () {
365
+ this.version = this.major + '.' + this.minor + '.' + this.patch
366
+ if (this.prerelease.length) {
367
+ this.version += '-' + this.prerelease.join('.')
368
+ }
369
+ return this.version
370
+ }
353
371
 
354
- SemVer.prototype.toString = function() {
355
- return this.version;
356
- };
372
+ SemVer.prototype.toString = function () {
373
+ return this.version
374
+ }
357
375
 
358
- SemVer.prototype.compare = function(other) {
359
- debug('SemVer.compare', this.version, this.options, other);
360
- if (!(other instanceof SemVer))
361
- other = new SemVer(other, this.options);
376
+ SemVer.prototype.compare = function (other) {
377
+ debug('SemVer.compare', this.version, this.options, other)
378
+ if (!(other instanceof SemVer)) {
379
+ other = new SemVer(other, this.options)
380
+ }
362
381
 
363
- return this.compareMain(other) || this.comparePre(other);
364
- };
382
+ return this.compareMain(other) || this.comparePre(other)
383
+ }
365
384
 
366
- SemVer.prototype.compareMain = function(other) {
367
- if (!(other instanceof SemVer))
368
- other = new SemVer(other, this.options);
385
+ SemVer.prototype.compareMain = function (other) {
386
+ if (!(other instanceof SemVer)) {
387
+ other = new SemVer(other, this.options)
388
+ }
369
389
 
370
390
  return compareIdentifiers(this.major, other.major) ||
371
391
  compareIdentifiers(this.minor, other.minor) ||
372
- compareIdentifiers(this.patch, other.patch);
373
- };
392
+ compareIdentifiers(this.patch, other.patch)
393
+ }
374
394
 
375
- SemVer.prototype.comparePre = function(other) {
376
- if (!(other instanceof SemVer))
377
- other = new SemVer(other, this.options);
395
+ SemVer.prototype.comparePre = function (other) {
396
+ if (!(other instanceof SemVer)) {
397
+ other = new SemVer(other, this.options)
398
+ }
378
399
 
379
400
  // NOT having a prerelease is > having one
380
- if (this.prerelease.length && !other.prerelease.length)
381
- return -1;
382
- else if (!this.prerelease.length && other.prerelease.length)
383
- return 1;
384
- else if (!this.prerelease.length && !other.prerelease.length)
385
- return 0;
386
-
387
- var i = 0;
401
+ if (this.prerelease.length && !other.prerelease.length) {
402
+ return -1
403
+ } else if (!this.prerelease.length && other.prerelease.length) {
404
+ return 1
405
+ } else if (!this.prerelease.length && !other.prerelease.length) {
406
+ return 0
407
+ }
408
+
409
+ var i = 0
410
+ do {
411
+ var a = this.prerelease[i]
412
+ var b = other.prerelease[i]
413
+ debug('prerelease compare', i, a, b)
414
+ if (a === undefined && b === undefined) {
415
+ return 0
416
+ } else if (b === undefined) {
417
+ return 1
418
+ } else if (a === undefined) {
419
+ return -1
420
+ } else if (a === b) {
421
+ continue
422
+ } else {
423
+ return compareIdentifiers(a, b)
424
+ }
425
+ } while (++i)
426
+ }
427
+
428
+ SemVer.prototype.compareBuild = function (other) {
429
+ if (!(other instanceof SemVer)) {
430
+ other = new SemVer(other, this.options)
431
+ }
432
+
433
+ var i = 0
388
434
  do {
389
- var a = this.prerelease[i];
390
- var b = other.prerelease[i];
391
- debug('prerelease compare', i, a, b);
392
- if (a === undefined && b === undefined)
393
- return 0;
394
- else if (b === undefined)
395
- return 1;
396
- else if (a === undefined)
397
- return -1;
398
- else if (a === b)
399
- continue;
400
- else
401
- return compareIdentifiers(a, b);
402
- } while (++i);
403
- };
435
+ var a = this.build[i]
436
+ var b = other.build[i]
437
+ debug('prerelease compare', i, a, b)
438
+ if (a === undefined && b === undefined) {
439
+ return 0
440
+ } else if (b === undefined) {
441
+ return 1
442
+ } else if (a === undefined) {
443
+ return -1
444
+ } else if (a === b) {
445
+ continue
446
+ } else {
447
+ return compareIdentifiers(a, b)
448
+ }
449
+ } while (++i)
450
+ }
404
451
 
405
452
  // preminor will bump the version up to the next minor release, and immediately
406
453
  // down to pre-release. premajor and prepatch work the same way.
407
- SemVer.prototype.inc = function(release, identifier) {
454
+ SemVer.prototype.inc = function (release, identifier) {
408
455
  switch (release) {
409
456
  case 'premajor':
410
- this.prerelease.length = 0;
411
- this.patch = 0;
412
- this.minor = 0;
413
- this.major++;
414
- this.inc('pre', identifier);
415
- break;
457
+ this.prerelease.length = 0
458
+ this.patch = 0
459
+ this.minor = 0
460
+ this.major++
461
+ this.inc('pre', identifier)
462
+ break
416
463
  case 'preminor':
417
- this.prerelease.length = 0;
418
- this.patch = 0;
419
- this.minor++;
420
- this.inc('pre', identifier);
421
- break;
464
+ this.prerelease.length = 0
465
+ this.patch = 0
466
+ this.minor++
467
+ this.inc('pre', identifier)
468
+ break
422
469
  case 'prepatch':
423
470
  // If this is already a prerelease, it will bump to the next version
424
471
  // drop any prereleases that might already exist, since they are not
425
472
  // relevant at this point.
426
- this.prerelease.length = 0;
427
- this.inc('patch', identifier);
428
- this.inc('pre', identifier);
429
- break;
473
+ this.prerelease.length = 0
474
+ this.inc('patch', identifier)
475
+ this.inc('pre', identifier)
476
+ break
430
477
  // If the input is a non-prerelease version, this acts the same as
431
478
  // prepatch.
432
479
  case 'prerelease':
433
- if (this.prerelease.length === 0)
434
- this.inc('patch', identifier);
435
- this.inc('pre', identifier);
436
- break;
480
+ if (this.prerelease.length === 0) {
481
+ this.inc('patch', identifier)
482
+ }
483
+ this.inc('pre', identifier)
484
+ break
437
485
 
438
486
  case 'major':
439
487
  // If this is a pre-major version, bump up to the same major version.
440
488
  // Otherwise increment major.
441
489
  // 1.0.0-5 bumps to 1.0.0
442
490
  // 1.1.0 bumps to 2.0.0
443
- if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0)
444
- this.major++;
445
- this.minor = 0;
446
- this.patch = 0;
447
- this.prerelease = [];
448
- break;
491
+ if (this.minor !== 0 ||
492
+ this.patch !== 0 ||
493
+ this.prerelease.length === 0) {
494
+ this.major++
495
+ }
496
+ this.minor = 0
497
+ this.patch = 0
498
+ this.prerelease = []
499
+ break
449
500
  case 'minor':
450
501
  // If this is a pre-minor version, bump up to the same minor version.
451
502
  // Otherwise increment minor.
452
503
  // 1.2.0-5 bumps to 1.2.0
453
504
  // 1.2.1 bumps to 1.3.0
454
- if (this.patch !== 0 || this.prerelease.length === 0)
455
- this.minor++;
456
- this.patch = 0;
457
- this.prerelease = [];
458
- break;
505
+ if (this.patch !== 0 || this.prerelease.length === 0) {
506
+ this.minor++
507
+ }
508
+ this.patch = 0
509
+ this.prerelease = []
510
+ break
459
511
  case 'patch':
460
512
  // If this is not a pre-release version, it will increment the patch.
461
513
  // If it is a pre-release it will bump up to the same patch version.
462
514
  // 1.2.0-5 patches to 1.2.0
463
515
  // 1.2.0 patches to 1.2.1
464
- if (this.prerelease.length === 0)
465
- this.patch++;
466
- this.prerelease = [];
467
- break;
516
+ if (this.prerelease.length === 0) {
517
+ this.patch++
518
+ }
519
+ this.prerelease = []
520
+ break
468
521
  // This probably shouldn't be used publicly.
469
522
  // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
470
523
  case 'pre':
471
- if (this.prerelease.length === 0)
472
- this.prerelease = [0];
473
- else {
474
- var i = this.prerelease.length;
524
+ if (this.prerelease.length === 0) {
525
+ this.prerelease = [0]
526
+ } else {
527
+ var i = this.prerelease.length
475
528
  while (--i >= 0) {
476
529
  if (typeof this.prerelease[i] === 'number') {
477
- this.prerelease[i]++;
478
- i = -2;
530
+ this.prerelease[i]++
531
+ i = -2
479
532
  }
480
533
  }
481
- if (i === -1) // didn't increment anything
482
- this.prerelease.push(0);
534
+ if (i === -1) {
535
+ // didn't increment anything
536
+ this.prerelease.push(0)
537
+ }
483
538
  }
484
539
  if (identifier) {
485
540
  // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
486
541
  // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
487
542
  if (this.prerelease[0] === identifier) {
488
- if (isNaN(this.prerelease[1]))
489
- this.prerelease = [identifier, 0];
490
- } else
491
- this.prerelease = [identifier, 0];
543
+ if (isNaN(this.prerelease[1])) {
544
+ this.prerelease = [identifier, 0]
545
+ }
546
+ } else {
547
+ this.prerelease = [identifier, 0]
548
+ }
492
549
  }
493
- break;
550
+ break
494
551
 
495
552
  default:
496
- throw new Error('invalid increment argument: ' + release);
553
+ throw new Error('invalid increment argument: ' + release)
497
554
  }
498
- this.format();
499
- this.raw = this.version;
500
- return this;
501
- };
555
+ this.format()
556
+ this.raw = this.version
557
+ return this
558
+ }
502
559
 
503
- exports.inc = inc;
504
- function inc(version, release, loose, identifier) {
505
- if (typeof(loose) === 'string') {
506
- identifier = loose;
507
- loose = undefined;
560
+ exports.inc = inc
561
+ function inc (version, release, loose, identifier) {
562
+ if (typeof (loose) === 'string') {
563
+ identifier = loose
564
+ loose = undefined
508
565
  }
509
566
 
510
567
  try {
511
- return new SemVer(version, loose).inc(release, identifier).version;
568
+ return new SemVer(version, loose).inc(release, identifier).version
512
569
  } catch (er) {
513
- return null;
570
+ return null
514
571
  }
515
572
  }
516
573
 
517
- exports.diff = diff;
518
- function diff(version1, version2) {
574
+ exports.diff = diff
575
+ function diff (version1, version2) {
519
576
  if (eq(version1, version2)) {
520
- return null;
577
+ return null
521
578
  } else {
522
- var v1 = parse(version1);
523
- var v2 = parse(version2);
579
+ var v1 = parse(version1)
580
+ var v2 = parse(version2)
581
+ var prefix = ''
524
582
  if (v1.prerelease.length || v2.prerelease.length) {
525
- for (var key in v1) {
526
- if (key === 'major' || key === 'minor' || key === 'patch') {
527
- if (v1[key] !== v2[key]) {
528
- return 'pre'+key;
529
- }
530
- }
531
- }
532
- return 'prerelease';
583
+ prefix = 'pre'
584
+ var defaultResult = 'prerelease'
533
585
  }
534
586
  for (var key in v1) {
535
587
  if (key === 'major' || key === 'minor' || key === 'patch') {
536
588
  if (v1[key] !== v2[key]) {
537
- return key;
589
+ return prefix + key
538
590
  }
539
591
  }
540
592
  }
593
+ return defaultResult // may be undefined
541
594
  }
542
595
  }
543
596
 
544
- exports.compareIdentifiers = compareIdentifiers;
597
+ exports.compareIdentifiers = compareIdentifiers
545
598
 
546
- var numeric = /^[0-9]+$/;
547
- function compareIdentifiers(a, b) {
548
- var anum = numeric.test(a);
549
- var bnum = numeric.test(b);
599
+ var numeric = /^[0-9]+$/
600
+ function compareIdentifiers (a, b) {
601
+ var anum = numeric.test(a)
602
+ var bnum = numeric.test(b)
550
603
 
551
604
  if (anum && bnum) {
552
- a = +a;
553
- b = +b;
605
+ a = +a
606
+ b = +b
554
607
  }
555
608
 
556
- return (anum && !bnum) ? -1 :
557
- (bnum && !anum) ? 1 :
558
- a < b ? -1 :
559
- a > b ? 1 :
560
- 0;
609
+ return a === b ? 0
610
+ : (anum && !bnum) ? -1
611
+ : (bnum && !anum) ? 1
612
+ : a < b ? -1
613
+ : 1
561
614
  }
562
615
 
563
- exports.rcompareIdentifiers = rcompareIdentifiers;
564
- function rcompareIdentifiers(a, b) {
565
- return compareIdentifiers(b, a);
616
+ exports.rcompareIdentifiers = rcompareIdentifiers
617
+ function rcompareIdentifiers (a, b) {
618
+ return compareIdentifiers(b, a)
566
619
  }
567
620
 
568
- exports.major = major;
569
- function major(a, loose) {
570
- return new SemVer(a, loose).major;
621
+ exports.major = major
622
+ function major (a, loose) {
623
+ return new SemVer(a, loose).major
571
624
  }
572
625
 
573
- exports.minor = minor;
574
- function minor(a, loose) {
575
- return new SemVer(a, loose).minor;
626
+ exports.minor = minor
627
+ function minor (a, loose) {
628
+ return new SemVer(a, loose).minor
576
629
  }
577
630
 
578
- exports.patch = patch;
579
- function patch(a, loose) {
580
- return new SemVer(a, loose).patch;
631
+ exports.patch = patch
632
+ function patch (a, loose) {
633
+ return new SemVer(a, loose).patch
581
634
  }
582
635
 
583
- exports.compare = compare;
584
- function compare(a, b, loose) {
585
- return new SemVer(a, loose).compare(new SemVer(b, loose));
636
+ exports.compare = compare
637
+ function compare (a, b, loose) {
638
+ return new SemVer(a, loose).compare(new SemVer(b, loose))
586
639
  }
587
640
 
588
- exports.compareLoose = compareLoose;
589
- function compareLoose(a, b) {
590
- return compare(a, b, true);
641
+ exports.compareLoose = compareLoose
642
+ function compareLoose (a, b) {
643
+ return compare(a, b, true)
591
644
  }
592
645
 
593
- exports.rcompare = rcompare;
594
- function rcompare(a, b, loose) {
595
- return compare(b, a, loose);
646
+ exports.compareBuild = compareBuild
647
+ function compareBuild (a, b, loose) {
648
+ var versionA = new SemVer(a, loose)
649
+ var versionB = new SemVer(b, loose)
650
+ return versionA.compare(versionB) || versionA.compareBuild(versionB)
596
651
  }
597
652
 
598
- exports.sort = sort;
599
- function sort(list, loose) {
600
- return list.sort(function(a, b) {
601
- return exports.compare(a, b, loose);
602
- });
653
+ exports.rcompare = rcompare
654
+ function rcompare (a, b, loose) {
655
+ return compare(b, a, loose)
603
656
  }
604
657
 
605
- exports.rsort = rsort;
606
- function rsort(list, loose) {
607
- return list.sort(function(a, b) {
608
- return exports.rcompare(a, b, loose);
609
- });
658
+ exports.sort = sort
659
+ function sort (list, loose) {
660
+ return list.sort(function (a, b) {
661
+ return exports.compareBuild(a, b, loose)
662
+ })
663
+ }
664
+
665
+ exports.rsort = rsort
666
+ function rsort (list, loose) {
667
+ return list.sort(function (a, b) {
668
+ return exports.compareBuild(b, a, loose)
669
+ })
610
670
  }
611
671
 
612
- exports.gt = gt;
613
- function gt(a, b, loose) {
614
- return compare(a, b, loose) > 0;
672
+ exports.gt = gt
673
+ function gt (a, b, loose) {
674
+ return compare(a, b, loose) > 0
615
675
  }
616
676
 
617
- exports.lt = lt;
618
- function lt(a, b, loose) {
619
- return compare(a, b, loose) < 0;
677
+ exports.lt = lt
678
+ function lt (a, b, loose) {
679
+ return compare(a, b, loose) < 0
620
680
  }
621
681
 
622
- exports.eq = eq;
623
- function eq(a, b, loose) {
624
- return compare(a, b, loose) === 0;
682
+ exports.eq = eq
683
+ function eq (a, b, loose) {
684
+ return compare(a, b, loose) === 0
625
685
  }
626
686
 
627
- exports.neq = neq;
628
- function neq(a, b, loose) {
629
- return compare(a, b, loose) !== 0;
687
+ exports.neq = neq
688
+ function neq (a, b, loose) {
689
+ return compare(a, b, loose) !== 0
630
690
  }
631
691
 
632
- exports.gte = gte;
633
- function gte(a, b, loose) {
634
- return compare(a, b, loose) >= 0;
692
+ exports.gte = gte
693
+ function gte (a, b, loose) {
694
+ return compare(a, b, loose) >= 0
635
695
  }
636
696
 
637
- exports.lte = lte;
638
- function lte(a, b, loose) {
639
- return compare(a, b, loose) <= 0;
697
+ exports.lte = lte
698
+ function lte (a, b, loose) {
699
+ return compare(a, b, loose) <= 0
640
700
  }
641
701
 
642
- exports.cmp = cmp;
643
- function cmp(a, op, b, loose) {
644
- var ret;
702
+ exports.cmp = cmp
703
+ function cmp (a, op, b, loose) {
645
704
  switch (op) {
646
705
  case '===':
647
- if (typeof a === 'object') a = a.version;
648
- if (typeof b === 'object') b = b.version;
649
- ret = a === b;
650
- break;
706
+ if (typeof a === 'object')
707
+ a = a.version
708
+ if (typeof b === 'object')
709
+ b = b.version
710
+ return a === b
711
+
651
712
  case '!==':
652
- if (typeof a === 'object') a = a.version;
653
- if (typeof b === 'object') b = b.version;
654
- ret = a !== b;
655
- break;
656
- case '': case '=': case '==': ret = eq(a, b, loose); break;
657
- case '!=': ret = neq(a, b, loose); break;
658
- case '>': ret = gt(a, b, loose); break;
659
- case '>=': ret = gte(a, b, loose); break;
660
- case '<': ret = lt(a, b, loose); break;
661
- case '<=': ret = lte(a, b, loose); break;
662
- default: throw new TypeError('Invalid operator: ' + op);
663
- }
664
- return ret;
665
- }
666
-
667
- exports.Comparator = Comparator;
668
- function Comparator(comp, options) {
669
- if (!options || typeof options !== 'object')
670
- options = { loose: !!options, includePrerelease: false }
713
+ if (typeof a === 'object')
714
+ a = a.version
715
+ if (typeof b === 'object')
716
+ b = b.version
717
+ return a !== b
718
+
719
+ case '':
720
+ case '=':
721
+ case '==':
722
+ return eq(a, b, loose)
723
+
724
+ case '!=':
725
+ return neq(a, b, loose)
726
+
727
+ case '>':
728
+ return gt(a, b, loose)
729
+
730
+ case '>=':
731
+ return gte(a, b, loose)
732
+
733
+ case '<':
734
+ return lt(a, b, loose)
735
+
736
+ case '<=':
737
+ return lte(a, b, loose)
738
+
739
+ default:
740
+ throw new TypeError('Invalid operator: ' + op)
741
+ }
742
+ }
743
+
744
+ exports.Comparator = Comparator
745
+ function Comparator (comp, options) {
746
+ if (!options || typeof options !== 'object') {
747
+ options = {
748
+ loose: !!options,
749
+ includePrerelease: false
750
+ }
751
+ }
671
752
 
672
753
  if (comp instanceof Comparator) {
673
- if (comp.loose === !!options.loose)
674
- return comp;
675
- else
676
- comp = comp.value;
754
+ if (comp.loose === !!options.loose) {
755
+ return comp
756
+ } else {
757
+ comp = comp.value
758
+ }
677
759
  }
678
760
 
679
- if (!(this instanceof Comparator))
680
- return new Comparator(comp, options);
761
+ if (!(this instanceof Comparator)) {
762
+ return new Comparator(comp, options)
763
+ }
681
764
 
682
- debug('comparator', comp, options);
683
- this.options = options;
684
- this.loose = !!options.loose;
685
- this.parse(comp);
765
+ debug('comparator', comp, options)
766
+ this.options = options
767
+ this.loose = !!options.loose
768
+ this.parse(comp)
686
769
 
687
- if (this.semver === ANY)
688
- this.value = '';
689
- else
690
- this.value = this.operator + this.semver.version;
770
+ if (this.semver === ANY) {
771
+ this.value = ''
772
+ } else {
773
+ this.value = this.operator + this.semver.version
774
+ }
691
775
 
692
- debug('comp', this);
776
+ debug('comp', this)
693
777
  }
694
778
 
695
- var ANY = {};
696
- Comparator.prototype.parse = function(comp) {
697
- var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
698
- var m = comp.match(r);
779
+ var ANY = {}
780
+ Comparator.prototype.parse = function (comp) {
781
+ var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]
782
+ var m = comp.match(r)
699
783
 
700
- if (!m)
701
- throw new TypeError('Invalid comparator: ' + comp);
784
+ if (!m) {
785
+ throw new TypeError('Invalid comparator: ' + comp)
786
+ }
702
787
 
703
- this.operator = m[1];
704
- if (this.operator === '=')
705
- this.operator = '';
788
+ this.operator = m[1] !== undefined ? m[1] : ''
789
+ if (this.operator === '=') {
790
+ this.operator = ''
791
+ }
706
792
 
707
793
  // if it literally is just '>' or '' then allow anything.
708
- if (!m[2])
709
- this.semver = ANY;
710
- else
711
- this.semver = new SemVer(m[2], this.options.loose);
712
- };
794
+ if (!m[2]) {
795
+ this.semver = ANY
796
+ } else {
797
+ this.semver = new SemVer(m[2], this.options.loose)
798
+ }
799
+ }
713
800
 
714
- Comparator.prototype.toString = function() {
715
- return this.value;
716
- };
801
+ Comparator.prototype.toString = function () {
802
+ return this.value
803
+ }
717
804
 
718
- Comparator.prototype.test = function(version) {
719
- debug('Comparator.test', version, this.options.loose);
805
+ Comparator.prototype.test = function (version) {
806
+ debug('Comparator.test', version, this.options.loose)
720
807
 
721
- if (this.semver === ANY)
722
- return true;
808
+ if (this.semver === ANY || version === ANY) {
809
+ return true
810
+ }
723
811
 
724
- if (typeof version === 'string')
725
- version = new SemVer(version, this.options);
812
+ if (typeof version === 'string') {
813
+ version = new SemVer(version, this.options)
814
+ }
726
815
 
727
- return cmp(version, this.operator, this.semver, this.options);
728
- };
816
+ return cmp(version, this.operator, this.semver, this.options)
817
+ }
729
818
 
730
- Comparator.prototype.intersects = function(comp, options) {
819
+ Comparator.prototype.intersects = function (comp, options) {
731
820
  if (!(comp instanceof Comparator)) {
732
- throw new TypeError('a Comparator is required');
821
+ throw new TypeError('a Comparator is required')
733
822
  }
734
823
 
735
- if (!options || typeof options !== 'object')
736
- options = { loose: !!options, includePrerelease: false }
824
+ if (!options || typeof options !== 'object') {
825
+ options = {
826
+ loose: !!options,
827
+ includePrerelease: false
828
+ }
829
+ }
737
830
 
738
- var rangeTmp;
831
+ var rangeTmp
739
832
 
740
833
  if (this.operator === '') {
741
- rangeTmp = new Range(comp.value, options);
742
- return satisfies(this.value, rangeTmp, options);
834
+ if (this.value === '') {
835
+ return true
836
+ }
837
+ rangeTmp = new Range(comp.value, options)
838
+ return satisfies(this.value, rangeTmp, options)
743
839
  } else if (comp.operator === '') {
744
- rangeTmp = new Range(this.value, options);
745
- return satisfies(comp.semver, rangeTmp, options);
840
+ if (comp.value === '') {
841
+ return true
842
+ }
843
+ rangeTmp = new Range(this.value, options)
844
+ return satisfies(comp.semver, rangeTmp, options)
746
845
  }
747
846
 
748
847
  var sameDirectionIncreasing =
749
848
  (this.operator === '>=' || this.operator === '>') &&
750
- (comp.operator === '>=' || comp.operator === '>');
849
+ (comp.operator === '>=' || comp.operator === '>')
751
850
  var sameDirectionDecreasing =
752
851
  (this.operator === '<=' || this.operator === '<') &&
753
- (comp.operator === '<=' || comp.operator === '<');
754
- var sameSemVer = this.semver.version === comp.semver.version;
852
+ (comp.operator === '<=' || comp.operator === '<')
853
+ var sameSemVer = this.semver.version === comp.semver.version
755
854
  var differentDirectionsInclusive =
756
855
  (this.operator === '>=' || this.operator === '<=') &&
757
- (comp.operator === '>=' || comp.operator === '<=');
856
+ (comp.operator === '>=' || comp.operator === '<=')
758
857
  var oppositeDirectionsLessThan =
759
858
  cmp(this.semver, '<', comp.semver, options) &&
760
859
  ((this.operator === '>=' || this.operator === '>') &&
761
- (comp.operator === '<=' || comp.operator === '<'));
860
+ (comp.operator === '<=' || comp.operator === '<'))
762
861
  var oppositeDirectionsGreaterThan =
763
862
  cmp(this.semver, '>', comp.semver, options) &&
764
863
  ((this.operator === '<=' || this.operator === '<') &&
765
- (comp.operator === '>=' || comp.operator === '>'));
864
+ (comp.operator === '>=' || comp.operator === '>'))
766
865
 
767
866
  return sameDirectionIncreasing || sameDirectionDecreasing ||
768
867
  (sameSemVer && differentDirectionsInclusive) ||
769
- oppositeDirectionsLessThan || oppositeDirectionsGreaterThan;
770
- };
771
-
868
+ oppositeDirectionsLessThan || oppositeDirectionsGreaterThan
869
+ }
772
870
 
773
- exports.Range = Range;
774
- function Range(range, options) {
775
- if (!options || typeof options !== 'object')
776
- options = { loose: !!options, includePrerelease: false }
871
+ exports.Range = Range
872
+ function Range (range, options) {
873
+ if (!options || typeof options !== 'object') {
874
+ options = {
875
+ loose: !!options,
876
+ includePrerelease: false
877
+ }
878
+ }
777
879
 
778
880
  if (range instanceof Range) {
779
881
  if (range.loose === !!options.loose &&
780
882
  range.includePrerelease === !!options.includePrerelease) {
781
- return range;
883
+ return range
782
884
  } else {
783
- return new Range(range.raw, options);
885
+ return new Range(range.raw, options)
784
886
  }
785
887
  }
786
888
 
787
889
  if (range instanceof Comparator) {
788
- return new Range(range.value, options);
890
+ return new Range(range.value, options)
789
891
  }
790
892
 
791
- if (!(this instanceof Range))
792
- return new Range(range, options);
893
+ if (!(this instanceof Range)) {
894
+ return new Range(range, options)
895
+ }
793
896
 
794
- this.options = options;
795
- this.loose = !!options.loose;
897
+ this.options = options
898
+ this.loose = !!options.loose
796
899
  this.includePrerelease = !!options.includePrerelease
797
900
 
798
901
  // First, split based on boolean or ||
799
- this.raw = range;
800
- this.set = range.split(/\s*\|\|\s*/).map(function(range) {
801
- return this.parseRange(range.trim());
802
- }, this).filter(function(c) {
902
+ this.raw = range
903
+ this.set = range.split(/\s*\|\|\s*/).map(function (range) {
904
+ return this.parseRange(range.trim())
905
+ }, this).filter(function (c) {
803
906
  // throw out any that are not relevant for whatever reason
804
- return c.length;
805
- });
907
+ return c.length
908
+ })
806
909
 
807
910
  if (!this.set.length) {
808
- throw new TypeError('Invalid SemVer Range: ' + range);
911
+ throw new TypeError('Invalid SemVer Range: ' + range)
809
912
  }
810
913
 
811
- this.format();
914
+ this.format()
812
915
  }
813
916
 
814
- Range.prototype.format = function() {
815
- this.range = this.set.map(function(comps) {
816
- return comps.join(' ').trim();
817
- }).join('||').trim();
818
- return this.range;
819
- };
917
+ Range.prototype.format = function () {
918
+ this.range = this.set.map(function (comps) {
919
+ return comps.join(' ').trim()
920
+ }).join('||').trim()
921
+ return this.range
922
+ }
820
923
 
821
- Range.prototype.toString = function() {
822
- return this.range;
823
- };
924
+ Range.prototype.toString = function () {
925
+ return this.range
926
+ }
824
927
 
825
- Range.prototype.parseRange = function(range) {
826
- var loose = this.options.loose;
827
- range = range.trim();
928
+ Range.prototype.parseRange = function (range) {
929
+ var loose = this.options.loose
930
+ range = range.trim()
828
931
  // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
829
- var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE];
830
- range = range.replace(hr, hyphenReplace);
831
- debug('hyphen replace', range);
932
+ var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]
933
+ range = range.replace(hr, hyphenReplace)
934
+ debug('hyphen replace', range)
832
935
  // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
833
- range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace);
834
- debug('comparator trim', range, re[COMPARATORTRIM]);
936
+ range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace)
937
+ debug('comparator trim', range, re[COMPARATORTRIM])
835
938
 
836
939
  // `~ 1.2.3` => `~1.2.3`
837
- range = range.replace(re[TILDETRIM], tildeTrimReplace);
940
+ range = range.replace(re[TILDETRIM], tildeTrimReplace)
838
941
 
839
942
  // `^ 1.2.3` => `^1.2.3`
840
- range = range.replace(re[CARETTRIM], caretTrimReplace);
943
+ range = range.replace(re[CARETTRIM], caretTrimReplace)
841
944
 
842
945
  // normalize spaces
843
- range = range.split(/\s+/).join(' ');
946
+ range = range.split(/\s+/).join(' ')
844
947
 
845
948
  // At this point, the range is completely trimmed and
846
949
  // ready to be split into comparators.
847
950
 
848
- var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
849
- var set = range.split(' ').map(function(comp) {
850
- return parseComparator(comp, this.options);
851
- }, this).join(' ').split(/\s+/);
951
+ var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]
952
+ var set = range.split(' ').map(function (comp) {
953
+ return parseComparator(comp, this.options)
954
+ }, this).join(' ').split(/\s+/)
852
955
  if (this.options.loose) {
853
956
  // in loose mode, throw out any that are not valid comparators
854
- set = set.filter(function(comp) {
855
- return !!comp.match(compRe);
856
- });
957
+ set = set.filter(function (comp) {
958
+ return !!comp.match(compRe)
959
+ })
857
960
  }
858
- set = set.map(function(comp) {
859
- return new Comparator(comp, this.options);
860
- }, this);
961
+ set = set.map(function (comp) {
962
+ return new Comparator(comp, this.options)
963
+ }, this)
861
964
 
862
- return set;
863
- };
965
+ return set
966
+ }
864
967
 
865
- Range.prototype.intersects = function(range, options) {
968
+ Range.prototype.intersects = function (range, options) {
866
969
  if (!(range instanceof Range)) {
867
- throw new TypeError('a Range is required');
970
+ throw new TypeError('a Range is required')
971
+ }
972
+
973
+ return this.set.some(function (thisComparators) {
974
+ return (
975
+ isSatisfiable(thisComparators, options) &&
976
+ range.set.some(function (rangeComparators) {
977
+ return (
978
+ isSatisfiable(rangeComparators, options) &&
979
+ thisComparators.every(function (thisComparator) {
980
+ return rangeComparators.every(function (rangeComparator) {
981
+ return thisComparator.intersects(rangeComparator, options)
982
+ })
983
+ })
984
+ )
985
+ })
986
+ )
987
+ })
988
+ }
989
+
990
+ // take a set of comparators and determine whether there
991
+ // exists a version which can satisfy it
992
+ function isSatisfiable (comparators, options) {
993
+ var result = true
994
+ var remainingComparators = comparators.slice()
995
+ var testComparator = remainingComparators.pop()
996
+
997
+ while (result && remainingComparators.length) {
998
+ result = remainingComparators.every(function (otherComparator) {
999
+ return testComparator.intersects(otherComparator, options)
1000
+ })
1001
+
1002
+ testComparator = remainingComparators.pop()
868
1003
  }
869
1004
 
870
- return this.set.some(function(thisComparators) {
871
- return thisComparators.every(function(thisComparator) {
872
- return range.set.some(function(rangeComparators) {
873
- return rangeComparators.every(function(rangeComparator) {
874
- return thisComparator.intersects(rangeComparator, options);
875
- });
876
- });
877
- });
878
- });
879
- };
1005
+ return result
1006
+ }
880
1007
 
881
1008
  // Mostly just for testing and legacy API reasons
882
- exports.toComparators = toComparators;
883
- function toComparators(range, options) {
884
- return new Range(range, options).set.map(function(comp) {
885
- return comp.map(function(c) {
886
- return c.value;
887
- }).join(' ').trim().split(' ');
888
- });
1009
+ exports.toComparators = toComparators
1010
+ function toComparators (range, options) {
1011
+ return new Range(range, options).set.map(function (comp) {
1012
+ return comp.map(function (c) {
1013
+ return c.value
1014
+ }).join(' ').trim().split(' ')
1015
+ })
889
1016
  }
890
1017
 
891
1018
  // comprised of xranges, tildes, stars, and gtlt's at this point.
892
1019
  // already replaced the hyphen ranges
893
1020
  // turn into a set of JUST comparators.
894
- function parseComparator(comp, options) {
895
- debug('comp', comp, options);
896
- comp = replaceCarets(comp, options);
897
- debug('caret', comp);
898
- comp = replaceTildes(comp, options);
899
- debug('tildes', comp);
900
- comp = replaceXRanges(comp, options);
901
- debug('xrange', comp);
902
- comp = replaceStars(comp, options);
903
- debug('stars', comp);
904
- return comp;
1021
+ function parseComparator (comp, options) {
1022
+ debug('comp', comp, options)
1023
+ comp = replaceCarets(comp, options)
1024
+ debug('caret', comp)
1025
+ comp = replaceTildes(comp, options)
1026
+ debug('tildes', comp)
1027
+ comp = replaceXRanges(comp, options)
1028
+ debug('xrange', comp)
1029
+ comp = replaceStars(comp, options)
1030
+ debug('stars', comp)
1031
+ return comp
905
1032
  }
906
1033
 
907
- function isX(id) {
908
- return !id || id.toLowerCase() === 'x' || id === '*';
1034
+ function isX (id) {
1035
+ return !id || id.toLowerCase() === 'x' || id === '*'
909
1036
  }
910
1037
 
911
1038
  // ~, ~> --> * (any, kinda silly)
@@ -914,41 +1041,38 @@ function isX(id) {
914
1041
  // ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
915
1042
  // ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
916
1043
  // ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
917
- function replaceTildes(comp, options) {
918
- return comp.trim().split(/\s+/).map(function(comp) {
919
- return replaceTilde(comp, options);
920
- }).join(' ');
921
- }
922
-
923
- function replaceTilde(comp, options) {
924
- if (!options || typeof options !== 'object')
925
- options = { loose: !!options, includePrerelease: false }
926
- var r = options.loose ? re[TILDELOOSE] : re[TILDE];
927
- return comp.replace(r, function(_, M, m, p, pr) {
928
- debug('tilde', comp, _, M, m, p, pr);
929
- var ret;
930
-
931
- if (isX(M))
932
- ret = '';
933
- else if (isX(m))
934
- ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
935
- else if (isX(p))
1044
+ function replaceTildes (comp, options) {
1045
+ return comp.trim().split(/\s+/).map(function (comp) {
1046
+ return replaceTilde(comp, options)
1047
+ }).join(' ')
1048
+ }
1049
+
1050
+ function replaceTilde (comp, options) {
1051
+ var r = options.loose ? re[TILDELOOSE] : re[TILDE]
1052
+ return comp.replace(r, function (_, M, m, p, pr) {
1053
+ debug('tilde', comp, _, M, m, p, pr)
1054
+ var ret
1055
+
1056
+ if (isX(M)) {
1057
+ ret = ''
1058
+ } else if (isX(m)) {
1059
+ ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
1060
+ } else if (isX(p)) {
936
1061
  // ~1.2 == >=1.2.0 <1.3.0
937
- ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
938
- else if (pr) {
939
- debug('replaceTilde pr', pr);
940
- if (pr.charAt(0) !== '-')
941
- pr = '-' + pr;
942
- ret = '>=' + M + '.' + m + '.' + p + pr +
943
- ' <' + M + '.' + (+m + 1) + '.0';
944
- } else
1062
+ ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
1063
+ } else if (pr) {
1064
+ debug('replaceTilde pr', pr)
1065
+ ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
1066
+ ' <' + M + '.' + (+m + 1) + '.0'
1067
+ } else {
945
1068
  // ~1.2.3 == >=1.2.3 <1.3.0
946
1069
  ret = '>=' + M + '.' + m + '.' + p +
947
- ' <' + M + '.' + (+m + 1) + '.0';
1070
+ ' <' + M + '.' + (+m + 1) + '.0'
1071
+ }
948
1072
 
949
- debug('tilde return', ret);
950
- return ret;
951
- });
1073
+ debug('tilde return', ret)
1074
+ return ret
1075
+ })
952
1076
  }
953
1077
 
954
1078
  // ^ --> * (any, kinda silly)
@@ -957,142 +1081,144 @@ function replaceTilde(comp, options) {
957
1081
  // ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
958
1082
  // ^1.2.3 --> >=1.2.3 <2.0.0
959
1083
  // ^1.2.0 --> >=1.2.0 <2.0.0
960
- function replaceCarets(comp, options) {
961
- return comp.trim().split(/\s+/).map(function(comp) {
962
- return replaceCaret(comp, options);
963
- }).join(' ');
964
- }
965
-
966
- function replaceCaret(comp, options) {
967
- debug('caret', comp, options);
968
- if (!options || typeof options !== 'object')
969
- options = { loose: !!options, includePrerelease: false }
970
- var r = options.loose ? re[CARETLOOSE] : re[CARET];
971
- return comp.replace(r, function(_, M, m, p, pr) {
972
- debug('caret', comp, _, M, m, p, pr);
973
- var ret;
974
-
975
- if (isX(M))
976
- ret = '';
977
- else if (isX(m))
978
- ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
979
- else if (isX(p)) {
980
- if (M === '0')
981
- ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
982
- else
983
- ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0';
1084
+ function replaceCarets (comp, options) {
1085
+ return comp.trim().split(/\s+/).map(function (comp) {
1086
+ return replaceCaret(comp, options)
1087
+ }).join(' ')
1088
+ }
1089
+
1090
+ function replaceCaret (comp, options) {
1091
+ debug('caret', comp, options)
1092
+ var r = options.loose ? re[CARETLOOSE] : re[CARET]
1093
+ return comp.replace(r, function (_, M, m, p, pr) {
1094
+ debug('caret', comp, _, M, m, p, pr)
1095
+ var ret
1096
+
1097
+ if (isX(M)) {
1098
+ ret = ''
1099
+ } else if (isX(m)) {
1100
+ ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
1101
+ } else if (isX(p)) {
1102
+ if (M === '0') {
1103
+ ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
1104
+ } else {
1105
+ ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'
1106
+ }
984
1107
  } else if (pr) {
985
- debug('replaceCaret pr', pr);
986
- if (pr.charAt(0) !== '-')
987
- pr = '-' + pr;
1108
+ debug('replaceCaret pr', pr)
988
1109
  if (M === '0') {
989
- if (m === '0')
990
- ret = '>=' + M + '.' + m + '.' + p + pr +
991
- ' <' + M + '.' + m + '.' + (+p + 1);
992
- else
993
- ret = '>=' + M + '.' + m + '.' + p + pr +
994
- ' <' + M + '.' + (+m + 1) + '.0';
995
- } else
996
- ret = '>=' + M + '.' + m + '.' + p + pr +
997
- ' <' + (+M + 1) + '.0.0';
1110
+ if (m === '0') {
1111
+ ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
1112
+ ' <' + M + '.' + m + '.' + (+p + 1)
1113
+ } else {
1114
+ ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
1115
+ ' <' + M + '.' + (+m + 1) + '.0'
1116
+ }
1117
+ } else {
1118
+ ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
1119
+ ' <' + (+M + 1) + '.0.0'
1120
+ }
998
1121
  } else {
999
- debug('no pr');
1122
+ debug('no pr')
1000
1123
  if (M === '0') {
1001
- if (m === '0')
1124
+ if (m === '0') {
1002
1125
  ret = '>=' + M + '.' + m + '.' + p +
1003
- ' <' + M + '.' + m + '.' + (+p + 1);
1004
- else
1126
+ ' <' + M + '.' + m + '.' + (+p + 1)
1127
+ } else {
1005
1128
  ret = '>=' + M + '.' + m + '.' + p +
1006
- ' <' + M + '.' + (+m + 1) + '.0';
1007
- } else
1129
+ ' <' + M + '.' + (+m + 1) + '.0'
1130
+ }
1131
+ } else {
1008
1132
  ret = '>=' + M + '.' + m + '.' + p +
1009
- ' <' + (+M + 1) + '.0.0';
1133
+ ' <' + (+M + 1) + '.0.0'
1134
+ }
1010
1135
  }
1011
1136
 
1012
- debug('caret return', ret);
1013
- return ret;
1014
- });
1137
+ debug('caret return', ret)
1138
+ return ret
1139
+ })
1015
1140
  }
1016
1141
 
1017
- function replaceXRanges(comp, options) {
1018
- debug('replaceXRanges', comp, options);
1019
- return comp.split(/\s+/).map(function(comp) {
1020
- return replaceXRange(comp, options);
1021
- }).join(' ');
1142
+ function replaceXRanges (comp, options) {
1143
+ debug('replaceXRanges', comp, options)
1144
+ return comp.split(/\s+/).map(function (comp) {
1145
+ return replaceXRange(comp, options)
1146
+ }).join(' ')
1022
1147
  }
1023
1148
 
1024
- function replaceXRange(comp, options) {
1025
- comp = comp.trim();
1026
- if (!options || typeof options !== 'object')
1027
- options = { loose: !!options, includePrerelease: false }
1028
- var r = options.loose ? re[XRANGELOOSE] : re[XRANGE];
1029
- return comp.replace(r, function(ret, gtlt, M, m, p, pr) {
1030
- debug('xRange', comp, ret, gtlt, M, m, p, pr);
1031
- var xM = isX(M);
1032
- var xm = xM || isX(m);
1033
- var xp = xm || isX(p);
1034
- var anyX = xp;
1035
-
1036
- if (gtlt === '=' && anyX)
1037
- gtlt = '';
1149
+ function replaceXRange (comp, options) {
1150
+ comp = comp.trim()
1151
+ var r = options.loose ? re[XRANGELOOSE] : re[XRANGE]
1152
+ return comp.replace(r, function (ret, gtlt, M, m, p, pr) {
1153
+ debug('xRange', comp, ret, gtlt, M, m, p, pr)
1154
+ var xM = isX(M)
1155
+ var xm = xM || isX(m)
1156
+ var xp = xm || isX(p)
1157
+ var anyX = xp
1158
+
1159
+ if (gtlt === '=' && anyX) {
1160
+ gtlt = ''
1161
+ }
1038
1162
 
1039
1163
  if (xM) {
1040
1164
  if (gtlt === '>' || gtlt === '<') {
1041
1165
  // nothing is allowed
1042
- ret = '<0.0.0';
1166
+ ret = '<0.0.0'
1043
1167
  } else {
1044
1168
  // nothing is forbidden
1045
- ret = '*';
1169
+ ret = '*'
1046
1170
  }
1047
1171
  } else if (gtlt && anyX) {
1172
+ // we know patch is an x, because we have any x at all.
1048
1173
  // replace X with 0
1049
- if (xm)
1050
- m = 0;
1051
- if (xp)
1052
- p = 0;
1174
+ if (xm) {
1175
+ m = 0
1176
+ }
1177
+ p = 0
1053
1178
 
1054
1179
  if (gtlt === '>') {
1055
1180
  // >1 => >=2.0.0
1056
1181
  // >1.2 => >=1.3.0
1057
1182
  // >1.2.3 => >= 1.2.4
1058
- gtlt = '>=';
1183
+ gtlt = '>='
1059
1184
  if (xm) {
1060
- M = +M + 1;
1061
- m = 0;
1062
- p = 0;
1063
- } else if (xp) {
1064
- m = +m + 1;
1065
- p = 0;
1185
+ M = +M + 1
1186
+ m = 0
1187
+ p = 0
1188
+ } else {
1189
+ m = +m + 1
1190
+ p = 0
1066
1191
  }
1067
1192
  } else if (gtlt === '<=') {
1068
1193
  // <=0.7.x is actually <0.8.0, since any 0.7.x should
1069
1194
  // pass. Similarly, <=7.x is actually <8.0.0, etc.
1070
- gtlt = '<';
1071
- if (xm)
1072
- M = +M + 1;
1073
- else
1074
- m = +m + 1;
1195
+ gtlt = '<'
1196
+ if (xm) {
1197
+ M = +M + 1
1198
+ } else {
1199
+ m = +m + 1
1200
+ }
1075
1201
  }
1076
1202
 
1077
- ret = gtlt + M + '.' + m + '.' + p;
1203
+ ret = gtlt + M + '.' + m + '.' + p
1078
1204
  } else if (xm) {
1079
- ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
1205
+ ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
1080
1206
  } else if (xp) {
1081
- ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
1207
+ ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
1082
1208
  }
1083
1209
 
1084
- debug('xRange return', ret);
1210
+ debug('xRange return', ret)
1085
1211
 
1086
- return ret;
1087
- });
1212
+ return ret
1213
+ })
1088
1214
  }
1089
1215
 
1090
1216
  // Because * is AND-ed with everything else in the comparator,
1091
1217
  // and '' means "any version", just remove the *s entirely.
1092
- function replaceStars(comp, options) {
1093
- debug('replaceStars', comp, options);
1218
+ function replaceStars (comp, options) {
1219
+ debug('replaceStars', comp, options)
1094
1220
  // Looseness is ignored here. star is always as loose as it gets!
1095
- return comp.trim().replace(re[STAR], '');
1221
+ return comp.trim().replace(re[STAR], '')
1096
1222
  }
1097
1223
 
1098
1224
  // This function is passed to string.replace(re[HYPHENRANGE])
@@ -1100,253 +1226,315 @@ function replaceStars(comp, options) {
1100
1226
  // 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
1101
1227
  // 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
1102
1228
  // 1.2 - 3.4 => >=1.2.0 <3.5.0
1103
- function hyphenReplace($0,
1104
- from, fM, fm, fp, fpr, fb,
1105
- to, tM, tm, tp, tpr, tb) {
1106
-
1107
- if (isX(fM))
1108
- from = '';
1109
- else if (isX(fm))
1110
- from = '>=' + fM + '.0.0';
1111
- else if (isX(fp))
1112
- from = '>=' + fM + '.' + fm + '.0';
1113
- else
1114
- from = '>=' + from;
1115
-
1116
- if (isX(tM))
1117
- to = '';
1118
- else if (isX(tm))
1119
- to = '<' + (+tM + 1) + '.0.0';
1120
- else if (isX(tp))
1121
- to = '<' + tM + '.' + (+tm + 1) + '.0';
1122
- else if (tpr)
1123
- to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr;
1124
- else
1125
- to = '<=' + to;
1126
-
1127
- return (from + ' ' + to).trim();
1128
- }
1229
+ function hyphenReplace ($0,
1230
+ from, fM, fm, fp, fpr, fb,
1231
+ to, tM, tm, tp, tpr, tb) {
1232
+ if (isX(fM)) {
1233
+ from = ''
1234
+ } else if (isX(fm)) {
1235
+ from = '>=' + fM + '.0.0'
1236
+ } else if (isX(fp)) {
1237
+ from = '>=' + fM + '.' + fm + '.0'
1238
+ } else {
1239
+ from = '>=' + from
1240
+ }
1129
1241
 
1242
+ if (isX(tM)) {
1243
+ to = ''
1244
+ } else if (isX(tm)) {
1245
+ to = '<' + (+tM + 1) + '.0.0'
1246
+ } else if (isX(tp)) {
1247
+ to = '<' + tM + '.' + (+tm + 1) + '.0'
1248
+ } else if (tpr) {
1249
+ to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr
1250
+ } else {
1251
+ to = '<=' + to
1252
+ }
1130
1253
 
1131
- // if ANY of the sets match ALL of its comparators, then pass
1132
- Range.prototype.test = function(version) {
1133
- if (!version)
1134
- return false;
1254
+ return (from + ' ' + to).trim()
1255
+ }
1135
1256
 
1136
- if (typeof version === 'string')
1137
- version = new SemVer(version, this.options);
1257
+ // if ANY of the sets match ALL of its comparators, then pass
1258
+ Range.prototype.test = function (version) {
1259
+ if (typeof version === 'string') {
1260
+ version = new SemVer(version, this.options)
1261
+ }
1138
1262
 
1139
1263
  for (var i = 0; i < this.set.length; i++) {
1140
- if (testSet(this.set[i], version, this.options))
1141
- return true;
1264
+ if (testSet(this.set[i], version, this.options)) {
1265
+ return true
1266
+ }
1142
1267
  }
1143
- return false;
1144
- };
1268
+ return false
1269
+ }
1145
1270
 
1146
- function testSet(set, version, options) {
1271
+ function testSet (set, version, options) {
1147
1272
  for (var i = 0; i < set.length; i++) {
1148
- if (!set[i].test(version))
1149
- return false;
1273
+ if (!set[i].test(version)) {
1274
+ return false
1275
+ }
1150
1276
  }
1151
1277
 
1152
- if (!options)
1153
- options = {}
1154
-
1155
1278
  if (version.prerelease.length && !options.includePrerelease) {
1156
1279
  // Find the set of versions that are allowed to have prereleases
1157
1280
  // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
1158
1281
  // That should allow `1.2.3-pr.2` to pass.
1159
1282
  // However, `1.2.4-alpha.notready` should NOT be allowed,
1160
1283
  // even though it's within the range set by the comparators.
1161
- for (var i = 0; i < set.length; i++) {
1162
- debug(set[i].semver);
1163
- if (set[i].semver === ANY)
1164
- continue;
1284
+ for (i = 0; i < set.length; i++) {
1285
+ debug(set[i].semver)
1286
+ if (set[i].semver === ANY) {
1287
+ continue
1288
+ }
1165
1289
 
1166
1290
  if (set[i].semver.prerelease.length > 0) {
1167
- var allowed = set[i].semver;
1291
+ var allowed = set[i].semver
1168
1292
  if (allowed.major === version.major &&
1169
1293
  allowed.minor === version.minor &&
1170
- allowed.patch === version.patch)
1171
- return true;
1294
+ allowed.patch === version.patch) {
1295
+ return true
1296
+ }
1172
1297
  }
1173
1298
  }
1174
1299
 
1175
1300
  // Version has a -pre, but it's not one of the ones we like.
1176
- return false;
1301
+ return false
1177
1302
  }
1178
1303
 
1179
- return true;
1304
+ return true
1180
1305
  }
1181
1306
 
1182
- exports.satisfies = satisfies;
1183
- function satisfies(version, range, options) {
1307
+ exports.satisfies = satisfies
1308
+ function satisfies (version, range, options) {
1184
1309
  try {
1185
- range = new Range(range, options);
1310
+ range = new Range(range, options)
1186
1311
  } catch (er) {
1187
- return false;
1312
+ return false
1188
1313
  }
1189
- return range.test(version);
1314
+ return range.test(version)
1190
1315
  }
1191
1316
 
1192
- exports.maxSatisfying = maxSatisfying;
1193
- function maxSatisfying(versions, range, options) {
1194
- var max = null;
1195
- var maxSV = null;
1317
+ exports.maxSatisfying = maxSatisfying
1318
+ function maxSatisfying (versions, range, options) {
1319
+ var max = null
1320
+ var maxSV = null
1196
1321
  try {
1197
- var rangeObj = new Range(range, options);
1322
+ var rangeObj = new Range(range, options)
1198
1323
  } catch (er) {
1199
- return null;
1324
+ return null
1200
1325
  }
1201
1326
  versions.forEach(function (v) {
1202
- if (rangeObj.test(v)) { // satisfies(v, range, options)
1203
- if (!max || maxSV.compare(v) === -1) { // compare(max, v, true)
1204
- max = v;
1205
- maxSV = new SemVer(max, options);
1327
+ if (rangeObj.test(v)) {
1328
+ // satisfies(v, range, options)
1329
+ if (!max || maxSV.compare(v) === -1) {
1330
+ // compare(max, v, true)
1331
+ max = v
1332
+ maxSV = new SemVer(max, options)
1206
1333
  }
1207
1334
  }
1208
1335
  })
1209
- return max;
1336
+ return max
1210
1337
  }
1211
1338
 
1212
- exports.minSatisfying = minSatisfying;
1213
- function minSatisfying(versions, range, options) {
1214
- var min = null;
1215
- var minSV = null;
1339
+ exports.minSatisfying = minSatisfying
1340
+ function minSatisfying (versions, range, options) {
1341
+ var min = null
1342
+ var minSV = null
1216
1343
  try {
1217
- var rangeObj = new Range(range, options);
1344
+ var rangeObj = new Range(range, options)
1218
1345
  } catch (er) {
1219
- return null;
1346
+ return null
1220
1347
  }
1221
1348
  versions.forEach(function (v) {
1222
- if (rangeObj.test(v)) { // satisfies(v, range, options)
1223
- if (!min || minSV.compare(v) === 1) { // compare(min, v, true)
1224
- min = v;
1225
- minSV = new SemVer(min, options);
1349
+ if (rangeObj.test(v)) {
1350
+ // satisfies(v, range, options)
1351
+ if (!min || minSV.compare(v) === 1) {
1352
+ // compare(min, v, true)
1353
+ min = v
1354
+ minSV = new SemVer(min, options)
1226
1355
  }
1227
1356
  }
1228
1357
  })
1229
- return min;
1358
+ return min
1359
+ }
1360
+
1361
+ exports.minVersion = minVersion
1362
+ function minVersion (range, loose) {
1363
+ range = new Range(range, loose)
1364
+
1365
+ var minver = new SemVer('0.0.0')
1366
+ if (range.test(minver)) {
1367
+ return minver
1368
+ }
1369
+
1370
+ minver = new SemVer('0.0.0-0')
1371
+ if (range.test(minver)) {
1372
+ return minver
1373
+ }
1374
+
1375
+ minver = null
1376
+ for (var i = 0; i < range.set.length; ++i) {
1377
+ var comparators = range.set[i]
1378
+
1379
+ comparators.forEach(function (comparator) {
1380
+ // Clone to avoid manipulating the comparator's semver object.
1381
+ var compver = new SemVer(comparator.semver.version)
1382
+ switch (comparator.operator) {
1383
+ case '>':
1384
+ if (compver.prerelease.length === 0) {
1385
+ compver.patch++
1386
+ } else {
1387
+ compver.prerelease.push(0)
1388
+ }
1389
+ compver.raw = compver.format()
1390
+ /* fallthrough */
1391
+ case '':
1392
+ case '>=':
1393
+ if (!minver || gt(minver, compver)) {
1394
+ minver = compver
1395
+ }
1396
+ break
1397
+ case '<':
1398
+ case '<=':
1399
+ /* Ignore maximum versions */
1400
+ break
1401
+ /* istanbul ignore next */
1402
+ default:
1403
+ throw new Error('Unexpected operation: ' + comparator.operator)
1404
+ }
1405
+ })
1406
+ }
1407
+
1408
+ if (minver && range.test(minver)) {
1409
+ return minver
1410
+ }
1411
+
1412
+ return null
1230
1413
  }
1231
1414
 
1232
- exports.validRange = validRange;
1233
- function validRange(range, options) {
1415
+ exports.validRange = validRange
1416
+ function validRange (range, options) {
1234
1417
  try {
1235
1418
  // Return '*' instead of '' so that truthiness works.
1236
1419
  // This will throw if it's invalid anyway
1237
- return new Range(range, options).range || '*';
1420
+ return new Range(range, options).range || '*'
1238
1421
  } catch (er) {
1239
- return null;
1422
+ return null
1240
1423
  }
1241
1424
  }
1242
1425
 
1243
1426
  // Determine if version is less than all the versions possible in the range
1244
- exports.ltr = ltr;
1245
- function ltr(version, range, options) {
1246
- return outside(version, range, '<', options);
1427
+ exports.ltr = ltr
1428
+ function ltr (version, range, options) {
1429
+ return outside(version, range, '<', options)
1247
1430
  }
1248
1431
 
1249
1432
  // Determine if version is greater than all the versions possible in the range.
1250
- exports.gtr = gtr;
1251
- function gtr(version, range, options) {
1252
- return outside(version, range, '>', options);
1433
+ exports.gtr = gtr
1434
+ function gtr (version, range, options) {
1435
+ return outside(version, range, '>', options)
1253
1436
  }
1254
1437
 
1255
- exports.outside = outside;
1256
- function outside(version, range, hilo, options) {
1257
- version = new SemVer(version, options);
1258
- range = new Range(range, options);
1438
+ exports.outside = outside
1439
+ function outside (version, range, hilo, options) {
1440
+ version = new SemVer(version, options)
1441
+ range = new Range(range, options)
1259
1442
 
1260
- var gtfn, ltefn, ltfn, comp, ecomp;
1443
+ var gtfn, ltefn, ltfn, comp, ecomp
1261
1444
  switch (hilo) {
1262
1445
  case '>':
1263
- gtfn = gt;
1264
- ltefn = lte;
1265
- ltfn = lt;
1266
- comp = '>';
1267
- ecomp = '>=';
1268
- break;
1446
+ gtfn = gt
1447
+ ltefn = lte
1448
+ ltfn = lt
1449
+ comp = '>'
1450
+ ecomp = '>='
1451
+ break
1269
1452
  case '<':
1270
- gtfn = lt;
1271
- ltefn = gte;
1272
- ltfn = gt;
1273
- comp = '<';
1274
- ecomp = '<=';
1275
- break;
1453
+ gtfn = lt
1454
+ ltefn = gte
1455
+ ltfn = gt
1456
+ comp = '<'
1457
+ ecomp = '<='
1458
+ break
1276
1459
  default:
1277
- throw new TypeError('Must provide a hilo val of "<" or ">"');
1460
+ throw new TypeError('Must provide a hilo val of "<" or ">"')
1278
1461
  }
1279
1462
 
1280
1463
  // If it satisifes the range it is not outside
1281
1464
  if (satisfies(version, range, options)) {
1282
- return false;
1465
+ return false
1283
1466
  }
1284
1467
 
1285
1468
  // From now on, variable terms are as if we're in "gtr" mode.
1286
1469
  // but note that everything is flipped for the "ltr" function.
1287
1470
 
1288
1471
  for (var i = 0; i < range.set.length; ++i) {
1289
- var comparators = range.set[i];
1472
+ var comparators = range.set[i]
1290
1473
 
1291
- var high = null;
1292
- var low = null;
1474
+ var high = null
1475
+ var low = null
1293
1476
 
1294
- comparators.forEach(function(comparator) {
1477
+ comparators.forEach(function (comparator) {
1295
1478
  if (comparator.semver === ANY) {
1296
1479
  comparator = new Comparator('>=0.0.0')
1297
1480
  }
1298
- high = high || comparator;
1299
- low = low || comparator;
1481
+ high = high || comparator
1482
+ low = low || comparator
1300
1483
  if (gtfn(comparator.semver, high.semver, options)) {
1301
- high = comparator;
1484
+ high = comparator
1302
1485
  } else if (ltfn(comparator.semver, low.semver, options)) {
1303
- low = comparator;
1486
+ low = comparator
1304
1487
  }
1305
- });
1488
+ })
1306
1489
 
1307
1490
  // If the edge version comparator has a operator then our version
1308
1491
  // isn't outside it
1309
1492
  if (high.operator === comp || high.operator === ecomp) {
1310
- return false;
1493
+ return false
1311
1494
  }
1312
1495
 
1313
1496
  // If the lowest version comparator has an operator and our version
1314
1497
  // is less than it then it isn't higher than the range
1315
1498
  if ((!low.operator || low.operator === comp) &&
1316
1499
  ltefn(version, low.semver)) {
1317
- return false;
1500
+ return false
1318
1501
  } else if (low.operator === ecomp && ltfn(version, low.semver)) {
1319
- return false;
1502
+ return false
1320
1503
  }
1321
1504
  }
1322
- return true;
1505
+ return true
1323
1506
  }
1324
1507
 
1325
- exports.prerelease = prerelease;
1326
- function prerelease(version, options) {
1327
- var parsed = parse(version, options);
1328
- return (parsed && parsed.prerelease.length) ? parsed.prerelease : null;
1508
+ exports.prerelease = prerelease
1509
+ function prerelease (version, options) {
1510
+ var parsed = parse(version, options)
1511
+ return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
1329
1512
  }
1330
1513
 
1331
- exports.intersects = intersects;
1332
- function intersects(r1, r2, options) {
1514
+ exports.intersects = intersects
1515
+ function intersects (r1, r2, options) {
1333
1516
  r1 = new Range(r1, options)
1334
1517
  r2 = new Range(r2, options)
1335
1518
  return r1.intersects(r2)
1336
1519
  }
1337
1520
 
1338
- exports.coerce = coerce;
1339
- function coerce(version) {
1340
- if (version instanceof SemVer)
1341
- return version;
1521
+ exports.coerce = coerce
1522
+ function coerce (version) {
1523
+ if (version instanceof SemVer) {
1524
+ return version
1525
+ }
1342
1526
 
1343
- if (typeof version !== 'string')
1344
- return null;
1527
+ if (typeof version !== 'string') {
1528
+ return null
1529
+ }
1345
1530
 
1346
- var match = version.match(re[COERCE]);
1531
+ var match = version.match(re[COERCE])
1347
1532
 
1348
- if (match == null)
1349
- return null;
1533
+ if (match == null) {
1534
+ return null
1535
+ }
1350
1536
 
1351
- return parse((match[1] || '0') + '.' + (match[2] || '0') + '.' + (match[3] || '0'));
1537
+ return parse(match[1] +
1538
+ '.' + (match[2] || '0') +
1539
+ '.' + (match[3] || '0'))
1352
1540
  }