From 2d6e11843daf364b05c83f7dc665e5ba2d938290 Mon Sep 17 00:00:00 2001 From: Wayne Zhang Date: Wed, 5 Mar 2025 12:12:24 +0800 Subject: [PATCH 001/178] feat: handle generic parameter types (#2693) --- lib/utils/ts-utils/ts-types.js | 12 ++++++++ tests/lib/rules/require-valid-default-prop.js | 30 +++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/lib/utils/ts-utils/ts-types.js b/lib/utils/ts-utils/ts-types.js index 2fe354c2c..7280c8762 100644 --- a/lib/utils/ts-utils/ts-types.js +++ b/lib/utils/ts-utils/ts-types.js @@ -202,6 +202,18 @@ function inferRuntimeTypeInternal(type, services) { const { checker } = services /** @type {Set} */ const types = new Set() + + // handle generic parameter types + if (type.isTypeParameter()) { + const constraint = type.getConstraint() + if (constraint) { + for (const t of inferRuntimeTypeInternal(constraint, services)) { + types.add(t) + } + } + return [...types] + } + for (const targetType of iterateTypes(checker.getNonNullableType(type))) { if ( isAny(targetType) || diff --git a/tests/lib/rules/require-valid-default-prop.js b/tests/lib/rules/require-valid-default-prop.js index a724d36f7..103b6b7d3 100644 --- a/tests/lib/rules/require-valid-default-prop.js +++ b/tests/lib/rules/require-valid-default-prop.js @@ -222,8 +222,7 @@ ruleTester.run('require-valid-default-prop', rule, { `, languageOptions: { parser: require('@typescript-eslint/parser'), - ecmaVersion: 6, - sourceType: 'module' + ...languageOptions } }, { @@ -332,6 +331,17 @@ ruleTester.run('require-valid-default-prop', rule, { languageOptions: { parser: require('vue-eslint-parser') } + }, + { + // https://github.com/vuejs/eslint-plugin-vue/issues/2692 + filename: 'test.vue', + code: ` + + `, + ...getTypeScriptFixtureTestOptions() } ], @@ -1201,6 +1211,22 @@ ruleTester.run('require-valid-default-prop', rule, { line: 3 } ] + }, + { + filename: 'test.vue', + code: ` + + `, + errors: [ + { + message: "Type of the default value for 'foo' prop must be a string.", + line: 4 + } + ], + ...getTypeScriptFixtureTestOptions() } ] }) From ddfd67651f4dc66f87e88c7cf2cf4fe4eb74b34b Mon Sep 17 00:00:00 2001 From: Wayne Zhang Date: Wed, 5 Mar 2025 12:20:34 +0800 Subject: [PATCH 002/178] feat: add `vue/no-import-compiler-macros` rule (#2684) Co-authored-by: Flo Edelmann --- docs/rules/index.md | 2 + docs/rules/no-import-compiler-macros.md | 54 +++++ lib/index.js | 1 + lib/rules/no-import-compiler-macros.js | 101 ++++++++++ tests/lib/rules/no-import-compiler-macros.js | 201 +++++++++++++++++++ 5 files changed, 359 insertions(+) create mode 100644 docs/rules/no-import-compiler-macros.md create mode 100644 lib/rules/no-import-compiler-macros.js create mode 100644 tests/lib/rules/no-import-compiler-macros.js diff --git a/docs/rules/index.md b/docs/rules/index.md index f170f8031..4fea47058 100644 --- a/docs/rules/index.md +++ b/docs/rules/index.md @@ -233,6 +233,7 @@ For example: | [vue/no-deprecated-model-definition] | disallow deprecated `model` definition (in Vue.js 3.0.0+) | :bulb: | :warning: | | [vue/no-duplicate-attr-inheritance] | enforce `inheritAttrs` to be set to `false` when using `v-bind="$attrs"` | | :hammer: | | [vue/no-empty-component-block] | disallow the ``, errors: [ - '`slot` attributes are deprecated.', - '`slot` attributes are deprecated.' + { + message: '`slot` attributes are deprecated.', + line: 4, + column: 30, + endLine: 4, + endColumn: 34 + }, + { + message: '`slot` attributes are deprecated.', + line: 7, + column: 28, + endLine: 7, + endColumn: 32 + } ] }, { From 1f59ac97f5769653510a5748875a42bb4c19a106 Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Thu, 31 Jul 2025 09:37:07 +0200 Subject: [PATCH 143/178] test(no-deprecated-scope-attribute): make tests more strict (#2879) --- tests/lib/rules/no-deprecated-scope-attribute.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/lib/rules/no-deprecated-scope-attribute.js b/tests/lib/rules/no-deprecated-scope-attribute.js index f823a6878..845447cf6 100644 --- a/tests/lib/rules/no-deprecated-scope-attribute.js +++ b/tests/lib/rules/no-deprecated-scope-attribute.js @@ -66,7 +66,10 @@ tester.run('no-deprecated-scope-attribute', rule, { errors: [ { message: '`scope` attributes are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 26 } ] }, @@ -90,7 +93,10 @@ tester.run('no-deprecated-scope-attribute', rule, { errors: [ { message: '`scope` attributes are deprecated.', - line: 4 + line: 4, + column: 33, + endLine: 4, + endColumn: 38 } ] } From d3498816a35260adc566b103091dbc90e64400d0 Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Thu, 31 Jul 2025 09:40:18 +0200 Subject: [PATCH 144/178] test(no-deprecated-inline-template): make tests more strict (#2877) --- .../rules/no-deprecated-inline-template.js | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/lib/rules/no-deprecated-inline-template.js b/tests/lib/rules/no-deprecated-inline-template.js index fad9c77a7..4c278d5a1 100644 --- a/tests/lib/rules/no-deprecated-inline-template.js +++ b/tests/lib/rules/no-deprecated-inline-template.js @@ -48,12 +48,28 @@ ruleTester.run('no-deprecated-inline-template', rule, { { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 25, + endLine: 1, + endColumn: 40 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 25, + endLine: 1, + endColumn: 40 + } + ] } ] }) From fe5692dcb5ba2b7fede1d5319586ed6edc93c6fb Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Thu, 31 Jul 2025 09:40:42 +0200 Subject: [PATCH 145/178] test(no-deprecated-props-default-this): make tests more strict (#2878) --- .../rules/no-deprecated-props-default-this.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/tests/lib/rules/no-deprecated-props-default-this.js b/tests/lib/rules/no-deprecated-props-default-this.js index b887868d5..ed0b2005d 100644 --- a/tests/lib/rules/no-deprecated-props-default-this.js +++ b/tests/lib/rules/no-deprecated-props-default-this.js @@ -199,8 +199,22 @@ ruleTester.run('no-deprecated-props-default-this', rule, { `, errors: [ - 'Props default value factory functions no longer have access to `this`.', - 'Props default value factory functions no longer have access to `this`.' + { + message: + 'Props default value factory functions no longer have access to `this`.', + line: 9, + column: 24, + endLine: 9, + endColumn: 28 + }, + { + message: + 'Props default value factory functions no longer have access to `this`.', + line: 14, + column: 24, + endLine: 14, + endColumn: 28 + } ] } ] From aca04e5c07c7631b80b6165cb01d834e4fb16975 Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Thu, 31 Jul 2025 09:41:00 +0200 Subject: [PATCH 146/178] test(no-deprecated-dollar-scopedslots-api): make tests more strict (#2872) Co-authored-by: Flo Edelmann --- .../no-deprecated-dollar-scopedslots-api.js | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/tests/lib/rules/no-deprecated-dollar-scopedslots-api.js b/tests/lib/rules/no-deprecated-dollar-scopedslots-api.js index 7dea6146e..c235698f8 100644 --- a/tests/lib/rules/no-deprecated-dollar-scopedslots-api.js +++ b/tests/lib/rules/no-deprecated-dollar-scopedslots-api.js @@ -142,16 +142,16 @@ ruleTester.run('no-deprecated-dollar-scopedslots-api', rule, { `, errors: [ { + messageId: 'deprecated', line: 3, column: 22, - messageId: 'deprecated', endLine: 3, endColumn: 34 }, { + messageId: 'deprecated', line: 8, column: 25, - messageId: 'deprecated', endLine: 8, endColumn: 37 } @@ -191,23 +191,23 @@ ruleTester.run('no-deprecated-dollar-scopedslots-api', rule, { `, errors: [ { + messageId: 'deprecated', line: 3, column: 31, - messageId: 'deprecated', endLine: 3, endColumn: 43 }, { + messageId: 'deprecated', line: 4, column: 22, - messageId: 'deprecated', endLine: 4, endColumn: 34 }, { + messageId: 'deprecated', line: 10, column: 23, - messageId: 'deprecated', endLine: 10, endColumn: 35 } @@ -237,9 +237,11 @@ ruleTester.run('no-deprecated-dollar-scopedslots-api', rule, { `, errors: [ { + messageId: 'deprecated', line: 6, column: 23, - messageId: 'deprecated' + endLine: 6, + endColumn: 35 } ] }, @@ -273,9 +275,11 @@ ruleTester.run('no-deprecated-dollar-scopedslots-api', rule, { `, errors: [ { + messageId: 'deprecated', line: 7, column: 25, - messageId: 'deprecated' + endLine: 7, + endColumn: 37 } ] }, @@ -307,10 +311,18 @@ ruleTester.run('no-deprecated-dollar-scopedslots-api', rule, { `, errors: [ { - messageId: 'deprecated' + messageId: 'deprecated', + line: 6, + column: 27, + endLine: 6, + endColumn: 39 }, { - messageId: 'deprecated' + messageId: 'deprecated', + line: 7, + column: 29, + endLine: 7, + endColumn: 41 } ] } From e0683fd012a9170b359b00ccefd8d85bc615bcea Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Thu, 31 Jul 2025 09:42:51 +0200 Subject: [PATCH 147/178] test(no-deprecated-html-element-is): make tests more strict (#2876) Co-authored-by: Flo Edelmann --- tests/lib/rules/no-deprecated-html-element-is.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/lib/rules/no-deprecated-html-element-is.js b/tests/lib/rules/no-deprecated-html-element-is.js index be8ea3e71..a108f224f 100644 --- a/tests/lib/rules/no-deprecated-html-element-is.js +++ b/tests/lib/rules/no-deprecated-html-element-is.js @@ -43,9 +43,9 @@ ruleTester.run('no-deprecated-html-element-is', rule, { code: '', errors: [ { + messageId: 'unexpected', line: 1, column: 16, - messageId: 'unexpected', endLine: 1, endColumn: 24 } @@ -56,9 +56,11 @@ ruleTester.run('no-deprecated-html-element-is', rule, { code: '', errors: [ { + messageId: 'unexpected', line: 1, column: 16, - messageId: 'unexpected' + endLine: 1, + endColumn: 25 } ] } From 0701213ee766599f4d42c5ef523a209ca116b91f Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Thu, 31 Jul 2025 09:43:12 +0200 Subject: [PATCH 148/178] test(no-deprecated-functional-template): make tests more strict (#2875) Co-authored-by: Flo Edelmann --- tests/lib/rules/no-deprecated-functional-template.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/lib/rules/no-deprecated-functional-template.js b/tests/lib/rules/no-deprecated-functional-template.js index 00cf539ff..fae03fdb7 100644 --- a/tests/lib/rules/no-deprecated-functional-template.js +++ b/tests/lib/rules/no-deprecated-functional-template.js @@ -33,9 +33,9 @@ ruleTester.run('no-deprecated-functional-template', rule, { code: '', errors: [ { + messageId: 'unexpected', line: 1, column: 11, - messageId: 'unexpected', endLine: 1, endColumn: 21 } @@ -46,9 +46,11 @@ ruleTester.run('no-deprecated-functional-template', rule, { code: '', errors: [ { + messageId: 'unexpected', line: 1, column: 11, - messageId: 'unexpected' + endLine: 1, + endColumn: 21 } ] } From 87c7d8315c78868a31368afdc912f52e4a40c1d1 Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Thu, 31 Jul 2025 09:49:02 +0200 Subject: [PATCH 149/178] test(func-call-spacing): remove obsolete compatibility code (#2830) --- tests/lib/rules/func-call-spacing.js | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/tests/lib/rules/func-call-spacing.js b/tests/lib/rules/func-call-spacing.js index 6c219e372..7f06f72fc 100644 --- a/tests/lib/rules/func-call-spacing.js +++ b/tests/lib/rules/func-call-spacing.js @@ -3,8 +3,7 @@ */ 'use strict' -const { RuleTester, ESLint } = require('../../eslint-compat') -const semver = require('semver') +const { RuleTester } = require('../../eslint-compat') const rule = require('../../../lib/rules/func-call-spacing') const tester = new RuleTester({ @@ -61,9 +60,7 @@ tester.run('func-call-spacing', rule, { `, errors: [ { - message: semver.lt(ESLint.version, '7.0.0') - ? 'Unexpected newline between function name and paren.' - : 'Unexpected whitespace between function name and paren.', + message: 'Unexpected whitespace between function name and paren.', line: 3 } ] @@ -104,9 +101,7 @@ tester.run('func-call-spacing', rule, { `, errors: [ { - message: semver.lt(ESLint.version, '7.0.0') - ? 'Unexpected newline between function name and paren.' - : 'Unexpected whitespace between function name and paren.', + message: 'Unexpected whitespace between function name and paren.', line: 4 } ] From 15185f5924978b8db0b8bae8ecaa963874deb0ca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 31 Jul 2025 15:55:14 +0800 Subject: [PATCH 150/178] Version Packages (#2792) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/beige-teams-camp.md | 5 ----- .changeset/early-worlds-reply.md | 5 ----- .changeset/eight-camels-refuse.md | 5 ----- .changeset/strong-masks-fetch.md | 5 ----- .changeset/true-pumas-open.md | 5 ----- CHANGELOG.md | 16 ++++++++++++++++ docs/rules/no-negated-condition.md | 7 +++++-- docs/rules/no-negated-v-if-condition.md | 6 +++++- package.json | 2 +- 9 files changed, 27 insertions(+), 29 deletions(-) delete mode 100644 .changeset/beige-teams-camp.md delete mode 100644 .changeset/early-worlds-reply.md delete mode 100644 .changeset/eight-camels-refuse.md delete mode 100644 .changeset/strong-masks-fetch.md delete mode 100644 .changeset/true-pumas-open.md diff --git a/.changeset/beige-teams-camp.md b/.changeset/beige-teams-camp.md deleted file mode 100644 index 49c2a317b..000000000 --- a/.changeset/beige-teams-camp.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'eslint-plugin-vue': minor ---- - -Added `ignoreParents` option to [`vue/no-deprecated-slot-attribute`](https://eslint.vuejs.org/rules/no-deprecated-slot-attribute.html) diff --git a/.changeset/early-worlds-reply.md b/.changeset/early-worlds-reply.md deleted file mode 100644 index 8a269de33..000000000 --- a/.changeset/early-worlds-reply.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'eslint-plugin-vue': minor ---- - -Added new [`vue/no-negated-v-if-condition`](https://eslint.vuejs.org/rules/no-negated-v-if-condition.html) rule diff --git a/.changeset/eight-camels-refuse.md b/.changeset/eight-camels-refuse.md deleted file mode 100644 index 527b123e4..000000000 --- a/.changeset/eight-camels-refuse.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"eslint-plugin-vue": patch ---- - -Resolved TypeScript compatibility issues introduced by eslint-typegen diff --git a/.changeset/strong-masks-fetch.md b/.changeset/strong-masks-fetch.md deleted file mode 100644 index b7b3b22a0..000000000 --- a/.changeset/strong-masks-fetch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'eslint-plugin-vue': patch ---- - -Fixed inconsistent quotes in [`vue/block-lang`](https://eslint.vuejs.org/rules/block-lang.html) error messages diff --git a/.changeset/true-pumas-open.md b/.changeset/true-pumas-open.md deleted file mode 100644 index 7a49b0f25..000000000 --- a/.changeset/true-pumas-open.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'eslint-plugin-vue': minor ---- - -Added new [`vue/no-negated-condition`](https://eslint.vuejs.org/rules/no-negated-condition.html) rule diff --git a/CHANGELOG.md b/CHANGELOG.md index d48439d99..fa7a29427 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # eslint-plugin-vue +## 10.4.0 + +### Minor Changes + +- Added `ignoreParents` option to [`vue/no-deprecated-slot-attribute`](https://eslint.vuejs.org/rules/no-deprecated-slot-attribute.html) ([#2784](https://github.com/vuejs/eslint-plugin-vue/pull/2784)) + +- Added new [`vue/no-negated-v-if-condition`](https://eslint.vuejs.org/rules/no-negated-v-if-condition.html) rule ([#2794](https://github.com/vuejs/eslint-plugin-vue/pull/2794)) + +- Added new [`vue/no-negated-condition`](https://eslint.vuejs.org/rules/no-negated-condition.html) rule ([#2795](https://github.com/vuejs/eslint-plugin-vue/pull/2795)) + +### Patch Changes + +- Resolved TypeScript compatibility issues introduced by eslint-typegen ([#2790](https://github.com/vuejs/eslint-plugin-vue/pull/2790)) + +- Fixed inconsistent quotes in [`vue/block-lang`](https://eslint.vuejs.org/rules/block-lang.html) error messages ([#2805](https://github.com/vuejs/eslint-plugin-vue/pull/2805)) + ## 10.3.0 ### Minor Changes diff --git a/docs/rules/no-negated-condition.md b/docs/rules/no-negated-condition.md index fa183bee7..17ffdba5d 100644 --- a/docs/rules/no-negated-condition.md +++ b/docs/rules/no-negated-condition.md @@ -3,14 +3,13 @@ pageClass: rule-details sidebarDepth: 0 title: vue/no-negated-condition description: Disallow negated conditions in ``, options: ['first', { exceptions: { ArrowFunctionExpression: false } }] }, - ` - - `, { code: `