diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/package.json b/package.json index 5f679c9..57dd498 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Tools for manipulating semver strings and objects", "main": "semver-utils.js", "scripts": { - "test": "node semver-utils-test.js" + "test": "mocha" }, "repository": { "type": "git", @@ -18,5 +18,9 @@ ], "author": "AJ ONeal", "license": "APACHEv2", - "readmeFilename": "README.md" + "readmeFilename": "README.md", + "devDependencies": { + "chai": "^3.0.0", + "mocha": "^2.2.5" + } } diff --git a/semver-utils-test.js b/semver-utils-test.js deleted file mode 100644 index 9bfa0a2..0000000 --- a/semver-utils-test.js +++ /dev/null @@ -1,131 +0,0 @@ -(function () { - var semverutils = require('./semver-utils') - ; - - function testParseRange() { - console.info('testParseRange'); - var good = - [ 'v1.0.0' - , '< v2.0.0' - , '~v2.0.0' - , '~1.0.0' - , '~1.0.0 || >= 1.1.7 < 2.0.0+build.1848' - , '~1.0.0 || >= 1.1.7 < 2.0.0+build.1848 || v1.1.3' - , '~1.0.0 || >= 1.1.7 < 2.0.0+build.1848 || v1.1.3 || 2.0.1-alpha.1227' - , '~1.0.0 || >= 1.1.7 < 2.0.0+build.1848 || v1.1.3 || 2.0.1-alpha.1227 || 1.0.0 - 1.0.x' - , '~1.0.0 || >= 1.1.7 < 2.0.0+build.1848 || v1.1.3 || 2.0.1-alpha.1227 || 1.0.0 - 1.0.x || 1.*' - ] - ; - - good.every(function (range) { - var result = semverutils.parseRange(range) - ; - - if (!result || 0 === result.length) { - throw new Error("didn't parse something that should be parseable: " + range); - } - - return true; - }); - - console.log(good[good.length - 1]); - console.log(semverutils.stringifyRange(semverutils.parseRange(good[good.length - 1]))); - } - - function testParse() { - console.info('testParse'); - var good - , bad - ; - - good = [ - "1.0.8" - , "1.23.7" - , "2.0.0-alpha.123.abc" - , "2.0.0-alpha.123.abc+build.acebfde1284" - , "1.0.0-alpha" - , "1.0.0-alpha.1" - , "1.0.0-0.3.7" - , "1.0.0-x.7.z.92" - , "1.0.0-alpha" - , "1.0.0-alpha.1" - , "1.0.0-beta.2" - , "1.0.0-beta.11" - , "1.0.0-rc.1" - , "1.0.0-rc.1+build.1" - , "1.0.0-rc.1+build.1-b" - , "1.0.0" - , "1.0.0+0.3.7" - , "1.3.7+build" - , "1.3.7+build.2.b8f12d7" - , "1.3.7+build.11.e0f985a" - , "1.3.7+build.11.e0f9-85a" - , "1.0.0+build-acbe" - , "2.0.0+build.acebfde1284-alpha.123.abc" - ]; - - bad = [ - // "v1.0.0" now allows optional 'v' - , "a.b.c" - , "1" - , "1.0.0b" - , "1.0" - , "1.0.0+b[\\]^_`uild" // [,\,],^,_,` are between A-z, but not A-Za-z - , "1.0.0+build-acbe." // trailing period - , "1.0.0+build.!@#$%" - ]; - - good.every(function (version) { - var result = semverutils.parse(version) - ; - - if (!result) { - throw new Error("didn't parse something that should be parseable: " + version); - } - - return true; - }); - - bad.every(function (version) { - var result = semverutils.parse(version) - ; - - if (result) { - throw new Error("parsed something that should not be parseable: " + version); - } - - return true; - }); - - console.log(semverutils.parse("a.b.c")); // null - console.log(semverutils.parse("1.0.3")); - /* - { - semver: 1.0.3 - , major: 1 - , minor: 0 - , patch: 3 - } - */ - - console.log(semverutils.parse("1.0.3-rc.1+build.aef312")); - /* - { - semver: v1.0.3-rc.1+build.aef312 - , major: 1 - , minor: 0 - , patch: 3 - , build: build.aef312 - , release: rc.1 - } - */ - - console.log(semverutils.parse("1.0.0-rc.1-1")); - console.log(semverutils.parse("1.0.0-rc.1+build.1-b")); - console.log(semverutils.parse("1.0.0-rc.1-1+build.1-b")); - console.log(semverutils.parse("2.0.0+build.acebfde1284-alpha.123.abc")); - } - - testParse(); - testParseRange(); -}()); diff --git a/semver-utils.js b/semver-utils.js index 20b3fff..4307a12 100644 --- a/semver-utils.js +++ b/semver-utils.js @@ -8,9 +8,20 @@ // | | | |optional build prefixed by '+' var reSemver = /^v?((\d+)\.(\d+)\.(\d+))(?:-([\dA-Za-z\-]+(?:\.[\dA-Za-z\-]+)*))?(?:\+([\dA-Za-z\-]+(?:\.[\dA-Za-z\-]+)*))?$/ //, reSemverRange = /\s*((\|\||\-)|(([<>~]?=?)\s*(v)?([0-9]+)(\.(x|[0-9]+))?(\.(x|[0-9]+))?(([\-+])([a-zA-Z0-9\.]+))?))\s*/g - , reSemverRange = /\s*((\|\||\-)|(([<>~]?=?)\s*(v)?([0-9]+)(\.(x|\*|[0-9]+))?(\.(x|\*|[0-9]+))?(([\-+])([a-zA-Z0-9\.]+))?))\s*/g + , reSemverRange = /\s*((\|\||\-)|(([<>~^]?=?)\s*(v)?([0-9]+)(\.(x|\*|[0-9]+))?(\.(x|\*|[0-9]+))?(([\-+])([a-zA-Z0-9\.-]+))?))\s*/g ; + // Returns a new object with all of the undefined properties removed from the given object + function pruned(obj) { + var o = {}; + for(var key in obj) { + if ('undefined' !== typeof obj[key]) { + o[key] = obj[key]; + } + } + return o; + } + function stringifySemver(obj) { var str = '' ; @@ -43,7 +54,7 @@ } arr.forEach(stringify); - + return str.trim(); } @@ -86,7 +97,7 @@ // https://github.com/isaacs/node-semver/issues/10 // optional v var m = reSemver.exec(version) || [] - , ver = new SemVer({ + , ver = new SemVer(pruned({ semver: m[0] , version: m[1] , major: m[2] @@ -94,13 +105,13 @@ , patch: m[4] , release: m[5] , build: m[6] - }) + })) ; - + if (0 === m.length) { ver = null; } - + return ver; } @@ -109,18 +120,9 @@ , arr = [] , obj ; - - function prune(key) { - if ('undefined' === typeof obj[key]) { - delete obj[key]; - } - } - - while (true) { - m = reSemverRange.exec(str); - if (!m) { - break; - } + + + while (m = reSemverRange.exec(str)) { obj = { semver: m[3] , operator: m[4] || m[2] @@ -134,11 +136,10 @@ if ('-' === m[12]) { obj.release = m[13]; } - Object.keys(obj).forEach(prune); - arr.push(new SemVer(obj)); + arr.push(new SemVer(pruned(obj))); //console.log(m); } - + //return new SemVerRange(arr); return arr; } diff --git a/test/deepOwnEqual.js b/test/deepOwnEqual.js new file mode 100644 index 0000000..b7dd276 --- /dev/null +++ b/test/deepOwnEqual.js @@ -0,0 +1,26 @@ +var assert = require('chai').assert; + +// we need to define our own deepEqual function that ignores properties that are not hasOwnProperty. Not supported in chai.assert.deepEqual as of v3.0.0. +function deepOwnEqual(a, b) { + + // if arrays of objects, recurse down to the objects + if(Array.isArray(a) && Array.isArray(b)) { + assert.deepEqual(a.length, b.length, 'Arrays have different lengths') + for(var i=0; i