vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
56 lines (55 loc) • 2.31 kB
JavaScript
export { assertVersion };
export { isVersionMatch };
import pc from '@brillout/picocolors';
import { assert, assertUsage } from './assert.js';
import { assertIsNotBrowser } from './assertIsNotBrowser.js';
import { joinEnglish } from './joinEnglish.js';
assertIsNotBrowser();
function assertVersion(dependencyName, versionActual, versionExpectedList) {
assertUsage(isVersionMatch(versionActual, versionExpectedList), `${pc.bold(dependencyName)} ${pc.red(pc.bold(versionActual))} isn't supported, use ${pc.bold(dependencyName)} ${joinEnglish([...versionExpectedList, 'above'].map((v) => pc.green(pc.bold(v))), 'or')}.`);
}
function isVersionMatch(versionActual, versionExpectedList) {
assert(versionActual);
assert(versionExpectedList);
assert(versionExpectedList.length > 0);
const versionActualMajor = parseVersion(versionActual)[0];
const versionExpectedListSameMajor = versionExpectedList.filter((versionExpected) => {
const versionExpectedMajor = parseVersion(versionExpected)[0];
return versionExpectedMajor === versionActualMajor;
});
assert(versionExpectedListSameMajor.length <= 1);
const versionExpectedSameMajor = versionExpectedListSameMajor[0];
if (versionExpectedSameMajor) {
return isSameOrAbove(versionActual, versionExpectedSameMajor);
}
else {
return versionExpectedList.every((versionExpected) => isSameOrAbove(versionActual, versionExpected));
}
}
function isSameOrAbove(versionActual, versionExpected) {
const p1 = parseVersion(versionActual);
const p2 = parseVersion(versionExpected);
// major
if (p1[0] !== p2[0])
return p1[0] > p2[0];
// minor
if (p1[1] !== p2[1])
return p1[1] > p2[1];
// patch
if (p1[2] !== p2[2])
return p1[2] > p2[2];
// Same version
return true;
}
function parseVersion(version) {
// Remove pre-release tag
version = version.split('-')[0];
let partsStr = version.split('.');
// Git seems to be using a fourth number: https://github.com/git/git/tree/master/Documentation/RelNotes
partsStr = partsStr.slice(0, 3);
// major.minor.patch
assert(partsStr.length === 3);
assert(partsStr.every((s) => s.length > 0));
const parts = partsStr.map((s) => parseInt(s, 10));
return parts;
}