Skip to content

Commit de681de

Browse files
authored
Improve output for absolute version rules (#611)
1 parent d6afef6 commit de681de

14 files changed

+227
-75
lines changed

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {PackageJson} from 'type-fest';
2-
import {areVersionsAbsolute} from '../validators/dependency-audit';
2+
import {auditDependenciesForAbsoluteVersion} from '../validators/dependency-audit';
33
import {LintIssue} from '../lint-issue';
44
import {RuleType} from '../types/rule-type';
55
import {Severity} from '../types/severity';
@@ -8,7 +8,6 @@ import {LintResult} from '../types/lint-result';
88

99
const lintId = 'no-absolute-version-dependencies';
1010
const nodeName = 'dependencies';
11-
const message = 'You are using an invalid version range. Please do not use absolute versions.';
1211

1312
export const ruleType = RuleType.OptionalObject;
1413

@@ -18,8 +17,17 @@ export const lint = (
1817
severity: Severity,
1918
config: OptionalObjectRuleConfig
2019
): LintResult => {
21-
if (packageJsonData.hasOwnProperty(nodeName) && areVersionsAbsolute(packageJsonData, nodeName, config)) {
22-
return new LintIssue(lintId, severity, nodeName, message);
20+
const auditResult = auditDependenciesForAbsoluteVersion(packageJsonData, nodeName, config);
21+
22+
if (packageJsonData.hasOwnProperty(nodeName) && auditResult.onlyAbsoluteVersionsDetected) {
23+
return new LintIssue(
24+
lintId,
25+
severity,
26+
nodeName,
27+
`You are using an invalid version range. Please do not use absolute versions. Invalid ${nodeName} include: ${auditResult.dependenciesWithAbsoluteVersion.join(
28+
', '
29+
)}`
30+
);
2331
}
2432

2533
return null;

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,27 @@
11
import {PackageJson} from 'type-fest';
2-
import {areVersionsAbsolute} from '../validators/dependency-audit';
2+
import {auditDependenciesForAbsoluteVersion} 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-absolute-version-devDependencies';
88
const nodeName = 'devDependencies';
9-
const message = 'You are using an invalid version range. Please do not use absolute versions.';
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 => {
15-
if (packageJsonData.hasOwnProperty(nodeName) && areVersionsAbsolute(packageJsonData, nodeName, config)) {
16-
return new LintIssue(lintId, severity, nodeName, message);
14+
const auditResult = auditDependenciesForAbsoluteVersion(packageJsonData, nodeName, config);
15+
16+
if (packageJsonData.hasOwnProperty(nodeName) && auditResult.onlyAbsoluteVersionsDetected) {
17+
return new LintIssue(
18+
lintId,
19+
severity,
20+
nodeName,
21+
`You are using an invalid version range. Please do not use absolute versions. Invalid ${nodeName} includes: ${auditResult.dependenciesWithAbsoluteVersion.join(
22+
', '
23+
)}`
24+
);
1725
}
1826

1927
return null;

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,28 @@
11
import {PackageJson} from 'type-fest';
2-
import {doVersContainNonAbsolute} from '../validators/dependency-audit';
2+
import {auditDependenciesForNonAbsoluteVersion} 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-absolute-version-dependencies';
99
const nodeName = 'dependencies';
10-
const message = 'You are using an invalid version range. Please use absolute versions.';
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 => {
16-
if (exists(packageJsonData, nodeName) && doVersContainNonAbsolute(packageJsonData, nodeName, config)) {
17-
return new LintIssue(lintId, severity, nodeName, message);
15+
const auditResult = auditDependenciesForNonAbsoluteVersion(packageJsonData, nodeName, config);
16+
17+
if (exists(packageJsonData, nodeName) && auditResult.onlyNonAbsoluteVersionsDetected) {
18+
return new LintIssue(
19+
lintId,
20+
severity,
21+
nodeName,
22+
`You are using an invalid version range. Please use absolute versions. Invalid ${nodeName} include: ${auditResult.dependenciesWithoutAbsoluteVersion.join(
23+
', '
24+
)}`
25+
);
1826
}
1927

2028
return null;

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,28 @@
11
import {PackageJson} from 'type-fest';
2-
import {doVersContainNonAbsolute} from '../validators/dependency-audit';
2+
import {auditDependenciesForNonAbsoluteVersion} 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-absolute-version-devDependencies';
99
const nodeName = 'devDependencies';
10-
const message = 'You are using an invalid version range. Please use absolute versions.';
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 => {
16-
if (exists(packageJsonData, nodeName) && doVersContainNonAbsolute(packageJsonData, nodeName, config)) {
17-
return new LintIssue(lintId, severity, nodeName, message);
15+
const auditResult = auditDependenciesForNonAbsoluteVersion(packageJsonData, nodeName, config);
16+
17+
if (exists(packageJsonData, nodeName) && auditResult.onlyNonAbsoluteVersionsDetected) {
18+
return new LintIssue(
19+
lintId,
20+
severity,
21+
nodeName,
22+
`You are using an invalid version range. Please use absolute versions. Invalid ${nodeName} include: ${auditResult.dependenciesWithoutAbsoluteVersion.join(
23+
', '
24+
)}`
25+
);
1826
}
1927

2028
return null;

src/validators/dependency-audit.ts

Lines changed: 57 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -205,12 +205,12 @@ export interface AbsoluteVersionCheckerResult {
205205

206206
/**
207207
* Determines whether or not all dependency versions are absolute
208-
* @param {object} packageJsonData Valid JSON
209-
* @param {string} nodeName Name of a node in the package.json file
210-
* @param {object} config Rule configuration
211-
* @return {boolean} False if the package has an non-absolute version. True if it is not or the node is missing.
208+
* @param packageJsonData Valid JSON
209+
* @param nodeName Name of a node in the package.json file
210+
* @param config Rule configuration
211+
* @return False if the package has an non-absolute version. True if it is not or the node is missing.
212212
*/
213-
const absoluteVersionChecker = (
213+
const auditAbsoluteVersions = (
214214
// eslint-disable-next-line @typescript-eslint/no-explicit-any
215215
packageJsonData: PackageJson | any,
216216
nodeName: string,
@@ -256,32 +256,72 @@ const absoluteVersionChecker = (
256256
};
257257
};
258258

259+
export interface AuditDependenciesForAbsoluteVersionResponse {
260+
onlyAbsoluteVersionsDetected: boolean;
261+
dependenciesWithAbsoluteVersion: string[];
262+
dependenciesWithoutAbsoluteVersion: string[];
263+
}
264+
259265
/**
260266
* Determines whether or not all dependency versions are absolut
261-
* @param {object} packageJsonData Valid JSON
262-
* @param {string} nodeName Name of a node in the package.json file
263-
* @param {object} config Rule configuration
264-
* @return {boolean} False if the package has an non-absolute version. True if it is not or the node is missing.
267+
* @param packageJsonData Valid JSON
268+
* @param nodeName Name of a node in the package.json file
269+
* @param config Rule configuration
270+
* @return False if the package has an non-absolute version. True if it is not or the node is missing.
265271
*/
266-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
267-
export const areVersionsAbsolute = (packageJsonData: PackageJson | any, nodeName: string, config: any): boolean => {
268-
const {onlyAbsoluteVersionDetected, dependenciesChecked} = absoluteVersionChecker(packageJsonData, nodeName, config);
272+
export const auditDependenciesForAbsoluteVersion = (
273+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
274+
packageJsonData: PackageJson | any,
275+
nodeName: string,
276+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
277+
config: any
278+
): AuditDependenciesForAbsoluteVersionResponse => {
279+
const {
280+
onlyAbsoluteVersionDetected,
281+
dependenciesChecked,
282+
dependenciesWithAbsoluteVersion,
283+
dependenciesWithoutAbsoluteVersion,
284+
} = auditAbsoluteVersions(packageJsonData, nodeName, config);
269285

270-
return dependenciesChecked > 0 ? onlyAbsoluteVersionDetected : false;
286+
return {
287+
onlyAbsoluteVersionsDetected: dependenciesChecked > 0 ? onlyAbsoluteVersionDetected : false,
288+
dependenciesWithAbsoluteVersion,
289+
dependenciesWithoutAbsoluteVersion,
290+
};
271291
};
272292

293+
export interface AuditDependenciesForNonAbsoluteVersionResponse {
294+
onlyNonAbsoluteVersionsDetected: boolean;
295+
dependenciesWithAbsoluteVersion: string[];
296+
dependenciesWithoutAbsoluteVersion: string[];
297+
}
298+
273299
/**
274300
* Determines whether or not all dependency versions are absolut
275301
* @param packageJsonData Valid JSON
276302
* @param nodeName Name of a node in the package.json file
277303
* @param config Rule configuration
278304
* @return False if the package has an non-absolute version. True if it is not or the node is missing.
279305
*/
280-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
281-
export const doVersContainNonAbsolute = (packageJsonData: PackageJson | any, nodeName: string, config: any): boolean => {
282-
const {onlyAbsoluteVersionDetected, dependenciesChecked} = absoluteVersionChecker(packageJsonData, nodeName, config);
306+
export const auditDependenciesForNonAbsoluteVersion = (
307+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
308+
packageJsonData: PackageJson | any,
309+
nodeName: string,
310+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
311+
config: any
312+
): AuditDependenciesForNonAbsoluteVersionResponse => {
313+
const {
314+
onlyAbsoluteVersionDetected,
315+
dependenciesChecked,
316+
dependenciesWithAbsoluteVersion,
317+
dependenciesWithoutAbsoluteVersion,
318+
} = auditAbsoluteVersions(packageJsonData, nodeName, config);
283319

284-
return dependenciesChecked > 0 ? !onlyAbsoluteVersionDetected : false;
320+
return {
321+
onlyNonAbsoluteVersionsDetected: dependenciesChecked > 0 ? !onlyAbsoluteVersionDetected : false,
322+
dependenciesWithAbsoluteVersion,
323+
dependenciesWithoutAbsoluteVersion,
324+
};
285325
};
286326

287327
const GITHUB_SHORTCUT_URL = /^(github:)?[^/]+\/[^/]+/;

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

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

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.'
24+
'You are using an invalid version range. Please do not use absolute versions. Invalid devDependencies includes: 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.'
42+
'You are using an invalid version range. Please do not use absolute versions. Invalid devDependencies includes: npm-package-json-lint'
4343
);
4444
});
4545
});

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ describe('prefer-absolute-version-dependencies Unit Tests', () => {
2626
expect(response.lintId).toStrictEqual('prefer-absolute-version-dependencies');
2727
expect(response.severity).toStrictEqual(severity);
2828
expect(response.node).toStrictEqual(nodeName);
29-
expect(response.lintMessage).toStrictEqual('You are using an invalid version range. Please use absolute versions.');
29+
expect(response.lintMessage).toStrictEqual(
30+
'You are using an invalid version range. Please use absolute versions. Invalid dependencies include: npm-package-json-lint'
31+
);
3032
});
3133
});
3234

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ describe('prefer-absolute-version-devDependencies Unit Tests', () => {
2626
expect(response.lintId).toStrictEqual('prefer-absolute-version-devDependencies');
2727
expect(response.severity).toStrictEqual(severity);
2828
expect(response.node).toStrictEqual(nodeName);
29-
expect(response.lintMessage).toStrictEqual('You are using an invalid version range. Please use absolute versions.');
29+
expect(response.lintMessage).toStrictEqual(
30+
'You are using an invalid version range. Please use absolute versions. Invalid devDependencies include: npm-package-json-lint'
31+
);
3032
});
3133
});
3234

0 commit comments

Comments
 (0)