Skip to content

Commit c833dfb

Browse files
authored
Improve output for no-*-version-* rules (#612)
* Improve output for no-*-version-* rules * Update dependency-audit.ts
1 parent de681de commit c833dfb

15 files changed

+128
-57
lines changed

src/rules/no-caret-version-dependencies.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,28 @@
11
import {PackageJson} from 'type-fest';
2-
import {doVersContainInvalidRange} from '../validators/dependency-audit';
2+
import {auditDependenciesForInvalidRange} from '../validators/dependency-audit';
33
import {LintIssue} from '../lint-issue';
44
import {RuleType} from '../types/rule-type';
55
import {Severity} from '../types/severity';
66

77
const lintId = 'no-caret-version-dependencies';
88
const nodeName = 'dependencies';
9-
const message = 'You are using an invalid version range. Please do not use ^.';
109

1110
export const ruleType = RuleType.OptionalObject;
1211

1312
// eslint-disable-next-line @typescript-eslint/no-explicit-any
1413
export const lint = (packageJsonData: PackageJson | any, severity: Severity, config: any): LintIssue | null => {
1514
const rangeSpecifier = '^';
15+
const auditResult = auditDependenciesForInvalidRange(packageJsonData, nodeName, rangeSpecifier, config);
1616

17-
if (
18-
packageJsonData.hasOwnProperty(nodeName) &&
19-
doVersContainInvalidRange(packageJsonData, nodeName, rangeSpecifier, config)
20-
) {
21-
return new LintIssue(lintId, severity, nodeName, message);
17+
if (packageJsonData.hasOwnProperty(nodeName) && auditResult.hasInvalidRangeVersions) {
18+
return new LintIssue(
19+
lintId,
20+
severity,
21+
nodeName,
22+
`You are using an invalid version range. Please do not use ^. Invalid ${nodeName} include: ${auditResult.dependenciesWithInvalidVersionRange.join(
23+
', '
24+
)}`
25+
);
2226
}
2327

2428
return null;

src/rules/no-caret-version-devDependencies.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,28 @@
11
import {PackageJson} from 'type-fest';
2-
import {doVersContainInvalidRange} from '../validators/dependency-audit';
2+
import {auditDependenciesForInvalidRange} from '../validators/dependency-audit';
33
import {LintIssue} from '../lint-issue';
44
import {RuleType} from '../types/rule-type';
55
import {Severity} from '../types/severity';
66

77
const lintId = 'no-caret-version-devDependencies';
88
const nodeName = 'devDependencies';
9-
const message = 'You are using an invalid version range. Please do not use ^.';
109

1110
export const ruleType = RuleType.OptionalObject;
1211

1312
// eslint-disable-next-line @typescript-eslint/no-explicit-any
1413
export const lint = (packageJsonData: PackageJson | any, severity: Severity, config: any): LintIssue | null => {
1514
const rangeSpecifier = '^';
15+
const auditResult = auditDependenciesForInvalidRange(packageJsonData, nodeName, rangeSpecifier, config);
1616

17-
if (
18-
packageJsonData.hasOwnProperty(nodeName) &&
19-
doVersContainInvalidRange(packageJsonData, nodeName, rangeSpecifier, config)
20-
) {
21-
return new LintIssue(lintId, severity, nodeName, message);
17+
if (packageJsonData.hasOwnProperty(nodeName) && auditResult.hasInvalidRangeVersions) {
18+
return new LintIssue(
19+
lintId,
20+
severity,
21+
nodeName,
22+
`You are using an invalid version range. Please do not use ^. Invalid ${nodeName} include: ${auditResult.dependenciesWithInvalidVersionRange.join(
23+
', '
24+
)}`
25+
);
2226
}
2327

2428
return null;

src/rules/no-tilde-version-dependencies.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,28 @@
11
import {PackageJson} from 'type-fest';
2-
import {doVersContainInvalidRange} from '../validators/dependency-audit';
2+
import {auditDependenciesForInvalidRange} from '../validators/dependency-audit';
33
import {LintIssue} from '../lint-issue';
44
import {RuleType} from '../types/rule-type';
55
import {Severity} from '../types/severity';
66

77
const lintId = 'no-tilde-version-dependencies';
88
const nodeName = 'dependencies';
9-
const message = 'You are using an invalid version range. Please do not use ~.';
109

1110
export const ruleType = RuleType.OptionalObject;
1211

1312
// eslint-disable-next-line @typescript-eslint/no-explicit-any
1413
export const lint = (packageJsonData: PackageJson | any, severity: Severity, config: any): LintIssue | null => {
1514
const rangeSpecifier = '~';
15+
const auditResult = auditDependenciesForInvalidRange(packageJsonData, nodeName, rangeSpecifier, config);
1616

17-
if (
18-
packageJsonData.hasOwnProperty(nodeName) &&
19-
doVersContainInvalidRange(packageJsonData, nodeName, rangeSpecifier, config)
20-
) {
21-
return new LintIssue(lintId, severity, nodeName, message);
17+
if (packageJsonData.hasOwnProperty(nodeName) && auditResult.hasInvalidRangeVersions) {
18+
return new LintIssue(
19+
lintId,
20+
severity,
21+
nodeName,
22+
`You are using an invalid version range. Please do not use ~. Invalid ${nodeName} include: ${auditResult.dependenciesWithInvalidVersionRange.join(
23+
', '
24+
)}`
25+
);
2226
}
2327

2428
return null;

src/rules/no-tilde-version-devDependencies.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,28 @@
11
import {PackageJson} from 'type-fest';
2-
import {doVersContainInvalidRange} from '../validators/dependency-audit';
2+
import {auditDependenciesForInvalidRange} from '../validators/dependency-audit';
33
import {LintIssue} from '../lint-issue';
44
import {RuleType} from '../types/rule-type';
55
import {Severity} from '../types/severity';
66

77
const lintId = 'no-tilde-version-devDependencies';
88
const nodeName = 'devDependencies';
9-
const message = 'You are using an invalid version range. Please do not use ~.';
109

1110
export const ruleType = RuleType.OptionalObject;
1211

1312
// eslint-disable-next-line @typescript-eslint/no-explicit-any
1413
export const lint = (packageJsonData: PackageJson | any, severity: Severity, config: any): LintIssue | null => {
1514
const rangeSpecifier = '~';
15+
const auditResult = auditDependenciesForInvalidRange(packageJsonData, nodeName, rangeSpecifier, config);
1616

17-
if (
18-
packageJsonData.hasOwnProperty(nodeName) &&
19-
doVersContainInvalidRange(packageJsonData, nodeName, rangeSpecifier, config)
20-
) {
21-
return new LintIssue(lintId, severity, nodeName, message);
17+
if (packageJsonData.hasOwnProperty(nodeName) && auditResult.hasInvalidRangeVersions) {
18+
return new LintIssue(
19+
lintId,
20+
severity,
21+
nodeName,
22+
`You are using an invalid version range. Please do not use ~. Invalid ${nodeName} include: ${auditResult.dependenciesWithInvalidVersionRange.join(
23+
', '
24+
)}`
25+
);
2226
}
2327

2428
return null;

src/validators/dependency-audit.ts

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -157,28 +157,40 @@ export const areVersRangesValid = (
157157
return rangesValid;
158158
};
159159

160+
export interface AuditDependenciesForInvalidRangeResponse {
161+
hasInvalidRangeVersions: boolean;
162+
dependenciesWithInvalidVersionRange: string[];
163+
dependenciesWithoutInvalidVersionRange: string[];
164+
}
165+
160166
/**
161167
* Determines if any dependencies have a version string that starts with the specified invalid range
162-
* @param {object} packageJsonData Valid JSON
163-
* @param {string} nodeName Name of a node in the package.json file
164-
* @param {string} rangeSpecifier A version range specifier
165-
* @param {object} config Rule configuration
166-
* @return {Boolean} True if any dependencies versions start with the invalid range, false if they don't.
168+
* @param packageJsonData Valid JSON
169+
* @param nodeName Name of a node in the package.json file
170+
* @param rangeSpecifier A version range specifier
171+
* @param config Rule configuration
172+
* @return True if any dependencies versions start with the invalid range, false if they don't.
167173
*/
168-
export const doVersContainInvalidRange = (
174+
export const auditDependenciesForInvalidRange = (
169175
// eslint-disable-next-line @typescript-eslint/no-explicit-any
170176
packageJsonData: PackageJson | any,
171177
nodeName: string,
172178
rangeSpecifier: string,
173179
// eslint-disable-next-line @typescript-eslint/no-explicit-any
174180
config: any
175-
): boolean => {
181+
): AuditDependenciesForInvalidRangeResponse => {
182+
let hasInvalidRangeVersions = false;
183+
const dependenciesWithInvalidVersionRange = [];
184+
const dependenciesWithoutInvalidVersionRange = [];
185+
176186
if (!packageJsonData.hasOwnProperty(nodeName)) {
177-
return false;
187+
return {
188+
hasInvalidRangeVersions,
189+
dependenciesWithInvalidVersionRange,
190+
dependenciesWithoutInvalidVersionRange,
191+
};
178192
}
179193

180-
let containsInvalidVersion = false;
181-
182194
// eslint-disable-next-line no-restricted-syntax
183195
for (const dependencyName in packageJsonData[nodeName]) {
184196
if (hasExceptions(config) && config.exceptions.includes(dependencyName)) {
@@ -189,11 +201,18 @@ export const doVersContainInvalidRange = (
189201
const dependencyVersion = packageJsonData[nodeName][dependencyName];
190202

191203
if (doesVersStartsWithRange(dependencyVersion, rangeSpecifier)) {
192-
containsInvalidVersion = true;
204+
hasInvalidRangeVersions = true;
205+
dependenciesWithInvalidVersionRange.push(dependencyName);
206+
} else {
207+
dependenciesWithoutInvalidVersionRange.push(dependencyName);
193208
}
194209
}
195210

196-
return containsInvalidVersion;
211+
return {
212+
hasInvalidRangeVersions,
213+
dependenciesWithInvalidVersionRange,
214+
dependenciesWithoutInvalidVersionRange,
215+
};
197216
};
198217

199218
export interface AbsoluteVersionCheckerResult {

test/unit/linter/linter.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ describe('linter Unit Tests', () => {
460460
'no-caret-version-dependencies',
461461
Severity.Error,
462462
'dependencies',
463-
'You are using an invalid version range. Please do not use ^.'
463+
'You are using an invalid version range. Please do not use ^. Invalid dependencies include: myModule'
464464
);
465465
const expected = {
466466
errorCount: 1,
@@ -520,7 +520,7 @@ describe('linter Unit Tests', () => {
520520
'no-caret-version-dependencies',
521521
Severity.Error,
522522
'dependencies',
523-
'You are using an invalid version range. Please do not use ^.'
523+
'You are using an invalid version range. Please do not use ^. Invalid dependencies include: myModule'
524524
);
525525
const expected = {
526526
errorCount: 1,

test/unit/rules/no-caret-version-dependencies.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ describe('no-caret-version-dependencies Unit Tests', () => {
2121
expect(response.lintId).toStrictEqual('no-caret-version-dependencies');
2222
expect(response.severity).toStrictEqual('error');
2323
expect(response.node).toStrictEqual('dependencies');
24-
expect(response.lintMessage).toStrictEqual('You are using an invalid version range. Please do not use ^.');
24+
expect(response.lintMessage).toStrictEqual(
25+
'You are using an invalid version range. Please do not use ^. Invalid dependencies include: npm-package-json-lint'
26+
);
2527
});
2628
});
2729

test/unit/rules/no-caret-version-devDependencies.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ describe('no-caret-version-devDependencies Unit Tests', () => {
2121
expect(response.lintId).toStrictEqual('no-caret-version-devDependencies');
2222
expect(response.severity).toStrictEqual('error');
2323
expect(response.node).toStrictEqual('devDependencies');
24-
expect(response.lintMessage).toStrictEqual('You are using an invalid version range. Please do not use ^.');
24+
expect(response.lintMessage).toStrictEqual(
25+
'You are using an invalid version range. Please do not use ^. Invalid devDependencies include: npm-package-json-lint'
26+
);
2527
});
2628
});
2729

test/unit/rules/no-tilde-version-dependencies.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ describe('no-tilde-version-dependencies Unit Tests', () => {
2121
expect(response.lintId).toStrictEqual('no-tilde-version-dependencies');
2222
expect(response.severity).toStrictEqual('error');
2323
expect(response.node).toStrictEqual('dependencies');
24-
expect(response.lintMessage).toStrictEqual('You are using an invalid version range. Please do not use ~.');
24+
expect(response.lintMessage).toStrictEqual(
25+
'You are using an invalid version range. Please do not use ~. Invalid dependencies include: npm-package-json-lint'
26+
);
2527
});
2628
});
2729

test/unit/rules/no-tilde-version-devDependencies.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ describe('no-tilde-version-devDependencies Unit Tests', () => {
2121
expect(response.lintId).toStrictEqual('no-tilde-version-devDependencies');
2222
expect(response.severity).toStrictEqual('error');
2323
expect(response.node).toStrictEqual('devDependencies');
24-
expect(response.lintMessage).toStrictEqual('You are using an invalid version range. Please do not use ~.');
24+
expect(response.lintMessage).toStrictEqual(
25+
'You are using an invalid version range. Please do not use ~. Invalid devDependencies include: npm-package-json-lint'
26+
);
2527
});
2628
});
2729

0 commit comments

Comments
 (0)