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