Skip to content

Instantly share code, notes, and snippets.

@kaizhu256
Created September 7, 2019 17:18
Show Gist options
  • Save kaizhu256/59ef042bd0aeeaa4cde3c866b5b6d071 to your computer and use it in GitHub Desktop.
Save kaizhu256/59ef042bd0aeeaa4cde3c866b5b6d071 to your computer and use it in GitHub Desktop.
this gist will provide standalone funtion `semverCompare` and accompanying test
/*jslint devel*/
function semverCompare(aa, bb) {
/*
* this function will compare semver versions aa ? bb and return
* -1 if aa < bb
* 0 if aa = bb
* 1 if aa > bb
* https://semver.org/#spec-item-11
* example usage:
semverCompare("2.2.2", "10.2.2"); // -1
semverCompare("1.2.3", "1.2.3"); // 0
semverCompare("10.2.2", "2.2.2"); // 1
*/
var ii;
var len;
[
aa, bb
] = [
aa, bb
].map(function (val) {
val = (
/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z\-][0-9a-zA-Z\-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z\-][0-9a-zA-Z\-]*))*))?(?:\+([0-9a-zA-Z\-]+(?:\.[0-9a-zA-Z\-]+)*))?$/
).exec(val) || [
"", "", "", ""
];
val[4] = val[4] || "";
return val.slice(1, 4).concat(val[4].split("."));
});
ii = -1;
len = Math.max(aa.length, bb.length);
while (true) {
ii += 1;
if (ii >= len) {
return 0;
}
aa[ii] = aa[ii] || "";
bb[ii] = bb[ii] || "";
if (ii === 3 && aa[ii] !== bb[ii]) {
// 1.2.3 > 1.2.3-alpha
if (!aa[ii]) {
return 1;
}
// 1.2.3-alpha < 1.2.3
if (!bb[ii]) {
return -1;
}
}
if (aa[ii] !== bb[ii]) {
aa = aa[ii];
bb = bb[ii];
return (
Number(aa) < Number(bb)
? -1
: Number(aa) > Number(bb)
? 1
: aa < bb
? -1
: 1
);
}
}
}
function test() {
/*
* this function will test semverCompare's default handling-behavior
*/
var opt;
// test aa = bb
opt = [
[
"",
"1",
"1.2",
null,
undefined
],
[
"1.2.3",
"1.2.3+aa"
],
[
"1.2.3-aa",
"1.2.3-aa+bb"
]
];
opt.forEach(function ([
aa, bb
]) {
console.assert(
semverCompare(aa, bb) === 0,
[
aa, bb, semverCompare(aa, bb)
]
);
});
// test aa < bb
opt = [
"syntax-err",
"1.0.0-alpha",
"1.0.0-alpha.1",
"1.0.0-alpha.beta",
"1.0.0-beta",
"1.0.0-beta.2",
"1.0.0-beta.11",
"1.0.0-rc.1",
"1.0.0",
"2.2.2",
"2.2.10",
"2.10.2",
"10.2.2"
];
opt.reduce(function (aa, bb) {
console.assert(
semverCompare(aa, bb) === -1,
[
aa, bb, semverCompare(aa, bb)
]
);
return bb;
});
// test aa > bb
opt.reverse().reduce(function (aa, bb) {
console.assert(
semverCompare(aa, bb) === 1,
[
aa, bb, semverCompare(aa, bb)
]
);
return bb;
});
}
// run test
test();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment