Skip to content

Commit 7b072bd

Browse files
Astheticisaacs
authored andcommitted
Range intersect supports wildcards and ~
- Added undefined check for range operator, wildcards defaults to empty. - Comparator and Range test returns true if either version is a wildcard - Ensure ranges intersect supports wildcards and ~ Fix #271
1 parent 78ea02a commit 7b072bd

File tree

2 files changed

+76
-32
lines changed

2 files changed

+76
-32
lines changed

semver.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -785,7 +785,7 @@ Comparator.prototype.parse = function (comp) {
785785
throw new TypeError('Invalid comparator: ' + comp)
786786
}
787787

788-
this.operator = m[1]
788+
this.operator = m[1] !== undefined ? m[1] : ''
789789
if (this.operator === '=') {
790790
this.operator = ''
791791
}
@@ -805,7 +805,7 @@ Comparator.prototype.toString = function () {
805805
Comparator.prototype.test = function (version) {
806806
debug('Comparator.test', version, this.options.loose)
807807

808-
if (this.semver === ANY) {
808+
if (this.semver === ANY || version === ANY) {
809809
return true
810810
}
811811

@@ -831,9 +831,15 @@ Comparator.prototype.intersects = function (comp, options) {
831831
var rangeTmp
832832

833833
if (this.operator === '') {
834+
if (this.value === '') {
835+
return true
836+
}
834837
rangeTmp = new Range(comp.value, options)
835838
return satisfies(this.value, rangeTmp, options)
836839
} else if (comp.operator === '') {
840+
if (comp.value === '') {
841+
return true
842+
}
837843
rangeTmp = new Range(this.value, options)
838844
return satisfies(comp.semver, rangeTmp, options)
839845
}
@@ -1250,10 +1256,6 @@ function hyphenReplace ($0,
12501256

12511257
// if ANY of the sets match ALL of its comparators, then pass
12521258
Range.prototype.test = function (version) {
1253-
if (!version) {
1254-
return false
1255-
}
1256-
12571259
if (typeof version === 'string') {
12581260
version = new SemVer(version, this.options)
12591261
}

test/index.js

Lines changed: 68 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ test('comparison tests', function (t) {
5252
['1.2.3-a.b', '1.2.3-a'],
5353
['1.2.3-a.b.c.10.d.5', '1.2.3-a.b.c.5.d.100'],
5454
['1.2.3-r2', '1.2.3-r100'],
55-
['1.2.3-r100', '1.2.3-R2']
55+
['1.2.3-r100', '1.2.3-R2'],
5656
].forEach(function (v) {
5757
var v0 = v[0]
5858
var v1 = v[1]
@@ -333,7 +333,6 @@ test('negative range tests', function (t) {
333333
['blerg', '1.2.3'],
334334
['git+https://user:[email protected]/foo', '123.0.0', true],
335335
['^1.2.3', '2.0.0-pre'],
336-
['^1.2.3', false]
337336
].forEach(function (v) {
338337
var range = v[0]
339338
var ver = v[1]
@@ -919,31 +918,74 @@ test('ranges intersect', function (t) {
919918
['<1.6.16 || >=1.7.0 <1.7.11 || >=1.8.0 <1.8.2', '>=1.6.16 <1.7.0 || >=1.7.11 <1.8.0 || >=1.8.2', false],
920919
['<=1.6.16 || >=1.7.0 <1.7.11 || >=1.8.0 <1.8.2', '>=1.6.16 <1.7.0 || >=1.7.11 <1.8.0 || >=1.8.2', true],
921920
['>=1.0.0', '<=1.0.0', true],
922-
['>1.0.0 <1.0.0', '<=0.0.0', false]
921+
['>1.0.0 <1.0.0', '<=0.0.0', false],
922+
['*', '0.0.1', true],
923+
['*', '>=1.0.0', true],
924+
['*', '>1.0.0', true],
925+
['*', '~1.0.0', true],
926+
['*', '<1.6.0', true],
927+
['*', '<=1.6.0', true],
928+
['1.*', '0.0.1', false],
929+
['1.*', '2.0.0', false],
930+
['1.*', '1.0.0', true],
931+
['1.*', '<2.0.0', true],
932+
['1.*', '>1.0.0', true],
933+
['1.*', '<=1.0.0', true],
934+
['1.*', '^1.0.0', true],
935+
['1.0.*', '0.0.1', false],
936+
['1.0.*', '<0.0.1', false],
937+
['1.0.*', '>0.0.1', true],
938+
['*', '1.3.0 || <1.0.0 >2.0.0', true],
939+
['1.3.0 || <1.0.0 >2.0.0', '*', true],
940+
['1.*', '1.3.0 || <1.0.0 >2.0.0', true],
941+
['x', '0.0.1', true],
942+
['x', '>=1.0.0', true],
943+
['x', '>1.0.0', true],
944+
['x', '~1.0.0', true],
945+
['x', '<1.6.0', true],
946+
['x', '<=1.6.0', true],
947+
['1.x', '0.0.1', false],
948+
['1.x', '2.0.0', false],
949+
['1.x', '1.0.0', true],
950+
['1.x', '<2.0.0', true],
951+
['1.x', '>1.0.0', true],
952+
['1.x', '<=1.0.0', true],
953+
['1.x', '^1.0.0', true],
954+
['1.0.x', '0.0.1', false],
955+
['1.0.x', '<0.0.1', false],
956+
['1.0.x', '>0.0.1', true],
957+
['x', '1.3.0 || <1.0.0 >2.0.0', true],
958+
['1.3.0 || <1.0.0 >2.0.0', 'x', true],
959+
['1.x', '1.3.0 || <1.0.0 >2.0.0', true],
960+
['*', '*', true],
961+
['x', '', true],
923962
].forEach(function (v) {
924-
var range1 = new Range(v[0])
925-
var range2 = new Range(v[1])
926-
var expect = v[2]
927-
var actual1 = range1.intersects(range2)
928-
var actual2 = range2.intersects(range1)
929-
var actual3 = semver.intersects(v[1], v[0])
930-
var actual4 = semver.intersects(v[0], v[1])
931-
var actual5 = semver.intersects(v[1], v[0], true)
932-
var actual6 = semver.intersects(v[0], v[1], true)
933-
var actual7 = semver.intersects(range1, range2)
934-
var actual8 = semver.intersects(range2, range1)
935-
var actual9 = semver.intersects(range1, range2, true)
936-
var actual0 = semver.intersects(range2, range1, true)
937-
t.equal(actual1, expect)
938-
t.equal(actual2, expect)
939-
t.equal(actual3, expect)
940-
t.equal(actual4, expect)
941-
t.equal(actual5, expect)
942-
t.equal(actual6, expect)
943-
t.equal(actual7, expect)
944-
t.equal(actual8, expect)
945-
t.equal(actual9, expect)
946-
t.equal(actual0, expect)
963+
t.test(v[0] + ' <~> ' + v[1], t => {
964+
var range1 = new Range(v[0])
965+
var range2 = new Range(v[1])
966+
var expect = v[2]
967+
var actual1 = range1.intersects(range2)
968+
var actual2 = range2.intersects(range1)
969+
var actual3 = semver.intersects(v[1], v[0])
970+
var actual4 = semver.intersects(v[0], v[1])
971+
var actual5 = semver.intersects(v[1], v[0], true)
972+
var actual6 = semver.intersects(v[0], v[1], true)
973+
var actual7 = semver.intersects(range1, range2)
974+
var actual8 = semver.intersects(range2, range1)
975+
var actual9 = semver.intersects(range1, range2, true)
976+
var actual0 = semver.intersects(range2, range1, true)
977+
t.equal(actual1, expect)
978+
t.equal(actual2, expect)
979+
t.equal(actual3, expect)
980+
t.equal(actual4, expect)
981+
t.equal(actual5, expect)
982+
t.equal(actual6, expect)
983+
t.equal(actual7, expect)
984+
t.equal(actual8, expect)
985+
t.equal(actual9, expect)
986+
t.equal(actual0, expect)
987+
t.end()
988+
})
947989
})
948990
t.end()
949991
})

0 commit comments

Comments
 (0)