diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 000000000..e5b6d8d6a --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 000000000..43b72b358 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://unpkg.com/@changesets/config/schema.json", + "changelog": [ + "@svitejs/changesets-changelog-github-compact", + { + "repo": "vuejs/eslint-plugin-vue" + } + ], + "commit": false, + "linked": [], + "access": "public", + "baseBranch": "master", + "bumpVersionsWithWorkspaceProtocolOnly": true, + "ignore": [] +} diff --git a/.changeset/fast-monkeys-smoke.md b/.changeset/fast-monkeys-smoke.md new file mode 100644 index 000000000..676d9d23c --- /dev/null +++ b/.changeset/fast-monkeys-smoke.md @@ -0,0 +1,5 @@ +--- +"eslint-plugin-vue": minor +--- + +Added new `vue/no-undef-directives` rule diff --git a/.changeset/gorgeous-colts-bathe.md b/.changeset/gorgeous-colts-bathe.md new file mode 100644 index 000000000..e5f3a14a8 --- /dev/null +++ b/.changeset/gorgeous-colts-bathe.md @@ -0,0 +1,5 @@ +--- +"eslint-plugin-vue": patch +--- + +Updates resources diff --git a/.changeset/rich-zebras-type.md b/.changeset/rich-zebras-type.md new file mode 100644 index 000000000..62c2438ae --- /dev/null +++ b/.changeset/rich-zebras-type.md @@ -0,0 +1,5 @@ +--- +"eslint-plugin-vue": minor +--- + +Changed `vue/no-negated-v-if-condition` suggestion to autofix diff --git a/.changeset/swift-spies-nail.md b/.changeset/swift-spies-nail.md new file mode 100644 index 000000000..6d8ffe174 --- /dev/null +++ b/.changeset/swift-spies-nail.md @@ -0,0 +1,5 @@ +--- +"eslint-plugin-vue": minor +--- + +Added new `ignoreEOLComments` option to `vue/no-multi-spaces` rule diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 57aa5876d..69cac752d 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -18,9 +18,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 - name: Install Packages run: npm install --legacy-peer-deps - name: Lint @@ -31,24 +31,33 @@ 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 - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install Node.js v${{ matrix.node }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node }} - name: Install Packages - run: npm install -f - - name: Install ESLint v${{ matrix.eslint }} - run: npm install --save-dev eslint@${{ matrix.eslint }} -f + run: npm install + - name: Test + run: npm test + + test-with-eslint-v8: + name: Test with ESLint v8 + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + - name: Install Node.js v18 + uses: actions/setup-node@v6 + 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 @@ -57,12 +66,45 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 - name: Install Packages - run: npm install -f + 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@v5 + - name: Install Node.js + uses: actions/setup-node@v6 + - 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 + + test-with-typescript-eslint-v7: + name: Test with typescript-eslint v7 + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + - name: Install Node.js + uses: actions/setup-node@v6 + - name: Install Packages + run: npm install + - name: Install @typescript-eslint/parser v7 + run: npm install -D @typescript-eslint/parser@7 --force - name: Test run: npm test diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml new file mode 100644 index 000000000..feb5a19e5 --- /dev/null +++ b/.github/workflows/Release.yml @@ -0,0 +1,37 @@ +name: Release + +on: + push: + branches: + - master + +permissions: {} + +jobs: + release: + # prevents this action from running on forks + if: github.repository == 'vuejs/eslint-plugin-vue' + permissions: + contents: write # to create release (changesets/action) + pull-requests: write # to create pull request (changesets/action) + id-token: write # OpenID Connect token needed for Trusted Publisher + name: Release + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v5 + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: 24 + - name: Install Dependencies + run: npm install + + - name: Create Release Pull Request or Publish to npm + id: changesets + uses: changesets/action@v1 + with: + version: npm run changeset:version + publish: npm run changeset:publish + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/check-for-resources-update.yml b/.github/workflows/check-for-resources-update.yml index 613125fc3..362ca48cc 100644 --- a/.github/workflows/check-for-resources-update.yml +++ b/.github/workflows/check-for-resources-update.yml @@ -5,17 +5,18 @@ on: - cron: 0 0 * * 0 # At 00:00 on Sunday, see https://crontab.guru/#0_0_*_*_0 permissions: - contents: write - pull-requests: write + contents: write + pull-requests: write jobs: check-for-resources-update: runs-on: ubuntu-latest + if: ${{ github.repository == 'vuejs/eslint-plugin-vue' }} steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: 18 - name: Install Packages diff --git a/.gitignore b/.gitignore index 797d0cbcd..d6fadf92c 100644 --- a/.gitignore +++ b/.gitignore @@ -8,8 +8,9 @@ yarn.lock yarn-error.log /docs/.vitepress/dist -/docs/.vitepress/build-system/shim/eslint.mjs -/docs/.vitepress/build-system/shim/assert.mjs +/docs/.vitepress/build-system/shim/vue-eslint-parser.mjs +/docs/.vitepress/build-system/shim/@typescript-eslint/parser.mjs /docs/.vitepress/.temp /docs/.vitepress/cache typings/eslint/lib/rules +eslint-typegen.d.ts diff --git a/.markdownlintignore b/.markdownlintignore index 3c3629e64..e7becf85b 100644 --- a/.markdownlintignore +++ b/.markdownlintignore @@ -1 +1,2 @@ node_modules +CHANGELOG.md diff --git a/.vscode/launch.json b/.vscode/launch.json index 2fa4db9b2..997cf0bca 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,8 +5,16 @@ "type": "node", "request": "launch", "name": "Start testing", - "program": "${workspaceFolder}/node_modules/.bin/mocha", - "args": ["${file}", "--watch"], + "program": "${workspaceFolder}/node_modules/.bin/vitest", + "args": ["run", "${file}", "--reporter=verbose"], + "console": "integratedTerminal" + }, + { + "type": "node", + "request": "launch", + "name": "Start testing (watch)", + "program": "${workspaceFolder}/node_modules/.bin/vitest", + "args": ["${file}", "--reporter=verbose"], "console": "integratedTerminal" } ] diff --git a/.vscode/settings.json b/.vscode/settings.json index f80681b66..20102543c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,13 @@ { "editor.tabSize": 2, - "eslint.experimental.useFlatConfig": true, - "eslint.validate": ["javascript", "javascriptreact", "vue", "json", "jsonc"], + "eslint.validate": [ + "javascript", + "javascriptreact", + "vue", + "json", + "jsonc", + "markdown" + ], "typescript.tsdk": "./node_modules/typescript/lib", "vetur.validation.script": false, "[typescript]": { diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..4bbb44fa6 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,87 @@ +# eslint-plugin-vue + +## 10.6.2 + +### Patch Changes + +- Fixed false positives in non-intersecting conditions in [`vue/no-duplicate-class-names`](https://eslint.vuejs.org/rules/no-duplicate-class-names.html) and correctly detect duplicates in combining expressions ([#2980](https://github.com/vuejs/eslint-plugin-vue/pull/2980)) +- Fixed false positives for `TSImportType` in [`vue/script-indent`](https://eslint.vuejs.org/rules/script-indent.html) rule ([#2969](https://github.com/vuejs/eslint-plugin-vue/pull/2969)) +- Improved performance and type safety in [`vue/prefer-use-template-ref`](https://eslint.vuejs.org/rules/prefer-use-template-ref.html) ([#2982](https://github.com/vuejs/eslint-plugin-vue/pull/2982)) + +## 10.6.1 + +### Patch Changes + +- Fixed false positives for comments outside ``, errors: [ - 'Expected 1 line break before closing tag (``), but no line breaks found.' + { + message: + 'Expected 1 line break before closing tag (``), but no line breaks found.', + line: 4, + column: 30, + endLine: 4, + endColumn: 30 + } ] }, // comments @@ -437,8 +463,22 @@ multiline content `, errors: [ - 'Expected 1 line break after opening tag (`
`), but no line breaks found.', - 'Expected 1 line break before closing tag (`
`), but no line breaks found.' + { + message: + 'Expected 1 line break after opening tag (`
`), but no line breaks found.', + line: 3, + column: 16, + endLine: 3, + endColumn: 16 + }, + { + message: + 'Expected 1 line break before closing tag (`
`), but no line breaks found.', + line: 4, + column: 25, + endLine: 4, + endColumn: 25 + } ] }, { @@ -457,8 +497,22 @@ multiline content `, errors: [ - 'Expected 1 line break after opening tag (`
`), but no line breaks found.', - 'Expected 1 line break before closing tag (`
`), but no line breaks found.' + { + message: + 'Expected 1 line break after opening tag (`
`), but no line breaks found.', + line: 3, + column: 16, + endLine: 3, + endColumn: 16 + }, + { + message: + 'Expected 1 line break before closing tag (`
`), but no line breaks found.', + line: 4, + column: 23, + endLine: 4, + endColumn: 23 + } ] }, // one error @@ -479,7 +533,14 @@ content `, errors: [ - 'Expected 1 line break after opening tag (`
`), but no line breaks found.' + { + message: + 'Expected 1 line break after opening tag (`
`), but no line breaks found.', + line: 3, + column: 16, + endLine: 3, + endColumn: 16 + } ] }, { @@ -499,7 +560,14 @@ content `, errors: [ - 'Expected 1 line break before closing tag (`
`), but no line breaks found.' + { + message: + 'Expected 1 line break before closing tag (`
`), but no line breaks found.', + line: 5, + column: 18, + endLine: 5, + endColumn: 18 + } ] }, // multi @@ -519,12 +587,54 @@ content `, errors: [ - 'Expected 1 line break after opening tag (``), but no line breaks found.' + { + message: + 'Expected 1 line break after opening tag (``), but no line breaks found.', + line: 3, + column: 35, + endLine: 3, + endColumn: 35 + } ] }, // multi line breaks @@ -548,8 +658,22 @@ content `, errors: [ - 'Expected 1 line break after opening tag (`
`), but 2 line breaks found.', - 'Expected 1 line break before closing tag (`
`), but 2 line breaks found.' + { + message: + 'Expected 1 line break after opening tag (`
`), but 2 line breaks found.', + line: 3, + column: 16, + endLine: 5, + endColumn: 13 + }, + { + message: + 'Expected 1 line break before closing tag (`
`), but 2 line breaks found.', + line: 6, + column: 20, + endLine: 8, + endColumn: 11 + } ] }, // allowEmptyLines @@ -575,7 +699,14 @@ content `, options: [{ allowEmptyLines: true, ignoreWhenEmpty: false }], errors: [ - 'Expected 1 line break after opening tag (`
`), but no line breaks found.' + { + message: + 'Expected 1 line break after opening tag (`
`), but no line breaks found.', + line: 8, + column: 27, + endLine: 8, + endColumn: 27 + } ] }, { @@ -607,8 +738,22 @@ content `, options: [{ allowEmptyLines: true }], errors: [ - 'Expected 1 line break after opening tag (`
`), but no line breaks found.', - 'Expected 1 line break before closing tag (`
`), but no line breaks found.' + { + message: + 'Expected 1 line break after opening tag (`
`), but no line breaks found.', + line: 9, + column: 16, + endLine: 9, + endColumn: 16 + }, + { + message: + 'Expected 1 line break before closing tag (`
`), but no line breaks found.', + line: 10, + column: 20, + endLine: 10, + endColumn: 20 + } ] }, // mustache @@ -628,8 +773,22 @@ content `, errors: [ - 'Expected 1 line break after opening tag (`
`), but no line breaks found.', - 'Expected 1 line break before closing tag (`
`), but no line breaks found.' + { + message: + 'Expected 1 line break after opening tag (`
`), but no line breaks found.', + line: 3, + column: 16, + endLine: 3, + endColumn: 16 + }, + { + message: + 'Expected 1 line break before closing tag (`
`), but no line breaks found.', + line: 4, + column: 23, + endLine: 4, + endColumn: 23 + } ] }, // mix @@ -651,8 +810,22 @@ content `, errors: [ - 'Expected 1 line break after opening tag (`
`), but no line breaks found.', - 'Expected 1 line break before closing tag (`
`), but no line breaks found.' + { + message: + 'Expected 1 line break after opening tag (`
`), but no line breaks found.', + line: 3, + column: 16, + endLine: 3, + endColumn: 16 + }, + { + message: + 'Expected 1 line break before closing tag (`
`), but no line breaks found.', + line: 5, + column: 27, + endLine: 5, + endColumn: 27 + } ] }, // start tag @@ -672,8 +845,22 @@ content `, errors: [ - 'Expected 1 line break after opening tag (`
`), but no line breaks found.', - 'Expected 1 line break before closing tag (`
`), but no line breaks found.' + { + message: + 'Expected 1 line break after opening tag (`
`), but no line breaks found.', + line: 4, + column: 14, + endLine: 4, + endColumn: 14 + }, + { + message: + 'Expected 1 line break before closing tag (`
`), but no line breaks found.', + line: 4, + column: 21, + endLine: 4, + endColumn: 21 + } ] }, { @@ -692,8 +879,22 @@ content `, errors: [ - 'Expected 1 line break after opening tag (`
`), but no line breaks found.', - 'Expected 1 line break before closing tag (`
`), but no line breaks found.' + { + message: + 'Expected 1 line break after opening tag (`
`), but no line breaks found.', + line: 4, + column: 18, + endLine: 4, + endColumn: 18 + }, + { + message: + 'Expected 1 line break before closing tag (`
`), but no line breaks found.', + line: 4, + column: 25, + endLine: 4, + endColumn: 25 + } ] }, { @@ -712,7 +913,14 @@ content `, options: [{ ignoreWhenEmpty: false }], errors: [ - 'Expected 1 line break after opening tag (`
`), but no line breaks found.' + { + message: + 'Expected 1 line break after opening tag (`
`), but no line breaks found.', + line: 4, + column: 14, + endLine: 4, + endColumn: 14 + } ] } ] diff --git a/tests/lib/rules/multiline-ternary.js b/tests/lib/rules/multiline-ternary.js index 87e3fe485..118cf6353 100644 --- a/tests/lib/rules/multiline-ternary.js +++ b/tests/lib/rules/multiline-ternary.js @@ -4,9 +4,8 @@ */ 'use strict' -const { RuleTester, ESLint } = require('../../eslint-compat') +const { RuleTester } = require('../../eslint-compat') const rule = require('../../../lib/rules/multiline-ternary') -const semver = require('semver') const tester = new RuleTester({ languageOptions: { @@ -80,8 +79,7 @@ tester.run('multiline-ternary', rule, {
`, - output: semver.gte(ESLint.version, '7.1.0') - ? ` + output: ` - ` - : null, + `, options: ['always-multiline'], errors: [ { message: 'Expected newline between consequent and alternate of ternary expression.', line: 5, - column: 15 + column: 15, + endLine: 5, + endColumn: 30 } ] }, @@ -113,23 +112,23 @@ tester.run('multiline-ternary', rule, {
`, - output: semver.gte(ESLint.version, '7.1.0') - ? ` + output: ` - ` - : null, + `, options: ['never'], errors: [ { message: 'Unexpected newline between test and consequent of ternary expression.', line: 4, - column: 21 + column: 21, + endLine: 4, + endColumn: 44 } ] }, @@ -143,8 +142,7 @@ tester.run('multiline-ternary', rule, {
`, - output: semver.gte(ESLint.version, '7.1.0') - ? ` + output: ` - ` - : null, + `, errors: [ { message: 'Expected newline between test and consequent of ternary expression.', line: 4, - column: 21 + column: 21, + endLine: 4, + endColumn: 44 }, { message: 'Expected newline between consequent and alternate of ternary expression.', line: 4, - column: 47 + column: 47, + endLine: 4, + endColumn: 62 } ] }, @@ -180,8 +181,7 @@ tester.run('multiline-ternary', rule, {
`, - output: semver.gte(ESLint.version, '7.1.0') - ? ` + output: ` - ` - : null, + `, errors: [ { message: 'Expected newline between test and consequent of ternary expression.', line: 4, - column: 21 + column: 21, + endLine: 4, + endColumn: 44 }, { message: 'Expected newline between consequent and alternate of ternary expression.', line: 4, - column: 47 + column: 47, + endLine: 4, + endColumn: 62 } ] }, @@ -220,8 +223,7 @@ tester.run('multiline-ternary', rule, { } `, - output: semver.gte(ESLint.version, '7.1.0') - ? ` + output: ` `, options: [{ allowlist: ['@@'] }] + }, + // regex + { + code: ` + + `, + options: [{ allowlist: [String.raw`/\d+/g`] }] + }, + { + code: ` + + `, + options: [{ allowlist: [String.raw`/\$\w+/`] }] + }, + { + code: ` + + `, + options: [{ allowlist: [String.raw`/\d+/`, 'foo'] }] } ], invalid: [ @@ -316,6 +342,40 @@ tester.run('no-bare-strings-in-template', rule, { endColumn: 34 } ] + }, + { + code: ` + + `, + options: [{ allowlist: [String.raw`/^\d+$/g`] }], + errors: [ + { + messageId: 'unexpected', + line: 3, + column: 13, + endLine: 3, + endColumn: 37 + } + ] + }, + { + code: ` + + `, + options: [{ allowlist: [String.raw`/\d+/`, 'foo'] }], + errors: [ + { + messageId: 'unexpected', + line: 3, + column: 13, + endLine: 3, + endColumn: 22 + } + ] } ] }) diff --git a/tests/lib/rules/no-boolean-default.js b/tests/lib/rules/no-boolean-default.js index 98524760c..56e9cd1cc 100644 --- a/tests/lib/rules/no-boolean-default.js +++ b/tests/lib/rules/no-boolean-default.js @@ -4,7 +4,6 @@ */ 'use strict' -const semver = require('semver') const rule = require('../../../lib/rules/no-boolean-default') const RuleTester = require('../../eslint-compat').RuleTester @@ -358,7 +357,10 @@ ruleTester.run('no-boolean-default', rule, { errors: [ { message: 'Boolean prop should only be defaulted to false.', - line: 6 + line: 6, + column: 24, + endLine: 6, + endColumn: 28 } ] }, @@ -378,7 +380,10 @@ ruleTester.run('no-boolean-default', rule, { errors: [ { message: 'Boolean prop should only be defaulted to false.', - line: 6 + line: 6, + column: 24, + endLine: 6, + endColumn: 28 } ] }, @@ -399,7 +404,10 @@ ruleTester.run('no-boolean-default', rule, { { message: 'Boolean prop should not set a default (Vue defaults it to false).', - line: 6 + line: 6, + column: 24, + endLine: 6, + endColumn: 29 } ] }, @@ -420,7 +428,10 @@ ruleTester.run('no-boolean-default', rule, { { message: 'Boolean prop should not set a default (Vue defaults it to false).', - line: 6 + line: 6, + column: 24, + endLine: 6, + endColumn: 28 } ] }, @@ -441,7 +452,10 @@ ruleTester.run('no-boolean-default', rule, { { message: 'Boolean prop should not set a default (Vue defaults it to false).', - line: 6 + line: 6, + column: 20, + endLine: 6, + endColumn: 25 } ] }, @@ -462,19 +476,16 @@ ruleTester.run('no-boolean-default', rule, { errors: [ { message: 'Boolean prop should only be defaulted to false.', - line: 6 + line: 6, + column: 20, + endLine: 6, + endColumn: 24 } ] }, - ...(semver.lt( - require('@typescript-eslint/parser/package.json').version, - '4.0.0' - ) - ? [] - : [ - { - filename: 'test.vue', - code: ` + { + filename: 'test.vue', + code: ` `, - languageOptions: { - parser: require('vue-eslint-parser'), - parserOptions: { - parser: require.resolve('@typescript-eslint/parser') - } - }, - errors: [ - { - message: - 'Boolean prop should not set a default (Vue defaults it to false).', - line: 7 - } - ] - }, - { - filename: 'test.vue', - code: ` + languageOptions: { + parser: require('vue-eslint-parser'), + parserOptions: { + parser: require.resolve('@typescript-eslint/parser') + } + }, + errors: [ + { + message: + 'Boolean prop should not set a default (Vue defaults it to false).', + line: 7, + column: 14, + endLine: 7, + endColumn: 19 + } + ] + }, + { + filename: 'test.vue', + code: ` `, - languageOptions: { - parser: require('vue-eslint-parser'), - parserOptions: { - parser: require.resolve('@typescript-eslint/parser') - } - }, - options: ['default-false'], - errors: [ - { - message: 'Boolean prop should only be defaulted to false.', - line: 7 - } - ] - } - ]), + options: ['default-false'], + languageOptions: { + parser: require('vue-eslint-parser'), + parserOptions: { + parser: require.resolve('@typescript-eslint/parser') + } + }, + errors: [ + { + message: 'Boolean prop should only be defaulted to false.', + line: 7, + column: 14, + endLine: 7, + endColumn: 18 + } + ] + }, { filename: 'test.vue', code: ` @@ -539,7 +555,10 @@ ruleTester.run('no-boolean-default', rule, { { message: 'Boolean prop should not set a default (Vue defaults it to false).', - line: 3 + line: 3, + column: 20, + endLine: 3, + endColumn: 25 } ] }, @@ -557,7 +576,10 @@ ruleTester.run('no-boolean-default', rule, { errors: [ { message: 'Boolean prop should only be defaulted to false.', - line: 3 + line: 3, + column: 20, + endLine: 3, + endColumn: 24 } ] } diff --git a/tests/lib/rules/no-child-content.js b/tests/lib/rules/no-child-content.js index 1be1e3c07..d991559b3 100644 --- a/tests/lib/rules/no-child-content.js +++ b/tests/lib/rules/no-child-content.js @@ -74,7 +74,9 @@ ruleTester.run('no-child-content', rule, { { message: 'Child content is disallowed because it will be overwritten by the v-html directive.', + line: 1, column: 29, + endLine: 1, endColumn: 32, suggestions: [ { @@ -93,7 +95,9 @@ ruleTester.run('no-child-content', rule, { { message: 'Child content is disallowed because it will be overwritten by the v-html directive.', + line: 1, column: 29, + endLine: 1, endColumn: 38, suggestions: [ { @@ -112,7 +116,9 @@ ruleTester.run('no-child-content', rule, { { message: 'Child content is disallowed because it will be overwritten by the v-html directive.', + line: 1, column: 29, + endLine: 1, endColumn: 37, suggestions: [ { @@ -131,7 +137,9 @@ ruleTester.run('no-child-content', rule, { { message: 'Child content is disallowed because it will be overwritten by the v-html directive.', + line: 1, column: 29, + endLine: 1, endColumn: 41, suggestions: [ { @@ -183,7 +191,9 @@ ruleTester.run('no-child-content', rule, { { message: 'Child content is disallowed because it will be overwritten by the v-text directive.', + line: 1, column: 29, + endLine: 1, endColumn: 32, suggestions: [ { @@ -203,7 +213,9 @@ ruleTester.run('no-child-content', rule, { { message: 'Child content is disallowed because it will be overwritten by the v-t directive.', + line: 1, column: 26, + endLine: 1, endColumn: 29, suggestions: [ { @@ -223,7 +235,9 @@ ruleTester.run('no-child-content', rule, { { message: 'Child content is disallowed because it will be overwritten by the v-html directive.', + line: 1, column: 29, + endLine: 1, endColumn: 32, suggestions: [ { diff --git a/tests/lib/rules/no-computed-properties-in-data.js b/tests/lib/rules/no-computed-properties-in-data.js index 769731804..9eb32e973 100644 --- a/tests/lib/rules/no-computed-properties-in-data.js +++ b/tests/lib/rules/no-computed-properties-in-data.js @@ -97,7 +97,9 @@ tester.run('no-computed-properties-in-data', rule, { message: 'The computed property cannot be used in `data()` because it is before initialization.', line: 5, - column: 23 + column: 23, + endLine: 5, + endColumn: 31 } ] }, @@ -122,7 +124,9 @@ tester.run('no-computed-properties-in-data', rule, { message: 'The computed property cannot be used in `data()` because it is before initialization.', line: 6, - column: 23 + column: 23, + endLine: 6, + endColumn: 29 } ] } diff --git a/tests/lib/rules/no-console.js b/tests/lib/rules/no-console.js index 1ff32feeb..f9df6ede7 100644 --- a/tests/lib/rules/no-console.js +++ b/tests/lib/rules/no-console.js @@ -76,7 +76,9 @@ tester.run('no-console', rule, { { message: 'Unexpected console statement.', line: 3, - column: 25 + column: 25, + endLine: 3, + endColumn: 32 } ] }, @@ -91,12 +93,16 @@ tester.run('no-console', rule, { { message: 'Unexpected console statement.', line: 3, - column: 23 + column: 23, + endLine: 3, + endColumn: 30 }, { message: 'Unexpected console statement.', line: 3, - column: 39 + column: 39, + endLine: 3, + endColumn: 46 } ] }, @@ -111,7 +117,9 @@ tester.run('no-console', rule, { { message: 'Unexpected console statement.', line: 3, - column: 31 + column: 31, + endLine: 3, + endColumn: 38 } ] }, @@ -128,7 +136,9 @@ tester.run('no-console', rule, { { message: 'Unexpected console statement.', line: 3, - column: 25 + column: 25, + endLine: 3, + endColumn: 32 } ] } diff --git a/tests/lib/rules/no-constant-condition.js b/tests/lib/rules/no-constant-condition.js index 8d25479f8..38b2f94f7 100644 --- a/tests/lib/rules/no-constant-condition.js +++ b/tests/lib/rules/no-constant-condition.js @@ -23,8 +23,9 @@ tester.run('no-constant-condition', rule, { errors: [ { messageId: 'unexpected', - type: 'UnaryExpression', + line: 1, column: 31, + endLine: 1, endColumn: 33 } ] @@ -34,8 +35,9 @@ tester.run('no-constant-condition', rule, { errors: [ { messageId: 'unexpected', - type: 'Literal', + line: 1, column: 36, + endLine: 1, endColumn: 40 } ] @@ -45,8 +47,9 @@ tester.run('no-constant-condition', rule, { errors: [ { messageId: 'unexpected', - type: 'Literal', + line: 1, column: 31, + endLine: 1, endColumn: 32 } ] @@ -56,8 +59,9 @@ tester.run('no-constant-condition', rule, { errors: [ { messageId: 'unexpected', - type: 'ObjectExpression', + line: 1, column: 33, + endLine: 1, endColumn: 35 } ] @@ -67,8 +71,9 @@ tester.run('no-constant-condition', rule, { errors: [ { messageId: 'unexpected', - type: 'BinaryExpression', + line: 1, column: 31, + endLine: 1, endColumn: 36 } ] @@ -78,35 +83,33 @@ tester.run('no-constant-condition', rule, { errors: [ { messageId: 'unexpected', - type: 'LogicalExpression', + line: 1, column: 31, + endLine: 1, endColumn: 37 } ] - } + }, - // failing in Node.js v8, because template literals are not supported there: - // { - // code: '', - // errors: [ - // { - // messageId: 'unexpected', - // type: 'TemplateLiteral', - // column: 31, - // endColumn: 36 - // } - // ] - // }, - // { - // code: '', - // errors: [ - // { - // messageId: 'unexpected', - // type: 'TemplateLiteral', - // column: 31, - // endColumn: 33 - // } - // ] - // } + { + code: '', + errors: [ + { + messageId: 'unexpected', + column: 31, + endColumn: 36 + } + ] + }, + { + code: '', + errors: [ + { + messageId: 'unexpected', + column: 31, + endColumn: 33 + } + ] + } ] }) diff --git a/tests/lib/rules/no-custom-modifiers-on-v-model.js b/tests/lib/rules/no-custom-modifiers-on-v-model.js index 88d269ebf..156f42e4e 100644 --- a/tests/lib/rules/no-custom-modifiers-on-v-model.js +++ b/tests/lib/rules/no-custom-modifiers-on-v-model.js @@ -51,12 +51,28 @@ ruleTester.run('no-custom-modifiers-on-v-model', rule, { { filename: 'test.vue', code: '', - errors: ["'v-model' directives don't support the modifier 'aaa'."] + errors: [ + { + message: "'v-model' directives don't support the modifier 'aaa'.", + line: 1, + column: 24, + endLine: 1, + endColumn: 50 + } + ] }, { filename: 'test.vue', code: '', - errors: ["'v-model' directives don't support the modifier 'aaa'."] + errors: [ + { + message: "'v-model' directives don't support the modifier 'aaa'.", + line: 1, + column: 24, + endLine: 1, + endColumn: 41 + } + ] } ] }) diff --git a/tests/lib/rules/no-deprecated-data-object-declaration.js b/tests/lib/rules/no-deprecated-data-object-declaration.js index 648e1de24..b7395304d 100644 --- a/tests/lib/rules/no-deprecated-data-object-declaration.js +++ b/tests/lib/rules/no-deprecated-data-object-declaration.js @@ -155,7 +155,10 @@ return { { message: "Object declaration on 'data' property is deprecated. Using function declaration instead.", - line: 4 + line: 4, + column: 11, + endLine: 6, + endColumn: 12 } ] }, @@ -182,7 +185,10 @@ return { { message: "Object declaration on 'data' property is deprecated. Using function declaration instead.", - line: 3 + line: 3, + column: 11, + endLine: 5, + endColumn: 12 } ] }, @@ -209,7 +215,10 @@ return { { message: "Object declaration on 'data' property is deprecated. Using function declaration instead.", - line: 3 + line: 3, + column: 11, + endLine: 5, + endColumn: 12 } ] }, @@ -236,7 +245,10 @@ return (/*b*/{ { message: "Object declaration on 'data' property is deprecated. Using function declaration instead.", - line: 3 + line: 3, + column: 11, + endLine: 5, + endColumn: 13 } ] }, @@ -263,7 +275,10 @@ return { { message: "Object declaration on 'data' property is deprecated. Using function declaration instead.", - line: 3 + line: 3, + column: 11, + endLine: 5, + endColumn: 12 } ] }, @@ -290,7 +305,10 @@ return { { message: "Object declaration on 'data' property is deprecated. Using function declaration instead.", - line: 3 + line: 3, + column: 11, + endLine: 5, + endColumn: 12 } ] } diff --git a/tests/lib/rules/no-deprecated-delete-set.js b/tests/lib/rules/no-deprecated-delete-set.js index a38b6ecea..a2dae8fa7 100644 --- a/tests/lib/rules/no-deprecated-delete-set.js +++ b/tests/lib/rules/no-deprecated-delete-set.js @@ -135,11 +135,17 @@ tester.run('no-deprecated-delete-set', rule, { errors: [ { messageId: 'deprecated', - line: 4 + line: 4, + column: 18, + endLine: 4, + endColumn: 22 }, { messageId: 'deprecated', - line: 5 + line: 5, + column: 18, + endLine: 5, + endColumn: 25 } ] }, @@ -157,11 +163,17 @@ tester.run('no-deprecated-delete-set', rule, { errors: [ { messageId: 'deprecated', - line: 5 + line: 5, + column: 16, + endLine: 5, + endColumn: 20 }, { messageId: 'deprecated', - line: 6 + line: 6, + column: 16, + endLine: 6, + endColumn: 23 } ] }, @@ -176,8 +188,20 @@ tester.run('no-deprecated-delete-set', rule, { }) `, errors: [ - { messageId: 'deprecated', line: 4 }, - { messageId: 'deprecated', line: 5 } + { + messageId: 'deprecated', + line: 4, + column: 19, + endLine: 4, + endColumn: 23 + }, + { + messageId: 'deprecated', + line: 5, + column: 19, + endLine: 5, + endColumn: 26 + } ] }, { @@ -193,8 +217,20 @@ tester.run('no-deprecated-delete-set', rule, { `, errors: [ - { messageId: 'deprecated', line: 5 }, - { messageId: 'deprecated', line: 6 } + { + messageId: 'deprecated', + line: 5, + column: 20, + endLine: 5, + endColumn: 24 + }, + { + messageId: 'deprecated', + line: 6, + column: 20, + endLine: 6, + endColumn: 27 + } ] }, // from vue @@ -211,11 +247,17 @@ tester.run('no-deprecated-delete-set', rule, { errors: [ { messageId: 'deprecated', - line: 4 + line: 4, + column: 17, + endLine: 4, + endColumn: 20 }, { messageId: 'deprecated', - line: 5 + line: 5, + column: 17, + endLine: 5, + endColumn: 23 } ] }, @@ -235,11 +277,17 @@ tester.run('no-deprecated-delete-set', rule, { errors: [ { messageId: 'deprecated', - line: 6 + line: 6, + column: 15, + endLine: 6, + endColumn: 18 }, { messageId: 'deprecated', - line: 7 + line: 7, + column: 15, + endLine: 7, + endColumn: 18 } ] }, @@ -256,11 +304,17 @@ tester.run('no-deprecated-delete-set', rule, { errors: [ { messageId: 'deprecated', - line: 5 + line: 5, + column: 11, + endLine: 5, + endColumn: 14 }, { messageId: 'deprecated', - line: 6 + line: 6, + column: 11, + endLine: 6, + endColumn: 14 } ] }, @@ -277,11 +331,17 @@ tester.run('no-deprecated-delete-set', rule, { errors: [ { messageId: 'deprecated', - line: 5 + line: 5, + column: 11, + endLine: 5, + endColumn: 12 }, { messageId: 'deprecated', - line: 6 + line: 6, + column: 11, + endLine: 6, + endColumn: 12 } ] }, @@ -301,11 +361,17 @@ tester.run('no-deprecated-delete-set', rule, { errors: [ { messageId: 'deprecated', - line: 6 + line: 6, + column: 15, + endLine: 6, + endColumn: 18 }, { messageId: 'deprecated', - line: 7 + line: 7, + column: 15, + endLine: 7, + endColumn: 18 } ] }, @@ -325,11 +391,17 @@ tester.run('no-deprecated-delete-set', rule, { errors: [ { messageId: 'deprecated', - line: 6 + line: 6, + column: 15, + endLine: 6, + endColumn: 16 }, { messageId: 'deprecated', - line: 7 + line: 7, + column: 15, + endLine: 7, + endColumn: 16 } ] }, @@ -346,11 +418,17 @@ tester.run('no-deprecated-delete-set', rule, { errors: [ { messageId: 'deprecated', - line: 5 + line: 5, + column: 11, + endLine: 5, + endColumn: 14 }, { messageId: 'deprecated', - line: 6 + line: 6, + column: 11, + endLine: 6, + endColumn: 14 } ] }, @@ -367,11 +445,17 @@ tester.run('no-deprecated-delete-set', rule, { errors: [ { messageId: 'deprecated', - line: 5 + line: 5, + column: 11, + endLine: 5, + endColumn: 16 }, { messageId: 'deprecated', - line: 6 + line: 6, + column: 11, + endLine: 6, + endColumn: 16 } ] } diff --git a/tests/lib/rules/no-deprecated-destroyed-lifecycle.js b/tests/lib/rules/no-deprecated-destroyed-lifecycle.js index a956b37ed..5f7e93dc1 100644 --- a/tests/lib/rules/no-deprecated-destroyed-lifecycle.js +++ b/tests/lib/rules/no-deprecated-destroyed-lifecycle.js @@ -118,12 +118,18 @@ ruleTester.run('no-deprecated-destroyed-lifecycle', rule, { { message: 'The `beforeDestroy` lifecycle hook is deprecated. Use `beforeUnmount` instead.', - line: 4 + line: 4, + column: 9, + endLine: 4, + endColumn: 22 }, { message: 'The `destroyed` lifecycle hook is deprecated. Use `unmounted` instead.', - line: 5 + line: 5, + column: 9, + endLine: 5, + endColumn: 18 } ] }, @@ -149,12 +155,18 @@ ruleTester.run('no-deprecated-destroyed-lifecycle', rule, { { message: 'The `beforeDestroy` lifecycle hook is deprecated. Use `beforeUnmount` instead.', - line: 4 + line: 4, + column: 9, + endLine: 4, + endColumn: 22 }, { message: 'The `destroyed` lifecycle hook is deprecated. Use `unmounted` instead.', - line: 5 + line: 5, + column: 9, + endLine: 5, + endColumn: 18 } ] }, @@ -198,12 +210,18 @@ ruleTester.run('no-deprecated-destroyed-lifecycle', rule, { { message: 'The `beforeDestroy` lifecycle hook is deprecated. Use `beforeUnmount` instead.', - line: 12 + line: 12, + column: 9, + endLine: 12, + endColumn: 22 }, { message: 'The `destroyed` lifecycle hook is deprecated. Use `unmounted` instead.', - line: 13 + line: 13, + column: 9, + endLine: 13, + endColumn: 18 } ] }, @@ -229,12 +247,18 @@ ruleTester.run('no-deprecated-destroyed-lifecycle', rule, { { message: 'The `beforeDestroy` lifecycle hook is deprecated. Use `beforeUnmount` instead.', - line: 4 + line: 4, + column: 10, + endLine: 4, + endColumn: 25 }, { message: 'The `destroyed` lifecycle hook is deprecated. Use `unmounted` instead.', - line: 5 + line: 5, + column: 10, + endLine: 5, + endColumn: 21 } ] }, @@ -260,12 +284,18 @@ ruleTester.run('no-deprecated-destroyed-lifecycle', rule, { { message: 'The `beforeDestroy` lifecycle hook is deprecated. Use `beforeUnmount` instead.', - line: 4 + line: 4, + column: 10, + endLine: 4, + endColumn: 25 }, { message: 'The `destroyed` lifecycle hook is deprecated. Use `unmounted` instead.', - line: 5 + line: 5, + column: 10, + endLine: 5, + endColumn: 21 } ] } diff --git a/tests/lib/rules/no-deprecated-dollar-listeners-api.js b/tests/lib/rules/no-deprecated-dollar-listeners-api.js index f9dd0ff40..2a4e72eb3 100644 --- a/tests/lib/rules/no-deprecated-dollar-listeners-api.js +++ b/tests/lib/rules/no-deprecated-dollar-listeners-api.js @@ -132,16 +132,16 @@ ruleTester.run('no-deprecated-dollar-listeners-api', rule, { `, errors: [ { + messageId: 'deprecated', line: 3, column: 22, - messageId: 'deprecated', endLine: 3, endColumn: 32 }, { + messageId: 'deprecated', line: 9, column: 27, - messageId: 'deprecated', endLine: 9, endColumn: 37 } @@ -167,23 +167,23 @@ ruleTester.run('no-deprecated-dollar-listeners-api', rule, { `, errors: [ { + messageId: 'deprecated', line: 3, column: 35, - messageId: 'deprecated', endLine: 3, endColumn: 45 }, { + messageId: 'deprecated', line: 4, column: 22, - messageId: 'deprecated', endLine: 4, endColumn: 32 }, { + messageId: 'deprecated', line: 10, column: 23, - messageId: 'deprecated', endLine: 10, endColumn: 33 } @@ -205,9 +205,11 @@ ruleTester.run('no-deprecated-dollar-listeners-api', rule, { `, errors: [ { + messageId: 'deprecated', line: 7, column: 25, - messageId: 'deprecated' + endLine: 7, + endColumn: 35 } ] }, @@ -230,9 +232,11 @@ ruleTester.run('no-deprecated-dollar-listeners-api', rule, { `, errors: [ { + messageId: 'deprecated', line: 8, column: 27, - messageId: 'deprecated' + endLine: 8, + endColumn: 37 } ] }, @@ -253,10 +257,18 @@ ruleTester.run('no-deprecated-dollar-listeners-api', rule, { `, errors: [ { - messageId: 'deprecated' + messageId: 'deprecated', + line: 7, + column: 29, + endLine: 7, + endColumn: 39 }, { - messageId: 'deprecated' + messageId: 'deprecated', + line: 8, + column: 31, + endLine: 8, + endColumn: 41 } ] } 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 } ] } diff --git a/tests/lib/rules/no-deprecated-events-api.js b/tests/lib/rules/no-deprecated-events-api.js index c78577d4b..75c8b7d91 100644 --- a/tests/lib/rules/no-deprecated-events-api.js +++ b/tests/lib/rules/no-deprecated-events-api.js @@ -139,7 +139,10 @@ ruleTester.run('no-deprecated-events-api', rule, { { message: 'The Events api `$on`, `$off` `$once` is deprecated. Using external library instead, for example mitt.', - line: 4 + line: 4, + column: 18, + endLine: 4, + endColumn: 21 } ] }, @@ -157,7 +160,10 @@ ruleTester.run('no-deprecated-events-api', rule, { { message: 'The Events api `$on`, `$off` `$once` is deprecated. Using external library instead, for example mitt.', - line: 4 + line: 4, + column: 18, + endLine: 4, + endColumn: 22 } ] }, @@ -177,7 +183,10 @@ ruleTester.run('no-deprecated-events-api', rule, { { message: 'The Events api `$on`, `$off` `$once` is deprecated. Using external library instead, for example mitt.', - line: 4 + line: 4, + column: 18, + endLine: 4, + endColumn: 23 } ] }, @@ -198,7 +207,10 @@ ruleTester.run('no-deprecated-events-api', rule, { { message: 'The Events api `$on`, `$off` `$once` is deprecated. Using external library instead, for example mitt.', - line: 5 + line: 5, + column: 16, + endLine: 5, + endColumn: 19 } ] }, @@ -215,9 +227,30 @@ ruleTester.run('no-deprecated-events-api', rule, { `, languageOptions, errors: [ - 'The Events api `$on`, `$off` `$once` is deprecated. Using external library instead, for example mitt.', - 'The Events api `$on`, `$off` `$once` is deprecated. Using external library instead, for example mitt.', - 'The Events api `$on`, `$off` `$once` is deprecated. Using external library instead, for example mitt.' + { + message: + 'The Events api `$on`, `$off` `$once` is deprecated. Using external library instead, for example mitt.', + line: 4, + column: 19, + endLine: 4, + endColumn: 22 + }, + { + message: + 'The Events api `$on`, `$off` `$once` is deprecated. Using external library instead, for example mitt.', + line: 5, + column: 19, + endLine: 5, + endColumn: 23 + }, + { + message: + 'The Events api `$on`, `$off` `$once` is deprecated. Using external library instead, for example mitt.', + line: 6, + column: 19, + endLine: 6, + endColumn: 24 + } ] }, { @@ -233,9 +266,30 @@ ruleTester.run('no-deprecated-events-api', rule, { `, languageOptions, errors: [ - 'The Events api `$on`, `$off` `$once` is deprecated. Using external library instead, for example mitt.', - 'The Events api `$on`, `$off` `$once` is deprecated. Using external library instead, for example mitt.', - 'The Events api `$on`, `$off` `$once` is deprecated. Using external library instead, for example mitt.' + { + message: + 'The Events api `$on`, `$off` `$once` is deprecated. Using external library instead, for example mitt.', + line: 4, + column: 21, + endLine: 4, + endColumn: 24 + }, + { + message: + 'The Events api `$on`, `$off` `$once` is deprecated. Using external library instead, for example mitt.', + line: 5, + column: 21, + endLine: 5, + endColumn: 25 + }, + { + message: + 'The Events api `$on`, `$off` `$once` is deprecated. Using external library instead, for example mitt.', + line: 6, + column: 21, + endLine: 6, + endColumn: 26 + } ] } ] diff --git a/tests/lib/rules/no-deprecated-filter.js b/tests/lib/rules/no-deprecated-filter.js index cf2a33518..54eb4b4f1 100644 --- a/tests/lib/rules/no-deprecated-filter.js +++ b/tests/lib/rules/no-deprecated-filter.js @@ -36,37 +36,93 @@ ruleTester.run('no-deprecated-filter', rule, { { filename: 'test.vue', code: '', - errors: ['Filters are deprecated.'] + errors: [ + { + message: 'Filters are deprecated.', + line: 1, + column: 14, + endLine: 1, + endColumn: 26 + } + ] }, { filename: 'test.vue', code: '', - errors: ['Filters are deprecated.'] + errors: [ + { + message: 'Filters are deprecated.', + line: 1, + column: 14, + endLine: 1, + endColumn: 29 + } + ] }, { filename: 'test.vue', code: '', - errors: ['Filters are deprecated.'] + errors: [ + { + message: 'Filters are deprecated.', + line: 1, + column: 14, + endLine: 1, + endColumn: 37 + } + ] }, { filename: 'test.vue', code: '', - errors: ['Filters are deprecated.'] + errors: [ + { + message: 'Filters are deprecated.', + line: 1, + column: 43, + endLine: 1, + endColumn: 55 + } + ] }, { filename: 'test.vue', code: '', - errors: ['Filters are deprecated.'] + errors: [ + { + message: 'Filters are deprecated.', + line: 1, + column: 27, + endLine: 1, + endColumn: 39 + } + ] }, { filename: 'test.vue', code: '', - errors: ['Filters are deprecated.'] + errors: [ + { + message: 'Filters are deprecated.', + line: 1, + column: 27, + endLine: 1, + endColumn: 44 + } + ] }, { filename: 'test.vue', code: '', - errors: ['Filters are deprecated.'] + errors: [ + { + message: 'Filters are deprecated.', + line: 1, + column: 27, + endLine: 1, + endColumn: 50 + } + ] } ] }) 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 } ] } 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 } ] } 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 + } + ] } ] }) diff --git a/tests/lib/rules/no-deprecated-props-default-this.js b/tests/lib/rules/no-deprecated-props-default-this.js index b887868d5..c3be42a8f 100644 --- a/tests/lib/rules/no-deprecated-props-default-this.js +++ b/tests/lib/rules/no-deprecated-props-default-this.js @@ -71,8 +71,7 @@ ruleTester.run('no-deprecated-props-default-this', rule, { } } - `, - errors: [{}, {}] + ` }, { filename: 'test.vue', @@ -199,8 +198,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 + } ] } ] diff --git a/tests/lib/rules/no-deprecated-router-link-tag-prop.js b/tests/lib/rules/no-deprecated-router-link-tag-prop.js index cf022f79a..c95345486 100644 --- a/tests/lib/rules/no-deprecated-router-link-tag-prop.js +++ b/tests/lib/rules/no-deprecated-router-link-tag-prop.js @@ -103,7 +103,9 @@ tester.run('no-deprecated-router-link-tag-prop', rule, { message: "'tag' property on 'RouterLink' component is deprecated. Use scoped slots instead.", line: 3, - column: 21 + column: 21, + endLine: 3, + endColumn: 24 } ] }, @@ -119,7 +121,9 @@ tester.run('no-deprecated-router-link-tag-prop', rule, { message: "'tag' property on 'router-link' component is deprecated. Use scoped slots instead.", line: 3, - column: 22 + column: 22, + endLine: 3, + endColumn: 25 } ] }, @@ -136,7 +140,9 @@ tester.run('no-deprecated-router-link-tag-prop', rule, { message: "'tag' property on 'RouterLink' component is deprecated. Use scoped slots instead.", line: 3, - column: 21 + column: 21, + endLine: 3, + endColumn: 24 } ] }, @@ -153,7 +159,9 @@ tester.run('no-deprecated-router-link-tag-prop', rule, { message: "'tag' property on 'RouterLink' component is deprecated. Use scoped slots instead.", line: 3, - column: 21 + column: 21, + endLine: 3, + endColumn: 24 } ] }, @@ -170,7 +178,9 @@ tester.run('no-deprecated-router-link-tag-prop', rule, { message: "'tag' property on 'router-link' component is deprecated. Use scoped slots instead.", line: 3, - column: 22 + column: 22, + endLine: 3, + endColumn: 25 } ] }, @@ -186,7 +196,9 @@ tester.run('no-deprecated-router-link-tag-prop', rule, { message: "'tag' property on 'RouterLink' component is deprecated. Use scoped slots instead.", line: 3, - column: 22 + column: 22, + endLine: 3, + endColumn: 25 } ] }, @@ -202,7 +214,9 @@ tester.run('no-deprecated-router-link-tag-prop', rule, { message: "'tag' property on 'router-link' component is deprecated. Use scoped slots instead.", line: 3, - column: 23 + column: 23, + endLine: 3, + endColumn: 26 } ] }, @@ -219,7 +233,9 @@ tester.run('no-deprecated-router-link-tag-prop', rule, { message: "'tag' property on 'RouterLink' component is deprecated. Use scoped slots instead.", line: 3, - column: 22 + column: 22, + endLine: 3, + endColumn: 25 } ] }, @@ -236,7 +252,9 @@ tester.run('no-deprecated-router-link-tag-prop', rule, { message: "'tag' property on 'router-link' component is deprecated. Use scoped slots instead.", line: 3, - column: 23 + column: 23, + endLine: 3, + endColumn: 26 } ] }, @@ -253,7 +271,9 @@ tester.run('no-deprecated-router-link-tag-prop', rule, { message: "'tag' property on 'NuxtLink' component is deprecated. Use scoped slots instead.", line: 3, - column: 19 + column: 19, + endLine: 3, + endColumn: 22 } ] }, @@ -270,7 +290,9 @@ tester.run('no-deprecated-router-link-tag-prop', rule, { message: "'tag' property on 'nuxt-link' component is deprecated. Use scoped slots instead.", line: 3, - column: 20 + column: 20, + endLine: 3, + endColumn: 23 } ] }, @@ -287,7 +309,9 @@ tester.run('no-deprecated-router-link-tag-prop', rule, { message: "'tag' property on 'NuxtLink' component is deprecated. Use scoped slots instead.", line: 3, - column: 20 + column: 20, + endLine: 3, + endColumn: 23 } ] }, @@ -304,7 +328,9 @@ tester.run('no-deprecated-router-link-tag-prop', rule, { message: "'tag' property on 'nuxt-link' component is deprecated. Use scoped slots instead.", line: 3, - column: 21 + column: 21, + endLine: 3, + endColumn: 24 } ] } 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 } ] } diff --git a/tests/lib/rules/no-deprecated-slot-attribute.js b/tests/lib/rules/no-deprecated-slot-attribute.js index 2fd5fa401..61f8f25d7 100644 --- a/tests/lib/rules/no-deprecated-slot-attribute.js +++ b/tests/lib/rules/no-deprecated-slot-attribute.js @@ -55,6 +55,42 @@ tester.run('no-deprecated-slot-attribute', rule, { `, options: [{ ignore: ['one', 'two', 'my-component'] }] + }, + { + code: ``, + options: [{ ignore: ['/one/', '/^Two$/i', '/^my-.*/i'] }] + }, + { + code: ``, + options: [{ ignoreParents: ['LinkList'] }] + }, + { + code: ``, + options: [{ ignoreParents: ['/^Link/'] }] } ], invalid: [ @@ -74,7 +110,10 @@ tester.run('no-deprecated-slot-attribute', rule, { errors: [ { message: '`slot` attributes are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 25 } ] }, @@ -94,7 +133,10 @@ tester.run('no-deprecated-slot-attribute', rule, { errors: [ { message: '`slot` attributes are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 25 } ] }, @@ -114,7 +156,10 @@ tester.run('no-deprecated-slot-attribute', rule, { errors: [ { message: '`slot` attributes are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 25 } ] }, @@ -134,7 +179,10 @@ tester.run('no-deprecated-slot-attribute', rule, { errors: [ { message: '`slot` attributes are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 25 } ] }, @@ -154,7 +202,10 @@ tester.run('no-deprecated-slot-attribute', rule, { errors: [ { message: '`slot` attributes are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 25 } ] }, @@ -173,23 +224,38 @@ tester.run('no-deprecated-slot-attribute', rule, { errors: [ { message: '`slot` attributes are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 25 }, { message: '`slot` attributes are deprecated.', - line: 5 + line: 5, + column: 21, + endLine: 5, + endColumn: 25 }, { message: '`slot` attributes are deprecated.', - line: 6 + line: 6, + column: 21, + endLine: 6, + endColumn: 25 }, { message: '`slot` attributes are deprecated.', - line: 7 + line: 7, + column: 21, + endLine: 7, + endColumn: 25 }, { message: '`slot` attributes are deprecated.', - line: 8 + line: 8, + column: 21, + endLine: 8, + endColumn: 25 } ] }, @@ -209,7 +275,10 @@ tester.run('no-deprecated-slot-attribute', rule, { errors: [ { message: '`slot` attributes are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 32 } ] }, @@ -224,7 +293,10 @@ tester.run('no-deprecated-slot-attribute', rule, { errors: [ { message: '`slot` attributes are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 26 } ] }, @@ -244,7 +316,10 @@ tester.run('no-deprecated-slot-attribute', rule, { errors: [ { message: '`slot` attributes are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 26 } ] }, @@ -259,7 +334,10 @@ tester.run('no-deprecated-slot-attribute', rule, { errors: [ { message: '`slot` attributes are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 26 } ] }, @@ -274,7 +352,10 @@ tester.run('no-deprecated-slot-attribute', rule, { errors: [ { message: '`slot` attributes are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 26 } ] }, @@ -289,7 +370,10 @@ tester.run('no-deprecated-slot-attribute', rule, { errors: [ { message: '`slot` attributes are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 26 } ] }, @@ -304,7 +388,10 @@ tester.run('no-deprecated-slot-attribute', rule, { errors: [ { message: '`slot` attributes are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 26 } ] }, @@ -324,7 +411,10 @@ tester.run('no-deprecated-slot-attribute', rule, { errors: [ { message: '`slot` attributes are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 26 } ] }, @@ -344,7 +434,10 @@ tester.run('no-deprecated-slot-attribute', rule, { errors: [ { message: '`slot` attributes are deprecated.', - line: 4 + line: 4, + column: 14, + endLine: 4, + endColumn: 18 } ] }, @@ -364,7 +457,10 @@ tester.run('no-deprecated-slot-attribute', rule, { errors: [ { message: '`slot` attributes are deprecated.', - line: 4 + line: 4, + column: 14, + endLine: 4, + endColumn: 19 } ] }, @@ -385,7 +481,15 @@ tester.run('no-deprecated-slot-attribute', rule, { `, - errors: ['`slot` attributes are deprecated.'] + errors: [ + { + message: '`slot` attributes are deprecated.', + line: 4, + column: 21, + endLine: 4, + endColumn: 25 + } + ] }, { code: ` @@ -404,7 +508,15 @@ tester.run('no-deprecated-slot-attribute', rule, { `, - errors: ['`slot` attributes are deprecated.'] + errors: [ + { + message: '`slot` attributes are deprecated.', + line: 4, + column: 21, + endLine: 4, + endColumn: 25 + } + ] }, { code: ` @@ -423,7 +535,15 @@ tester.run('no-deprecated-slot-attribute', rule, { `, - errors: ['`slot` attributes are deprecated.'] + errors: [ + { + message: '`slot` attributes are deprecated.', + line: 4, + column: 21, + endLine: 4, + endColumn: 25 + } + ] }, { // https://github.com/vuejs/eslint-plugin-vue/issues/1499 @@ -458,11 +578,17 @@ tester.run('no-deprecated-slot-attribute', rule, { errors: [ { message: '`slot` attributes are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 25 }, { message: '`slot` attributes are deprecated.', - line: 9 + line: 9, + column: 23, + endLine: 9, + endColumn: 27 } ] }, @@ -490,8 +616,20 @@ tester.run('no-deprecated-slot-attribute', rule, { `, errors: [ - '`slot` attributes are deprecated.', - '`slot` attributes are deprecated.' + { + message: '`slot` attributes are deprecated.', + line: 4, + column: 37, + endLine: 4, + endColumn: 41 + }, + { + message: '`slot` attributes are deprecated.', + line: 7, + column: 37, + endLine: 7, + endColumn: 42 + } ] }, { @@ -508,8 +646,20 @@ tester.run('no-deprecated-slot-attribute', rule, { `, output: null, errors: [ - '`slot` attributes are deprecated.', - '`slot` attributes are deprecated.' + { + message: '`slot` attributes are deprecated.', + line: 4, + column: 21, + endLine: 4, + endColumn: 25 + }, + { + message: '`slot` attributes are deprecated.', + line: 7, + column: 21, + endLine: 7, + endColumn: 25 + } ] }, { @@ -536,8 +686,20 @@ tester.run('no-deprecated-slot-attribute', rule, { `, 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 + } ] }, { @@ -554,8 +716,20 @@ tester.run('no-deprecated-slot-attribute', rule, { `, output: null, errors: [ - '`slot` attributes are deprecated.', - '`slot` attributes are deprecated.' + { + message: '`slot` attributes are deprecated.', + line: 4, + column: 37, + endLine: 4, + endColumn: 42 + }, + { + message: '`slot` attributes are deprecated.', + line: 7, + column: 37, + endLine: 7, + endColumn: 42 + } ] }, { @@ -582,8 +756,20 @@ tester.run('no-deprecated-slot-attribute', rule, { `, errors: [ - '`slot` attributes are deprecated.', - '`slot` attributes are deprecated.' + { + message: '`slot` attributes are deprecated.', + line: 4, + column: 37, + endLine: 4, + endColumn: 42 + }, + { + message: '`slot` attributes are deprecated.', + line: 7, + column: 37, + endLine: 7, + endColumn: 42 + } ] }, { @@ -610,8 +796,20 @@ tester.run('no-deprecated-slot-attribute', rule, { `, errors: [ - '`slot` attributes are deprecated.', - '`slot` attributes are deprecated.' + { + message: '`slot` attributes are deprecated.', + line: 4, + column: 41, + endLine: 4, + endColumn: 46 + }, + { + message: '`slot` attributes are deprecated.', + line: 7, + column: 37, + endLine: 7, + endColumn: 42 + } ] }, { @@ -642,7 +840,175 @@ tester.run('no-deprecated-slot-attribute', rule, { ignore: ['one'] } ], - errors: ['`slot` attributes are deprecated.'] + errors: [ + { + message: '`slot` attributes are deprecated.', + line: 7, + column: 16, + endLine: 7, + endColumn: 20 + } + ] + }, + { + code: ` + `, + output: ` + `, + options: [ + { + ignore: ['/one/'] + } + ], + errors: [ + { + message: '`slot` attributes are deprecated.', + line: 7, + endLine: 7, + column: 16, + endColumn: 20 + } + ] + }, + { + code: ` + `, + output: ` + `, + options: [ + { + ignore: ['/^one$/'] + } + ], + errors: [ + { + message: '`slot` attributes are deprecated.', + line: 7, + endLine: 7, + column: 16, + endColumn: 20 + } + ] + }, + { + code: ` + `, + output: ` + `, + options: [ + { + ignoreParents: ['my-component'] + } + ], + errors: [ + { + message: '`slot` attributes are deprecated.', + line: 9, + column: 16, + endLine: 9, + endColumn: 20 + } + ] + }, + { + code: ` + `, + output: ` + `, + options: [ + { + ignoreParents: ['/component$/'] + } + ], + errors: [ + { + message: '`slot` attributes are deprecated.', + line: 9, + column: 16, + endLine: 9, + endColumn: 20 + } + ] }, { code: ` @@ -667,7 +1033,15 @@ tester.run('no-deprecated-slot-attribute', rule, { `, - errors: ['`slot` attributes are deprecated.'] + errors: [ + { + message: '`slot` attributes are deprecated.', + line: 6, + column: 13, + endLine: 6, + endColumn: 18 + } + ] }, { code: ` @@ -680,7 +1054,15 @@ tester.run('no-deprecated-slot-attribute', rule, { `, output: null, - errors: ['`slot` attributes are deprecated.'] + errors: [ + { + message: '`slot` attributes are deprecated.', + line: 4, + column: 16, + endLine: 4, + endColumn: 20 + } + ] } ] }) diff --git a/tests/lib/rules/no-deprecated-slot-scope-attribute.js b/tests/lib/rules/no-deprecated-slot-scope-attribute.js index 078f004ef..7b9eb870b 100644 --- a/tests/lib/rules/no-deprecated-slot-scope-attribute.js +++ b/tests/lib/rules/no-deprecated-slot-scope-attribute.js @@ -66,7 +66,10 @@ tester.run('no-deprecated-slot-scope-attribute', rule, { errors: [ { message: '`slot-scope` are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 31 } ] }, @@ -86,7 +89,10 @@ tester.run('no-deprecated-slot-scope-attribute', rule, { errors: [ { message: '`slot-scope` are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 31 } ] }, @@ -106,7 +112,10 @@ tester.run('no-deprecated-slot-scope-attribute', rule, { errors: [ { message: '`slot-scope` are deprecated.', - line: 4 + line: 4, + column: 14, + endLine: 4, + endColumn: 24 } ] }, @@ -121,7 +130,10 @@ tester.run('no-deprecated-slot-scope-attribute', rule, { errors: [ { message: '`slot-scope` are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 31 } ] }, @@ -136,7 +148,10 @@ tester.run('no-deprecated-slot-scope-attribute', rule, { errors: [ { message: '`slot-scope` are deprecated.', - line: 4 + line: 4, + column: 21, + endLine: 4, + endColumn: 31 } ] }, @@ -150,7 +165,15 @@ tester.run('no-deprecated-slot-scope-attribute', rule, { `, output: null, - errors: ['`slot-scope` are deprecated.'] + errors: [ + { + message: '`slot-scope` are deprecated.', + line: 4, + column: 37, + endLine: 4, + endColumn: 47 + } + ] }, { code: ` @@ -163,7 +186,15 @@ tester.run('no-deprecated-slot-scope-attribute', rule, { `, output: null, - errors: ['`slot-scope` are deprecated.'] + errors: [ + { + message: '`slot-scope` are deprecated.', + line: 4, + column: 21, + endLine: 4, + endColumn: 31 + } + ] } ] }) diff --git a/tests/lib/rules/no-deprecated-v-bind-sync.js b/tests/lib/rules/no-deprecated-v-bind-sync.js index 3d775d975..355d1a86c 100644 --- a/tests/lib/rules/no-deprecated-v-bind-sync.js +++ b/tests/lib/rules/no-deprecated-v-bind-sync.js @@ -37,7 +37,14 @@ ruleTester.run('no-deprecated-v-bind-sync', rule, { code: "", output: "", errors: [ - "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead." + { + message: + "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead.", + line: 1, + column: 24, + endLine: 1, + endColumn: 45 + } ] }, { @@ -45,7 +52,14 @@ ruleTester.run('no-deprecated-v-bind-sync', rule, { code: "", output: "", errors: [ - "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead." + { + message: + "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead.", + line: 1, + column: 24, + endLine: 1, + endColumn: 39 + } ] }, { @@ -53,7 +67,14 @@ ruleTester.run('no-deprecated-v-bind-sync', rule, { code: "", output: "", errors: [ - "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead." + { + message: + "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead.", + line: 1, + column: 24, + endLine: 1, + endColumn: 54 + } ] }, { @@ -61,7 +82,14 @@ ruleTester.run('no-deprecated-v-bind-sync', rule, { code: "", output: "", errors: [ - "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead." + { + message: + "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead.", + line: 1, + column: 24, + endLine: 1, + endColumn: 48 + } ] }, { @@ -69,7 +97,14 @@ ruleTester.run('no-deprecated-v-bind-sync', rule, { code: "", output: null, errors: [ - "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead." + { + message: + "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead.", + line: 1, + column: 24, + endLine: 1, + endColumn: 41 + } ] }, { @@ -77,7 +112,14 @@ ruleTester.run('no-deprecated-v-bind-sync', rule, { code: '', output: null, errors: [ - "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead." + { + message: + "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead.", + line: 1, + column: 24, + endLine: 1, + endColumn: 47 + } ] }, { @@ -85,7 +127,14 @@ ruleTester.run('no-deprecated-v-bind-sync', rule, { code: '', output: null, errors: [ - "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead." + { + message: + "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead.", + line: 1, + column: 24, + endLine: 1, + endColumn: 56 + } ] }, { @@ -94,7 +143,14 @@ ruleTester.run('no-deprecated-v-bind-sync', rule, { output: '', errors: [ - "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead." + { + message: + "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead.", + line: 1, + column: 52, + endLine: 1, + endColumn: 69 + } ] }, { @@ -103,7 +159,14 @@ ruleTester.run('no-deprecated-v-bind-sync', rule, { output: '', errors: [ - "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead." + { + message: + "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead.", + line: 1, + column: 52, + endLine: 1, + endColumn: 70 + } ] }, { @@ -112,7 +175,14 @@ ruleTester.run('no-deprecated-v-bind-sync', rule, { output: '', errors: [ - "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead." + { + message: + "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead.", + line: 1, + column: 52, + endLine: 1, + endColumn: 74 + } ] }, { @@ -121,7 +191,14 @@ ruleTester.run('no-deprecated-v-bind-sync', rule, { output: '', errors: [ - "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead." + { + message: + "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead.", + line: 1, + column: 52, + endLine: 1, + endColumn: 75 + } ] }, { @@ -130,7 +207,14 @@ ruleTester.run('no-deprecated-v-bind-sync', rule, { output: '', errors: [ - "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead." + { + message: + "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead.", + line: 1, + column: 52, + endLine: 1, + endColumn: 82 + } ] }, { @@ -139,7 +223,14 @@ ruleTester.run('no-deprecated-v-bind-sync', rule, { output: '', errors: [ - "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead." + { + message: + "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead.", + line: 1, + column: 52, + endLine: 1, + endColumn: 80 + } ] }, { @@ -148,7 +239,14 @@ ruleTester.run('no-deprecated-v-bind-sync', rule, { output: '', errors: [ - "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead." + { + message: + "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead.", + line: 1, + column: 52, + endLine: 1, + endColumn: 77 + } ] }, { @@ -157,7 +255,14 @@ ruleTester.run('no-deprecated-v-bind-sync', rule, { output: '', errors: [ - "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead." + { + message: + "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead.", + line: 1, + column: 52, + endLine: 1, + endColumn: 72 + } ] }, { @@ -166,7 +271,14 @@ ruleTester.run('no-deprecated-v-bind-sync', rule, { output: '', errors: [ - "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead." + { + message: + "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead.", + line: 1, + column: 52, + endLine: 1, + endColumn: 89 + } ] }, { @@ -175,7 +287,14 @@ ruleTester.run('no-deprecated-v-bind-sync', rule, { output: '', errors: [ - "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead." + { + message: + "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead.", + line: 1, + column: 52, + endLine: 1, + endColumn: 77 + } ] }, { @@ -184,7 +303,14 @@ ruleTester.run('no-deprecated-v-bind-sync', rule, { output: '', errors: [ - "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead." + { + message: + "'.sync' modifier on 'v-bind' directive is deprecated. Use 'v-model:propName' instead.", + line: 1, + column: 52, + endLine: 1, + endColumn: 78 + } ] } ] 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 } ] } 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 + } ] } ] diff --git a/tests/lib/rules/no-deprecated-vue-config-keycodes.js b/tests/lib/rules/no-deprecated-vue-config-keycodes.js index ee00e5c37..b0494f24d 100644 --- a/tests/lib/rules/no-deprecated-vue-config-keycodes.js +++ b/tests/lib/rules/no-deprecated-vue-config-keycodes.js @@ -36,7 +36,6 @@ ruleTester.run('no-deprecated-vue-config-keycodes', rule, { message: '`Vue.config.keyCodes` are deprecated.', line: 1, column: 1, - type: 'MemberExpression', // messageId: 'unexpected', endLine: 1, endColumn: 20 @@ -46,12 +45,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 + } + ] } ] }) diff --git a/tests/lib/rules/no-dupe-keys.js b/tests/lib/rules/no-dupe-keys.js index 124442ec2..e4ca1e8ec 100644 --- a/tests/lib/rules/no-dupe-keys.js +++ b/tests/lib/rules/no-dupe-keys.js @@ -6,6 +6,9 @@ const rule = require('../../../lib/rules/no-dupe-keys') const RuleTester = require('../../eslint-compat').RuleTester +const { + getTypeScriptFixtureTestOptions +} = require('../../test-utils/typescript') const ruleTester = new RuleTester({ languageOptions: { @@ -466,7 +469,7 @@ ruleTester.run('no-dupe-keys', rule, { { filename: 'test.vue', code: ` - + `, @@ -475,7 +478,7 @@ ruleTester.run('no-dupe-keys', rule, { { filename: 'test.vue', code: ` - + `, @@ -500,6 +503,31 @@ ruleTester.run('no-dupe-keys', rule, { parser: require('vue-eslint-parser'), parserOptions: { parser: require.resolve('@typescript-eslint/parser') } } + }, + { + filename: 'test.vue', + code: ` + + `, + languageOptions: { parser: require('vue-eslint-parser') } + }, + { + code: ` + + `, + ...getTypeScriptFixtureTestOptions() } ], @@ -535,22 +563,34 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 5 + line: 5, + column: 13, + endLine: 5, + endColumn: 16 }, { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 10 + line: 10, + column: 15, + endLine: 10, + endColumn: 18 }, { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 14 + line: 14, + column: 13, + endLine: 14, + endColumn: 16 }, { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 21 + line: 21, + column: 15, + endLine: 21, + endColumn: 18 } ] }, @@ -585,22 +625,34 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 5 + line: 5, + column: 13, + endLine: 5, + endColumn: 16 }, { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 10 + line: 10, + column: 15, + endLine: 10, + endColumn: 18 }, { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 14 + line: 14, + column: 13, + endLine: 14, + endColumn: 16 }, { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 21 + line: 21, + column: 15, + endLine: 21, + endColumn: 18 } ] }, @@ -626,17 +678,26 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 5 + line: 5, + column: 13, + endLine: 5, + endColumn: 16 }, { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 9 + line: 9, + column: 13, + endLine: 9, + endColumn: 16 }, { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 12 + line: 12, + column: 13, + endLine: 12, + endColumn: 16 } ] }, @@ -673,22 +734,34 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 7 + line: 7, + column: 13, + endLine: 7, + endColumn: 16 }, { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 13 + line: 13, + column: 13, + endLine: 13, + endColumn: 16 }, { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 16 + line: 16, + column: 13, + endLine: 16, + endColumn: 16 }, { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 23 + line: 23, + column: 15, + endLine: 23, + endColumn: 18 } ] }, @@ -709,7 +782,10 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'bar'. May cause name collision in script or template tag.", - line: 7 + line: 7, + column: 13, + endLine: 7, + endColumn: 16 } ] }, @@ -735,7 +811,10 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 12 + line: 12, + column: 15, + endLine: 12, + endColumn: 18 } ] }, @@ -759,7 +838,10 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 10 + line: 10, + column: 15, + endLine: 10, + endColumn: 18 } ] }, @@ -781,7 +863,10 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 9 + line: 9, + column: 13, + endLine: 9, + endColumn: 16 } ] }, @@ -803,7 +888,10 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 9 + line: 9, + column: 13, + endLine: 9, + endColumn: 16 } ] }, @@ -825,7 +913,10 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 9 + line: 9, + column: 13, + endLine: 9, + endColumn: 16 } ] }, @@ -847,7 +938,10 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 9 + line: 9, + column: 13, + endLine: 9, + endColumn: 16 } ] }, @@ -868,7 +962,10 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'bar'. May cause name collision in script or template tag.", - line: 7 + line: 7, + column: 13, + endLine: 7, + endColumn: 16 } ] }, @@ -889,7 +986,10 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'bar'. May cause name collision in script or template tag.", - line: 7 + line: 7, + column: 13, + endLine: 7, + endColumn: 16 } ] }, @@ -914,7 +1014,10 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 6 + line: 6, + column: 17, + endLine: 6, + endColumn: 20 } ] }, @@ -935,7 +1038,10 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 7 + line: 7, + column: 17, + endLine: 7, + endColumn: 20 } ] }, @@ -955,7 +1061,10 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 6 + line: 6, + column: 17, + endLine: 6, + endColumn: 20 } ] }, @@ -976,7 +1085,10 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 7 + line: 7, + column: 17, + endLine: 7, + endColumn: 20 } ] }, @@ -997,7 +1109,10 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 7 + line: 7, + column: 17, + endLine: 7, + endColumn: 20 } ] }, @@ -1016,7 +1131,10 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 6 + line: 6, + column: 15, + endLine: 6, + endColumn: 22 } ] }, @@ -1044,17 +1162,26 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'baz'. May cause name collision in script or template tag.", - line: 4 + line: 4, + column: 16, + endLine: 4, + endColumn: 19 }, { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 12 + line: 12, + column: 9, + endLine: 14, + endColumn: 10 }, { message: "Duplicate key 'bar'. May cause name collision in script or template tag.", - line: 15 + line: 15, + column: 15, + endLine: 15, + endColumn: 32 } ] }, @@ -1079,12 +1206,18 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 8 + line: 8, + column: 13, + endLine: 8, + endColumn: 24 }, { message: "Duplicate key 'bar'. May cause name collision in script or template tag.", - line: 9 + line: 9, + column: 13, + endLine: 9, + endColumn: 24 } ] }, @@ -1102,9 +1235,57 @@ ruleTester.run('no-dupe-keys', rule, { { message: "Duplicate key 'bar'. May cause name collision in script or template tag.", - line: 5 + line: 5, + column: 13, + endLine: 5, + endColumn: 21 } ] + }, + { + filename: 'test.vue', + code: ` + + `, + languageOptions: { parser: require('vue-eslint-parser') }, + errors: [ + { + message: + "Duplicate key 'bar'. May cause name collision in script or template tag.", + line: 5, + column: 13, + endLine: 5, + endColumn: 24 + } + ] + }, + { + code: ` + + `, + errors: [ + { + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 7, + column: 13, + endLine: 9, + endColumn: 9 + } + ], + ...getTypeScriptFixtureTestOptions() } ] }) diff --git a/tests/lib/rules/no-dupe-v-else-if.js b/tests/lib/rules/no-dupe-v-else-if.js index 8e1388b4f..0d65ddf31 100644 --- a/tests/lib/rules/no-dupe-v-else-if.js +++ b/tests/lib/rules/no-dupe-v-else-if.js @@ -165,7 +165,10 @@ tester.run('no-dupe-v-else-if', rule, { errors: [ { messageId: 'unexpected', - line: 4 + line: 4, + column: 25, + endLine: 4, + endColumn: 39 } ] }, @@ -182,7 +185,10 @@ tester.run('no-dupe-v-else-if', rule, { errors: [ { messageId: 'unexpected', - line: 6 + line: 6, + column: 25, + endLine: 6, + endColumn: 31 } ] }, @@ -200,7 +206,10 @@ tester.run('no-dupe-v-else-if', rule, { errors: [ { messageId: 'unexpected', - line: 6 + line: 6, + column: 25, + endLine: 6, + endColumn: 32 } ] }, @@ -215,7 +224,10 @@ tester.run('no-dupe-v-else-if', rule, { errors: [ { messageId: 'unexpected', - line: 4 + line: 4, + column: 25, + endLine: 4, + endColumn: 26 } ] }, @@ -231,7 +243,10 @@ tester.run('no-dupe-v-else-if', rule, { errors: [ { messageId: 'unexpected', - line: 5 + line: 5, + column: 25, + endLine: 5, + endColumn: 31 } ] }, @@ -246,7 +261,10 @@ tester.run('no-dupe-v-else-if', rule, { errors: [ { messageId: 'unexpected', - line: 4 + line: 4, + column: 25, + endLine: 4, + endColumn: 26 } ] }, @@ -261,7 +279,10 @@ tester.run('no-dupe-v-else-if', rule, { errors: [ { messageId: 'unexpected', - line: 4 + line: 4, + column: 25, + endLine: 4, + endColumn: 36 } ] }, @@ -276,7 +297,10 @@ tester.run('no-dupe-v-else-if', rule, { errors: [ { messageId: 'unexpected', - line: 4 + line: 4, + column: 25, + endLine: 4, + endColumn: 26 } ] }, @@ -292,7 +316,10 @@ tester.run('no-dupe-v-else-if', rule, { errors: [ { messageId: 'unexpected', - line: 5 + line: 5, + column: 31, + endLine: 5, + endColumn: 47 } ] }, @@ -332,8 +359,20 @@ tester.run('no-dupe-v-else-if', rule, { `, errors: [ - { messageId: 'unexpected', line: 4 }, - { messageId: 'unexpected', line: 5 } + { + messageId: 'unexpected', + line: 4, + column: 25, + endLine: 4, + endColumn: 36 + }, + { + messageId: 'unexpected', + line: 5, + column: 25, + endLine: 5, + endColumn: 36 + } ] }, { @@ -346,8 +385,20 @@ tester.run('no-dupe-v-else-if', rule, { `, errors: [ - { messageId: 'unexpected', line: 4 }, - { messageId: 'unexpected', line: 5 } + { + messageId: 'unexpected', + line: 4, + column: 25, + endLine: 4, + endColumn: 26 + }, + { + messageId: 'unexpected', + line: 5, + column: 25, + endLine: 5, + endColumn: 26 + } ] }, { @@ -359,263 +410,702 @@ tester.run('no-dupe-v-else-if', rule, {
`, - errors: [{ messageId: 'unexpected' }, { messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 4, + column: 26, + endLine: 4, + endColumn: 60 + }, + { + messageId: 'unexpected', + line: 5, + column: 26, + endLine: 5, + endColumn: 60 + } + ] }, // Referred to the ESLint core rule. { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 43, + endLine: 1, + endColumn: 44 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 64, + endLine: 1, + endColumn: 65 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 64, + endLine: 1, + endColumn: 65 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 85, + endLine: 1, + endColumn: 86 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 64, + endLine: 1, + endColumn: 65 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 85, + endLine: 1, + endColumn: 86 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 85, + endLine: 1, + endColumn: 86 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 106, + endLine: 1, + endColumn: 107 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }, { messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 43, + endLine: 1, + endColumn: 44 + }, + { + messageId: 'unexpected', + line: 1, + column: 64, + endLine: 1, + endColumn: 65 + } + ] }, { filename: 'test.vue', code: '', errors: [ - { messageId: 'unexpected' }, - { messageId: 'unexpected' }, - { messageId: 'unexpected' } + { + messageId: 'unexpected', + line: 1, + column: 64, + endLine: 1, + endColumn: 65 + }, + { + messageId: 'unexpected', + line: 1, + column: 85, + endLine: 1, + endColumn: 86 + }, + { + messageId: 'unexpected', + line: 1, + column: 106, + endLine: 1, + endColumn: 107 + } ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 63, + endLine: 1, + endColumn: 64 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 49, + endLine: 1, + endColumn: 56 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 47, + endLine: 1, + endColumn: 52 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 46, + endLine: 1, + endColumn: 50 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 48, + endLine: 1, + endColumn: 54 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 53, + endLine: 1, + endColumn: 64 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 46, + endLine: 1, + endColumn: 50 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 49, + endLine: 1, + endColumn: 54 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 49, + endLine: 1, + endColumn: 70 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 48, + endLine: 1, + endColumn: 49 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }, { messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 48, + endLine: 1, + endColumn: 49 + }, + { + messageId: 'unexpected', + line: 1, + column: 69, + endLine: 1, + endColumn: 70 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 48, + endLine: 1, + endColumn: 54 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 64, + endLine: 1, + endColumn: 70 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 74, + endLine: 1, + endColumn: 80 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 65, + endLine: 1, + endColumn: 81 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 43, + endLine: 1, + endColumn: 44 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 48, + endLine: 1, + endColumn: 59 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 48, + endLine: 1, + endColumn: 59 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 64, + endLine: 1, + endColumn: 75 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 70, + endLine: 1, + endColumn: 76 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 75, + endLine: 1, + endColumn: 91 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 53, + endLine: 1, + endColumn: 64 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 48, + endLine: 1, + endColumn: 49 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 65, + endLine: 1, + endColumn: 71 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 62, + endLine: 1, + endColumn: 80 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 58, + endLine: 1, + endColumn: 69 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 75, + endLine: 1, + endColumn: 91 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 62, + endLine: 1, + endColumn: 75 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 49, + endLine: 1, + endColumn: 55 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 90, + endLine: 1, + endColumn: 91 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 53, + endLine: 1, + endColumn: 78 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 55, + endLine: 1, + endColumn: 68 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 91, + endLine: 1, + endColumn: 97 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 70, + endLine: 1, + endColumn: 81 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 43, + endLine: 1, + endColumn: 49 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 48, + endLine: 1, + endColumn: 54 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 48, + endLine: 1, + endColumn: 49 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 43, + endLine: 1, + endColumn: 44 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 48, + endLine: 1, + endColumn: 49 + } + ] }, { filename: 'test.vue', code: '', - errors: [{ messageId: 'unexpected' }] + errors: [ + { + messageId: 'unexpected', + line: 1, + column: 48, + endLine: 1, + endColumn: 49 + } + ] } ] }) diff --git a/tests/lib/rules/no-duplicate-attr-inheritance.js b/tests/lib/rules/no-duplicate-attr-inheritance.js index 41e9f1522..8a007b491 100644 --- a/tests/lib/rules/no-duplicate-attr-inheritance.js +++ b/tests/lib/rules/no-duplicate-attr-inheritance.js @@ -157,7 +157,15 @@ ruleTester.run('no-duplicate-attr-inheritance', rule, { { filename: 'test.vue', code: '', - errors: ['Set "inheritAttrs" to false.'] + errors: [ + { + message: 'Set "inheritAttrs" to false.', + line: 1, + column: 29, + endLine: 1, + endColumn: 35 + } + ] }, { filename: 'test.vue', @@ -169,7 +177,15 @@ ruleTester.run('no-duplicate-attr-inheritance', rule, { } `, - errors: ['Set "inheritAttrs" to false.'] + errors: [ + { + message: 'Set "inheritAttrs" to false.', + line: 2, + column: 37, + endLine: 2, + endColumn: 43 + } + ] }, { filename: 'test.vue', @@ -184,7 +200,10 @@ ruleTester.run('no-duplicate-attr-inheritance', rule, { errors: [ { message: 'Set "inheritAttrs" to false.', - line: 7 + line: 7, + column: 30, + endLine: 7, + endColumn: 36 } ] }, @@ -199,7 +218,10 @@ ruleTester.run('no-duplicate-attr-inheritance', rule, { errors: [ { message: 'Set "inheritAttrs" to false.', - line: 5 + line: 5, + column: 30, + endLine: 5, + endColumn: 36 } ] }, @@ -207,7 +229,15 @@ ruleTester.run('no-duplicate-attr-inheritance', rule, { filename: 'test.vue', code: ``, options: [{ checkMultiRootNodes: true }], - errors: [{ message: 'Set "inheritAttrs" to false.' }] + errors: [ + { + message: 'Set "inheritAttrs" to false.', + line: 1, + column: 24, + endLine: 1, + endColumn: 30 + } + ] }, { filename: 'test.vue', @@ -219,7 +249,15 @@ ruleTester.run('no-duplicate-attr-inheritance', rule, { `, options: [{ checkMultiRootNodes: true }], - errors: [{ message: 'Set "inheritAttrs" to false.' }] + errors: [ + { + message: 'Set "inheritAttrs" to false.', + line: 3, + column: 40, + endLine: 3, + endColumn: 46 + } + ] }, // condition group as a single root node { @@ -231,7 +269,15 @@ ruleTester.run('no-duplicate-attr-inheritance', rule, {
`, - errors: [{ message: 'Set "inheritAttrs" to false.' }] + errors: [ + { + message: 'Set "inheritAttrs" to false.', + line: 3, + column: 40, + endLine: 3, + endColumn: 46 + } + ] }, { filename: 'test.vue', @@ -243,7 +289,15 @@ ruleTester.run('no-duplicate-attr-inheritance', rule, {
`, - errors: [{ message: 'Set "inheritAttrs" to false.' }] + errors: [ + { + message: 'Set "inheritAttrs" to false.', + line: 3, + column: 40, + endLine: 3, + endColumn: 46 + } + ] }, { filename: 'test.vue', @@ -253,7 +307,15 @@ ruleTester.run('no-duplicate-attr-inheritance', rule, {
`, - errors: [{ message: 'Set "inheritAttrs" to false.' }] + errors: [ + { + message: 'Set "inheritAttrs" to false.', + line: 3, + column: 40, + endLine: 3, + endColumn: 46 + } + ] }, { filename: 'test.vue', @@ -262,7 +324,15 @@ ruleTester.run('no-duplicate-attr-inheritance', rule, {
`, - errors: [{ message: 'Set "inheritAttrs" to false.' }] + errors: [ + { + message: 'Set "inheritAttrs" to false.', + line: 3, + column: 40, + endLine: 3, + endColumn: 46 + } + ] } ] }) 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 + } + ] } ] }) diff --git a/tests/lib/rules/no-duplicate-class-names.js b/tests/lib/rules/no-duplicate-class-names.js new file mode 100644 index 000000000..4935bb81c --- /dev/null +++ b/tests/lib/rules/no-duplicate-class-names.js @@ -0,0 +1,574 @@ +/** + * @author Yizack Rangel + * See LICENSE file in root directory for full license. + */ +'use strict' + +const RuleTester = require('../../eslint-compat').RuleTester +const rule = require('../../../lib/rules/no-duplicate-class-names') + +const tester = new RuleTester({ + languageOptions: { + parser: require('vue-eslint-parser'), + ecmaVersion: 2020, + sourceType: 'module' + } +}) + +tester.run('no-duplicate-class-names', rule, { + valid: [ + { + filename: 'no-classes.vue', + code: '' + }, + { + filename: 'one-class.vue', + code: '' + }, + { + filename: 'multiple-different-classes.vue', + code: '' + }, + { + filename: 'no-duplicate-class-in-directive-string.vue', + code: `` + }, + { + filename: 'no-duplicate-class-in-directive-literal.vue', + code: '' + }, + { + filename: 'no-duplicate-class-in-directive-object.vue', + code: `` + }, + { + filename: 'duplicate-class-in-different-directive-object-keys.vue', + code: `` + }, + { + filename: 'class-conditional-expression.vue', + code: `` + }, + { + filename: 'class-conditional-duplicate-expression-value.vue', + code: `` + }, + { + filename: 'class-object-duplicate-value.vue', + code: `
` + }, + { + filename: 'class-non-intersecting-conditions.vue', + code: `` + }, + { + filename: 'class-multiple-logical-non-intersecting.vue', + code: `` + }, + { + filename: 'class-binary-in-logical-non-intersecting.vue', + code: `` + } + ], + invalid: [ + { + filename: 'duplicate-class.vue', + code: '', + output: '', + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 22, + endLine: 1, + endColumn: 31 + } + ] + }, + { + filename: 'multiple-duplicate-classes.vue', + code: '', + output: '', + errors: [ + { + message: "Duplicate class names 'foo', 'bar'.", + line: 1, + column: 22, + endLine: 1, + endColumn: 43 + } + ] + }, + { + filename: 'duplicate-class-in-directive-string.vue', + code: ``, + output: ``, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 24, + endLine: 1, + endColumn: 33 + } + ] + }, + { + filename: 'duplicate-class-in-directive-literal.vue', + code: '', + output: '', + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 24, + endLine: 1, + endColumn: 33 + } + ] + }, + { + filename: 'duplicate-class-directive-object-key.vue', + code: ``, + output: ``, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 26, + endLine: 1, + endColumn: 35 + } + ] + }, + { + filename: 'multiple-duplicate-class-directive-object-keys.vue', + code: ``, + output: ``, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 26, + endLine: 1, + endColumn: 39 + }, + { + message: "Duplicate class name 'bar'.", + line: 1, + column: 47, + endLine: 1, + endColumn: 60 + } + ] + }, + { + filename: 'duplicate-class-directive-array-item.vue', + code: ``, + output: ``, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 25, + endLine: 1, + endColumn: 34 + } + ] + }, + { + filename: 'multiple-duplicate-classes-directive-array-items.vue', + code: ``, + output: ``, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 25, + endLine: 1, + endColumn: 34 + }, + { + message: "Duplicate class name 'bar'.", + line: 1, + column: 36, + endLine: 1, + endColumn: 49 + } + ] + }, + { + filename: 'duplicate-class-in-mixed-directive.vue', + code: ``, + output: ``, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 25, + endLine: 1, + endColumn: 34 + }, + { + message: "Duplicate class name 'bar'.", + line: 1, + column: 38, + endLine: 1, + endColumn: 51 + } + ] + }, + { + filename: 'duplicate-class-conditional-expression.vue', + code: ``, + output: ``, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 35, + endLine: 1, + endColumn: 44 + } + ] + }, + { + filename: 'duplicate-class-binary-expression.vue', + code: ``, + output: ``, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 24, + endLine: 1, + endColumn: 34 + } + ] + }, + { + filename: 'duplicate-class-preserved-spaces-1.vue', + code: ``, + output: ``, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 22, + endLine: 1, + endColumn: 39 + } + ] + }, + { + filename: 'duplicate-class-preserved-spaces-2.vue', + code: ``, + output: ``, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 22, + endLine: 1, + endColumn: 42 + } + ] + }, + { + filename: 'duplicate-class-preserved-spaces-3.vue', + code: ``, + output: ``, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 22, + endLine: 1, + endColumn: 43 + } + ] + }, + { + filename: 'duplicate-class-cross-attribute-string.vue', + code: ``, + output: null, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 11, + endLine: 1, + endColumn: 43 + } + ] + }, + { + filename: 'duplicate-class-cross-attribute-literal.vue', + code: '', + output: null, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 11, + endLine: 1, + endColumn: 43 + } + ] + }, + { + filename: 'duplicate-class-cross-attribute.vue', + code: ``, + output: null, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 11, + endLine: 1, + endColumn: 47 + } + ] + }, + { + filename: 'duplicate-class-cross-attribute-multiple-duplicates.vue', + code: ``, + output: null, + errors: [ + { + message: "Duplicate class names 'foo', 'bar'.", + line: 1, + column: 11, + endLine: 1, + endColumn: 51 + } + ] + }, + { + filename: 'duplicate-class-cross-attribute-array.vue', + code: ``, + output: null, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 11, + endLine: 1, + endColumn: 52 + } + ] + }, + { + filename: 'duplicate-class-cross-attribute-object.vue', + code: ``, + output: null, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 11, + endLine: 1, + endColumn: 53 + } + ] + }, + { + filename: 'duplicate-class-cross-attribute-mixed.vue', + code: ``, + output: null, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 11, + endLine: 1, + endColumn: 62 + } + ] + }, + { + filename: 'duplicate-class-cross-attribute-binary.vue', + code: ``, + output: null, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 11, + endLine: 1, + endColumn: 52 + } + ] + }, + { + filename: 'duplicate-class-cross-attribute-conditional.vue', + code: ``, + output: null, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 11, + endLine: 1, + endColumn: 62 + } + ] + }, + { + filename: 'duplicate-class-cross-node-array.vue', + code: ``, + output: null, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 24, + endLine: 1, + endColumn: 38 + } + ] + }, + { + filename: 'duplicate-class-cross-node-binary.vue', + code: ``, + output: null, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 24, + endLine: 1, + endColumn: 38 + } + ] + }, + { + filename: 'duplicate-class-cross-node-mixed.vue', + code: ``, + output: null, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 24, + endLine: 1, + endColumn: 48 + } + ] + }, + { + filename: 'duplicate-class-logical-expression-and.vue', + code: ``, + output: ``, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 36, + endLine: 1, + endColumn: 45 + } + ] + }, + { + filename: 'duplicate-class-logical-expression-or.vue', + code: ``, + output: ``, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 36, + endLine: 1, + endColumn: 45 + } + ] + }, + { + filename: 'duplicate-class-logical-expression-nullish-coalescing.vue', + code: ``, + output: ``, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 36, + endLine: 1, + endColumn: 45 + } + ] + }, + { + filename: 'duplicate-class-nested-logical-expression.vue', + code: ``, + output: ``, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 55, + endLine: 1, + endColumn: 64 + } + ] + }, + { + filename: 'duplicate-class-logical-expression-in-array.vue', + code: ``, + output: ``, + errors: [ + { + message: "Duplicate class name 'bar'.", + line: 1, + column: 44, + endLine: 1, + endColumn: 53 + } + ] + }, + { + filename: 'duplicate-class-logical-expression-in-conditional.vue', + code: ``, + output: ``, + errors: [ + { + message: "Duplicate class name 'foo'.", + line: 1, + column: 54, + endLine: 1, + endColumn: 63 + } + ] + }, + { + filename: 'duplicate-class-binary-in-logical-expression.vue', + code: ``, + output: null, + errors: [ + { + message: "Duplicate class name 'bar'.", + type: 'BinaryExpression', + line: 1, + column: 36, + endLine: 1, + endColumn: 50 + } + ] + }, + { + filename: 'duplicate-class-template-literal-in-logical-expression.vue', + code: '', + output: null, + errors: [ + { + message: "Duplicate class name 'foo'.", + type: 'TemplateLiteral', + line: 1, + column: 36, + endLine: 1, + endColumn: 52 + } + ] + } + ] +}) diff --git a/tests/lib/rules/no-empty-component-block.js b/tests/lib/rules/no-empty-component-block.js index 0a014099a..87ad2dd66 100644 --- a/tests/lib/rules/no-empty-component-block.js +++ b/tests/lib/rules/no-empty-component-block.js @@ -30,7 +30,11 @@ tester.run('no-empty-component-block', rule, { output: '', errors: [ { - message: '`