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