From ac74c78ec85edfd8d6fa040130451ebfc388b479 Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Fri, 1 Aug 2025 09:15:21 +0200 Subject: [PATCH 01/29] test(no-deprecated-v-is): make tests more strict (#2885) --- tests/lib/rules/no-deprecated-v-is.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/lib/rules/no-deprecated-v-is.js b/tests/lib/rules/no-deprecated-v-is.js index 8dd07a478..3935c9b39 100644 --- a/tests/lib/rules/no-deprecated-v-is.js +++ b/tests/lib/rules/no-deprecated-v-is.js @@ -25,7 +25,10 @@ tester.run('no-deprecated-v-is', rule, { errors: [ { message: '`v-is` directive is deprecated.', - line: 3 + line: 3, + column: 14, + endLine: 3, + endColumn: 18 } ] } From 17839d8e847fe34246a72e36f81ca09a5f7432cf Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Fri, 1 Aug 2025 09:16:15 +0200 Subject: [PATCH 02/29] test(no-deprecated-v-on-number-modifiers): make tests more strict (#2886) --- .../no-deprecated-v-on-number-modifiers.js | 252 ++++++++++++++++-- 1 file changed, 224 insertions(+), 28 deletions(-) diff --git a/tests/lib/rules/no-deprecated-v-on-number-modifiers.js b/tests/lib/rules/no-deprecated-v-on-number-modifiers.js index 4fd4bfb8e..f039d1162 100644 --- a/tests/lib/rules/no-deprecated-v-on-number-modifiers.js +++ b/tests/lib/rules/no-deprecated-v-on-number-modifiers.js @@ -69,7 +69,14 @@ ruleTester.run('no-deprecated-v-on-number-modifiers', rule, { code: "", output: "", errors: [ - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead." + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 1, + column: 29, + endLine: 1, + endColumn: 31 + } ] }, { @@ -78,7 +85,14 @@ ruleTester.run('no-deprecated-v-on-number-modifiers', rule, { output: "", errors: [ - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead." + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 1, + column: 29, + endLine: 1, + endColumn: 31 + } ] }, { @@ -87,7 +101,14 @@ ruleTester.run('no-deprecated-v-on-number-modifiers', rule, { output: "", errors: [ - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead." + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 1, + column: 37, + endLine: 1, + endColumn: 39 + } ] }, { @@ -96,7 +117,14 @@ ruleTester.run('no-deprecated-v-on-number-modifiers', rule, { output: "", errors: [ - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead." + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 1, + column: 36, + endLine: 1, + endColumn: 38 + } ] }, { @@ -105,7 +133,14 @@ ruleTester.run('no-deprecated-v-on-number-modifiers', rule, { output: "", errors: [ - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead." + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 1, + column: 44, + endLine: 1, + endColumn: 46 + } ] }, { @@ -114,7 +149,14 @@ ruleTester.run('no-deprecated-v-on-number-modifiers', rule, { output: "", errors: [ - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead." + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 1, + column: 36, + endLine: 1, + endColumn: 38 + } ] }, { @@ -122,7 +164,14 @@ ruleTester.run('no-deprecated-v-on-number-modifiers', rule, { code: "", output: "", errors: [ - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead." + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 1, + column: 25, + endLine: 1, + endColumn: 27 + } ] }, { @@ -131,7 +180,14 @@ ruleTester.run('no-deprecated-v-on-number-modifiers', rule, { output: "", errors: [ - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead." + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 1, + column: 25, + endLine: 1, + endColumn: 27 + } ] }, { @@ -140,7 +196,14 @@ ruleTester.run('no-deprecated-v-on-number-modifiers', rule, { output: "", errors: [ - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead." + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 1, + column: 33, + endLine: 1, + endColumn: 35 + } ] }, { @@ -149,7 +212,14 @@ ruleTester.run('no-deprecated-v-on-number-modifiers', rule, { output: "", errors: [ - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead." + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 1, + column: 32, + endLine: 1, + endColumn: 34 + } ] }, { @@ -158,7 +228,14 @@ ruleTester.run('no-deprecated-v-on-number-modifiers', rule, { output: "", errors: [ - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead." + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 1, + column: 40, + endLine: 1, + endColumn: 42 + } ] }, { @@ -167,7 +244,14 @@ ruleTester.run('no-deprecated-v-on-number-modifiers', rule, { output: "", errors: [ - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead." + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 1, + column: 32, + endLine: 1, + endColumn: 34 + } ] }, { @@ -175,7 +259,14 @@ ruleTester.run('no-deprecated-v-on-number-modifiers', rule, { code: "", output: null, errors: [ - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead." + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 1, + column: 25, + endLine: 1, + endColumn: 27 + } ] }, { @@ -183,7 +274,14 @@ ruleTester.run('no-deprecated-v-on-number-modifiers', rule, { code: "", output: null, errors: [ - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead." + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 1, + column: 25, + endLine: 1, + endColumn: 27 + } ] }, { @@ -191,7 +289,14 @@ ruleTester.run('no-deprecated-v-on-number-modifiers', rule, { code: "", output: null, errors: [ - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead." + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 1, + column: 33, + endLine: 1, + endColumn: 35 + } ] }, { @@ -199,7 +304,14 @@ ruleTester.run('no-deprecated-v-on-number-modifiers', rule, { code: "", output: null, errors: [ - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead." + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 1, + column: 40, + endLine: 1, + endColumn: 42 + } ] }, { @@ -216,13 +328,62 @@ ruleTester.run('no-deprecated-v-on-number-modifiers', rule, { `, output: null, errors: [ - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead." + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 3, + column: 25, + endLine: 3, + endColumn: 27 + }, + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 4, + column: 25, + endLine: 4, + endColumn: 27 + }, + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 5, + column: 25, + endLine: 5, + endColumn: 27 + }, + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 6, + column: 25, + endLine: 6, + endColumn: 27 + }, + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 7, + column: 25, + endLine: 7, + endColumn: 27 + }, + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 8, + column: 25, + endLine: 8, + endColumn: 27 + }, + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 9, + column: 25, + endLine: 9, + endColumn: 28 + } ] }, { @@ -244,11 +405,46 @@ ruleTester.run('no-deprecated-v-on-number-modifiers', rule, { `, errors: [ - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", - "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead." + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 3, + column: 25, + endLine: 3, + endColumn: 27 + }, + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 4, + column: 25, + endLine: 4, + endColumn: 27 + }, + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 5, + column: 25, + endLine: 5, + endColumn: 27 + }, + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 6, + column: 25, + endLine: 6, + endColumn: 27 + }, + { + message: + "'KeyboardEvent.keyCode' modifier on 'v-on' directive is deprecated. Using 'KeyboardEvent.key' instead.", + line: 7, + column: 25, + endLine: 7, + endColumn: 27 + } ] } ] From 8d13b3ce0025b98a5affbd6e36f51c254bcc8555 Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Fri, 1 Aug 2025 09:16:43 +0200 Subject: [PATCH 03/29] test(no-deprecated-vue-config-keycodes): make tests more strict (#2887) --- .../no-deprecated-vue-config-keycodes.js | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/lib/rules/no-deprecated-vue-config-keycodes.js b/tests/lib/rules/no-deprecated-vue-config-keycodes.js index ee00e5c37..1a00c1c86 100644 --- a/tests/lib/rules/no-deprecated-vue-config-keycodes.js +++ b/tests/lib/rules/no-deprecated-vue-config-keycodes.js @@ -46,12 +46,28 @@ ruleTester.run('no-deprecated-vue-config-keycodes', rule, { { filename: 'test.js', code: 'Vue?.config?.keyCodes', - errors: ['`Vue.config.keyCodes` are deprecated.'] + errors: [ + { + message: '`Vue.config.keyCodes` are deprecated.', + line: 1, + column: 1, + endLine: 1, + endColumn: 22 + } + ] }, { filename: 'test.js', code: '(Vue?.config)?.keyCodes', - errors: ['`Vue.config.keyCodes` are deprecated.'] + errors: [ + { + message: '`Vue.config.keyCodes` are deprecated.', + line: 1, + column: 1, + endLine: 1, + endColumn: 24 + } + ] } ] }) From ee3955e60ba41f9666e6e165051c1027c2883af6 Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Fri, 1 Aug 2025 09:17:28 +0200 Subject: [PATCH 04/29] test(no-duplicate-attributes): make tests more strict (#2888) --- tests/lib/rules/no-duplicate-attributes.js | 60 +++++++++++++++++++--- 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/tests/lib/rules/no-duplicate-attributes.js b/tests/lib/rules/no-duplicate-attributes.js index ddb82db16..48dedf509 100644 --- a/tests/lib/rules/no-duplicate-attributes.js +++ b/tests/lib/rules/no-duplicate-attributes.js @@ -62,36 +62,84 @@ tester.run('no-duplicate-attributes', rule, { { filename: 'test.vue', code: '', - errors: ["Duplicate attribute 'foo'."] + errors: [ + { + message: "Duplicate attribute 'foo'.", + line: 1, + column: 25, + endLine: 1, + endColumn: 35 + } + ] }, { filename: 'test.vue', code: '', - errors: ["Duplicate attribute 'foo'."] + errors: [ + { + message: "Duplicate attribute 'foo'.", + line: 1, + column: 25, + endLine: 1, + endColumn: 29 + } + ] }, { filename: 'test.vue', code: '', options: [{ allowCoexistStyle: false }], - errors: ["Duplicate attribute 'style'."] + errors: [ + { + message: "Duplicate attribute 'style'.", + line: 1, + column: 27, + endLine: 1, + endColumn: 33 + } + ] }, { filename: 'test.vue', code: '', options: [{ allowCoexistClass: false }], - errors: ["Duplicate attribute 'class'."] + errors: [ + { + message: "Duplicate attribute 'class'.", + line: 1, + column: 27, + endLine: 1, + endColumn: 33 + } + ] }, { filename: 'test.vue', code: '', options: [{ allowCoexistStyle: false }], - errors: ["Duplicate attribute 'style'."] + errors: [ + { + message: "Duplicate attribute 'style'.", + line: 1, + column: 28, + endLine: 1, + endColumn: 33 + } + ] }, { filename: 'test.vue', code: '', options: [{ allowCoexistClass: false }], - errors: ["Duplicate attribute 'class'."] + errors: [ + { + message: "Duplicate attribute 'class'.", + line: 1, + column: 28, + endLine: 1, + endColumn: 33 + } + ] } ] }) From fd6fc411c54e3281d7ac6cd7fe4ed5b3c030d737 Mon Sep 17 00:00:00 2001 From: Flo Edelmann Date: Fri, 1 Aug 2025 09:29:09 +0200 Subject: [PATCH 05/29] Test support for multiple versions of ESLint Stylistic (#2884) --- .changeset/great-ravens-happen.md | 5 +++ .github/workflows/CI.yml | 49 +++++++++++++++++------ package.json | 10 +++-- tests/lib/rules/comma-style.js | 59 ++++++++++++++++++++++++---- tests/lib/rules/func-call-spacing.js | 47 ++++++++++++++++++++-- tests/test-utils/eslint-stylistic.js | 16 ++++++++ 6 files changed, 162 insertions(+), 24 deletions(-) create mode 100644 .changeset/great-ravens-happen.md create mode 100644 tests/test-utils/eslint-stylistic.js diff --git a/.changeset/great-ravens-happen.md b/.changeset/great-ravens-happen.md new file mode 100644 index 000000000..eea070fd5 --- /dev/null +++ b/.changeset/great-ravens-happen.md @@ -0,0 +1,5 @@ +--- +"eslint-plugin-vue": minor +--- + +Added [`@stylistic/eslint-plugin`](https://eslint.style/) as optional peer dependency diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 90bd33ad5..fede1a47a 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -31,12 +31,6 @@ jobs: strategy: matrix: node: [18, 20, 21, 'lts/*'] - eslint: [9] - include: - # On old ESLint version - - node: 18 - eslint: 8 - runs-on: ubuntu-latest steps: - name: Checkout @@ -47,8 +41,23 @@ jobs: node-version: ${{ matrix.node }} - name: Install Packages run: npm install - - name: Install ESLint v${{ matrix.eslint }} - run: npm install --save-dev eslint@${{ matrix.eslint }} -f + - name: Test + run: npm test + + test-with-eslint-v8: + name: Test with ESLint v8 + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install Node.js v18 + uses: actions/setup-node@v4 + with: + node-version: 18 + - name: Install Packages + run: npm install + - name: Install ESLint v8 + run: npm install --save-dev eslint@8 --force - name: Test run: npm test @@ -63,7 +72,25 @@ jobs: - name: Install Packages run: npm install - name: Uninstall @stylistic/eslint-plugin - run: npm uninstall -D @stylistic/eslint-plugin + run: npm uninstall @stylistic/eslint-plugin + - name: Test + run: npm test + + test-with-old-eslint-stylistic: + name: Test with old ESLint Stylistic + strategy: + matrix: + stylistic: [2, 3, 4] + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install Node.js + uses: actions/setup-node@v4 + - name: Install Packages + run: npm install + - name: Install @stylistic/eslint-plugin v${{ matrix.stylistic }} + run: npm install -D @stylistic/eslint-plugin@${{ matrix.stylistic }} --force - name: Test run: npm test @@ -77,7 +104,7 @@ jobs: uses: actions/setup-node@v4 - name: Install Packages run: npm install - - name: Install @typescript-eslint/parser@7 - run: npm install -D @typescript-eslint/parser@7 -f + - name: Install @typescript-eslint/parser v7 + run: npm install -D @typescript-eslint/parser@7 --force - name: Test run: npm test diff --git a/package.json b/package.json index 404e07f32..5266cc3b6 100644 --- a/package.json +++ b/package.json @@ -58,11 +58,15 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { + "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", - "vue-eslint-parser": "^10.0.0", - "@typescript-eslint/parser": "^7.0.0 || ^8.0.0" + "vue-eslint-parser": "^10.0.0" }, "peerDependenciesMeta": { + "@stylistic/eslint-plugin": { + "optional": true + }, "@typescript-eslint/parser": { "optional": true } @@ -78,7 +82,7 @@ "devDependencies": { "@changesets/cli": "^2.29.2", "@ota-meshi/site-kit-eslint-editor-vue": "^0.2.4", - "@stylistic/eslint-plugin": "^2.12.1", + "@stylistic/eslint-plugin": "^5.2.2", "@svitejs/changesets-changelog-github-compact": "^1.2.0", "@types/eslint": "^8.56.2", "@types/natural-compare": "^1.4.3", diff --git a/tests/lib/rules/comma-style.js b/tests/lib/rules/comma-style.js index 82c8e4044..e41ba9b44 100644 --- a/tests/lib/rules/comma-style.js +++ b/tests/lib/rules/comma-style.js @@ -3,8 +3,10 @@ */ 'use strict' +const semver = require('semver') const { RuleTester } = require('../../eslint-compat') const rule = require('../../../lib/rules/comma-style') +const { eslintStylisticVersion } = require('../../test-utils/eslint-stylistic') const tester = new RuleTester({ languageOptions: { parser: require('vue-eslint-parser'), ecmaVersion: 2018 } @@ -34,13 +36,6 @@ tester.run('comma-style', rule, { `, options: ['first', { exceptions: { ArrowFunctionExpression: false } }] }, - ` - - `, { code: `