From df92e97cb65df3088b090ba76320d05938948514 Mon Sep 17 00:00:00 2001 From: Rainer Killinger Date: Tue, 5 Jul 2022 13:01:29 +0200 Subject: [PATCH] fix: simplify dependency version checking --- src/cli.ts | 7 ++-- src/common.ts | 93 +++++++++++++++++++++++++++------------------------ 2 files changed, 55 insertions(+), 45 deletions(-) diff --git a/src/cli.ts b/src/cli.ts index 868a0ffe..b72152d5 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -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}'.`); } diff --git a/src/common.ts b/src/common.ts index 59f4dea5..8dc7d4d1 100644 --- a/src/common.ts +++ b/src/common.ts @@ -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}'.`); } }