From e3b27e26d7d1c864b04a162b38d9384a16bff23a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=AF=E7=84=B6?= Date: Mon, 1 Apr 2024 18:17:35 +0800 Subject: [PATCH] feat: re-export flat configs "flat/*" (#453) * feat: re-export flat configs "flat/*" long-time plan: v6: no action v7: rename 'flat/*' => '*'; eslintrc config '*' => 'legacy/*'? v8~: remove eslintrc supports --- .eslint-doc-generatorrc.js | 7 +++++++ README.md | 37 ++++++++++++++++++++++++++------- configs/all-type-checked.js | 12 ++++++----- configs/all.js | 8 +++----- configs/recommended.js | 8 +++----- configs/rules-recommended.js | 8 +++----- configs/rules.js | 8 +++----- configs/tests-recommended.js | 8 +++----- configs/tests.js | 8 +++----- lib/index.js | 40 ++++++++++++++++++++++++++++-------- package.json | 14 ++++++------- 11 files changed, 100 insertions(+), 58 deletions(-) diff --git a/.eslint-doc-generatorrc.js b/.eslint-doc-generatorrc.js index 47100791..5f25c0a6 100644 --- a/.eslint-doc-generatorrc.js +++ b/.eslint-doc-generatorrc.js @@ -11,6 +11,13 @@ module.exports = { 'rules-recommended', 'tests', 'tests-recommended', + 'flat/recommended', + 'flat/all', + 'flat/all-type-checked', + 'flat/rules', + 'flat/rules-recommended', + 'flat/tests', + 'flat/tests-recommended', ], postprocess: async (content, path) => prettier.format(content, { diff --git a/README.md b/README.md index 908c2ad4..3021506d 100644 --- a/README.md +++ b/README.md @@ -47,9 +47,6 @@ Here's an example ESLint configuration that: ```json { - "parserOptions": { - "sourceType": "script" - }, "extends": ["plugin:eslint-plugin/recommended"], "rules": { "eslint-plugin/require-meta-docs-description": "error" @@ -60,11 +57,10 @@ Here's an example ESLint configuration that: ### [`eslint.config.js`](https://eslint.org/docs/latest/use/configure/configuration-files-new) (requires eslint>=v8.23.0) ```js -const eslintPluginRecommended = require('eslint-plugin-eslint-plugin/configs/recommended'); +const eslintPlugin = require('eslint-plugin-eslint-plugin'); module.exports = [ - eslintPluginRecommended, + eslintPlugin.configs['flat/recommended'], { - languageOptions: { sourceType: 'commonjs' }, rules: { 'eslint-plugin/require-meta-docs-description': 'error', }, @@ -139,7 +135,16 @@ The list of recommended rules will only change in a major release of this plugin ### Preset usage -Presets are enabled by adding a line to the `extends` list in your config file. For example, to enable the `recommended` preset, use: +Both flat and eslintrc configs are supported. For example, to enable the `recommended` preset, use: + +eslint.config.js + +```js +const eslintPlugin = require('eslint-plugin-eslint-plugin'); +module.exports = [eslintPlugin.configs['flat/recommended']]; +``` + +.eslintrc.json ```json { @@ -149,6 +154,24 @@ Presets are enabled by adding a line to the `extends` list in your config file. Or to apply linting only to the appropriate rule or test files: +eslint.config.js + +```js +const eslintPlugin = require('eslint-plugin-eslint-plugin'); +module.exports = [ + { + files: ['lib/rules/*.{js,ts}'], + ...eslintPlugin.configs['flat/rules-recommended'], + }, + { + files: ['tests/lib/rules/*.{js,ts}'], + ...eslintPlugin.configs['flat/tests-recommended'], + }, +]; +``` + +.eslintrc.js + ```json { "overrides": [ diff --git a/configs/all-type-checked.js b/configs/all-type-checked.js index e32d57d2..59bbf2b3 100644 --- a/configs/all-type-checked.js +++ b/configs/all-type-checked.js @@ -1,8 +1,10 @@ +/** + * @deprecated use 'flat/all-type-checked' instead + * @author 唯然 + */ + 'use strict'; -const mod = require('../lib/index.js'); +const plugin = require('../lib/index.js'); -module.exports = { - plugins: { 'eslint-plugin': mod }, - rules: mod.configs['all-type-checked'].rules, -}; +module.exports = plugin.configs['flat/all-type-checked']; diff --git a/configs/all.js b/configs/all.js index 131aeea1..e237d769 100644 --- a/configs/all.js +++ b/configs/all.js @@ -1,13 +1,11 @@ /** * @fileoverview the `all` config for `eslint.config.js` + * @deprecated use 'flat/all' instead * @author 唯然 */ 'use strict'; -const mod = require('../lib/index.js'); +const plugin = require('../lib/index.js'); -module.exports = { - plugins: { 'eslint-plugin': mod }, - rules: mod.configs.all.rules, -}; +module.exports = plugin.configs['flat/all']; diff --git a/configs/recommended.js b/configs/recommended.js index 977b4e24..bb282caa 100644 --- a/configs/recommended.js +++ b/configs/recommended.js @@ -1,13 +1,11 @@ /** * @fileoverview the `recommended` config for `eslint.config.js` + * @deprecated use 'flat/recommended' instead * @author 唯然 */ 'use strict'; -const mod = require('../lib/index.js'); +const plugin = require('../lib/index.js'); -module.exports = { - plugins: { 'eslint-plugin': mod }, - rules: mod.configs.recommended.rules, -}; +module.exports = plugin.configs['flat/recommended']; diff --git a/configs/rules-recommended.js b/configs/rules-recommended.js index dd784e45..09d8f57a 100644 --- a/configs/rules-recommended.js +++ b/configs/rules-recommended.js @@ -1,13 +1,11 @@ /** * @fileoverview the `rules-recommended` config for `eslint.config.js` + * @deprecated use 'flat/rules-recommended' instead * @author 唯然 */ 'use strict'; -const mod = require('../lib/index.js'); +const plugin = require('../lib/index.js'); -module.exports = { - plugins: { 'eslint-plugin': mod }, - rules: mod.configs['rules-recommended'].rules, -}; +module.exports = plugin.configs['flat/rules-recommended']; diff --git a/configs/rules.js b/configs/rules.js index 1a4f8a90..71ca5852 100644 --- a/configs/rules.js +++ b/configs/rules.js @@ -1,13 +1,11 @@ /** * @fileoverview the `rules` config for `eslint.config.js` + * @deprecated use 'flat/rules' instead * @author 唯然 */ 'use strict'; -const mod = require('../lib/index.js'); +const plugin = require('../lib/index.js'); -module.exports = { - plugins: { 'eslint-plugin': mod }, - rules: mod.configs.rules.rules, -}; +module.exports = plugin.configs['flat/rules']; diff --git a/configs/tests-recommended.js b/configs/tests-recommended.js index 41c50540..0a467239 100644 --- a/configs/tests-recommended.js +++ b/configs/tests-recommended.js @@ -1,13 +1,11 @@ /** * @fileoverview the `tests-recommended` config for `eslint.config.js` + * @deprecated use 'flat/tests-recommended' instead * @author 唯然 */ 'use strict'; -const mod = require('../lib/index.js'); +const plugin = require('../lib/index.js'); -module.exports = { - plugins: { 'eslint-plugin': mod }, - rules: mod.configs['tests-recommended'].rules, -}; +module.exports = plugin.configs['flat/tests-recommended']; diff --git a/configs/tests.js b/configs/tests.js index 53ea6c87..184d3bab 100644 --- a/configs/tests.js +++ b/configs/tests.js @@ -1,13 +1,11 @@ /** * @fileoverview the `tests` config for `eslint.config.js` + * @deprecated use 'flat/tests' instead * @author 唯然 */ 'use strict'; -const mod = require('../lib/index.js'); +const plugin = require('../lib/index.js'); -module.exports = { - plugins: { 'eslint-plugin': mod }, - rules: mod.configs.tests.rules, -}; +module.exports = plugin.configs['flat/tests']; diff --git a/lib/index.js b/lib/index.js index b09550a2..3996fdb2 100644 --- a/lib/index.js +++ b/lib/index.js @@ -42,15 +42,19 @@ const allRules = Object.fromEntries( ]) ); -module.exports.meta = { - name: packageMetadata.name, - version: packageMetadata.version, +const plugin = { + meta: { + name: packageMetadata.name, + version: packageMetadata.version, + }, + rules: allRules, + configs: {}, // assigned later }; -module.exports.rules = allRules; - -module.exports.configs = Object.keys(configFilters).reduce( - (configs, configName) => { +// eslintrc configs +Object.assign( + plugin.configs, + Object.keys(configFilters).reduce((configs, configName) => { return Object.assign(configs, { [configName]: { plugins: ['eslint-plugin'], @@ -61,6 +65,24 @@ module.exports.configs = Object.keys(configFilters).reduce( ), }, }); - }, - {} + }, {}) +); + +// flat configs +Object.assign( + plugin.configs, + Object.keys(configFilters).reduce((configs, configName) => { + return Object.assign(configs, { + [`flat/${configName}`]: { + plugins: { 'eslint-plugin': plugin }, + rules: Object.fromEntries( + Object.keys(allRules) + .filter((ruleName) => configFilters[configName](allRules[ruleName])) + .map((ruleName) => [`${PLUGIN_NAME}/${ruleName}`, 'error']) + ), + }, + }); + }, {}) ); + +module.exports = plugin; diff --git a/package.json b/package.json index c8b532e1..08a8fb98 100644 --- a/package.json +++ b/package.json @@ -53,15 +53,15 @@ "@commitlint/cli": "^17.1.2", "@commitlint/config-conventional": "^17.1.0", "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "^8.37.0", + "@eslint/js": "^8.57.0", "@release-it/conventional-changelog": "^4.3.0", - "@types/eslint": "^8.56.2", + "@types/eslint": "^8.56.6", "@types/estree": "^1.0.5", "@typescript-eslint/parser": "^5.62.0", "@typescript-eslint/utils": "^5.62.0", "chai": "^4.3.6", "dirty-chai": "^2.0.1", - "eslint": "^8.23.0", + "eslint": "^8.57.0", "eslint-config-not-an-aardvark": "^2.1.0", "eslint-config-prettier": "^8.5.0", "eslint-doc-generator": "^1.7.0", @@ -78,13 +78,13 @@ "husky": "^8.0.1", "lodash": "^4.17.21", "markdownlint-cli": "^0.39.0", - "mocha": "^10.0.0", - "npm-package-json-lint": "^7.0.0", - "npm-run-all2": "^5.0.0", + "mocha": "^10.4.0", + "npm-package-json-lint": "^7.1.0", + "npm-run-all2": "^6.1.2", "nyc": "^15.1.0", "prettier": "^2.7.1", "release-it": "^14.14.3", - "typescript": "^5.1.3" + "typescript": "^5.4.3" }, "peerDependencies": { "eslint": ">=7.0.0"