diff --git a/README.md b/README.md index a83f726b..fd5151ab 100644 --- a/README.md +++ b/README.md @@ -306,6 +306,8 @@ strings that they parse. * `major(v)`: Return the major version number. * `minor(v)`: Return the minor version number. * `patch(v)`: Return the patch version number. +* `intersects(r1, r2, loose)`: Return true if the two supplied ranges + or comparators intersect. ### Comparison @@ -330,6 +332,7 @@ strings that they parse. or null if the versions are the same. ### Comparators + * `intersects(comparator)`: Return true if the comparators intersect ### Ranges diff --git a/semver.js b/semver.js index f8c284b8..33f36e58 100644 --- a/semver.js +++ b/semver.js @@ -746,8 +746,17 @@ Comparator.prototype.intersects = function(comp, loose) { exports.Range = Range; function Range(range, loose) { - if ((range instanceof Range) && range.loose === loose) - return range; + if (range instanceof Range) { + if (range.loose === loose) { + return range; + } else { + return new Range(range.raw, loose); + } + } + + if (range instanceof Comparator) { + return new Range(range.value, loose); + } if (!(this instanceof Range)) return new Range(range, loose); @@ -1270,3 +1279,10 @@ function prerelease(version, loose) { var parsed = parse(version, loose); return (parsed && parsed.prerelease.length) ? parsed.prerelease : null; } + +exports.intersects = intersects; +function intersects(r1, r2, loose) { + r1 = new Range(r1, loose) + r2 = new Range(r2, loose) + return r1.intersects(r2) +} diff --git a/test/index.js b/test/index.js index e45ba24b..4996ea74 100644 --- a/test/index.js +++ b/test/index.js @@ -753,8 +753,23 @@ test('\nintersect comparators', function(t) { var actual1 = comparator1.intersects(comparator2); var actual2 = comparator2.intersects(comparator1); + var actual3 = semver.intersects(comparator1, comparator2); + var actual4 = semver.intersects(comparator2, comparator1); + var actual4 = semver.intersects(comparator1, comparator2, true); + var actual5 = semver.intersects(comparator2, comparator1, true); + var actual6 = semver.intersects(v[0], v[1]); + var actual7 = semver.intersects(v[1], v[0]); + var actual8 = semver.intersects(v[0], v[1], true); + var actual9 = semver.intersects(v[1], v[0], true); t.equal(actual1, expect); t.equal(actual2, expect); + t.equal(actual3, expect); + t.equal(actual4, expect); + t.equal(actual5, expect); + t.equal(actual6, expect); + t.equal(actual7, expect); + t.equal(actual8, expect); + t.equal(actual9, expect); }); t.end(); }); @@ -782,8 +797,24 @@ test('\nranges intersect', function(t) { var expect = v[2]; var actual1 = range1.intersects(range2); var actual2 = range2.intersects(range1); + var actual3 = semver.intersects(v[1], v[0]); + var actual4 = semver.intersects(v[0], v[1]); + var actual5 = semver.intersects(v[1], v[0], true); + var actual6 = semver.intersects(v[0], v[1], true); + var actual7 = semver.intersects(range1, range2); + var actual8 = semver.intersects(range2, range1); + var actual9 = semver.intersects(range1, range2, true); + var actual0 = semver.intersects(range2, range1, true); t.equal(actual1, expect); t.equal(actual2, expect); + t.equal(actual3, expect); + t.equal(actual4, expect); + t.equal(actual5, expect); + t.equal(actual6, expect); + t.equal(actual7, expect); + t.equal(actual8, expect); + t.equal(actual9, expect); + t.equal(actual0, expect); }); t.end(); });