2020-05-25 23:14:59 +08:00
|
|
|
/*
|
|
|
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
|
|
Author Tobias Koppers @sokra
|
|
|
|
*/
|
|
|
|
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {string} version version as string
|
|
|
|
* @returns {(number|string)[]} version as array
|
|
|
|
*/
|
|
|
|
exports.parseRequiredVersion = version => {
|
|
|
|
let fuzzyStart = Infinity;
|
|
|
|
if (version.startsWith(">=")) {
|
|
|
|
fuzzyStart = 0;
|
|
|
|
version = version.slice(2);
|
|
|
|
} else if (version.startsWith("^")) {
|
|
|
|
fuzzyStart = 1;
|
|
|
|
version = version.slice(1);
|
|
|
|
} else if (version.startsWith("~")) {
|
|
|
|
fuzzyStart = 2;
|
|
|
|
version = version.slice(1);
|
|
|
|
}
|
|
|
|
return version
|
|
|
|
.split(".")
|
|
|
|
.map((x, i) => (i >= fuzzyStart && `${+x}` === x ? +x : x));
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {string} version version as string
|
|
|
|
* @returns {(number|string)[]} version as array
|
|
|
|
*/
|
|
|
|
exports.parseVersion = version => {
|
|
|
|
return version.split(".").map(x => (`${+x}` === x ? +x : x));
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {(number|string)[]} version version
|
|
|
|
* @returns {string} version as string
|
|
|
|
*/
|
|
|
|
exports.versionToString = version => {
|
2020-05-26 23:11:21 +08:00
|
|
|
if (!version) return "(unknown)";
|
2020-05-25 23:14:59 +08:00
|
|
|
const info = version.map(value =>
|
|
|
|
typeof value !== "string"
|
|
|
|
? {
|
|
|
|
type: "min",
|
|
|
|
value: `${value}`
|
|
|
|
}
|
|
|
|
: `${+value}` === value
|
|
|
|
? {
|
|
|
|
type: "exact",
|
|
|
|
value
|
|
|
|
}
|
|
|
|
: {
|
|
|
|
type: "tag",
|
|
|
|
value
|
|
|
|
}
|
|
|
|
);
|
|
|
|
switch (`${info[0].type}.${info.length > 1 ? info[1].type : "undefined"}`) {
|
|
|
|
case "exact.min":
|
|
|
|
case "tag.min":
|
|
|
|
if (!info.slice(2).some(i => i.type === "exact"))
|
|
|
|
return `^${version.join(".")}`;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "exact.exact":
|
|
|
|
case "exact.tag":
|
|
|
|
case "tag.exact":
|
|
|
|
case "tag.tag":
|
|
|
|
if (!info.slice(2).some(i => i.type === "exact"))
|
|
|
|
return `~${version.join(".")}`;
|
|
|
|
else if (!info.slice(2).some(i => i.type === "min"))
|
|
|
|
return version.join(".");
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "min.min":
|
|
|
|
case "min.tag":
|
|
|
|
if (!info.slice(2).some(i => i.type === "exact"))
|
|
|
|
return `>=${version.join(".")}`;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "min.undefined":
|
|
|
|
return `>=${version.join(".")}`;
|
|
|
|
|
|
|
|
case "exact.undefined":
|
|
|
|
case "tag.undefined":
|
|
|
|
return version.join(".");
|
|
|
|
}
|
|
|
|
return info
|
|
|
|
.map(i => (i.type === "exact" ? i.value : `[>=${i.value}]`))
|
|
|
|
.join(".");
|
|
|
|
};
|