From d296ecf71622b8cd442521f1d26fb7e012ebef5a Mon Sep 17 00:00:00 2001 From: Bryan Mishkin <698306+bmish@users.noreply.github.com> Date: Mon, 20 Jan 2020 11:34:18 -0800 Subject: [PATCH] chore(lint): add eslint-plugin-eslint-plugin internally and fix violations This PR adds [eslint-plugin-eslint-plugin](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin) (a popular plugin for linting eslint plugins), enables relevant rules from it, and fixes violations. The primary changes included are: 1. Adds missing rule schemas ([require-meta-schema](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/blob/master/docs/rules/require-meta-schema.md)). Note that `schema: []` is added to enforce when a rule should have no schema. 2. Adds missing rule `type` property to `no-unused-modules` rule ([require-meta-type](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/blob/master/docs/rules/require-meta-type.md)). 3. Removes duplicate test cases ([no-identical-tests](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/blob/master/docs/rules/no-identical-tests.md)). 4. Switches some test cases to use the string shorthand ([test-case-shorthand-strings](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/blob/master/docs/rules/test-case-shorthand-strings.md)). --- .eslintrc.yml | 13 +++++++++++ CHANGELOG.md | 1 + package.json | 1 + src/rules/default.js | 1 + src/rules/export.js | 1 + src/rules/exports-last.js | 1 + src/rules/first.js | 6 +++++ src/rules/named.js | 1 + src/rules/newline-after-import.js | 2 +- src/rules/no-amd.js | 1 + src/rules/no-default-export.js | 1 + src/rules/no-deprecated.js | 1 + src/rules/no-dynamic-require.js | 1 + src/rules/no-mutable-exports.js | 1 + src/rules/no-named-as-default-member.js | 1 + src/rules/no-named-as-default.js | 1 + src/rules/no-named-default.js | 1 + src/rules/no-named-export.js | 1 + src/rules/no-namespace.js | 1 + src/rules/no-nodejs-modules.js | 11 +++++++++ src/rules/no-unused-modules.js | 1 + src/rules/no-useless-path-segments.js | 4 ++-- src/rules/no-webpack-loader-syntax.js | 1 + src/rules/prefer-default-export.js | 1 + src/rules/unambiguous.js | 1 + tests/src/rules/default.js | 5 ---- tests/src/rules/export.js | 2 -- tests/src/rules/named.js | 1 - tests/src/rules/newline-after-import.js | 10 -------- tests/src/rules/no-commonjs.js | 23 +++++++++---------- tests/src/rules/no-extraneous-dependencies.js | 9 -------- tests/src/rules/no-unassigned-import.js | 1 - 32 files changed, 64 insertions(+), 43 deletions(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index 5ee1be595b..4384c92984 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -1,8 +1,10 @@ --- plugins: + - eslint-plugin - import extends: - eslint:recommended + - plugin:eslint-plugin/recommended - plugin:import/recommended env: @@ -26,6 +28,17 @@ rules: - allowTemplateLiterals: true avoidEscape: true + eslint-plugin/consistent-output: "error" + eslint-plugin/meta-property-ordering: "error" + eslint-plugin/no-deprecated-context-methods: "error" + eslint-plugin/no-deprecated-report-api: "off" + eslint-plugin/prefer-output-null: "error" + eslint-plugin/prefer-replace-text: "error" + eslint-plugin/report-message-format: "error" + eslint-plugin/require-meta-schema: "error" + eslint-plugin/require-meta-type: "error" + eslint-plugin/test-case-shorthand-strings: "error" + # dog fooding import/no-extraneous-dependencies: "error" import/unambiguous: "off" diff --git a/CHANGELOG.md b/CHANGELOG.md index db4aec82a9..eee2fa8125 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ This change log adheres to standards from [Keep a CHANGELOG](http://keepachangel - [`extensions`]: for invalid code where `name` does not exist, do not crash ([#1613], thanks [@ljharb]) - [`extentions`]: Fix scope regex ([#1611], thanks [@yordis]) - [`no-duplicates`]: allow duplicate imports if one is a namespace and the other not ([#1612], thanks [@sveyret]) +- Add some missing rule meta schemas and types ([#1620], thanks [@bmish]) ### Changed - [`import/external-module-folders` setting] behavior is more strict now: it will only match complete path segments ([#1605], thanks [@skozin]) diff --git a/package.json b/package.json index bfb70de07d..a06548bcd6 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,7 @@ "eslint-import-resolver-webpack": "file:./resolvers/webpack", "eslint-import-test-order-redirect": "file:./tests/files/order-redirect", "eslint-module-utils": "file:./utils", + "eslint-plugin-eslint-plugin": "^2.2.1", "eslint-plugin-import": "2.x", "linklocal": "^2.8.2", "mocha": "^3.5.3", diff --git a/src/rules/default.js b/src/rules/default.js index a524dcdc72..09efa0d880 100644 --- a/src/rules/default.js +++ b/src/rules/default.js @@ -7,6 +7,7 @@ module.exports = { docs: { url: docsUrl('default'), }, + schema: [], }, create: function (context) { diff --git a/src/rules/export.js b/src/rules/export.js index 9402bc9d87..dc73462285 100644 --- a/src/rules/export.js +++ b/src/rules/export.js @@ -45,6 +45,7 @@ module.exports = { docs: { url: docsUrl('export'), }, + schema: [], }, create: function (context) { diff --git a/src/rules/exports-last.js b/src/rules/exports-last.js index fc40cc8271..65dd8a30fa 100644 --- a/src/rules/exports-last.js +++ b/src/rules/exports-last.js @@ -12,6 +12,7 @@ module.exports = { docs: { url: docsUrl('exports-last'), }, + schema: [], }, create: function (context) { diff --git a/src/rules/first.js b/src/rules/first.js index 7bcd1fa22e..393cadb1fa 100644 --- a/src/rules/first.js +++ b/src/rules/first.js @@ -7,6 +7,12 @@ module.exports = { url: docsUrl('first'), }, fixable: 'code', + schema: [ + { + type: 'string', + enum: ['absolute-first'], + }, + ], }, create: function (context) { diff --git a/src/rules/named.js b/src/rules/named.js index cc9199d480..6853229b45 100644 --- a/src/rules/named.js +++ b/src/rules/named.js @@ -8,6 +8,7 @@ module.exports = { docs: { url: docsUrl('named'), }, + schema: [], }, create: function (context) { diff --git a/src/rules/newline-after-import.js b/src/rules/newline-after-import.js index f5724ef4a3..690826eb42 100644 --- a/src/rules/newline-after-import.js +++ b/src/rules/newline-after-import.js @@ -49,6 +49,7 @@ module.exports = { docs: { url: docsUrl('newline-after-import'), }, + fixable: 'whitespace', schema: [ { 'type': 'object', @@ -61,7 +62,6 @@ module.exports = { 'additionalProperties': false, }, ], - fixable: 'whitespace', }, create: function (context) { let level = 0 diff --git a/src/rules/no-amd.js b/src/rules/no-amd.js index bb7c8ed826..a6a460bcf8 100644 --- a/src/rules/no-amd.js +++ b/src/rules/no-amd.js @@ -15,6 +15,7 @@ module.exports = { docs: { url: docsUrl('no-amd'), }, + schema: [], }, create: function (context) { diff --git a/src/rules/no-default-export.js b/src/rules/no-default-export.js index e1c687c9f7..0a46fd35f7 100644 --- a/src/rules/no-default-export.js +++ b/src/rules/no-default-export.js @@ -2,6 +2,7 @@ module.exports = { meta: { type: 'suggestion', docs: {}, + schema: [], }, create(context) { diff --git a/src/rules/no-deprecated.js b/src/rules/no-deprecated.js index 7a3130b20c..fc01d9dd10 100644 --- a/src/rules/no-deprecated.js +++ b/src/rules/no-deprecated.js @@ -21,6 +21,7 @@ module.exports = { docs: { url: docsUrl('no-deprecated'), }, + schema: [], }, create: function (context) { diff --git a/src/rules/no-dynamic-require.js b/src/rules/no-dynamic-require.js index b9ccad27b3..9e7af8e283 100644 --- a/src/rules/no-dynamic-require.js +++ b/src/rules/no-dynamic-require.js @@ -19,6 +19,7 @@ module.exports = { docs: { url: docsUrl('no-dynamic-require'), }, + schema: [], }, create: function (context) { diff --git a/src/rules/no-mutable-exports.js b/src/rules/no-mutable-exports.js index 0908162bd1..7e94bfbe9b 100644 --- a/src/rules/no-mutable-exports.js +++ b/src/rules/no-mutable-exports.js @@ -6,6 +6,7 @@ module.exports = { docs: { url: docsUrl('no-mutable-exports'), }, + schema: [], }, create: function (context) { diff --git a/src/rules/no-named-as-default-member.js b/src/rules/no-named-as-default-member.js index b7c3c75827..b6e50cd713 100644 --- a/src/rules/no-named-as-default-member.js +++ b/src/rules/no-named-as-default-member.js @@ -18,6 +18,7 @@ module.exports = { docs: { url: docsUrl('no-named-as-default-member'), }, + schema: [], }, create: function(context) { diff --git a/src/rules/no-named-as-default.js b/src/rules/no-named-as-default.js index ad6a8ee6d1..b4c64a34c9 100644 --- a/src/rules/no-named-as-default.js +++ b/src/rules/no-named-as-default.js @@ -8,6 +8,7 @@ module.exports = { docs: { url: docsUrl('no-named-as-default'), }, + schema: [], }, create: function (context) { diff --git a/src/rules/no-named-default.js b/src/rules/no-named-default.js index 86f24ef6d1..f0b74a2ffb 100644 --- a/src/rules/no-named-default.js +++ b/src/rules/no-named-default.js @@ -6,6 +6,7 @@ module.exports = { docs: { url: docsUrl('no-named-default'), }, + schema: [], }, create: function (context) { diff --git a/src/rules/no-named-export.js b/src/rules/no-named-export.js index 2fa6392014..e7d4b08351 100644 --- a/src/rules/no-named-export.js +++ b/src/rules/no-named-export.js @@ -4,6 +4,7 @@ module.exports = { meta: { type: 'suggestion', docs: { url: docsUrl('no-named-export') }, + schema: [], }, create(context) { diff --git a/src/rules/no-namespace.js b/src/rules/no-namespace.js index a3a6913646..0b63132508 100644 --- a/src/rules/no-namespace.js +++ b/src/rules/no-namespace.js @@ -17,6 +17,7 @@ module.exports = { url: docsUrl('no-namespace'), }, fixable: 'code', + schema: [], }, create: function (context) { diff --git a/src/rules/no-nodejs-modules.js b/src/rules/no-nodejs-modules.js index 125bb5f3f1..c8778d0d9d 100644 --- a/src/rules/no-nodejs-modules.js +++ b/src/rules/no-nodejs-modules.js @@ -14,6 +14,17 @@ module.exports = { docs: { url: docsUrl('no-nodejs-modules'), }, + schema: [ + { + type: 'object', + properties: { + allow: { + type: 'array', + }, + }, + additionalProperties: false, + }, + ], }, create: function (context) { diff --git a/src/rules/no-unused-modules.js b/src/rules/no-unused-modules.js index 5c6a73d828..44606dc857 100644 --- a/src/rules/no-unused-modules.js +++ b/src/rules/no-unused-modules.js @@ -305,6 +305,7 @@ const fileIsInPkg = file => { module.exports = { meta: { + type: 'suggestion', docs: { url: docsUrl('no-unused-modules') }, schema: [{ properties: { diff --git a/src/rules/no-useless-path-segments.js b/src/rules/no-useless-path-segments.js index ea72e6c54b..785b98f0d6 100644 --- a/src/rules/no-useless-path-segments.js +++ b/src/rules/no-useless-path-segments.js @@ -43,6 +43,8 @@ module.exports = { url: docsUrl('no-useless-path-segments'), }, + fixable: 'code', + schema: [ { type: 'object', @@ -53,8 +55,6 @@ module.exports = { additionalProperties: false, }, ], - - fixable: 'code', }, create(context) { diff --git a/src/rules/no-webpack-loader-syntax.js b/src/rules/no-webpack-loader-syntax.js index 723f472692..8075a6f9eb 100644 --- a/src/rules/no-webpack-loader-syntax.js +++ b/src/rules/no-webpack-loader-syntax.js @@ -15,6 +15,7 @@ module.exports = { docs: { url: docsUrl('no-webpack-loader-syntax'), }, + schema: [], }, create: function (context) { diff --git a/src/rules/prefer-default-export.js b/src/rules/prefer-default-export.js index 17a07688c3..f1db4eaaa6 100644 --- a/src/rules/prefer-default-export.js +++ b/src/rules/prefer-default-export.js @@ -8,6 +8,7 @@ module.exports = { docs: { url: docsUrl('prefer-default-export'), }, + schema: [], }, create: function(context) { diff --git a/src/rules/unambiguous.js b/src/rules/unambiguous.js index 7ec38c2cb2..52c2f5ac19 100644 --- a/src/rules/unambiguous.js +++ b/src/rules/unambiguous.js @@ -12,6 +12,7 @@ module.exports = { docs: { url: docsUrl('unambiguous'), }, + schema: [], }, create: function (context) { diff --git a/tests/src/rules/default.js b/tests/src/rules/default.js index c21f1fd8c2..4544285afb 100644 --- a/tests/src/rules/default.js +++ b/tests/src/rules/default.js @@ -105,11 +105,6 @@ ruleTester.run('default', rule, { errors: [{ message: 'No default export found in imported module "./named-exports".' , type: 'ImportDefaultSpecifier'}]}), - test({ - code: "import Foo from './jsx/FooES7.js';", - errors: ["Parse errors in imported module './jsx/FooES7.js': Unexpected token = (6:16)"], - }), - // es7 export syntax test({ code: 'export baz from "./named-exports"', diff --git a/tests/src/rules/export.js b/tests/src/rules/export.js index c7f303c4dd..bfe509065a 100644 --- a/tests/src/rules/export.js +++ b/tests/src/rules/export.js @@ -15,8 +15,6 @@ ruleTester.run('export', rule, { test({ code: 'export var foo = "foo", bar = "bar";' }), test({ code: 'export var { foo, bar } = object;' }), test({ code: 'export var [ foo, bar ] = array;' }), - test({ code: 'export var { foo, bar } = object;' }), - test({ code: 'export var [ foo, bar ] = array;' }), test({ code: 'let foo; export { foo, foo as bar }' }), test({ code: 'let bar; export { bar }; export * from "./export-all"' }), test({ code: 'export * from "./export-all"' }), diff --git a/tests/src/rules/named.js b/tests/src/rules/named.js index 8318066496..a189fbfd12 100644 --- a/tests/src/rules/named.js +++ b/tests/src/rules/named.js @@ -173,7 +173,6 @@ ruleTester.run('named', rule, { test({ code: 'import { a } from "./re-export-names"', - options: [2, 'es6-only'], errors: [error('a', './re-export-names')], }), diff --git a/tests/src/rules/newline-after-import.js b/tests/src/rules/newline-after-import.js index 490fad97dd..220b217d77 100644 --- a/tests/src/rules/newline-after-import.js +++ b/tests/src/rules/newline-after-import.js @@ -210,16 +210,6 @@ ruleTester.run('newline-after-import', require('rules/newline-after-import'), { } ], parserOptions: { ecmaVersion: 2015, sourceType: 'module' }, }, - { - code: `var foo = require('foo-module');\nvar something = 123;`, - output: `var foo = require('foo-module');\n\nvar something = 123;`, - errors: [ { - line: 1, - column: 1, - message: REQUIRE_ERROR_MESSAGE, - } ], - parserOptions: { ecmaVersion: 2015, sourceType: 'module' }, - }, { code: `import foo from 'foo';\nvar a = 123;\n\nimport { bar } from './bar-lib';\nvar b=456;`, output: `import foo from 'foo';\n\nvar a = 123;\n\nimport { bar } from './bar-lib';\n\nvar b=456;`, diff --git a/tests/src/rules/no-commonjs.js b/tests/src/rules/no-commonjs.js index 1bcbc65ab3..71f02e4b9f 100644 --- a/tests/src/rules/no-commonjs.js +++ b/tests/src/rules/no-commonjs.js @@ -13,7 +13,6 @@ ruleTester.run('no-commonjs', require('rules/no-commonjs'), { // imports { code: 'import "x";', parserOptions: { ecmaVersion: 2015, sourceType: 'module' } }, { code: 'import x from "x"', parserOptions: { ecmaVersion: 2015, sourceType: 'module' } }, - { code: 'import x from "x"', parserOptions: { ecmaVersion: 2015, sourceType: 'module' } }, { code: 'import { x } from "x"', parserOptions: { ecmaVersion: 2015, sourceType: 'module' } }, // exports @@ -30,15 +29,15 @@ ruleTester.run('no-commonjs', require('rules/no-commonjs'), { }, // allowed requires - { code: 'function a() { var x = require("y"); }' }, // nested requires allowed - { code: 'var a = c && require("b")' }, // conditional requires allowed - { code: 'require.resolve("help")' }, // methods of require are allowed - { code: 'require.ensure([])' }, // webpack specific require.ensure is allowed - { code: 'require([], function(a, b, c) {})' }, // AMD require is allowed - { code: "var bar = require('./bar', true);" }, - { code: "var bar = proxyquire('./bar');" }, - { code: "var bar = require('./ba' + 'r');" }, - { code: 'var zero = require(0);' }, + 'function a() { var x = require("y"); }', // nested requires allowed + 'var a = c && require("b")', // conditional requires allowed + 'require.resolve("help")', // methods of require are allowed + 'require.ensure([])', // webpack specific require.ensure is allowed + 'require([], function(a, b, c) {})', // AMD require is allowed + "var bar = require('./bar', true);", + "var bar = proxyquire('./bar');", + "var bar = require('./ba' + 'r');", + 'var zero = require(0);', { code: 'require("x")', options: [{ allowRequire: true }] }, // commonJS doesn't care how the path is built. You can use a function to @@ -61,8 +60,8 @@ ruleTester.run('no-commonjs', require('rules/no-commonjs'), { { code: 'if (typeof window !== "undefined") require("x")', options: [{ allowRequire: false }] }, { code: 'if (typeof window !== "undefined") { require("x") }', options: [{ allowRequire: true }] }, { code: 'if (typeof window !== "undefined") { require("x") }', options: [{ allowRequire: false }] }, - - { code: 'try { require("x") } catch (error) {}' }, + + 'try { require("x") } catch (error) {}', ], invalid: [ diff --git a/tests/src/rules/no-extraneous-dependencies.js b/tests/src/rules/no-extraneous-dependencies.js index 114a733af7..e70a601746 100644 --- a/tests/src/rules/no-extraneous-dependencies.js +++ b/tests/src/rules/no-extraneous-dependencies.js @@ -66,11 +66,6 @@ ruleTester.run('no-extraneous-dependencies', rule, { options: [{devDependencies: ['*.test.js', '*.spec.js']}], filename: path.join(process.cwd(), 'foo.spec.js'), }), - test({ - code: 'import chai from "chai"', - options: [{devDependencies: ['*.test.js', '*.spec.js']}], - filename: path.join(process.cwd(), 'foo.spec.js'), - }), test({ code: 'require(6)' }), test({ code: 'import "doctrine"', @@ -101,10 +96,6 @@ ruleTester.run('no-extraneous-dependencies', rule, { code: 'import leftpad from "left-pad";', options: [{packageDir: [packageDirMonoRepoRoot, packageDirMonoRepoWithNested]}], }), - test({ - code: 'import leftpad from "left-pad";', - options: [{packageDir: [packageDirMonoRepoWithNested, packageDirMonoRepoRoot]}], - }), test({ code: 'import rightpad from "right-pad";', options: [{packageDir: [packageDirMonoRepoRoot, packageDirMonoRepoWithNested]}], diff --git a/tests/src/rules/no-unassigned-import.js b/tests/src/rules/no-unassigned-import.js index 97be736134..414bfca90f 100644 --- a/tests/src/rules/no-unassigned-import.js +++ b/tests/src/rules/no-unassigned-import.js @@ -23,7 +23,6 @@ ruleTester.run('no-unassigned-import', rule, { test({ code: 'const {foo} = require("lodash")'}), test({ code: 'const {foo: bar} = require("lodash")'}), test({ code: 'const [a, b] = require("lodash")'}), - test({ code: 'const _ = require("lodash")'}), test({ code: 'const _ = require("./")'}), test({ code: 'foo(require("lodash"))'}), test({ code: 'require("lodash").foo'}),