From 86c8bd375880bceffc2bf0ab17e0d5be0432d3d3 Mon Sep 17 00:00:00 2001 From: tclindner <5178550+tclindner@users.noreply.github.com> Date: Sun, 20 Mar 2022 13:05:18 -0500 Subject: [PATCH 1/2] Improve output for no-*-version-* rules --- src/rules/no-caret-version-dependencies.ts | 18 +++++--- src/rules/no-caret-version-devDependencies.ts | 18 +++++--- src/rules/no-tilde-version-dependencies.ts | 18 +++++--- src/rules/no-tilde-version-devDependencies.ts | 18 +++++--- src/validators/dependency-audit.ts | 44 +++++++++++++----- test/unit/linter/linter.test.ts | 4 +- .../no-caret-version-dependencies.test.ts | 4 +- .../no-caret-version-devDependencies.test.ts | 4 +- .../no-tilde-version-dependencies.test.ts | 4 +- .../no-tilde-version-devDependencies.test.ts | 4 +- test/unit/validators/dependency-audit.test.ts | 46 ++++++++++++++----- .../no-caret-version-dependencies.md | 1 + .../no-caret-version-devDependencies.md | 1 + .../no-tilde-version-dependencies.md | 1 + .../no-tilde-version-devDependencies.md | 1 + 15 files changed, 129 insertions(+), 57 deletions(-) diff --git a/src/rules/no-caret-version-dependencies.ts b/src/rules/no-caret-version-dependencies.ts index 7b4f43b1..c151e85c 100644 --- a/src/rules/no-caret-version-dependencies.ts +++ b/src/rules/no-caret-version-dependencies.ts @@ -1,24 +1,28 @@ import {PackageJson} from 'type-fest'; -import {doVersContainInvalidRange} from '../validators/dependency-audit'; +import {auditDependenciesForInvalidRange} from '../validators/dependency-audit'; import {LintIssue} from '../lint-issue'; import {RuleType} from '../types/rule-type'; import {Severity} from '../types/severity'; const lintId = 'no-caret-version-dependencies'; const nodeName = 'dependencies'; -const message = 'You are using an invalid version range. Please do not use ^.'; export const ruleType = RuleType.OptionalObject; // eslint-disable-next-line @typescript-eslint/no-explicit-any export const lint = (packageJsonData: PackageJson | any, severity: Severity, config: any): LintIssue | null => { const rangeSpecifier = '^'; + const auditResult = auditDependenciesForInvalidRange(packageJsonData, nodeName, rangeSpecifier, config); - if ( - packageJsonData.hasOwnProperty(nodeName) && - doVersContainInvalidRange(packageJsonData, nodeName, rangeSpecifier, config) - ) { - return new LintIssue(lintId, severity, nodeName, message); + if (packageJsonData.hasOwnProperty(nodeName) && auditResult.hasInvalidRangeVersions) { + return new LintIssue( + lintId, + severity, + nodeName, + `You are using an invalid version range. Please do not use ^. Invalid ${nodeName} include: ${auditResult.dependenciesWithInvalidVersionRange.join( + ', ' + )}` + ); } return null; diff --git a/src/rules/no-caret-version-devDependencies.ts b/src/rules/no-caret-version-devDependencies.ts index 67ee8ab3..cb75b7b5 100644 --- a/src/rules/no-caret-version-devDependencies.ts +++ b/src/rules/no-caret-version-devDependencies.ts @@ -1,24 +1,28 @@ import {PackageJson} from 'type-fest'; -import {doVersContainInvalidRange} from '../validators/dependency-audit'; +import {auditDependenciesForInvalidRange} from '../validators/dependency-audit'; import {LintIssue} from '../lint-issue'; import {RuleType} from '../types/rule-type'; import {Severity} from '../types/severity'; const lintId = 'no-caret-version-devDependencies'; const nodeName = 'devDependencies'; -const message = 'You are using an invalid version range. Please do not use ^.'; export const ruleType = RuleType.OptionalObject; // eslint-disable-next-line @typescript-eslint/no-explicit-any export const lint = (packageJsonData: PackageJson | any, severity: Severity, config: any): LintIssue | null => { const rangeSpecifier = '^'; + const auditResult = auditDependenciesForInvalidRange(packageJsonData, nodeName, rangeSpecifier, config); - if ( - packageJsonData.hasOwnProperty(nodeName) && - doVersContainInvalidRange(packageJsonData, nodeName, rangeSpecifier, config) - ) { - return new LintIssue(lintId, severity, nodeName, message); + if (packageJsonData.hasOwnProperty(nodeName) && auditResult.hasInvalidRangeVersions) { + return new LintIssue( + lintId, + severity, + nodeName, + `You are using an invalid version range. Please do not use ^. Invalid ${nodeName} include: ${auditResult.dependenciesWithInvalidVersionRange.join( + ', ' + )}` + ); } return null; diff --git a/src/rules/no-tilde-version-dependencies.ts b/src/rules/no-tilde-version-dependencies.ts index 988aa897..5f80ce51 100644 --- a/src/rules/no-tilde-version-dependencies.ts +++ b/src/rules/no-tilde-version-dependencies.ts @@ -1,24 +1,28 @@ import {PackageJson} from 'type-fest'; -import {doVersContainInvalidRange} from '../validators/dependency-audit'; +import {auditDependenciesForInvalidRange} from '../validators/dependency-audit'; import {LintIssue} from '../lint-issue'; import {RuleType} from '../types/rule-type'; import {Severity} from '../types/severity'; const lintId = 'no-tilde-version-dependencies'; const nodeName = 'dependencies'; -const message = 'You are using an invalid version range. Please do not use ~.'; export const ruleType = RuleType.OptionalObject; // eslint-disable-next-line @typescript-eslint/no-explicit-any export const lint = (packageJsonData: PackageJson | any, severity: Severity, config: any): LintIssue | null => { const rangeSpecifier = '~'; + const auditResult = auditDependenciesForInvalidRange(packageJsonData, nodeName, rangeSpecifier, config); - if ( - packageJsonData.hasOwnProperty(nodeName) && - doVersContainInvalidRange(packageJsonData, nodeName, rangeSpecifier, config) - ) { - return new LintIssue(lintId, severity, nodeName, message); + if (packageJsonData.hasOwnProperty(nodeName) && auditResult.hasInvalidRangeVersions) { + return new LintIssue( + lintId, + severity, + nodeName, + `You are using an invalid version range. Please do not use ~. Invalid ${nodeName} include: ${auditResult.dependenciesWithInvalidVersionRange.join( + ', ' + )}` + ); } return null; diff --git a/src/rules/no-tilde-version-devDependencies.ts b/src/rules/no-tilde-version-devDependencies.ts index 4f5d052e..8214d545 100644 --- a/src/rules/no-tilde-version-devDependencies.ts +++ b/src/rules/no-tilde-version-devDependencies.ts @@ -1,24 +1,28 @@ import {PackageJson} from 'type-fest'; -import {doVersContainInvalidRange} from '../validators/dependency-audit'; +import {auditDependenciesForInvalidRange} from '../validators/dependency-audit'; import {LintIssue} from '../lint-issue'; import {RuleType} from '../types/rule-type'; import {Severity} from '../types/severity'; const lintId = 'no-tilde-version-devDependencies'; const nodeName = 'devDependencies'; -const message = 'You are using an invalid version range. Please do not use ~.'; export const ruleType = RuleType.OptionalObject; // eslint-disable-next-line @typescript-eslint/no-explicit-any export const lint = (packageJsonData: PackageJson | any, severity: Severity, config: any): LintIssue | null => { const rangeSpecifier = '~'; + const auditResult = auditDependenciesForInvalidRange(packageJsonData, nodeName, rangeSpecifier, config); - if ( - packageJsonData.hasOwnProperty(nodeName) && - doVersContainInvalidRange(packageJsonData, nodeName, rangeSpecifier, config) - ) { - return new LintIssue(lintId, severity, nodeName, message); + if (packageJsonData.hasOwnProperty(nodeName) && auditResult.hasInvalidRangeVersions) { + return new LintIssue( + lintId, + severity, + nodeName, + `You are using an invalid version range. Please do not use ~. Invalid ${nodeName} include: ${auditResult.dependenciesWithInvalidVersionRange.join( + ', ' + )}` + ); } return null; diff --git a/src/validators/dependency-audit.ts b/src/validators/dependency-audit.ts index 28685222..ffbf031e 100755 --- a/src/validators/dependency-audit.ts +++ b/src/validators/dependency-audit.ts @@ -157,28 +157,41 @@ export const areVersRangesValid = ( return rangesValid; }; + +export interface AuditDependenciesForInvalidRangeResponse { + hasInvalidRangeVersions: boolean; + dependenciesWithInvalidVersionRange: string[]; + dependenciesWithoutInvalidVersionRange: string[]; +} + /** * Determines if any dependencies have a version string that starts with the specified invalid range - * @param {object} packageJsonData Valid JSON - * @param {string} nodeName Name of a node in the package.json file - * @param {string} rangeSpecifier A version range specifier - * @param {object} config Rule configuration - * @return {Boolean} True if any dependencies versions start with the invalid range, false if they don't. + * @param packageJsonData Valid JSON + * @param nodeName Name of a node in the package.json file + * @param rangeSpecifier A version range specifier + * @param config Rule configuration + * @return True if any dependencies versions start with the invalid range, false if they don't. */ -export const doVersContainInvalidRange = ( +export const auditDependenciesForInvalidRange = ( // eslint-disable-next-line @typescript-eslint/no-explicit-any packageJsonData: PackageJson | any, nodeName: string, rangeSpecifier: string, // eslint-disable-next-line @typescript-eslint/no-explicit-any config: any -): boolean => { +): AuditDependenciesForInvalidRangeResponse => { + let hasInvalidRangeVersions = false; + const dependenciesWithInvalidVersionRange = []; + const dependenciesWithoutInvalidVersionRange = []; + if (!packageJsonData.hasOwnProperty(nodeName)) { - return false; + return { + hasInvalidRangeVersions, + dependenciesWithInvalidVersionRange, + dependenciesWithoutInvalidVersionRange, + }; } - let containsInvalidVersion = false; - // eslint-disable-next-line no-restricted-syntax for (const dependencyName in packageJsonData[nodeName]) { if (hasExceptions(config) && config.exceptions.includes(dependencyName)) { @@ -189,11 +202,18 @@ export const doVersContainInvalidRange = ( const dependencyVersion = packageJsonData[nodeName][dependencyName]; if (doesVersStartsWithRange(dependencyVersion, rangeSpecifier)) { - containsInvalidVersion = true; + hasInvalidRangeVersions = true; + dependenciesWithInvalidVersionRange.push(dependencyName); + } else { + dependenciesWithoutInvalidVersionRange.push(dependencyName); } } - return containsInvalidVersion; + return { + hasInvalidRangeVersions, + dependenciesWithInvalidVersionRange, + dependenciesWithoutInvalidVersionRange, + }; }; export interface AbsoluteVersionCheckerResult { diff --git a/test/unit/linter/linter.test.ts b/test/unit/linter/linter.test.ts index abb06d02..fdacabd7 100755 --- a/test/unit/linter/linter.test.ts +++ b/test/unit/linter/linter.test.ts @@ -460,7 +460,7 @@ describe('linter Unit Tests', () => { 'no-caret-version-dependencies', Severity.Error, 'dependencies', - 'You are using an invalid version range. Please do not use ^.' + 'You are using an invalid version range. Please do not use ^. Invalid dependencies include: myModule' ); const expected = { errorCount: 1, @@ -520,7 +520,7 @@ describe('linter Unit Tests', () => { 'no-caret-version-dependencies', Severity.Error, 'dependencies', - 'You are using an invalid version range. Please do not use ^.' + 'You are using an invalid version range. Please do not use ^. Invalid dependencies include: myModule' ); const expected = { errorCount: 1, diff --git a/test/unit/rules/no-caret-version-dependencies.test.ts b/test/unit/rules/no-caret-version-dependencies.test.ts index 7eb2555b..080b98fa 100644 --- a/test/unit/rules/no-caret-version-dependencies.test.ts +++ b/test/unit/rules/no-caret-version-dependencies.test.ts @@ -21,7 +21,9 @@ describe('no-caret-version-dependencies Unit Tests', () => { expect(response.lintId).toStrictEqual('no-caret-version-dependencies'); expect(response.severity).toStrictEqual('error'); expect(response.node).toStrictEqual('dependencies'); - expect(response.lintMessage).toStrictEqual('You are using an invalid version range. Please do not use ^.'); + expect(response.lintMessage).toStrictEqual( + 'You are using an invalid version range. Please do not use ^. Invalid dependencies include: npm-package-json-lint' + ); }); }); diff --git a/test/unit/rules/no-caret-version-devDependencies.test.ts b/test/unit/rules/no-caret-version-devDependencies.test.ts index 2d7245ae..32efd5e5 100644 --- a/test/unit/rules/no-caret-version-devDependencies.test.ts +++ b/test/unit/rules/no-caret-version-devDependencies.test.ts @@ -21,7 +21,9 @@ describe('no-caret-version-devDependencies Unit Tests', () => { expect(response.lintId).toStrictEqual('no-caret-version-devDependencies'); expect(response.severity).toStrictEqual('error'); expect(response.node).toStrictEqual('devDependencies'); - expect(response.lintMessage).toStrictEqual('You are using an invalid version range. Please do not use ^.'); + expect(response.lintMessage).toStrictEqual( + 'You are using an invalid version range. Please do not use ^. Invalid devDependencies include: npm-package-json-lint' + ); }); }); diff --git a/test/unit/rules/no-tilde-version-dependencies.test.ts b/test/unit/rules/no-tilde-version-dependencies.test.ts index 0e1ace6c..b3b2b981 100644 --- a/test/unit/rules/no-tilde-version-dependencies.test.ts +++ b/test/unit/rules/no-tilde-version-dependencies.test.ts @@ -21,7 +21,9 @@ describe('no-tilde-version-dependencies Unit Tests', () => { expect(response.lintId).toStrictEqual('no-tilde-version-dependencies'); expect(response.severity).toStrictEqual('error'); expect(response.node).toStrictEqual('dependencies'); - expect(response.lintMessage).toStrictEqual('You are using an invalid version range. Please do not use ~.'); + expect(response.lintMessage).toStrictEqual( + 'You are using an invalid version range. Please do not use ~. Invalid dependencies include: npm-package-json-lint' + ); }); }); diff --git a/test/unit/rules/no-tilde-version-devDependencies.test.ts b/test/unit/rules/no-tilde-version-devDependencies.test.ts index 7a63562a..c010651f 100644 --- a/test/unit/rules/no-tilde-version-devDependencies.test.ts +++ b/test/unit/rules/no-tilde-version-devDependencies.test.ts @@ -21,7 +21,9 @@ describe('no-tilde-version-devDependencies Unit Tests', () => { expect(response.lintId).toStrictEqual('no-tilde-version-devDependencies'); expect(response.severity).toStrictEqual('error'); expect(response.node).toStrictEqual('devDependencies'); - expect(response.lintMessage).toStrictEqual('You are using an invalid version range. Please do not use ~.'); + expect(response.lintMessage).toStrictEqual( + 'You are using an invalid version range. Please do not use ~. Invalid devDependencies include: npm-package-json-lint' + ); }); }); diff --git a/test/unit/validators/dependency-audit.test.ts b/test/unit/validators/dependency-audit.test.ts index 561ae0b6..25155acd 100755 --- a/test/unit/validators/dependency-audit.test.ts +++ b/test/unit/validators/dependency-audit.test.ts @@ -558,7 +558,7 @@ describe('dependency-audit Unit Tests', () => { }); }); - describe('doVersContainInvalidRange method', () => { + describe('auditDependenciesForInvalidRange method', () => { describe('when the node does not exist in the package.json file', () => { test('false should be returned', () => { const packageJson = { @@ -568,9 +568,13 @@ describe('dependency-audit Unit Tests', () => { 'gulp-npm-package-json-lint': '^2.0.0-rc1', }, }; - const response = dependencyAudit.doVersContainInvalidRange(packageJson, 'devDependencies', '~', {}); + const response = dependencyAudit.auditDependenciesForInvalidRange(packageJson, 'devDependencies', '~', {}); - expect(response).toBe(false); + expect(response).toStrictEqual({ + hasInvalidRangeVersions: false, + dependenciesWithInvalidVersionRange: [], + dependenciesWithoutInvalidVersionRange: [], + }); }); }); @@ -583,9 +587,13 @@ describe('dependency-audit Unit Tests', () => { 'gulp-npm-package-json-lint': '^2.0.0-rc1', }, }; - const response = dependencyAudit.doVersContainInvalidRange(packageJson, 'dependencies', '~', {}); + const response = dependencyAudit.auditDependenciesForInvalidRange(packageJson, 'dependencies', '~', {}); - expect(response).toBe(true); + expect(response).toStrictEqual({ + hasInvalidRangeVersions: true, + dependenciesWithInvalidVersionRange: ['grunt-npm-package-json-lint'], + dependenciesWithoutInvalidVersionRange: ['npm-package-json-lint', 'gulp-npm-package-json-lint'], + }); }); }); @@ -598,9 +606,17 @@ describe('dependency-audit Unit Tests', () => { 'gulp-npm-package-json-lint': '^2.0.0-rc1', }, }; - const response = dependencyAudit.doVersContainInvalidRange(packageJson, 'dependencies', '~', {}); + const response = dependencyAudit.auditDependenciesForInvalidRange(packageJson, 'dependencies', '~', {}); - expect(response).toBe(false); + expect(response).toStrictEqual({ + hasInvalidRangeVersions: false, + dependenciesWithInvalidVersionRange: [], + dependenciesWithoutInvalidVersionRange: [ + 'npm-package-json-lint', + 'grunt-npm-package-json-lint', + 'gulp-npm-package-json-lint', + ], + }); }); }); @@ -613,11 +629,15 @@ describe('dependency-audit Unit Tests', () => { 'gulp-npm-package-json-lint': '^2.0.0-rc1', }, }; - const response = dependencyAudit.doVersContainInvalidRange(packageJson, 'dependencies', '~', { + const response = dependencyAudit.auditDependenciesForInvalidRange(packageJson, 'dependencies', '~', { exceptions: ['npm-package-json-lint', 'grunt-npm-package-json-lint'], }); - expect(response).toBe(false); + expect(response).toStrictEqual({ + hasInvalidRangeVersions: false, + dependenciesWithInvalidVersionRange: [], + dependenciesWithoutInvalidVersionRange: ['gulp-npm-package-json-lint'], + }); }); }); @@ -630,9 +650,13 @@ describe('dependency-audit Unit Tests', () => { 'gulp-npm-package-json-lint': '^2.0.0-rc1', }, }; - const response = dependencyAudit.doVersContainInvalidRange(packageJson, 'dependencies', '~', {}); + const response = dependencyAudit.auditDependenciesForInvalidRange(packageJson, 'dependencies', '~', {}); - expect(response).toBe(true); + expect(response).toStrictEqual({ + hasInvalidRangeVersions: true, + dependenciesWithInvalidVersionRange: ['npm-package-json-lint', 'grunt-npm-package-json-lint'], + dependenciesWithoutInvalidVersionRange: ['gulp-npm-package-json-lint'], + }); }); }); }); diff --git a/website/docs/rules/dependencies/no-caret-version-dependencies.md b/website/docs/rules/dependencies/no-caret-version-dependencies.md index ae717291..f5692be5 100644 --- a/website/docs/rules/dependencies/no-caret-version-dependencies.md +++ b/website/docs/rules/dependencies/no-caret-version-dependencies.md @@ -101,4 +101,5 @@ With exceptions ## History +* Improved messaging when an invalid configuration is detected in version 6.3.0 * Introduced in version 3.2.0 diff --git a/website/docs/rules/dependencies/no-caret-version-devDependencies.md b/website/docs/rules/dependencies/no-caret-version-devDependencies.md index 48b01e68..5530f52a 100644 --- a/website/docs/rules/dependencies/no-caret-version-devDependencies.md +++ b/website/docs/rules/dependencies/no-caret-version-devDependencies.md @@ -101,4 +101,5 @@ With exceptions ## History +* Improved messaging when an invalid configuration is detected in version 6.3.0 * Introduced in version 3.2.0 diff --git a/website/docs/rules/dependencies/no-tilde-version-dependencies.md b/website/docs/rules/dependencies/no-tilde-version-dependencies.md index 5ce9950f..0edce949 100644 --- a/website/docs/rules/dependencies/no-tilde-version-dependencies.md +++ b/website/docs/rules/dependencies/no-tilde-version-dependencies.md @@ -101,4 +101,5 @@ With exceptions ## History +* Improved messaging when an invalid configuration is detected in version 6.3.0 * Introduced in version 3.2.0 diff --git a/website/docs/rules/dependencies/no-tilde-version-devDependencies.md b/website/docs/rules/dependencies/no-tilde-version-devDependencies.md index 77e8b795..63b1f5ee 100644 --- a/website/docs/rules/dependencies/no-tilde-version-devDependencies.md +++ b/website/docs/rules/dependencies/no-tilde-version-devDependencies.md @@ -101,4 +101,5 @@ With exceptions ## History +* Improved messaging when an invalid configuration is detected in version 6.3.0 * Introduced in version 3.2.0 From 87de1a275152cb7af7cef4fe7b5973ce73369089 Mon Sep 17 00:00:00 2001 From: tclindner <5178550+tclindner@users.noreply.github.com> Date: Sun, 20 Mar 2022 13:15:39 -0500 Subject: [PATCH 2/2] Update dependency-audit.ts --- src/validators/dependency-audit.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/validators/dependency-audit.ts b/src/validators/dependency-audit.ts index ffbf031e..d2f0ef1e 100755 --- a/src/validators/dependency-audit.ts +++ b/src/validators/dependency-audit.ts @@ -157,7 +157,6 @@ export const areVersRangesValid = ( return rangesValid; }; - export interface AuditDependenciesForInvalidRangeResponse { hasInvalidRangeVersions: boolean; dependenciesWithInvalidVersionRange: string[];