Skip to content

Commit 81a7268

Browse files
committed
V1.0.0 (#14)
* Format eslintrc file * Rename require rules Ex: name-required is now require-name * Rename valid-values rules Ex: author-valid-values is now valid-values-author * Add new required rules * Rename recommended rules to required rules Ex: bugs-recommended is now require-bugs * Add new type rules * Allow users to decide if the rule should be an error or warning Also add logic to validate config * Fix issue with man-type rule Was checking for object, but should be checking for string/array * Rename dependency rules Ex: dependencies-invalid-dependencies is now no-restrictied-dependencies * Update default config All type rules name rules version rules * Update README for v1.0.0 Adjust rules. Link to wiki Add related tools * Add rule configuration instructions * Bump version and update changelog
1 parent 0431c68 commit 81a7268

File tree

146 files changed

+1672
-453
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

146 files changed

+1672
-453
lines changed

.eslintrc.json

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,10 @@
2020
"no-empty-character-class": "error",
2121
"no-ex-assign": "error",
2222
"no-extra-boolean-cast": "error",
23-
"no-extra-parens": ["error", "all", { "conditionalAssign": false }],
23+
"no-extra-parens": ["error", "all", {"conditionalAssign": false}],
2424
"no-extra-semi": "error",
2525
"no-func-assign": "error",
26-
"no-invalid-regexp": ["error", {
27-
"allowConstructorFlags": ["u", "y"]}],
26+
"no-invalid-regexp": ["error", {"allowConstructorFlags": ["u", "y"]}],
2827
"no-irregular-whitespace": "error",
2928
"no-negated-in-lhs": "error",
3029
"no-obj-calls": "error",
@@ -114,23 +113,21 @@
114113
"array-bracket-spacing": ["error", "never"],
115114
"brace-style": "error",
116115
"camelcase": "error",
117-
"comma-spacing": ["error", { "before": false, "after": true }],
116+
"comma-spacing": ["error", {"before": false, "after": true}],
118117
"comma-style": ["error", "last"],
119118
"computed-property-spacing": ["error", "never"],
120119
"eol-last": "error",
121120
"func-style": ["error", "expression"],
122121
"id-length": ["error", {"min": 2, "max": 20}],
123122
"indent": ["error", 2],
124-
125123
"key-spacing": ["error", {"beforeColon": false, "afterColon": true}],
126-
127124
"keyword-spacing": "error",
128125
"linebreak-style": ["error", "unix"],
129126
"max-depth": ["error", 4],
130127
"max-nested-callbacks": ["error", 3],
131128
"max-params": ["error", 4],
132129
"max-statements": ["error", 12],
133-
"max-statements-per-line": ["error", { "max": 1 }],
130+
"max-statements-per-line": ["error", {"max": 1}],
134131
"new-cap": "error",
135132
"new-parens": "error",
136133
"newline-after-var": "error",
@@ -153,7 +150,7 @@
153150
"object-curly-spacing": ["error", "never"],
154151
"one-var": ["error", "never"],
155152
"operator-assignment": ["error", "always"],
156-
"padded-blocks": ["error", { "classes": "always" }],
153+
"padded-blocks": ["error", {"classes": "always"}],
157154
"quote-props": ["error", "consistent"],
158155
"quotes": ["error", "single"],
159156
"require-jsdoc": ["error", {
@@ -194,7 +191,7 @@
194191
}],
195192
"arrow-body-style": ["error", "always"],
196193
"arrow-parens": ["error", "always"],
197-
"arrow-spacing": ["error", { "before": true, "after": true }],
194+
"arrow-spacing": ["error", {"before": true, "after": true}],
198195
"constructor-super": "error",
199196
"no-class-assign": "error",
200197
"no-confusing-arrow": ["error", {"allowParens": true}],

CHANGELOG.md

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,66 @@ This project adheres to [Semantic Versioning](http://semver.org/).
1111

1212
### Removed
1313

14+
## [1.0.0] - 2016-05-22
15+
### Added
16+
- New rule: [require-bin](https://github.com/tclindner/npm-package-json-lint/wiki/require-bin)
17+
- New rule: [require-bugs](https://github.com/tclindner/npm-package-json-lint/wiki/require-bugs)
18+
- New rule: [require-bundledDependencies](https://github.com/tclindner/npm-package-json-lint/wiki/require-bundledDependencies)
19+
- New rule: [require-config](https://github.com/tclindner/npm-package-json-lint/wiki/require-config)
20+
- New rule: [require-contributors](https://github.com/tclindner/npm-package-json-lint/wiki/require-contributors)
21+
- New rule: [require-cpu](https://github.com/tclindner/npm-package-json-lint/wiki/require-cpu)
22+
- New rule: [require-dependencies](https://github.com/tclindner/npm-package-json-lint/wiki/require-dependencies)
23+
- New rule: [require-devDependencies](https://github.com/tclindner/npm-package-json-lint/wiki/require-devDependencies)
24+
- New rule: [require-directories](https://github.com/tclindner/npm-package-json-lint/wiki/require-directories)
25+
- New rule: [require-files](https://github.com/tclindner/npm-package-json-lint/wiki/require-files)
26+
- New rule: [require-homepage](https://github.com/tclindner/npm-package-json-lint/wiki/require-homepage)
27+
- New rule: [require-main](https://github.com/tclindner/npm-package-json-lint/wiki/require-main)
28+
- New rule: [require-man](https://github.com/tclindner/npm-package-json-lint/wiki/require-man)
29+
- New rule: [require-optionalDependencies](https://github.com/tclindner/npm-package-json-lint/wiki/require-optionalDependencies)
30+
- New rule: [require-os](https://github.com/tclindner/npm-package-json-lint/wiki/require-os)
31+
- New rule: [require-peerDependencies](https://github.com/tclindner/npm-package-json-lint/wiki/require-peerDependencies)
32+
- New rule: [require-preferGlobal](https://github.com/tclindner/npm-package-json-lint/wiki/require-preferGlobal)
33+
- New rule: [require-private](https://github.com/tclindner/npm-package-json-lint/wiki/require-private)
34+
- New rule: [require-publishConfig](https://github.com/tclindner/npm-package-json-lint/wiki/require-publishConfig)
35+
- New rule: [require-repository](https://github.com/tclindner/npm-package-json-lint/wiki/require-repository)
36+
- New rule: [require-scripts](https://github.com/tclindner/npm-package-json-lint/wiki/require-scripts)
37+
- New rule: [os-type](https://github.com/tclindner/npm-package-json-lint/wiki/os-type)
38+
- New rule: [cpu-type](https://github.com/tclindner/npm-package-json-lint/wiki/cpu-type)
39+
- New rule: [optionalDependencies-type](https://github.com/tclindner/npm-package-json-lint/wiki/optionalDependencies-type)
40+
- New rule: [peerDependencies-type](https://github.com/tclindner/npm-package-json-lint/wiki/peerDependencies-type)
41+
- New rule: [bundledDependencies-type](https://github.com/tclindner/npm-package-json-lint/wiki/bundledDependencies-type)
42+
- Ability to specify whether a rule should be an error or a warning
43+
- Defaults now only include "type" rules and rules for name/version
44+
45+
### Changed
46+
- Renamed `author-required` to `require-author`
47+
- Renamed `description-required` to `require-description`
48+
- Renamed `engines-required` to `require-engines`
49+
- Renamed `license-required` to `require-license`
50+
- Renamed `name-required` to `require-name`
51+
- Renamed `repository-required` to `require-repository`
52+
- Renamed `version-required` to `require-version`
53+
- Renamed `bugs-recommended` to `require-bugs`
54+
- Renamed `homepage-recommended` to `require-homepage`
55+
- Renamed `keywords-recommended` to `require-keywords`
56+
- Renamed `author-valid-values` to `valid-values-author`
57+
- Renamed `private-valid-values` to `valid-values-private`
58+
- Renamed `dependencies-invalid-dependencies` to `no-restricted-dependencies`
59+
- Renamed `dependencies-invalid-pre-release-dependencies` to `no-restricted-pre-release-dependencies`
60+
- Renamed `devDependencies-invalid-dependencies` to `no-restricted-devDependencies`
61+
- Renamed `devDependencies-invalid-pre-release-dependencies` to `no-restricted-pre-release-devDependencies`
62+
63+
### Fixed
64+
- Updated `man-type` to account for both settings, array and string
65+
1466
## [0.4.0] - 2016-05-13
1567
### Added
16-
- New rule: prefer-caret-version-dependencies
17-
- New rule: prefer-tilde-version-dependencies
18-
- New rule: prefer-caret-version-devDependencies
19-
- New rule: prefer-tilde-version-devDependencies
20-
- New rule: prefer-no-version-zero-dependencies
21-
- New rule: prefer-no-version-zero-devDependencies
68+
- New rule: [prefer-caret-version-dependencies](https://github.com/tclindner/npm-package-json-lint/wiki/prefer-caret-version-dependencies)
69+
- New rule: [prefer-tilde-version-dependencies](https://github.com/tclindner/npm-package-json-lint/wiki/prefer-tilde-version-dependencies)
70+
- New rule: [prefer-caret-version-devDependencies](https://github.com/tclindner/npm-package-json-lint/wiki/prefer-caret-version-devDependencies)
71+
- New rule: [prefer-tilde-version-devDependencies](https://github.com/tclindner/npm-package-json-lint/wiki/prefer-tilde-version-devDependencies)
72+
- New rule: [prefer-no-version-zero-dependencies](https://github.com/tclindner/npm-package-json-lint/wiki/prefer-no-version-zero-dependencies)
73+
- New rule: [prefer-no-version-zero-devDependencies](https://github.com/tclindner/npm-package-json-lint/wiki/prefer-no-version-zero-devDependencies)
2274

2375
### Changed
2476
- Update to single quotes (ESLint rule: quotes)

README.md

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ Currently it can check for:
2020
* whether a version number is a valid
2121
* the presence of a given module
2222
* the presence of a pre-release version of a module
23+
* and much more!
24+
25+
Please see the [wiki](https://github.com/tclindner/npm-package-json-lint/wiki) for a list of rules.
2326

2427
## How do I install it?
2528

@@ -50,10 +53,10 @@ First thing first, let's make sure you have the necessary pre-requisites.
5053
### Examples
5154

5255
Run a specific rule, author-valid-values, on a file relative to the current working directory.
53-
`pjl-cli -f "../relative-path/package.json" -r "author-valid-values: true"`
56+
`pjl-cli -f "../relative-path/package.json" -r "require-author: 'error'"`
5457

5558
Run a specific rule, author-valid-values, ignoring warnings on a file relative to the current working directory.
56-
`pjl-cli -f "../relative-path/package.json" -r "author-valid-values: true" --ignore-warnings`
59+
`pjl-cli -f "../relative-path/package.json" -r "require-author: 'error'" --ignore-warnings`
5760

5861
Run using the config in `.npmpackagejsonlintrc` on a file relative to the current working directory.
5962
`pjl-cli -f "../relative-path/package.json" -c "./.npmpackagejsonlintrc"`
@@ -63,15 +66,29 @@ Run using the default config on a file relative to the current working directory
6366

6467
## Lint Rules
6568

66-
npm-package-json-lint has a configurable set of rules. Please see the [wiki](https://github.com/tclindner/npm-package-json-lint/wiki) for a list of available rules configuration instructions. Each rule contains the following properties:
69+
npm-package-json-lint has a configurable set of rules. Please see the [wiki](https://github.com/tclindner/npm-package-json-lint/wiki) for a full list of available rules. By [default](src/defaultConfig.js) only type checks and name/version rules are enforced. This is the bare minimum configuration.
70+
71+
Each rule contains the following properties:
72+
73+
1. ID - example: require-author
74+
2. Node - example: author
75+
3. Message - example: author is required
76+
4. Rule Type - example: required
77+
78+
As mentioned in the "Commands and configuration" section there are two ways to specify rule sets. The first is using `--rule` to specify a given rule. This will run npm-package-json-lint with just this rule. The second is using `--rules-file` to specify a JSON file, named [`.npmpackagejsonlintrc`](https://github.com/tclindner/npm-package-json-lint/wiki/npm-package-json-lint-rc), to run a set of rules. If neither of the options above are specified then npm-package-json-lint looks for a global [`.npmpackagejsonlintrc`](https://github.com/tclindner/npm-package-json-lint/wiki/npm-package-json-lint-rc) file in the root of your user directory. Finally, if a global [`.npmpackagejsonlintrc`](https://github.com/tclindner/npm-package-json-lint/wiki/npm-package-json-lint-rc) file doesn't exist then the [defaults](src/defaultConfig.js) are used.
79+
80+
### Configuring rules
81+
82+
npm-package-json-lint rules can either be run as an `error` or a `warning`.
6783

68-
1. ID - example: author-required
69-
2. Type - error or warning
70-
3. Node - example: author
71-
4. Message - example: author is required
72-
5. Rule Type - example: required
84+
* "warning" - run the rule as a warning
85+
* "error" - run the rule as an error
7386

74-
As mentioned in the "Commands and configuration" section there are two ways to specify rule sets. The first is using `--rule` to specify a given rule. This will run package json lint with just this rule. The second is using `--rules-file` to specify a JSON file, named [`.npmpackagejsonlintrc`](https://github.com/tclindner/npm-package-json-lint/wiki/npm-package-json-lint-rc), to run a set of rules. If neither of the options above are specified then package json lint looks for a global [`.npmpackagejsonlintrc`](https://github.com/tclindner/npm-package-json-lint/wiki/npm-package-json-lint-rc) file in the root of your user directory. Finally, if a global [`.npmpackagejsonlintrc`](https://github.com/tclindner/npm-package-json-lint/wiki/npm-package-json-lint-rc) file doesn't exist then all rules are enabled by [default](src/defaultConfig.js).
87+
Ex: `"require-author": "error"`
88+
89+
## Migrating from v0.x.x to 1.x.x
90+
91+
Please see [CONTRIBUTING.md](CONTRIBUTING.md).
7592

7693
## Contributing
7794

@@ -81,6 +98,10 @@ Please see [CONTRIBUTING.md](CONTRIBUTING.md).
8198

8299
Please see [CHANGELOG.md](CHANGELOG.md).
83100

101+
## Related
102+
103+
* [grunt-npm-package-json-lint](grunt-npm-package-json-lint): Grunt Wrapper for npm-package-json-lint
104+
84105
## License
85106

86107
Copyright (c) 2016 Thomas Lindner. Licensed under the MIT license.

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": "0.4.0",
3+
"version": "1.0.0",
44
"description": "CLI app for linting package.json files.",
55
"keywords": [
66
"lint",

src/Config.js

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
'use strict';
22

3+
const inArray = require('in-array');
4+
const isPlainObj = require('is-plain-obj');
35
const Parser = require('./Parser');
46
const path = require('path');
57

@@ -10,6 +12,17 @@ class Config {
1012
* @param {Object|String} passedConfigParam Object or string with desired configuration
1113
*/
1214
constructor(passedConfigParam) {
15+
this.arrayRules = [
16+
'valid-values-author',
17+
'valid-values-private',
18+
'no-restricted-dependencies',
19+
'no-restricted-devDependencies',
20+
'no-restricted-pre-release-dependencies',
21+
'no-restricted-pre-release-devDependencies'
22+
];
23+
this.firstKey = 0;
24+
this.secondKey = 1;
25+
1326
if (this._isConfigPassed(passedConfigParam)) {
1427
const passedConfig = this._getPassedConfig(passedConfigParam);
1528

@@ -53,12 +66,41 @@ class Config {
5366
configFile = path.join(__dirname, passedConfig);
5467
}
5568

56-
return parser.parse(configFile);
69+
const rcFileObj = parser.parse(configFile);
70+
71+
this._validateConfig(rcFileObj);
72+
73+
return rcFileObj;
5774
}
5875

5976
return passedConfig;
6077
}
6178

79+
/**
80+
* Validates config file
81+
* @param {Object} rcFileObj Object version of .npmpackagejsonlintrc file
82+
* @return {boolean} True if validate config is successful
83+
*/
84+
_validateConfig(rcFileObj) {
85+
for (const rule in rcFileObj) {
86+
const ruleConfig = rcFileObj[rule];
87+
88+
if (Array.isArray(ruleConfig) && inArray(this.arrayRules, rule)) {
89+
if (typeof ruleConfig[this.firstKey] !== 'string' || typeof ruleConfig[this.firstKey] === 'string' && ruleConfig[this.firstKey] !== 'error' && ruleConfig[this.firstKey] !== 'warning') {
90+
throw new Error(`${rule} - first key must be set to "error" or "warning". Currently set to ${ruleConfig[this.firstKey]}`);
91+
}
92+
93+
if (!Array.isArray(ruleConfig[this.secondKey])) {
94+
throw new Error(`${rule} - second key must be set an array. Currently set to ${ruleConfig[this.secondKey]}`);
95+
}
96+
} else if (typeof ruleConfig !== 'string' || typeof ruleConfig === 'string' && ruleConfig !== 'error' && ruleConfig !== 'warning') {
97+
throw new Error(`${rule} - must be set to "error" or "warning". Currently set to ${ruleConfig}`);
98+
}
99+
}
100+
101+
return true;
102+
}
103+
62104
}
63105

64106
module.exports = Config;

src/NpmPackageJsonLint.js

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ class NpmPackageJsonLint {
1717
constructor(packageJsonData, config, options) {
1818
this.packageJsonData = packageJsonData;
1919
this.ignoreWarnings = options.ignoreWarnings;
20-
this.arrayRuleTypes = ['valid-values', 'invalid-dependencies', 'invalid-pre-release-dependencies'];
20+
this.arrayRuleTypes = ['valid-values', 'no-restricted-dependencies', 'no-restricted-pre-release-dependencies'];
21+
this.firstKey = 0;
22+
this.secondKey = 1;
2123
this.errors = [];
2224
this.warnings = [];
2325

@@ -32,19 +34,20 @@ class NpmPackageJsonLint {
3234
* @return {Object} Results object
3335
*/
3436
lint() {
35-
for (const configItem in this.config) {
36-
const configItemValue = this.config[configItem];
37-
const ruleModule = this.rules.get(configItem);
37+
for (const rule in this.config) {
38+
const ruleModule = this.rules.get(rule);
3839

3940
if (inArray(this.arrayRuleTypes, ruleModule.ruleType)) {
40-
const lintResult = ruleModule.lint(this.packageJsonData, configItemValue);
41+
const errorWarningSetting = this.config[rule][this.firstKey];
42+
const ruleConfigArray = this.config[rule][this.secondKey];
43+
const lintResult = ruleModule.lint(this.packageJsonData, errorWarningSetting, ruleConfigArray);
4144

42-
this._processResult(lintResult, ruleModule.lintType);
43-
} else if (configItemValue) {
44-
// else all other rules either have a true or false flag if they are enabled
45-
const lintResult = ruleModule.lint(this.packageJsonData);
45+
this._processResult(lintResult, errorWarningSetting);
46+
} else {
47+
const errorWarningSetting = this.config[rule];
48+
const lintResult = ruleModule.lint(this.packageJsonData, errorWarningSetting);
4649

47-
this._processResult(lintResult, ruleModule.lintType);
50+
this._processResult(lintResult, errorWarningSetting);
4851
}
4952
}
5053

src/Rules.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@ class Rules {
2323
fs.readdirSync(rulesDirectory).forEach((file) => {
2424
const beginIndex = 0;
2525
const endIndex = -3;
26+
const ruleId = file.slice(beginIndex, endIndex);
27+
const ruleModule = path.join(rulesDirectory, file);
2628

27-
this.rules[file.slice(beginIndex, endIndex)] = path.join(rulesDirectory, file);
29+
this._registerRule(ruleId, ruleModule);
2830
});
2931

3032
return this.rules;

src/defaultConfig.js

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,33 @@
11
'use strict';
22

33
const defaultConfig = {
4-
'author-required': true,
5-
'bin-type': true,
6-
'bugs-recommended': true,
7-
'config-type': true,
8-
'dependencies-type': true,
9-
'description-required': true,
10-
'description-type': true,
11-
'devDependencies-type': true,
12-
'directories-type': true,
13-
'engines-required': true,
14-
'engines-type': true,
15-
'files-type': true,
16-
'homepage-recommended': true,
17-
'homepage-type': true,
18-
'keywords-recommended': true,
19-
'keywords-type': true,
20-
'license-required': true,
21-
'license-type': true,
22-
'main-type': true,
23-
'man-type': true,
24-
'name-format': true,
25-
'name-required': true,
26-
'name-type': true,
27-
'preferGlobal-type': true,
28-
'private-type': true,
29-
'repository-required': true,
30-
'repository-type': true,
31-
'scripts-type': true,
32-
'version-format': true,
33-
'version-required': true,
34-
'version-type': true
4+
'require-name': 'error',
5+
'require-version': 'error',
6+
'name-format': 'error',
7+
'version-format': 'error',
8+
'bin-type': 'error',
9+
'config-type': 'error',
10+
'cpu-type': 'error',
11+
'dependencies-type': 'error',
12+
'description-type': 'error',
13+
'devDependencies-type': 'error',
14+
'directories-type': 'error',
15+
'engines-type': 'error',
16+
'files-type': 'error',
17+
'homepage-type': 'error',
18+
'keywords-type': 'error',
19+
'license-type': 'error',
20+
'main-type': 'error',
21+
'man-type': 'error',
22+
'name-type': 'error',
23+
'optionalDependencies-type': 'error',
24+
'os-type': 'error',
25+
'peerDependencies-type': 'error',
26+
'preferGlobal-type': 'error',
27+
'private-type': 'error',
28+
'repository-type': 'error',
29+
'scripts-type': 'error',
30+
'version-type': 'error'
3531
};
3632

3733
module.exports = defaultConfig;

0 commit comments

Comments
 (0)