Created
November 23, 2022 14:33
-
-
Save erdesigns-eu/54da9c5a0579aaaa96f8c5c77350a659 to your computer and use it in GitHub Desktop.
Test dependencies in package.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Terminal colors and style | |
*/ | |
const Color = { | |
Reset: "\x1b[0m", | |
Bright: "\x1b[1m", | |
Dim: "\x1b[2m", | |
Underscore: "\x1b[4m", | |
Blink: "\x1b[5m", | |
Reverse: "\x1b[7m", | |
Hidden: "\x1b[8m", | |
FgBlack: "\x1b[30m", | |
FgRed: "\x1b[31m", | |
FgGreen: "\x1b[32m", | |
FgYellow: "\x1b[33m", | |
FgBlue: "\x1b[34m", | |
FgMagenta: "\x1b[35m", | |
FgCyan: "\x1b[36m", | |
FgWhite: "\x1b[37m", | |
BgBlack: "\x1b[40m", | |
BgRed: "\x1b[41m", | |
BgGreen: "\x1b[42m", | |
BgYellow: "\x1b[43m", | |
BgBlue: "\x1b[44m", | |
BgMagenta: "\x1b[45m", | |
BgCyan: "\x1b[46m", | |
BgWhite: "\x1b[47m" | |
} | |
function colorString(color, string) { | |
return `${color}${string}${Color.Reset}`; | |
} | |
// Load package.json | |
const packageJSON = require('./package.json'); | |
/** | |
* Is dependency at least version * or higher | |
* @param version Dependency version | |
* @param compare Compare version | |
* @returns Boolean | |
*/ | |
const isAtLeastOrHigher = (version, compare) => { | |
const dependencyVersion = version.replace('^', '').split('.').map((n) => Number.parseInt(n)); | |
const verMajor = dependencyVersion[0]; | |
const verMinor = dependencyVersion[1]; | |
const verBuild = dependencyVersion[2]; | |
const compareVersion = compare.replace('^', '').split('.').map((n) => Number.parseInt(n)); | |
const comMajor = compareVersion[0]; | |
const comMinor = compareVersion[1]; | |
const comBuild = compareVersion[2]; | |
const passMajor = (verMajor >= comMajor); | |
const passMinor = (verMajor === comMajor ? verMinor >= comMinor : passMajor); | |
const passBuild = verBuild && comBuild ? (verMinor === comMinor ? verBuild >= comBuild : passMinor) : true; | |
return passMajor && passMinor && passBuild; | |
} | |
/** | |
* Is dependency maximum version * or lower | |
* @param version Dependency version | |
* @param compare Compare version | |
* @returns Boolean | |
*/ | |
const isMaximumOrLower = (version, compare) => { | |
const dependencyVersion = version.replace('^').split('.').map((n) => Number.parseInt(n)); | |
const verMajor = dependencyVersion[0]; | |
const verMinor = dependencyVersion[1]; | |
const verBuild = dependencyVersion[2]; | |
const compareVersion = compare.replace('^').split('.').map((n) => Number.parseInt(n)); | |
const comMajor = compareVersion[0]; | |
const comMinor = compareVersion[1]; | |
const comBuild = compareVersion[2]; | |
const passMajor = (verMajor <= comMajor); | |
const passMinor = (verMajor === comMajor ? verMinor <= comMinor : passMajor); | |
const passBuild = verBuild && comBuild ? (verMinor === comMinor ? verBuild <= comBuild : passMinor) : true; | |
return passMajor && passMinor && passBuild; | |
} | |
/** | |
* Check dependency packages and validate version | |
* @param name Name of the package | |
* @param versionMin Minimum version | |
* @param versionMax Maximum version | |
*/ | |
const checkDependency = (name, versionMin, versionMax) => { | |
const dependencies = Object.entries(packageJSON.dependencies); | |
const dependency = dependencies.find((d) => String(d[0]).match(name)); | |
if (!dependency) { | |
throw new Error(`Dependency ${colorString(Color.BgRed, name)} could not be found in package.json!`); | |
} | |
const dependencyVersion = String(dependency[1]); | |
if (!isAtLeastOrHigher(dependencyVersion, versionMin)) { | |
throw new Error(`Dependency ${name} is version ${colorString(Color.BgRed, dependencyVersion)} but needs to be at least version ${colorString(Color.BgRed, versionMin)}!`); | |
} | |
if (versionMax && !isMaximumOrLower(dependencyVersion, versionMax)) { | |
throw new Error(`Dependency ${name} is version ${colorString(Color.BgRed, dependencyVersion)} but must be maximum version ${colorString(Color.BgRed, versionMax)}!`); | |
} | |
return `Dependency ${name}: ${colorString(Color.FgGreen, 'OK')}`; | |
} | |
/** | |
* Various Dependencies | |
*/ | |
const variousDependencies = [ | |
{ package: '@fortawesome/fontawesome-free', min: '5.0' }, | |
{ package: 'bcryptjs', min: '2.0' } | |
]; | |
/** | |
* Check and log dependencies | |
* @param dependencies Array with dependencies | |
*/ | |
const executeDependenciesCheck = (name, dependencies) => { | |
console.log(`${colorString(Color.FgYellow, `Checking ${name} dependencies`)}\n`) | |
let errors = 0; | |
dependencies.forEach((dependency) => { | |
try { | |
console.log(checkDependency(dependency.package, dependency.min, dependency.max)); | |
} catch (error) { | |
errors++; | |
console.log(error.message); | |
} | |
}); | |
if (errors === 0) { | |
console.log('\nFinished with ' + colorString(Color.FgGreen, errors) + ' errors!\n'); | |
} else { | |
console.log('\nFinished with ' + colorString(Color.FgRed, errors) + ' errors!\n'); | |
} | |
} | |
executeDependenciesCheck('Various', variousDependencies); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment