From 975a2383cb0cb971e66430592f65e63db333333c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=AF=E7=84=B6?= Date: Fri, 23 Feb 2024 13:43:22 +0800 Subject: [PATCH 01/21] feat: copy configs => flat/* --- lib/configs/flat/base.js | 21 +++++ lib/configs/flat/essential.js | 73 +++++++++++++++ lib/configs/flat/no-layout-rules.js | 57 ++++++++++++ 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 | 41 +++++++++ 8 files changed, 349 insertions(+) create mode 100644 lib/configs/flat/base.js create mode 100644 lib/configs/flat/essential.js create mode 100644 lib/configs/flat/no-layout-rules.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..3724461e2 --- /dev/null +++ b/lib/configs/flat/base.js @@ -0,0 +1,21 @@ +/* + * 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: { + '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..e2c66ceba --- /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 = { + extends: require.resolve('./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/no-layout-rules.js b/lib/configs/flat/no-layout-rules.js new file mode 100644 index 000000000..886f85d53 --- /dev/null +++ b/lib/configs/flat/no-layout-rules.js @@ -0,0 +1,57 @@ +/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content execute "npm run update" + */ +module.exports = { + rules: { + 'vue/array-bracket-newline': 'off', + 'vue/array-bracket-spacing': 'off', + 'vue/array-element-newline': 'off', + 'vue/arrow-spacing': 'off', + 'vue/block-spacing': 'off', + 'vue/block-tag-newline': 'off', + 'vue/brace-style': 'off', + 'vue/comma-dangle': 'off', + 'vue/comma-spacing': 'off', + 'vue/comma-style': 'off', + 'vue/define-macros-order': 'off', + 'vue/dot-location': 'off', + 'vue/first-attribute-linebreak': 'off', + 'vue/func-call-spacing': 'off', + 'vue/html-closing-bracket-newline': 'off', + 'vue/html-closing-bracket-spacing': 'off', + 'vue/html-comment-content-newline': 'off', + 'vue/html-comment-content-spacing': 'off', + 'vue/html-comment-indent': 'off', + 'vue/html-indent': 'off', + 'vue/html-quotes': 'off', + 'vue/html-self-closing': 'off', + 'vue/key-spacing': 'off', + 'vue/keyword-spacing': 'off', + 'vue/max-attributes-per-line': 'off', + 'vue/max-len': 'off', + 'vue/multiline-html-element-content-newline': 'off', + 'vue/multiline-ternary': 'off', + 'vue/mustache-interpolation-spacing': 'off', + 'vue/new-line-between-multi-line-property': 'off', + 'vue/no-extra-parens': 'off', + 'vue/no-multi-spaces': 'off', + 'vue/no-spaces-around-equal-signs-in-attribute': 'off', + 'vue/object-curly-newline': 'off', + 'vue/object-curly-spacing': 'off', + 'vue/object-property-newline': 'off', + 'vue/operator-linebreak': 'off', + 'vue/padding-line-between-blocks': 'off', + 'vue/padding-line-between-tags': 'off', + 'vue/padding-lines-in-component-definition': 'off', + 'vue/quote-props': 'off', + 'vue/script-indent': 'off', + 'vue/singleline-html-element-content-newline': 'off', + 'vue/space-in-parens': 'off', + 'vue/space-infix-ops': 'off', + 'vue/space-unary-ops': 'off', + 'vue/template-curly-spacing': 'off', + 'vue/v-for-delimiter-style': 'off' + } +} diff --git a/lib/configs/flat/recommended.js b/lib/configs/flat/recommended.js new file mode 100644 index 000000000..3db36d8c0 --- /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 = { + extends: require.resolve('./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..02daf9a3c --- /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 = { + extends: require.resolve('./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..f71508f75 --- /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 = { + extends: require.resolve('./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..34b181e29 --- /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 = { + extends: require.resolve('./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..a3f854fc4 --- /dev/null +++ b/lib/configs/flat/vue3-strongly-recommended.js @@ -0,0 +1,41 @@ +/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content execute "npm run update" + */ +module.exports = { + extends: require.resolve('./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', + 'always', + { + autofix: true + } + ], + 'vue/v-on-style': 'warn', + 'vue/v-slot-style': 'warn' + } +} From efab859d0759e1c206e25754618f8133ff8b4c5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=AF=E7=84=B6?= Date: Fri, 23 Feb 2024 13:44:57 +0800 Subject: [PATCH 02/21] feat: rename xxx => vue2-xxx --- lib/configs/flat/{essential.js => vue2-essential.js} | 0 lib/configs/flat/{recommended.js => vue2-recommended.js} | 0 .../{strongly-recommended.js => vue2-strongly-recommended.js} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename lib/configs/flat/{essential.js => vue2-essential.js} (100%) rename lib/configs/flat/{recommended.js => vue2-recommended.js} (100%) rename lib/configs/flat/{strongly-recommended.js => vue2-strongly-recommended.js} (100%) diff --git a/lib/configs/flat/essential.js b/lib/configs/flat/vue2-essential.js similarity index 100% rename from lib/configs/flat/essential.js rename to lib/configs/flat/vue2-essential.js diff --git a/lib/configs/flat/recommended.js b/lib/configs/flat/vue2-recommended.js similarity index 100% rename from lib/configs/flat/recommended.js rename to lib/configs/flat/vue2-recommended.js diff --git a/lib/configs/flat/strongly-recommended.js b/lib/configs/flat/vue2-strongly-recommended.js similarity index 100% rename from lib/configs/flat/strongly-recommended.js rename to lib/configs/flat/vue2-strongly-recommended.js From ed75f860517c8e4098bb02efcc2570b55ea17746 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=AF=E7=84=B6?= Date: Fri, 23 Feb 2024 14:38:41 +0800 Subject: [PATCH 03/21] fix: flat configs --- lib/configs/flat/base.js | 22 +-- lib/configs/flat/no-layout-rules.js | 7 +- lib/configs/flat/vue2-essential.js | 144 +++++++------- lib/configs/flat/vue2-recommended.js | 32 ++-- lib/configs/flat/vue2-strongly-recommended.js | 64 ++++--- lib/configs/flat/vue3-essential.js | 177 +++++++++--------- lib/configs/flat/vue3-recommended.js | 31 +-- lib/configs/flat/vue3-strongly-recommended.js | 79 ++++---- lib/utils/config-helpers.js | 15 ++ package.json | 1 + 10 files changed, 296 insertions(+), 276 deletions(-) create mode 100644 lib/utils/config-helpers.js diff --git a/lib/configs/flat/base.js b/lib/configs/flat/base.js index 3724461e2..c4772b3d5 100644 --- a/lib/configs/flat/base.js +++ b/lib/configs/flat/base.js @@ -1,19 +1,15 @@ -/* - * IMPORTANT! - * This file has been automatically generated, - * in order to update its content execute "npm run update" +/** + * @fileoverview flat config - unlike eslintrc configs, it's not auto generated. + * @author 唯然 */ + +const globals = require('globals') module.exports = { - parser: require.resolve('vue-eslint-parser'), - parserOptions: { - ecmaVersion: 2020, - sourceType: 'module' + languageOptions: { + parser: require('vue-eslint-parser'), + sourceType: 'module', + globals: globals.browser }, - env: { - browser: true, - es6: true - }, - plugins: ['vue'], rules: { 'vue/comment-directive': 'error', 'vue/jsx-uses-vars': 'error' diff --git a/lib/configs/flat/no-layout-rules.js b/lib/configs/flat/no-layout-rules.js index 886f85d53..b723c89bc 100644 --- a/lib/configs/flat/no-layout-rules.js +++ b/lib/configs/flat/no-layout-rules.js @@ -1,7 +1,6 @@ -/* - * IMPORTANT! - * This file has been automatically generated, - * in order to update its content execute "npm run update" +/** + * @fileoverview flat config - unlike eslintrc configs, it's not auto generated. + * @author 唯然 */ module.exports = { rules: { diff --git a/lib/configs/flat/vue2-essential.js b/lib/configs/flat/vue2-essential.js index e2c66ceba..5f6955142 100644 --- a/lib/configs/flat/vue2-essential.js +++ b/lib/configs/flat/vue2-essential.js @@ -1,73 +1,75 @@ -/* - * IMPORTANT! - * This file has been automatically generated, - * in order to update its content execute "npm run update" +/** + * @fileoverview flat config - unlike eslintrc configs, it's not auto generated. + * @author 唯然 */ -module.exports = { - extends: require.resolve('./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' - } + +const config = require('./base.js') +const { extendsRules } = require('../../utils/config-helpers.js') + +const 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' } + +module.exports = extendsRules(config, rules) diff --git a/lib/configs/flat/vue2-recommended.js b/lib/configs/flat/vue2-recommended.js index 3db36d8c0..cecfb4014 100644 --- a/lib/configs/flat/vue2-recommended.js +++ b/lib/configs/flat/vue2-recommended.js @@ -1,17 +1,19 @@ -/* - * IMPORTANT! - * This file has been automatically generated, - * in order to update its content execute "npm run update" +/** + * @fileoverview flat config - unlike eslintrc configs, it's not auto generated. + * @author 唯然 */ -module.exports = { - extends: require.resolve('./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' - } + +const config = require('./vue2-strongly-recommended.js') +const { extendsRules } = require('../../utils/config-helpers.js') + +const 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' } + +module.exports = extendsRules(config, rules) diff --git a/lib/configs/flat/vue2-strongly-recommended.js b/lib/configs/flat/vue2-strongly-recommended.js index 02daf9a3c..ed2437561 100644 --- a/lib/configs/flat/vue2-strongly-recommended.js +++ b/lib/configs/flat/vue2-strongly-recommended.js @@ -1,33 +1,35 @@ -/* - * IMPORTANT! - * This file has been automatically generated, - * in order to update its content execute "npm run update" +/** + * @fileoverview flat config - unlike eslintrc configs, it's not auto generated. + * @author 唯然 */ -module.exports = { - extends: require.resolve('./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' - } + +const config = require('./vue2-essential.js') +const { extendsRules } = require('../../utils/config-helpers.js') + +const 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' } + +module.exports = extendsRules(config, rules) diff --git a/lib/configs/flat/vue3-essential.js b/lib/configs/flat/vue3-essential.js index f71508f75..7f700b08a 100644 --- a/lib/configs/flat/vue3-essential.js +++ b/lib/configs/flat/vue3-essential.js @@ -1,90 +1,91 @@ -/* - * IMPORTANT! - * This file has been automatically generated, - * in order to update its content execute "npm run update" +/** + * @fileoverview flat config - unlike eslintrc configs, it's not auto generated. + * @author 唯然 */ -module.exports = { - extends: require.resolve('./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' - } +const config = require('./base.js') +const { extendsRules } = require('../../utils/config-helpers.js') + +const 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' } + +module.exports = extendsRules(config, rules) diff --git a/lib/configs/flat/vue3-recommended.js b/lib/configs/flat/vue3-recommended.js index 34b181e29..eb8960fce 100644 --- a/lib/configs/flat/vue3-recommended.js +++ b/lib/configs/flat/vue3-recommended.js @@ -1,17 +1,18 @@ -/* - * IMPORTANT! - * This file has been automatically generated, - * in order to update its content execute "npm run update" +/** + * @fileoverview flat config - unlike eslintrc configs, it's not auto generated. + * @author 唯然 */ -module.exports = { - extends: require.resolve('./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' - } + +const config = require('./vue3-strongly-recommended.js') +const { extendsRules } = require('../../utils/config-helpers.js') +const 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' } + +module.exports = extendsRules(config, rules) diff --git a/lib/configs/flat/vue3-strongly-recommended.js b/lib/configs/flat/vue3-strongly-recommended.js index a3f854fc4..e6f931e2f 100644 --- a/lib/configs/flat/vue3-strongly-recommended.js +++ b/lib/configs/flat/vue3-strongly-recommended.js @@ -1,41 +1,42 @@ -/* - * IMPORTANT! - * This file has been automatically generated, - * in order to update its content execute "npm run update" +/** + * @fileoverview flat config - unlike eslintrc configs, it's not auto generated. + * @author 唯然 */ -module.exports = { - extends: require.resolve('./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', - 'always', - { - autofix: true - } - ], - 'vue/v-on-style': 'warn', - 'vue/v-slot-style': 'warn' - } + +const config = require('./vue3-essential.js') +const { extendsRules } = require('../../utils/config-helpers.js') +const 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', + 'always', + { + autofix: true + } + ], + 'vue/v-on-style': 'warn', + 'vue/v-slot-style': 'warn' } + +module.exports = extendsRules(config, rules) diff --git a/lib/utils/config-helpers.js b/lib/utils/config-helpers.js new file mode 100644 index 000000000..5ff40faea --- /dev/null +++ b/lib/utils/config-helpers.js @@ -0,0 +1,15 @@ +/** + * @fileoverview eslint config helpers + * @author 唯然 + */ + +exports.extendsRules = function (config, rules) { + const { rules: extendedRules = {}, ...rest } = config + return { + ...rest, + rules: { + ...extendedRules, + ...rules + } + } +} diff --git a/package.json b/package.json index fcd691b0c..324d3f1bc 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ }, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", + "globals": "^14.0.0", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.15", From 3cef5947dffb655abd50b157258ee2219e569497 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=AF=E7=84=B6?= Date: Fri, 23 Feb 2024 14:44:53 +0800 Subject: [PATCH 04/21] feat: export flat configs --- lib/index.js | 17 ++++++++++++++++- tools/update-lib-index.js | 17 ++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/lib/index.js b/lib/index.js index 99421f248..5ec6b277a 100644 --- a/lib/index.js +++ b/lib/index.js @@ -5,7 +5,7 @@ */ 'use strict' -module.exports = { +const mod = { meta: require('./meta'), rules: { 'array-bracket-newline': require('./rules/array-bracket-newline'), @@ -276,3 +276,18 @@ module.exports = { } } } + +Object.assign(mod.configs, { + 'flat/base': require('./configs/flat/base.js'), + + 'flat/vue2-essential': require('./configs/flat/vue2-essential.js'), + 'flat/vue2-recommended': require('./configs/flat/vue2-recommended.js'), + 'flat/vue2-strongly-recommended': require('./configs/flat/vue2-strongly-recommended.js'), + + // in flat configs, non-prefixed config is for Vue 3 (unlike eslintrc configs) + 'flat/essential': require('./configs/flat/vue3-essential.js'), + 'flat/recommended': require('./configs/flat/vue3-recommended.js'), + 'flat/strongly-recommended': require('./configs/flat/vue3-strongly-recommended.js') +}) + +module.exports = mod diff --git a/tools/update-lib-index.js b/tools/update-lib-index.js index d12830725..a4c39c324 100644 --- a/tools/update-lib-index.js +++ b/tools/update-lib-index.js @@ -24,7 +24,7 @@ const content = `/* */ 'use strict' -module.exports = { +const mod = { meta: require('./meta'), rules: { ${rules @@ -52,6 +52,21 @@ module.exports = { } } } + +Object.assign(mod.configs, { + 'flat/base': require('./configs/flat/base.js'), + + 'flat/vue2-essential': require('./configs/flat/vue2-essential.js'), + 'flat/vue2-recommended': require('./configs/flat/vue2-recommended.js'), + 'flat/vue2-strongly-recommended': require('./configs/flat/vue2-strongly-recommended.js'), + + // in flat configs, non-prefixed config is for Vue 3 (unlike eslintrc configs) + 'flat/essential': require('./configs/flat/vue3-essential.js'), + 'flat/recommended': require('./configs/flat/vue3-recommended.js'), + 'flat/strongly-recommended': require('./configs/flat/vue3-strongly-recommended.js'), +}) + +module.exports = mod ` fs.writeFileSync(filePath, content) From 75961b6783275a5e30cff18ab8f9e66131098805 Mon Sep 17 00:00:00 2001 From: Flo Edelmann Date: Mon, 4 Dec 2023 20:21:11 +0100 Subject: [PATCH 05/21] 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 926fed42c..3c27240ea 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({ overrideConfigFile: true, From 50ff0962820ae985ad2ffc6387ad9ce77bc70e47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=AF=E7=84=B6?= Date: Fri, 23 Feb 2024 15:08:54 +0800 Subject: [PATCH 06/21] fix: export flat configs --- lib/index.js | 34 +++++++++++++++++++++++++++------- tests/lib/configs/configs.js | 3 ++- tools/update-lib-index.js | 16 +++++++++------- 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/lib/index.js b/lib/index.js index 5ec6b277a..27fa315af 100644 --- a/lib/index.js +++ b/lib/index.js @@ -277,17 +277,37 @@ const mod = { } } +const baseConfig = { plugins: { vue: mod } } + Object.assign(mod.configs, { - 'flat/base': require('./configs/flat/base.js'), + 'flat/base': Object.assign(baseConfig, require('./configs/flat/base.js')), - 'flat/vue2-essential': require('./configs/flat/vue2-essential.js'), - 'flat/vue2-recommended': require('./configs/flat/vue2-recommended.js'), - 'flat/vue2-strongly-recommended': require('./configs/flat/vue2-strongly-recommended.js'), + 'flat/vue2-essential': Object.assign( + baseConfig, + require('./configs/flat/vue2-essential.js') + ), + 'flat/vue2-recommended': Object.assign( + baseConfig, + require('./configs/flat/vue2-recommended.js') + ), + 'flat/vue2-strongly-recommended': Object.assign( + baseConfig, + require('./configs/flat/vue2-strongly-recommended.js') + ), // in flat configs, non-prefixed config is for Vue 3 (unlike eslintrc configs) - 'flat/essential': require('./configs/flat/vue3-essential.js'), - 'flat/recommended': require('./configs/flat/vue3-recommended.js'), - 'flat/strongly-recommended': require('./configs/flat/vue3-strongly-recommended.js') + 'flat/essential': Object.assign( + baseConfig, + require('./configs/flat/vue3-essential.js') + ), + 'flat/recommended': Object.assign( + baseConfig, + require('./configs/flat/vue3-recommended.js') + ), + 'flat/strongly-recommended': Object.assign( + baseConfig, + require('./configs/flat/vue3-strongly-recommended.js') + ) }) module.exports = mod diff --git a/tests/lib/configs/configs.js b/tests/lib/configs/configs.js index 3c27240ea..2e7bba65f 100644 --- a/tests/lib/configs/configs.js +++ b/tests/lib/configs/configs.js @@ -3,7 +3,8 @@ const { ESLint } = require('../../eslint-compat') const plugin = require('../../../lib/index') -describe('configs', () => { +// TODO: test flat configs +describe('eslintrc configs', () => { for (const name of Object.keys(plugin.configs)) { if (name.startsWith('flat/')) { continue diff --git a/tools/update-lib-index.js b/tools/update-lib-index.js index a4c39c324..7d21dec74 100644 --- a/tools/update-lib-index.js +++ b/tools/update-lib-index.js @@ -53,17 +53,19 @@ const mod = { } } +const baseConfig = {plugins: {vue: mod}} + Object.assign(mod.configs, { - 'flat/base': require('./configs/flat/base.js'), + 'flat/base': Object.assign(baseConfig, require('./configs/flat/base.js')), - 'flat/vue2-essential': require('./configs/flat/vue2-essential.js'), - 'flat/vue2-recommended': require('./configs/flat/vue2-recommended.js'), - 'flat/vue2-strongly-recommended': require('./configs/flat/vue2-strongly-recommended.js'), + 'flat/vue2-essential': Object.assign(baseConfig, require('./configs/flat/vue2-essential.js')), + 'flat/vue2-recommended': Object.assign(baseConfig, require('./configs/flat/vue2-recommended.js')), + 'flat/vue2-strongly-recommended': Object.assign(baseConfig, require('./configs/flat/vue2-strongly-recommended.js')), // in flat configs, non-prefixed config is for Vue 3 (unlike eslintrc configs) - 'flat/essential': require('./configs/flat/vue3-essential.js'), - 'flat/recommended': require('./configs/flat/vue3-recommended.js'), - 'flat/strongly-recommended': require('./configs/flat/vue3-strongly-recommended.js'), + 'flat/essential': Object.assign(baseConfig, require('./configs/flat/vue3-essential.js')), + 'flat/recommended': Object.assign(baseConfig, require('./configs/flat/vue3-recommended.js')), + 'flat/strongly-recommended': Object.assign(baseConfig, require('./configs/flat/vue3-strongly-recommended.js')), }) module.exports = mod From 815dc430c1158cbee22cf945c1904840136c8c4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=AF=E7=84=B6?= Date: Fri, 23 Feb 2024 15:19:49 +0800 Subject: [PATCH 07/21] fix: back to globals v13 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 324d3f1bc..324c3ba41 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ }, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "globals": "^14.0.0", + "globals": "^13.24.0", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.15", From ca03026e2b1078791e7bb5f9e77207dd74c458c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=AF=E7=84=B6?= Date: Mon, 4 Mar 2024 14:15:12 +0800 Subject: [PATCH 08/21] feat: add auto-gen flat configs --- docs/rules/attribute-hyphenation.md | 2 +- .../rules/component-definition-name-casing.md | 2 +- docs/rules/first-attribute-linebreak.md | 2 +- docs/rules/html-closing-bracket-newline.md | 2 +- docs/rules/html-closing-bracket-spacing.md | 2 +- docs/rules/html-end-tags.md | 2 +- docs/rules/html-indent.md | 2 +- docs/rules/html-quotes.md | 2 +- docs/rules/html-self-closing.md | 2 +- docs/rules/index.md | 170 +++++++++--------- docs/rules/max-attributes-per-line.md | 2 +- docs/rules/multi-word-component-names.md | 2 +- .../multiline-html-element-content-newline.md | 2 +- docs/rules/mustache-interpolation-spacing.md | 2 +- docs/rules/no-arrow-functions-in-watch.md | 2 +- docs/rules/no-async-in-computed-properties.md | 2 +- docs/rules/no-child-content.md | 2 +- docs/rules/no-computed-properties-in-data.md | 2 +- docs/rules/no-custom-modifiers-on-v-model.md | 2 +- docs/rules/no-dupe-keys.md | 2 +- docs/rules/no-dupe-v-else-if.md | 2 +- docs/rules/no-duplicate-attributes.md | 2 +- docs/rules/no-export-in-script-setup.md | 2 +- docs/rules/no-multi-spaces.md | 2 +- docs/rules/no-multiple-template-root.md | 2 +- docs/rules/no-mutating-props.md | 2 +- docs/rules/no-parsing-error.md | 2 +- docs/rules/no-ref-as-operand.md | 2 +- docs/rules/no-reserved-component-names.md | 2 +- docs/rules/no-reserved-keys.md | 2 +- docs/rules/no-reserved-props.md | 2 +- docs/rules/no-shared-component-data.md | 2 +- .../no-side-effects-in-computed-properties.md | 2 +- ...-spaces-around-equal-signs-in-attribute.md | 2 +- docs/rules/no-template-key.md | 2 +- docs/rules/no-template-shadow.md | 2 +- docs/rules/no-textarea-mustache.md | 2 +- docs/rules/no-unused-components.md | 2 +- docs/rules/no-unused-vars.md | 2 +- .../no-use-computed-property-like-method.md | 2 +- docs/rules/no-use-v-if-with-v-for.md | 2 +- docs/rules/no-useless-template-attributes.md | 2 +- docs/rules/no-v-for-template-key.md | 2 +- docs/rules/no-v-model-argument.md | 2 +- docs/rules/no-v-text-v-html-on-component.md | 2 +- docs/rules/one-component-per-file.md | 2 +- docs/rules/prop-name-casing.md | 2 +- docs/rules/require-component-is.md | 2 +- docs/rules/require-default-prop.md | 2 +- docs/rules/require-prop-type-constructor.md | 2 +- docs/rules/require-prop-types.md | 2 +- docs/rules/require-render-return.md | 2 +- docs/rules/require-v-for-key.md | 2 +- docs/rules/require-valid-default-prop.md | 2 +- docs/rules/return-in-computed-property.md | 2 +- docs/rules/return-in-emits-validator.md | 2 +- ...singleline-html-element-content-newline.md | 2 +- docs/rules/use-v-on-exact.md | 2 +- docs/rules/v-bind-style.md | 2 +- docs/rules/v-on-style.md | 2 +- docs/rules/v-slot-style.md | 2 +- docs/rules/valid-attribute-name.md | 2 +- docs/rules/valid-define-emits.md | 2 +- docs/rules/valid-define-props.md | 2 +- docs/rules/valid-model-definition.md | 2 +- docs/rules/valid-next-tick.md | 2 +- docs/rules/valid-template-root.md | 2 +- docs/rules/valid-v-bind-sync.md | 2 +- docs/rules/valid-v-bind.md | 2 +- docs/rules/valid-v-cloak.md | 2 +- docs/rules/valid-v-else-if.md | 2 +- docs/rules/valid-v-else.md | 2 +- docs/rules/valid-v-for.md | 2 +- docs/rules/valid-v-html.md | 2 +- docs/rules/valid-v-if.md | 2 +- docs/rules/valid-v-model.md | 2 +- docs/rules/valid-v-on.md | 2 +- docs/rules/valid-v-once.md | 2 +- docs/rules/valid-v-pre.md | 2 +- docs/rules/valid-v-show.md | 2 +- docs/rules/valid-v-slot.md | 2 +- docs/rules/valid-v-text.md | 2 +- lib/configs/flat/base.js | 8 +- lib/configs/flat/vue2-essential.js | 9 +- lib/configs/flat/vue2-recommended.js | 11 +- lib/configs/flat/vue2-strongly-recommended.js | 11 +- lib/configs/flat/vue3-essential.js | 8 +- lib/configs/flat/vue3-recommended.js | 12 +- lib/configs/flat/vue3-strongly-recommended.js | 12 +- .../{essential.js => vue2-essential.js} | 0 .../{recommended.js => vue2-recommended.js} | 2 +- ...mended.js => vue2-strongly-recommended.js} | 2 +- lib/index.js | 26 +-- lib/rules/attribute-hyphenation.js | 2 +- lib/rules/attributes-order.js | 2 +- lib/rules/component-definition-name-casing.js | 2 +- lib/rules/component-tags-order.js | 2 +- lib/rules/first-attribute-linebreak.js | 2 +- lib/rules/html-closing-bracket-newline.js | 2 +- lib/rules/html-closing-bracket-spacing.js | 2 +- lib/rules/html-end-tags.js | 2 +- lib/rules/html-indent.js | 2 +- lib/rules/html-quotes.js | 2 +- lib/rules/html-self-closing.js | 2 +- lib/rules/max-attributes-per-line.js | 2 +- lib/rules/multi-word-component-names.js | 2 +- .../multiline-html-element-content-newline.js | 2 +- lib/rules/mustache-interpolation-spacing.js | 2 +- lib/rules/no-arrow-functions-in-watch.js | 2 +- lib/rules/no-async-in-computed-properties.js | 2 +- lib/rules/no-child-content.js | 2 +- lib/rules/no-computed-properties-in-data.js | 2 +- lib/rules/no-custom-modifiers-on-v-model.js | 2 +- lib/rules/no-dupe-keys.js | 2 +- lib/rules/no-dupe-v-else-if.js | 2 +- lib/rules/no-duplicate-attributes.js | 2 +- lib/rules/no-export-in-script-setup.js | 2 +- lib/rules/no-lone-template.js | 2 +- lib/rules/no-multi-spaces.js | 2 +- lib/rules/no-multiple-slot-args.js | 2 +- lib/rules/no-multiple-template-root.js | 2 +- lib/rules/no-mutating-props.js | 2 +- lib/rules/no-parsing-error.js | 2 +- lib/rules/no-ref-as-operand.js | 2 +- lib/rules/no-reserved-component-names.js | 2 +- lib/rules/no-reserved-keys.js | 2 +- lib/rules/no-reserved-props.js | 2 +- lib/rules/no-shared-component-data.js | 2 +- .../no-side-effects-in-computed-properties.js | 2 +- ...-spaces-around-equal-signs-in-attribute.js | 2 +- lib/rules/no-template-key.js | 2 +- lib/rules/no-template-shadow.js | 2 +- lib/rules/no-textarea-mustache.js | 2 +- lib/rules/no-unused-components.js | 2 +- lib/rules/no-unused-vars.js | 2 +- .../no-use-computed-property-like-method.js | 2 +- lib/rules/no-use-v-if-with-v-for.js | 2 +- lib/rules/no-useless-template-attributes.js | 2 +- lib/rules/no-v-for-template-key.js | 2 +- lib/rules/no-v-html.js | 2 +- lib/rules/no-v-model-argument.js | 2 +- lib/rules/no-v-text-v-html-on-component.js | 2 +- lib/rules/one-component-per-file.js | 2 +- lib/rules/order-in-components.js | 2 +- lib/rules/prop-name-casing.js | 2 +- lib/rules/require-component-is.js | 2 +- lib/rules/require-default-prop.js | 2 +- lib/rules/require-prop-type-constructor.js | 2 +- lib/rules/require-prop-types.js | 2 +- lib/rules/require-render-return.js | 2 +- lib/rules/require-v-for-key.js | 2 +- lib/rules/require-valid-default-prop.js | 2 +- lib/rules/return-in-computed-property.js | 2 +- lib/rules/return-in-emits-validator.js | 2 +- ...singleline-html-element-content-newline.js | 2 +- lib/rules/this-in-template.js | 2 +- lib/rules/use-v-on-exact.js | 2 +- lib/rules/v-bind-style.js | 2 +- lib/rules/v-on-style.js | 2 +- lib/rules/v-slot-style.js | 2 +- lib/rules/valid-attribute-name.js | 2 +- lib/rules/valid-define-emits.js | 2 +- lib/rules/valid-define-options.js | 2 +- lib/rules/valid-define-props.js | 2 +- lib/rules/valid-model-definition.js | 2 +- lib/rules/valid-next-tick.js | 2 +- lib/rules/valid-template-root.js | 2 +- lib/rules/valid-v-bind-sync.js | 2 +- lib/rules/valid-v-bind.js | 2 +- lib/rules/valid-v-cloak.js | 2 +- lib/rules/valid-v-else-if.js | 2 +- lib/rules/valid-v-else.js | 2 +- lib/rules/valid-v-for.js | 2 +- lib/rules/valid-v-html.js | 2 +- lib/rules/valid-v-if.js | 2 +- lib/rules/valid-v-model.js | 2 +- lib/rules/valid-v-on.js | 2 +- lib/rules/valid-v-once.js | 2 +- lib/rules/valid-v-pre.js | 2 +- lib/rules/valid-v-show.js | 2 +- lib/rules/valid-v-slot.js | 2 +- lib/rules/valid-v-text.js | 2 +- tools/lib/categories.js | 8 +- tools/update-docs.js | 4 +- tools/update-lib-configs.js | 10 +- tools/update-lib-flat-configs.js | 101 +++++++++++ tools/update-lib-index.js | 23 ++- tools/update.js | 1 + 188 files changed, 435 insertions(+), 323 deletions(-) rename lib/configs/{essential.js => vue2-essential.js} (100%) rename lib/configs/{recommended.js => vue2-recommended.js} (87%) rename lib/configs/{strongly-recommended.js => vue2-strongly-recommended.js} (95%) create mode 100644 tools/update-lib-flat-configs.js diff --git a/docs/rules/attribute-hyphenation.md b/docs/rules/attribute-hyphenation.md index 5c2de0027..522f90d89 100644 --- a/docs/rules/attribute-hyphenation.md +++ b/docs/rules/attribute-hyphenation.md @@ -10,7 +10,7 @@ since: v3.9.0 > enforce attribute naming style on custom components in template -- :gear: This rule is included in all of `"plugin:vue/vue3-strongly-recommended"`, `"plugin:vue/strongly-recommended"`, `"plugin:vue/vue3-recommended"` and `"plugin:vue/recommended"`. +- :gear: This rule is included in all of `"plugin:vue/vue3-strongly-recommended"`, `"plugin:vue/strongly-recommended"` and `"plugin:vue/vue3-recommended"`. - :wrench: The `--fix` option on the [command line](https://eslint.org/docs/user-guide/command-line-interface#fixing-problems) can automatically fix some of the problems reported by this rule. ## :book: Rule Details diff --git a/docs/rules/component-definition-name-casing.md b/docs/rules/component-definition-name-casing.md index c650f88b2..3ca0bed62 100644 --- a/docs/rules/component-definition-name-casing.md +++ b/docs/rules/component-definition-name-casing.md @@ -10,7 +10,7 @@ since: v7.0.0 > enforce specific casing for component definition name -- :gear: This rule is included in all of `"plugin:vue/vue3-strongly-recommended"`, `"plugin:vue/strongly-recommended"`, `"plugin:vue/vue3-recommended"` and `"plugin:vue/recommended"`. +- :gear: This rule is included in all of `"plugin:vue/vue3-strongly-recommended"`, `"plugin:vue/strongly-recommended"` and `"plugin:vue/vue3-recommended"`. - :wrench: The `--fix` option on the [command line](https://eslint.org/docs/user-guide/command-line-interface#fixing-problems) can automatically fix some of the problems reported by this rule. Define a style for component definition name casing for consistency purposes. diff --git a/docs/rules/first-attribute-linebreak.md b/docs/rules/first-attribute-linebreak.md index 14f797045..467e72779 100644 --- a/docs/rules/first-attribute-linebreak.md +++ b/docs/rules/first-attribute-linebreak.md @@ -10,7 +10,7 @@ since: v8.0.0 > enforce the location of first attribute -- :gear: This rule is included in all of `"plugin:vue/vue3-strongly-recommended"`, `"plugin:vue/strongly-recommended"`, `"plugin:vue/vue3-recommended"` and `"plugin:vue/recommended"`. +- :gear: This rule is included in all of `"plugin:vue/vue3-strongly-recommended"`, `"plugin:vue/strongly-recommended"` and `"plugin:vue/vue3-recommended"`. - :wrench: The `--fix` option on the [command line](https://eslint.org/docs/user-guide/command-line-interface#fixing-problems) can automatically fix some of the problems reported by this rule. ## :book: Rule Details diff --git a/docs/rules/html-closing-bracket-newline.md b/docs/rules/html-closing-bracket-newline.md index f47d4ac7b..821f25921 100644 --- a/docs/rules/html-closing-bracket-newline.md +++ b/docs/rules/html-closing-bracket-newline.md @@ -10,7 +10,7 @@ since: v4.1.0 > require or disallow a line break before tag's closing brackets -- :gear: This rule is included in all of `"plugin:vue/vue3-strongly-recommended"`, `"plugin:vue/strongly-recommended"`, `"plugin:vue/vue3-recommended"` and `"plugin:vue/recommended"`. +- :gear: This rule is included in all of `"plugin:vue/vue3-strongly-recommended"`, `"plugin:vue/strongly-recommended"` and `"plugin:vue/vue3-recommended"`. - :wrench: The `--fix` option on the [command line](https://eslint.org/docs/user-guide/command-line-interface#fixing-problems) can automatically fix some of the problems reported by this rule. People have their own preference about the location of closing brackets. diff --git a/docs/rules/html-closing-bracket-spacing.md b/docs/rules/html-closing-bracket-spacing.md index 0ab207292..a5699d744 100644 --- a/docs/rules/html-closing-bracket-spacing.md +++ b/docs/rules/html-closing-bracket-spacing.md @@ -10,7 +10,7 @@ since: v4.1.0 > require or disallow a space before tag's closing brackets -- :gear: This rule is included in all of `"plugin:vue/vue3-strongly-recommended"`, `"plugin:vue/strongly-recommended"`, `"plugin:vue/vue3-recommended"` and `"plugin:vue/recommended"`. +- :gear: This rule is included in all of `"plugin:vue/vue3-strongly-recommended"`, `"plugin:vue/strongly-recommended"` and `"plugin:vue/vue3-recommended"`. - :wrench: The `--fix` option on the [command line](https://eslint.org/docs/user-guide/command-line-interface#fixing-problems) can automatically fix some of the problems reported by this rule. ## :book: Rule Details diff --git a/docs/rules/html-end-tags.md b/docs/rules/html-end-tags.md index e0ce57929..90c1c2690 100644 --- a/docs/rules/html-end-tags.md +++ b/docs/rules/html-end-tags.md @@ -10,7 +10,7 @@ since: v3.0.0 > enforce end tag style -- :gear: This rule is included in all of `"plugin:vue/vue3-strongly-recommended"`, `"plugin:vue/strongly-recommended"`, `"plugin:vue/vue3-recommended"` and `"plugin:vue/recommended"`. +- :gear: This rule is included in all of `"plugin:vue/vue3-strongly-recommended"`, `"plugin:vue/strongly-recommended"` and `"plugin:vue/vue3-recommended"`. - :wrench: The `--fix` option on the [command line](https://eslint.org/docs/user-guide/command-line-interface#fixing-problems) can automatically fix some of the problems reported by this rule. ## :book: Rule Details diff --git a/docs/rules/html-indent.md b/docs/rules/html-indent.md index bb8f764fc..5c82738e3 100644 --- a/docs/rules/html-indent.md +++ b/docs/rules/html-indent.md @@ -10,7 +10,7 @@ since: v3.14.0 > enforce consistent indentation in `