From 1c7bb29b624f4a50a070853fc614b1f0a4f04efb 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] [Tests] 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)). --- .eslintrc.yml | 12 ++++++++++++ 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 | 15 +++++++++++++++ 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 | 3 +-- tests/src/rules/no-extraneous-dependencies.js | 9 --------- tests/src/rules/no-unassigned-import.js | 1 - 32 files changed, 57 insertions(+), 33 deletions(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index 5ee1be595b..c09d4f599e 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,16 @@ 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" + # 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..fb9bc23e28 100644 --- a/src/rules/no-nodejs-modules.js +++ b/src/rules/no-nodejs-modules.js @@ -14,6 +14,21 @@ module.exports = { docs: { url: docsUrl('no-nodejs-modules'), }, + schema: [ + { + type: 'object', + properties: { + allow: { + type: 'array', + uniqueItems: true, + items: { + type: 'string', + }, + }, + }, + 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..d471693154 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 @@ -61,7 +60,7 @@ 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) {}' }, ], 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'}),