|
/* |
|
* WARNING: OBSOLETE |
|
* |
|
* Please use the code at https://github.com/coolaj86/semver-utils, not this gist |
|
* npm install semver-utils |
|
*/ |
|
(function () { |
|
"use strict"; |
|
|
|
console.warn('OBSOLETE: `npm install semver-utils` and see README at https://github.com/coolaj86/semver-utils'); |
|
|
|
var good |
|
, bad |
|
, reSemver = /^((\d+)\.(\d+)\.(\d+))(?:-([\dA-Za-z\-]+(?:\.[\dA-Za-z\-]+)*))?(?:\+([\dA-Za-z\-]+(?:\.[\dA-Za-z\-]+)*))?$/ |
|
; |
|
|
|
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" |
|
, "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.!@#$%" |
|
]; |
|
|
|
function parseSemver(version) { |
|
console.warn('OBSOLETE: `npm install semver-utils` and see README at https://github.com/coolaj86/semver-utils'); |
|
// semver, major, minor, patch |
|
// https://github.com/mojombo/semver/issues/32 |
|
// https://github.com/isaacs/node-semver/issues/10 |
|
// optional v |
|
var m = reSemver.exec(version) || [] |
|
, ver = { |
|
semver: m[0] |
|
, version: m[1] |
|
, major: m[2] |
|
, minor: m[3] |
|
, patch: m[4] |
|
, release: m[5] |
|
, build: m[6] |
|
} |
|
; |
|
|
|
if (0 === m.length) { |
|
ver = null; |
|
} |
|
|
|
return ver; |
|
} |
|
|
|
good.every(function (version) { |
|
var result = parseSemver(version) |
|
; |
|
|
|
if (!result) { |
|
throw new Error("didn't parse something that should be parseable: " + version); |
|
} |
|
|
|
return true; |
|
}); |
|
|
|
bad.every(function (version) { |
|
var result = parseSemver(version) |
|
; |
|
|
|
if (result) { |
|
throw new Error("parsed something that should not be parseable: " + version); |
|
} |
|
|
|
return true; |
|
}); |
|
|
|
console.log(parseSemver("a.b.c")); // null |
|
console.log(parseSemver("1.0.3")); |
|
/* |
|
{ |
|
semver: 1.0.3 |
|
, major: 1 |
|
, minor: 0 |
|
, patch: 3 |
|
} |
|
*/ |
|
|
|
console.log(parseSemver("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(parseSemver("1.0.0-rc.1-1")); |
|
console.log(parseSemver("1.0.0-rc.1+build.1-b")); |
|
console.log(parseSemver("1.0.0-rc.1-1+build.1-b")); |
|
console.log(parseSemver("2.0.0+build.acebfde1284-alpha.123.abc")); |
|
}()); |
The use of "A-z" in the regex allows for the six interstitial characters between 'Z' and 'a' to be included in identifiers. (i.e. left-square-bracket, backslash, right-square-bracket, caret, underscore, and backtick). These are not legal identifier characters. Adding these two negative test cases between lines 43 and 44 demonstrates the problem:
Replacing the four instances of "A-z" with "A-Za-z" fixes this issue.