fix: simplify dependency version checking

This commit is contained in:
Rainer Killinger
2022-07-05 13:01:29 +02:00
parent 0d3c2151d7
commit df92e97cb6
2 changed files with 55 additions and 45 deletions

View File

@@ -105,8 +105,11 @@ checkCopyrightYears(projectPath, 'src', commander.opts().replace);
const indentation = 2;
if (packageJsonChanged) {
// eslint-disable-next-line unicorn/no-null
writeFileSync(path.resolve(projectPath, 'package.json'), JSON.stringify(packageJson, null, indentation));
writeFileSync(
path.resolve(projectPath, 'package.json'),
// eslint-disable-next-line unicorn/no-null
`${JSON.stringify(packageJson, null, indentation)}\n`,
);
consoleLog(`Changes were written to '${packageJsonPath}'.`);
}

View File

@@ -204,58 +204,65 @@ export function consoleLog(...arguments_: string[]): void {
* @param packageJson package.json to check dependencies in
*/
export function checkDependencies(rules: Rules, packageJson: PackageJSON): void {
if (typeof packageJson.dependencies === 'object') {
for (const dependency of rules.dependencies) {
const [name, version] = dependency.split(':');
const installedVersion = packageJson.dependencies[name];
checkPackages(rules.dependencies, packageJson.dependencies, false);
checkPackages(rules.devDependencies, packageJson.devDependencies, true);
}
if (
typeof packageJson.dependencies === 'undefined' ||
typeof packageJson.dependencies[name] === 'undefined'
) {
consoleWarn(`Dependency '${name}' is missing.
Please install with 'npm install --save-exact ${name}'.`);
} else if (
typeof version !== 'undefined' &&
typeof valid(version) === 'string' &&
!satisfies(installedVersion, version)
) {
consoleWarn(
`Version '${installedVersion}' of dependency '${name} does not satisfy constraint '${version}'.`,
);
/**
* Check dependencies are installed
*
* @param expected Expected npm package entries
* @param acutal Actual entries within package.json
* @param development Indicator if this concerns dev dependencies
*/
export function checkPackages(
expected: string[] | undefined,
acutal: {[key: string]: string} | undefined,
development = false,
): void {
if (typeof expected === 'undefined') {
return;
}
if (typeof acutal === 'undefined') {
reportPackage(expected, development);
return;
}
for (let npmPackage of expected) {
const [name, expectedVersion] = npmPackage.split(':');
const installedVersion = acutal[name];
if (typeof installedVersion === 'undefined') {
reportPackage(npmPackage, development);
continue;
}
if (typeof packageJson.devDependencies === 'object') {
for (const developmentDependency of rules.devDependencies) {
const [developmentName, developmentVersion] = developmentDependency.split(':');
let installedVersion = packageJson.devDependencies[developmentName];
if (typeof packageJson.dependencies === 'object') {
const [name] = developmentDependency.split(':');
if (typeof packageJson.devDependencies[name] === 'string') {
installedVersion = packageJson.dependencies[name];
if (typeof expectedVersion === 'undefined') {
continue;
}
}
if (
(typeof packageJson.dependencies === 'undefined' ||
typeof packageJson.dependencies[developmentName] === 'undefined') &&
(typeof packageJson.devDependencies === 'undefined' ||
typeof packageJson.devDependencies[developmentName] === 'undefined')
) {
consoleWarn(`Dev dependency '${developmentName}' is missing.
Please install with 'npm install --save-exact --save-dev ${developmentName}'.`);
} else if (
typeof developmentVersion !== 'undefined' &&
typeof valid(developmentVersion) === 'string' &&
!satisfies(installedVersion, developmentVersion)
) {
if (typeof valid(expectedVersion) === 'string' && !satisfies(installedVersion, expectedVersion)) {
npmPackage = npmPackage.replace(':', '@');
consoleWarn(
`Version '${installedVersion}' of dev dependency '${developmentName} does not satisfy constraint '${developmentVersion}'.`,
`Version '${installedVersion}' of ${
development ? 'dev ' : ' '
}dependency '${name}' does not satisfy constraint '${expectedVersion}'.
Please install with 'npm install --save-exact ${development ? '--save-dev ' : ''}${npmPackage}'.`,
);
}
}
}
/**
* Reports truly missing npm packages
*
* @param missing Missing npm package entries
* @param development Indicator if this concerns dev dependencies
*/
export function reportPackage(missing: string[] | string, development = false) {
if (!Array.isArray(missing)) {
missing = [missing];
}
for (let npmPackage of missing) {
npmPackage = npmPackage.replace(':', '@');
consoleWarn(`${development ? 'Dev dependency' : 'Dependency'} '${npmPackage}' is missing.
Please install with 'npm install --save-exact ${development ? '--save-dev ' : ''}${npmPackage}'.`);
}
}