Skip to content

Commit 6fe32e6

Browse files
authored
4.2.0 (#166)
* Bump version * Add no-repeated-dependencies rule Closes #155 * Add wildcard support for no-restricted-dependencies and no-restricted-devDependencies Closes #154 * Add prefer-alphabetical-scripts rule Closes #153 * 4.2.0 of docs * Update dependency-audit.js * Update to dependency * Change to wild card for tests
1 parent 9e52497 commit 6fe32e6

24 files changed

+1339
-441
lines changed

docs/rules.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ Rules allow npm-package-json-lint to be fully customizable. npm-package-json-lin
8787

8888
> Generates an error if dependencies fail to meet the rules requirements
8989
90+
* [no-repeated-dependencies](rules/dependencies/no-repeated-dependencies.md)
91+
9092
* dependencies
9193
* [no-absolute-version-dependencies](rules/dependencies/no-absolute-version-dependencies.md)
9294
* [no-caret-version-dependencies](rules/dependencies/no-caret-version-dependencies.md)
@@ -117,6 +119,12 @@ Rules allow npm-package-json-lint to be fully customizable. npm-package-json-lin
117119
* peerDependencies
118120
* [prefer-alphabetical-peerDependencies](rules/dependencies/prefer-alphabetical-peerDependencies.md)
119121

122+
## Scripts rules
123+
124+
> Generates an error if scripts fail to meet the rules requirements
125+
126+
* [prefer-alphabetical-scripts](rules/scripts/prefer-alphabetical-scripts.md)
127+
120128
## Format rules
121129

122130
> Generates an error if node's value fails to meet the format requirements
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
---
2+
id: no-repeated-dependencies
3+
title: no-repeated-dependencies
4+
---
5+
6+
Enabling this rule will result in an error being generated if a dependency exists in both `dependencies` and `devDependencies`.
7+
8+
## Example .npmpackagejsonlintrc configuration
9+
10+
```json
11+
{
12+
"rules": {
13+
"no-repeated-dependencies": "error"
14+
}
15+
}
16+
```
17+
18+
## Rule Details
19+
20+
### *Incorrect* example(s)
21+
22+
```json
23+
{
24+
"dependencies": {
25+
"grunt-npm-package-json-lint": "^0.3.0"
26+
},
27+
"devDependencies": {
28+
"grunt-npm-package-json-lint": "^0.3.0"
29+
}
30+
}
31+
```
32+
33+
34+
### *Correct* example(s)
35+
36+
```json
37+
{
38+
"dependencies": {
39+
"gulp-npm-package-json-lint": "^0.3.0"
40+
},
41+
"devDependencies": {
42+
"grunt-npm-package-json-lint": "^0.3.0"
43+
}
44+
}
45+
```
46+
47+
## History
48+
49+
* Introduced in version 4.2.0

docs/rules/dependencies/no-restricted-dependencies.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ Enabling this rule will result in an error being generated if one of the depende
1111
{
1212
"rules": {
1313
"no-restricted-dependencies": ["error", [
14-
"grunt-npm-package-json-lint"
14+
"grunt-npm-package-json-lint",
15+
"@types/*"
1516
]]
1617
}
1718
}
@@ -29,6 +30,15 @@ Enabling this rule will result in an error being generated if one of the depende
2930
}
3031
```
3132

33+
```json
34+
{
35+
"devDependencies": {
36+
"@types/node": "^0.3.0"
37+
}
38+
}
39+
```
40+
41+
3242
### *Correct* example(s)
3343

3444
```json
@@ -51,5 +61,6 @@ Enabling this rule will result in an error being generated if one of the depende
5161

5262
## History
5363

64+
* Allow for wildcard dependency restrictions. Add `*` to the end of the dependency string to indicate a wildcard search. This will result in a lint issue if the dependency starts with the string before the `*`. Added in 4.2.0.
5465
* Renamed from dependencies-invalid-dependencies to no-restricted-dependencies in version 1.0.0
5566
* Introduced in version 0.1.0

docs/rules/dependencies/no-restricted-devDependencies.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ Enabling this rule will result in an error being generated if one of the depende
1111
{
1212
"rules": {
1313
"no-restricted-devDependencies": ["error", [
14-
"grunt-npm-package-json-lint"
14+
"grunt-npm-package-json-lint",
15+
"@types/*"
1516
]]
1617
}
1718
}
@@ -29,6 +30,14 @@ Enabling this rule will result in an error being generated if one of the depende
2930
}
3031
```
3132

33+
```json
34+
{
35+
"devDependencies": {
36+
"@types/node": "^0.3.0"
37+
}
38+
}
39+
```
40+
3241
### *Correct* example(s)
3342

3443
```json
@@ -51,5 +60,6 @@ Enabling this rule will result in an error being generated if one of the depende
5160

5261
## History
5362

63+
* Allow for wildcard dependency restrictions. Add `*` to the end of the dependency string to indicate a wildcard search. This will result in a lint issue if the dependency starts with the string before the `*`. Added in 4.2.0.
5464
* Renamed from devDependencies-invalid-dependencies to no-restricted-devDependencies in version 1.0.0
5565
* Introduced in version 0.1.0
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
---
2+
id: prefer-alphabetical-scripts
3+
title: prefer-alphabetical-scripts
4+
---
5+
6+
Enabling this rule will result in an error being generated if the scripts in `scripts` are not in alphabetical order.
7+
8+
## Example .npmpackagejsonlintrc configuration
9+
10+
```json
11+
{
12+
"rules": {
13+
"prefer-alphabetical-scripts": "error"
14+
}
15+
}
16+
```
17+
18+
## Rule Details
19+
20+
### *Incorrect* example(s)
21+
22+
```json
23+
{
24+
"scripts": {
25+
"build": "build script",
26+
"test": "jest",
27+
"start": "node index.js"
28+
}
29+
}
30+
```
31+
32+
### *Correct* example(s)
33+
34+
```json
35+
{
36+
"scripts": {
37+
"build": "build script",
38+
"start": "node index.js",
39+
"test": "jest"
40+
}
41+
}
42+
```
43+
44+
## History
45+
46+
* Introduced in version 4.2.0

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "npm-package-json-lint",
3-
"version": "4.1.1",
3+
"version": "4.2.0",
44
"description": "Configurable linter for package.json files.",
55
"keywords": [
66
"lint",

src/rules/no-repeated-dependencies.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
const {exists} = require('../validators/property');
2+
const LintIssue = require('./../LintIssue');
3+
4+
const lintId = 'no-repeated-dependencies';
5+
const ruleType = 'standard';
6+
7+
const dependenciesNode = 'dependencies';
8+
const devDependenciesNode = 'devDependencies';
9+
10+
const lint = (packageJsonData, severity) => {
11+
if (!exists(packageJsonData, dependenciesNode)) {
12+
return true;
13+
}
14+
15+
if (!exists(packageJsonData, devDependenciesNode)) {
16+
return true;
17+
}
18+
19+
const dependencies = Object.keys(packageJsonData[dependenciesNode]);
20+
const devDependencies = Object.keys(packageJsonData[devDependenciesNode]);
21+
22+
/* eslint-disable-next-line no-restricted-syntax */
23+
for (const dependency of dependencies) {
24+
if (devDependencies.includes(dependency)) {
25+
return new LintIssue(
26+
lintId,
27+
severity,
28+
`${dependenciesNode}|${devDependenciesNode}`,
29+
`${dependency} exists in both ${dependenciesNode} and ${devDependenciesNode}. Please remove it from one of the dependency lists.`
30+
);
31+
}
32+
}
33+
34+
return true;
35+
};
36+
37+
module.exports = {
38+
lint,
39+
ruleType
40+
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
const {isInAlphabeticalOrder} = require('./../validators/alphabetical-sort');
2+
const {exists} = require('../validators/property');
3+
const LintIssue = require('./../LintIssue');
4+
5+
const lintId = 'prefer-alphabetical-scripts';
6+
const nodeName = 'scripts';
7+
const message = 'Your scripts are not in alphabetical order.';
8+
const ruleType = 'standard';
9+
10+
const lint = (packageJsonData, severity) => {
11+
if (!exists(packageJsonData, nodeName)) {
12+
return true;
13+
}
14+
15+
const result = isInAlphabeticalOrder(packageJsonData, nodeName);
16+
17+
if (!result.status) {
18+
return new LintIssue(
19+
lintId,
20+
severity,
21+
nodeName,
22+
`${message} Please move ${result.data.invalidNode} after ${result.data.validNode}.`
23+
);
24+
}
25+
26+
return true;
27+
};
28+
29+
module.exports = {
30+
lint,
31+
ruleType
32+
};

src/validators/dependency-audit.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,25 @@ const hasExceptions = config => {
77

88
/**
99
* Determines whether or not the package has a given dependency
10-
* @param {object} packageJsonData Valid JSON
11-
* @param {string} nodeName Name of a node in the package.json file
12-
* @param {string} depsToCheckFor An array of packages to check for
13-
* @return {boolean} True if the package has a dependency. False if it is not or the node is missing.
10+
* @param {object} packageJsonData Valid JSON
11+
* @param {string} nodeName Name of a node in the package.json file
12+
* @param {string} depsToCheckFor An array of packages to check for
13+
* @return {boolean} True if the package has a dependency. False if it is not or the node is missing.
1414
*/
1515
const hasDependency = (packageJsonData, nodeName, depsToCheckFor) => {
1616
if (!packageJsonData.hasOwnProperty(nodeName)) {
1717
return false;
1818
}
1919

2020
for (const dependencyName in packageJsonData[nodeName]) {
21-
if (depsToCheckFor.includes(dependencyName)) {
22-
return true;
21+
for (const depToCheckFor of depsToCheckFor) {
22+
if (depToCheckFor === dependencyName) {
23+
return true;
24+
}
25+
26+
if (depToCheckFor.endsWith('*') && dependencyName.startsWith(depToCheckFor.substring(0, depToCheckFor.length - 1))) {
27+
return true;
28+
}
2329
}
2430
}
2531

0 commit comments

Comments
 (0)