diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a1e04df..661f8499 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,8 @@ This project adheres to [Semantic Versioning](http://semver.org/). > Addresses [#93](https://github.com/tclindner/npm-package-json-lint/issues/93) +- New rule: [prefer-no-devDependencies](https://github.com/tclindner/npm-package-json-lint/wiki/prefer-no-devDependencies)] + ### Changed - [`name-format`](https://github.com/tclindner/npm-package-json-lint/wiki/name-format) now checks the following things: diff --git a/docs/rules.md b/docs/rules.md index e67d6620..bb633f35 100644 --- a/docs/rules.md +++ b/docs/rules.md @@ -197,8 +197,9 @@ Add the following to your `.npmpackagejsonlintrc.json` file. * [prefer-property-order](rules/package-json-properties/prefer-property-order.md) -## Deprecated node rules +## Disallowed node rules > Generates an error if the node is present -* [prefer-no-engineStrict](rules/deprecated-nodes/prefer-no-engineStrict) +* [prefer-no-engineStrict](rules/disallowed-nodes/prefer-no-engineStrict) +* [prefer-no-devDependencies](rules/disallowed-nodes/prefer-no-devDependencies) diff --git a/docs/rules/disallowed-nodes/prefer-no-devDependencies.md b/docs/rules/disallowed-nodes/prefer-no-devDependencies.md new file mode 100644 index 00000000..be31a46b --- /dev/null +++ b/docs/rules/disallowed-nodes/prefer-no-devDependencies.md @@ -0,0 +1,38 @@ +--- +id: prefer-no-devDependencies +title: prefer-no-devDependencies +--- + +Enabling this rule will result in an error being generated if `devDependencies` is present. + +## Example .npmpackagejsonlintrc configuration + +```json +{ + "rules": { + "prefer-no-devDependencies": "error" + } +} +``` + +## Rule Details + +### *Incorrect* example(s) + +```json +{ + "devDependencies": "dummy-value" +} +``` + +### *Correct* example(s) + +```json +{ + "prefer-no-devDependencies": "error" +} +``` + +## History + +* Introduced in version 4.0.0 diff --git a/docs/rules/deprecated-nodes/prefer-no-engineStrict.md b/docs/rules/disallowed-nodes/prefer-no-engineStrict.md similarity index 100% rename from docs/rules/deprecated-nodes/prefer-no-engineStrict.md rename to docs/rules/disallowed-nodes/prefer-no-engineStrict.md diff --git a/src/rules/prefer-no-devDependencies.js b/src/rules/prefer-no-devDependencies.js new file mode 100644 index 00000000..10fb7ed6 --- /dev/null +++ b/src/rules/prefer-no-devDependencies.js @@ -0,0 +1,20 @@ +const {exists} = require('../validators/property'); +const LintIssue = require('./../LintIssue'); + +const lintId = 'prefer-no-devDependencies'; +const nodeName = 'devDependencies'; +const message = 'devDependencies should not be defined'; +const ruleType = 'optionalObject'; + +const lint = (packageJsonData, severity) => { + if (exists(packageJsonData, nodeName)) { + return new LintIssue(lintId, severity, nodeName, message); + } + + return true; +}; + +module.exports = { + lint, + ruleType +}; diff --git a/test/unit/rules/prefer-no-devDependencies.test.js b/test/unit/rules/prefer-no-devDependencies.test.js new file mode 100644 index 00000000..b5341a56 --- /dev/null +++ b/test/unit/rules/prefer-no-devDependencies.test.js @@ -0,0 +1,49 @@ +const ruleModule = require('./../../../src/rules/prefer-no-devDependencies'); +const property = require('../../../src/validators/property'); + +const {lint, ruleType} = ruleModule; + +jest.mock('../../../src/validators/property'); + +const nodeName = 'devDependencies'; + +describe('prefer-no-devDependencies Unit Tests', () => { + describe('a rule type value should be exported', () => { + test('it should equal "optionalObject"', () => { + expect(ruleType).toStrictEqual('optionalObject'); + }); + }); + + describe('when package.json has devDependencies node', () => { + test('LintIssue object should be returned', () => { + property.exists.mockReturnValue(true); + + const packageJsonData = { + devDependencies: 'dummy-value' + }; + const response = lint(packageJsonData, 'error'); + + expect(response.lintId).toStrictEqual('prefer-no-devDependencies'); + expect(response.severity).toStrictEqual('error'); + expect(response.node).toStrictEqual(nodeName); + expect(response.lintMessage).toStrictEqual('devDependencies should not be defined'); + + expect(property.exists).toHaveBeenCalledTimes(1); + expect(property.exists).toHaveBeenCalledWith(packageJsonData, nodeName); + }); + }); + + describe('when package.json does not have node', () => { + test('true should be returned', () => { + property.exists.mockReturnValue(false); + + const packageJsonData = {}; + const response = lint(packageJsonData, 'error'); + + expect(response).toBe(true); + + expect(property.exists).toHaveBeenCalledTimes(1); + expect(property.exists).toHaveBeenCalledWith(packageJsonData, nodeName); + }); + }); +}); diff --git a/website/i18n/en.json b/website/i18n/en.json index cdbed226..4d24db4d 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -98,9 +98,12 @@ "rules/dependencies/prefer-tilde-version-devDependencies": { "title": "prefer-tilde-version-devDependencies" }, - "rules/deprecated-nodes/prefer-no-engineStrict": { + "rules/disallowed-nodes/prefer-no-engineStrict": { "title": "prefer-no-engineStrict" }, + "rules/disallowed-nodes/prefer-no-devDependencies": { + "title": "prefer-no-devDependencies" + }, "rules/format/description-format": { "title": "description-format" },