jquery-tablesorter 1.16.3 → 1.16.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/lib/jquery-tablesorter/version.rb +1 -1
  4. data/vendor/assets/javascripts/jquery-tablesorter/extras/semver-mod.js +277 -86
  5. data/vendor/assets/javascripts/jquery-tablesorter/extras/semver.js +272 -81
  6. data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.combined.js +4483 -0
  7. data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.js +45 -13
  8. data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.widgets.js +10 -11
  9. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-extract.js +9 -16
  10. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-iso8601.js +2 -2
  11. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-month.js +3 -4
  12. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-range.js +2 -5
  13. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-two-digit-year.js +2 -3
  14. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-weekday.js +2 -3
  15. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date.js +6 -10
  16. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-duration.js +1 -1
  17. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-feet-inch-fraction.js +1 -1
  18. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-file-type.js +1 -1
  19. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-ignore-articles.js +1 -1
  20. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-image.js +2 -3
  21. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-input-select.js +1 -1
  22. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-metric.js +1 -1
  23. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-named-numbers.js +1 -1
  24. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-network.js +9 -6
  25. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-roman.js +1 -1
  26. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-alignChar.js +2 -2
  27. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-chart.js +1 -1
  28. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-columnSelector.js +1 -1
  29. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-cssStickyHeaders.js +1 -1
  30. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-editable.js +1 -1
  31. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-formatter-html5.js +1 -1
  32. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-formatter-jui.js +1 -1
  33. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-formatter-select2.js +1 -1
  34. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-type-insideRange.js +1 -4
  35. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-formatter.js +1 -1
  36. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-grouping.js +1 -1
  37. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-headerTitles.js +1 -1
  38. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-math.js +1 -1
  39. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-output.js +1 -1
  40. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-print.js +1 -1
  41. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-reflow.js +1 -1
  42. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-repeatheaders.js +1 -1
  43. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-staticRow.js +1 -1
  44. metadata +3 -2
@@ -20,6 +20,9 @@ if (typeof module === 'object' && module.exports === exports)
20
20
  // Not necessarily the package version of this code.
21
21
  exports.SEMVER_SPEC_VERSION = '2.0.0';
22
22
 
23
+ var MAX_LENGTH = 256;
24
+ var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
25
+
23
26
  // The actual regexps go on exports.re
24
27
  var re = exports.re = [];
25
28
  var src = exports.src = [];
@@ -138,18 +141,18 @@ var XRANGEPLAIN = R++;
138
141
  src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' +
139
142
  '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
140
143
  '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
141
- '(?:(' + src[PRERELEASE] + ')' +
142
- ')?)?)?';
144
+ '(?:' + src[PRERELEASE] + ')?' +
145
+ src[BUILD] + '?' +
146
+ ')?)?';
143
147
 
144
148
  var XRANGEPLAINLOOSE = R++;
145
149
  src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
146
150
  '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
147
151
  '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
148
- '(?:(' + src[PRERELEASELOOSE] + ')' +
149
- ')?)?)?';
152
+ '(?:' + src[PRERELEASELOOSE] + ')?' +
153
+ src[BUILD] + '?' +
154
+ ')?)?';
150
155
 
151
- // >=2.x, for example, means >=2.0.0-0
152
- // <1.x would be the same as "<1.0.0-0", though.
153
156
  var XRANGE = R++;
154
157
  src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$';
155
158
  var XRANGELOOSE = R++;
@@ -233,8 +236,24 @@ for (var i = 0; i < R; i++) {
233
236
 
234
237
  exports.parse = parse;
235
238
  function parse(version, loose) {
239
+ if (version instanceof SemVer)
240
+ return version;
241
+
242
+ if (typeof version !== 'string')
243
+ return null;
244
+
245
+ if (version.length > MAX_LENGTH)
246
+ return null;
247
+
236
248
  var r = loose ? re[LOOSE] : re[FULL];
237
- return (r.test(version)) ? new SemVer(version, loose) : null;
249
+ if (!r.test(version))
250
+ return null;
251
+
252
+ try {
253
+ return new SemVer(version, loose);
254
+ } catch (er) {
255
+ return null;
256
+ }
238
257
  }
239
258
 
240
259
  exports.valid = valid;
@@ -246,7 +265,7 @@ function valid(version, loose) {
246
265
 
247
266
  exports.clean = clean;
248
267
  function clean(version, loose) {
249
- var s = parse(version, loose);
268
+ var s = parse(version.trim().replace(/^[=v]+/, ''), loose);
250
269
  return s ? s.version : null;
251
270
  }
252
271
 
@@ -258,8 +277,13 @@ function SemVer(version, loose) {
258
277
  return version;
259
278
  else
260
279
  version = version.version;
280
+ } else if (typeof version !== 'string') {
281
+ throw new TypeError('Invalid Version: ' + version);
261
282
  }
262
283
 
284
+ if (version.length > MAX_LENGTH)
285
+ throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')
286
+
263
287
  if (!(this instanceof SemVer))
264
288
  return new SemVer(version, loose);
265
289
 
@@ -277,12 +301,26 @@ function SemVer(version, loose) {
277
301
  this.minor = +m[2];
278
302
  this.patch = +m[3];
279
303
 
304
+ if (this.major > MAX_SAFE_INTEGER || this.major < 0)
305
+ throw new TypeError('Invalid major version')
306
+
307
+ if (this.minor > MAX_SAFE_INTEGER || this.minor < 0)
308
+ throw new TypeError('Invalid minor version')
309
+
310
+ if (this.patch > MAX_SAFE_INTEGER || this.patch < 0)
311
+ throw new TypeError('Invalid patch version')
312
+
280
313
  // numberify any prerelease numeric ids
281
314
  if (!m[4])
282
315
  this.prerelease = [];
283
316
  else
284
317
  this.prerelease = m[4].split('.').map(function(id) {
285
- return (/^[0-9]+$/.test(id)) ? +id : id;
318
+ if (/^[0-9]+$/.test(id)) {
319
+ var num = +id
320
+ if (num >= 0 && num < MAX_SAFE_INTEGER)
321
+ return num
322
+ }
323
+ return id;
286
324
  });
287
325
 
288
326
  this.build = m[5] ? m[5].split('.') : [];
@@ -330,7 +368,7 @@ SemVer.prototype.comparePre = function(other) {
330
368
  return -1;
331
369
  else if (!this.prerelease.length && other.prerelease.length)
332
370
  return 1;
333
- else if (!this.prerelease.lenth && !other.prerelease.length)
371
+ else if (!this.prerelease.length && !other.prerelease.length)
334
372
  return 0;
335
373
 
336
374
  var i = 0;
@@ -351,19 +389,72 @@ SemVer.prototype.comparePre = function(other) {
351
389
  } while (++i);
352
390
  };
353
391
 
354
- SemVer.prototype.inc = function(release) {
392
+ // preminor will bump the version up to the next minor release, and immediately
393
+ // down to pre-release. premajor and prepatch work the same way.
394
+ SemVer.prototype.inc = function(release, identifier) {
355
395
  switch (release) {
356
- case 'major':
396
+ case 'premajor':
397
+ this.prerelease.length = 0;
398
+ this.patch = 0;
399
+ this.minor = 0;
357
400
  this.major++;
358
- this.minor = -1;
359
- case 'minor':
401
+ this.inc('pre', identifier);
402
+ break;
403
+ case 'preminor':
404
+ this.prerelease.length = 0;
405
+ this.patch = 0;
360
406
  this.minor++;
361
- this.patch = -1;
407
+ this.inc('pre', identifier);
408
+ break;
409
+ case 'prepatch':
410
+ // If this is already a prerelease, it will bump to the next version
411
+ // drop any prereleases that might already exist, since they are not
412
+ // relevant at this point.
413
+ this.prerelease.length = 0;
414
+ this.inc('patch', identifier);
415
+ this.inc('pre', identifier);
416
+ break;
417
+ // If the input is a non-prerelease version, this acts the same as
418
+ // prepatch.
419
+ case 'prerelease':
420
+ if (this.prerelease.length === 0)
421
+ this.inc('patch', identifier);
422
+ this.inc('pre', identifier);
423
+ break;
424
+
425
+ case 'major':
426
+ // If this is a pre-major version, bump up to the same major version.
427
+ // Otherwise increment major.
428
+ // 1.0.0-5 bumps to 1.0.0
429
+ // 1.1.0 bumps to 2.0.0
430
+ if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0)
431
+ this.major++;
432
+ this.minor = 0;
433
+ this.patch = 0;
434
+ this.prerelease = [];
435
+ break;
436
+ case 'minor':
437
+ // If this is a pre-minor version, bump up to the same minor version.
438
+ // Otherwise increment minor.
439
+ // 1.2.0-5 bumps to 1.2.0
440
+ // 1.2.1 bumps to 1.3.0
441
+ if (this.patch !== 0 || this.prerelease.length === 0)
442
+ this.minor++;
443
+ this.patch = 0;
444
+ this.prerelease = [];
445
+ break;
362
446
  case 'patch':
363
- this.patch++;
447
+ // If this is not a pre-release version, it will increment the patch.
448
+ // If it is a pre-release it will bump up to the same patch version.
449
+ // 1.2.0-5 patches to 1.2.0
450
+ // 1.2.0 patches to 1.2.1
451
+ if (this.prerelease.length === 0)
452
+ this.patch++;
364
453
  this.prerelease = [];
365
454
  break;
366
- case 'prerelease':
455
+ // This probably shouldn't be used publicly.
456
+ // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
457
+ case 'pre':
367
458
  if (this.prerelease.length === 0)
368
459
  this.prerelease = [0];
369
460
  else {
@@ -377,6 +468,15 @@ SemVer.prototype.inc = function(release) {
377
468
  if (i === -1) // didn't increment anything
378
469
  this.prerelease.push(0);
379
470
  }
471
+ if (identifier) {
472
+ // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
473
+ // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
474
+ if (this.prerelease[0] === identifier) {
475
+ if (isNaN(this.prerelease[1]))
476
+ this.prerelease = [identifier, 0];
477
+ } else
478
+ this.prerelease = [identifier, 0];
479
+ }
380
480
  break;
381
481
 
382
482
  default:
@@ -387,14 +487,46 @@ SemVer.prototype.inc = function(release) {
387
487
  };
388
488
 
389
489
  exports.inc = inc;
390
- function inc(version, release, loose) {
490
+ function inc(version, release, loose, identifier) {
491
+ if (typeof(loose) === 'string') {
492
+ identifier = loose;
493
+ loose = undefined;
494
+ }
495
+
391
496
  try {
392
- return new SemVer(version, loose).inc(release).version;
497
+ return new SemVer(version, loose).inc(release, identifier).version;
393
498
  } catch (er) {
394
499
  return null;
395
500
  }
396
501
  }
397
502
 
503
+ exports.diff = diff;
504
+ function diff(version1, version2) {
505
+ if (eq(version1, version2)) {
506
+ return null;
507
+ } else {
508
+ var v1 = parse(version1);
509
+ var v2 = parse(version2);
510
+ if (v1.prerelease.length || v2.prerelease.length) {
511
+ for (var key in v1) {
512
+ if (key === 'major' || key === 'minor' || key === 'patch') {
513
+ if (v1[key] !== v2[key]) {
514
+ return 'pre'+key;
515
+ }
516
+ }
517
+ }
518
+ return 'prerelease';
519
+ }
520
+ for (var key in v1) {
521
+ if (key === 'major' || key === 'minor' || key === 'patch') {
522
+ if (v1[key] !== v2[key]) {
523
+ return key;
524
+ }
525
+ }
526
+ }
527
+ }
528
+ }
529
+
398
530
  exports.compareIdentifiers = compareIdentifiers;
399
531
 
400
532
  var numeric = /^[0-9]+$/;
@@ -419,6 +551,21 @@ function rcompareIdentifiers(a, b) {
419
551
  return compareIdentifiers(b, a);
420
552
  }
421
553
 
554
+ exports.major = major;
555
+ function major(a, loose) {
556
+ return new SemVer(a, loose).major;
557
+ }
558
+
559
+ exports.minor = minor;
560
+ function minor(a, loose) {
561
+ return new SemVer(a, loose).minor;
562
+ }
563
+
564
+ exports.patch = patch;
565
+ function patch(a, loose) {
566
+ return new SemVer(a, loose).patch;
567
+ }
568
+
422
569
  exports.compare = compare;
423
570
  function compare(a, b, loose) {
424
571
  return new SemVer(a, loose).compare(b);
@@ -482,8 +629,16 @@ exports.cmp = cmp;
482
629
  function cmp(a, op, b, loose) {
483
630
  var ret;
484
631
  switch (op) {
485
- case '===': ret = a === b; break;
486
- case '!==': ret = a !== b; break;
632
+ 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 '!==':
638
+ if (typeof a === 'object') a = a.version;
639
+ if (typeof b === 'object') b = b.version;
640
+ ret = a !== b;
641
+ break;
487
642
  case '': case '=': case '==': ret = eq(a, b, loose); break;
488
643
  case '!=': ret = neq(a, b, loose); break;
489
644
  case '>': ret = gt(a, b, loose); break;
@@ -515,6 +670,8 @@ function Comparator(comp, loose) {
515
670
  this.value = '';
516
671
  else
517
672
  this.value = this.operator + this.semver.version;
673
+
674
+ debug('comp', this);
518
675
  }
519
676
 
520
677
  var ANY = {};
@@ -526,24 +683,14 @@ Comparator.prototype.parse = function(comp) {
526
683
  throw new TypeError('Invalid comparator: ' + comp);
527
684
 
528
685
  this.operator = m[1];
686
+ if (this.operator === '=')
687
+ this.operator = '';
688
+
529
689
  // if it literally is just '>' or '' then allow anything.
530
690
  if (!m[2])
531
691
  this.semver = ANY;
532
- else {
692
+ else
533
693
  this.semver = new SemVer(m[2], this.loose);
534
-
535
- // <1.2.3-rc DOES allow 1.2.3-beta (has prerelease)
536
- // >=1.2.3 DOES NOT allow 1.2.3-beta
537
- // <=1.2.3 DOES allow 1.2.3-beta
538
- // However, <1.2.3 does NOT allow 1.2.3-beta,
539
- // even though `1.2.3-beta < 1.2.3`
540
- // The assumption is that the 1.2.3 version has something you
541
- // *don't* want, so we push the prerelease down to the minimum.
542
- if (this.operator === '<' && !this.semver.prerelease.length) {
543
- this.semver.prerelease = ['0'];
544
- this.semver.format();
545
- }
546
- }
547
694
  };
548
695
 
549
696
  Comparator.prototype.inspect = function() {
@@ -556,8 +703,14 @@ Comparator.prototype.toString = function() {
556
703
 
557
704
  Comparator.prototype.test = function(version) {
558
705
  debug('Comparator.test', version, this.loose);
559
- return (this.semver === ANY) ? true :
560
- cmp(version, this.operator, this.semver, this.loose);
706
+
707
+ if (this.semver === ANY)
708
+ return true;
709
+
710
+ if (typeof version === 'string')
711
+ version = new SemVer(version, this.loose);
712
+
713
+ return cmp(version, this.operator, this.semver, this.loose);
561
714
  };
562
715
 
563
716
 
@@ -694,20 +847,20 @@ function replaceTilde(comp, loose) {
694
847
  if (isX(M))
695
848
  ret = '';
696
849
  else if (isX(m))
697
- ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0';
850
+ ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
698
851
  else if (isX(p))
699
852
  // ~1.2 == >=1.2.0- <1.3.0-
700
- ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0';
853
+ ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
701
854
  else if (pr) {
702
855
  debug('replaceTilde pr', pr);
703
856
  if (pr.charAt(0) !== '-')
704
857
  pr = '-' + pr;
705
858
  ret = '>=' + M + '.' + m + '.' + p + pr +
706
- ' <' + M + '.' + (+m + 1) + '.0-0';
859
+ ' <' + M + '.' + (+m + 1) + '.0';
707
860
  } else
708
- // ~1.2.3 == >=1.2.3-0 <1.3.0-0
709
- ret = '>=' + M + '.' + m + '.' + p + '-0' +
710
- ' <' + M + '.' + (+m + 1) + '.0-0';
861
+ // ~1.2.3 == >=1.2.3 <1.3.0
862
+ ret = '>=' + M + '.' + m + '.' + p +
863
+ ' <' + M + '.' + (+m + 1) + '.0';
711
864
 
712
865
  debug('tilde return', ret);
713
866
  return ret;
@@ -727,6 +880,7 @@ function replaceCarets(comp, loose) {
727
880
  }
728
881
 
729
882
  function replaceCaret(comp, loose) {
883
+ debug('caret', comp, loose);
730
884
  var r = loose ? re[CARETLOOSE] : re[CARET];
731
885
  return comp.replace(r, function(_, M, m, p, pr) {
732
886
  debug('caret', comp, _, M, m, p, pr);
@@ -735,35 +889,38 @@ function replaceCaret(comp, loose) {
735
889
  if (isX(M))
736
890
  ret = '';
737
891
  else if (isX(m))
738
- ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0';
892
+ ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
739
893
  else if (isX(p)) {
740
894
  if (M === '0')
741
- ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0';
895
+ ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
742
896
  else
743
- ret = '>=' + M + '.' + m + '.0-0 <' + (+M + 1) + '.0.0-0';
897
+ ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0';
744
898
  } else if (pr) {
745
899
  debug('replaceCaret pr', pr);
746
900
  if (pr.charAt(0) !== '-')
747
901
  pr = '-' + pr;
748
902
  if (M === '0') {
749
903
  if (m === '0')
750
- ret = '=' + M + '.' + m + '.' + p + pr;
904
+ ret = '>=' + M + '.' + m + '.' + p + pr +
905
+ ' <' + M + '.' + m + '.' + (+p + 1);
751
906
  else
752
907
  ret = '>=' + M + '.' + m + '.' + p + pr +
753
- ' <' + M + '.' + (+m + 1) + '.0-0';
908
+ ' <' + M + '.' + (+m + 1) + '.0';
754
909
  } else
755
910
  ret = '>=' + M + '.' + m + '.' + p + pr +
756
- ' <' + (+M + 1) + '.0.0-0';
911
+ ' <' + (+M + 1) + '.0.0';
757
912
  } else {
913
+ debug('no pr');
758
914
  if (M === '0') {
759
915
  if (m === '0')
760
- ret = '=' + M + '.' + m + '.' + p;
916
+ ret = '>=' + M + '.' + m + '.' + p +
917
+ ' <' + M + '.' + m + '.' + (+p + 1);
761
918
  else
762
- ret = '>=' + M + '.' + m + '.' + p + '-0' +
763
- ' <' + M + '.' + (+m + 1) + '.0-0';
919
+ ret = '>=' + M + '.' + m + '.' + p +
920
+ ' <' + M + '.' + (+m + 1) + '.0';
764
921
  } else
765
- ret = '>=' + M + '.' + m + '.' + p + '-0' +
766
- ' <' + (+M + 1) + '.0.0-0';
922
+ ret = '>=' + M + '.' + m + '.' + p +
923
+ ' <' + (+M + 1) + '.0.0';
767
924
  }
768
925
 
769
926
  debug('caret return', ret);
@@ -791,23 +948,27 @@ function replaceXRange(comp, loose) {
791
948
  if (gtlt === '=' && anyX)
792
949
  gtlt = '';
793
950
 
794
- if (gtlt && anyX) {
795
- // replace X with 0, and then append the -0 min-prerelease
796
- if (xM)
797
- M = 0;
951
+ if (xM) {
952
+ if (gtlt === '>' || gtlt === '<') {
953
+ // nothing is allowed
954
+ ret = '<0.0.0';
955
+ } else {
956
+ // nothing is forbidden
957
+ ret = '*';
958
+ }
959
+ } else if (gtlt && anyX) {
960
+ // replace X with 0
798
961
  if (xm)
799
962
  m = 0;
800
963
  if (xp)
801
964
  p = 0;
802
965
 
803
966
  if (gtlt === '>') {
804
- // >1 => >=2.0.0-0
805
- // >1.2 => >=1.3.0-0
806
- // >1.2.3 => >= 1.2.4-0
967
+ // >1 => >=2.0.0
968
+ // >1.2 => >=1.3.0
969
+ // >1.2.3 => >= 1.2.4
807
970
  gtlt = '>=';
808
- if (xM) {
809
- // no change
810
- } else if (xm) {
971
+ if (xm) {
811
972
  M = +M + 1;
812
973
  m = 0;
813
974
  p = 0;
@@ -815,20 +976,21 @@ function replaceXRange(comp, loose) {
815
976
  m = +m + 1;
816
977
  p = 0;
817
978
  }
979
+ } else if (gtlt === '<=') {
980
+ // <=0.7.x is actually <0.8.0, since any 0.7.x should
981
+ // pass. Similarly, <=7.x is actually <8.0.0, etc.
982
+ gtlt = '<'
983
+ if (xm)
984
+ M = +M + 1
985
+ else
986
+ m = +m + 1
818
987
  }
819
988
 
820
-
821
- ret = gtlt + M + '.' + m + '.' + p + '-0';
822
- } else if (xM) {
823
- // allow any
824
- ret = '*';
989
+ ret = gtlt + M + '.' + m + '.' + p;
825
990
  } else if (xm) {
826
- // append '-0' onto the version, otherwise
827
- // '1.x.x' matches '2.0.0-beta', since the tag
828
- // *lowers* the version value
829
- ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0';
991
+ ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
830
992
  } else if (xp) {
831
- ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0';
993
+ ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
832
994
  }
833
995
 
834
996
  debug('xRange return', ret);
@@ -847,9 +1009,9 @@ function replaceStars(comp, loose) {
847
1009
 
848
1010
  // This function is passed to string.replace(re[HYPHENRANGE])
849
1011
  // M, m, patch, prerelease, build
850
- // 1.2 - 3.4.5 => >=1.2.0-0 <=3.4.5
851
- // 1.2.3 - 3.4 => >=1.2.0-0 <3.5.0-0 Any 3.4.x will do
852
- // 1.2 - 3.4 => >=1.2.0-0 <3.5.0-0
1012
+ // 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
1013
+ // 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
1014
+ // 1.2 - 3.4 => >=1.2.0 <3.5.0
853
1015
  function hyphenReplace($0,
854
1016
  from, fM, fm, fp, fpr, fb,
855
1017
  to, tM, tm, tp, tpr, tb) {
@@ -857,18 +1019,18 @@ function hyphenReplace($0,
857
1019
  if (isX(fM))
858
1020
  from = '';
859
1021
  else if (isX(fm))
860
- from = '>=' + fM + '.0.0-0';
1022
+ from = '>=' + fM + '.0.0';
861
1023
  else if (isX(fp))
862
- from = '>=' + fM + '.' + fm + '.0-0';
1024
+ from = '>=' + fM + '.' + fm + '.0';
863
1025
  else
864
1026
  from = '>=' + from;
865
1027
 
866
1028
  if (isX(tM))
867
1029
  to = '';
868
1030
  else if (isX(tm))
869
- to = '<' + (+tM + 1) + '.0.0-0';
1031
+ to = '<' + (+tM + 1) + '.0.0';
870
1032
  else if (isX(tp))
871
- to = '<' + tM + '.' + (+tm + 1) + '.0-0';
1033
+ to = '<' + tM + '.' + (+tm + 1) + '.0';
872
1034
  else if (tpr)
873
1035
  to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr;
874
1036
  else
@@ -882,6 +1044,10 @@ function hyphenReplace($0,
882
1044
  Range.prototype.test = function(version) {
883
1045
  if (!version)
884
1046
  return false;
1047
+
1048
+ if (typeof version === 'string')
1049
+ version = new SemVer(version, this.loose);
1050
+
885
1051
  for (var i = 0; i < this.set.length; i++) {
886
1052
  if (testSet(this.set[i], version))
887
1053
  return true;
@@ -894,6 +1060,31 @@ function testSet(set, version) {
894
1060
  if (!set[i].test(version))
895
1061
  return false;
896
1062
  }
1063
+
1064
+ if (version.prerelease.length) {
1065
+ // Find the set of versions that are allowed to have prereleases
1066
+ // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
1067
+ // That should allow `1.2.3-pr.2` to pass.
1068
+ // However, `1.2.4-alpha.notready` should NOT be allowed,
1069
+ // even though it's within the range set by the comparators.
1070
+ for (var i = 0; i < set.length; i++) {
1071
+ debug(set[i].semver);
1072
+ if (set[i].semver === ANY)
1073
+ return true;
1074
+
1075
+ if (set[i].semver.prerelease.length > 0) {
1076
+ var allowed = set[i].semver;
1077
+ if (allowed.major === version.major &&
1078
+ allowed.minor === version.minor &&
1079
+ allowed.patch === version.patch)
1080
+ return true;
1081
+ }
1082
+ }
1083
+
1084
+ // Version has a -pre, but it's not one of the ones we like.
1085
+ return false;
1086
+ }
1087
+
897
1088
  return true;
898
1089
  }
899
1090