Skip to content

Commit 0dd34e3

Browse files
authored
Improve output for prefer*-version-* rules (#613)
1 parent c833dfb commit 0dd34e3

16 files changed

+135
-52
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export const lint = (packageJsonData: PackageJson | any, severity: Severity, con
1818
lintId,
1919
severity,
2020
nodeName,
21-
`You are using an invalid version range. Please do not use absolute versions. Invalid ${nodeName} includes: ${auditResult.dependenciesWithAbsoluteVersion.join(
21+
`You are using an invalid version range. Please do not use absolute versions. Invalid ${nodeName} include: ${auditResult.dependenciesWithAbsoluteVersion.join(
2222
', '
2323
)}`
2424
);

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
11
import {PackageJson} from 'type-fest';
2-
import {areVersRangesValid} from '../validators/dependency-audit';
2+
import {auditDependenciesForValidRangeVersions} from '../validators/dependency-audit';
33
import {exists} from '../validators/property';
44
import {LintIssue} from '../lint-issue';
55
import {RuleType} from '../types/rule-type';
66
import {Severity} from '../types/severity';
77

88
const lintId = 'prefer-caret-version-dependencies';
99
const nodeName = 'dependencies';
10-
const message = 'You are using an invalid version range. Please use ^.';
1110

1211
export const ruleType = RuleType.OptionalObject;
1312

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

18-
if (exists(packageJsonData, nodeName) && !areVersRangesValid(packageJsonData, nodeName, rangeSpecifier, config)) {
19-
return new LintIssue(lintId, severity, nodeName, message);
18+
if (exists(packageJsonData, nodeName) && !auditResult.onlyValidVersionsDetected) {
19+
return new LintIssue(
20+
lintId,
21+
severity,
22+
nodeName,
23+
`You are using an invalid version range. Please use ^. Invalid ${nodeName} include: ${auditResult.dependenciesWithoutValidVersionRange.join(
24+
', '
25+
)}`
26+
);
2027
}
2128

2229
return null;

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
11
import {PackageJson} from 'type-fest';
2-
import {areVersRangesValid} from '../validators/dependency-audit';
2+
import {auditDependenciesForValidRangeVersions} from '../validators/dependency-audit';
33
import {exists} from '../validators/property';
44
import {LintIssue} from '../lint-issue';
55
import {RuleType} from '../types/rule-type';
66
import {Severity} from '../types/severity';
77

88
const lintId = 'prefer-caret-version-devDependencies';
99
const nodeName = 'devDependencies';
10-
const message = 'You are using an invalid version range. Please use ^.';
1110

1211
export const ruleType = RuleType.OptionalObject;
1312

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

18-
if (exists(packageJsonData, nodeName) && !areVersRangesValid(packageJsonData, nodeName, rangeSpecifier, config)) {
19-
return new LintIssue(lintId, severity, nodeName, message);
18+
if (exists(packageJsonData, nodeName) && !auditResult.onlyValidVersionsDetected) {
19+
return new LintIssue(
20+
lintId,
21+
severity,
22+
nodeName,
23+
`You are using an invalid version range. Please use ^. Invalid ${nodeName} include: ${auditResult.dependenciesWithoutValidVersionRange.join(
24+
', '
25+
)}`
26+
);
2027
}
2128

2229
return null;

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
11
import {PackageJson} from 'type-fest';
2-
import {areVersRangesValid} from '../validators/dependency-audit';
2+
import {auditDependenciesForValidRangeVersions} from '../validators/dependency-audit';
33
import {exists} from '../validators/property';
44
import {LintIssue} from '../lint-issue';
55
import {RuleType} from '../types/rule-type';
66
import {Severity} from '../types/severity';
77

88
const lintId = 'prefer-tilde-version-dependencies';
99
const nodeName = 'dependencies';
10-
const message = 'You are using an invalid version range. Please use ~.';
1110

1211
export const ruleType = RuleType.OptionalObject;
1312

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

18-
if (exists(packageJsonData, nodeName) && !areVersRangesValid(packageJsonData, nodeName, rangeSpecifier, config)) {
19-
return new LintIssue(lintId, severity, nodeName, message);
18+
if (exists(packageJsonData, nodeName) && !auditResult.onlyValidVersionsDetected) {
19+
return new LintIssue(
20+
lintId,
21+
severity,
22+
nodeName,
23+
`You are using an invalid version range. Please use ~. Invalid ${nodeName} include: ${auditResult.dependenciesWithoutValidVersionRange.join(
24+
', '
25+
)}`
26+
);
2027
}
2128

2229
return null;

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
11
import {PackageJson} from 'type-fest';
2-
import {areVersRangesValid} from '../validators/dependency-audit';
2+
import {auditDependenciesForValidRangeVersions} from '../validators/dependency-audit';
33
import {exists} from '../validators/property';
44
import {LintIssue} from '../lint-issue';
55
import {RuleType} from '../types/rule-type';
66
import {Severity} from '../types/severity';
77

88
const lintId = 'prefer-tilde-version-devDependencies';
99
const nodeName = 'devDependencies';
10-
const message = 'You are using an invalid version range. Please use ~.';
1110

1211
export const ruleType = RuleType.OptionalObject;
1312

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

18-
if (exists(packageJsonData, nodeName) && !areVersRangesValid(packageJsonData, nodeName, rangeSpecifier, config)) {
19-
return new LintIssue(lintId, severity, nodeName, message);
18+
if (exists(packageJsonData, nodeName) && !auditResult.onlyValidVersionsDetected) {
19+
return new LintIssue(
20+
lintId,
21+
severity,
22+
nodeName,
23+
`You are using an invalid version range. Please use ~. Invalid ${nodeName} include: ${auditResult.dependenciesWithoutValidVersionRange.join(
24+
', '
25+
)}`
26+
);
2027
}
2128

2229
return null;

src/validators/dependency-audit.ts

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -112,34 +112,46 @@ export const hasDepVersZero = (packageJsonData: PackageJson | any, nodeName: str
112112
* @param {String} rangeSpecifier A version range specifier
113113
* @return {Boolean} True if the version starts with the range, false if it doesn't.
114114
*/
115-
export const doesVersStartsWithRange = (dependencyVersion: string, rangeSpecifier: string): boolean => {
115+
export const doesVersionStartWithRange = (dependencyVersion: string, rangeSpecifier: string): boolean => {
116116
const firstCharOfStr = 0;
117117

118118
return dependencyVersion.startsWith(rangeSpecifier, firstCharOfStr);
119119
};
120120

121+
export interface AuditDependenciesForValidRangeResponse {
122+
onlyValidVersionsDetected: boolean;
123+
dependenciesWithValidVersionRange: string[];
124+
dependenciesWithoutValidVersionRange: string[];
125+
}
126+
121127
/**
122128
* Determines whether or not all dependency version ranges match expected range
123-
* @param {object} packageJsonData Valid JSON
124-
* @param {string} nodeName Name of a node in the package.json file
125-
* @param {string} rangeSpecifier A version range specifier
126-
* @param {object} config Rule configuration
127-
* @return {boolean} False if the package has an invalid range. True if it is not or the node is missing.
129+
* @param packageJsonData Valid JSON
130+
* @param nodeName Name of a node in the package.json file
131+
* @param rangeSpecifier A version range specifier
132+
* @param config Rule configuration
133+
* @return False if the package has an invalid range. True if it is not or the node is missing.
128134
*/
129-
export const areVersRangesValid = (
135+
export const auditDependenciesForValidRangeVersions = (
130136
// eslint-disable-next-line @typescript-eslint/no-explicit-any
131137
packageJsonData: PackageJson | any,
132138
nodeName: string,
133139
rangeSpecifier: string,
134140
// eslint-disable-next-line @typescript-eslint/no-explicit-any
135141
config: any
136-
): boolean => {
142+
): AuditDependenciesForValidRangeResponse => {
143+
let onlyValidVersionsDetected = true;
144+
const dependenciesWithValidVersionRange = [];
145+
const dependenciesWithoutValidVersionRange = [];
146+
137147
if (!packageJsonData.hasOwnProperty(nodeName)) {
138-
return true;
148+
return {
149+
onlyValidVersionsDetected,
150+
dependenciesWithValidVersionRange: [],
151+
dependenciesWithoutValidVersionRange: [],
152+
};
139153
}
140154

141-
let rangesValid = true;
142-
143155
// eslint-disable-next-line no-restricted-syntax
144156
for (const dependencyName in packageJsonData[nodeName]) {
145157
if (hasExceptions(config) && config.exceptions.includes(dependencyName)) {
@@ -149,12 +161,19 @@ export const areVersRangesValid = (
149161

150162
const dependencyVersion = packageJsonData[nodeName][dependencyName];
151163

152-
if (!doesVersStartsWithRange(dependencyVersion, rangeSpecifier)) {
153-
rangesValid = false;
164+
if (doesVersionStartWithRange(dependencyVersion, rangeSpecifier)) {
165+
dependenciesWithValidVersionRange.push(dependencyName);
166+
} else {
167+
onlyValidVersionsDetected = false;
168+
dependenciesWithoutValidVersionRange.push(dependencyName);
154169
}
155170
}
156171

157-
return rangesValid;
172+
return {
173+
onlyValidVersionsDetected,
174+
dependenciesWithValidVersionRange,
175+
dependenciesWithoutValidVersionRange,
176+
};
158177
};
159178

160179
export interface AuditDependenciesForInvalidRangeResponse {
@@ -200,7 +219,7 @@ export const auditDependenciesForInvalidRange = (
200219

201220
const dependencyVersion = packageJsonData[nodeName][dependencyName];
202221

203-
if (doesVersStartsWithRange(dependencyVersion, rangeSpecifier)) {
222+
if (doesVersionStartWithRange(dependencyVersion, rangeSpecifier)) {
204223
hasInvalidRangeVersions = true;
205224
dependenciesWithInvalidVersionRange.push(dependencyName);
206225
} else {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ describe('no-absolute-version-devDependencies Unit Tests', () => {
2121
expect(response.severity).toStrictEqual('error');
2222
expect(response.node).toStrictEqual('devDependencies');
2323
expect(response.lintMessage).toStrictEqual(
24-
'You are using an invalid version range. Please do not use absolute versions. Invalid devDependencies includes: npm-package-json-lint'
24+
'You are using an invalid version range. Please do not use absolute versions. Invalid devDependencies include: npm-package-json-lint'
2525
);
2626
});
2727
});
@@ -39,7 +39,7 @@ describe('no-absolute-version-devDependencies Unit Tests', () => {
3939
expect(response.severity).toStrictEqual('error');
4040
expect(response.node).toStrictEqual('devDependencies');
4141
expect(response.lintMessage).toStrictEqual(
42-
'You are using an invalid version range. Please do not use absolute versions. Invalid devDependencies includes: npm-package-json-lint'
42+
'You are using an invalid version range. Please do not use absolute versions. Invalid devDependencies include: npm-package-json-lint'
4343
);
4444
});
4545
});

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ describe('prefer-caret-version-dependencies Unit Tests', () => {
2424
expect(response.lintId).toStrictEqual('prefer-caret-version-dependencies');
2525
expect(response.severity).toStrictEqual('error');
2626
expect(response.node).toStrictEqual('dependencies');
27-
expect(response.lintMessage).toStrictEqual('You are using an invalid version range. Please use ^.');
27+
expect(response.lintMessage).toStrictEqual(
28+
'You are using an invalid version range. Please use ^. Invalid dependencies include: npm-package-json-lint'
29+
);
2830
});
2931
});
3032

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ describe('prefer-caret-version-devDependencies Unit Tests', () => {
2424
expect(response.lintId).toStrictEqual('prefer-caret-version-devDependencies');
2525
expect(response.severity).toStrictEqual('error');
2626
expect(response.node).toStrictEqual('devDependencies');
27-
expect(response.lintMessage).toStrictEqual('You are using an invalid version range. Please use ^.');
27+
expect(response.lintMessage).toStrictEqual(
28+
'You are using an invalid version range. Please use ^. Invalid devDependencies include: npm-package-json-lint'
29+
);
2830
});
2931
});
3032

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ describe('prefer-tilde-version-dependencies Unit Tests', () => {
2424
expect(response.lintId).toStrictEqual('prefer-tilde-version-dependencies');
2525
expect(response.severity).toStrictEqual('error');
2626
expect(response.node).toStrictEqual('dependencies');
27-
expect(response.lintMessage).toStrictEqual('You are using an invalid version range. Please use ~.');
27+
expect(response.lintMessage).toStrictEqual(
28+
'You are using an invalid version range. Please use ~. Invalid dependencies include: npm-package-json-lint'
29+
);
2830
});
2931
});
3032

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ describe('prefer-tilde-version-devDependencies Unit Tests', () => {
2424
expect(response.lintId).toStrictEqual('prefer-tilde-version-devDependencies');
2525
expect(response.severity).toStrictEqual('error');
2626
expect(response.node).toStrictEqual('devDependencies');
27-
expect(response.lintMessage).toStrictEqual('You are using an invalid version range. Please use ~.');
27+
expect(response.lintMessage).toStrictEqual(
28+
'You are using an invalid version range. Please use ~. Invalid devDependencies include: npm-package-json-lint'
29+
);
2830
});
2931
});
3032

0 commit comments

Comments
 (0)