From 7abccecccd32347662794402ab1a2e23b03c6c5a Mon Sep 17 00:00:00 2001 From: Conrad Hale Date: Sat, 4 Nov 2023 23:10:23 -0400 Subject: [PATCH 1/6] Add support for generating ESLint Flat Config Signed-off-by: Conrad Hale --- lib/configs/flat/base.js | 24 +++++ lib/configs/flat/essential.js | 73 +++++++++++++++ lib/configs/flat/recommended.js | 17 ++++ lib/configs/flat/strongly-recommended.js | 33 +++++++ lib/configs/flat/vue3-essential.js | 90 +++++++++++++++++++ lib/configs/flat/vue3-recommended.js | 17 ++++ lib/configs/flat/vue3-strongly-recommended.js | 35 ++++++++ lib/index.js | 57 +++++++++--- tools/lib/configs.js | 19 +++- tools/update-lib-configs.js | 68 +++++++++++--- tools/update-lib-index.js | 8 +- 11 files changed, 408 insertions(+), 33 deletions(-) create mode 100644 lib/configs/flat/base.js create mode 100644 lib/configs/flat/essential.js create mode 100644 lib/configs/flat/recommended.js create mode 100644 lib/configs/flat/strongly-recommended.js create mode 100644 lib/configs/flat/vue3-essential.js create mode 100644 lib/configs/flat/vue3-recommended.js create mode 100644 lib/configs/flat/vue3-strongly-recommended.js diff --git a/lib/configs/flat/base.js b/lib/configs/flat/base.js new file mode 100644 index 000000000..eca4a0949 --- /dev/null +++ b/lib/configs/flat/base.js @@ -0,0 +1,24 @@ +/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content execute "npm run update" + */ +const globals = require('globals') +const vueEslintParser = require('vue-eslint-parser') +module.exports = { + languageOptions: { + parser: vueEslintParser, + globals: { + ...globals.browser, + ...globals.es2015 + }, + parserOptions: { + ecmaVersion: 2020, + sourceType: 'module' + } + }, + rules: { + 'vue/comment-directive': 'error', + 'vue/jsx-uses-vars': 'error' + } +} diff --git a/lib/configs/flat/essential.js b/lib/configs/flat/essential.js new file mode 100644 index 000000000..55aa1b92d --- /dev/null +++ b/lib/configs/flat/essential.js @@ -0,0 +1,73 @@ +/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content execute "npm run update" + */ +module.exports = { + ...require('./base'), + rules: { + 'vue/multi-word-component-names': 'error', + 'vue/no-arrow-functions-in-watch': 'error', + 'vue/no-async-in-computed-properties': 'error', + 'vue/no-child-content': 'error', + 'vue/no-computed-properties-in-data': 'error', + 'vue/no-custom-modifiers-on-v-model': 'error', + 'vue/no-dupe-keys': 'error', + 'vue/no-dupe-v-else-if': 'error', + 'vue/no-duplicate-attributes': 'error', + 'vue/no-export-in-script-setup': 'error', + 'vue/no-multiple-template-root': 'error', + 'vue/no-mutating-props': 'error', + 'vue/no-parsing-error': 'error', + 'vue/no-ref-as-operand': 'error', + 'vue/no-reserved-component-names': 'error', + 'vue/no-reserved-keys': 'error', + 'vue/no-reserved-props': [ + 'error', + { + vueVersion: 2 + } + ], + 'vue/no-shared-component-data': 'error', + 'vue/no-side-effects-in-computed-properties': 'error', + 'vue/no-template-key': 'error', + 'vue/no-textarea-mustache': 'error', + 'vue/no-unused-components': 'error', + 'vue/no-unused-vars': 'error', + 'vue/no-use-computed-property-like-method': 'error', + 'vue/no-use-v-if-with-v-for': 'error', + 'vue/no-useless-template-attributes': 'error', + 'vue/no-v-for-template-key': 'error', + 'vue/no-v-model-argument': 'error', + 'vue/no-v-text-v-html-on-component': 'error', + 'vue/require-component-is': 'error', + 'vue/require-prop-type-constructor': 'error', + 'vue/require-render-return': 'error', + 'vue/require-v-for-key': 'error', + 'vue/require-valid-default-prop': 'error', + 'vue/return-in-computed-property': 'error', + 'vue/return-in-emits-validator': 'error', + 'vue/use-v-on-exact': 'error', + 'vue/valid-attribute-name': 'error', + 'vue/valid-define-emits': 'error', + 'vue/valid-define-props': 'error', + 'vue/valid-model-definition': 'error', + 'vue/valid-next-tick': 'error', + 'vue/valid-template-root': 'error', + 'vue/valid-v-bind-sync': 'error', + 'vue/valid-v-bind': 'error', + 'vue/valid-v-cloak': 'error', + 'vue/valid-v-else-if': 'error', + 'vue/valid-v-else': 'error', + 'vue/valid-v-for': 'error', + 'vue/valid-v-html': 'error', + 'vue/valid-v-if': 'error', + 'vue/valid-v-model': 'error', + 'vue/valid-v-on': 'error', + 'vue/valid-v-once': 'error', + 'vue/valid-v-pre': 'error', + 'vue/valid-v-show': 'error', + 'vue/valid-v-slot': 'error', + 'vue/valid-v-text': 'error' + } +} diff --git a/lib/configs/flat/recommended.js b/lib/configs/flat/recommended.js new file mode 100644 index 000000000..ecd7a26bd --- /dev/null +++ b/lib/configs/flat/recommended.js @@ -0,0 +1,17 @@ +/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content execute "npm run update" + */ +module.exports = { + ...require('./strongly-recommended'), + rules: { + 'vue/attributes-order': 'warn', + 'vue/component-tags-order': 'warn', + 'vue/no-lone-template': 'warn', + 'vue/no-multiple-slot-args': 'warn', + 'vue/no-v-html': 'warn', + 'vue/order-in-components': 'warn', + 'vue/this-in-template': 'warn' + } +} diff --git a/lib/configs/flat/strongly-recommended.js b/lib/configs/flat/strongly-recommended.js new file mode 100644 index 000000000..b7b57286f --- /dev/null +++ b/lib/configs/flat/strongly-recommended.js @@ -0,0 +1,33 @@ +/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content execute "npm run update" + */ +module.exports = { + ...require('./essential'), + rules: { + 'vue/attribute-hyphenation': 'warn', + 'vue/component-definition-name-casing': 'warn', + 'vue/first-attribute-linebreak': 'warn', + 'vue/html-closing-bracket-newline': 'warn', + 'vue/html-closing-bracket-spacing': 'warn', + 'vue/html-end-tags': 'warn', + 'vue/html-indent': 'warn', + 'vue/html-quotes': 'warn', + 'vue/html-self-closing': 'warn', + 'vue/max-attributes-per-line': 'warn', + 'vue/multiline-html-element-content-newline': 'warn', + 'vue/mustache-interpolation-spacing': 'warn', + 'vue/no-multi-spaces': 'warn', + 'vue/no-spaces-around-equal-signs-in-attribute': 'warn', + 'vue/no-template-shadow': 'warn', + 'vue/one-component-per-file': 'warn', + 'vue/prop-name-casing': 'warn', + 'vue/require-default-prop': 'warn', + 'vue/require-prop-types': 'warn', + 'vue/singleline-html-element-content-newline': 'warn', + 'vue/v-bind-style': 'warn', + 'vue/v-on-style': 'warn', + 'vue/v-slot-style': 'warn' + } +} diff --git a/lib/configs/flat/vue3-essential.js b/lib/configs/flat/vue3-essential.js new file mode 100644 index 000000000..9c23d0e35 --- /dev/null +++ b/lib/configs/flat/vue3-essential.js @@ -0,0 +1,90 @@ +/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content execute "npm run update" + */ +module.exports = { + ...require('./base'), + rules: { + 'vue/multi-word-component-names': 'error', + 'vue/no-arrow-functions-in-watch': 'error', + 'vue/no-async-in-computed-properties': 'error', + 'vue/no-child-content': 'error', + 'vue/no-computed-properties-in-data': 'error', + 'vue/no-deprecated-data-object-declaration': 'error', + 'vue/no-deprecated-destroyed-lifecycle': 'error', + 'vue/no-deprecated-dollar-listeners-api': 'error', + 'vue/no-deprecated-dollar-scopedslots-api': 'error', + 'vue/no-deprecated-events-api': 'error', + 'vue/no-deprecated-filter': 'error', + 'vue/no-deprecated-functional-template': 'error', + 'vue/no-deprecated-html-element-is': 'error', + 'vue/no-deprecated-inline-template': 'error', + 'vue/no-deprecated-props-default-this': 'error', + 'vue/no-deprecated-router-link-tag-prop': 'error', + 'vue/no-deprecated-scope-attribute': 'error', + 'vue/no-deprecated-slot-attribute': 'error', + 'vue/no-deprecated-slot-scope-attribute': 'error', + 'vue/no-deprecated-v-bind-sync': 'error', + 'vue/no-deprecated-v-is': 'error', + 'vue/no-deprecated-v-on-native-modifier': 'error', + 'vue/no-deprecated-v-on-number-modifiers': 'error', + 'vue/no-deprecated-vue-config-keycodes': 'error', + 'vue/no-dupe-keys': 'error', + 'vue/no-dupe-v-else-if': 'error', + 'vue/no-duplicate-attributes': 'error', + 'vue/no-export-in-script-setup': 'error', + 'vue/no-expose-after-await': 'error', + 'vue/no-lifecycle-after-await': 'error', + 'vue/no-mutating-props': 'error', + 'vue/no-parsing-error': 'error', + 'vue/no-ref-as-operand': 'error', + 'vue/no-reserved-component-names': 'error', + 'vue/no-reserved-keys': 'error', + 'vue/no-reserved-props': 'error', + 'vue/no-shared-component-data': 'error', + 'vue/no-side-effects-in-computed-properties': 'error', + 'vue/no-template-key': 'error', + 'vue/no-textarea-mustache': 'error', + 'vue/no-unused-components': 'error', + 'vue/no-unused-vars': 'error', + 'vue/no-use-computed-property-like-method': 'error', + 'vue/no-use-v-if-with-v-for': 'error', + 'vue/no-useless-template-attributes': 'error', + 'vue/no-v-for-template-key-on-child': 'error', + 'vue/no-v-text-v-html-on-component': 'error', + 'vue/no-watch-after-await': 'error', + 'vue/prefer-import-from-vue': 'error', + 'vue/require-component-is': 'error', + 'vue/require-prop-type-constructor': 'error', + 'vue/require-render-return': 'error', + 'vue/require-slots-as-functions': 'error', + 'vue/require-toggle-inside-transition': 'error', + 'vue/require-v-for-key': 'error', + 'vue/require-valid-default-prop': 'error', + 'vue/return-in-computed-property': 'error', + 'vue/return-in-emits-validator': 'error', + 'vue/use-v-on-exact': 'error', + 'vue/valid-attribute-name': 'error', + 'vue/valid-define-emits': 'error', + 'vue/valid-define-props': 'error', + 'vue/valid-next-tick': 'error', + 'vue/valid-template-root': 'error', + 'vue/valid-v-bind': 'error', + 'vue/valid-v-cloak': 'error', + 'vue/valid-v-else-if': 'error', + 'vue/valid-v-else': 'error', + 'vue/valid-v-for': 'error', + 'vue/valid-v-html': 'error', + 'vue/valid-v-if': 'error', + 'vue/valid-v-is': 'error', + 'vue/valid-v-memo': 'error', + 'vue/valid-v-model': 'error', + 'vue/valid-v-on': 'error', + 'vue/valid-v-once': 'error', + 'vue/valid-v-pre': 'error', + 'vue/valid-v-show': 'error', + 'vue/valid-v-slot': 'error', + 'vue/valid-v-text': 'error' + } +} diff --git a/lib/configs/flat/vue3-recommended.js b/lib/configs/flat/vue3-recommended.js new file mode 100644 index 000000000..9dd951e8b --- /dev/null +++ b/lib/configs/flat/vue3-recommended.js @@ -0,0 +1,17 @@ +/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content execute "npm run update" + */ +module.exports = { + ...require('./vue3-strongly-recommended'), + rules: { + 'vue/attributes-order': 'warn', + 'vue/component-tags-order': 'warn', + 'vue/no-lone-template': 'warn', + 'vue/no-multiple-slot-args': 'warn', + 'vue/no-v-html': 'warn', + 'vue/order-in-components': 'warn', + 'vue/this-in-template': 'warn' + } +} diff --git a/lib/configs/flat/vue3-strongly-recommended.js b/lib/configs/flat/vue3-strongly-recommended.js new file mode 100644 index 000000000..ee417f249 --- /dev/null +++ b/lib/configs/flat/vue3-strongly-recommended.js @@ -0,0 +1,35 @@ +/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content execute "npm run update" + */ +module.exports = { + ...require('./vue3-essential'), + rules: { + 'vue/attribute-hyphenation': 'warn', + 'vue/component-definition-name-casing': 'warn', + 'vue/first-attribute-linebreak': 'warn', + 'vue/html-closing-bracket-newline': 'warn', + 'vue/html-closing-bracket-spacing': 'warn', + 'vue/html-end-tags': 'warn', + 'vue/html-indent': 'warn', + 'vue/html-quotes': 'warn', + 'vue/html-self-closing': 'warn', + 'vue/max-attributes-per-line': 'warn', + 'vue/multiline-html-element-content-newline': 'warn', + 'vue/mustache-interpolation-spacing': 'warn', + 'vue/no-multi-spaces': 'warn', + 'vue/no-spaces-around-equal-signs-in-attribute': 'warn', + 'vue/no-template-shadow': 'warn', + 'vue/one-component-per-file': 'warn', + 'vue/prop-name-casing': 'warn', + 'vue/require-default-prop': 'warn', + 'vue/require-explicit-emits': 'warn', + 'vue/require-prop-types': 'warn', + 'vue/singleline-html-element-content-newline': 'warn', + 'vue/v-bind-style': 'warn', + 'vue/v-on-event-hyphenation': 'warn', + 'vue/v-on-style': 'warn', + 'vue/v-slot-style': 'warn' + } +} diff --git a/lib/index.js b/lib/index.js index edbe34a2c..2a0d3e90c 100644 --- a/lib/index.js +++ b/lib/index.js @@ -5,8 +5,11 @@ */ 'use strict' -module.exports = { +const plugin = { meta: require('./meta'), + processors: { + '.vue': require('./processor') + }, rules: { 'array-bracket-newline': require('./rules/array-bracket-newline'), 'array-bracket-spacing': require('./rules/array-bracket-spacing'), @@ -245,19 +248,7 @@ module.exports = { 'valid-v-slot': require('./rules/valid-v-slot'), 'valid-v-text': require('./rules/valid-v-text') }, - configs: { - base: require('./configs/base'), - essential: require('./configs/essential'), - 'no-layout-rules': require('./configs/no-layout-rules'), - recommended: require('./configs/recommended'), - 'strongly-recommended': require('./configs/strongly-recommended'), - 'vue3-essential': require('./configs/vue3-essential'), - 'vue3-recommended': require('./configs/vue3-recommended'), - 'vue3-strongly-recommended': require('./configs/vue3-strongly-recommended') - }, - processors: { - '.vue': require('./processor') - }, + configs: {}, environments: { // TODO Remove in the next major version /** @deprecated */ @@ -271,3 +262,41 @@ module.exports = { } } } + +plugin.configs = { + base: require('./configs/base'), + essential: require('./configs/essential'), + 'no-layout-rules': require('./configs/no-layout-rules'), + recommended: require('./configs/recommended'), + 'strongly-recommended': require('./configs/strongly-recommended'), + 'vue3-essential': require('./configs/vue3-essential'), + 'vue3-recommended': require('./configs/vue3-recommended'), + 'vue3-strongly-recommended': require('./configs/vue3-strongly-recommended'), + 'flat/base': { plugins: { vue: plugin }, ...require('./configs/flat/base') }, + 'flat/essential': { + plugins: { vue: plugin }, + ...require('./configs/flat/essential') + }, + 'flat/recommended': { + plugins: { vue: plugin }, + ...require('./configs/flat/recommended') + }, + 'flat/strongly-recommended': { + plugins: { vue: plugin }, + ...require('./configs/flat/strongly-recommended') + }, + 'flat/vue3-essential': { + plugins: { vue: plugin }, + ...require('./configs/flat/vue3-essential') + }, + 'flat/vue3-recommended': { + plugins: { vue: plugin }, + ...require('./configs/flat/vue3-recommended') + }, + 'flat/vue3-strongly-recommended': { + plugins: { vue: plugin }, + ...require('./configs/flat/vue3-strongly-recommended') + } +} + +module.exports = plugin diff --git a/tools/lib/configs.js b/tools/lib/configs.js index 031f41e67..52bd67e59 100644 --- a/tools/lib/configs.js +++ b/tools/lib/configs.js @@ -8,8 +8,19 @@ const fs = require('fs') const path = require('path') const ROOT = path.resolve(__dirname, '../../lib/configs') +const FLAT = path.resolve(ROOT, 'flat') -module.exports = fs - .readdirSync(ROOT) - .filter((file) => path.extname(file) === '.js') - .map((file) => path.basename(file, '.js')) +function listConfigs(configDir, flat) { + return fs + .readdirSync(configDir) + .filter((file) => path.extname(file) === '.js') + .map((file) => { + const prefix = flat ? 'flat/' : '' + return prefix + path.basename(file, '.js') + }) +} + +module.exports = { + root: listConfigs(ROOT, false), + flat: listConfigs(FLAT, true) +} diff --git a/tools/update-lib-configs.js b/tools/update-lib-configs.js index b8622e4b0..ed23e6cb2 100644 --- a/tools/update-lib-configs.js +++ b/tools/update-lib-configs.js @@ -47,32 +47,67 @@ function formatRules(rules, categoryId) { return JSON.stringify(obj, null, 2) } -function formatCategory(category) { +function formatCategory(category, flat = false) { const extendsCategoryId = extendsCategories[category.categoryId] if (extendsCategoryId == null) { - return `/* + return flat + ? `/* * IMPORTANT! * This file has been automatically generated, * in order to update its content execute "npm run update" */ +const globals = require('globals') +const vueEslintParser = require('vue-eslint-parser') module.exports = { - parser: require.resolve('vue-eslint-parser'), - parserOptions: { - ecmaVersion: 2020, - sourceType: 'module' + languageOptions: { + parser: vueEslintParser, + globals: { + ...globals.browser, + ...globals.es2015 + }, + parserOptions: { + ecmaVersion: 2020, + sourceType: 'module' + } }, - env: { - browser: true, - es6: true - }, - plugins: [ - 'vue' - ], rules: ${formatRules(category.rules, category.categoryId)} } +` + : `/* +* IMPORTANT! +* This file has been automatically generated, +* in order to update its content execute "npm run update" +*/ +module.exports = { + parser: require.resolve('vue-eslint-parser'), + parserOptions: { + ecmaVersion: 2020, + sourceType: 'module' + }, + env: { + browser: true, + es6: true + }, + plugins: [ + 'vue' + ], + rules: ${formatRules(category.rules, category.categoryId)} +} ` } - return `/* + return flat + ? `/* +* IMPORTANT! +* This file has been automatically generated, +* in order to update its content execute "npm run update" +*/ +const extendedConfig = require('./${extendsCategoryId}') +module.exports = { + extendedConfig, + rules: ${formatRules(category.rules, category.categoryId)} +} +` + : `/* * IMPORTANT! * This file has been automatically generated, * in order to update its content execute "npm run update" @@ -91,6 +126,11 @@ for (const category of categories) { const content = formatCategory(category) fs.writeFileSync(filePath, content) + + const flatFilePath = path.join(ROOT, 'flat', `${category.categoryId}.js`) + const flatContent = formatCategory(category, true) + + fs.writeFileSync(flatFilePath, flatContent) } // Format files. diff --git a/tools/update-lib-index.js b/tools/update-lib-index.js index d12830725..c726417a1 100644 --- a/tools/update-lib-index.js +++ b/tools/update-lib-index.js @@ -32,8 +32,14 @@ module.exports = { .join(',\n')} }, configs: { - ${configs + ${configs.root .map((config) => `'${config}': require('./configs/${config}')`) + .join(',\n')}, + ${configs.flat + .map( + (config) => + `'${config}': { plugins: { vue: module }, ...require('./configs/${config}') }` + ) .join(',\n')} }, processors: { From 580e1763e79d530d19bfeb1556ed09c3c6b9499c Mon Sep 17 00:00:00 2001 From: Flo Edelmann Date: Mon, 4 Dec 2023 19:17:48 +0100 Subject: [PATCH 2/6] Regenerate configs --- lib/configs/flat/essential.js | 3 +- lib/configs/flat/recommended.js | 3 +- lib/configs/flat/strongly-recommended.js | 3 +- lib/configs/flat/vue3-essential.js | 3 +- lib/configs/flat/vue3-recommended.js | 3 +- lib/configs/flat/vue3-strongly-recommended.js | 11 ++- lib/index.js | 85 +++++++++---------- 7 files changed, 61 insertions(+), 50 deletions(-) diff --git a/lib/configs/flat/essential.js b/lib/configs/flat/essential.js index 55aa1b92d..25fc2d50e 100644 --- a/lib/configs/flat/essential.js +++ b/lib/configs/flat/essential.js @@ -3,8 +3,9 @@ * This file has been automatically generated, * in order to update its content execute "npm run update" */ +const extendedConfig = require('./base') module.exports = { - ...require('./base'), + extendedConfig, rules: { 'vue/multi-word-component-names': 'error', 'vue/no-arrow-functions-in-watch': 'error', diff --git a/lib/configs/flat/recommended.js b/lib/configs/flat/recommended.js index ecd7a26bd..282ec0b20 100644 --- a/lib/configs/flat/recommended.js +++ b/lib/configs/flat/recommended.js @@ -3,8 +3,9 @@ * This file has been automatically generated, * in order to update its content execute "npm run update" */ +const extendedConfig = require('./strongly-recommended') module.exports = { - ...require('./strongly-recommended'), + extendedConfig, rules: { 'vue/attributes-order': 'warn', 'vue/component-tags-order': 'warn', diff --git a/lib/configs/flat/strongly-recommended.js b/lib/configs/flat/strongly-recommended.js index b7b57286f..2f1044a49 100644 --- a/lib/configs/flat/strongly-recommended.js +++ b/lib/configs/flat/strongly-recommended.js @@ -3,8 +3,9 @@ * This file has been automatically generated, * in order to update its content execute "npm run update" */ +const extendedConfig = require('./essential') module.exports = { - ...require('./essential'), + extendedConfig, rules: { 'vue/attribute-hyphenation': 'warn', 'vue/component-definition-name-casing': 'warn', diff --git a/lib/configs/flat/vue3-essential.js b/lib/configs/flat/vue3-essential.js index 9c23d0e35..d34008855 100644 --- a/lib/configs/flat/vue3-essential.js +++ b/lib/configs/flat/vue3-essential.js @@ -3,8 +3,9 @@ * This file has been automatically generated, * in order to update its content execute "npm run update" */ +const extendedConfig = require('./base') module.exports = { - ...require('./base'), + extendedConfig, rules: { 'vue/multi-word-component-names': 'error', 'vue/no-arrow-functions-in-watch': 'error', diff --git a/lib/configs/flat/vue3-recommended.js b/lib/configs/flat/vue3-recommended.js index 9dd951e8b..30f443bda 100644 --- a/lib/configs/flat/vue3-recommended.js +++ b/lib/configs/flat/vue3-recommended.js @@ -3,8 +3,9 @@ * This file has been automatically generated, * in order to update its content execute "npm run update" */ +const extendedConfig = require('./vue3-strongly-recommended') module.exports = { - ...require('./vue3-strongly-recommended'), + extendedConfig, rules: { 'vue/attributes-order': 'warn', 'vue/component-tags-order': 'warn', diff --git a/lib/configs/flat/vue3-strongly-recommended.js b/lib/configs/flat/vue3-strongly-recommended.js index ee417f249..6a3e4a1f6 100644 --- a/lib/configs/flat/vue3-strongly-recommended.js +++ b/lib/configs/flat/vue3-strongly-recommended.js @@ -3,8 +3,9 @@ * This file has been automatically generated, * in order to update its content execute "npm run update" */ +const extendedConfig = require('./vue3-essential') module.exports = { - ...require('./vue3-essential'), + extendedConfig, rules: { 'vue/attribute-hyphenation': 'warn', 'vue/component-definition-name-casing': 'warn', @@ -28,7 +29,13 @@ module.exports = { 'vue/require-prop-types': 'warn', 'vue/singleline-html-element-content-newline': 'warn', 'vue/v-bind-style': 'warn', - 'vue/v-on-event-hyphenation': 'warn', + 'vue/v-on-event-hyphenation': [ + 'warn', + 'always', + { + autofix: true + } + ], 'vue/v-on-style': 'warn', 'vue/v-slot-style': 'warn' } diff --git a/lib/index.js b/lib/index.js index 8423cc478..3fec60df4 100644 --- a/lib/index.js +++ b/lib/index.js @@ -5,11 +5,8 @@ */ 'use strict' -const plugin = { +module.exports = { meta: require('./meta'), - processors: { - '.vue': require('./processor') - }, rules: { 'array-bracket-newline': require('./rules/array-bracket-newline'), 'array-bracket-spacing': require('./rules/array-bracket-spacing'), @@ -250,7 +247,47 @@ const plugin = { 'valid-v-slot': require('./rules/valid-v-slot'), 'valid-v-text': require('./rules/valid-v-text') }, - configs: {}, + configs: { + base: require('./configs/base'), + essential: require('./configs/essential'), + 'no-layout-rules': require('./configs/no-layout-rules'), + recommended: require('./configs/recommended'), + 'strongly-recommended': require('./configs/strongly-recommended'), + 'vue3-essential': require('./configs/vue3-essential'), + 'vue3-recommended': require('./configs/vue3-recommended'), + 'vue3-strongly-recommended': require('./configs/vue3-strongly-recommended'), + 'flat/base': { + plugins: { vue: module }, + ...require('./configs/flat/base') + }, + 'flat/essential': { + plugins: { vue: module }, + ...require('./configs/flat/essential') + }, + 'flat/recommended': { + plugins: { vue: module }, + ...require('./configs/flat/recommended') + }, + 'flat/strongly-recommended': { + plugins: { vue: module }, + ...require('./configs/flat/strongly-recommended') + }, + 'flat/vue3-essential': { + plugins: { vue: module }, + ...require('./configs/flat/vue3-essential') + }, + 'flat/vue3-recommended': { + plugins: { vue: module }, + ...require('./configs/flat/vue3-recommended') + }, + 'flat/vue3-strongly-recommended': { + plugins: { vue: module }, + ...require('./configs/flat/vue3-strongly-recommended') + } + }, + processors: { + '.vue': require('./processor') + }, environments: { // TODO Remove in the next major version /** @deprecated */ @@ -264,41 +301,3 @@ const plugin = { } } } - -plugin.configs = { - base: require('./configs/base'), - essential: require('./configs/essential'), - 'no-layout-rules': require('./configs/no-layout-rules'), - recommended: require('./configs/recommended'), - 'strongly-recommended': require('./configs/strongly-recommended'), - 'vue3-essential': require('./configs/vue3-essential'), - 'vue3-recommended': require('./configs/vue3-recommended'), - 'vue3-strongly-recommended': require('./configs/vue3-strongly-recommended'), - 'flat/base': { plugins: { vue: plugin }, ...require('./configs/flat/base') }, - 'flat/essential': { - plugins: { vue: plugin }, - ...require('./configs/flat/essential') - }, - 'flat/recommended': { - plugins: { vue: plugin }, - ...require('./configs/flat/recommended') - }, - 'flat/strongly-recommended': { - plugins: { vue: plugin }, - ...require('./configs/flat/strongly-recommended') - }, - 'flat/vue3-essential': { - plugins: { vue: plugin }, - ...require('./configs/flat/vue3-essential') - }, - 'flat/vue3-recommended': { - plugins: { vue: plugin }, - ...require('./configs/flat/vue3-recommended') - }, - 'flat/vue3-strongly-recommended': { - plugins: { vue: plugin }, - ...require('./configs/flat/vue3-strongly-recommended') - } -} - -module.exports = plugin From 0e6dcb8cde399cfd9804e733f21860cb71d46d26 Mon Sep 17 00:00:00 2001 From: Flo Edelmann Date: Mon, 4 Dec 2023 19:18:21 +0100 Subject: [PATCH 3/6] Simplify function parameters --- tools/lib/configs.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tools/lib/configs.js b/tools/lib/configs.js index 52bd67e59..ff4efe840 100644 --- a/tools/lib/configs.js +++ b/tools/lib/configs.js @@ -10,7 +10,13 @@ const path = require('path') const ROOT = path.resolve(__dirname, '../../lib/configs') const FLAT = path.resolve(ROOT, 'flat') -function listConfigs(configDir, flat) { +/** + * @param {boolean} flat + * @returns {string[]} + */ +function listConfigs(flat) { + const configDir = flat ? FLAT : ROOT + return fs .readdirSync(configDir) .filter((file) => path.extname(file) === '.js') @@ -21,6 +27,6 @@ function listConfigs(configDir, flat) { } module.exports = { - root: listConfigs(ROOT, false), - flat: listConfigs(FLAT, true) + root: listConfigs(false), + flat: listConfigs(true) } From ed384a34cc439e800c66680ac306d20a89489d69 Mon Sep 17 00:00:00 2001 From: Flo Edelmann Date: Mon, 4 Dec 2023 19:22:29 +0100 Subject: [PATCH 4/6] Extract common comment into constant --- tools/update-lib-configs.js | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/tools/update-lib-configs.js b/tools/update-lib-configs.js index ed23e6cb2..e38ffb751 100644 --- a/tools/update-lib-configs.js +++ b/tools/update-lib-configs.js @@ -16,6 +16,12 @@ const categories = require('./lib/categories') const errorCategories = new Set(['base', 'essential', 'vue3-essential']) +const autoGeneratedMessage = `/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content execute "npm run update" + */` + const extendsCategories = { base: null, essential: 'base', @@ -51,11 +57,7 @@ function formatCategory(category, flat = false) { const extendsCategoryId = extendsCategories[category.categoryId] if (extendsCategoryId == null) { return flat - ? `/* - * IMPORTANT! - * This file has been automatically generated, - * in order to update its content execute "npm run update" - */ + ? `${autoGeneratedMessage} const globals = require('globals') const vueEslintParser = require('vue-eslint-parser') module.exports = { @@ -73,11 +75,7 @@ module.exports = { rules: ${formatRules(category.rules, category.categoryId)} } ` - : `/* -* IMPORTANT! -* This file has been automatically generated, -* in order to update its content execute "npm run update" -*/ + : `${autoGeneratedMessage} module.exports = { parser: require.resolve('vue-eslint-parser'), parserOptions: { @@ -96,22 +94,14 @@ module.exports = { ` } return flat - ? `/* -* IMPORTANT! -* This file has been automatically generated, -* in order to update its content execute "npm run update" -*/ + ? `${autoGeneratedMessage} const extendedConfig = require('./${extendsCategoryId}') module.exports = { extendedConfig, rules: ${formatRules(category.rules, category.categoryId)} } ` - : `/* - * IMPORTANT! - * This file has been automatically generated, - * in order to update its content execute "npm run update" - */ + : `${autoGeneratedMessage} module.exports = { extends: require.resolve('./${extendsCategoryId}'), rules: ${formatRules(category.rules, category.categoryId)} From 4a8a6bed28a17ad5be2a427b1f3eeb9de7a5ce1f Mon Sep 17 00:00:00 2001 From: Flo Edelmann Date: Mon, 4 Dec 2023 20:21:11 +0100 Subject: [PATCH 5/6] Fix tests --- tests/lib/configs/configs.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/lib/configs/configs.js b/tests/lib/configs/configs.js index e21d2e455..b8e457377 100644 --- a/tests/lib/configs/configs.js +++ b/tests/lib/configs/configs.js @@ -5,6 +5,10 @@ const plugin = require('../../../lib/index') describe('configs', () => { for (const name of Object.keys(plugin.configs)) { + if (name.startsWith('flat/')) { + continue + } + const configName = `plugin:vue/${name}` const eslint = new ESLint({ overrideConfig: { From 2b3113d6390d99669e27e489691a11ca25680073 Mon Sep 17 00:00:00 2001 From: Flo Edelmann Date: Mon, 4 Dec 2023 20:27:49 +0100 Subject: [PATCH 6/6] Fix indentation --- tools/update-lib-configs.js | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/tools/update-lib-configs.js b/tools/update-lib-configs.js index e38ffb751..e02a9d044 100644 --- a/tools/update-lib-configs.js +++ b/tools/update-lib-configs.js @@ -77,19 +77,19 @@ module.exports = { ` : `${autoGeneratedMessage} module.exports = { - parser: require.resolve('vue-eslint-parser'), - parserOptions: { - ecmaVersion: 2020, - sourceType: 'module' - }, - env: { - browser: true, - es6: true - }, - plugins: [ - 'vue' - ], - rules: ${formatRules(category.rules, category.categoryId)} + parser: require.resolve('vue-eslint-parser'), + parserOptions: { + ecmaVersion: 2020, + sourceType: 'module' + }, + env: { + browser: true, + es6: true + }, + plugins: [ + 'vue' + ], + rules: ${formatRules(category.rules, category.categoryId)} } ` }