Skip to content

Commit 81aa1d0

Browse files
authored
Improve output for prefer-no-version-zero-* rules (#614)
1 parent 0dd34e3 commit 81aa1d0

8 files changed

+258
-66
lines changed

src/rules/prefer-no-version-zero-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 {hasDepVersZero} from '../validators/dependency-audit';
2+
import {auditDependenciesWithMajorVersionOfZero} 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-no-version-zero-dependencies';
99
const nodeName = 'dependencies';
10-
const message = 'You have invalid version 0 dependencies. Please use modules with a major version >= 1.';
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) && hasDepVersZero(packageJsonData, nodeName, config)) {
17-
return new LintIssue(lintId, severity, nodeName, message);
15+
const auditResult = auditDependenciesWithMajorVersionOfZero(packageJsonData, nodeName, config);
16+
17+
if (exists(packageJsonData, nodeName) && auditResult.hasDependencyWithMajorVersionOfZero) {
18+
return new LintIssue(
19+
lintId,
20+
severity,
21+
nodeName,
22+
`You have invalid version 0 dependencies. Please use modules with a major version >= 1. Invalid ${nodeName} include: ${auditResult.dependenciesWithMajorVersionOfZero.join(
23+
', '
24+
)}`
25+
);
1826
}
1927

2028
return null;

src/rules/prefer-no-version-zero-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 {hasDepVersZero} from '../validators/dependency-audit';
2+
import {auditDependenciesWithMajorVersionOfZero} 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-no-version-zero-devDependencies';
99
const nodeName = 'devDependencies';
10-
const message = 'You have invalid version 0 dependencies. Please use modules with a major version >= 1.';
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) && hasDepVersZero(packageJsonData, nodeName, config)) {
17-
return new LintIssue(lintId, severity, nodeName, message);
15+
const auditResult = auditDependenciesWithMajorVersionOfZero(packageJsonData, nodeName, config);
16+
17+
if (exists(packageJsonData, nodeName) && auditResult.hasDependencyWithMajorVersionOfZero) {
18+
return new LintIssue(
19+
lintId,
20+
severity,
21+
nodeName,
22+
`You have invalid version 0 dependencies. Please use modules with a major version >= 1. Invalid ${nodeName} include: ${auditResult.dependenciesWithMajorVersionOfZero.join(
23+
', '
24+
)}`
25+
);
1826
}
1927

2028
return null;

src/validators/dependency-audit.ts

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,30 @@ export const hasDepPrereleaseVers = (
7171
return false;
7272
};
7373

74+
export interface AuditDependenciesWithMajorVersionOfZeroResponse {
75+
hasDependencyWithMajorVersionOfZero: boolean;
76+
dependenciesWithMajorVersionOfZero: string[];
77+
dependenciesWithoutMajorVersionOfZero: string[];
78+
}
79+
7480
/**
7581
* Determines whether or not the package has a dependency with a major version of 0
76-
* @param {object} packageJsonData Valid JSON
77-
* @param {string} nodeName Name of a node in the package.json file
78-
* @param {object} config Rule configuration
79-
* @return {boolean} True if the package has a dependency with version 0. False if it does not or the node is missing.
82+
* @param packageJsonData Valid JSON
83+
* @param nodeName Name of a node in the package.json file
84+
* @param config Rule configuration
85+
* @return True if the package has a dependency with version 0. False if it does not or the node is missing.
8086
*/
81-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
82-
export const hasDepVersZero = (packageJsonData: PackageJson | any, nodeName: string, config: any): boolean => {
87+
export const auditDependenciesWithMajorVersionOfZero = (
88+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
89+
packageJsonData: PackageJson | any,
90+
nodeName: string,
91+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
92+
config: any
93+
): AuditDependenciesWithMajorVersionOfZeroResponse => {
94+
let hasDependencyWithMajorVersionOfZero = false;
95+
const dependenciesWithMajorVersionOfZero = [];
96+
const dependenciesWithoutMajorVersionOfZero = [];
97+
8398
// eslint-disable-next-line no-restricted-syntax
8499
for (const dependencyName in packageJsonData[nodeName]) {
85100
if (hasExceptions(config) && config.exceptions.includes(dependencyName)) {
@@ -98,12 +113,19 @@ export const hasDepVersZero = (packageJsonData: PackageJson | any, nodeName: str
98113

99114
// if first char is 0 then major version is 0
100115
if (dependencyMjrVersion === '0') {
101-
return true;
116+
hasDependencyWithMajorVersionOfZero = true;
117+
dependenciesWithMajorVersionOfZero.push(dependencyName);
118+
} else {
119+
dependenciesWithoutMajorVersionOfZero.push(dependencyName);
102120
}
103121
}
104122
}
105123

106-
return false;
124+
return {
125+
hasDependencyWithMajorVersionOfZero,
126+
dependenciesWithMajorVersionOfZero,
127+
dependenciesWithoutMajorVersionOfZero,
128+
};
107129
};
108130

109131
/**

test/unit/rules/prefer-no-version-zero-dependencies.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ describe('prefer-no-version-zero-dependencies Unit Tests', () => {
2727
expect(response.severity).toStrictEqual('error');
2828
expect(response.node).toStrictEqual(nodeName);
2929
expect(response.lintMessage).toStrictEqual(
30-
'You have invalid version 0 dependencies. Please use modules with a major version >= 1.'
30+
'You have invalid version 0 dependencies. Please use modules with a major version >= 1. Invalid dependencies include: npm-package-json-lint'
3131
);
3232
});
3333
});

test/unit/rules/prefer-no-version-zero-devDependencies.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ describe('prefer-no-version-zero-devDependencies Unit Tests', () => {
2525
expect(response.severity).toStrictEqual('error');
2626
expect(response.node).toStrictEqual('devDependencies');
2727
expect(response.lintMessage).toStrictEqual(
28-
'You have invalid version 0 dependencies. Please use modules with a major version >= 1.'
28+
'You have invalid version 0 dependencies. Please use modules with a major version >= 1. Invalid devDependencies include: npm-package-json-lint'
2929
);
3030
});
3131
});

0 commit comments

Comments
 (0)