semver 2.0.11 → 2.3.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/Makefile CHANGED
@@ -6,7 +6,7 @@ files = semver.browser.js \
6
6
  all: $(files)
7
7
 
8
8
  clean:
9
- rm $(files)
9
+ rm -f $(files)
10
10
 
11
11
  semver.browser.js: head.js semver.js foot.js
12
12
  ( cat head.js; \
package/README.md CHANGED
@@ -34,7 +34,7 @@ As a command-line utility:
34
34
 
35
35
  ## Versions
36
36
 
37
- A "version" is described by the v2.0.0 specification found at
37
+ A "version" is described by the `v2.0.0` specification found at
38
38
  <http://semver.org/>.
39
39
 
40
40
  A leading `"="` or `"v"` character is stripped off and ignored.
@@ -43,9 +43,10 @@ A leading `"="` or `"v"` character is stripped off and ignored.
43
43
 
44
44
  The following range styles are supported:
45
45
 
46
- * `1.2.3` A specific version. When nothing else will do. Note that
47
- build metadata is still ignored, so `1.2.3+build2012` will satisfy
48
- this range.
46
+ * `1.2.3` A specific version. When nothing else will do. Must be a full
47
+ version number, with major, minor, and patch versions specified.
48
+ Note that build metadata is still ignored, so `1.2.3+build2012` will
49
+ satisfy this range.
49
50
  * `>1.2.3` Greater than a specific version.
50
51
  * `<1.2.3` Less than a specific version. If there is no prerelease
51
52
  tag on the version range, then no prerelease version will be allowed
@@ -56,14 +57,33 @@ The following range styles are supported:
56
57
  * `<=1.2.3` Less than or equal to. In this case, prerelease versions
57
58
  ARE allowed, so `1.2.3-beta` would satisfy.
58
59
  * `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`
59
- * `~1.2.3` := `>=1.2.3-0 <1.3.0-0` "Reasonably close to 1.2.3". When
60
+ * `~1.2.3` := `>=1.2.3-0 <1.3.0-0` "Reasonably close to `1.2.3`". When
60
61
  using tilde operators, prerelease versions are supported as well,
61
62
  but a prerelease of the next significant digit will NOT be
62
63
  satisfactory, so `1.3.0-beta` will not satisfy `~1.2.3`.
63
- * `~1.2` := `>=1.2.0-0 <1.3.0-0` "Any version starting with 1.2"
64
- * `1.2.x` := `>=1.2.0-0 <1.3.0-0` "Any version starting with 1.2"
65
- * `~1` := `>=1.0.0-0 <2.0.0-0` "Any version starting with 1"
66
- * `1.x` := `>=1.0.0-0 <2.0.0-0` "Any version starting with 1"
64
+ * `^1.2.3` := `>=1.2.3-0 <2.0.0-0` "Compatible with `1.2.3`". When
65
+ using caret operators, anything from the specified version (including
66
+ prerelease) will be supported up to, but not including, the next
67
+ major version (or its prereleases). `1.5.1` will satisfy `^1.2.3`,
68
+ while `1.2.2` and `2.0.0-beta` will not.
69
+ * `^0.1.3` := `>=0.1.3-0 <0.2.0-0` "Compatible with `0.1.3`". `0.x.x` versions are
70
+ special: the first non-zero component indicates potentially breaking changes,
71
+ meaning the caret operator matches any version with the same first non-zero
72
+ component starting at the specified version.
73
+ * `^0.0.2` := `=0.0.2` "Only the version `0.0.2` is considered compatible"
74
+ * `~1.2` := `>=1.2.0-0 <1.3.0-0` "Any version starting with `1.2`"
75
+ * `^1.2` := `>=1.2.0-0 <2.0.0-0` "Any version compatible with `1.2`"
76
+ * `1.2.x` := `>=1.2.0-0 <1.3.0-0` "Any version starting with `1.2`"
77
+ * `1.2.*` Same as `1.2.x`.
78
+ * `1.2` Same as `1.2.x`.
79
+ * `~1` := `>=1.0.0-0 <2.0.0-0` "Any version starting with `1`"
80
+ * `^1` := `>=1.0.0-0 <2.0.0-0` "Any version compatible with `1`"
81
+ * `1.x` := `>=1.0.0-0 <2.0.0-0` "Any version starting with `1`"
82
+ * `1.*` Same as `1.x`.
83
+ * `1` Same as `1.x`.
84
+ * `*` Any version whatsoever.
85
+ * `x` Same as `*`.
86
+ * `""` (just an empty string) Same as `*`.
67
87
 
68
88
 
69
89
  Ranges can be joined with either a space (which implies "and") or a
@@ -78,34 +98,61 @@ The resulting output will always be 100% strict, of course.
78
98
  Strict-mode Comparators and Ranges will be strict about the SemVer
79
99
  strings that they parse.
80
100
 
81
- * valid(v): Return the parsed version, or null if it's not valid.
82
- * inc(v, release): Return the version incremented by the release type
83
- (major, minor, patch, or prerelease), or null if it's not valid.
101
+ * `valid(v)`: Return the parsed version, or null if it's not valid.
102
+ * `inc(v, release)`: Return the version incremented by the release
103
+ type (`major`, `premajor`, `minor`, `preminor`, `patch`,
104
+ `prepatch`, or `prerelease`), or null if it's not valid
105
+ * `premajor` in one call will bump the version up to the next major
106
+ version and down to a prerelease of that major version.
107
+ `preminor`, and `prepatch` work the same way.
108
+ * If called from a non-prerelease version, the `prerelease` will work the
109
+ same as `prepatch`. It increments the patch version, then makes a
110
+ prerelease. If the input version is already a prerelease it simply
111
+ increments it.
84
112
 
85
113
  ### Comparison
86
114
 
87
- * gt(v1, v2): `v1 > v2`
88
- * gte(v1, v2): `v1 >= v2`
89
- * lt(v1, v2): `v1 < v2`
90
- * lte(v1, v2): `v1 <= v2`
91
- * eq(v1, v2): `v1 == v2` This is true if they're logically equivalent,
115
+ * `gt(v1, v2)`: `v1 > v2`
116
+ * `gte(v1, v2)`: `v1 >= v2`
117
+ * `lt(v1, v2)`: `v1 < v2`
118
+ * `lte(v1, v2)`: `v1 <= v2`
119
+ * `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent,
92
120
  even if they're not the exact same string. You already know how to
93
121
  compare strings.
94
- * neq(v1, v2): `v1 != v2` The opposite of eq.
95
- * cmp(v1, comparator, v2): Pass in a comparison string, and it'll call
122
+ * `neq(v1, v2)`: `v1 != v2` The opposite of `eq`.
123
+ * `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call
96
124
  the corresponding function above. `"==="` and `"!=="` do simple
97
125
  string comparison, but are included for completeness. Throws if an
98
126
  invalid comparison string is provided.
99
- * compare(v1, v2): Return 0 if v1 == v2, or 1 if v1 is greater, or -1 if
100
- v2 is greater. Sorts in ascending order if passed to Array.sort().
101
- * rcompare(v1, v2): The reverse of compare. Sorts an array of versions
102
- in descending order when passed to Array.sort().
127
+ * `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if
128
+ `v2` is greater. Sorts in ascending order if passed to `Array.sort()`.
129
+ * `rcompare(v1, v2)`: The reverse of compare. Sorts an array of versions
130
+ in descending order when passed to `Array.sort()`.
103
131
 
104
132
 
105
133
  ### Ranges
106
134
 
107
- * validRange(range): Return the valid range or null if it's not valid
108
- * satisfies(version, range): Return true if the version satisfies the
135
+ * `validRange(range)`: Return the valid range or null if it's not valid
136
+ * `satisfies(version, range)`: Return true if the version satisfies the
109
137
  range.
110
- * maxSatisfying(versions, range): Return the highest version in the list
111
- that satisfies the range, or null if none of them do.
138
+ * `maxSatisfying(versions, range)`: Return the highest version in the list
139
+ that satisfies the range, or `null` if none of them do.
140
+ * `gtr(version, range)`: Return `true` if version is greater than all the
141
+ versions possible in the range.
142
+ * `ltr(version, range)`: Return `true` if version is less than all the
143
+ versions possible in the range.
144
+ * `outside(version, range, hilo)`: Return true if the version is outside
145
+ the bounds of the range in either the high or low direction. The
146
+ `hilo` argument must be either the string `'>'` or `'<'`. (This is
147
+ the function called by `gtr` and `ltr`.)
148
+
149
+ Note that, since ranges may be non-contiguous, a version might not be
150
+ greater than a range, less than a range, *or* satisfy a range! For
151
+ example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9`
152
+ until `2.0.0`, so the version `1.2.10` would not be greater than the
153
+ range (because `2.0.1` satisfies, which is higher), nor less than the
154
+ range (since `1.2.8` satisfies, which is lower), and it also does not
155
+ satisfy the range.
156
+
157
+ If you want to know if a version satisfies or does not satisfy a
158
+ range, use the `satisfies(version, range)` function.
package/bin/semver CHANGED
@@ -13,6 +13,7 @@ var argv = process.argv.slice(2)
13
13
  , version = require("../package.json").version
14
14
  , loose = false
15
15
  , semver = require("../semver")
16
+ , reverse = false
16
17
 
17
18
  main()
18
19
 
@@ -26,6 +27,9 @@ function main () {
26
27
  argv.unshift(a.slice(i + 1))
27
28
  }
28
29
  switch (a) {
30
+ case "-rv": case "-rev": case "--rev": case "--reverse":
31
+ reverse = true
32
+ break
29
33
  case "-l": case "--loose":
30
34
  loose = true
31
35
  break
@@ -35,6 +39,7 @@ function main () {
35
39
  case "-i": case "--inc": case "--increment":
36
40
  switch (argv[0]) {
37
41
  case "major": case "minor": case "patch": case "prerelease":
42
+ case "premajor": case "preminor": case "prepatch":
38
43
  inc = argv.shift()
39
44
  break
40
45
  default:
@@ -77,8 +82,9 @@ function failInc () {
77
82
  function fail () { process.exit(1) }
78
83
 
79
84
  function success () {
85
+ var compare = reverse ? "rcompare" : "compare"
80
86
  versions.sort(function (a, b) {
81
- return semver.compare(a, b, loose)
87
+ return semver[compare](a, b, loose)
82
88
  }).map(function (v) {
83
89
  return semver.clean(v, loose)
84
90
  }).map(function (v) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "semver",
3
- "version": "2.0.11",
3
+ "version": "2.3.0",
4
4
  "description": "The semantic version parser used by npm.",
5
5
  "main": "semver.js",
6
6
  "browser": "semver.browser.js",
package/semver.browser.js CHANGED
@@ -151,14 +151,29 @@ var LONETILDE = R++;
151
151
  src[LONETILDE] = '(?:~>?)';
152
152
 
153
153
  var TILDETRIM = R++;
154
- src[TILDETRIM] = src[LONETILDE] + '\\s+';
155
- var tildeTrimReplace = '~';
154
+ src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+';
155
+ re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g');
156
+ var tildeTrimReplace = '$1~';
156
157
 
157
158
  var TILDE = R++;
158
159
  src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$';
159
160
  var TILDELOOSE = R++;
160
161
  src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$';
161
162
 
163
+ // Caret ranges.
164
+ // Meaning is "at least and backwards compatible with"
165
+ var LONECARET = R++;
166
+ src[LONECARET] = '(?:\\^)';
167
+
168
+ var CARETTRIM = R++;
169
+ src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+';
170
+ re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g');
171
+ var caretTrimReplace = '$1^';
172
+
173
+ var CARET = R++;
174
+ src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$';
175
+ var CARETLOOSE = R++;
176
+ src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$';
162
177
 
163
178
  // A simple gt/lt/eq thing, or just "" to indicate "any version"
164
179
  var COMPARATORLOOSE = R++;
@@ -233,6 +248,8 @@ function SemVer(version, loose) {
233
248
  return version;
234
249
  else
235
250
  version = version.version;
251
+ } else if (typeof version !== 'string') {
252
+ throw new TypeError('Invalid Version: ' + version);
236
253
  }
237
254
 
238
255
  if (!(this instanceof SemVer))
@@ -305,7 +322,7 @@ SemVer.prototype.comparePre = function(other) {
305
322
  return -1;
306
323
  else if (!this.prerelease.length && other.prerelease.length)
307
324
  return 1;
308
- else if (!this.prerelease.lenth && !other.prerelease.length)
325
+ else if (!this.prerelease.length && !other.prerelease.length)
309
326
  return 0;
310
327
 
311
328
  var i = 0;
@@ -326,19 +343,49 @@ SemVer.prototype.comparePre = function(other) {
326
343
  } while (++i);
327
344
  };
328
345
 
346
+ // preminor will bump the version up to the next minor release, and immediately
347
+ // down to pre-release. premajor and prepatch work the same way.
329
348
  SemVer.prototype.inc = function(release) {
330
349
  switch (release) {
350
+ case 'premajor':
351
+ this.inc('major');
352
+ this.inc('pre');
353
+ break;
354
+ case 'preminor':
355
+ this.inc('minor');
356
+ this.inc('pre');
357
+ break;
358
+ case 'prepatch':
359
+ this.inc('patch');
360
+ this.inc('pre');
361
+ break;
362
+ // If the input is a non-prerelease version, this acts the same as
363
+ // prepatch.
364
+ case 'prerelease':
365
+ if (this.prerelease.length === 0)
366
+ this.inc('patch');
367
+ this.inc('pre');
368
+ break;
331
369
  case 'major':
332
370
  this.major++;
333
371
  this.minor = -1;
334
372
  case 'minor':
335
373
  this.minor++;
336
- this.patch = -1;
374
+ this.patch = 0;
375
+ this.prerelease = [];
376
+ break;
337
377
  case 'patch':
338
- this.patch++;
378
+ // If this is not a pre-release version, it will increment the patch.
379
+ // If it is a pre-release it will bump up to the same patch version.
380
+ // 1.2.0-5 patches to 1.2.0
381
+ // 1.2.0 patches to 1.2.1
382
+ if (this.prerelease.length === 0)
383
+ this.patch++;
339
384
  this.prerelease = [];
340
385
  break;
341
- case 'prerelease':
386
+ // This probably shouldn't be used publically.
387
+ // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
388
+ case 'pre':
342
389
  if (this.prerelease.length === 0)
343
390
  this.prerelease = [0];
344
391
  else {
@@ -592,6 +639,9 @@ Range.prototype.parseRange = function(range) {
592
639
  // `~ 1.2.3` => `~1.2.3`
593
640
  range = range.replace(re[TILDETRIM], tildeTrimReplace);
594
641
 
642
+ // `^ 1.2.3` => `^1.2.3`
643
+ range = range.replace(re[CARETTRIM], caretTrimReplace);
644
+
595
645
  // normalize spaces
596
646
  range = range.split(/\s+/).join(' ');
597
647
 
@@ -629,6 +679,8 @@ function toComparators(range, loose) {
629
679
  // already replaced the hyphen ranges
630
680
  // turn into a set of JUST comparators.
631
681
  function parseComparator(comp, loose) {
682
+ ;
683
+ comp = replaceCarets(comp, loose);
632
684
  ;
633
685
  comp = replaceTildes(comp, loose);
634
686
  ;
@@ -684,6 +736,63 @@ function replaceTilde(comp, loose) {
684
736
  });
685
737
  }
686
738
 
739
+ // ^ --> * (any, kinda silly)
740
+ // ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
741
+ // ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
742
+ // ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
743
+ // ^1.2.3 --> >=1.2.3 <2.0.0
744
+ // ^1.2.0 --> >=1.2.0 <2.0.0
745
+ function replaceCarets(comp, loose) {
746
+ return comp.trim().split(/\s+/).map(function(comp) {
747
+ return replaceCaret(comp, loose);
748
+ }).join(' ');
749
+ }
750
+
751
+ function replaceCaret(comp, loose) {
752
+ var r = loose ? re[CARETLOOSE] : re[CARET];
753
+ return comp.replace(r, function(_, M, m, p, pr) {
754
+ ;
755
+ var ret;
756
+
757
+ if (isX(M))
758
+ ret = '';
759
+ else if (isX(m))
760
+ ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0';
761
+ else if (isX(p)) {
762
+ if (M === '0')
763
+ ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0';
764
+ else
765
+ ret = '>=' + M + '.' + m + '.0-0 <' + (+M + 1) + '.0.0-0';
766
+ } else if (pr) {
767
+ ;
768
+ if (pr.charAt(0) !== '-')
769
+ pr = '-' + pr;
770
+ if (M === '0') {
771
+ if (m === '0')
772
+ ret = '=' + M + '.' + m + '.' + p + pr;
773
+ else
774
+ ret = '>=' + M + '.' + m + '.' + p + pr +
775
+ ' <' + M + '.' + (+m + 1) + '.0-0';
776
+ } else
777
+ ret = '>=' + M + '.' + m + '.' + p + pr +
778
+ ' <' + (+M + 1) + '.0.0-0';
779
+ } else {
780
+ if (M === '0') {
781
+ if (m === '0')
782
+ ret = '=' + M + '.' + m + '.' + p;
783
+ else
784
+ ret = '>=' + M + '.' + m + '.' + p + '-0' +
785
+ ' <' + M + '.' + (+m + 1) + '.0-0';
786
+ } else
787
+ ret = '>=' + M + '.' + m + '.' + p + '-0' +
788
+ ' <' + (+M + 1) + '.0.0-0';
789
+ }
790
+
791
+ ;
792
+ return ret;
793
+ });
794
+ }
795
+
687
796
  function replaceXRanges(comp, loose) {
688
797
  ;
689
798
  return comp.split(/\s+/).map(function(comp) {
@@ -840,6 +949,85 @@ function validRange(range, loose) {
840
949
  }
841
950
  }
842
951
 
952
+ // Determine if version is less than all the versions possible in the range
953
+ exports.ltr = ltr;
954
+ function ltr(version, range, loose) {
955
+ return outside(version, range, '<', loose);
956
+ }
957
+
958
+ // Determine if version is greater than all the versions possible in the range.
959
+ exports.gtr = gtr;
960
+ function gtr(version, range, loose) {
961
+ return outside(version, range, '>', loose);
962
+ }
963
+
964
+ exports.outside = outside;
965
+ function outside(version, range, hilo, loose) {
966
+ version = new SemVer(version, loose);
967
+ range = new Range(range, loose);
968
+
969
+ var gtfn, ltefn, ltfn, comp, ecomp;
970
+ switch (hilo) {
971
+ case '>':
972
+ gtfn = gt;
973
+ ltefn = lte;
974
+ ltfn = lt;
975
+ comp = '>';
976
+ ecomp = '>=';
977
+ break;
978
+ case '<':
979
+ gtfn = lt;
980
+ ltefn = gte;
981
+ ltfn = gt;
982
+ comp = '<';
983
+ ecomp = '<=';
984
+ break;
985
+ default:
986
+ throw new TypeError('Must provide a hilo val of "<" or ">"');
987
+ }
988
+
989
+ // If it satisifes the range it is not outside
990
+ if (satisfies(version, range, loose)) {
991
+ return false;
992
+ }
993
+
994
+ // From now on, variable terms are as if we're in "gtr" mode.
995
+ // but note that everything is flipped for the "ltr" function.
996
+
997
+ for (var i = 0; i < range.set.length; ++i) {
998
+ var comparators = range.set[i];
999
+
1000
+ var high = null;
1001
+ var low = null;
1002
+
1003
+ comparators.forEach(function(comparator) {
1004
+ high = high || comparator;
1005
+ low = low || comparator;
1006
+ if (gtfn(comparator.semver, high.semver, loose)) {
1007
+ high = comparator;
1008
+ } else if (ltfn(comparator.semver, low.semver, loose)) {
1009
+ low = comparator;
1010
+ }
1011
+ });
1012
+
1013
+ // If the edge version comparator has a operator then our version
1014
+ // isn't outside it
1015
+ if (high.operator === comp || high.operator === ecomp) {
1016
+ return false;
1017
+ }
1018
+
1019
+ // If the lowest version comparator has an operator and our version
1020
+ // is less than it then it isn't higher than the range
1021
+ if ((!low.operator || low.operator === comp) &&
1022
+ ltefn(version, low.semver)) {
1023
+ return false;
1024
+ } else if (low.operator === ecomp && ltfn(version, low.semver)) {
1025
+ return false;
1026
+ }
1027
+ }
1028
+ return true;
1029
+ }
1030
+
843
1031
  // Use the define() function if we're in AMD land
844
1032
  if (typeof define === 'function' && define.amd)
845
1033
  define(exports);
Binary file
package/semver.js CHANGED
@@ -161,14 +161,29 @@ var LONETILDE = R++;
161
161
  src[LONETILDE] = '(?:~>?)';
162
162
 
163
163
  var TILDETRIM = R++;
164
- src[TILDETRIM] = src[LONETILDE] + '\\s+';
165
- var tildeTrimReplace = '~';
164
+ src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+';
165
+ re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g');
166
+ var tildeTrimReplace = '$1~';
166
167
 
167
168
  var TILDE = R++;
168
169
  src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$';
169
170
  var TILDELOOSE = R++;
170
171
  src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$';
171
172
 
173
+ // Caret ranges.
174
+ // Meaning is "at least and backwards compatible with"
175
+ var LONECARET = R++;
176
+ src[LONECARET] = '(?:\\^)';
177
+
178
+ var CARETTRIM = R++;
179
+ src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+';
180
+ re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g');
181
+ var caretTrimReplace = '$1^';
182
+
183
+ var CARET = R++;
184
+ src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$';
185
+ var CARETLOOSE = R++;
186
+ src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$';
172
187
 
173
188
  // A simple gt/lt/eq thing, or just "" to indicate "any version"
174
189
  var COMPARATORLOOSE = R++;
@@ -243,6 +258,8 @@ function SemVer(version, loose) {
243
258
  return version;
244
259
  else
245
260
  version = version.version;
261
+ } else if (typeof version !== 'string') {
262
+ throw new TypeError('Invalid Version: ' + version);
246
263
  }
247
264
 
248
265
  if (!(this instanceof SemVer))
@@ -315,7 +332,7 @@ SemVer.prototype.comparePre = function(other) {
315
332
  return -1;
316
333
  else if (!this.prerelease.length && other.prerelease.length)
317
334
  return 1;
318
- else if (!this.prerelease.lenth && !other.prerelease.length)
335
+ else if (!this.prerelease.length && !other.prerelease.length)
319
336
  return 0;
320
337
 
321
338
  var i = 0;
@@ -336,19 +353,49 @@ SemVer.prototype.comparePre = function(other) {
336
353
  } while (++i);
337
354
  };
338
355
 
356
+ // preminor will bump the version up to the next minor release, and immediately
357
+ // down to pre-release. premajor and prepatch work the same way.
339
358
  SemVer.prototype.inc = function(release) {
340
359
  switch (release) {
360
+ case 'premajor':
361
+ this.inc('major');
362
+ this.inc('pre');
363
+ break;
364
+ case 'preminor':
365
+ this.inc('minor');
366
+ this.inc('pre');
367
+ break;
368
+ case 'prepatch':
369
+ this.inc('patch');
370
+ this.inc('pre');
371
+ break;
372
+ // If the input is a non-prerelease version, this acts the same as
373
+ // prepatch.
374
+ case 'prerelease':
375
+ if (this.prerelease.length === 0)
376
+ this.inc('patch');
377
+ this.inc('pre');
378
+ break;
341
379
  case 'major':
342
380
  this.major++;
343
381
  this.minor = -1;
344
382
  case 'minor':
345
383
  this.minor++;
346
- this.patch = -1;
384
+ this.patch = 0;
385
+ this.prerelease = [];
386
+ break;
347
387
  case 'patch':
348
- this.patch++;
388
+ // If this is not a pre-release version, it will increment the patch.
389
+ // If it is a pre-release it will bump up to the same patch version.
390
+ // 1.2.0-5 patches to 1.2.0
391
+ // 1.2.0 patches to 1.2.1
392
+ if (this.prerelease.length === 0)
393
+ this.patch++;
349
394
  this.prerelease = [];
350
395
  break;
351
- case 'prerelease':
396
+ // This probably shouldn't be used publically.
397
+ // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
398
+ case 'pre':
352
399
  if (this.prerelease.length === 0)
353
400
  this.prerelease = [0];
354
401
  else {
@@ -602,6 +649,9 @@ Range.prototype.parseRange = function(range) {
602
649
  // `~ 1.2.3` => `~1.2.3`
603
650
  range = range.replace(re[TILDETRIM], tildeTrimReplace);
604
651
 
652
+ // `^ 1.2.3` => `^1.2.3`
653
+ range = range.replace(re[CARETTRIM], caretTrimReplace);
654
+
605
655
  // normalize spaces
606
656
  range = range.split(/\s+/).join(' ');
607
657
 
@@ -640,6 +690,8 @@ function toComparators(range, loose) {
640
690
  // turn into a set of JUST comparators.
641
691
  function parseComparator(comp, loose) {
642
692
  debug('comp', comp);
693
+ comp = replaceCarets(comp, loose);
694
+ debug('caret', comp);
643
695
  comp = replaceTildes(comp, loose);
644
696
  debug('tildes', comp);
645
697
  comp = replaceXRanges(comp, loose);
@@ -694,6 +746,63 @@ function replaceTilde(comp, loose) {
694
746
  });
695
747
  }
696
748
 
749
+ // ^ --> * (any, kinda silly)
750
+ // ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
751
+ // ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
752
+ // ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
753
+ // ^1.2.3 --> >=1.2.3 <2.0.0
754
+ // ^1.2.0 --> >=1.2.0 <2.0.0
755
+ function replaceCarets(comp, loose) {
756
+ return comp.trim().split(/\s+/).map(function(comp) {
757
+ return replaceCaret(comp, loose);
758
+ }).join(' ');
759
+ }
760
+
761
+ function replaceCaret(comp, loose) {
762
+ var r = loose ? re[CARETLOOSE] : re[CARET];
763
+ return comp.replace(r, function(_, M, m, p, pr) {
764
+ debug('caret', comp, _, M, m, p, pr);
765
+ var ret;
766
+
767
+ if (isX(M))
768
+ ret = '';
769
+ else if (isX(m))
770
+ ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0';
771
+ else if (isX(p)) {
772
+ if (M === '0')
773
+ ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0';
774
+ else
775
+ ret = '>=' + M + '.' + m + '.0-0 <' + (+M + 1) + '.0.0-0';
776
+ } else if (pr) {
777
+ debug('replaceCaret pr', pr);
778
+ if (pr.charAt(0) !== '-')
779
+ pr = '-' + pr;
780
+ if (M === '0') {
781
+ if (m === '0')
782
+ ret = '=' + M + '.' + m + '.' + p + pr;
783
+ else
784
+ ret = '>=' + M + '.' + m + '.' + p + pr +
785
+ ' <' + M + '.' + (+m + 1) + '.0-0';
786
+ } else
787
+ ret = '>=' + M + '.' + m + '.' + p + pr +
788
+ ' <' + (+M + 1) + '.0.0-0';
789
+ } else {
790
+ if (M === '0') {
791
+ if (m === '0')
792
+ ret = '=' + M + '.' + m + '.' + p;
793
+ else
794
+ ret = '>=' + M + '.' + m + '.' + p + '-0' +
795
+ ' <' + M + '.' + (+m + 1) + '.0-0';
796
+ } else
797
+ ret = '>=' + M + '.' + m + '.' + p + '-0' +
798
+ ' <' + (+M + 1) + '.0.0-0';
799
+ }
800
+
801
+ debug('caret return', ret);
802
+ return ret;
803
+ });
804
+ }
805
+
697
806
  function replaceXRanges(comp, loose) {
698
807
  debug('replaceXRanges', comp, loose);
699
808
  return comp.split(/\s+/).map(function(comp) {
@@ -850,6 +959,85 @@ function validRange(range, loose) {
850
959
  }
851
960
  }
852
961
 
962
+ // Determine if version is less than all the versions possible in the range
963
+ exports.ltr = ltr;
964
+ function ltr(version, range, loose) {
965
+ return outside(version, range, '<', loose);
966
+ }
967
+
968
+ // Determine if version is greater than all the versions possible in the range.
969
+ exports.gtr = gtr;
970
+ function gtr(version, range, loose) {
971
+ return outside(version, range, '>', loose);
972
+ }
973
+
974
+ exports.outside = outside;
975
+ function outside(version, range, hilo, loose) {
976
+ version = new SemVer(version, loose);
977
+ range = new Range(range, loose);
978
+
979
+ var gtfn, ltefn, ltfn, comp, ecomp;
980
+ switch (hilo) {
981
+ case '>':
982
+ gtfn = gt;
983
+ ltefn = lte;
984
+ ltfn = lt;
985
+ comp = '>';
986
+ ecomp = '>=';
987
+ break;
988
+ case '<':
989
+ gtfn = lt;
990
+ ltefn = gte;
991
+ ltfn = gt;
992
+ comp = '<';
993
+ ecomp = '<=';
994
+ break;
995
+ default:
996
+ throw new TypeError('Must provide a hilo val of "<" or ">"');
997
+ }
998
+
999
+ // If it satisifes the range it is not outside
1000
+ if (satisfies(version, range, loose)) {
1001
+ return false;
1002
+ }
1003
+
1004
+ // From now on, variable terms are as if we're in "gtr" mode.
1005
+ // but note that everything is flipped for the "ltr" function.
1006
+
1007
+ for (var i = 0; i < range.set.length; ++i) {
1008
+ var comparators = range.set[i];
1009
+
1010
+ var high = null;
1011
+ var low = null;
1012
+
1013
+ comparators.forEach(function(comparator) {
1014
+ high = high || comparator;
1015
+ low = low || comparator;
1016
+ if (gtfn(comparator.semver, high.semver, loose)) {
1017
+ high = comparator;
1018
+ } else if (ltfn(comparator.semver, low.semver, loose)) {
1019
+ low = comparator;
1020
+ }
1021
+ });
1022
+
1023
+ // If the edge version comparator has a operator then our version
1024
+ // isn't outside it
1025
+ if (high.operator === comp || high.operator === ecomp) {
1026
+ return false;
1027
+ }
1028
+
1029
+ // If the lowest version comparator has an operator and our version
1030
+ // is less than it then it isn't higher than the range
1031
+ if ((!low.operator || low.operator === comp) &&
1032
+ ltefn(version, low.semver)) {
1033
+ return false;
1034
+ } else if (low.operator === ecomp && ltfn(version, low.semver)) {
1035
+ return false;
1036
+ }
1037
+ }
1038
+ return true;
1039
+ }
1040
+
853
1041
  // Use the define() function if we're in AMD land
854
1042
  if (typeof define === 'function' && define.amd)
855
1043
  define(exports);
package/semver.min.js CHANGED
@@ -1 +1 @@
1
- !function(e){if(typeof module==="object"&&module.exports===e)e=module.exports=O;e.SEMVER_SPEC_VERSION="2.0.0";var r=e.re=[];var t=e.src=[];var n=0;var i=n++;t[i]="0|[1-9]\\d*";var s=n++;t[s]="[0-9]+";var o=n++;t[o]="\\d*[a-zA-Z-][a-zA-Z0-9-]*";var a=n++;t[a]="("+t[i]+")\\."+"("+t[i]+")\\."+"("+t[i]+")";var u=n++;t[u]="("+t[s]+")\\."+"("+t[s]+")\\."+"("+t[s]+")";var f=n++;t[f]="(?:"+t[i]+"|"+t[o]+")";var c=n++;t[c]="(?:"+t[s]+"|"+t[o]+")";var l=n++;t[l]="(?:-("+t[f]+"(?:\\."+t[f]+")*))";var p=n++;t[p]="(?:-?("+t[c]+"(?:\\."+t[c]+")*))";var h=n++;t[h]="[0-9A-Za-z-]+";var v=n++;t[v]="(?:\\+("+t[h]+"(?:\\."+t[h]+")*))";var m=n++;var g="v?"+t[a]+t[l]+"?"+t[v]+"?";t[m]="^"+g+"$";var d="[v=\\s]*"+t[u]+t[p]+"?"+t[v]+"?";var w=n++;t[w]="^"+d+"$";var y=n++;t[y]="((?:<|>)?=?)";var $=n++;t[$]=t[s]+"|x|X|\\*";var j=n++;t[j]=t[i]+"|x|X|\\*";var b=n++;t[b]="[v=\\s]*("+t[j]+")"+"(?:\\.("+t[j]+")"+"(?:\\.("+t[j]+")"+"(?:("+t[l]+")"+")?)?)?";var S=n++;t[S]="[v=\\s]*("+t[$]+")"+"(?:\\.("+t[$]+")"+"(?:\\.("+t[$]+")"+"(?:("+t[p]+")"+")?)?)?";var E=n++;t[E]="^"+t[y]+"\\s*"+t[b]+"$";var k=n++;t[k]="^"+t[y]+"\\s*"+t[S]+"$";var x=n++;t[x]="(?:~>?)";var R=n++;t[R]=t[x]+"\\s+";var V="~";var I=n++;t[I]="^"+t[x]+t[b]+"$";var C=n++;t[C]="^"+t[x]+t[S]+"$";var A=n++;t[A]="^"+t[y]+"\\s*("+d+")$|^$";var T=n++;t[T]="^"+t[y]+"\\s*("+g+")$|^$";var z=n++;t[z]="(\\s*)"+t[y]+"\\s*("+d+"|"+t[b]+")";r[z]=new RegExp(t[z],"g");var M="$1$2$3";var P=n++;t[P]="^\\s*("+t[b]+")"+"\\s+-\\s+"+"("+t[b]+")"+"\\s*$";var Z=n++;t[Z]="^\\s*("+t[S]+")"+"\\s+-\\s+"+"("+t[S]+")"+"\\s*$";var q=n++;t[q]="(<|>)?=?\\s*\\*";for(var L=0;L<n;L++){if(!r[L])r[L]=new RegExp(t[L])}e.parse=X;function X(e,t){var n=t?r[w]:r[m];return n.test(e)?new O(e,t):null}e.valid=_;function _(e,r){var t=X(e,r);return t?t.version:null}e.clean=N;function N(e,r){var t=X(e,r);return t?t.version:null}e.SemVer=O;function O(e,t){if(e instanceof O){if(e.loose===t)return e;else e=e.version}if(!(this instanceof O))return new O(e,t);this.loose=t;var n=e.trim().match(t?r[w]:r[m]);if(!n)throw new TypeError("Invalid Version: "+e);this.raw=e;this.major=+n[1];this.minor=+n[2];this.patch=+n[3];if(!n[4])this.prerelease=[];else this.prerelease=n[4].split(".").map(function(e){return/^[0-9]+$/.test(e)?+e:e});this.build=n[5]?n[5].split("."):[];this.format()}O.prototype.format=function(){this.version=this.major+"."+this.minor+"."+this.patch;if(this.prerelease.length)this.version+="-"+this.prerelease.join(".");return this.version};O.prototype.inspect=function(){return'<SemVer "'+this+'">'};O.prototype.toString=function(){return this.version};O.prototype.compare=function(e){if(!(e instanceof O))e=new O(e,this.loose);return this.compareMain(e)||this.comparePre(e)};O.prototype.compareMain=function(e){if(!(e instanceof O))e=new O(e,this.loose);return F(this.major,e.major)||F(this.minor,e.minor)||F(this.patch,e.patch)};O.prototype.comparePre=function(e){if(!(e instanceof O))e=new O(e,this.loose);if(this.prerelease.length&&!e.prerelease.length)return-1;else if(!this.prerelease.length&&e.prerelease.length)return 1;else if(!this.prerelease.lenth&&!e.prerelease.length)return 0;var r=0;do{var t=this.prerelease[r];var n=e.prerelease[r];if(t===undefined&&n===undefined)return 0;else if(n===undefined)return 1;else if(t===undefined)return-1;else if(t===n)continue;else return F(t,n)}while(++r)};O.prototype.inc=function(e){switch(e){case"major":this.major++;this.minor=-1;case"minor":this.minor++;this.patch=-1;case"patch":this.patch++;this.prerelease=[];break;case"prerelease":if(this.prerelease.length===0)this.prerelease=[0];else{var r=this.prerelease.length;while(--r>=0){if(typeof this.prerelease[r]==="number"){this.prerelease[r]++;r=-2}}if(r===-1)this.prerelease.push(0)}break;default:throw new Error("invalid increment argument: "+e)}this.format();return this};e.inc=B;function B(e,r,t){try{return new O(e,t).inc(r).version}catch(n){return null}}e.compareIdentifiers=F;var D=/^[0-9]+$/;function F(e,r){var t=D.test(e);var n=D.test(r);if(t&&n){e=+e;r=+r}return t&&!n?-1:n&&!t?1:e<r?-1:e>r?1:0}e.rcompareIdentifiers=G;function G(e,r){return F(r,e)}e.compare=H;function H(e,r,t){return new O(e,t).compare(r)}e.compareLoose=J;function J(e,r){return H(e,r,true)}e.rcompare=K;function K(e,r,t){return H(r,e,t)}e.sort=Q;function Q(r,t){return r.sort(function(r,n){return e.compare(r,n,t)})}e.rsort=U;function U(r,t){return r.sort(function(r,n){return e.rcompare(r,n,t)})}e.gt=W;function W(e,r,t){return H(e,r,t)>0}e.lt=Y;function Y(e,r,t){return H(e,r,t)<0}e.eq=er;function er(e,r,t){return H(e,r,t)===0}e.neq=rr;function rr(e,r,t){return H(e,r,t)!==0}e.gte=tr;function tr(e,r,t){return H(e,r,t)>=0}e.lte=nr;function nr(e,r,t){return H(e,r,t)<=0}e.cmp=ir;function ir(e,r,t,n){var i;switch(r){case"===":i=e===t;break;case"!==":i=e!==t;break;case"":case"=":case"==":i=er(e,t,n);break;case"!=":i=rr(e,t,n);break;case">":i=W(e,t,n);break;case">=":i=tr(e,t,n);break;case"<":i=Y(e,t,n);break;case"<=":i=nr(e,t,n);break;default:throw new TypeError("Invalid operator: "+r)}return i}e.Comparator=sr;function sr(e,r){if(e instanceof sr){if(e.loose===r)return e;else e=e.value}if(!(this instanceof sr))return new sr(e,r);this.loose=r;this.parse(e);if(this.semver===or)this.value="";else this.value=this.operator+this.semver.version}var or={};sr.prototype.parse=function(e){var t=this.loose?r[A]:r[T];var n=e.match(t);if(!n)throw new TypeError("Invalid comparator: "+e);this.operator=n[1];if(!n[2])this.semver=or;else{this.semver=new O(n[2],this.loose);if(this.operator==="<"&&!this.semver.prerelease.length){this.semver.prerelease=["0"];this.semver.format()}}};sr.prototype.inspect=function(){return'<SemVer Comparator "'+this+'">'};sr.prototype.toString=function(){return this.value};sr.prototype.test=function(e){return this.semver===or?true:ir(e,this.operator,this.semver,this.loose)};e.Range=ar;function ar(e,r){if(e instanceof ar&&e.loose===r)return e;if(!(this instanceof ar))return new ar(e,r);this.loose=r;this.raw=e;this.set=e.split(/\s*\|\|\s*/).map(function(e){return this.parseRange(e.trim())},this).filter(function(e){return e.length});if(!this.set.length){throw new TypeError("Invalid SemVer Range: "+e)}this.format()}ar.prototype.inspect=function(){return'<SemVer Range "'+this.range+'">'};ar.prototype.format=function(){this.range=this.set.map(function(e){return e.join(" ").trim()}).join("||").trim();return this.range};ar.prototype.toString=function(){return this.range};ar.prototype.parseRange=function(e){var t=this.loose;e=e.trim();var n=t?r[Z]:r[P];e=e.replace(n,gr);e=e.replace(r[z],M);e=e.replace(r[R],V);e=e.split(/\s+/).join(" ");var i=t?r[A]:r[T];var s=e.split(" ").map(function(e){return fr(e,t)}).join(" ").split(/\s+/);if(this.loose){s=s.filter(function(e){return!!e.match(i)})}s=s.map(function(e){return new sr(e,t)});return s};e.toComparators=ur;function ur(e,r){return new ar(e,r).set.map(function(e){return e.map(function(e){return e.value}).join(" ").trim().split(" ")})}function fr(e,r){e=lr(e,r);e=hr(e,r);e=mr(e,r);return e}function cr(e){return!e||e.toLowerCase()==="x"||e==="*"}function lr(e,r){return e.trim().split(/\s+/).map(function(e){return pr(e,r)}).join(" ")}function pr(e,t){var n=t?r[C]:r[I];return e.replace(n,function(e,r,t,n,i){var s;if(cr(r))s="";else if(cr(t))s=">="+r+".0.0-0 <"+(+r+1)+".0.0-0";else if(cr(n))s=">="+r+"."+t+".0-0 <"+r+"."+(+t+1)+".0-0";else if(i){if(i.charAt(0)!=="-")i="-"+i;s=">="+r+"."+t+"."+n+i+" <"+r+"."+(+t+1)+".0-0"}else s=">="+r+"."+t+"."+n+"-0"+" <"+r+"."+(+t+1)+".0-0";return s})}function hr(e,r){return e.split(/\s+/).map(function(e){return vr(e,r)}).join(" ")}function vr(e,t){e=e.trim();var n=t?r[k]:r[E];return e.replace(n,function(e,r,t,n,i,s){var o=cr(t);var a=o||cr(n);var u=a||cr(i);var f=u;if(r==="="&&f)r="";if(r&&f){if(o)t=0;if(a)n=0;if(u)i=0;if(r===">"){r=">=";if(o){}else if(a){t=+t+1;n=0;i=0}else if(u){n=+n+1;i=0}}e=r+t+"."+n+"."+i+"-0"}else if(o){e="*"}else if(a){e=">="+t+".0.0-0 <"+(+t+1)+".0.0-0"}else if(u){e=">="+t+"."+n+".0-0 <"+t+"."+(+n+1)+".0-0"}return e})}function mr(e,t){return e.trim().replace(r[q],"")}function gr(e,r,t,n,i,s,o,a,u,f,c,l,p){if(cr(t))r="";else if(cr(n))r=">="+t+".0.0-0";else if(cr(i))r=">="+t+"."+n+".0-0";else r=">="+r;if(cr(u))a="";else if(cr(f))a="<"+(+u+1)+".0.0-0";else if(cr(c))a="<"+u+"."+(+f+1)+".0-0";else if(l)a="<="+u+"."+f+"."+c+"-"+l;else a="<="+a;return(r+" "+a).trim()}ar.prototype.test=function(e){if(!e)return false;for(var r=0;r<this.set.length;r++){if(dr(this.set[r],e))return true}return false};function dr(e,r){for(var t=0;t<e.length;t++){if(!e[t].test(r))return false}return true}e.satisfies=wr;function wr(e,r,t){try{r=new ar(r,t)}catch(n){return false}return r.test(e)}e.maxSatisfying=yr;function yr(e,r,t){return e.filter(function(e){return wr(e,r,t)}).sort(function(e,r){return K(e,r,t)})[0]||null}e.validRange=$r;function $r(e,r){try{return new ar(e,r).range||"*"}catch(t){return null}}if(typeof define==="function"&&define.amd)define(e)}(typeof exports==="object"?exports:typeof define==="function"&&define.amd?{}:semver={});
1
+ (function(e){if(typeof module==="object"&&module.exports===e)e=module.exports=H;e.SEMVER_SPEC_VERSION="2.0.0";var r=e.re=[];var t=e.src=[];var n=0;var i=n++;t[i]="0|[1-9]\\d*";var s=n++;t[s]="[0-9]+";var a=n++;t[a]="\\d*[a-zA-Z-][a-zA-Z0-9-]*";var o=n++;t[o]="("+t[i]+")\\."+"("+t[i]+")\\."+"("+t[i]+")";var f=n++;t[f]="("+t[s]+")\\."+"("+t[s]+")\\."+"("+t[s]+")";var u=n++;t[u]="(?:"+t[i]+"|"+t[a]+")";var c=n++;t[c]="(?:"+t[s]+"|"+t[a]+")";var l=n++;t[l]="(?:-("+t[u]+"(?:\\."+t[u]+")*))";var p=n++;t[p]="(?:-?("+t[c]+"(?:\\."+t[c]+")*))";var h=n++;t[h]="[0-9A-Za-z-]+";var v=n++;t[v]="(?:\\+("+t[h]+"(?:\\."+t[h]+")*))";var m=n++;var g="v?"+t[o]+t[l]+"?"+t[v]+"?";t[m]="^"+g+"$";var w="[v=\\s]*"+t[f]+t[p]+"?"+t[v]+"?";var d=n++;t[d]="^"+w+"$";var y=n++;t[y]="((?:<|>)?=?)";var b=n++;t[b]=t[s]+"|x|X|\\*";var $=n++;t[$]=t[i]+"|x|X|\\*";var j=n++;t[j]="[v=\\s]*("+t[$]+")"+"(?:\\.("+t[$]+")"+"(?:\\.("+t[$]+")"+"(?:("+t[l]+")"+")?)?)?";var k=n++;t[k]="[v=\\s]*("+t[b]+")"+"(?:\\.("+t[b]+")"+"(?:\\.("+t[b]+")"+"(?:("+t[p]+")"+")?)?)?";var E=n++;t[E]="^"+t[y]+"\\s*"+t[j]+"$";var x=n++;t[x]="^"+t[y]+"\\s*"+t[k]+"$";var R=n++;t[R]="(?:~>?)";var S=n++;t[S]="(\\s*)"+t[R]+"\\s+";r[S]=new RegExp(t[S],"g");var V="$1~";var I=n++;t[I]="^"+t[R]+t[j]+"$";var T=n++;t[T]="^"+t[R]+t[k]+"$";var A=n++;t[A]="(?:\\^)";var C=n++;t[C]="(\\s*)"+t[A]+"\\s+";r[C]=new RegExp(t[C],"g");var M="$1^";var z=n++;t[z]="^"+t[A]+t[j]+"$";var P=n++;t[P]="^"+t[A]+t[k]+"$";var Z=n++;t[Z]="^"+t[y]+"\\s*("+w+")$|^$";var q=n++;t[q]="^"+t[y]+"\\s*("+g+")$|^$";var L=n++;t[L]="(\\s*)"+t[y]+"\\s*("+w+"|"+t[j]+")";r[L]=new RegExp(t[L],"g");var X="$1$2$3";var _=n++;t[_]="^\\s*("+t[j]+")"+"\\s+-\\s+"+"("+t[j]+")"+"\\s*$";var N=n++;t[N]="^\\s*("+t[k]+")"+"\\s+-\\s+"+"("+t[k]+")"+"\\s*$";var O=n++;t[O]="(<|>)?=?\\s*\\*";for(var B=0;B<n;B++){if(!r[B])r[B]=new RegExp(t[B])}e.parse=D;function D(e,t){var n=t?r[d]:r[m];return n.test(e)?new H(e,t):null}e.valid=F;function F(e,r){var t=D(e,r);return t?t.version:null}e.clean=G;function G(e,r){var t=D(e,r);return t?t.version:null}e.SemVer=H;function H(e,t){if(e instanceof H){if(e.loose===t)return e;else e=e.version}else if(typeof e!=="string"){throw new TypeError("Invalid Version: "+e)}if(!(this instanceof H))return new H(e,t);this.loose=t;var n=e.trim().match(t?r[d]:r[m]);if(!n)throw new TypeError("Invalid Version: "+e);this.raw=e;this.major=+n[1];this.minor=+n[2];this.patch=+n[3];if(!n[4])this.prerelease=[];else this.prerelease=n[4].split(".").map(function(e){return/^[0-9]+$/.test(e)?+e:e});this.build=n[5]?n[5].split("."):[];this.format()}H.prototype.format=function(){this.version=this.major+"."+this.minor+"."+this.patch;if(this.prerelease.length)this.version+="-"+this.prerelease.join(".");return this.version};H.prototype.inspect=function(){return'<SemVer "'+this+'">'};H.prototype.toString=function(){return this.version};H.prototype.compare=function(e){if(!(e instanceof H))e=new H(e,this.loose);return this.compareMain(e)||this.comparePre(e)};H.prototype.compareMain=function(e){if(!(e instanceof H))e=new H(e,this.loose);return Q(this.major,e.major)||Q(this.minor,e.minor)||Q(this.patch,e.patch)};H.prototype.comparePre=function(e){if(!(e instanceof H))e=new H(e,this.loose);if(this.prerelease.length&&!e.prerelease.length)return-1;else if(!this.prerelease.length&&e.prerelease.length)return 1;else if(!this.prerelease.length&&!e.prerelease.length)return 0;var r=0;do{var t=this.prerelease[r];var n=e.prerelease[r];if(t===undefined&&n===undefined)return 0;else if(n===undefined)return 1;else if(t===undefined)return-1;else if(t===n)continue;else return Q(t,n)}while(++r)};H.prototype.inc=function(e){switch(e){case"premajor":this.inc("major");this.inc("pre");break;case"preminor":this.inc("minor");this.inc("pre");break;case"prepatch":this.inc("patch");this.inc("pre");break;case"prerelease":if(this.prerelease.length===0)this.inc("patch");this.inc("pre");break;case"major":this.major++;this.minor=-1;case"minor":this.minor++;this.patch=0;this.prerelease=[];break;case"patch":if(this.prerelease.length===0)this.patch++;this.prerelease=[];break;case"pre":if(this.prerelease.length===0)this.prerelease=[0];else{var r=this.prerelease.length;while(--r>=0){if(typeof this.prerelease[r]==="number"){this.prerelease[r]++;r=-2}}if(r===-1)this.prerelease.push(0)}break;default:throw new Error("invalid increment argument: "+e)}this.format();return this};e.inc=J;function J(e,r,t){try{return new H(e,t).inc(r).version}catch(n){return null}}e.compareIdentifiers=Q;var K=/^[0-9]+$/;function Q(e,r){var t=K.test(e);var n=K.test(r);if(t&&n){e=+e;r=+r}return t&&!n?-1:n&&!t?1:e<r?-1:e>r?1:0}e.rcompareIdentifiers=U;function U(e,r){return Q(r,e)}e.compare=W;function W(e,r,t){return new H(e,t).compare(r)}e.compareLoose=Y;function Y(e,r){return W(e,r,true)}e.rcompare=er;function er(e,r,t){return W(r,e,t)}e.sort=rr;function rr(r,t){return r.sort(function(r,n){return e.compare(r,n,t)})}e.rsort=tr;function tr(r,t){return r.sort(function(r,n){return e.rcompare(r,n,t)})}e.gt=nr;function nr(e,r,t){return W(e,r,t)>0}e.lt=ir;function ir(e,r,t){return W(e,r,t)<0}e.eq=sr;function sr(e,r,t){return W(e,r,t)===0}e.neq=ar;function ar(e,r,t){return W(e,r,t)!==0}e.gte=or;function or(e,r,t){return W(e,r,t)>=0}e.lte=fr;function fr(e,r,t){return W(e,r,t)<=0}e.cmp=ur;function ur(e,r,t,n){var i;switch(r){case"===":i=e===t;break;case"!==":i=e!==t;break;case"":case"=":case"==":i=sr(e,t,n);break;case"!=":i=ar(e,t,n);break;case">":i=nr(e,t,n);break;case">=":i=or(e,t,n);break;case"<":i=ir(e,t,n);break;case"<=":i=fr(e,t,n);break;default:throw new TypeError("Invalid operator: "+r)}return i}e.Comparator=cr;function cr(e,r){if(e instanceof cr){if(e.loose===r)return e;else e=e.value}if(!(this instanceof cr))return new cr(e,r);this.loose=r;this.parse(e);if(this.semver===lr)this.value="";else this.value=this.operator+this.semver.version}var lr={};cr.prototype.parse=function(e){var t=this.loose?r[Z]:r[q];var n=e.match(t);if(!n)throw new TypeError("Invalid comparator: "+e);this.operator=n[1];if(!n[2])this.semver=lr;else{this.semver=new H(n[2],this.loose);if(this.operator==="<"&&!this.semver.prerelease.length){this.semver.prerelease=["0"];this.semver.format()}}};cr.prototype.inspect=function(){return'<SemVer Comparator "'+this+'">'};cr.prototype.toString=function(){return this.value};cr.prototype.test=function(e){return this.semver===lr?true:ur(e,this.operator,this.semver,this.loose)};e.Range=pr;function pr(e,r){if(e instanceof pr&&e.loose===r)return e;if(!(this instanceof pr))return new pr(e,r);this.loose=r;this.raw=e;this.set=e.split(/\s*\|\|\s*/).map(function(e){return this.parseRange(e.trim())},this).filter(function(e){return e.length});if(!this.set.length){throw new TypeError("Invalid SemVer Range: "+e)}this.format()}pr.prototype.inspect=function(){return'<SemVer Range "'+this.range+'">'};pr.prototype.format=function(){this.range=this.set.map(function(e){return e.join(" ").trim()}).join("||").trim();return this.range};pr.prototype.toString=function(){return this.range};pr.prototype.parseRange=function(e){var t=this.loose;e=e.trim();var n=t?r[N]:r[_];e=e.replace(n,kr);e=e.replace(r[L],X);e=e.replace(r[S],V);e=e.replace(r[C],M);e=e.split(/\s+/).join(" ");var i=t?r[Z]:r[q];var s=e.split(" ").map(function(e){return vr(e,t)}).join(" ").split(/\s+/);if(this.loose){s=s.filter(function(e){return!!e.match(i)})}s=s.map(function(e){return new cr(e,t)});return s};e.toComparators=hr;function hr(e,r){return new pr(e,r).set.map(function(e){return e.map(function(e){return e.value}).join(" ").trim().split(" ")})}function vr(e,r){e=dr(e,r);e=gr(e,r);e=br(e,r);e=jr(e,r);return e}function mr(e){return!e||e.toLowerCase()==="x"||e==="*"}function gr(e,r){return e.trim().split(/\s+/).map(function(e){return wr(e,r)}).join(" ")}function wr(e,t){var n=t?r[T]:r[I];return e.replace(n,function(e,r,t,n,i){var s;if(mr(r))s="";else if(mr(t))s=">="+r+".0.0-0 <"+(+r+1)+".0.0-0";else if(mr(n))s=">="+r+"."+t+".0-0 <"+r+"."+(+t+1)+".0-0";else if(i){if(i.charAt(0)!=="-")i="-"+i;s=">="+r+"."+t+"."+n+i+" <"+r+"."+(+t+1)+".0-0"}else s=">="+r+"."+t+"."+n+"-0"+" <"+r+"."+(+t+1)+".0-0";return s})}function dr(e,r){return e.trim().split(/\s+/).map(function(e){return yr(e,r)}).join(" ")}function yr(e,t){var n=t?r[P]:r[z];return e.replace(n,function(e,r,t,n,i){var s;if(mr(r))s="";else if(mr(t))s=">="+r+".0.0-0 <"+(+r+1)+".0.0-0";else if(mr(n)){if(r==="0")s=">="+r+"."+t+".0-0 <"+r+"."+(+t+1)+".0-0";else s=">="+r+"."+t+".0-0 <"+(+r+1)+".0.0-0"}else if(i){if(i.charAt(0)!=="-")i="-"+i;if(r==="0"){if(t==="0")s="="+r+"."+t+"."+n+i;else s=">="+r+"."+t+"."+n+i+" <"+r+"."+(+t+1)+".0-0"}else s=">="+r+"."+t+"."+n+i+" <"+(+r+1)+".0.0-0"}else{if(r==="0"){if(t==="0")s="="+r+"."+t+"."+n;else s=">="+r+"."+t+"."+n+"-0"+" <"+r+"."+(+t+1)+".0-0"}else s=">="+r+"."+t+"."+n+"-0"+" <"+(+r+1)+".0.0-0"}return s})}function br(e,r){return e.split(/\s+/).map(function(e){return $r(e,r)}).join(" ")}function $r(e,t){e=e.trim();var n=t?r[x]:r[E];return e.replace(n,function(e,r,t,n,i,s){var a=mr(t);var o=a||mr(n);var f=o||mr(i);var u=f;if(r==="="&&u)r="";if(r&&u){if(a)t=0;if(o)n=0;if(f)i=0;if(r===">"){r=">=";if(a){}else if(o){t=+t+1;n=0;i=0}else if(f){n=+n+1;i=0}}e=r+t+"."+n+"."+i+"-0"}else if(a){e="*"}else if(o){e=">="+t+".0.0-0 <"+(+t+1)+".0.0-0"}else if(f){e=">="+t+"."+n+".0-0 <"+t+"."+(+n+1)+".0-0"}return e})}function jr(e,t){return e.trim().replace(r[O],"")}function kr(e,r,t,n,i,s,a,o,f,u,c,l,p){if(mr(t))r="";else if(mr(n))r=">="+t+".0.0-0";else if(mr(i))r=">="+t+"."+n+".0-0";else r=">="+r;if(mr(f))o="";else if(mr(u))o="<"+(+f+1)+".0.0-0";else if(mr(c))o="<"+f+"."+(+u+1)+".0-0";else if(l)o="<="+f+"."+u+"."+c+"-"+l;else o="<="+o;return(r+" "+o).trim()}pr.prototype.test=function(e){if(!e)return false;for(var r=0;r<this.set.length;r++){if(Er(this.set[r],e))return true}return false};function Er(e,r){for(var t=0;t<e.length;t++){if(!e[t].test(r))return false}return true}e.satisfies=xr;function xr(e,r,t){try{r=new pr(r,t)}catch(n){return false}return r.test(e)}e.maxSatisfying=Rr;function Rr(e,r,t){return e.filter(function(e){return xr(e,r,t)}).sort(function(e,r){return er(e,r,t)})[0]||null}e.validRange=Sr;function Sr(e,r){try{return new pr(e,r).range||"*"}catch(t){return null}}e.ltr=Vr;function Vr(e,r,t){return Tr(e,r,"<",t)}e.gtr=Ir;function Ir(e,r,t){return Tr(e,r,">",t)}e.outside=Tr;function Tr(e,r,t,n){e=new H(e,n);r=new pr(r,n);var i,s,a,o,f;switch(t){case">":i=nr;s=fr;a=ir;o=">";f=">=";break;case"<":i=ir;s=or;a=nr;o="<";f="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(xr(e,r,n)){return false}for(var u=0;u<r.set.length;++u){var c=r.set[u];var l=null;var p=null;c.forEach(function(e){l=l||e;p=p||e;if(i(e.semver,l.semver,n)){l=e}else if(a(e.semver,p.semver,n)){p=e}});if(l.operator===o||l.operator===f){return false}if((!p.operator||p.operator===o)&&s(e,p.semver)){return false}else if(p.operator===f&&a(e,p.semver)){return false}}return true}if(typeof define==="function"&&define.amd)define(e)})(typeof exports==="object"?exports:typeof define==="function"&&define.amd?{}:semver={});
package/semver.min.js.gz CHANGED
Binary file
package/test/gtr.js ADDED
@@ -0,0 +1,173 @@
1
+ var tap = require('tap');
2
+ var test = tap.test;
3
+ var semver = require('../semver.js');
4
+ var gtr = semver.gtr;
5
+
6
+ test('\ngtr tests', function(t) {
7
+ // [range, version, loose]
8
+ // Version should be greater than range
9
+ [
10
+ ['~1.2.2', '1.3.0'],
11
+ ['~0.6.1-1', '0.7.1-1'],
12
+ ['1.0.0 - 2.0.0', '2.0.1'],
13
+ ['1.0.0', '1.0.1-beta1'],
14
+ ['1.0.0', '2.0.0'],
15
+ ['<=2.0.0', '2.1.1'],
16
+ ['<=2.0.0', '3.2.9'],
17
+ ['<2.0.0', '2.0.0'],
18
+ ['0.1.20 || 1.2.4', '1.2.5'],
19
+ ['2.x.x', '3.0.0'],
20
+ ['1.2.x', '1.3.0'],
21
+ ['1.2.x || 2.x', '3.0.0'],
22
+ ['2.*.*', '5.0.1'],
23
+ ['1.2.*', '1.3.3'],
24
+ ['1.2.* || 2.*', '4.0.0'],
25
+ ['2', '3.0.0'],
26
+ ['2.3', '2.4.2'],
27
+ ['~2.4', '2.5.0'], // >=2.4.0 <2.5.0
28
+ ['~2.4', '2.5.5'],
29
+ ['~>3.2.1', '3.3.0'], // >=3.2.1 <3.3.0
30
+ ['~1', '2.2.3'], // >=1.0.0 <2.0.0
31
+ ['~>1', '2.2.4'],
32
+ ['~> 1', '3.2.3'],
33
+ ['~1.0', '1.1.2'], // >=1.0.0 <1.1.0
34
+ ['~ 1.0', '1.1.0'],
35
+ ['<1.2', '1.2.0'],
36
+ ['< 1.2', '1.2.1'],
37
+ ['1', '2.0.0beta', true],
38
+ ['~v0.5.4-pre', '0.6.0'],
39
+ ['~v0.5.4-pre', '0.6.1-pre'],
40
+ ['=0.7.x', '0.8.0'],
41
+ ['=0.7.x', '0.8.0-asdf'],
42
+ ['<=0.7.x', '0.7.0'],
43
+ ['~1.2.2', '1.3.0'],
44
+ ['1.0.0 - 2.0.0', '2.2.3'],
45
+ ['1.0.0', '1.0.1'],
46
+ ['<=2.0.0', '3.0.0'],
47
+ ['<=2.0.0', '2.9999.9999'],
48
+ ['<=2.0.0', '2.2.9'],
49
+ ['<2.0.0', '2.9999.9999'],
50
+ ['<2.0.0', '2.2.9'],
51
+ ['2.x.x', '3.1.3'],
52
+ ['1.2.x', '1.3.3'],
53
+ ['1.2.x || 2.x', '3.1.3'],
54
+ ['2.*.*', '3.1.3'],
55
+ ['1.2.*', '1.3.3'],
56
+ ['1.2.* || 2.*', '3.1.3'],
57
+ ['2', '3.1.2'],
58
+ ['2.3', '2.4.1'],
59
+ ['~2.4', '2.5.0'], // >=2.4.0 <2.5.0
60
+ ['~>3.2.1', '3.3.2'], // >=3.2.1 <3.3.0
61
+ ['~1', '2.2.3'], // >=1.0.0 <2.0.0
62
+ ['~>1', '2.2.3'],
63
+ ['~1.0', '1.1.0'], // >=1.0.0 <1.1.0
64
+ ['<1', '1.0.0'],
65
+ ['1', '2.0.0beta', true],
66
+ ['<1', '1.0.0beta', true],
67
+ ['< 1', '1.0.0beta', true],
68
+ ['=0.7.x', '0.8.2'],
69
+ ['<=0.7.x', '0.7.2']
70
+ ].forEach(function(tuple) {
71
+ var range = tuple[0];
72
+ var version = tuple[1];
73
+ var loose = tuple[2] || false;
74
+ var msg = 'gtr(' + version + ', ' + range + ', ' + loose + ')';
75
+ t.ok(gtr(version, range, loose), msg);
76
+ });
77
+ t.end();
78
+ });
79
+
80
+ test('\nnegative gtr tests', function(t) {
81
+ // [range, version, loose]
82
+ // Version should NOT be greater than range
83
+ [
84
+ ['~0.6.1-1', '0.6.1-1'],
85
+ ['1.0.0 - 2.0.0', '1.2.3'],
86
+ ['1.0.0 - 2.0.0', '0.9.9'],
87
+ ['1.0.0', '1.0.0'],
88
+ ['>=*', '0.2.4'],
89
+ ['', '1.0.0', true],
90
+ ['*', '1.2.3'],
91
+ ['*', 'v1.2.3-foo'],
92
+ ['>=1.0.0', '1.0.0'],
93
+ ['>=1.0.0', '1.0.1'],
94
+ ['>=1.0.0', '1.1.0'],
95
+ ['>1.0.0', '1.0.1'],
96
+ ['>1.0.0', '1.1.0'],
97
+ ['<=2.0.0', '2.0.0'],
98
+ ['<=2.0.0', '1.9999.9999'],
99
+ ['<=2.0.0', '0.2.9'],
100
+ ['<2.0.0', '1.9999.9999'],
101
+ ['<2.0.0', '0.2.9'],
102
+ ['>= 1.0.0', '1.0.0'],
103
+ ['>= 1.0.0', '1.0.1'],
104
+ ['>= 1.0.0', '1.1.0'],
105
+ ['> 1.0.0', '1.0.1'],
106
+ ['> 1.0.0', '1.1.0'],
107
+ ['<= 2.0.0', '2.0.0'],
108
+ ['<= 2.0.0', '1.9999.9999'],
109
+ ['<= 2.0.0', '0.2.9'],
110
+ ['< 2.0.0', '1.9999.9999'],
111
+ ['<\t2.0.0', '0.2.9'],
112
+ ['>=0.1.97', 'v0.1.97'],
113
+ ['>=0.1.97', '0.1.97'],
114
+ ['0.1.20 || 1.2.4', '1.2.4'],
115
+ ['0.1.20 || >1.2.4', '1.2.4'],
116
+ ['0.1.20 || 1.2.4', '1.2.3'],
117
+ ['0.1.20 || 1.2.4', '0.1.20'],
118
+ ['>=0.2.3 || <0.0.1', '0.0.0'],
119
+ ['>=0.2.3 || <0.0.1', '0.2.3'],
120
+ ['>=0.2.3 || <0.0.1', '0.2.4'],
121
+ ['||', '1.3.4'],
122
+ ['2.x.x', '2.1.3'],
123
+ ['1.2.x', '1.2.3'],
124
+ ['1.2.x || 2.x', '2.1.3'],
125
+ ['1.2.x || 2.x', '1.2.3'],
126
+ ['x', '1.2.3'],
127
+ ['2.*.*', '2.1.3'],
128
+ ['1.2.*', '1.2.3'],
129
+ ['1.2.* || 2.*', '2.1.3'],
130
+ ['1.2.* || 2.*', '1.2.3'],
131
+ ['1.2.* || 2.*', '1.2.3'],
132
+ ['*', '1.2.3'],
133
+ ['2', '2.1.2'],
134
+ ['2.3', '2.3.1'],
135
+ ['~2.4', '2.4.0'], // >=2.4.0 <2.5.0
136
+ ['~2.4', '2.4.5'],
137
+ ['~>3.2.1', '3.2.2'], // >=3.2.1 <3.3.0
138
+ ['~1', '1.2.3'], // >=1.0.0 <2.0.0
139
+ ['~>1', '1.2.3'],
140
+ ['~> 1', '1.2.3'],
141
+ ['~1.0', '1.0.2'], // >=1.0.0 <1.1.0
142
+ ['~ 1.0', '1.0.2'],
143
+ ['>=1', '1.0.0'],
144
+ ['>= 1', '1.0.0'],
145
+ ['<1.2', '1.1.1'],
146
+ ['< 1.2', '1.1.1'],
147
+ ['1', '1.0.0beta', true],
148
+ ['~v0.5.4-pre', '0.5.5'],
149
+ ['~v0.5.4-pre', '0.5.4'],
150
+ ['=0.7.x', '0.7.2'],
151
+ ['>=0.7.x', '0.7.2'],
152
+ ['=0.7.x', '0.7.0-asdf'],
153
+ ['>=0.7.x', '0.7.0-asdf'],
154
+ ['<=0.7.x', '0.6.2'],
155
+ ['>0.2.3 >0.2.4 <=0.2.5', '0.2.5'],
156
+ ['>=0.2.3 <=0.2.4', '0.2.4'],
157
+ ['1.0.0 - 2.0.0', '2.0.0'],
158
+ ['^1', '0.0.0-0'],
159
+ ['^3.0.0', '2.0.0'],
160
+ ['^1.0.0 || ~2.0.1', '2.0.0'],
161
+ ['^0.1.0 || ~3.0.1 || 5.0.0', '3.2.0'],
162
+ ['^0.1.0 || ~3.0.1 || 5.0.0', '1.0.0beta', true],
163
+ ['^0.1.0 || ~3.0.1 || 5.0.0', '5.0.0-0', true],
164
+ ['^0.1.0 || ~3.0.1 || >4 <=5.0.0', '3.5.0']
165
+ ].forEach(function(tuple) {
166
+ var range = tuple[0];
167
+ var version = tuple[1];
168
+ var loose = tuple[2] || false;
169
+ var msg = '!gtr(' + version + ', ' + range + ', ' + loose + ')';
170
+ t.notOk(gtr(version, range, loose), msg);
171
+ });
172
+ t.end();
173
+ });
package/test/index.js CHANGED
@@ -207,7 +207,15 @@ test('\nrange tests', function(t) {
207
207
  ['>=1.2.1 >=1.2.3', '1.2.3'],
208
208
  ['<=1.2.3', '1.2.3-beta'],
209
209
  ['>1.2', '1.3.0-beta'],
210
- ['>=1.2', '1.2.8']
210
+ ['>=1.2', '1.2.8'],
211
+ ['^1.2.3', '1.8.1'],
212
+ ['^1.2.3', '1.2.3-beta'],
213
+ ['^0.1.2', '0.1.2'],
214
+ ['^0.1', '0.1.2'],
215
+ ['^1.2', '1.4.2'],
216
+ ['^1.2 ^1', '1.4.2'],
217
+ ['^1.2', '1.2.0-pre'],
218
+ ['^1.2.3', '1.2.3-pre']
211
219
  ].forEach(function(v) {
212
220
  var range = v[0];
213
221
  var ver = v[1];
@@ -268,9 +276,13 @@ test('\nnegative range tests', function(t) {
268
276
  ['<1.2.3', '1.2.3-beta'],
269
277
  ['=1.2.3', '1.2.3-beta'],
270
278
  ['>1.2', '1.2.8'],
279
+ ['^1.2.3', '2.0.0-alpha'],
280
+ ['^1.2.3', '1.2.2'],
281
+ ['^1.2', '1.1.9'],
271
282
  // invalid ranges never satisfied!
272
283
  ['blerg', '1.2.3'],
273
- ['git+https://user:password0123@github.com/foo', '123.0.0', true]
284
+ ['git+https://user:password0123@github.com/foo', '123.0.0', true],
285
+ ['^1.2.3', '2.0.0-pre']
274
286
  ].forEach(function(v) {
275
287
  var range = v[0];
276
288
  var ver = v[1];
@@ -290,8 +302,15 @@ test('\nincrement versions test', function(t) {
290
302
  ['1.2.3tag', 'major', '2.0.0', true],
291
303
  ['1.2.3-tag', 'major', '2.0.0'],
292
304
  ['1.2.3', 'fake', null],
305
+ ['1.2.0-0', 'patch', '1.2.0'],
293
306
  ['fake', 'major', null],
294
- ['1.2.3', 'prerelease', '1.2.3-0'],
307
+ ['1.2.3-4', 'major', '2.0.0'],
308
+ ['1.2.3-4', 'minor', '1.3.0'],
309
+ ['1.2.3-4', 'patch', '1.2.3'],
310
+ ['1.2.3-alpha.0.beta', 'major', '2.0.0'],
311
+ ['1.2.3-alpha.0.beta', 'minor', '1.3.0'],
312
+ ['1.2.3-alpha.0.beta', 'patch', '1.2.3'],
313
+ ['1.2.4', 'prerelease', '1.2.5-0'],
295
314
  ['1.2.3-0', 'prerelease', '1.2.3-1'],
296
315
  ['1.2.3-alpha.0', 'prerelease', '1.2.3-alpha.1'],
297
316
  ['1.2.3-alpha.1', 'prerelease', '1.2.3-alpha.2'],
@@ -307,7 +326,13 @@ test('\nincrement versions test', function(t) {
307
326
  ['1.2.3-alpha.10.beta.2', 'prerelease', '1.2.3-alpha.10.beta.3'],
308
327
  ['1.2.3-alpha.9.beta', 'prerelease', '1.2.3-alpha.10.beta'],
309
328
  ['1.2.3-alpha.10.beta', 'prerelease', '1.2.3-alpha.11.beta'],
310
- ['1.2.3-alpha.11.beta', 'prerelease', '1.2.3-alpha.12.beta']
329
+ ['1.2.3-alpha.11.beta', 'prerelease', '1.2.3-alpha.12.beta'],
330
+ ['1.2.0', 'preminor', '1.3.0-0'],
331
+ ['1.2.0', 'premajor', '2.0.0-0'],
332
+ ['1.2.0', 'preminor', '1.3.0-0'],
333
+ ['1.2.0', 'premajor', '2.0.0-0']
334
+
335
+
311
336
  ].forEach(function(v) {
312
337
  var pre = v[0];
313
338
  var what = v[1];
@@ -374,6 +399,16 @@ test('\nvalid range test', function(t) {
374
399
  ['~> 1', '>=1.0.0-0 <2.0.0-0'],
375
400
  ['~1.0', '>=1.0.0-0 <1.1.0-0'],
376
401
  ['~ 1.0', '>=1.0.0-0 <1.1.0-0'],
402
+ ['^0', '>=0.0.0-0 <1.0.0-0'],
403
+ ['^ 1', '>=1.0.0-0 <2.0.0-0'],
404
+ ['^0.1', '>=0.1.0-0 <0.2.0-0'],
405
+ ['^1.0', '>=1.0.0-0 <2.0.0-0'],
406
+ ['^1.2', '>=1.2.0-0 <2.0.0-0'],
407
+ ['^0.0.1', '=0.0.1'],
408
+ ['^0.0.1-beta', '=0.0.1-beta'],
409
+ ['^0.1.2', '>=0.1.2-0 <0.2.0-0'],
410
+ ['^1.2.3', '>=1.2.3-0 <2.0.0-0'],
411
+ ['^1.2.3-beta.4', '>=1.2.3-beta.4 <2.0.0-0'],
377
412
  ['<1', '<1.0.0-0'],
378
413
  ['< 1', '<1.0.0-0'],
379
414
  ['>=1', '>=1.0.0-0'],
@@ -384,7 +419,8 @@ test('\nvalid range test', function(t) {
384
419
  ['>01.02.03', '>1.2.3', true],
385
420
  ['>01.02.03', null],
386
421
  ['~1.2.3beta', '>=1.2.3-beta <1.3.0-0', true],
387
- ['~1.2.3beta', null]
422
+ ['~1.2.3beta', null],
423
+ ['^ 1.2 ^ 1', '>=1.2.0-0 <2.0.0-0 >=1.0.0-0 <2.0.0-0']
388
424
  ].forEach(function(v) {
389
425
  var pre = v[0];
390
426
  var wanted = v[1];
@@ -477,6 +513,21 @@ test('\ncomparators test', function(t) {
477
513
  t.end();
478
514
  });
479
515
 
516
+ test('\ninvalid version numbers', function(t) {
517
+ ['1.2.3.4',
518
+ 'NOT VALID',
519
+ 1.2,
520
+ null,
521
+ 'Infinity.NaN.Infinity'
522
+ ].forEach(function(v) {
523
+ t.throws(function() {
524
+ new SemVer(v);
525
+ }, {name:'TypeError', message:'Invalid Version: ' + v});
526
+ });
527
+
528
+ t.end();
529
+ });
530
+
480
531
  test('\nstrict vs loose version numbers', function(t) {
481
532
  [['=1.2.3', '1.2.3'],
482
533
  ['01.02.03', '1.2.3'],
@@ -519,7 +570,7 @@ test('\nstrict vs loose ranges', function(t) {
519
570
  test('\nmax satisfying', function(t) {
520
571
  [[['1.2.3', '1.2.4'], '1.2', '1.2.4'],
521
572
  [['1.2.4', '1.2.3'], '1.2', '1.2.4'],
522
- [['1.2.3','1.2.4','1.2.5','1.2.6'], '~1.2.3', '1.2.6'],
573
+ [['1.2.3', '1.2.4', '1.2.5', '1.2.6'], '~1.2.3', '1.2.6'],
523
574
  [['1.1.0', '1.2.0', '1.2.1', '1.3.0', '2.0.0b1', '2.0.0b2', '2.0.0b3', '2.0.0', '2.1.0'], '~2.0.0', '2.0.0', true]
524
575
  ].forEach(function(v) {
525
576
  var versions = v[0];
package/test/ltr.js ADDED
@@ -0,0 +1,174 @@
1
+ var tap = require('tap');
2
+ var test = tap.test;
3
+ var semver = require('../semver.js');
4
+ var ltr = semver.ltr;
5
+
6
+ test('\nltr tests', function(t) {
7
+ // [range, version, loose]
8
+ // Version should be less than range
9
+ [
10
+ ['~1.2.2', '1.2.1'],
11
+ ['~0.6.1-1', '0.6.1-0'],
12
+ ['1.0.0 - 2.0.0', '0.0.1'],
13
+ ['1.0.0-beta.2', '1.0.0-beta.1'],
14
+ ['1.0.0', '0.0.0'],
15
+ ['>=2.0.0', '1.1.1'],
16
+ ['>=2.0.0', '1.2.9'],
17
+ ['>2.0.0', '2.0.0'],
18
+ ['0.1.20 || 1.2.4', '0.1.5'],
19
+ ['2.x.x', '1.0.0'],
20
+ ['1.2.x', '1.1.0'],
21
+ ['1.2.x || 2.x', '1.0.0'],
22
+ ['2.*.*', '1.0.1'],
23
+ ['1.2.*', '1.1.3'],
24
+ ['1.2.* || 2.*', '1.1.9999'],
25
+ ['2', '1.0.0'],
26
+ ['2.3', '2.2.2'],
27
+ ['~2.4', '2.3.0'], // >=2.4.0 <2.5.0
28
+ ['~2.4', '2.3.5'],
29
+ ['~>3.2.1', '3.2.0'], // >=3.2.1 <3.3.0
30
+ ['~1', '0.2.3'], // >=1.0.0 <2.0.0
31
+ ['~>1', '0.2.4'],
32
+ ['~> 1', '0.2.3'],
33
+ ['~1.0', '0.1.2'], // >=1.0.0 <1.1.0
34
+ ['~ 1.0', '0.1.0'],
35
+ ['>1.2', '1.2.0'],
36
+ ['> 1.2', '1.2.1'],
37
+ ['1', '0.0.0beta', true],
38
+ ['~v0.5.4-pre', '0.5.4-alpha'],
39
+ ['~v0.5.4-pre', '0.5.4-alpha'],
40
+ ['=0.7.x', '0.6.0'],
41
+ ['=0.7.x', '0.6.0-asdf'],
42
+ ['>=0.7.x', '0.6.0'],
43
+ ['~1.2.2', '1.2.1'],
44
+ ['1.0.0 - 2.0.0', '0.2.3'],
45
+ ['1.0.0', '0.0.1'],
46
+ ['>=2.0.0', '1.0.0'],
47
+ ['>=2.0.0', '1.9999.9999'],
48
+ ['>=2.0.0', '1.2.9'],
49
+ ['>2.0.0', '2.0.0'],
50
+ ['>2.0.0', '1.2.9'],
51
+ ['2.x.x', '1.1.3'],
52
+ ['1.2.x', '1.1.3'],
53
+ ['1.2.x || 2.x', '1.1.3'],
54
+ ['2.*.*', '1.1.3'],
55
+ ['1.2.*', '1.1.3'],
56
+ ['1.2.* || 2.*', '1.1.3'],
57
+ ['2', '1.9999.9999'],
58
+ ['2.3', '2.2.1'],
59
+ ['~2.4', '2.3.0'], // >=2.4.0 <2.5.0
60
+ ['~>3.2.1', '2.3.2'], // >=3.2.1 <3.3.0
61
+ ['~1', '0.2.3'], // >=1.0.0 <2.0.0
62
+ ['~>1', '0.2.3'],
63
+ ['~1.0', '0.0.0'], // >=1.0.0 <1.1.0
64
+ ['>1', '1.0.0'],
65
+ ['2', '1.0.0beta', true],
66
+ ['>1', '1.0.0beta', true],
67
+ ['> 1', '1.0.0beta', true],
68
+ ['=0.7.x', '0.6.2'],
69
+ ['>=0.7.x', '0.6.2']
70
+ ].forEach(function(tuple) {
71
+ var range = tuple[0];
72
+ var version = tuple[1];
73
+ var loose = tuple[2] || false;
74
+ var msg = 'ltr(' + version + ', ' + range + ', ' + loose + ')';
75
+ t.ok(ltr(version, range, loose), msg);
76
+ });
77
+ t.end();
78
+ });
79
+
80
+ test('\nnegative ltr tests', function(t) {
81
+ // [range, version, loose]
82
+ // Version should NOT be greater than range
83
+ [
84
+ ['~ 1.0', '1.1.0'],
85
+ ['~0.6.1-1', '0.6.1-1'],
86
+ ['1.0.0 - 2.0.0', '1.2.3'],
87
+ ['1.0.0 - 2.0.0', '2.9.9'],
88
+ ['1.0.0', '1.0.0'],
89
+ ['>=*', '0.2.4'],
90
+ ['', '1.0.0', true],
91
+ ['*', '1.2.3'],
92
+ ['*', 'v1.2.3-foo'],
93
+ ['>=1.0.0', '1.0.0'],
94
+ ['>=1.0.0', '1.0.1'],
95
+ ['>=1.0.0', '1.1.0'],
96
+ ['>1.0.0', '1.0.1'],
97
+ ['>1.0.0', '1.1.0'],
98
+ ['<=2.0.0', '2.0.0'],
99
+ ['<=2.0.0', '1.9999.9999'],
100
+ ['<=2.0.0', '0.2.9'],
101
+ ['<2.0.0', '1.9999.9999'],
102
+ ['<2.0.0', '0.2.9'],
103
+ ['>= 1.0.0', '1.0.0'],
104
+ ['>= 1.0.0', '1.0.1'],
105
+ ['>= 1.0.0', '1.1.0'],
106
+ ['> 1.0.0', '1.0.1'],
107
+ ['> 1.0.0', '1.1.0'],
108
+ ['<= 2.0.0', '2.0.0'],
109
+ ['<= 2.0.0', '1.9999.9999'],
110
+ ['<= 2.0.0', '0.2.9'],
111
+ ['< 2.0.0', '1.9999.9999'],
112
+ ['<\t2.0.0', '0.2.9'],
113
+ ['>=0.1.97', 'v0.1.97'],
114
+ ['>=0.1.97', '0.1.97'],
115
+ ['0.1.20 || 1.2.4', '1.2.4'],
116
+ ['0.1.20 || >1.2.4', '1.2.4'],
117
+ ['0.1.20 || 1.2.4', '1.2.3'],
118
+ ['0.1.20 || 1.2.4', '0.1.20'],
119
+ ['>=0.2.3 || <0.0.1', '0.0.0'],
120
+ ['>=0.2.3 || <0.0.1', '0.2.3'],
121
+ ['>=0.2.3 || <0.0.1', '0.2.4'],
122
+ ['||', '1.3.4'],
123
+ ['2.x.x', '2.1.3'],
124
+ ['1.2.x', '1.2.3'],
125
+ ['1.2.x || 2.x', '2.1.3'],
126
+ ['1.2.x || 2.x', '1.2.3'],
127
+ ['x', '1.2.3'],
128
+ ['2.*.*', '2.1.3'],
129
+ ['1.2.*', '1.2.3'],
130
+ ['1.2.* || 2.*', '2.1.3'],
131
+ ['1.2.* || 2.*', '1.2.3'],
132
+ ['1.2.* || 2.*', '1.2.3'],
133
+ ['*', '1.2.3'],
134
+ ['2', '2.1.2'],
135
+ ['2.3', '2.3.1'],
136
+ ['~2.4', '2.4.0'], // >=2.4.0 <2.5.0
137
+ ['~2.4', '2.4.5'],
138
+ ['~>3.2.1', '3.2.2'], // >=3.2.1 <3.3.0
139
+ ['~1', '1.2.3'], // >=1.0.0 <2.0.0
140
+ ['~>1', '1.2.3'],
141
+ ['~> 1', '1.2.3'],
142
+ ['~1.0', '1.0.2'], // >=1.0.0 <1.1.0
143
+ ['~ 1.0', '1.0.2'],
144
+ ['>=1', '1.0.0'],
145
+ ['>= 1', '1.0.0'],
146
+ ['<1.2', '1.1.1'],
147
+ ['< 1.2', '1.1.1'],
148
+ ['1', '1.0.0beta', true],
149
+ ['~v0.5.4-pre', '0.5.5'],
150
+ ['~v0.5.4-pre', '0.5.4'],
151
+ ['=0.7.x', '0.7.2'],
152
+ ['>=0.7.x', '0.7.2'],
153
+ ['=0.7.x', '0.7.0-asdf'],
154
+ ['>=0.7.x', '0.7.0-asdf'],
155
+ ['<=0.7.x', '0.6.2'],
156
+ ['>0.2.3 >0.2.4 <=0.2.5', '0.2.5'],
157
+ ['>=0.2.3 <=0.2.4', '0.2.4'],
158
+ ['1.0.0 - 2.0.0', '2.0.0'],
159
+ ['^1', '1.0.0-0'],
160
+ ['^3.0.0', '4.0.0'],
161
+ ['^1.0.0 || ~2.0.1', '2.0.0'],
162
+ ['^0.1.0 || ~3.0.1 || 5.0.0', '3.2.0'],
163
+ ['^0.1.0 || ~3.0.1 || 5.0.0', '1.0.0beta', true],
164
+ ['^0.1.0 || ~3.0.1 || 5.0.0', '5.0.0-0', true],
165
+ ['^0.1.0 || ~3.0.1 || >4 <=5.0.0', '3.5.0']
166
+ ].forEach(function(tuple) {
167
+ var range = tuple[0];
168
+ var version = tuple[1];
169
+ var loose = tuple[2] || false;
170
+ var msg = '!ltr(' + version + ', ' + range + ', ' + loose + ')';
171
+ t.notOk(ltr(version, range, loose), msg);
172
+ });
173
+ t.end();
174
+ });
package/r.js DELETED
@@ -1,4 +0,0 @@
1
- var semver = require('./')
2
- var r = new semver.Range('git+https://user:password0123@github.com/foo/bar.git', true)
3
- r.inspect = null
4
- console.log(r)