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 90bd33ad5..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
- - name: Install ESLint v${{ matrix.eslint }}
- run: npm install --save-dev eslint@${{ matrix.eslint }} -f
+ - name: Test
+ run: npm test
+
+ test-with-eslint-v8:
+ name: Test with ESLint v8
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@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,13 +66,31 @@ 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
- 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
@@ -72,12 +99,12 @@ 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
- - name: Install @typescript-eslint/parser@7
- run: npm install -D @typescript-eslint/parser@7 -f
+ - name: Install @typescript-eslint/parser v7
+ run: npm install -D @typescript-eslint/parser@7 --force
- name: Test
run: npm test
diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml
index 3653780d5..feb5a19e5 100644
--- a/.github/workflows/Release.yml
+++ b/.github/workflows/Release.yml
@@ -14,13 +14,16 @@ jobs:
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@v4
+ uses: actions/checkout@v5
- name: Setup Node.js
- uses: actions/setup-node@v4
+ uses: actions/setup-node@v6
+ with:
+ node-version: 24
- name: Install Dependencies
run: npm install
@@ -32,4 +35,3 @@ jobs:
publish: npm run changeset:publish
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
diff --git a/.github/workflows/check-for-resources-update.yml b/.github/workflows/check-for-resources-update.yml
index 31f881b1d..362ca48cc 100644
--- a/.github/workflows/check-for-resources-update.yml
+++ b/.github/workflows/check-for-resources-update.yml
@@ -14,9 +14,9 @@ jobs:
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/.vscode/launch.json b/.vscode/launch.json
index 171c80066..997cf0bca 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -18,4 +18,4 @@
"console": "integratedTerminal"
}
]
-}
\ No newline at end of file
+}
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
index fa7a29427..4bbb44fa6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,19 +1,65 @@
# 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 `` in [`vue/no-multiple-template-root`](https://eslint.vuejs.org/rules/no-multiple-template-root.html) rule ([#2964](https://github.com/vuejs/eslint-plugin-vue/pull/2964))
+
+## 10.6.0
+
+### Minor Changes
+
+- Updated [`vue/no-import-compiler-macros`](https://eslint.vuejs.org/rules/no-import-compiler-macros.html) to clarify that macros are not allowed outside `
+```
+
+
## :books: Further Reading
-- [vue-async-computed](https://github.com/foxbenjaminfox/vue-async-computed)
+- [`computedAsync`]
+
+[`computedAsync`]: https://vueuse.org/core/computedAsync
## :rocket: Version
diff --git a/docs/rules/no-bare-strings-in-template.md b/docs/rules/no-bare-strings-in-template.md
index 23a23c116..f51da16b8 100644
--- a/docs/rules/no-bare-strings-in-template.md
+++ b/docs/rules/no-bare-strings-in-template.md
@@ -72,7 +72,7 @@ If you want to report these string literals, enable the [vue/no-useless-v-bind]
}
```
-- `allowlist` ... An array of allowed strings or regular expression patterns (e.g. `/\d+/` to allow numbers).
+- `allowlist` ... An array of allowed strings or regular expression patterns (e.g. `"/\d+/"` to allow numbers).
- `attributes` ... An object whose keys are tag name or patterns and value is an array of attributes to check for that tag name.
- `directives` ... An array of directive names to check literal value.
diff --git a/docs/rules/no-computed-properties-in-data.md b/docs/rules/no-computed-properties-in-data.md
index 960a28c86..85d3b84ed 100644
--- a/docs/rules/no-computed-properties-in-data.md
+++ b/docs/rules/no-computed-properties-in-data.md
@@ -14,7 +14,7 @@ since: v7.20.0
## :book: Rule Details
-This rule disallow accessing computed properties in `data()`.
+This rule disallow accessing computed properties in `data()`.\
The computed property cannot be accessed in `data()` because is before initialization.
diff --git a/docs/rules/no-deprecated-data-object-declaration.md b/docs/rules/no-deprecated-data-object-declaration.md
index 214aacc30..51b252ab5 100644
--- a/docs/rules/no-deprecated-data-object-declaration.md
+++ b/docs/rules/no-deprecated-data-object-declaration.md
@@ -16,7 +16,7 @@ since: v7.0.0
## :book: Rule Details
This rule reports use of deprecated object declaration on `data` property (in Vue.js 3.0.0+).
-The different from `vue/no-shared-component-data` is the root instance being also disallowed.
+The different from [`vue/no-shared-component-data`](./no-shared-component-data.md) is the root instance being also disallowed.
See [Migration Guide - Data Option](https://v3-migration.vuejs.org/breaking-changes/data-option.html) for more details.
diff --git a/docs/rules/no-deprecated-slot-attribute.md b/docs/rules/no-deprecated-slot-attribute.md
index 34f941ec4..6d29161f6 100644
--- a/docs/rules/no-deprecated-slot-attribute.md
+++ b/docs/rules/no-deprecated-slot-attribute.md
@@ -49,8 +49,8 @@ This rule reports deprecated `slot` attribute in Vue.js v2.6.0+.
}
```
-- `"ignore"` (`string[]`) An array of tags or regular expression patterns (e.g. `/^custom-/`) that ignore these rules. This option will check both kebab-case and PascalCase versions of the given tag names. Default is empty.
-- `"ignoreParents"` (`string[]`) An array of tags or regular expression patterns (e.g. `/^custom-/`) for parents that ignore these rules. This option is especially useful for [Web-Components](https://developer.mozilla.org/en-US/docs/Web/API/Web_components). Default is empty.
+- `"ignore"` (`string[]`) An array of tags or regular expression patterns (e.g. `"/^custom-/"`) that ignore these rules. This option will check both kebab-case and PascalCase versions of the given tag names. Default is empty.
+- `"ignoreParents"` (`string[]`) An array of tags or regular expression patterns (e.g. `"/^custom-/"`) for parents that ignore these rules. This option is especially useful for [Web-Components](https://developer.mozilla.org/en-US/docs/Web/API/Web_components). Default is empty.
### `"ignore": ["my-component"]`
diff --git a/docs/rules/no-duplicate-attr-inheritance.md b/docs/rules/no-duplicate-attr-inheritance.md
index fe3cd37bf..e433280ef 100644
--- a/docs/rules/no-duplicate-attr-inheritance.md
+++ b/docs/rules/no-duplicate-attr-inheritance.md
@@ -12,7 +12,7 @@ since: v7.0.0
## :book: Rule Details
-This rule aims to prevent duplicate attribute inheritance.
+This rule aims to prevent duplicate attribute inheritance.\
This rule suggests applying `inheritAttrs: false` when it detects `v-bind="$attrs"` being used.
diff --git a/docs/rules/no-duplicate-class-names.md b/docs/rules/no-duplicate-class-names.md
new file mode 100644
index 000000000..033ad5169
--- /dev/null
+++ b/docs/rules/no-duplicate-class-names.md
@@ -0,0 +1,61 @@
+---
+pageClass: rule-details
+sidebarDepth: 0
+title: vue/no-duplicate-class-names
+description: disallow duplication of class names in class attributes
+since: v10.6.0
+---
+
+# vue/no-duplicate-class-names
+
+> disallow duplication of class names in class attributes
+
+- :wrench: The `--fix` option on the [command line](https://eslint.org/docs/user-guide/command-line-interface#fix-problems) can automatically fix some of the problems reported by this rule.
+
+## :book: Rule Details
+
+This rule prevents the same class name from appearing multiple times within the same class attribute or directive.
+
+
+
+```vue
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+
+
+## :wrench: Options
+
+Nothing.
+
+## :rocket: Version
+
+This rule was introduced in eslint-plugin-vue v10.6.0
+
+## :mag: Implementation
+
+- [Rule source](https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/no-duplicate-class-names.js)
+- [Test source](https://github.com/vuejs/eslint-plugin-vue/blob/master/tests/lib/rules/no-duplicate-class-names.js)
diff --git a/docs/rules/no-expose-after-await.md b/docs/rules/no-expose-after-await.md
index 7f8fe9137..bd11f7d44 100644
--- a/docs/rules/no-expose-after-await.md
+++ b/docs/rules/no-expose-after-await.md
@@ -14,8 +14,8 @@ since: v8.1.0
## :book: Rule Details
-This rule reports usages of `expose()` and `defineExpose()` after an `await` expression.
-In the `setup()` function, `expose()` should be registered synchronously.
+This rule reports usages of `expose()` and `defineExpose()` after an `await` expression.\
+In the `setup()` function, `expose()` should be registered synchronously.\
In the `
diff --git a/tests/fixtures/typescript/src/test01.ts b/tests/fixtures/typescript/src/test01.ts
index 917643c67..3d2e059e5 100644
--- a/tests/fixtures/typescript/src/test01.ts
+++ b/tests/fixtures/typescript/src/test01.ts
@@ -18,6 +18,13 @@ export type Props2 = {
h?: string[]
i?: readonly string[]
}
+export type Props3 = {
+ snake_case: string
+ 'kebab-case': number
+ camelCase: boolean
+ PascalCase?: string
+ foo: number
+}
export type Slots1 = {
default(props: { msg: string }): any
diff --git a/tests/integrations/eslint-plugin-import.js b/tests/integrations/eslint-plugin-import.js
index 6f4be7acf..26b2a5140 100644
--- a/tests/integrations/eslint-plugin-import.js
+++ b/tests/integrations/eslint-plugin-import.js
@@ -35,6 +35,9 @@ describe('Integration with eslint-plugin-import', () => {
return
}
- cp.execSync(`${ESLINT} a.vue`, { cwd: PLUGIN_DIR, stdio: 'inherit' })
+ cp.execSync(`${ESLINT} --config eslint.config.mjs a.vue`, {
+ cwd: PLUGIN_DIR,
+ stdio: 'inherit'
+ })
})
})
diff --git a/tests/integrations/eslint-plugin-import/.eslintrc.json b/tests/integrations/eslint-plugin-import/.eslintrc.json
deleted file mode 100644
index 20585a5fd..000000000
--- a/tests/integrations/eslint-plugin-import/.eslintrc.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "root": true,
- "parserOptions": {
- "sourceType": "module",
- "ecmaVersion": 2015
- },
- "parser": "vue-eslint-parser",
- "plugins": ["import", "vue"],
- "rules": {
- "import/default": "warn",
- "import/namespace": "warn"
- },
- "settings": {
- "import/extensions": [".js", ".vue"]
- }
-}
diff --git a/tests/integrations/eslint-plugin-import/eslint.config.mjs b/tests/integrations/eslint-plugin-import/eslint.config.mjs
new file mode 100644
index 000000000..ff8eaac7a
--- /dev/null
+++ b/tests/integrations/eslint-plugin-import/eslint.config.mjs
@@ -0,0 +1,27 @@
+import vueEslintParser from 'vue-eslint-parser'
+import eslintPluginImport from 'eslint-plugin-import'
+import eslintPluginVue from 'eslint-plugin-vue'
+
+export default [
+ {
+ files: ['*.vue'],
+ languageOptions: {
+ parser: vueEslintParser,
+ parserOptions: {
+ sourceType: 'module',
+ ecmaVersion: 2015
+ }
+ },
+ plugins: {
+ import: eslintPluginImport,
+ vue: eslintPluginVue
+ },
+ rules: {
+ 'import/default': 'warn',
+ 'import/namespace': 'warn'
+ },
+ settings: {
+ 'import/extensions': ['.js', '.vue']
+ }
+ }
+]
diff --git a/tests/integrations/eslint-plugin-import/package.json b/tests/integrations/eslint-plugin-import/package.json
index 6de5b12e5..41d7ec4b6 100644
--- a/tests/integrations/eslint-plugin-import/package.json
+++ b/tests/integrations/eslint-plugin-import/package.json
@@ -8,8 +8,8 @@
"author": "Toru Nagashima (https://github.com/mysticatea)",
"license": "MIT",
"dependencies": {
- "eslint": "^7.0.0",
- "eslint-plugin-import": "~2.23.4",
+ "eslint": "^9.0.0",
+ "eslint-plugin-import": "^2.31.0",
"eslint-plugin-vue": "file:../../.."
}
}
diff --git a/tests/lib/configs/eslintrc.js b/tests/lib/configs/eslintrc.ts
similarity index 83%
rename from tests/lib/configs/eslintrc.js
rename to tests/lib/configs/eslintrc.ts
index a9febaeeb..85d25022c 100644
--- a/tests/lib/configs/eslintrc.js
+++ b/tests/lib/configs/eslintrc.ts
@@ -1,7 +1,5 @@
-'use strict'
-
-const { ESLint } = require('../../eslint-compat')
-const plugin = require('../../../lib/index')
+import { ESLint } from '../../eslint-compat'
+import plugin from '../../../lib'
describe('eslintrc configs', () => {
for (const name of Object.keys(plugin.configs)) {
diff --git a/tests/lib/configs/flat.js b/tests/lib/configs/flat.ts
similarity index 65%
rename from tests/lib/configs/flat.js
rename to tests/lib/configs/flat.ts
index 51449953a..ed9e282b1 100644
--- a/tests/lib/configs/flat.js
+++ b/tests/lib/configs/flat.ts
@@ -3,14 +3,13 @@
* @author 唯然
*/
-'use strict'
+import { Linter } from 'eslint'
+import plugin from '../../../lib'
+import { strict as assert } from 'assert'
+import { FlatESLint } from '../../eslint-compat'
-const plugin = require('../../../lib/index')
-const { strict: assert } = require('assert') // node v14 does not support 'assert/strict'
-const { FlatESLint } = require('../../eslint-compat')
-
-function mergeConfig(configs) {
- let config = { rules: {}, plugins: {} }
+function mergeConfig(configs: Linter.FlatConfig[]): Linter.FlatConfig {
+ let config: Linter.FlatConfig = { rules: {}, plugins: {} }
for (const item of configs) {
config = {
...config,
@@ -37,16 +36,16 @@ describe('flat configs', () => {
const forVue = mergeConfig(
base.filter((config) => config.files?.includes('*.vue') || !config.files)
)
- assert.strictEqual(forVue.plugins.vue, plugin)
+ assert.strictEqual(forVue.plugins!.vue, plugin)
assert.strictEqual(forVue.processor, 'vue/vue')
- assert.strictEqual(forVue.rules['vue/comment-directive'], 'error')
+ assert.strictEqual(forVue.rules!['vue/comment-directive'], 'error')
const forOtherThanVue = mergeConfig(
base.filter((config) => !config.files?.includes('*.vue'))
)
- assert.strictEqual(forOtherThanVue.plugins.vue, plugin)
+ assert.strictEqual(forOtherThanVue.plugins!.vue, plugin)
assert.strictEqual(
- forOtherThanVue.rules['vue/comment-directive'],
+ forOtherThanVue.rules!['vue/comment-directive'],
undefined
)
})
@@ -61,20 +60,20 @@ describe('flat configs', () => {
(config) => config.files?.includes('*.vue') || !config.files
)
)
- assert.strictEqual(forVue.plugins.vue, plugin)
- assert.strictEqual(forVue.rules['vue/comment-directive'], 'error')
- assert.strictEqual(forVue.rules['vue/multi-word-component-names'], 'error')
+ assert.strictEqual(forVue.plugins!.vue, plugin)
+ assert.strictEqual(forVue.rules!['vue/comment-directive'], 'error')
+ assert.strictEqual(forVue.rules!['vue/multi-word-component-names'], 'error')
const forOtherThanVue = mergeConfig(
essential.filter((config) => !config.files?.includes('*.vue'))
)
- assert.strictEqual(forOtherThanVue.plugins.vue, plugin)
+ assert.strictEqual(forOtherThanVue.plugins!.vue, plugin)
assert.strictEqual(
- forOtherThanVue.rules['vue/comment-directive'],
+ forOtherThanVue.rules!['vue/comment-directive'],
undefined
)
assert.strictEqual(
- forOtherThanVue.rules['vue/multi-word-component-names'],
+ forOtherThanVue.rules!['vue/multi-word-component-names'],
'error'
)
})
@@ -89,20 +88,20 @@ describe('flat configs', () => {
(config) => config.files?.includes('*.vue') || !config.files
)
)
- assert.strictEqual(forVue.plugins.vue, plugin)
- assert.strictEqual(forVue.rules['vue/comment-directive'], 'error')
- assert.strictEqual(forVue.rules['vue/multi-word-component-names'], 'error')
+ assert.strictEqual(forVue.plugins!.vue, plugin)
+ assert.strictEqual(forVue.rules!['vue/comment-directive'], 'error')
+ assert.strictEqual(forVue.rules!['vue/multi-word-component-names'], 'error')
const forOtherThanVue = mergeConfig(
stronglyRecommended.filter((config) => !config.files?.includes('*.vue'))
)
- assert.strictEqual(forOtherThanVue.plugins.vue, plugin)
+ assert.strictEqual(forOtherThanVue.plugins!.vue, plugin)
assert.strictEqual(
- forOtherThanVue.rules['vue/comment-directive'],
+ forOtherThanVue.rules!['vue/comment-directive'],
undefined
)
assert.strictEqual(
- forOtherThanVue.rules['vue/multi-word-component-names'],
+ forOtherThanVue.rules!['vue/multi-word-component-names'],
'error'
)
})
@@ -117,24 +116,24 @@ describe('flat configs', () => {
(config) => config.files?.includes('*.vue') || !config.files
)
)
- assert.strictEqual(forVue.plugins.vue, plugin)
- assert.strictEqual(forVue.rules['vue/comment-directive'], 'error')
- assert.strictEqual(forVue.rules['vue/multi-word-component-names'], 'error')
- assert.strictEqual(forVue.rules['vue/attributes-order'], 'warn')
+ assert.strictEqual(forVue.plugins!.vue, plugin)
+ assert.strictEqual(forVue.rules!['vue/comment-directive'], 'error')
+ assert.strictEqual(forVue.rules!['vue/multi-word-component-names'], 'error')
+ assert.strictEqual(forVue.rules!['vue/attributes-order'], 'warn')
const forOtherThanVue = mergeConfig(
recommended.filter((config) => !config.files?.includes('*.vue'))
)
- assert.strictEqual(forOtherThanVue.plugins.vue, plugin)
+ assert.strictEqual(forOtherThanVue.plugins!.vue, plugin)
assert.strictEqual(
- forOtherThanVue.rules['vue/comment-directive'],
+ forOtherThanVue.rules!['vue/comment-directive'],
undefined
)
assert.strictEqual(
- forOtherThanVue.rules['vue/multi-word-component-names'],
+ forOtherThanVue.rules!['vue/multi-word-component-names'],
'error'
)
- assert.strictEqual(forOtherThanVue.rules['vue/attributes-order'], 'warn')
+ assert.strictEqual(forOtherThanVue.rules!['vue/attributes-order'], 'warn')
})
it('should export vue2-essential config', () => {
@@ -147,20 +146,20 @@ describe('flat configs', () => {
(config) => config.files?.includes('*.vue') || !config.files
)
)
- assert.strictEqual(forVue.plugins.vue, plugin)
- assert.strictEqual(forVue.rules['vue/comment-directive'], 'error')
- assert.strictEqual(forVue.rules['vue/multi-word-component-names'], 'error')
+ assert.strictEqual(forVue.plugins!.vue, plugin)
+ assert.strictEqual(forVue.rules!['vue/comment-directive'], 'error')
+ assert.strictEqual(forVue.rules!['vue/multi-word-component-names'], 'error')
const forOtherThanVue = mergeConfig(
essential.filter((config) => !config.files?.includes('*.vue'))
)
- assert.strictEqual(forOtherThanVue.plugins.vue, plugin)
+ assert.strictEqual(forOtherThanVue.plugins!.vue, plugin)
assert.strictEqual(
- forOtherThanVue.rules['vue/comment-directive'],
+ forOtherThanVue.rules!['vue/comment-directive'],
undefined
)
assert.strictEqual(
- forOtherThanVue.rules['vue/multi-word-component-names'],
+ forOtherThanVue.rules!['vue/multi-word-component-names'],
'error'
)
})
@@ -175,20 +174,20 @@ describe('flat configs', () => {
(config) => config.files?.includes('*.vue') || !config.files
)
)
- assert.strictEqual(forVue.plugins.vue, plugin)
- assert.strictEqual(forVue.rules['vue/comment-directive'], 'error')
- assert.strictEqual(forVue.rules['vue/multi-word-component-names'], 'error')
+ assert.strictEqual(forVue.plugins!.vue, plugin)
+ assert.strictEqual(forVue.rules!['vue/comment-directive'], 'error')
+ assert.strictEqual(forVue.rules!['vue/multi-word-component-names'], 'error')
const forOtherThanVue = mergeConfig(
stronglyRecommended.filter((config) => !config.files?.includes('*.vue'))
)
- assert.strictEqual(forOtherThanVue.plugins.vue, plugin)
+ assert.strictEqual(forOtherThanVue.plugins!.vue, plugin)
assert.strictEqual(
- forOtherThanVue.rules['vue/comment-directive'],
+ forOtherThanVue.rules!['vue/comment-directive'],
undefined
)
assert.strictEqual(
- forOtherThanVue.rules['vue/multi-word-component-names'],
+ forOtherThanVue.rules!['vue/multi-word-component-names'],
'error'
)
})
@@ -203,24 +202,24 @@ describe('flat configs', () => {
(config) => config.files?.includes('*.vue') || !config.files
)
)
- assert.strictEqual(forVue.plugins.vue, plugin)
- assert.strictEqual(forVue.rules['vue/comment-directive'], 'error')
- assert.strictEqual(forVue.rules['vue/multi-word-component-names'], 'error')
- assert.strictEqual(forVue.rules['vue/attributes-order'], 'warn')
+ assert.strictEqual(forVue.plugins!.vue, plugin)
+ assert.strictEqual(forVue.rules!['vue/comment-directive'], 'error')
+ assert.strictEqual(forVue.rules!['vue/multi-word-component-names'], 'error')
+ assert.strictEqual(forVue.rules!['vue/attributes-order'], 'warn')
const forOtherThanVue = mergeConfig(
recommended.filter((config) => !config.files?.includes('*.vue'))
)
- assert.strictEqual(forOtherThanVue.plugins.vue, plugin)
+ assert.strictEqual(forOtherThanVue.plugins!.vue, plugin)
assert.strictEqual(
- forOtherThanVue.rules['vue/comment-directive'],
+ forOtherThanVue.rules!['vue/comment-directive'],
undefined
)
assert.strictEqual(
- forOtherThanVue.rules['vue/multi-word-component-names'],
+ forOtherThanVue.rules!['vue/multi-word-component-names'],
'error'
)
- assert.strictEqual(forOtherThanVue.rules['vue/attributes-order'], 'warn')
+ assert.strictEqual(forOtherThanVue.rules!['vue/attributes-order'], 'warn')
})
it('should work the suppress comments with base config', async () => {
@@ -281,7 +280,7 @@ describe('flat configs', () => {
const result = await eslint.lintText(code, { filePath: 'MyComponent.vue' })
assert.deepStrictEqual(
- result[0].messages.map((message) => message.ruleId),
+ result[0].messages.map((message: Linter.LintMessage) => message.ruleId),
[
'vue/no-parsing-error',
'vue/max-attributes-per-line',
diff --git a/tests/lib/rules/attribute-hyphenation.js b/tests/lib/rules/attribute-hyphenation.js
index eac974e4e..08c1fb695 100644
--- a/tests/lib/rules/attribute-hyphenation.js
+++ b/tests/lib/rules/attribute-hyphenation.js
@@ -117,7 +117,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute 'my-prop' can't be hyphenated.",
- type: 'VIdentifier',
line: 1,
column: 24,
endLine: 1,
@@ -133,7 +132,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute 'MyProp' must be hyphenated.",
- type: 'VIdentifier',
line: 1,
column: 24,
endLine: 1,
@@ -150,7 +148,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute ':my-prop' can't be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 24,
endLine: 1,
@@ -166,7 +163,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute ':MyProp' must be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 24,
endLine: 1,
@@ -183,7 +179,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute 'v-bind:my-prop' can't be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 24,
endLine: 1,
@@ -199,7 +194,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute 'v-bind:MyProp' must be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 24,
endLine: 1,
@@ -215,7 +209,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute 'v-bind:MyProp' must be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 24,
endLine: 1,
@@ -232,7 +225,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute ':second-prop' can't be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 46,
endLine: 1,
@@ -249,7 +241,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute 'v-bind:myProp' must be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 24,
endLine: 1,
@@ -266,7 +257,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute 'v-bind:propID' must be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 24,
endLine: 1,
@@ -284,7 +274,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute 'v-model:my-prop' can't be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 24,
endLine: 1,
@@ -301,7 +290,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute 'v-model:myProp' must be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 24,
endLine: 1,
@@ -317,7 +305,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute 'v-model:MyProp' must be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 24,
endLine: 1,
@@ -345,7 +332,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute 'third-custom' can't be hyphenated.",
- type: 'VIdentifier',
line: 3,
column: 111,
endLine: 3,
@@ -373,7 +359,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute 'custom-hyphen' can't be hyphenated.",
- type: 'VIdentifier',
line: 3,
column: 71,
endLine: 3,
@@ -381,7 +366,6 @@ ruleTester.run('attribute-hyphenation', rule, {
},
{
message: "Attribute 'second-custom' can't be hyphenated.",
- type: 'VIdentifier',
line: 3,
column: 91,
endLine: 3,
@@ -397,7 +381,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute 'my-prop' can't be hyphenated.",
- type: 'VIdentifier',
line: 1,
column: 22,
endLine: 1,
@@ -413,7 +396,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute 'MyProp' must be hyphenated.",
- type: 'VIdentifier',
line: 1,
column: 22,
endLine: 1,
@@ -429,7 +411,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute ':attr_Gg' must be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 24,
endLine: 1,
@@ -445,7 +426,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute ':Attr_Hh' must be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 24,
endLine: 1,
@@ -461,7 +441,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute ':_attr_Jj' must be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 24,
endLine: 1,
@@ -477,7 +456,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute ':_attrKk' must be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 24,
endLine: 1,
@@ -493,7 +471,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute ':_AttrLl' must be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 24,
endLine: 1,
@@ -509,7 +486,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute ':my-custom_prop' can't be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 24,
endLine: 1,
@@ -525,7 +501,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute ':myAge.sync' must be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 24,
endLine: 1,
@@ -541,7 +516,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute ':my-age.sync' can't be hyphenated.",
- type: 'VDirectiveKey',
line: 1,
column: 24,
endLine: 1,
@@ -566,7 +540,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute 'my-prop' can't be hyphenated.",
- type: 'VIdentifier',
line: 3,
column: 17,
endLine: 3,
@@ -591,7 +564,6 @@ ruleTester.run('attribute-hyphenation', rule, {
errors: [
{
message: "Attribute 'myProp' must be hyphenated.",
- type: 'VIdentifier',
line: 3,
column: 17,
endLine: 3,
diff --git a/tests/lib/rules/attributes-order.js b/tests/lib/rules/attributes-order.js
index eb4543d1d..b5d73977e 100644
--- a/tests/lib/rules/attributes-order.js
+++ b/tests/lib/rules/attributes-order.js
@@ -617,6 +617,71 @@ tester.run('attributes-order', rule, {
alphabetical: false
}
]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ options: [{ sortLineLength: true }]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ options: [{ sortLineLength: false }]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ options: [{ sortLineLength: true }]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ options: [{ sortLineLength: true }]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+ `,
+ options: [{ sortLineLength: true, alphabetical: true }]
}
],
@@ -628,7 +693,6 @@ tester.run('attributes-order', rule, {
errors: [
{
message: 'Attribute "is" should go before "v-cloak".',
- type: 'VAttribute',
line: 1,
column: 24,
endLine: 1,
@@ -643,7 +707,6 @@ tester.run('attributes-order', rule, {
errors: [
{
message: 'Attribute "v-cloak" should go before "id".',
- type: 'VAttribute',
line: 1,
column: 30,
endLine: 1,
@@ -672,7 +735,6 @@ tester.run('attributes-order', rule, {
errors: [
{
message: 'Attribute "v-model" should go before "model".',
- type: 'VAttribute',
line: 4,
column: 15,
endLine: 4,
@@ -680,7 +742,6 @@ tester.run('attributes-order', rule, {
},
{
message: 'Attribute ":id" should go before "propOne".',
- type: 'VAttribute',
line: 6,
column: 15,
endLine: 6,
@@ -711,7 +772,6 @@ tester.run('attributes-order', rule, {
errors: [
{
message: 'Attribute "v-model" should go before "v-on".',
- type: 'VAttribute',
line: 6,
column: 15,
endLine: 6,
@@ -719,7 +779,6 @@ tester.run('attributes-order', rule, {
},
{
message: 'Attribute "propOne" should go before "v-on".',
- type: 'VAttribute',
line: 7,
column: 15,
endLine: 7,
@@ -735,7 +794,6 @@ tester.run('attributes-order', rule, {
errors: [
{
message: 'Attribute "is" should go before "aria-test".',
- type: 'VAttribute',
line: 1,
column: 46,
endLine: 1,
@@ -768,7 +826,6 @@ tester.run('attributes-order', rule, {
errors: [
{
message: 'Attribute "is" should go before "propone".',
- type: 'VAttribute',
line: 1,
column: 44,
endLine: 1,
@@ -791,7 +848,6 @@ tester.run('attributes-order', rule, {
errors: [
{
message: 'Attribute "is" should go before "v-cloak".',
- type: 'VAttribute',
line: 3,
column: 15,
endLine: 3,
@@ -834,7 +890,6 @@ tester.run('attributes-order', rule, {
errors: [
{
message: 'Attribute "v-for" should go before "v-if".',
- type: 'VAttribute',
line: 4,
column: 15,
endLine: 4,
@@ -842,7 +897,6 @@ tester.run('attributes-order', rule, {
},
{
message: 'Attribute "is" should go before "v-once".',
- type: 'VAttribute',
line: 6,
column: 15,
endLine: 6,
@@ -850,7 +904,6 @@ tester.run('attributes-order', rule, {
},
{
message: 'Attribute "ref" should go before "v-on:click".',
- type: 'VAttribute',
line: 8,
column: 15,
endLine: 8,
@@ -858,7 +911,6 @@ tester.run('attributes-order', rule, {
},
{
message: 'Attribute ":prop" should go before "v-on:click".',
- type: 'VAttribute',
line: 9,
column: 15,
endLine: 9,
@@ -866,7 +918,6 @@ tester.run('attributes-order', rule, {
},
{
message: 'Attribute "id" should go before "v-text".',
- type: 'VAttribute',
line: 11,
column: 15,
endLine: 11,
@@ -874,7 +925,6 @@ tester.run('attributes-order', rule, {
},
{
message: 'Attribute "myProp" should go before "v-text".',
- type: 'VAttribute',
line: 12,
column: 15,
endLine: 12,
@@ -934,7 +984,6 @@ tester.run('attributes-order', rule, {
errors: [
{
message: 'Attribute "is" should go before "v-once".',
- type: 'VAttribute',
line: 6,
column: 15,
endLine: 6,
@@ -942,7 +991,6 @@ tester.run('attributes-order', rule, {
},
{
message: 'Attribute "v-on:click" should go before "v-once".',
- type: 'VAttribute',
line: 7,
column: 15,
endLine: 7,
@@ -950,7 +998,6 @@ tester.run('attributes-order', rule, {
},
{
message: 'Attribute "ref" should go before "v-once".',
- type: 'VAttribute',
line: 8,
column: 15,
endLine: 8,
@@ -958,7 +1005,6 @@ tester.run('attributes-order', rule, {
},
{
message: 'Attribute "id" should go before "v-text".',
- type: 'VAttribute',
line: 11,
column: 15,
endLine: 11,
@@ -966,7 +1012,6 @@ tester.run('attributes-order', rule, {
},
{
message: 'Attribute "myProp" should go before "v-text".',
- type: 'VAttribute',
line: 12,
column: 15,
endLine: 12,
@@ -1011,7 +1056,6 @@ tester.run('attributes-order', rule, {
errors: [
{
message: 'Attribute "v-if" should go before "class".',
- type: 'VAttribute',
line: 4,
column: 15,
endLine: 4,
@@ -1039,7 +1083,6 @@ tester.run('attributes-order', rule, {
errors: [
{
message: 'Attribute "v-slot" should go before "v-model".',
- type: 'VAttribute',
line: 5,
column: 15,
endLine: 5,
@@ -1065,7 +1108,6 @@ tester.run('attributes-order', rule, {
errors: [
{
message: 'Attribute "a-prop" should go before "z-prop".',
- type: 'VAttribute',
line: 4,
column: 13,
endLine: 4,
@@ -1091,7 +1133,6 @@ tester.run('attributes-order', rule, {
errors: [
{
message: 'Attribute ":a-prop" should go before ":z-prop".',
- type: 'VAttribute',
line: 4,
column: 13,
endLine: 4,
@@ -1117,7 +1158,6 @@ tester.run('attributes-order', rule, {
errors: [
{
message: 'Attribute "@change" should go before "@input".',
- type: 'VAttribute',
line: 4,
column: 13,
endLine: 4,
@@ -1143,7 +1183,6 @@ tester.run('attributes-order', rule, {
errors: [
{
message: 'Attribute "boolean-prop" should go before "z-prop".',
- type: 'VAttribute',
line: 4,
column: 13,
endLine: 4,
@@ -1169,7 +1208,6 @@ tester.run('attributes-order', rule, {
errors: [
{
message: 'Attribute "v-on:[c]" should go before "v-on:click".',
- type: 'VAttribute',
line: 4,
column: 13,
endLine: 4,
@@ -1195,7 +1233,6 @@ tester.run('attributes-order', rule, {
errors: [
{
message: 'Attribute "v-on:click" should go before "v-text".',
- type: 'VAttribute',
line: 4,
column: 13,
endLine: 4,
@@ -2102,6 +2139,183 @@ tester.run('attributes-order', rule, {
endColumn: 26
}
]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ output: `
+
+
+
+ `,
+ options: [{ sortLineLength: true }],
+ errors: ['Attribute "short" should go before "medium-attr".']
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ output: `
+
+
+
+ `,
+ options: [{ sortLineLength: true }],
+ errors: ['Attribute "short" should go before "very-long-attribute-name".']
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ output: `
+
+
+
+ `,
+ options: [{ sortLineLength: true }],
+ errors: ['Attribute "short" should go before "very-long-attribute-name".']
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ output: `
+
+
+
+ `,
+ options: [{ sortLineLength: true }],
+ errors: [
+ 'Attribute "@click" should go before "@mouseover".',
+ 'Attribute "@input" should go before "@mouseover".'
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ output: `
+
+
+
+ `,
+ options: [{ sortLineLength: true }],
+ errors: [
+ 'Attribute ":a" should go before ":abc".',
+ 'Attribute ":ab" should go before ":abc".'
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ output: `
+
+
+
+ `,
+ options: [{ sortLineLength: true }],
+ errors: ['Attribute "short" should go before "very-long-binding".']
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+ `,
+ output: `
+
+
+ `,
+ options: [{ sortLineLength: true, alphabetical: true }],
+ errors: [{ message: 'Attribute "z" should go before "aa".' }]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+ `,
+ output: `
+
+
+ `,
+ options: [{ sortLineLength: true, alphabetical: true }],
+ errors: [
+ { message: 'Attribute "bb" should go before "zz".' },
+ { message: 'Attribute "@click" should go before "@keyup".' }
+ ]
}
]
})
diff --git a/tests/lib/rules/block-order.js b/tests/lib/rules/block-order.ts
similarity index 94%
rename from tests/lib/rules/block-order.js
rename to tests/lib/rules/block-order.ts
index 4eb25e2bd..659522cb6 100644
--- a/tests/lib/rules/block-order.js
+++ b/tests/lib/rules/block-order.ts
@@ -1,12 +1,13 @@
/**
* @author Yosuke Ota
*/
-'use strict'
-
-const rule = require('../../../lib/rules/block-order')
-const RuleTester = require('../../eslint-compat').RuleTester
-const assert = require('assert')
-const { ESLint } = require('../../eslint-compat')
+import { Rule } from '../../../node_modules/@types/eslint'
+import assert from 'assert'
+import parserVue from 'vue-eslint-parser'
+import rule from '../../../lib/rules/block-order'
+import { ESLint, RuleTester } from '../../eslint-compat'
+import pluginVue from '../../../lib'
+import processor from '../../../lib/processor'
// Initialize linter.
const eslint = new ESLint({
@@ -14,26 +15,26 @@ const eslint = new ESLint({
overrideConfig: {
files: ['**/*.vue'],
languageOptions: {
- parser: require('vue-eslint-parser'),
+ parser: parserVue,
ecmaVersion: 2015
},
- plugins: { vue: require('../../../lib/index') },
+ plugins: { vue: pluginVue },
rules: {
'vue/comment-directive': 'error',
'vue/block-order': 'error'
},
- processor: require('../../../lib/processor')
+ processor
},
fix: true
})
const tester = new RuleTester({
languageOptions: {
- parser: require('vue-eslint-parser')
+ parser: parserVue
}
})
-tester.run('block-order', rule, {
+tester.run('block-order', rule as unknown as Rule.RuleModule, {
valid: [
// default
'',
@@ -71,44 +72,36 @@ tester.run('block-order', rule, {
// order
{
code: '',
- output: null,
options: [{ order: ['script', 'template', 'style'] }]
},
{
code: '',
- output: null,
options: [{ order: ['template', 'script', 'style'] }]
},
{
code: '',
- output: null,
options: [{ order: ['style', 'template', 'script'] }]
},
{
code: '',
- output: null,
options: [{ order: ['template', 'docs', 'script', 'style'] }]
},
{
code: '',
- output: null,
options: [{ order: ['template', 'script', 'style'] }]
},
{
code: 'text
',
- output: null,
options: [{ order: ['docs', 'script', 'template', 'style'] }]
},
{
code: '',
- output: null,
options: [
{ order: ['script[setup]', 'script:not([setup])', 'template', 'style'] }
]
},
{
code: '',
- output: null,
options: [
{
order: [['script[setup]', 'script:not([setup])', 'template'], 'style']
@@ -117,24 +110,20 @@ tester.run('block-order', rule, {
},
{
code: '',
- output: null,
options: [{ order: ['script', 'template', 'style'] }]
},
{
code: '',
- output: null,
options: [{ order: [['script', 'template'], 'style'] }]
},
{
code: '',
- output: null,
options: [
{ order: ['script:not([setup])', 'script[setup]', 'template', 'style'] }
]
},
{
code: '',
- output: null,
options: [
{
order: [['script:not([setup])', 'script[setup]', 'template'], 'style']
@@ -143,7 +132,6 @@ tester.run('block-order', rule, {
},
{
code: '',
- output: null,
options: [
{
order: [
@@ -158,7 +146,6 @@ tester.run('block-order', rule, {
},
{
code: '',
- output: null,
options: [
{
order: [
@@ -175,17 +162,14 @@ tester.run('block-order', rule, {
},
{
code: '',
- output: null,
options: [{ order: [['docs', 'script', 'template'], 'style'] }]
},
{
code: '',
- output: null,
options: [{ order: ['i18n[locale=en]', 'i18n[locale=ja]'] }]
},
{
code: '',
- output: null,
options: [{ order: ['style:not([scoped])', 'style[scoped]'] }]
},
diff --git a/tests/lib/rules/comma-style.js b/tests/lib/rules/comma-style.js
index 82c8e4044..e41ba9b44 100644
--- a/tests/lib/rules/comma-style.js
+++ b/tests/lib/rules/comma-style.js
@@ -3,8 +3,10 @@
*/
'use strict'
+const semver = require('semver')
const { RuleTester } = require('../../eslint-compat')
const rule = require('../../../lib/rules/comma-style')
+const { eslintStylisticVersion } = require('../../test-utils/eslint-stylistic')
const tester = new RuleTester({
languageOptions: { parser: require('vue-eslint-parser'), ecmaVersion: 2018 }
@@ -34,13 +36,6 @@ tester.run('comma-style', rule, {
`,
options: ['first', { exceptions: { ArrowFunctionExpression: false } }]
},
- `
-
-
-
- `,
{
code: `
@@ -173,3 +168,53 @@ tester.run('comma-style', rule, {
}
]
})
+
+if (
+ eslintStylisticVersion === undefined ||
+ semver.lt(eslintStylisticVersion, '3.0.0') ||
+ semver.satisfies(process.version, '<19.0.0 || ^21.0.0')
+) {
+ tester.run('comma-style', rule, {
+ valid: [
+ `
+
+
+
+ `
+ ],
+ invalid: []
+ })
+} else {
+ tester.run('comma-style', rule, {
+ valid: [],
+ invalid: [
+ {
+ code: `
+
+
+
+ `,
+ output: `
+
+
+
+ `,
+ errors: [
+ {
+ message: "',' should be placed last.",
+ line: 5,
+ column: 13,
+ endLine: 5,
+ endColumn: 14
+ }
+ ]
+ }
+ ]
+ })
+}
diff --git a/tests/lib/rules/comment-directive.js b/tests/lib/rules/comment-directive.ts
similarity index 97%
rename from tests/lib/rules/comment-directive.js
rename to tests/lib/rules/comment-directive.ts
index b9acb1092..2a7efdab6 100644
--- a/tests/lib/rules/comment-directive.js
+++ b/tests/lib/rules/comment-directive.ts
@@ -3,10 +3,11 @@
* @author Toru Nagashima
*/
-'use strict'
-
-const assert = require('assert')
-const { ESLint } = require('../../eslint-compat')
+import assert from 'assert'
+import parserVue from 'vue-eslint-parser'
+import { ESLint } from '../../eslint-compat'
+import pluginVue from '../../../lib'
+import processor from '../../../lib/processor'
// Initialize linter.
const eslint = new ESLint({
@@ -14,21 +15,21 @@ const eslint = new ESLint({
overrideConfig: {
files: ['*.*'],
languageOptions: {
- parser: require('vue-eslint-parser'),
+ parser: parserVue,
ecmaVersion: 2015
},
- plugins: { vue: require('../../../lib/index') },
+ plugins: { vue: pluginVue },
rules: {
'no-unused-vars': 'error',
'vue/comment-directive': 'error',
'vue/no-parsing-error': 'error',
'vue/no-duplicate-attributes': 'error'
},
- processor: require('../../../lib/processor')
+ processor
}
})
-async function lintMessages(code) {
+async function lintMessages(code: string) {
const result = await eslint.lintText(code, { filePath: 'test.vue' })
return result[0].messages
}
@@ -357,10 +358,10 @@ describe('comment-directive', () => {
overrideConfig: {
files: ['**/*.vue'],
languageOptions: {
- parser: require('vue-eslint-parser'),
+ parser: parserVue,
ecmaVersion: 2015
},
- plugins: { vue: require('../../../lib/index') },
+ plugins: { vue: pluginVue },
rules: {
'no-unused-vars': 'error',
'vue/comment-directive': [
@@ -370,11 +371,11 @@ describe('comment-directive', () => {
'vue/no-parsing-error': 'error',
'vue/no-duplicate-attributes': 'error'
},
- processor: require('../../../lib/processor')
+ processor
}
})
- async function lintMessages(code) {
+ async function lintMessages(code: string) {
const result = await eslint.lintText(code, { filePath: 'test.vue' })
return result[0].messages
}
diff --git a/tests/lib/rules/component-definition-name-casing.js b/tests/lib/rules/component-definition-name-casing.js
index 323461729..94d5347d8 100644
--- a/tests/lib/rules/component-definition-name-casing.js
+++ b/tests/lib/rules/component-definition-name-casing.js
@@ -191,7 +191,6 @@ ruleTester.run('component-definition-name-casing', rule, {
errors: [
{
message: 'Property name "foo-bar" is not PascalCase.',
- type: 'Literal',
line: 3,
column: 17,
endLine: 3,
@@ -211,7 +210,6 @@ ruleTester.run('component-definition-name-casing', rule, {
errors: [
{
message: 'Property name "foo bar" is not PascalCase.',
- type: 'Literal',
line: 3,
column: 17,
endLine: 3,
@@ -231,7 +229,6 @@ ruleTester.run('component-definition-name-casing', rule, {
errors: [
{
message: 'Property name "foo!bar" is not PascalCase.',
- type: 'Literal',
line: 3,
column: 17,
endLine: 3,
@@ -251,7 +248,6 @@ ruleTester.run('component-definition-name-casing', rule, {
errors: [
{
message: 'Property name "foo!bar" is not PascalCase.',
- type: 'Literal',
line: 3,
column: 17,
endLine: 3,
@@ -275,7 +271,6 @@ ruleTester.run('component-definition-name-casing', rule, {
errors: [
{
message: 'Property name "foo_bar" is not PascalCase.',
- type: 'Literal',
line: 3,
column: 17,
endLine: 3,
@@ -300,7 +295,6 @@ ruleTester.run('component-definition-name-casing', rule, {
errors: [
{
message: 'Property name "foo_bar" is not PascalCase.',
- type: 'Literal',
line: 3,
column: 17,
endLine: 3,
@@ -325,7 +319,6 @@ ruleTester.run('component-definition-name-casing', rule, {
errors: [
{
message: 'Property name "foo_bar" is not kebab-case.',
- type: 'Literal',
line: 3,
column: 17,
endLine: 3,
@@ -341,7 +334,6 @@ ruleTester.run('component-definition-name-casing', rule, {
errors: [
{
message: 'Property name "foo-bar" is not PascalCase.',
- type: 'Literal',
line: 1,
column: 15,
endLine: 1,
@@ -357,7 +349,6 @@ ruleTester.run('component-definition-name-casing', rule, {
errors: [
{
message: 'Property name "foo-bar" is not PascalCase.',
- type: 'Literal',
line: 1,
column: 15,
endLine: 1,
@@ -376,7 +367,6 @@ ruleTester.run('component-definition-name-casing', rule, {
errors: [
{
message: 'Property name "foo-bar" is not PascalCase.',
- type: 'Literal',
line: 1,
column: 40,
endLine: 1,
@@ -392,7 +382,6 @@ ruleTester.run('component-definition-name-casing', rule, {
errors: [
{
message: 'Property name "foo-bar" is not PascalCase.',
- type: 'Literal',
line: 1,
column: 15,
endLine: 1,
@@ -408,7 +397,6 @@ ruleTester.run('component-definition-name-casing', rule, {
errors: [
{
message: 'Property name "foo-bar" is not PascalCase.',
- type: 'Literal',
line: 1,
column: 15,
endLine: 1,
@@ -425,7 +413,6 @@ ruleTester.run('component-definition-name-casing', rule, {
errors: [
{
message: 'Property name "foo_bar" is not PascalCase.',
- type: 'Literal',
line: 1,
column: 15,
endLine: 1,
@@ -442,7 +429,6 @@ ruleTester.run('component-definition-name-casing', rule, {
errors: [
{
message: 'Property name "foo_bar" is not kebab-case.',
- type: 'Literal',
line: 1,
column: 15,
endLine: 1,
@@ -459,7 +445,6 @@ ruleTester.run('component-definition-name-casing', rule, {
errors: [
{
message: 'Property name "foo_bar" is not kebab-case.',
- type: 'TemplateLiteral',
line: 1,
column: 15,
endLine: 1,
diff --git a/tests/lib/rules/component-name-in-template-casing.js b/tests/lib/rules/component-name-in-template-casing.js
index 02ab287f6..9ad24fad3 100644
--- a/tests/lib/rules/component-name-in-template-casing.js
+++ b/tests/lib/rules/component-name-in-template-casing.js
@@ -4,7 +4,6 @@
'use strict'
const rule = require('../../../lib/rules/component-name-in-template-casing')
-const semver = require('semver')
const RuleTester = require('../../eslint-compat').RuleTester
const tester = new RuleTester({
@@ -202,43 +201,52 @@ tester.run('component-name-in-template-casing', rule, {
options: ['kebab-case', { globals: ['RouterView', 'router-link'] }]
},
+ // globals with regex patterns
+ {
+ code: `
+
+
+
+
+
+
+
+
+ `,
+ options: ['kebab-case', { globals: ['/^c-/', 'other-component'] }]
+ },
+
// type-only imports
- ...(semver.gte(
- require('@typescript-eslint/parser/package.json').version,
- '5.0.0'
- )
- ? [
- {
- code: `
-
-
-
-
-
-
-
-
-
-
- `,
- options: ['PascalCase', { registeredComponentsOnly: true }],
- languageOptions: {
- parserOptions: {
- parser: require.resolve('@typescript-eslint/parser')
- }
- }
- }
- ]
- : [])
+ {
+ code: `
+
+
+
+
+
+
+
+
+
+
+
+ `,
+ options: ['PascalCase', { registeredComponentsOnly: true }],
+ languageOptions: {
+ parserOptions: {
+ parser: require.resolve('@typescript-eslint/parser')
+ }
+ }
+ }
],
invalid: [
{
@@ -1223,107 +1231,166 @@ tester.run('component-name-in-template-casing', rule, {
}
]
},
+ {
+ code: `
+
+
+
+
+
+ `,
+ output: `
+
+
+
+
+
+ `,
+ options: ['PascalCase', { globals: ['/^c-/'] }],
+ errors: [
+ {
+ message: 'Component name "c-button" is not PascalCase.',
+ line: 3,
+ column: 11,
+ endLine: 3,
+ endColumn: 20
+ },
+ {
+ message: 'Component name "c-card" is not PascalCase.',
+ line: 4,
+ column: 11,
+ endLine: 4,
+ endColumn: 18
+ }
+ ]
+ },
+ {
+ code: `
+
+
+
+
+
+ `,
+ output: `
+
+
+
+
+
+ `,
+ options: ['kebab-case', { globals: ['/^C[A-Z]/', '/^c-/'] }],
+ errors: [
+ {
+ message: 'Component name "CButton" is not kebab-case.',
+ line: 3,
+ column: 11,
+ endLine: 3,
+ endColumn: 19
+ },
+ {
+ message: 'Component name "CCard" is not kebab-case.',
+ line: 4,
+ column: 11,
+ endLine: 4,
+ endColumn: 17
+ }
+ ]
+ },
// type-only imports
- ...(semver.gte(
- require('@typescript-eslint/parser/package.json').version,
- '5.0.0'
- )
- ? [
- {
- code: `
-
+ {
+ code: `
+
-
-
-
-
-
-
-
-
-
- `,
- options: ['PascalCase', { registeredComponentsOnly: false }],
- languageOptions: {
- parserOptions: {
- parser: require.resolve('@typescript-eslint/parser')
- }
- },
- output: `
-
+
+
+
+
+
+
+
+
+
+ `,
+ output: `
+
-
-
-
-
-
-
-
-
-
- `,
- errors: [
- {
- message: 'Component name "foo" is not PascalCase.',
- line: 13,
- column: 17,
- endLine: 13,
- endColumn: 21
- },
- {
- message: 'Component name "hello-world1" is not PascalCase.',
- line: 14,
- column: 17,
- endLine: 14,
- endColumn: 30
- },
- {
- message: 'Component name "hello-world2" is not PascalCase.',
- line: 15,
- column: 17,
- endLine: 15,
- endColumn: 30
- },
- {
- message: 'Component name "hello-world3" is not PascalCase.',
- line: 16,
- column: 17,
- endLine: 16,
- endColumn: 30
- },
- {
- message: 'Component name "hello-world4" is not PascalCase.',
- line: 17,
- column: 17,
- endLine: 17,
- endColumn: 30
- },
- {
- message: 'Component name "hello-world5" is not PascalCase.',
- line: 18,
- column: 17,
- endLine: 18,
- endColumn: 30
- }
- ]
- }
- ]
- : [])
+
+
+
+
+
+
+
+
+
+ `,
+ options: ['PascalCase', { registeredComponentsOnly: false }],
+ languageOptions: {
+ parserOptions: {
+ parser: require.resolve('@typescript-eslint/parser')
+ }
+ },
+ errors: [
+ {
+ message: 'Component name "foo" is not PascalCase.',
+ line: 13,
+ column: 11,
+ endLine: 13,
+ endColumn: 15
+ },
+ {
+ message: 'Component name "hello-world1" is not PascalCase.',
+ line: 14,
+ column: 11,
+ endLine: 14,
+ endColumn: 24
+ },
+ {
+ message: 'Component name "hello-world2" is not PascalCase.',
+ line: 15,
+ column: 11,
+ endLine: 15,
+ endColumn: 24
+ },
+ {
+ message: 'Component name "hello-world3" is not PascalCase.',
+ line: 16,
+ column: 11,
+ endLine: 16,
+ endColumn: 24
+ },
+ {
+ message: 'Component name "hello-world4" is not PascalCase.',
+ line: 17,
+ column: 11,
+ endLine: 17,
+ endColumn: 24
+ },
+ {
+ message: 'Component name "hello-world5" is not PascalCase.',
+ line: 18,
+ column: 11,
+ endLine: 18,
+ endColumn: 24
+ }
+ ]
+ }
]
})
diff --git a/tests/lib/rules/define-macros-order.js b/tests/lib/rules/define-macros-order.js
index 0a3e274fd..886acd68c 100644
--- a/tests/lib/rules/define-macros-order.js
+++ b/tests/lib/rules/define-macros-order.js
@@ -33,8 +33,12 @@ const optionsExposeLast = [
}
]
-function message(macro) {
- return `${macro} should be the first statement in \``,
+ options: [{ ignoredObjectNames: ['z'] }],
+ languageOptions: {
+ parser,
+ sourceType: 'module',
+ ecmaVersion: 2020
+ }
+ },
+ {
+ filename: 'test.vue',
+ code: `
+ export default {
+ computed: {
+ foo: function () {
+ return z.a?.['b'].[c].d.method().catch(err => err).finally(() => {})
+ }
+ }
+ }
+ `,
+ options: [{ ignoredObjectNames: ['z'] }],
+ languageOptions: {
+ parser,
+ sourceType: 'module',
+ ecmaVersion: 2020
+ }
+ },
+ {
+ filename: 'test.vue',
+ code: `
+ `,
+ options: [{ ignoredObjectNames: ['z'] }],
+ languageOptions: {
+ parser: require('vue-eslint-parser'),
+ parserOptions: {
+ parser: require.resolve('@typescript-eslint/parser')
+ }
+ }
}
],
@@ -1542,6 +1609,98 @@ ruleTester.run('no-async-in-computed-properties', rule, {
endColumn: 8
}
]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+ export default {
+ computed: {
+ foo: function () {
+ return myFunc().catch('default')
+ }
+ }
+ }
+ `,
+ languageOptions,
+ errors: [
+ {
+ message: 'Unexpected asynchronous action in "foo" computed property.',
+ line: 5,
+ column: 22,
+ endLine: 5,
+ endColumn: 47
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+ export default {
+ computed: {
+ foo: function () {
+ return z.number().catch(42)
+ }
+ }
+ }
+ `,
+ languageOptions,
+ errors: [
+ {
+ message: 'Unexpected asynchronous action in "foo" computed property.',
+ line: 5,
+ column: 22,
+ endLine: 5,
+ endColumn: 42
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+ export default {
+ computed: {
+ foo: function () {
+ return someLib.string().catch(42)
+ }
+ }
+ }
+ `,
+ options: [{ ignoredObjectNames: ['z'] }],
+ languageOptions,
+ errors: [
+ {
+ message: 'Unexpected asynchronous action in "foo" computed property.',
+ line: 5,
+ column: 22,
+ endLine: 5,
+ endColumn: 48
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ options: [{ ignoredObjectNames: ['a'] }],
+ languageOptions: {
+ parser,
+ sourceType: 'module',
+ ecmaVersion: 2020
+ },
+ errors: [
+ {
+ message: 'Unexpected asynchronous action in computed function.',
+ line: 5,
+ column: 41,
+ endLine: 5,
+ endColumn: 68
+ }
+ ]
}
]
})
diff --git a/tests/lib/rules/no-boolean-default.js b/tests/lib/rules/no-boolean-default.js
index c3132a5fd..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
@@ -484,15 +483,9 @@ ruleTester.run('no-boolean-default', rule, {
}
]
},
- ...(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,
- column: 14,
- endLine: 7,
- endColumn: 19
- }
- ]
- },
- {
- 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,
- column: 14,
- endLine: 7,
- endColumn: 18
- }
- ]
- }
- ]),
+ 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: `
diff --git a/tests/lib/rules/no-constant-condition.js b/tests/lib/rules/no-constant-condition.js
index 489944a11..38b2f94f7 100644
--- a/tests/lib/rules/no-constant-condition.js
+++ b/tests/lib/rules/no-constant-condition.js
@@ -23,7 +23,6 @@ tester.run('no-constant-condition', rule, {
errors: [
{
messageId: 'unexpected',
- type: 'UnaryExpression',
line: 1,
column: 31,
endLine: 1,
@@ -36,7 +35,6 @@ tester.run('no-constant-condition', rule, {
errors: [
{
messageId: 'unexpected',
- type: 'Literal',
line: 1,
column: 36,
endLine: 1,
@@ -49,7 +47,6 @@ tester.run('no-constant-condition', rule, {
errors: [
{
messageId: 'unexpected',
- type: 'Literal',
line: 1,
column: 31,
endLine: 1,
@@ -62,7 +59,6 @@ tester.run('no-constant-condition', rule, {
errors: [
{
messageId: 'unexpected',
- type: 'ObjectExpression',
line: 1,
column: 33,
endLine: 1,
@@ -75,7 +71,6 @@ tester.run('no-constant-condition', rule, {
errors: [
{
messageId: 'unexpected',
- type: 'BinaryExpression',
line: 1,
column: 31,
endLine: 1,
@@ -88,37 +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-deprecated-props-default-this.js b/tests/lib/rules/no-deprecated-props-default-this.js
index ed0b2005d..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',
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 2df95908c..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: {
@@ -511,6 +514,20 @@ ruleTester.run('no-dupe-keys', rule, {
`,
languageOptions: { parser: require('vue-eslint-parser') }
+ },
+ {
+ code: `
+
+ `,
+ ...getTypeScriptFixtureTestOptions()
}
],
@@ -546,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
}
]
},
@@ -596,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
}
]
},
@@ -637,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
}
]
},
@@ -684,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
}
]
},
@@ -720,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
}
]
},
@@ -746,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
}
]
},
@@ -770,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
}
]
},
@@ -792,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
}
]
},
@@ -814,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
}
]
},
@@ -836,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
}
]
},
@@ -858,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
}
]
},
@@ -879,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
}
]
},
@@ -900,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
}
]
},
@@ -925,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
}
]
},
@@ -946,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
}
]
},
@@ -966,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
}
]
},
@@ -987,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
}
]
},
@@ -1008,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
}
]
},
@@ -1027,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
}
]
},
@@ -1055,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
}
]
},
@@ -1090,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
}
]
},
@@ -1113,7 +1235,10 @@ 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
}
]
},
@@ -1131,9 +1256,36 @@ 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: 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: '`` is empty. Empty block is not allowed.'
+ message: '`` is empty. Empty block is not allowed.',
+ line: 1,
+ column: 1,
+ endLine: 1,
+ endColumn: 22
}
]
},
@@ -39,7 +43,11 @@ tester.run('no-empty-component-block', rule, {
output: '',
errors: [
{
- message: '`` is empty. Empty block is not allowed.'
+ message: '`` is empty. Empty block is not allowed.',
+ line: 1,
+ column: 1,
+ endLine: 1,
+ endColumn: 23
}
]
},
@@ -49,7 +57,11 @@ tester.run('no-empty-component-block', rule, {
output: '',
errors: [
{
- message: '`` is empty. Empty block is not allowed.'
+ message: '`` is empty. Empty block is not allowed.',
+ line: 1,
+ column: 1,
+ endLine: 2,
+ endColumn: 12
}
]
},
@@ -58,7 +70,11 @@ tester.run('no-empty-component-block', rule, {
output: '',
errors: [
{
- message: '`` is empty. Empty block is not allowed.'
+ message: '`` is empty. Empty block is not allowed.',
+ line: 1,
+ column: 1,
+ endLine: 1,
+ endColumn: 13
}
]
},
@@ -67,7 +83,11 @@ tester.run('no-empty-component-block', rule, {
output: '',
errors: [
{
- message: '`` is empty. Empty block is not allowed.'
+ message: '`` is empty. Empty block is not allowed.',
+ line: 1,
+ column: 1,
+ endLine: 1,
+ endColumn: 20
}
]
},
@@ -76,10 +96,18 @@ tester.run('no-empty-component-block', rule, {
output: '',
errors: [
{
- message: '`` is empty. Empty block is not allowed.'
+ message: '`` is empty. Empty block is not allowed.',
+ line: 1,
+ column: 1,
+ endLine: 1,
+ endColumn: 22
},
{
- message: '`',
errors: [
{
- message: '`` is empty. Empty block is not allowed.'
+ message: '`` is empty. Empty block is not allowed.',
+ line: 1,
+ column: 1,
+ endLine: 1,
+ endColumn: 22
},
{
- message: '`
`
},
- ...(semver.gte(
- require('@typescript-eslint/parser/package.json').version,
- '5.4.0'
- ) &&
- semver.satisfies(require('typescript/package.json').version, '>=4.5.0-0')
+ ...(semver.satisfies(
+ require('typescript/package.json').version,
+ '>=4.5.0-0'
+ )
? [
{
filename: 'test.vue',
diff --git a/tests/lib/rules/no-expose-after-await.js b/tests/lib/rules/no-expose-after-await.js
index 033fd5421..4f57d882e 100644
--- a/tests/lib/rules/no-expose-after-await.js
+++ b/tests/lib/rules/no-expose-after-await.js
@@ -147,7 +147,9 @@ tester.run('no-expose-after-await', rule, {
{
message: '`expose` is forbidden after an `await` expression.',
line: 6,
- column: 11
+ column: 11,
+ endLine: 6,
+ endColumn: 32
}
]
},
@@ -167,7 +169,9 @@ tester.run('no-expose-after-await', rule, {
{
message: '`expose` is forbidden after an `await` expression.',
line: 6,
- column: 11
+ column: 11,
+ endLine: 6,
+ endColumn: 36
}
]
},
@@ -184,7 +188,9 @@ tester.run('no-expose-after-await', rule, {
{
message: '`defineExpose` is forbidden after an `await` expression.',
line: 4,
- column: 7
+ column: 7,
+ endLine: 4,
+ endColumn: 34
}
]
}
diff --git a/tests/lib/rules/no-extra-parens.js b/tests/lib/rules/no-extra-parens.js
index dda150694..680ecd25c 100644
--- a/tests/lib/rules/no-extra-parens.js
+++ b/tests/lib/rules/no-extra-parens.js
@@ -74,11 +74,17 @@ tester.run('no-extra-parens', rule, {
errors: [
{
messageId: 'unexpected',
- line: 4
+ line: 4,
+ column: 27,
+ endLine: 4,
+ endColumn: 28
},
{
messageId: 'unexpected',
- line: 5
+ line: 5,
+ column: 28,
+ endLine: 5,
+ endColumn: 29
}
]
},
@@ -88,7 +94,7 @@ tester.run('no-extra-parens', rule, {
`,
@@ -97,20 +103,22 @@ tester.run('no-extra-parens', rule, {
`,
errors: [
{
messageId: 'unexpected',
- line: 5
+ line: 5,
+ column: 16,
+ endLine: 5,
+ endColumn: 17
+ },
+ {
+ messageId: 'unexpected',
+ line: 6
}
- // valid in eslint v6.0
- // {
- // messageId: 'unexpected',
- // line: 6
- // }
]
},
{
@@ -129,7 +137,10 @@ tester.run('no-extra-parens', rule, {
errors: [
{
messageId: 'unexpected',
- line: 4
+ line: 4,
+ column: 19,
+ endLine: 4,
+ endColumn: 20
}
]
},
@@ -139,19 +150,38 @@ tester.run('no-extra-parens', rule, {
errors: [
{
messageId: 'unexpected',
- column: 27
+ column: 27,
+ line: 1,
+ endLine: 1,
+ endColumn: 28
}
]
},
{
code: '',
output: '',
- errors: [{ messageId: 'unexpected' }]
+ errors: [
+ {
+ messageId: 'unexpected',
+ line: 1,
+ column: 27,
+ endLine: 1,
+ endColumn: 28
+ }
+ ]
},
{
code: '',
output: '',
- errors: [{ messageId: 'unexpected' }]
+ errors: [
+ {
+ messageId: 'unexpected',
+ line: 1,
+ column: 28,
+ endLine: 1,
+ endColumn: 29
+ }
+ ]
},
{
code: '',
@@ -159,51 +189,118 @@ tester.run('no-extra-parens', rule, {
errors: [
{
messageId: 'unexpected',
- column: 22
+ column: 22,
+ line: 1,
+ endLine: 1,
+ endColumn: 23
}
]
},
{
code: '',
output: '',
- errors: [{ messageId: 'unexpected' }]
+ errors: [
+ {
+ messageId: 'unexpected',
+ line: 1,
+ column: 22,
+ endLine: 1,
+ endColumn: 23
+ }
+ ]
},
{
code: '',
output:
'',
- errors: [{ messageId: 'unexpected' }]
+ errors: [
+ {
+ messageId: 'unexpected',
+ line: 1,
+ column: 23,
+ endLine: 1,
+ endColumn: 24
+ }
+ ]
},
{
code: '',
output:
'',
- errors: [{ messageId: 'unexpected' }]
+ errors: [
+ {
+ messageId: 'unexpected',
+ line: 1,
+ column: 23,
+ endLine: 1,
+ endColumn: 24
+ }
+ ]
},
{
code: '',
output: '',
- errors: [{ messageId: 'unexpected' }]
+ errors: [
+ {
+ messageId: 'unexpected',
+ line: 1,
+ column: 22,
+ endLine: 1,
+ endColumn: 23
+ }
+ ]
},
{
code: '',
output: '',
- errors: [{ messageId: 'unexpected' }]
+ errors: [
+ {
+ messageId: 'unexpected',
+ line: 1,
+ column: 22,
+ endLine: 1,
+ endColumn: 23
+ }
+ ]
},
{
code: '',
output: '',
- errors: [{ messageId: 'unexpected' }]
+ errors: [
+ {
+ messageId: 'unexpected',
+ line: 1,
+ column: 22,
+ endLine: 1,
+ endColumn: 23
+ }
+ ]
},
{
code: '',
output: '',
- errors: [{ messageId: 'unexpected' }]
+ errors: [
+ {
+ messageId: 'unexpected',
+ line: 1,
+ column: 23,
+ endLine: 1,
+ endColumn: 24
+ }
+ ]
},
{
code: '',
output: '',
- errors: [{ messageId: 'unexpected' }]
+ errors: [
+ {
+ messageId: 'unexpected',
+ line: 1,
+ column: 22,
+ endLine: 1,
+ endColumn: 23
+ }
+ ]
},
// CSS vars injection
{
@@ -219,7 +316,15 @@ tester.run('no-extra-parens', rule, {
color: v-bind('a')
}
`,
- errors: [{ messageId: 'unexpected' }]
+ errors: [
+ {
+ messageId: 'unexpected',
+ line: 4,
+ column: 24,
+ endLine: 4,
+ endColumn: 25
+ }
+ ]
}
]
})
diff --git a/tests/lib/rules/no-implicit-coercion.js b/tests/lib/rules/no-implicit-coercion.js
index 4b49bb3d3..78e8ac91e 100644
--- a/tests/lib/rules/no-implicit-coercion.js
+++ b/tests/lib/rules/no-implicit-coercion.js
@@ -49,9 +49,7 @@ tester.run('no-implicit-coercion', rule, {
]
},
``,
- ...(semver.gte(ESLint.version, '8.28.0')
- ? [``]
- : []),
+ ``,
{
filename: 'test.vue',
code: ``,
@@ -118,7 +116,9 @@ tester.run('no-implicit-coercion', rule, {
{
message: getExpectedErrorMessage('Boolean(foo)'),
line: 1,
- column: 27
+ column: 27,
+ endLine: 1,
+ endColumn: 32
}
]
},
@@ -130,7 +130,9 @@ tester.run('no-implicit-coercion', rule, {
{
message: getExpectedErrorMessage("foo.indexOf('.') !== -1"),
line: 1,
- column: 27
+ column: 27,
+ endLine: 1,
+ endColumn: 44
}
]
},
@@ -145,6 +147,8 @@ tester.run('no-implicit-coercion', rule, {
message: getExpectedErrorMessage('Number(foo)'),
line: 1,
column: 27,
+ endLine: 1,
+ endColumn: 31,
suggestions: semver.gte(ESLint.version, '9.0.0')
? [
{
@@ -168,6 +172,8 @@ tester.run('no-implicit-coercion', rule, {
message: getExpectedErrorMessage('Number(foo)'),
line: 1,
column: 27,
+ endLine: 1,
+ endColumn: 34,
suggestions: semver.gte(ESLint.version, '9.0.0')
? [
{
@@ -191,6 +197,8 @@ tester.run('no-implicit-coercion', rule, {
message: getExpectedErrorMessage('String(foo)'),
line: 1,
column: 27,
+ endLine: 1,
+ endColumn: 35,
suggestions: semver.gte(ESLint.version, '9.0.0')
? [
{
@@ -214,6 +222,8 @@ tester.run('no-implicit-coercion', rule, {
message: getExpectedErrorMessage('String(foo)'),
line: 1,
column: 27,
+ endLine: 1,
+ endColumn: 35,
suggestions: semver.gte(ESLint.version, '9.0.0')
? [
{
@@ -226,38 +236,35 @@ tester.run('no-implicit-coercion', rule, {
}
]
},
- ...(semver.gte(ESLint.version, '7.24.0')
- ? [
- {
- filename: 'test.vue',
- code: ``,
- output: semver.gte(ESLint.version, '9.0.0')
- ? null
- : ``,
- options: [
- {
- disallowTemplateShorthand: true
- }
- ],
- errors: [
- {
- message: getExpectedErrorMessage('String(foo)'),
- line: 1,
- column: 27,
- suggestions: semver.gte(ESLint.version, '9.0.0')
- ? [
- {
- messageId: 'useRecommendation',
- data: { recommendation: 'String(foo)' },
- output:
- ''
- }
- ]
- : []
- }
- ]
- }
- ]
- : [])
+ {
+ filename: 'test.vue',
+ code: ``,
+ output: semver.gte(ESLint.version, '9.0.0')
+ ? null
+ : ``,
+ options: [
+ {
+ disallowTemplateShorthand: true
+ }
+ ],
+ errors: [
+ {
+ message: getExpectedErrorMessage('String(foo)'),
+ line: 1,
+ column: 27,
+ endLine: 1,
+ endColumn: 35,
+ suggestions: semver.gte(ESLint.version, '9.0.0')
+ ? [
+ {
+ messageId: 'useRecommendation',
+ data: { recommendation: 'String(foo)' },
+ output: ''
+ }
+ ]
+ : []
+ }
+ ]
+ }
]
})
diff --git a/tests/lib/rules/no-import-compiler-macros.js b/tests/lib/rules/no-import-compiler-macros.js
index d74a268a0..96d7a61db 100644
--- a/tests/lib/rules/no-import-compiler-macros.js
+++ b/tests/lib/rules/no-import-compiler-macros.js
@@ -55,7 +55,9 @@ tester.run('no-import-compiler-macros', rule, {
name: 'defineProps'
},
line: 3,
- column: 16
+ column: 16,
+ endLine: 3,
+ endColumn: 27
}
]
},
@@ -83,7 +85,9 @@ tester.run('no-import-compiler-macros', rule, {
name: 'defineProps'
},
line: 5,
- column: 9
+ column: 9,
+ endLine: 5,
+ endColumn: 20
}
]
},
@@ -110,7 +114,9 @@ tester.run('no-import-compiler-macros', rule, {
name: 'defineProps'
},
line: 3,
- column: 21
+ column: 21,
+ endLine: 3,
+ endColumn: 32
},
{
messageId: 'noImportCompilerMacros',
@@ -118,7 +124,9 @@ tester.run('no-import-compiler-macros', rule, {
name: 'defineEmits'
},
line: 4,
- column: 16
+ column: 16,
+ endLine: 4,
+ endColumn: 27
},
{
messageId: 'noImportCompilerMacros',
@@ -126,7 +134,9 @@ tester.run('no-import-compiler-macros', rule, {
name: 'defineExpose'
},
line: 5,
- column: 16
+ column: 16,
+ endLine: 5,
+ endColumn: 28
},
{
messageId: 'noImportCompilerMacros',
@@ -134,7 +144,9 @@ tester.run('no-import-compiler-macros', rule, {
name: 'withDefaults'
},
line: 5,
- column: 37
+ column: 37,
+ endLine: 5,
+ endColumn: 49
}
]
},
@@ -157,7 +169,9 @@ tester.run('no-import-compiler-macros', rule, {
name: 'defineModel'
},
line: 3,
- column: 16
+ column: 16,
+ endLine: 3,
+ endColumn: 27
},
{
messageId: 'noImportCompilerMacros',
@@ -165,7 +179,9 @@ tester.run('no-import-compiler-macros', rule, {
name: 'defineOptions'
},
line: 3,
- column: 29
+ column: 29,
+ endLine: 3,
+ endColumn: 42
}
]
},
@@ -193,7 +209,57 @@ tester.run('no-import-compiler-macros', rule, {
name: 'defineSlots'
},
line: 3,
- column: 31
+ column: 31,
+ endLine: 3,
+ endColumn: 60
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ output: `
+
+ `,
+ errors: [
+ {
+ messageId: 'onlyValidInScriptSetup',
+ data: {
+ name: 'defineProps'
+ },
+ line: 4,
+ column: 16,
+ endLine: 4,
+ endColumn: 27
+ }
+ ]
+ },
+ {
+ filename: 'test.ts',
+ code: `
+ import { defineProps } from 'vue'
+ `,
+ output: `
+
+ `,
+ errors: [
+ {
+ messageId: 'onlyValidInScriptSetup',
+ data: {
+ name: 'defineProps'
+ },
+ line: 2,
+ column: 16,
+ endLine: 2,
+ endColumn: 27
}
]
}
diff --git a/tests/lib/rules/no-lifecycle-after-await.js b/tests/lib/rules/no-lifecycle-after-await.js
index 9314eb5bd..f08379e0e 100644
--- a/tests/lib/rules/no-lifecycle-after-await.js
+++ b/tests/lib/rules/no-lifecycle-after-await.js
@@ -212,47 +212,80 @@ tester.run('no-lifecycle-after-await', rule, {
errors: [
{
messageId: 'forbidden',
- line: 8
+ line: 8,
+ column: 11,
+ endLine: 8,
+ endColumn: 45
},
{
messageId: 'forbidden',
- line: 9
+ line: 9,
+ column: 11,
+ endLine: 9,
+ endColumn: 47
},
{
messageId: 'forbidden',
- line: 10
+ line: 10,
+ column: 11,
+ endLine: 10,
+ endColumn: 46
},
{
messageId: 'forbidden',
- line: 11
+ line: 11,
+ column: 11,
+ endLine: 11,
+ endColumn: 47
},
{
messageId: 'forbidden',
- line: 12
+ line: 12,
+ column: 11,
+ endLine: 12,
+ endColumn: 41
},
{
messageId: 'forbidden',
- line: 13
+ line: 13,
+ column: 11,
+ endLine: 13,
+ endColumn: 47
},
{
messageId: 'forbidden',
- line: 14
+ line: 14,
+ column: 11,
+ endLine: 14,
+ endColumn: 49
},
{
messageId: 'forbidden',
- line: 15
+ line: 15,
+ column: 11,
+ endLine: 15,
+ endColumn: 43
},
{
messageId: 'forbidden',
- line: 16
+ line: 16,
+ column: 11,
+ endLine: 16,
+ endColumn: 41
},
{
messageId: 'forbidden',
- line: 17
+ line: 17,
+ column: 11,
+ endLine: 17,
+ endColumn: 43
},
{
messageId: 'forbidden',
- line: 18
+ line: 18,
+ column: 11,
+ endLine: 18,
+ endColumn: 45
}
]
},
@@ -272,7 +305,11 @@ tester.run('no-lifecycle-after-await', rule, {
`,
errors: [
{
- messageId: 'forbidden'
+ messageId: 'forbidden',
+ line: 8,
+ column: 11,
+ endLine: 8,
+ endColumn: 43
}
]
}
diff --git a/tests/lib/rules/no-lone-template.js b/tests/lib/rules/no-lone-template.js
index 12fd4f89f..e8ef0eaf9 100644
--- a/tests/lib/rules/no-lone-template.js
+++ b/tests/lib/rules/no-lone-template.js
@@ -135,7 +135,15 @@ tester.run('no-lone-template', rule, {
`,
- errors: ['`` require directive.']
+ errors: [
+ {
+ message: '`` require directive.',
+ line: 3,
+ column: 9,
+ endLine: 3,
+ endColumn: 20
+ }
+ ]
},
{
filename: 'test.vue',
@@ -145,7 +153,15 @@ tester.run('no-lone-template', rule, {
`,
options: [{ ignoreAccessible: true }],
- errors: ['`` require directive.']
+ errors: [
+ {
+ message: '`` require directive.',
+ line: 3,
+ column: 9,
+ endLine: 3,
+ endColumn: 31
+ }
+ ]
},
{
filename: 'test.vue',
@@ -155,7 +171,15 @@ tester.run('no-lone-template', rule, {
`,
options: [{ ignoreAccessible: true }],
- errors: ['`` require directive.']
+ errors: [
+ {
+ message: '`` require directive.',
+ line: 3,
+ column: 9,
+ endLine: 3,
+ endColumn: 31
+ }
+ ]
},
{
filename: 'test.vue',
@@ -165,7 +189,15 @@ tester.run('no-lone-template', rule, {
`,
options: [{ ignoreAccessible: true }],
- errors: ['`` require directive.']
+ errors: [
+ {
+ message: '`` require directive.',
+ line: 3,
+ column: 9,
+ endLine: 3,
+ endColumn: 37
+ }
+ ]
},
{
filename: 'test.vue',
@@ -175,7 +207,15 @@ tester.run('no-lone-template', rule, {
`,
options: [{ ignoreAccessible: true }],
- errors: ['`` require directive.']
+ errors: [
+ {
+ message: '`` require directive.',
+ line: 3,
+ column: 9,
+ endLine: 3,
+ endColumn: 29
+ }
+ ]
}
]
})
diff --git a/tests/lib/rules/no-loss-of-precision.js b/tests/lib/rules/no-loss-of-precision.js
index 749914193..1b60a33ca 100644
--- a/tests/lib/rules/no-loss-of-precision.js
+++ b/tests/lib/rules/no-loss-of-precision.js
@@ -4,8 +4,7 @@
*/
'use strict'
-const { RuleTester, ESLint } = require('../../eslint-compat')
-const semver = require('semver')
+const { RuleTester } = require('../../eslint-compat')
const rule = require('../../../lib/rules/no-loss-of-precision')
const tester = new RuleTester({
@@ -17,77 +16,66 @@ const tester = new RuleTester({
})
tester.run('no-loss-of-precision', rule, {
valid: [
- ...(semver.gte(ESLint.version, '7.1.0')
- ? [
- {
- filename: 'test.vue',
- code: `
-
- {{12345}}
- {{123.45}}
-
- `
- },
- {
- filename: 'test.vue',
- code: `
-
-
-
- `
- }
- ]
- : [])
+ {
+ filename: 'test.vue',
+ code: `
+
+ {{12345}}
+ {{123.45}}
+
+ `
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `
+ }
],
invalid: [
- ...(semver.gte(ESLint.version, '7.1.0')
- ? [
- {
- filename: 'test.vue',
- code: `
-
- {{12345678901234567890}}
- {{0.12345678901234567890}}
-
- `,
- errors: [
- {
- message: 'This number literal will lose precision at runtime.',
- line: 3
- },
- {
- message: 'This number literal will lose precision at runtime.',
- line: 4
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
-
-
- `,
- errors: [
- {
- message: 'This number literal will lose precision at runtime.',
- line: 3
- }
- ]
- }
- ]
- : [
- {
- filename: 'test.vue',
- code: `
-
-
-
- `,
- errors: [
- 'Failed to extend ESLint core rule "no-loss-of-precision". You may be able to use this rule by upgrading the version of ESLint. If you cannot upgrade it, turn off this rule.'
- ]
- }
- ])
+ {
+ filename: 'test.vue',
+ code: `
+
+ {{12345678901234567890}}
+ {{0.12345678901234567890}}
+
+ `,
+ errors: [
+ {
+ message: 'This number literal will lose precision at runtime.',
+ line: 3,
+ column: 13,
+ endLine: 3,
+ endColumn: 33
+ },
+ {
+ message: 'This number literal will lose precision at runtime.',
+ line: 4,
+ column: 13,
+ endLine: 4,
+ endColumn: 35
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ errors: [
+ {
+ message: 'This number literal will lose precision at runtime.',
+ line: 3,
+ column: 30,
+ endLine: 3,
+ endColumn: 50
+ }
+ ]
+ }
]
})
diff --git a/tests/lib/rules/no-multi-spaces.js b/tests/lib/rules/no-multi-spaces.js
index be4440858..5f33a25e7 100644
--- a/tests/lib/rules/no-multi-spaces.js
+++ b/tests/lib/rules/no-multi-spaces.js
@@ -73,6 +73,38 @@ ruleTester.run('no-multi-spaces', rule, {
ignoreProperties: true
}
]
+ },
+ {
+ code: `
+
+
+
+ `,
+ options: [
+ {
+ ignoreEOLComments: true
+ }
+ ]
+ },
+ {
+ code: `
+
+
+
+ `,
+ options: [
+ {
+ ignoreEOLComments: true
+ }
+ ]
}
],
invalid: [
@@ -82,7 +114,10 @@ ruleTester.run('no-multi-spaces', rule, {
errors: [
{
message: "Multiple spaces found before '/>'.",
- type: 'HTMLSelfClosingTagClose'
+ line: 1,
+ column: 15,
+ endLine: 1,
+ endColumn: 20
}
]
},
@@ -92,11 +127,17 @@ ruleTester.run('no-multi-spaces', rule, {
errors: [
{
message: "Multiple spaces found before 'class'.",
- type: 'HTMLIdentifier'
+ line: 1,
+ column: 15,
+ endLine: 1,
+ endColumn: 18
},
{
message: "Multiple spaces found before '/>'.",
- type: 'HTMLSelfClosingTagClose'
+ line: 1,
+ column: 29,
+ endLine: 1,
+ endColumn: 31
}
]
},
@@ -106,11 +147,17 @@ ruleTester.run('no-multi-spaces', rule, {
errors: [
{
message: "Multiple spaces found before 'class'.",
- type: 'HTMLIdentifier'
+ line: 1,
+ column: 15,
+ endLine: 1,
+ endColumn: 17
},
{
message: "Multiple spaces found before '/>'.",
- type: 'HTMLSelfClosingTagClose'
+ line: 1,
+ column: 28,
+ endLine: 1,
+ endColumn: 30
}
]
},
@@ -120,11 +167,17 @@ ruleTester.run('no-multi-spaces', rule, {
errors: [
{
message: "Multiple spaces found before ':'.",
- type: 'Punctuator'
+ line: 1,
+ column: 15,
+ endLine: 1,
+ endColumn: 18
},
{
message: "Multiple spaces found before '/>'.",
- type: 'HTMLSelfClosingTagClose'
+ line: 1,
+ column: 30,
+ endLine: 1,
+ endColumn: 32
}
]
},
@@ -134,7 +187,10 @@ ruleTester.run('no-multi-spaces', rule, {
errors: [
{
message: "Multiple spaces found before '/>'.",
- type: 'HTMLSelfClosingTagClose'
+ line: 1,
+ column: 35,
+ endLine: 1,
+ endColumn: 37
}
]
},
@@ -144,7 +200,10 @@ ruleTester.run('no-multi-spaces', rule, {
errors: [
{
message: "Multiple spaces found before '/>'.",
- type: 'HTMLSelfClosingTagClose'
+ line: 1,
+ column: 34,
+ endLine: 1,
+ endColumn: 36
}
]
},
@@ -154,7 +213,10 @@ ruleTester.run('no-multi-spaces', rule, {
errors: [
{
message: "Multiple spaces found before '/>'.",
- type: 'HTMLSelfClosingTagClose'
+ line: 1,
+ column: 36,
+ endLine: 1,
+ endColumn: 38
}
]
},
@@ -164,7 +226,10 @@ ruleTester.run('no-multi-spaces', rule, {
errors: [
{
message: "Multiple spaces found before '/>'.",
- type: 'HTMLSelfClosingTagClose'
+ line: 2,
+ column: 21,
+ endLine: 2,
+ endColumn: 25
}
]
},
@@ -174,11 +239,17 @@ ruleTester.run('no-multi-spaces', rule, {
errors: [
{
message: "Multiple spaces found before 'test'.",
- type: 'Identifier'
+ line: 1,
+ column: 18,
+ endLine: 1,
+ endColumn: 20
},
{
message: "Multiple spaces found before '}}'.",
- type: 'VExpressionEnd'
+ line: 1,
+ column: 24,
+ endLine: 1,
+ endColumn: 26
}
]
},
@@ -188,7 +259,10 @@ ruleTester.run('no-multi-spaces', rule, {
errors: [
{
message: "Multiple spaces found before '>'.",
- type: 'HTMLTagClose'
+ line: 1,
+ column: 15,
+ endLine: 1,
+ endColumn: 30
}
]
},
@@ -198,19 +272,31 @@ ruleTester.run('no-multi-spaces', rule, {
errors: [
{
message: "Multiple spaces found before 'i'.",
- type: 'Identifier'
+ line: 1,
+ column: 23,
+ endLine: 1,
+ endColumn: 29
},
{
message: "Multiple spaces found before 'in'.",
- type: 'Keyword'
+ line: 1,
+ column: 30,
+ endLine: 1,
+ endColumn: 34
},
{
message: "Multiple spaces found before 'b'.",
- type: 'Identifier'
+ line: 1,
+ column: 36,
+ endLine: 1,
+ endColumn: 40
},
{
message: "Multiple spaces found before '\"'.",
- type: 'Punctuator'
+ line: 1,
+ column: 41,
+ endLine: 1,
+ endColumn: 48
}
]
},
@@ -238,7 +324,10 @@ ruleTester.run('no-multi-spaces', rule, {
errors: [
{
message: "Multiple spaces found before ':'.",
- type: 'Punctuator'
+ line: 5,
+ column: 26,
+ endLine: 5,
+ endColumn: 29
}
]
},
@@ -266,7 +355,136 @@ ruleTester.run('no-multi-spaces', rule, {
errors: [
{
message: "Multiple spaces found before 'isExpanded'.",
- type: 'Identifier'
+ line: 5,
+ column: 27,
+ endLine: 5,
+ endColumn: 30
+ }
+ ]
+ },
+ {
+ code: `
+
+
+
+ `,
+ output: `
+
+
+
+ `,
+ errors: [
+ {
+ message: "Multiple spaces found before '// comment'.",
+ line: 5,
+ column: 23,
+ endLine: 5,
+ endColumn: 25
+ }
+ ]
+ },
+ {
+ code: `
+
+
+
+ `,
+ output: `
+
+
+
+ `,
+ errors: [
+ {
+ message: "Multiple spaces found before '/* multiline comment */'.",
+ line: 5,
+ column: 23,
+ endLine: 5,
+ endColumn: 25
+ }
+ ]
+ },
+ {
+ code: `
+
+
+
+ `,
+ output: `
+
+
+
+ `,
+ options: [
+ {
+ ignoreEOLComments: false
+ }
+ ],
+ errors: [
+ {
+ message: "Multiple spaces found before '// comment'.",
+ line: 5,
+ column: 23,
+ endLine: 5,
+ endColumn: 25
+ }
+ ]
+ },
+ {
+ code: `
+
+
+
+ `,
+ output: `
+
+
+
+ `,
+ options: [
+ {
+ ignoreEOLComments: false
+ }
+ ],
+ errors: [
+ {
+ message: "Multiple spaces found before '/* multiline comment */'.",
+ line: 5,
+ column: 23,
+ endLine: 5,
+ endColumn: 25
}
]
}
diff --git a/tests/lib/rules/no-multiple-objects-in-class.js b/tests/lib/rules/no-multiple-objects-in-class.js
index 0c1a4d1b4..46805fb14 100644
--- a/tests/lib/rules/no-multiple-objects-in-class.js
+++ b/tests/lib/rules/no-multiple-objects-in-class.js
@@ -26,7 +26,10 @@ ruleTester.run('no-multiple-objects-in-class', rule, {
errors: [
{
message: 'Unexpected multiple objects. Merge objects.',
- type: 'VAttribute'
+ line: 1,
+ column: 16,
+ endLine: 1,
+ endColumn: 63
}
]
},
@@ -35,7 +38,10 @@ ruleTester.run('no-multiple-objects-in-class', rule, {
errors: [
{
message: 'Unexpected multiple objects. Merge objects.',
- type: 'VAttribute'
+ line: 1,
+ column: 16,
+ endLine: 1,
+ endColumn: 57
}
]
},
@@ -46,7 +52,10 @@ ruleTester.run('no-multiple-objects-in-class', rule, {
errors: [
{
message: 'Unexpected multiple objects. Merge objects.',
- type: 'VAttribute'
+ line: 1,
+ column: 16,
+ endLine: 1,
+ endColumn: 64
}
]
}
diff --git a/tests/lib/rules/no-multiple-slot-args.js b/tests/lib/rules/no-multiple-slot-args.js
index cbd0bbfba..4bce33be7 100644
--- a/tests/lib/rules/no-multiple-slot-args.js
+++ b/tests/lib/rules/no-multiple-slot-args.js
@@ -120,10 +120,34 @@ ruleTester.run('no-multiple-slot-args', rule, {
`,
errors: [
- 'Unexpected multiple arguments.',
- 'Unexpected multiple arguments.',
- 'Unexpected multiple arguments.',
- 'Unexpected multiple arguments.'
+ {
+ message: 'Unexpected multiple arguments.',
+ line: 5,
+ column: 46,
+ endLine: 5,
+ endColumn: 49
+ },
+ {
+ message: 'Unexpected multiple arguments.',
+ line: 6,
+ column: 42,
+ endLine: 6,
+ endColumn: 45
+ },
+ {
+ message: 'Unexpected multiple arguments.',
+ line: 8,
+ column: 44,
+ endLine: 8,
+ endColumn: 47
+ },
+ {
+ message: 'Unexpected multiple arguments.',
+ line: 9,
+ column: 40,
+ endLine: 9,
+ endColumn: 43
+ }
]
},
{
@@ -142,10 +166,34 @@ ruleTester.run('no-multiple-slot-args', rule, {
`,
errors: [
- 'Unexpected multiple arguments.',
- 'Unexpected multiple arguments.',
- 'Unexpected multiple arguments.',
- 'Unexpected multiple arguments.'
+ {
+ message: 'Unexpected multiple arguments.',
+ line: 5,
+ column: 44,
+ endLine: 5,
+ endColumn: 47
+ },
+ {
+ message: 'Unexpected multiple arguments.',
+ line: 6,
+ column: 40,
+ endLine: 6,
+ endColumn: 43
+ },
+ {
+ message: 'Unexpected multiple arguments.',
+ line: 8,
+ column: 42,
+ endLine: 8,
+ endColumn: 45
+ },
+ {
+ message: 'Unexpected multiple arguments.',
+ line: 9,
+ column: 38,
+ endLine: 9,
+ endColumn: 41
+ }
]
},
{
@@ -164,8 +212,20 @@ ruleTester.run('no-multiple-slot-args', rule, {
`,
errors: [
- 'Unexpected multiple arguments.',
- 'Unexpected multiple arguments.'
+ {
+ message: 'Unexpected multiple arguments.',
+ line: 5,
+ column: 49,
+ endLine: 5,
+ endColumn: 52
+ },
+ {
+ message: 'Unexpected multiple arguments.',
+ line: 8,
+ column: 47,
+ endLine: 8,
+ endColumn: 50
+ }
]
},
{
@@ -184,8 +244,20 @@ ruleTester.run('no-multiple-slot-args', rule, {
`,
errors: [
- 'Unexpected multiple arguments.',
- 'Unexpected multiple arguments.'
+ {
+ message: 'Unexpected multiple arguments.',
+ line: 5,
+ column: 46,
+ endLine: 5,
+ endColumn: 49
+ },
+ {
+ message: 'Unexpected multiple arguments.',
+ line: 8,
+ column: 44,
+ endLine: 8,
+ endColumn: 47
+ }
]
},
{
@@ -235,8 +307,20 @@ ruleTester.run('no-multiple-slot-args', rule, {
`,
errors: [
- 'Unexpected multiple arguments.',
- 'Unexpected multiple arguments.'
+ {
+ message: 'Unexpected multiple arguments.',
+ line: 6,
+ column: 36,
+ endLine: 6,
+ endColumn: 39
+ },
+ {
+ message: 'Unexpected multiple arguments.',
+ line: 7,
+ column: 32,
+ endLine: 7,
+ endColumn: 35
+ }
]
}
]
diff --git a/tests/lib/rules/no-multiple-template-root.js b/tests/lib/rules/no-multiple-template-root.js
index c52c1c202..9a07204fc 100644
--- a/tests/lib/rules/no-multiple-template-root.js
+++ b/tests/lib/rules/no-multiple-template-root.js
@@ -122,48 +122,123 @@ ruleTester.run('no-multiple-template-root', rule, {
`,
options: [{ disallowComments: true }]
+ },
+
+ // https://github.com/vuejs/eslint-plugin-vue/issues/2948
+ {
+ code: `
+
+
+ abc
+
+ `,
+ options: [{ disallowComments: true }]
}
],
invalid: [
{
filename: 'test.vue',
code: '',
- errors: ['The template root requires exactly one element.']
+ errors: [
+ {
+ message: 'The template root requires exactly one element.',
+ line: 1,
+ column: 22,
+ endLine: 1,
+ endColumn: 33
+ }
+ ]
},
{
filename: 'test.vue',
code: '\n \n \n',
- errors: ['The template root requires exactly one element.']
+ errors: [
+ {
+ message: 'The template root requires exactly one element.',
+ line: 3,
+ column: 5,
+ endLine: 3,
+ endColumn: 16
+ }
+ ]
},
{
filename: 'test.vue',
code: '{{a b c}}',
- errors: ['The template root requires an element rather than texts.']
+ errors: [
+ {
+ message: 'The template root requires an element rather than texts.',
+ line: 1,
+ column: 11,
+ endLine: 1,
+ endColumn: 20
+ }
+ ]
},
{
filename: 'test.vue',
code: 'aaaaaa',
- errors: ['The template root requires an element rather than texts.']
+ errors: [
+ {
+ message: 'The template root requires an element rather than texts.',
+ line: 1,
+ column: 22,
+ endLine: 1,
+ endColumn: 28
+ }
+ ]
},
{
filename: 'test.vue',
code: 'aaaaaa',
- errors: ['The template root requires an element rather than texts.']
+ errors: [
+ {
+ message: 'The template root requires an element rather than texts.',
+ line: 1,
+ column: 11,
+ endLine: 1,
+ endColumn: 17
+ }
+ ]
},
{
filename: 'test.vue',
code: '',
- errors: ["The template root disallows 'v-for' directives."]
+ errors: [
+ {
+ message: "The template root disallows 'v-for' directives.",
+ line: 1,
+ column: 11,
+ endLine: 1,
+ endColumn: 34
+ }
+ ]
},
{
filename: 'test.vue',
code: '',
- errors: ["The template root disallows '' elements."]
+ errors: [
+ {
+ message: "The template root disallows '' elements.",
+ line: 1,
+ column: 11,
+ endLine: 1,
+ endColumn: 17
+ }
+ ]
},
{
filename: 'test.vue',
code: '',
- errors: ["The template root disallows '' elements."]
+ errors: [
+ {
+ message: "The template root disallows '' elements.",
+ line: 1,
+ column: 11,
+ endLine: 1,
+ endColumn: 21
+ }
+ ]
},
{
code: `
@@ -177,11 +252,17 @@ ruleTester.run('no-multiple-template-root', rule, {
errors: [
{
message: 'The template root disallows comments.',
- line: 3
+ line: 3,
+ column: 9,
+ endLine: 3,
+ endColumn: 26
},
{
message: 'The template root disallows comments.',
- line: 5
+ line: 5,
+ column: 9,
+ endLine: 5,
+ endColumn: 26
}
]
},
@@ -199,7 +280,10 @@ ruleTester.run('no-multiple-template-root', rule, {
errors: [
{
message: 'The template root disallows comments.',
- line: 3
+ line: 3,
+ column: 9,
+ endLine: 3,
+ endColumn: 26
}
]
},
@@ -227,15 +311,24 @@ ruleTester.run('no-multiple-template-root', rule, {
errors: [
{
message: 'The template root disallows comments.',
- line: 3
+ line: 3,
+ column: 9,
+ endLine: 3,
+ endColumn: 26
},
{
message: 'The template root disallows comments.',
- line: 12
+ line: 12,
+ column: 9,
+ endLine: 12,
+ endColumn: 26
},
{
message: 'The template root disallows comments.',
- line: 17
+ line: 17,
+ column: 9,
+ endLine: 17,
+ endColumn: 26
}
]
},
@@ -253,7 +346,10 @@ ruleTester.run('no-multiple-template-root', rule, {
errors: [
{
message: 'The template root disallows comments.',
- line: 7
+ line: 7,
+ column: 9,
+ endLine: 7,
+ endColumn: 26
}
]
},
@@ -269,18 +365,24 @@ ruleTester.run('no-multiple-template-root', rule, {
errors: [
{
message: 'The template root disallows comments.',
- line: 4
+ line: 4,
+ column: 9,
+ endLine: 4,
+ endColumn: 26
},
{
message: 'The template root requires exactly one element.',
- line: 5
+ line: 5,
+ column: 9,
+ endLine: 5,
+ endColumn: 16
}
]
},
{
code: `
-
12333
@@ -289,7 +391,15 @@ ruleTester.run('no-multiple-template-root', rule, {
`,
options: [{ disallowComments: true }],
- errors: ['The template root disallows comments.']
+ errors: [
+ {
+ message: 'The template root disallows comments.',
+ line: 3,
+ column: 9,
+ endLine: 4,
+ endColumn: 96
+ }
+ ]
}
]
})
diff --git a/tests/lib/rules/no-mutating-props.js b/tests/lib/rules/no-mutating-props.js
index f47568a46..1448ef22a 100644
--- a/tests/lib/rules/no-mutating-props.js
+++ b/tests/lib/rules/no-mutating-props.js
@@ -413,6 +413,22 @@ ruleTester.run('no-mutating-props', rule, {
const foo = ref('')
`
+ },
+ {
+ // Object.assign not mutating the prop
+ filename: 'test.vue',
+ code: `
+
+ `
}
],
@@ -442,31 +458,52 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "prop1" prop.',
- line: 4
+ line: 4,
+ column: 24,
+ endLine: 4,
+ endColumn: 38
},
{
message: 'Unexpected mutation of "prop2" prop.',
- line: 5
+ line: 5,
+ column: 24,
+ endLine: 5,
+ endColumn: 31
},
{
message: 'Unexpected mutation of "prop3" prop.',
- line: 6
+ line: 6,
+ column: 26,
+ endLine: 6,
+ endColumn: 39
},
{
message: 'Unexpected mutation of "prop5" prop.',
- line: 8
+ line: 8,
+ column: 24,
+ endLine: 8,
+ endColumn: 60
},
{
message: 'Unexpected mutation of "prop6" prop.',
- line: 9
+ line: 9,
+ column: 24,
+ endLine: 9,
+ endColumn: 36
},
{
message: 'Unexpected mutation of "prop7" prop.',
- line: 10
+ line: 10,
+ column: 26,
+ endLine: 10,
+ endColumn: 44
},
{
message: 'Unexpected mutation of "prop9" prop.',
- line: 12
+ line: 12,
+ column: 24,
+ endLine: 12,
+ endColumn: 38
}
]
},
@@ -490,8 +527,20 @@ ruleTester.run('no-mutating-props', rule, {
`,
errors: [
- 'Unexpected mutation of "prop1" prop.',
- 'Unexpected mutation of "prop5" prop.'
+ {
+ message: 'Unexpected mutation of "prop1" prop.',
+ line: 4,
+ column: 26,
+ endLine: 4,
+ endColumn: 42
+ },
+ {
+ message: 'Unexpected mutation of "prop5" prop.',
+ line: 8,
+ column: 26,
+ endLine: 8,
+ endColumn: 48
+ }
]
},
{
@@ -511,9 +560,27 @@ ruleTester.run('no-mutating-props', rule, {
`,
errors: [
- 'Unexpected mutation of "prop1" prop.',
- 'Unexpected mutation of "prop2" prop.',
- 'Unexpected mutation of "prop3" prop.'
+ {
+ message: 'Unexpected mutation of "prop1" prop.',
+ line: 4,
+ column: 26,
+ endLine: 4,
+ endColumn: 44
+ },
+ {
+ message: 'Unexpected mutation of "prop2" prop.',
+ line: 5,
+ column: 26,
+ endLine: 5,
+ endColumn: 50
+ },
+ {
+ message: 'Unexpected mutation of "prop3" prop.',
+ line: 6,
+ column: 26,
+ endLine: 6,
+ endColumn: 50
+ }
]
},
{
@@ -536,19 +603,31 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "prop1" prop.',
- line: 4
+ line: 4,
+ column: 29,
+ endLine: 4,
+ endColumn: 39
},
{
message: 'Unexpected mutation of "prop2" prop.',
- line: 5
+ line: 5,
+ column: 29,
+ endLine: 5,
+ endColumn: 34
},
{
message: 'Unexpected mutation of "prop3" prop.',
- line: 6
+ line: 6,
+ column: 29,
+ endLine: 6,
+ endColumn: 44
},
{
message: 'Unexpected mutation of "prop4" prop.',
- line: 7
+ line: 7,
+ column: 29,
+ endLine: 7,
+ endColumn: 39
}
]
},
@@ -581,19 +660,31 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "items" prop.',
- line: 16
+ line: 16,
+ column: 17,
+ endLine: 16,
+ endColumn: 29
},
{
message: 'Unexpected mutation of "todo" prop.',
- line: 17
+ line: 17,
+ column: 17,
+ endLine: 17,
+ endColumn: 45
},
{
message: 'Unexpected mutation of "items" prop.',
- line: 18
+ line: 18,
+ column: 17,
+ endLine: 18,
+ endColumn: 45
},
{
message: 'Unexpected mutation of "todo" prop.',
- line: 19
+ line: 19,
+ column: 17,
+ endLine: 19,
+ endColumn: 38
}
]
},
@@ -614,9 +705,27 @@ ruleTester.run('no-mutating-props', rule, {
`,
errors: [
- 'Unexpected mutation of "foo" prop.',
- 'Unexpected mutation of "bar" prop.',
- 'Unexpected mutation of "baz" prop.'
+ {
+ message: 'Unexpected mutation of "foo" prop.',
+ line: 7,
+ column: 17,
+ endLine: 7,
+ endColumn: 47
+ },
+ {
+ message: 'Unexpected mutation of "bar" prop.',
+ line: 8,
+ column: 18,
+ endLine: 8,
+ endColumn: 50
+ },
+ {
+ message: 'Unexpected mutation of "baz" prop.',
+ line: 9,
+ column: 18,
+ endLine: 9,
+ endColumn: 50
+ }
]
},
{
@@ -641,7 +750,10 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "prop" prop.',
- line: 8
+ line: 8,
+ column: 31,
+ endLine: 8,
+ endColumn: 35
}
]
},
@@ -666,11 +778,17 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "prop" prop.',
- line: 5
+ line: 5,
+ column: 31,
+ endLine: 5,
+ endColumn: 40
},
{
message: 'Unexpected mutation of "prop" prop.',
- line: 7
+ line: 7,
+ column: 28,
+ endLine: 7,
+ endColumn: 45
}
]
},
@@ -698,15 +816,24 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "prop" prop.',
- line: 4
+ line: 4,
+ column: 38,
+ endLine: 4,
+ endColumn: 47
},
{
message: 'Unexpected mutation of "prop" prop.',
- line: 5
+ line: 5,
+ column: 38,
+ endLine: 5,
+ endColumn: 42
},
{
message: 'Unexpected mutation of "prop" prop.',
- line: 10
+ line: 10,
+ column: 40,
+ endLine: 10,
+ endColumn: 49
}
]
},
@@ -743,27 +870,45 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "prop1" prop.',
- line: 4
+ line: 4,
+ column: 24,
+ endLine: 4,
+ endColumn: 38
},
{
message: 'Unexpected mutation of "prop2" prop.',
- line: 5
+ line: 5,
+ column: 24,
+ endLine: 5,
+ endColumn: 31
},
{
message: 'Unexpected mutation of "prop5" prop.',
- line: 8
+ line: 8,
+ column: 24,
+ endLine: 8,
+ endColumn: 60
},
{
message: 'Unexpected mutation of "prop6" prop.',
- line: 9
+ line: 9,
+ column: 24,
+ endLine: 9,
+ endColumn: 36
},
{
message: 'Unexpected mutation of "prop10" prop.',
- line: 13
+ line: 13,
+ column: 24,
+ endLine: 13,
+ endColumn: 42
},
{
message: 'Unexpected mutation of "prop10" prop.',
- line: 22
+ line: 22,
+ column: 17,
+ endLine: 22,
+ endColumn: 35
}
]
},
@@ -786,19 +931,31 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "a" prop.',
- line: 5
+ line: 5,
+ column: 15,
+ endLine: 5,
+ endColumn: 25
},
{
message: 'Unexpected mutation of "b" prop.',
- line: 6
+ line: 6,
+ column: 15,
+ endLine: 6,
+ endColumn: 26
},
{
message: 'Unexpected mutation of "c" prop.',
- line: 7
+ line: 7,
+ column: 15,
+ endLine: 7,
+ endColumn: 30
},
{
message: 'Unexpected mutation of "d" prop.',
- line: 8
+ line: 8,
+ column: 15,
+ endLine: 8,
+ endColumn: 29
}
]
},
@@ -823,31 +980,52 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "a" prop.',
- line: 5
+ line: 5,
+ column: 15,
+ endLine: 5,
+ endColumn: 23
},
{
message: 'Unexpected mutation of "b" prop.',
- line: 6
+ line: 6,
+ column: 15,
+ endLine: 6,
+ endColumn: 24
},
{
message: 'Unexpected mutation of "c" prop.',
- line: 7
+ line: 7,
+ column: 15,
+ endLine: 7,
+ endColumn: 24
},
{
message: 'Unexpected mutation of "c" prop.',
- line: 9
+ line: 9,
+ column: 15,
+ endLine: 9,
+ endColumn: 26
},
{
message: 'Unexpected mutation of "c" prop.',
- line: 10
+ line: 10,
+ column: 15,
+ endLine: 10,
+ endColumn: 25
},
{
message: 'Unexpected mutation of "d" prop.',
- line: 11
+ line: 11,
+ column: 15,
+ endLine: 11,
+ endColumn: 22
},
{
message: 'Unexpected mutation of "d" prop.',
- line: 12
+ line: 12,
+ column: 15,
+ endLine: 12,
+ endColumn: 22
}
]
},
@@ -869,19 +1047,31 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "a" prop.',
- line: 5
+ line: 5,
+ column: 15,
+ endLine: 5,
+ endColumn: 23
},
{
message: 'Unexpected mutation of "a" prop.',
- line: 6
+ line: 6,
+ column: 15,
+ endLine: 6,
+ endColumn: 27
},
{
message: 'Unexpected mutation of "b" prop.',
- line: 7
+ line: 7,
+ column: 15,
+ endLine: 7,
+ endColumn: 24
},
{
message: 'Unexpected mutation of "c" prop.',
- line: 8
+ line: 8,
+ column: 15,
+ endLine: 8,
+ endColumn: 26
}
]
},
@@ -902,19 +1092,31 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "a" prop.',
- line: 5
+ line: 5,
+ column: 15,
+ endLine: 5,
+ endColumn: 25
},
{
message: 'Unexpected mutation of "b" prop.',
- line: 6
+ line: 6,
+ column: 15,
+ endLine: 6,
+ endColumn: 26
},
{
message: 'Unexpected mutation of "c" prop.',
- line: 7
+ line: 7,
+ column: 15,
+ endLine: 7,
+ endColumn: 30
},
{
message: 'Unexpected mutation of "d" prop.',
- line: 8
+ line: 8,
+ column: 15,
+ endLine: 8,
+ endColumn: 29
}
]
},
@@ -929,7 +1131,15 @@ ruleTester.run('no-mutating-props', rule, {
}
`,
- errors: ['Unexpected mutation of "[a]" prop.']
+ errors: [
+ {
+ message: 'Unexpected mutation of "[a]" prop.',
+ line: 5,
+ column: 15,
+ endLine: 5,
+ endColumn: 26
+ }
+ ]
},
{
filename: 'test.vue',
@@ -942,7 +1152,15 @@ ruleTester.run('no-mutating-props', rule, {
}
`,
- errors: ['Unexpected mutation of "[a]" prop.']
+ errors: [
+ {
+ message: 'Unexpected mutation of "[a]" prop.',
+ line: 5,
+ column: 15,
+ endLine: 5,
+ endColumn: 23
+ }
+ ]
},
{
@@ -959,7 +1177,10 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "[foo]" prop.',
- line: 7
+ line: 7,
+ column: 27,
+ endLine: 7,
+ endColumn: 37
}
]
},
@@ -979,11 +1200,17 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "value" prop.',
- line: 3
+ line: 3,
+ column: 27,
+ endLine: 3,
+ endColumn: 32
},
{
message: 'Unexpected mutation of "value" prop.',
- line: 4
+ line: 4,
+ column: 27,
+ endLine: 4,
+ endColumn: 38
}
]
},
@@ -1000,7 +1227,10 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "value" prop.',
- line: 6
+ line: 6,
+ column: 9,
+ endLine: 6,
+ endColumn: 22
}
]
},
@@ -1017,7 +1247,10 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "value" prop.',
- line: 6
+ line: 6,
+ column: 9,
+ endLine: 6,
+ endColumn: 22
}
]
},
@@ -1039,7 +1272,10 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "value" prop.',
- line: 6
+ line: 6,
+ column: 9,
+ endLine: 6,
+ endColumn: 22
}
]
},
@@ -1066,19 +1302,31 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "a" prop.',
- line: 5
+ line: 5,
+ column: 15,
+ endLine: 5,
+ endColumn: 25
},
{
message: 'Unexpected mutation of "b" prop.',
- line: 6
+ line: 6,
+ column: 15,
+ endLine: 6,
+ endColumn: 26
},
{
message: 'Unexpected mutation of "d" prop.',
- line: 8
+ line: 8,
+ column: 15,
+ endLine: 8,
+ endColumn: 29
},
{
message: 'Unexpected mutation of "a" prop.',
- line: 11
+ line: 11,
+ column: 17,
+ endLine: 11,
+ endColumn: 27
}
]
},
@@ -1109,19 +1357,31 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "bar" prop.',
- line: 4
+ line: 4,
+ column: 27,
+ endLine: 4,
+ endColumn: 30
},
{
message: 'Unexpected mutation of "window" prop.',
- line: 5
+ line: 5,
+ column: 27,
+ endLine: 5,
+ endColumn: 33
},
{
message: 'Unexpected mutation of "Infinity" prop.',
- line: 6
+ line: 6,
+ column: 27,
+ endLine: 6,
+ endColumn: 35
},
{
message: 'Unexpected mutation of "obj" prop.',
- line: 18
+ line: 18,
+ column: 9,
+ endLine: 18,
+ endColumn: 19
}
]
},
@@ -1149,19 +1409,56 @@ ruleTester.run('no-mutating-props', rule, {
errors: [
{
message: 'Unexpected mutation of "a" prop.',
- line: 3
+ line: 3,
+ column: 27,
+ endLine: 3,
+ endColumn: 37
},
{
message: 'Unexpected mutation of "a" prop.',
- line: 4
+ line: 4,
+ column: 27,
+ endLine: 4,
+ endColumn: 31
},
{
message: 'Unexpected mutation of "a" prop.',
- line: 7
+ line: 7,
+ column: 27,
+ endLine: 7,
+ endColumn: 34
},
{
message: 'Unexpected mutation of "a" prop.',
- line: 15
+ line: 15,
+ column: 11,
+ endLine: 15,
+ endColumn: 21
+ }
+ ]
+ },
+ {
+ // Object.assign mutating the prop as first argument
+ filename: 'test.vue',
+ code: `
+
+ `,
+ errors: [
+ {
+ message: 'Unexpected mutation of "data" prop.',
+ line: 7,
+ column: 24,
+ endLine: 7,
+ endColumn: 68
}
]
}
diff --git a/tests/lib/rules/no-negated-v-if-condition.js b/tests/lib/rules/no-negated-v-if-condition.js
index ee60562ea..0b97c7909 100644
--- a/tests/lib/rules/no-negated-v-if-condition.js
+++ b/tests/lib/rules/no-negated-v-if-condition.js
@@ -149,8 +149,14 @@ tester.run('no-negated-v-if-condition', rule, {
filename: 'test.vue',
code: `
- Content
- Alternative
+ Content
+ Alternative
+
+ `,
+ output: `
+
+ Alternative
+ Content
`,
errors: [
@@ -159,18 +165,7 @@ tester.run('no-negated-v-if-condition', rule, {
line: 3,
column: 20,
endLine: 3,
- endColumn: 24,
- suggestions: [
- {
- messageId: 'fixNegatedCondition',
- output: `
-
- Alternative
- Content
-
- `
- }
- ]
+ endColumn: 24
}
]
},
@@ -178,8 +173,14 @@ tester.run('no-negated-v-if-condition', rule, {
filename: 'test.vue',
code: `
- Negated condition
- Otherwise
+ Negated condition
+ Otherwise
+
+ `,
+ output: `
+
+ Otherwise
+ Negated condition
`,
errors: [
@@ -188,18 +189,7 @@ tester.run('no-negated-v-if-condition', rule, {
line: 3,
column: 20,
endLine: 3,
- endColumn: 33,
- suggestions: [
- {
- messageId: 'fixNegatedCondition',
- output: `
-
- Otherwise
- Negated condition
-
- `
- }
- ]
+ endColumn: 33
}
]
},
@@ -211,24 +201,19 @@ tester.run('no-negated-v-if-condition', rule, {
Equal
`,
+ output: `
+
+ Equal
+ Not equal
+
+ `,
errors: [
{
messageId: 'negatedCondition',
line: 3,
column: 20,
endLine: 3,
- endColumn: 26,
- suggestions: [
- {
- messageId: 'fixNegatedCondition',
- output: `
-
- Equal
- Not equal
-
- `
- }
- ]
+ endColumn: 26
}
]
},
@@ -240,24 +225,45 @@ tester.run('no-negated-v-if-condition', rule, {
Strictly equal
`,
+ output: `
+
+ Strictly equal
+ Strictly not equal
+
+ `,
errors: [
{
messageId: 'negatedCondition',
line: 3,
column: 20,
endLine: 3,
- endColumn: 27,
- suggestions: [
- {
- messageId: 'fixNegatedCondition',
- output: `
+ endColumn: 27
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
- Strictly equal
- Strictly not equal
+ First
+ Second
+ Default
- `
- }
- ]
+ `,
+ output: `
+
+ First
+ Default
+ Second
+
+ `,
+ errors: [
+ {
+ messageId: 'negatedCondition',
+ line: 4,
+ column: 26,
+ endLine: 4,
+ endColumn: 30
}
]
},
@@ -265,30 +271,49 @@ tester.run('no-negated-v-if-condition', rule, {
filename: 'test.vue',
code: `
- First
- Second
- Default
+ First
+ Second
+ Default
+
+ `,
+ output: `
+
+ First
+ Default
+ Second
`,
errors: [
{
messageId: 'negatedCondition',
line: 4,
- column: 25,
+ column: 26,
endLine: 4,
- endColumn: 29,
- suggestions: [
- {
- messageId: 'fixNegatedCondition',
- output: `
+ endColumn: 28
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
- First
- Default
- Second
+ div contents
+ span contents
- `
- }
- ]
+ `,
+ output: `
+
+ span contents
+ div contents
+
+ `,
+ errors: [
+ {
+ messageId: 'negatedCondition',
+ line: 3,
+ column: 20,
+ endLine: 3,
+ endColumn: 30
}
]
},
@@ -296,30 +321,49 @@ tester.run('no-negated-v-if-condition', rule, {
filename: 'test.vue',
code: `
- First
- Second
- Default
+
+
Inner if content
+
Inner else content
+
+
+ Nested if content
+ Nested else content
+
+
+ `,
+ output: `
+
+
+ Nested if content
+ Nested else content
+
+
+
Inner if content
+
Inner else content
+
`,
errors: [
+ {
+ messageId: 'negatedCondition',
+ line: 3,
+ column: 20,
+ endLine: 3,
+ endColumn: 26
+ },
{
messageId: 'negatedCondition',
line: 4,
- column: 25,
+ column: 23,
endLine: 4,
- endColumn: 27,
- suggestions: [
- {
- messageId: 'fixNegatedCondition',
- output: `
-
- First
- Default
- Second
-
- `
- }
- ]
+ endColumn: 29
+ },
+ {
+ messageId: 'negatedCondition',
+ line: 8,
+ column: 23,
+ endLine: 8,
+ endColumn: 30
}
]
}
diff --git a/tests/lib/rules/no-parsing-error.js b/tests/lib/rules/no-parsing-error.js
index 1408fb7d8..9225e4bda 100644
--- a/tests/lib/rules/no-parsing-error.js
+++ b/tests/lib/rules/no-parsing-error.js
@@ -80,13 +80,11 @@ tester.run('no-parsing-error', rule, {
},
{
code: '
`,
options: [{ 'abrupt-closing-of-empty-comment': true }],
- errors: ['Parsing error: abrupt-closing-of-empty-comment.']
+ errors: [
+ {
+ message: 'Parsing error: abrupt-closing-of-empty-comment.',
+ line: 1,
+ column: 15
+ }
+ ]
},
{
code: `
`,
options: [{ 'abrupt-closing-of-empty-comment': true }],
- errors: ['Parsing error: abrupt-closing-of-empty-comment.']
+ errors: [
+ {
+ message: 'Parsing error: abrupt-closing-of-empty-comment.',
+ line: 1,
+ column: 16
+ }
+ ]
},
{
code: `
qux;`,
options: [{ 'absence-of-digits-in-numeric-character-reference': true }],
errors: [
- 'Parsing error: absence-of-digits-in-numeric-character-reference.'
+ {
+ message:
+ 'Parsing error: absence-of-digits-in-numeric-character-reference.',
+ line: 1,
+ column: 13
+ }
]
},
{
code: '
',
options: [{ 'cdata-in-html-content': true }],
- errors: ['Parsing error: cdata-in-html-content.']
+ errors: [
+ {
+ message: 'Parsing error: cdata-in-html-content.',
+ line: 1,
+ column: 19
+ }
+ ]
},
{
code: '
',
options: [{ 'character-reference-outside-unicode-range': true }],
- errors: ['Parsing error: character-reference-outside-unicode-range.']
+ errors: [
+ {
+ message: 'Parsing error: character-reference-outside-unicode-range.',
+ line: 1,
+ column: 21
+ }
+ ]
},
{
code: '
\u0003',
options: [{ 'control-character-in-input-stream': true }],
- errors: ['Parsing error: control-character-in-input-stream.']
+ errors: [
+ {
+ message: 'Parsing error: control-character-in-input-stream.',
+ line: 1,
+ column: 10
+ }
+ ]
},
{
code: '
',
options: [{ 'control-character-reference': true }],
- errors: ['Parsing error: control-character-reference.']
+ errors: [
+ {
+ message: 'Parsing error: control-character-reference.',
+ line: 1,
+ column: 18
+ }
+ ]
},
{
code: '
<',
options: [{ 'eof-before-tag-name': true }],
- errors: ['Parsing error: eof-before-tag-name.']
+ errors: [
+ {
+ message: 'Parsing error: eof-before-tag-name.',
+ line: 1,
+ column: 12
+ }
+ ]
},
{
code: '',
options: [{ 'incorrectly-closed-comment': true }],
- errors: ['Parsing error: incorrectly-closed-comment.']
+ errors: [
+ {
+ message: 'Parsing error: incorrectly-closed-comment.',
+ line: 1,
+ column: 25
+ }
+ ]
},
{
code: '',
options: [{ 'incorrectly-opened-comment': true }],
- errors: ['Parsing error: incorrectly-opened-comment.']
+ errors: [
+ {
+ message: 'Parsing error: incorrectly-opened-comment.',
+ line: 1,
+ column: 13
+ }
+ ]
},
{
code: '<👍>/template>',
options: [{ 'invalid-first-character-of-tag-name': true }],
- errors: ['Parsing error: invalid-first-character-of-tag-name.']
+ errors: [
+ {
+ message: 'Parsing error: invalid-first-character-of-tag-name.',
+ line: 1,
+ column: 12
+ }
+ ]
},
{
code: '',
options: [{ 'missing-attribute-value': true }],
- errors: ['Parsing error: missing-attribute-value.']
+ errors: [
+ {
+ message: 'Parsing error: missing-attribute-value.',
+ line: 1,
+ column: 19
+ }
+ ]
},
{
code: '
>',
options: [{ 'missing-end-tag-name': true }],
- errors: ['Parsing error: missing-end-tag-name.']
+ errors: [
+ {
+ message: 'Parsing error: missing-end-tag-name.',
+ line: 1,
+ column: 13
+ }
+ ]
},
{
code: '
&',
options: [{ 'missing-semicolon-after-character-reference': true }],
- errors: ['Parsing error: missing-semicolon-after-character-reference.']
+ errors: [
+ {
+ message:
+ 'Parsing error: missing-semicolon-after-character-reference.',
+ line: 1,
+ column: 14
+ }
+ ]
},
{
code: '
',
options: [{ 'missing-whitespace-between-attributes': true }],
- errors: ['Parsing error: missing-whitespace-between-attributes.']
+ errors: [
+ {
+ message: 'Parsing error: missing-whitespace-between-attributes.',
+ line: 1,
+ column: 24
+ }
+ ]
},
{
code: '
',
options: [{ 'nested-comment': true }],
- errors: ['Parsing error: nested-comment.']
+ errors: [
+ {
+ message: 'Parsing error: nested-comment.',
+ line: 1,
+ column: 20
+ }
+ ]
},
{
code: '
',
options: [{ 'noncharacter-character-reference': true }],
- errors: ['Parsing error: noncharacter-character-reference.']
+ errors: [
+ {
+ message: 'Parsing error: noncharacter-character-reference.',
+ line: 1,
+ column: 19
+ }
+ ]
},
{
code: '
\uFFFE',
options: [{ 'noncharacter-in-input-stream': true }],
- errors: ['Parsing error: noncharacter-in-input-stream.']
+ errors: [
+ {
+ message: 'Parsing error: noncharacter-in-input-stream.',
+ line: 1,
+ column: 10
+ }
+ ]
},
{
code: '
',
options: [{ 'null-character-reference': true }],
- errors: ['Parsing error: null-character-reference.']
+ errors: [
+ {
+ message: 'Parsing error: null-character-reference.',
+ line: 1,
+ column: 18
+ }
+ ]
},
{
code: '
',
options: [{ 'surrogate-character-reference': true }],
- errors: ['Parsing error: surrogate-character-reference.']
+ errors: [
+ {
+ message: 'Parsing error: surrogate-character-reference.',
+ line: 1,
+ column: 19
+ }
+ ]
},
{
code: '
\uD800',
options: [{ 'surrogate-in-input-stream': true }],
- errors: ['Parsing error: surrogate-in-input-stream.']
+ errors: [
+ {
+ message: 'Parsing error: surrogate-in-input-stream.',
+ line: 1,
+ column: 10
+ }
+ ]
},
{
code: '
',
options: [{ 'unexpected-character-in-attribute-name': true }],
- errors: ['Parsing error: unexpected-character-in-attribute-name.']
+ errors: [
+ {
+ message: 'Parsing error: unexpected-character-in-attribute-name.',
+ line: 1,
+ column: 17
+ }
+ ]
},
{
code: '
',
options: [{ 'unexpected-character-in-unquoted-attribute-value': true }],
errors: [
- 'Parsing error: unexpected-character-in-unquoted-attribute-value.'
+ {
+ message:
+ 'Parsing error: unexpected-character-in-unquoted-attribute-value.',
+ line: 1,
+ column: 23
+ }
]
},
{
code: '
',
options: [{ 'unexpected-equals-sign-before-attribute-name': true }],
- errors: ['Parsing error: unexpected-equals-sign-before-attribute-name.']
+ errors: [
+ {
+ message:
+ 'Parsing error: unexpected-equals-sign-before-attribute-name.',
+ line: 1,
+ column: 16
+ }
+ ]
},
{
code: '
\u0000',
options: [{ 'unexpected-null-character': true }],
- errors: ['Parsing error: unexpected-null-character.']
+ errors: [
+ {
+ message: 'Parsing error: unexpected-null-character.',
+ line: 1,
+ column: 11
+ }
+ ]
},
{
code: '
',
options: [{ 'unexpected-question-mark-instead-of-tag-name': true }],
- errors: ['Parsing error: unexpected-question-mark-instead-of-tag-name.']
+ errors: [
+ {
+ message:
+ 'Parsing error: unexpected-question-mark-instead-of-tag-name.',
+ line: 1,
+ column: 12
+ }
+ ]
},
{
code: '
',
options: [{ 'unexpected-solidus-in-tag': true }],
- errors: ['Parsing error: unexpected-solidus-in-tag.']
+ errors: [
+ {
+ message: 'Parsing error: unexpected-solidus-in-tag.',
+ line: 1,
+ column: 23
+ }
+ ]
},
{
code: '
&unknown;',
options: [{ 'unknown-named-character-reference': true }],
- errors: ['Parsing error: unknown-named-character-reference.']
+ errors: [
+ {
+ message: 'Parsing error: unknown-named-character-reference.',
+ line: 1,
+ column: 19
+ }
+ ]
},
{
code: '
',
options: [{ 'end-tag-with-attributes': true }],
- errors: ['Parsing error: end-tag-with-attributes.']
+ errors: [
+ {
+ message: 'Parsing error: end-tag-with-attributes.',
+ line: 1,
+ column: 22
+ }
+ ]
},
{
code: '
',
options: [{ 'duplicate-attribute': true }],
- errors: ['Parsing error: duplicate-attribute.']
+ errors: [
+ {
+ message: 'Parsing error: duplicate-attribute.',
+ line: 1,
+ column: 22
+ }
+ ]
},
{
code: '
',
options: [{ 'end-tag-with-trailing-solidus': true }],
- errors: ['Parsing error: end-tag-with-trailing-solidus.']
+ errors: [
+ {
+ message: 'Parsing error: end-tag-with-trailing-solidus.',
+ line: 1,
+ column: 21
+ }
+ ]
},
{
code: '
',
@@ -446,166 +676,400 @@ tester.run('no-parsing-error', rule, {
{ 'non-void-html-element-start-tag-with-trailing-solidus': true }
],
errors: [
- 'Parsing error: non-void-html-element-start-tag-with-trailing-solidus.'
+ {
+ message:
+ 'Parsing error: non-void-html-element-start-tag-with-trailing-solidus.',
+ line: 1,
+ column: 11
+ }
]
},
{
code: '
',
options: [{ 'x-invalid-end-tag': true }],
- errors: ['Parsing error: x-invalid-end-tag.']
+ errors: [
+ {
+ message: 'Parsing error: x-invalid-end-tag.',
+ line: 1,
+ column: 11
+ }
+ ]
},
{
code: '
',
options: [{ 'x-invalid-namespace': true }],
- errors: ['Parsing error: x-invalid-namespace.']
+ errors: [
+ {
+ message: 'Parsing error: x-invalid-namespace.',
+ line: 1,
+ column: 16
+ }
+ ]
},
{
code: `
`,
- errors: ['Parsing error: abrupt-closing-of-empty-comment.']
+ errors: [
+ {
+ message: 'Parsing error: abrupt-closing-of-empty-comment.',
+ line: 1,
+ column: 15
+ }
+ ]
},
{
code: `
`,
- errors: ['Parsing error: abrupt-closing-of-empty-comment.']
+ errors: [
+ {
+ message: 'Parsing error: abrupt-closing-of-empty-comment.',
+ line: 1,
+ column: 16
+ }
+ ]
},
{
code: `
qux;`,
errors: [
- 'Parsing error: absence-of-digits-in-numeric-character-reference.'
+ {
+ message:
+ 'Parsing error: absence-of-digits-in-numeric-character-reference.',
+ line: 1,
+ column: 13
+ }
]
},
{
code: '
',
- errors: ['Parsing error: cdata-in-html-content.']
+ errors: [
+ {
+ message: 'Parsing error: cdata-in-html-content.',
+ line: 1,
+ column: 19
+ }
+ ]
},
{
code: '
',
- errors: ['Parsing error: character-reference-outside-unicode-range.']
+ errors: [
+ {
+ message: 'Parsing error: character-reference-outside-unicode-range.',
+ line: 1,
+ column: 21
+ }
+ ]
},
{
code: '
\u0003',
- errors: ['Parsing error: control-character-in-input-stream.']
+ errors: [
+ {
+ message: 'Parsing error: control-character-in-input-stream.',
+ line: 1,
+ column: 10
+ }
+ ]
},
{
code: '
',
- errors: ['Parsing error: control-character-reference.']
+ errors: [
+ {
+ message: 'Parsing error: control-character-reference.',
+ line: 1,
+ column: 18
+ }
+ ]
},
{
code: '
<',
- errors: ['Parsing error: eof-before-tag-name.']
+ errors: [
+ {
+ message: 'Parsing error: eof-before-tag-name.',
+ line: 1,
+ column: 12
+ }
+ ]
},
{
code: '',
- errors: ['Parsing error: incorrectly-closed-comment.']
+ errors: [
+ {
+ message: 'Parsing error: incorrectly-closed-comment.',
+ line: 1,
+ column: 25
+ }
+ ]
},
{
code: '',
- errors: ['Parsing error: incorrectly-opened-comment.']
+ errors: [
+ {
+ message: 'Parsing error: incorrectly-opened-comment.',
+ line: 1,
+ column: 13
+ }
+ ]
},
{
code: '<👍>/template>',
- errors: ['Parsing error: invalid-first-character-of-tag-name.']
+ errors: [
+ {
+ message: 'Parsing error: invalid-first-character-of-tag-name.',
+ line: 1,
+ column: 12
+ }
+ ]
},
{
code: '',
- errors: ['Parsing error: missing-attribute-value.']
+ errors: [
+ {
+ message: 'Parsing error: missing-attribute-value.',
+ line: 1,
+ column: 19
+ }
+ ]
},
{
code: '
>',
- errors: ['Parsing error: missing-end-tag-name.']
+ errors: [
+ {
+ message: 'Parsing error: missing-end-tag-name.',
+ line: 1,
+ column: 13
+ }
+ ]
},
{
code: '
&',
- errors: ['Parsing error: missing-semicolon-after-character-reference.']
+ errors: [
+ {
+ message:
+ 'Parsing error: missing-semicolon-after-character-reference.',
+ line: 1,
+ column: 14
+ }
+ ]
},
{
code: '
',
- errors: ['Parsing error: missing-whitespace-between-attributes.']
+ errors: [
+ {
+ message: 'Parsing error: missing-whitespace-between-attributes.',
+ line: 1,
+ column: 24
+ }
+ ]
},
{
code: '
',
- errors: ['Parsing error: nested-comment.']
+ errors: [
+ {
+ message: 'Parsing error: nested-comment.',
+ line: 1,
+ column: 20
+ }
+ ]
},
{
code: '
',
- errors: ['Parsing error: noncharacter-character-reference.']
+ errors: [
+ {
+ message: 'Parsing error: noncharacter-character-reference.',
+ line: 1,
+ column: 19
+ }
+ ]
},
{
code: '
\uFFFE',
- errors: ['Parsing error: noncharacter-in-input-stream.']
+ errors: [
+ {
+ message: 'Parsing error: noncharacter-in-input-stream.',
+ line: 1,
+ column: 10
+ }
+ ]
},
{
code: '
',
- errors: ['Parsing error: null-character-reference.']
+ errors: [
+ {
+ message: 'Parsing error: null-character-reference.',
+ line: 1,
+ column: 18
+ }
+ ]
},
{
code: '
',
- errors: ['Parsing error: surrogate-character-reference.']
+ errors: [
+ {
+ message: 'Parsing error: surrogate-character-reference.',
+ line: 1,
+ column: 19
+ }
+ ]
},
{
code: '
\uD800',
- errors: ['Parsing error: surrogate-in-input-stream.']
+ errors: [
+ {
+ message: 'Parsing error: surrogate-in-input-stream.',
+ line: 1,
+ column: 10
+ }
+ ]
},
{
code: '
',
- errors: ['Parsing error: unexpected-character-in-attribute-name.']
+ errors: [
+ {
+ message: 'Parsing error: unexpected-character-in-attribute-name.',
+ line: 1,
+ column: 17
+ }
+ ]
},
{
code: '
',
errors: [
- 'Parsing error: unexpected-character-in-unquoted-attribute-value.'
+ {
+ message:
+ 'Parsing error: unexpected-character-in-unquoted-attribute-value.',
+ line: 1,
+ column: 23
+ }
]
},
{
code: '
',
- errors: ['Parsing error: unexpected-equals-sign-before-attribute-name.']
+ errors: [
+ {
+ message:
+ 'Parsing error: unexpected-equals-sign-before-attribute-name.',
+ line: 1,
+ column: 16
+ }
+ ]
},
{
code: '
\u0000',
- errors: ['Parsing error: unexpected-null-character.']
+ errors: [
+ {
+ message: 'Parsing error: unexpected-null-character.',
+ line: 1,
+ column: 11
+ }
+ ]
},
{
code: '
',
- errors: ['Parsing error: unexpected-question-mark-instead-of-tag-name.']
+ errors: [
+ {
+ message:
+ 'Parsing error: unexpected-question-mark-instead-of-tag-name.',
+ line: 1,
+ column: 12
+ }
+ ]
},
{
code: '
',
- errors: ['Parsing error: unexpected-solidus-in-tag.']
+ errors: [
+ {
+ message: 'Parsing error: unexpected-solidus-in-tag.',
+ line: 1,
+ column: 23
+ }
+ ]
},
{
code: '
&unknown;',
- errors: ['Parsing error: unknown-named-character-reference.']
+ errors: [
+ {
+ message: 'Parsing error: unknown-named-character-reference.',
+ line: 1,
+ column: 19
+ }
+ ]
},
{
code: '
',
- errors: ['Parsing error: end-tag-with-attributes.']
+ errors: [
+ {
+ message: 'Parsing error: end-tag-with-attributes.',
+ line: 1,
+ column: 22
+ }
+ ]
},
{
code: '
',
- errors: ['Parsing error: duplicate-attribute.']
+ errors: [
+ {
+ message: 'Parsing error: duplicate-attribute.',
+ line: 1,
+ column: 22
+ }
+ ]
},
{
code: '
',
- errors: ['Parsing error: end-tag-with-trailing-solidus.']
+ errors: [
+ {
+ message: 'Parsing error: end-tag-with-trailing-solidus.',
+ line: 1,
+ column: 21
+ }
+ ]
},
{
code: '
',
- errors: ['Parsing error: x-invalid-end-tag.']
+ errors: [
+ {
+ message: 'Parsing error: x-invalid-end-tag.',
+ line: 1,
+ column: 11
+ }
+ ]
},
{
code: '
',
- errors: ['Parsing error: x-invalid-namespace.']
+ errors: [
+ {
+ message: 'Parsing error: x-invalid-namespace.',
+ line: 1,
+ column: 16
+ }
+ ]
},
//style vars
diff --git a/tests/lib/rules/no-potential-component-option-typo.js b/tests/lib/rules/no-potential-component-option-typo.js
index 0b9fad541..63a6a42cf 100644
--- a/tests/lib/rules/no-potential-component-option-typo.js
+++ b/tests/lib/rules/no-potential-component-option-typo.js
@@ -183,6 +183,8 @@ tester.run('no-potential-component-option-typo', rule, {
message: "'dat' may be a typo, which is similar to option [data].",
line: 4,
column: 9,
+ endLine: 4,
+ endColumn: 12,
suggestions: [
{
desc: `Replace property 'dat' to 'data'`,
@@ -200,6 +202,8 @@ tester.run('no-potential-component-option-typo', rule, {
message: `'method' may be a typo, which is similar to option [methods].`,
line: 5,
column: 9,
+ endLine: 5,
+ endColumn: 15,
suggestions: [
{
desc: `Replace property 'method' to 'methods'`,
@@ -235,6 +239,8 @@ tester.run('no-potential-component-option-typo', rule, {
message: "'dat' may be a typo, which is similar to option [data].",
line: 4,
column: 9,
+ endLine: 4,
+ endColumn: 12,
suggestions: [
{
desc: `Replace property 'dat' to 'data'`,
@@ -253,6 +259,8 @@ tester.run('no-potential-component-option-typo', rule, {
message: `'method' may be a typo, which is similar to option [methods].`,
line: 5,
column: 9,
+ endLine: 5,
+ endColumn: 15,
suggestions: [
{
desc: `Replace property 'method' to 'methods'`,
@@ -271,6 +279,8 @@ tester.run('no-potential-component-option-typo', rule, {
message: `'custo' may be a typo, which is similar to option [custom].`,
line: 6,
column: 9,
+ endLine: 6,
+ endColumn: 14,
suggestions: [
{
desc: `Replace property 'custo' to 'custom'`,
@@ -303,6 +313,8 @@ tester.run('no-potential-component-option-typo', rule, {
message: "'dat' may be a typo, which is similar to option [data].",
line: 4,
column: 9,
+ endLine: 4,
+ endColumn: 12,
suggestions: [
{
desc: `Replace property 'dat' to 'data'`,
@@ -320,6 +332,8 @@ tester.run('no-potential-component-option-typo', rule, {
message: `'method' may be a typo, which is similar to option [methods].`,
line: 5,
column: 9,
+ endLine: 5,
+ endColumn: 15,
suggestions: [
{
desc: `Replace property 'method' to 'methods'`,
@@ -352,6 +366,8 @@ tester.run('no-potential-component-option-typo', rule, {
message: "'dat' may be a typo, which is similar to option [data].",
line: 4,
column: 9,
+ endLine: 4,
+ endColumn: 12,
suggestions: [
{
desc: `Replace property 'dat' to 'data'`,
@@ -371,6 +387,8 @@ tester.run('no-potential-component-option-typo', rule, {
"'beforeRouteEntr' may be a typo, which is similar to option [beforeRouteEnter].",
line: 5,
column: 9,
+ endLine: 5,
+ endColumn: 24,
suggestions: [
{
desc: `Replace property 'beforeRouteEntr' to 'beforeRouteEnter'`,
@@ -389,6 +407,8 @@ tester.run('no-potential-component-option-typo', rule, {
message: `'method' may be a typo, which is similar to option [methods].`,
line: 6,
column: 9,
+ endLine: 6,
+ endColumn: 15,
suggestions: [
{
desc: `Replace property 'method' to 'methods'`,
@@ -420,6 +440,8 @@ tester.run('no-potential-component-option-typo', rule, {
message: `'method' may be a typo, which is similar to option [methods,data].`,
line: 4,
column: 9,
+ endLine: 4,
+ endColumn: 15,
suggestions: [
{
desc: `Replace property 'method' to 'methods'`,
diff --git a/tests/lib/rules/no-ref-as-operand.js b/tests/lib/rules/no-ref-as-operand.js
index 9db2ab3a0..86cd7bd54 100644
--- a/tests/lib/rules/no-ref-as-operand.js
+++ b/tests/lib/rules/no-ref-as-operand.js
@@ -490,7 +490,10 @@ tester.run('no-ref-as-operand', rule, {
errors: [
{
messageId: 'requireDotValue',
- line: 4
+ line: 4,
+ column: 11,
+ endLine: 4,
+ endColumn: 14
}
]
},
@@ -512,7 +515,10 @@ tester.run('no-ref-as-operand', rule, {
errors: [
{
messageId: 'requireDotValue',
- line: 4
+ line: 4,
+ column: 15,
+ endLine: 4,
+ endColumn: 18
}
]
},
@@ -536,19 +542,31 @@ tester.run('no-ref-as-operand', rule, {
errors: [
{
messageId: 'requireDotValue',
- line: 4
+ line: 4,
+ column: 16,
+ endLine: 4,
+ endColumn: 19
},
{
messageId: 'requireDotValue',
- line: 5
+ line: 5,
+ column: 16,
+ endLine: 5,
+ endColumn: 19
},
{
messageId: 'requireDotValue',
- line: 6
+ line: 6,
+ column: 16,
+ endLine: 6,
+ endColumn: 19
},
{
messageId: 'requireDotValue',
- line: 7
+ line: 7,
+ column: 16,
+ endLine: 7,
+ endColumn: 19
}
]
},
@@ -572,19 +590,31 @@ tester.run('no-ref-as-operand', rule, {
errors: [
{
messageId: 'requireDotValue',
- line: 4
+ line: 4,
+ column: 7,
+ endLine: 4,
+ endColumn: 10
},
{
messageId: 'requireDotValue',
- line: 5
+ line: 5,
+ column: 7,
+ endLine: 5,
+ endColumn: 10
},
{
messageId: 'requireDotValue',
- line: 6
+ line: 6,
+ column: 14,
+ endLine: 6,
+ endColumn: 17
},
{
messageId: 'requireDotValue',
- line: 7
+ line: 7,
+ column: 14,
+ endLine: 7,
+ endColumn: 17
}
]
},
@@ -604,11 +634,17 @@ tester.run('no-ref-as-operand', rule, {
errors: [
{
messageId: 'requireDotValue',
- line: 4
+ line: 4,
+ column: 15,
+ endLine: 4,
+ endColumn: 18
},
{
messageId: 'requireDotValue',
- line: 5
+ line: 5,
+ column: 15,
+ endLine: 5,
+ endColumn: 18
}
]
},
@@ -626,7 +662,10 @@ tester.run('no-ref-as-operand', rule, {
errors: [
{
messageId: 'requireDotValue',
- line: 4
+ line: 4,
+ column: 15,
+ endLine: 4,
+ endColumn: 18
}
]
},
@@ -666,15 +705,24 @@ tester.run('no-ref-as-operand', rule, {
errors: [
{
messageId: 'requireDotValue',
- line: 7
+ line: 7,
+ column: 13,
+ endLine: 7,
+ endColumn: 18
},
{
messageId: 'requireDotValue',
- line: 8
+ line: 8,
+ column: 25,
+ endLine: 8,
+ endColumn: 30
},
{
messageId: 'requireDotValue',
- line: 9
+ line: 9,
+ column: 29,
+ endLine: 9,
+ endColumn: 34
}
]
},
@@ -763,27 +811,42 @@ tester.run('no-ref-as-operand', rule, {
{
message:
'Must use `.value` to read or write the value wrapped by `ref()`.',
- line: 33
+ line: 33,
+ column: 9,
+ endLine: 33,
+ endColumn: 14
},
{
message:
'Must use `.value` to read or write the value wrapped by `computed()`.',
- line: 34
+ line: 34,
+ column: 9,
+ endLine: 34,
+ endColumn: 15
},
{
message:
'Must use `.value` to read or write the value wrapped by `toRef()`.',
- line: 36
+ line: 36,
+ column: 22,
+ endLine: 36,
+ endColumn: 28
},
{
message:
'Must use `.value` to read or write the value wrapped by `customRef()`.',
- line: 36
+ line: 36,
+ column: 34,
+ endLine: 36,
+ endColumn: 38
},
{
message:
'Must use `.value` to read or write the value wrapped by `shallowRef()`.',
- line: 38
+ line: 38,
+ column: 19,
+ endLine: 38,
+ endColumn: 22
}
]
},
@@ -804,7 +867,11 @@ tester.run('no-ref-as-operand', rule, {
`,
errors: [
{
- messageId: 'requireDotValue'
+ messageId: 'requireDotValue',
+ line: 5,
+ column: 9,
+ endLine: 5,
+ endColumn: 12
}
]
},
@@ -825,7 +892,11 @@ tester.run('no-ref-as-operand', rule, {
`,
errors: [
{
- messageId: 'requireDotValue'
+ messageId: 'requireDotValue',
+ line: 5,
+ column: 21,
+ endLine: 5,
+ endColumn: 24
}
]
},
@@ -859,7 +930,9 @@ tester.run('no-ref-as-operand', rule, {
message:
'Must use `.value` to read or write the value wrapped by `ref()`.',
line: 10,
- column: 7
+ column: 7,
+ endLine: 10,
+ endColumn: 10
}
]
},
@@ -892,12 +965,18 @@ tester.run('no-ref-as-operand', rule, {
{
message:
'Must use `.value` to read or write the value wrapped by `defineModel()`.',
- line: 6
+ line: 6,
+ column: 13,
+ endLine: 6,
+ endColumn: 18
},
{
message:
'Must use `.value` to read or write the value wrapped by `defineModel()`.',
- line: 9
+ line: 9,
+ column: 9,
+ endLine: 9,
+ endColumn: 14
}
]
},
@@ -930,12 +1009,18 @@ tester.run('no-ref-as-operand', rule, {
{
message:
'Must use `.value` to read or write the value wrapped by `defineModel()`.',
- line: 6
+ line: 6,
+ column: 13,
+ endLine: 6,
+ endColumn: 18
},
{
message:
'Must use `.value` to read or write the value wrapped by `defineModel()`.',
- line: 9
+ line: 9,
+ column: 9,
+ endLine: 9,
+ endColumn: 14
}
]
},
@@ -967,7 +1052,9 @@ tester.run('no-ref-as-operand', rule, {
message:
'Must use `.value` to read or write the value wrapped by `ref()`.',
line: 8,
- endLine: 8
+ column: 23,
+ endLine: 8,
+ endColumn: 28
}
]
},
@@ -1013,7 +1100,9 @@ tester.run('no-ref-as-operand', rule, {
message:
'Must use `.value` to read or write the value wrapped by `ref()`.',
line: 10,
- endLine: 10
+ column: 35,
+ endLine: 10,
+ endColumn: 42
}
]
},
@@ -1059,7 +1148,9 @@ tester.run('no-ref-as-operand', rule, {
message:
'Must use `.value` to read or write the value wrapped by `ref()`.',
line: 10,
- endLine: 10
+ column: 31,
+ endLine: 10,
+ endColumn: 38
}
]
},
@@ -1105,7 +1196,9 @@ tester.run('no-ref-as-operand', rule, {
message:
'Must use `.value` to read or write the value wrapped by `ref()`.',
line: 10,
- endLine: 10
+ column: 38,
+ endLine: 10,
+ endColumn: 45
}
]
},
diff --git a/tests/lib/rules/no-reserved-component-names.js b/tests/lib/rules/no-reserved-component-names.js
index 809d35103..09d9a6f64 100644
--- a/tests/lib/rules/no-reserved-component-names.js
+++ b/tests/lib/rules/no-reserved-component-names.js
@@ -608,8 +608,10 @@ ruleTester.run('no-reserved-component-names', rule, {
? 'reservedInHtml'
: 'reserved',
data: { name },
- type: 'Literal',
- line: 3
+ line: 3,
+ column: 19,
+ endLine: 3,
+ endColumn: 19 + name.length + 2
}
]
})),
@@ -623,8 +625,10 @@ ruleTester.run('no-reserved-component-names', rule, {
? 'reservedInHtml'
: 'reserved',
data: { name },
- type: 'Literal',
- line: 1
+ line: 1,
+ column: 15,
+ endLine: 1,
+ endColumn: 15 + name.length + 2
}
]
})),
@@ -638,8 +642,10 @@ ruleTester.run('no-reserved-component-names', rule, {
? 'reservedInHtml'
: 'reserved',
data: { name },
- type: 'Literal',
- line: 1
+ line: 1,
+ column: 15,
+ endLine: 1,
+ endColumn: 15 + name.length + 2
}
]
})),
@@ -653,8 +659,10 @@ ruleTester.run('no-reserved-component-names', rule, {
? 'reservedInHtml'
: 'reserved',
data: { name },
- type: 'TemplateLiteral',
- line: 1
+ line: 1,
+ column: 15,
+ endLine: 1,
+ endColumn: 15 + name.length + 2
}
]
})),
@@ -668,8 +676,10 @@ ruleTester.run('no-reserved-component-names', rule, {
? 'reservedInHtml'
: 'reserved',
data: { name },
- type: 'TemplateLiteral',
- line: 1
+ line: 1,
+ column: 15,
+ endLine: 1,
+ endColumn: 15 + name.length + 2
}
]
})),
@@ -687,8 +697,10 @@ ruleTester.run('no-reserved-component-names', rule, {
? 'reservedInHtml'
: 'reserved',
data: { name },
- type: 'Property',
- line: 3
+ line: 3,
+ column: 13,
+ endLine: 3,
+ endColumn: 13 + name.length + 6
}
]
})),
@@ -705,7 +717,10 @@ ruleTester.run('no-reserved-component-names', rule, {
? 'reservedInHtml'
: 'reserved',
data: { name },
- line: 1
+ line: 1,
+ column: 37,
+ endLine: 1,
+ endColumn: 37 + name.length + 2
}
]
})),
@@ -723,7 +738,10 @@ ruleTester.run('no-reserved-component-names', rule, {
? 'reservedInHtml'
: 'reserved',
data: { name },
- line: 1
+ line: 1,
+ column: 37,
+ endLine: 1,
+ endColumn: 37 + name.length + 2
}
]
})),
@@ -740,8 +758,10 @@ ruleTester.run('no-reserved-component-names', rule, {
{
messageId: 'reservedInVue',
data: { name },
- type: 'Literal',
- line: 3
+ line: 3,
+ column: 19,
+ endLine: 3,
+ endColumn: 19 + name.length + 2
}
]
})),
@@ -758,8 +778,10 @@ ruleTester.run('no-reserved-component-names', rule, {
{
messageId: 'reservedInVue',
data: { name },
- type: 'Literal',
- line: 3
+ line: 3,
+ column: 19,
+ endLine: 3,
+ endColumn: 19 + name.length + 2
}
]
})),
@@ -776,8 +798,10 @@ ruleTester.run('no-reserved-component-names', rule, {
{
messageId: 'reservedInVue3',
data: { name },
- type: 'Literal',
- line: 3
+ line: 3,
+ column: 19,
+ endLine: 3,
+ endColumn: 19 + name.length + 2
}
]
}))
diff --git a/tests/lib/rules/no-reserved-keys.js b/tests/lib/rules/no-reserved-keys.js
index 277c12c92..7ece338f1 100644
--- a/tests/lib/rules/no-reserved-keys.js
+++ b/tests/lib/rules/no-reserved-keys.js
@@ -4,7 +4,6 @@
*/
'use strict'
-const semver = require('semver')
const rule = require('../../../lib/rules/no-reserved-keys')
const RuleTester = require('../../eslint-compat').RuleTester
@@ -293,15 +292,9 @@ ruleTester.run('no-reserved-keys', rule, {
}
]
},
- ...(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'),
- ecmaVersion: 6,
- parserOptions: {
- parser: require.resolve('@typescript-eslint/parser')
- }
- },
- errors: [
- {
- message: "Key '$el' is reserved.",
- line: 4
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
+ languageOptions: {
+ parser: require('vue-eslint-parser'),
+ ecmaVersion: 6,
+ parserOptions: {
+ parser: require.resolve('@typescript-eslint/parser')
+ }
+ },
+ errors: [
+ {
+ message: "Key '$el' is reserved.",
+ line: 4
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
`,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 6,
- parserOptions: {
- parser: require.resolve('@typescript-eslint/parser')
- }
- },
- errors: [
- {
- message: "Key '$el' is reserved.",
- line: 4
- }
- ]
- }
- ])
+ languageOptions: {
+ parser: require('vue-eslint-parser'),
+ ecmaVersion: 6,
+ parserOptions: {
+ parser: require.resolve('@typescript-eslint/parser')
+ }
+ },
+ errors: [
+ {
+ message: "Key '$el' is reserved.",
+ line: 4
+ }
+ ]
+ }
]
})
diff --git a/tests/lib/rules/no-restricted-class.js b/tests/lib/rules/no-restricted-class.js
index 97cc0b4b1..ae94d4af1 100644
--- a/tests/lib/rules/no-restricted-class.js
+++ b/tests/lib/rules/no-restricted-class.js
@@ -49,7 +49,10 @@ ruleTester.run('no-restricted-class', rule, {
errors: [
{
message: "'forbidden' class is not allowed.",
- type: 'VAttribute'
+ line: 1,
+ column: 22,
+ endLine: 1,
+ endColumn: 41
}
]
},
@@ -59,7 +62,10 @@ ruleTester.run('no-restricted-class', rule, {
errors: [
{
message: "'forbidden' class is not allowed.",
- type: 'Literal'
+ line: 1,
+ column: 24,
+ endLine: 1,
+ endColumn: 35
}
]
},
@@ -69,7 +75,10 @@ ruleTester.run('no-restricted-class', rule, {
errors: [
{
message: "'forbidden' class is not allowed.",
- type: 'Literal'
+ line: 1,
+ column: 25,
+ endLine: 1,
+ endColumn: 36
}
]
},
@@ -79,7 +88,10 @@ ruleTester.run('no-restricted-class', rule, {
errors: [
{
message: "'forbidden' class is not allowed.",
- type: 'Identifier'
+ line: 1,
+ column: 25,
+ endLine: 1,
+ endColumn: 34
}
]
},
@@ -89,7 +101,10 @@ ruleTester.run('no-restricted-class', rule, {
errors: [
{
message: "'forbidden' class is not allowed.",
- type: 'TemplateElement'
+ line: 1,
+ column: 24,
+ endLine: 1,
+ endColumn: 37
}
]
},
@@ -99,7 +114,10 @@ ruleTester.run('no-restricted-class', rule, {
errors: [
{
message: "'forbidden' class is not allowed.",
- type: 'Literal'
+ line: 1,
+ column: 24,
+ endLine: 1,
+ endColumn: 35
}
]
},
@@ -109,7 +127,10 @@ ruleTester.run('no-restricted-class', rule, {
errors: [
{
message: "'forbidden' class is not allowed.",
- type: 'Literal'
+ line: 1,
+ column: 25,
+ endLine: 1,
+ endColumn: 36
}
]
},
@@ -119,7 +140,10 @@ ruleTester.run('no-restricted-class', rule, {
errors: [
{
message: "'forbidden' class is not allowed.",
- type: 'Literal'
+ line: 1,
+ column: 25,
+ endLine: 1,
+ endColumn: 44
}
]
},
@@ -129,7 +153,10 @@ ruleTester.run('no-restricted-class', rule, {
errors: [
{
message: "'forbidden' class is not allowed.",
- type: 'VAttribute'
+ line: 1,
+ column: 22,
+ endLine: 1,
+ endColumn: 41
}
]
}
diff --git a/tests/lib/rules/no-restricted-props.js b/tests/lib/rules/no-restricted-props.js
index a91615e15..e1d55d090 100644
--- a/tests/lib/rules/no-restricted-props.js
+++ b/tests/lib/rules/no-restricted-props.js
@@ -3,7 +3,6 @@
*/
'use strict'
-const semver = require('semver')
const RuleTester = require('../../eslint-compat').RuleTester
const rule = require('../../../lib/rules/no-restricted-props')
const {
@@ -414,15 +413,9 @@ tester.run('no-restricted-props', rule, {
}
]
},
- ...(semver.lt(
- require('@typescript-eslint/parser/package.json').version,
- '4.0.0'
- )
- ? []
- : [
- {
- filename: 'test.vue',
- code: `
+ {
+ filename: 'test.vue',
+ code: `
`,
- languageOptions: {
- parserOptions: {
- parser: require.resolve('@typescript-eslint/parser')
- }
- },
- options: [{ name: 'foo', suggest: 'Foo' }],
- errors: [
- {
- message: 'Using `foo` props is not allowed.',
- line: 4,
- suggestions: [
- {
- desc: 'Instead, change to `Foo`.',
- output: `
+ options: [{ name: 'foo', suggest: 'Foo' }],
+ languageOptions: {
+ parserOptions: {
+ parser: require.resolve('@typescript-eslint/parser')
+ }
+ },
+ errors: [
+ {
+ message: 'Using `foo` props is not allowed.',
+ line: 4,
+ suggestions: [
+ {
+ desc: 'Instead, change to `Foo`.',
+ output: `
`
- }
- ]
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
+ }
+ ]
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
`,
- languageOptions: {
- parserOptions: {
- parser: require.resolve('@typescript-eslint/parser')
- }
- },
- options: [{ name: 'foo', suggest: 'Foo' }],
- errors: [
- {
- message: 'Using `foo` props is not allowed.',
- line: 4,
- suggestions: [
- {
- desc: 'Instead, change to `Foo`.',
- output: `
+ options: [{ name: 'foo', suggest: 'Foo' }],
+ languageOptions: {
+ parserOptions: {
+ parser: require.resolve('@typescript-eslint/parser')
+ }
+ },
+ errors: [
+ {
+ message: 'Using `foo` props is not allowed.',
+ line: 4,
+ suggestions: [
+ {
+ desc: 'Instead, change to `Foo`.',
+ output: `
`
- }
- ]
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
+ }
+ ]
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
@@ -517,20 +510,20 @@ tester.run('no-restricted-props', rule, {
)
`,
- languageOptions: {
- parserOptions: {
- parser: require.resolve('@typescript-eslint/parser')
- }
- },
- options: [{ name: 'foo', suggest: 'Foo' }],
- errors: [
- {
- message: 'Using `foo` props is not allowed.',
- line: 7,
- suggestions: [
- {
- desc: 'Instead, change to `Foo`.',
- output: `
+ options: [{ name: 'foo', suggest: 'Foo' }],
+ languageOptions: {
+ parserOptions: {
+ parser: require.resolve('@typescript-eslint/parser')
+ }
+ },
+ errors: [
+ {
+ message: 'Using `foo` props is not allowed.',
+ line: 7,
+ suggestions: [
+ {
+ desc: 'Instead, change to `Foo`.',
+ output: `
@@ -545,14 +538,14 @@ tester.run('no-restricted-props', rule, {
)
`
- }
- ]
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
+ }
+ ]
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
`,
- languageOptions: {
- parserOptions: {
- parser: require.resolve('@typescript-eslint/parser')
- }
- },
- options: [{ name: 'foo', suggest: 'Foo' }],
- errors: [
- {
- message: 'Using `foo` props is not allowed.',
- line: 9,
- suggestions: [
- {
- desc: 'Instead, change to `Foo`.',
- output: `
+ options: [{ name: 'foo', suggest: 'Foo' }],
+ languageOptions: {
+ parserOptions: {
+ parser: require.resolve('@typescript-eslint/parser')
+ }
+ },
+ errors: [
+ {
+ message: 'Using `foo` props is not allowed.',
+ line: 9,
+ suggestions: [
+ {
+ desc: 'Instead, change to `Foo`.',
+ output: `
`
- }
- ]
- }
- ]
- },
- {
- code: `
-
- `,
- ...getTypeScriptFixtureTestOptions(),
- options: [{ name: 'foo', suggest: 'Foo' }],
- errors: [
- {
- message: 'Using `foo` props is not allowed.',
- line: 4,
- suggestions: null
- }
- ]
- }
- ]),
+ }
+ ]
+ }
+ ]
+ },
+ {
+ code: `
+
+ `,
+ options: [{ name: 'foo', suggest: 'Foo' }],
+ errors: [
+ {
+ message: 'Using `foo` props is not allowed.',
+ line: 4,
+ suggestions: null
+ }
+ ],
+ ...getTypeScriptFixtureTestOptions()
+ },
{
filename: 'test.vue',
code: `
diff --git a/tests/lib/rules/no-setup-props-reactivity-loss.js b/tests/lib/rules/no-setup-props-reactivity-loss.js
index fce921bfe..4a5f1bc4f 100644
--- a/tests/lib/rules/no-setup-props-reactivity-loss.js
+++ b/tests/lib/rules/no-setup-props-reactivity-loss.js
@@ -203,13 +203,7 @@ tester.run('no-setup-props-reactivity-loss', rule, {
const count = props.count
})
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 4
- }
- ]
+ `
},
{
filename: 'test.vue',
@@ -223,13 +217,7 @@ tester.run('no-setup-props-reactivity-loss', rule, {
count = props.count
})
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 4
- }
- ]
+ `
},
{
filename: 'test.vue',
diff --git a/tests/lib/rules/no-side-effects-in-computed-properties.js b/tests/lib/rules/no-side-effects-in-computed-properties.js
index 6cb6d6284..7ba23f875 100644
--- a/tests/lib/rules/no-side-effects-in-computed-properties.js
+++ b/tests/lib/rules/no-side-effects-in-computed-properties.js
@@ -259,6 +259,7 @@ ruleTester.run('no-side-effects-in-computed-properties', rule, {
})
const test18 = computed(() => (console.log('a'), true))
const test19 = computed(() => utils.reverse(foo.array))
+ const test20 = computed(() => Object.assign({}, foo.data, { extra: 'value' }))
}
}
`
@@ -296,32 +297,53 @@ ruleTester.run('no-side-effects-in-computed-properties', rule, {
})`,
errors: [
{
+ message: 'Unexpected side effect in "test1" computed property.',
line: 4,
- message: 'Unexpected side effect in "test1" computed property.'
+ column: 13,
+ endLine: 4,
+ endColumn: 37
},
{
+ message: 'Unexpected side effect in "test2" computed property.',
line: 9,
- message: 'Unexpected side effect in "test2" computed property.'
+ column: 13,
+ endLine: 9,
+ endColumn: 28
},
{
+ message: 'Unexpected side effect in "test2" computed property.',
line: 10,
- message: 'Unexpected side effect in "test2" computed property.'
+ column: 13,
+ endLine: 10,
+ endColumn: 25
},
{
+ message: 'Unexpected side effect in "test3" computed property.',
line: 14,
- message: 'Unexpected side effect in "test3" computed property.'
+ column: 20,
+ endLine: 14,
+ endColumn: 44
},
{
+ message: 'Unexpected side effect in "test4" computed property.',
line: 17,
- message: 'Unexpected side effect in "test4" computed property.'
+ column: 26,
+ endLine: 17,
+ endColumn: 64
},
{
+ message: 'Unexpected side effect in "test5" computed property.',
line: 21,
- message: 'Unexpected side effect in "test5" computed property.'
+ column: 13,
+ endLine: 21,
+ endColumn: 49
},
{
+ message: 'Unexpected side effect in "test6" computed property.',
line: 25,
- message: 'Unexpected side effect in "test6" computed property.'
+ column: 20,
+ endLine: 25,
+ endColumn: 46
}
]
},
@@ -359,24 +381,39 @@ ruleTester.run('no-side-effects-in-computed-properties', rule, {
})`,
errors: [
{
+ message: 'Unexpected side effect in "test1" computed property.',
line: 5,
- message: 'Unexpected side effect in "test1" computed property.'
+ column: 15,
+ endLine: 5,
+ endColumn: 39
},
{
+ message: 'Unexpected side effect in "test2" computed property.',
line: 11,
- message: 'Unexpected side effect in "test2" computed property.'
+ column: 15,
+ endLine: 11,
+ endColumn: 30
},
{
+ message: 'Unexpected side effect in "test2" computed property.',
line: 12,
- message: 'Unexpected side effect in "test2" computed property.'
+ column: 15,
+ endLine: 12,
+ endColumn: 27
},
{
+ message: 'Unexpected side effect in "test3" computed property.',
line: 18,
- message: 'Unexpected side effect in "test3" computed property.'
+ column: 22,
+ endLine: 18,
+ endColumn: 46
},
{
+ message: 'Unexpected side effect in "test4" computed property.',
line: 23,
- message: 'Unexpected side effect in "test4" computed property.'
+ column: 28,
+ endLine: 23,
+ endColumn: 66
}
]
},
@@ -394,8 +431,11 @@ ruleTester.run('no-side-effects-in-computed-properties', rule, {
languageOptions: { parser: require('@typescript-eslint/parser') },
errors: [
{
+ message: 'Unexpected side effect in "test1" computed property.',
line: 5,
- message: 'Unexpected side effect in "test1" computed property.'
+ column: 22,
+ endLine: 5,
+ endColumn: 46
}
]
},
@@ -412,8 +452,11 @@ ruleTester.run('no-side-effects-in-computed-properties', rule, {
})`,
errors: [
{
+ message: 'Unexpected side effect in "test1" computed property.',
line: 4,
- message: 'Unexpected side effect in "test1" computed property.'
+ column: 13,
+ endLine: 4,
+ endColumn: 37
}
]
},
@@ -432,9 +475,27 @@ ruleTester.run('no-side-effects-in-computed-properties', rule, {
}
})`,
errors: [
- 'Unexpected side effect in "test1" computed property.',
- 'Unexpected side effect in "test2" computed property.',
- 'Unexpected side effect in "test3" computed property.'
+ {
+ message: 'Unexpected side effect in "test1" computed property.',
+ line: 4,
+ column: 20,
+ endLine: 4,
+ endColumn: 48
+ },
+ {
+ message: 'Unexpected side effect in "test2" computed property.',
+ line: 7,
+ column: 20,
+ endLine: 7,
+ endColumn: 50
+ },
+ {
+ message: 'Unexpected side effect in "test3" computed property.',
+ line: 10,
+ column: 20,
+ endLine: 10,
+ endColumn: 50
+ }
]
},
{
@@ -450,12 +511,18 @@ ruleTester.run('no-side-effects-in-computed-properties', rule, {
})`,
errors: [
{
+ message: 'Unexpected side effect in "fooBar" computed property.',
line: 4,
- message: 'Unexpected side effect in "fooBar" computed property.'
+ column: 18,
+ endLine: 4,
+ endColumn: 22
},
{
+ message: 'Unexpected side effect in "fooBar" computed property.',
line: 5,
- message: 'Unexpected side effect in "fooBar" computed property.'
+ column: 17,
+ endLine: 5,
+ endColumn: 20
}
]
},
@@ -514,52 +581,88 @@ ruleTester.run('no-side-effects-in-computed-properties', rule, {
`,
errors: [
{
+ message: 'Unexpected side effect in computed function.',
line: 12,
- message: 'Unexpected side effect in computed function.'
+ column: 13,
+ endLine: 12,
+ endColumn: 36
},
{
+ message: 'Unexpected side effect in computed function.',
line: 13,
- message: 'Unexpected side effect in computed function.'
+ column: 13,
+ endLine: 13,
+ endColumn: 34
},
{
+ message: 'Unexpected side effect in computed function.',
line: 17,
- message: 'Unexpected side effect in computed function.'
+ column: 13,
+ endLine: 17,
+ endColumn: 27
},
{
+ message: 'Unexpected side effect in computed function.',
line: 18,
- message: 'Unexpected side effect in computed function.'
+ column: 13,
+ endLine: 18,
+ endColumn: 24
},
{
+ message: 'Unexpected side effect in computed function.',
line: 21,
- message: 'Unexpected side effect in computed function.'
+ column: 40,
+ endLine: 21,
+ endColumn: 63
},
{
+ message: 'Unexpected side effect in computed function.',
line: 23,
- message: 'Unexpected side effect in computed function.'
+ column: 26,
+ endLine: 23,
+ endColumn: 63
},
{
+ message: 'Unexpected side effect in computed function.',
line: 27,
- message: 'Unexpected side effect in computed function.'
+ column: 13,
+ endLine: 27,
+ endColumn: 52
},
{
+ message: 'Unexpected side effect in computed function.',
line: 30,
- message: 'Unexpected side effect in computed function.'
+ column: 40,
+ endLine: 30,
+ endColumn: 65
},
{
+ message: 'Unexpected side effect in computed function.',
line: 33,
- message: 'Unexpected side effect in computed function.'
+ column: 22,
+ endLine: 33,
+ endColumn: 45
},
{
+ message: 'Unexpected side effect in computed function.',
line: 37,
- message: 'Unexpected side effect in computed function.'
+ column: 13,
+ endLine: 37,
+ endColumn: 24
},
{
+ message: 'Unexpected side effect in computed function.',
line: 40,
- message: 'Unexpected side effect in computed function.'
+ column: 13,
+ endLine: 40,
+ endColumn: 24
},
{
+ message: 'Unexpected side effect in computed function.',
line: 42,
- message: 'Unexpected side effect in computed function.'
+ column: 42,
+ endLine: 42,
+ endColumn: 52
}
]
},
@@ -579,8 +682,11 @@ ruleTester.run('no-side-effects-in-computed-properties', rule, {
`,
errors: [
{
+ message: 'Unexpected side effect in computed function.',
line: 8,
- message: 'Unexpected side effect in computed function.'
+ column: 40,
+ endLine: 8,
+ endColumn: 53
}
]
},
@@ -600,8 +706,11 @@ ruleTester.run('no-side-effects-in-computed-properties', rule, {
`,
errors: [
{
+ message: 'Unexpected side effect in computed function.',
line: 8,
- message: 'Unexpected side effect in computed function.'
+ column: 40,
+ endLine: 8,
+ endColumn: 63
}
]
},
@@ -657,52 +766,88 @@ ruleTester.run('no-side-effects-in-computed-properties', rule, {
`,
errors: [
{
+ message: 'Unexpected side effect in computed function.',
line: 10,
- message: 'Unexpected side effect in computed function.'
+ column: 9,
+ endLine: 10,
+ endColumn: 32
},
{
+ message: 'Unexpected side effect in computed function.',
line: 11,
- message: 'Unexpected side effect in computed function.'
+ column: 9,
+ endLine: 11,
+ endColumn: 30
},
{
+ message: 'Unexpected side effect in computed function.',
line: 15,
- message: 'Unexpected side effect in computed function.'
+ column: 9,
+ endLine: 15,
+ endColumn: 23
},
{
+ message: 'Unexpected side effect in computed function.',
line: 16,
- message: 'Unexpected side effect in computed function.'
+ column: 9,
+ endLine: 16,
+ endColumn: 20
},
{
+ message: 'Unexpected side effect in computed function.',
line: 19,
- message: 'Unexpected side effect in computed function.'
+ column: 36,
+ endLine: 19,
+ endColumn: 59
},
{
+ message: 'Unexpected side effect in computed function.',
line: 21,
- message: 'Unexpected side effect in computed function.'
+ column: 22,
+ endLine: 21,
+ endColumn: 59
},
{
+ message: 'Unexpected side effect in computed function.',
line: 25,
- message: 'Unexpected side effect in computed function.'
+ column: 9,
+ endLine: 25,
+ endColumn: 48
},
{
+ message: 'Unexpected side effect in computed function.',
line: 28,
- message: 'Unexpected side effect in computed function.'
+ column: 36,
+ endLine: 28,
+ endColumn: 61
},
{
+ message: 'Unexpected side effect in computed function.',
line: 31,
- message: 'Unexpected side effect in computed function.'
+ column: 18,
+ endLine: 31,
+ endColumn: 41
},
{
+ message: 'Unexpected side effect in computed function.',
line: 35,
- message: 'Unexpected side effect in computed function.'
+ column: 9,
+ endLine: 35,
+ endColumn: 20
},
{
+ message: 'Unexpected side effect in computed function.',
line: 38,
- message: 'Unexpected side effect in computed function.'
+ column: 9,
+ endLine: 38,
+ endColumn: 20
},
{
+ message: 'Unexpected side effect in computed function.',
line: 40,
- message: 'Unexpected side effect in computed function.'
+ column: 38,
+ endLine: 40,
+ endColumn: 48
}
]
},
@@ -718,8 +863,11 @@ ruleTester.run('no-side-effects-in-computed-properties', rule, {
`,
errors: [
{
+ message: 'Unexpected side effect in computed function.',
line: 6,
- message: 'Unexpected side effect in computed function.'
+ column: 36,
+ endLine: 6,
+ endColumn: 49
}
]
},
@@ -735,8 +883,59 @@ ruleTester.run('no-side-effects-in-computed-properties', rule, {
`,
errors: [
{
+ message: 'Unexpected side effect in computed function.',
line: 6,
- message: 'Unexpected side effect in computed function.'
+ column: 36,
+ endLine: 6,
+ endColumn: 59
+ }
+ ]
+ },
+ {
+ // Object.assign mutating the prop as first argument in computed properties
+ filename: 'test.vue',
+ code: `
+
+ `,
+ errors: [
+ {
+ message: 'Unexpected side effect in computed function.',
+ line: 8,
+ column: 40,
+ endLine: 8,
+ endColumn: 83
+ },
+ {
+ message: 'Unexpected side effect in computed function.',
+ line: 10,
+ column: 20,
+ endLine: 10,
+ endColumn: 56
+ },
+ {
+ message: 'Unexpected side effect in computed function.',
+ line: 14,
+ column: 15,
+ endLine: 14,
+ endColumn: 61
}
]
}
diff --git a/tests/lib/rules/no-template-shadow.js b/tests/lib/rules/no-template-shadow.js
index 3cc5218d1..6cbd94c58 100644
--- a/tests/lib/rules/no-template-shadow.js
+++ b/tests/lib/rules/no-template-shadow.js
@@ -180,7 +180,10 @@ ruleTester.run('no-template-shadow', rule, {
errors: [
{
message: "Variable 'i' is already declared in the upper scope.",
- type: 'Identifier'
+ line: 1,
+ column: 43,
+ endLine: 1,
+ endColumn: 44
}
]
},
@@ -199,8 +202,10 @@ ruleTester.run('no-template-shadow', rule, {
errors: [
{
message: "Variable 'i' is already declared in the upper scope.",
- type: 'Identifier',
- line: 2
+ line: 2,
+ column: 21,
+ endLine: 2,
+ endColumn: 22
}
]
},
@@ -220,13 +225,17 @@ ruleTester.run('no-template-shadow', rule, {
errors: [
{
message: "Variable 'i' is already declared in the upper scope.",
- type: 'Identifier',
- line: 2
+ line: 2,
+ column: 21,
+ endLine: 2,
+ endColumn: 22
},
{
message: "Variable 'i' is already declared in the upper scope.",
- type: 'Identifier',
- line: 3
+ line: 3,
+ column: 21,
+ endLine: 3,
+ endColumn: 22
}
]
},
@@ -247,13 +256,17 @@ ruleTester.run('no-template-shadow', rule, {
errors: [
{
message: "Variable 'i' is already declared in the upper scope.",
- type: 'Identifier',
- line: 2
+ line: 2,
+ column: 21,
+ endLine: 2,
+ endColumn: 22
},
{
message: "Variable 'i' is already declared in the upper scope.",
- type: 'Identifier',
- line: 3
+ line: 3,
+ column: 23,
+ endLine: 3,
+ endColumn: 24
}
]
},
@@ -274,8 +287,10 @@ ruleTester.run('no-template-shadow', rule, {
errors: [
{
message: "Variable 'i' is already declared in the upper scope.",
- type: 'Identifier',
- line: 2
+ line: 2,
+ column: 21,
+ endLine: 2,
+ endColumn: 22
}
]
},
@@ -298,13 +313,17 @@ ruleTester.run('no-template-shadow', rule, {
errors: [
{
message: "Variable 'i' is already declared in the upper scope.",
- type: 'Identifier',
- line: 2
+ line: 2,
+ column: 21,
+ endLine: 2,
+ endColumn: 22
},
{
message: "Variable 'f' is already declared in the upper scope.",
- type: 'Identifier',
- line: 3
+ line: 3,
+ column: 21,
+ endLine: 3,
+ endColumn: 22
}
]
},
@@ -337,13 +356,17 @@ ruleTester.run('no-template-shadow', rule, {
errors: [
{
message: "Variable 'e' is already declared in the upper scope.",
- type: 'Identifier',
- line: 6
+ line: 6,
+ column: 21,
+ endLine: 6,
+ endColumn: 22
},
{
message: "Variable 'f' is already declared in the upper scope.",
- type: 'Identifier',
- line: 7
+ line: 7,
+ column: 21,
+ endLine: 7,
+ endColumn: 22
}
]
},
@@ -376,13 +399,17 @@ ruleTester.run('no-template-shadow', rule, {
errors: [
{
message: "Variable 'e' is already declared in the upper scope.",
- type: 'Identifier',
- line: 6
+ line: 6,
+ column: 21,
+ endLine: 6,
+ endColumn: 22
},
{
message: "Variable 'f' is already declared in the upper scope.",
- type: 'Identifier',
- line: 7
+ line: 7,
+ column: 21,
+ endLine: 7,
+ endColumn: 22
}
]
},
@@ -413,13 +440,17 @@ ruleTester.run('no-template-shadow', rule, {
errors: [
{
message: "Variable 'e' is already declared in the upper scope.",
- type: 'Identifier',
- line: 6
+ line: 6,
+ column: 21,
+ endLine: 6,
+ endColumn: 22
},
{
message: "Variable 'f' is already declared in the upper scope.",
- type: 'Identifier',
- line: 7
+ line: 7,
+ column: 21,
+ endLine: 7,
+ endColumn: 22
}
]
},
@@ -445,7 +476,10 @@ ruleTester.run('no-template-shadow', rule, {
errors: [
{
message: "Variable 'j' is already declared in the upper scope.",
- line: 4
+ line: 4,
+ column: 23,
+ endLine: 4,
+ endColumn: 24
}
]
},
@@ -465,7 +499,10 @@ ruleTester.run('no-template-shadow', rule, {
errors: [
{
message: "Variable 'j' is already declared in the upper scope.",
- line: 4
+ line: 4,
+ column: 23,
+ endLine: 4,
+ endColumn: 24
}
]
},
@@ -485,7 +522,10 @@ ruleTester.run('no-template-shadow', rule, {
errors: [
{
message: "Variable 'j' is already declared in the upper scope.",
- line: 4
+ line: 4,
+ column: 23,
+ endLine: 4,
+ endColumn: 24
}
]
}
diff --git a/tests/lib/rules/no-undef-components.js b/tests/lib/rules/no-undef-components.js
index 37a3bec68..f87f9dcd5 100644
--- a/tests/lib/rules/no-undef-components.js
+++ b/tests/lib/rules/no-undef-components.js
@@ -6,7 +6,6 @@
const RuleTester = require('../../eslint-compat').RuleTester
const rule = require('../../../lib/rules/no-undef-components')
-const semver = require('semver')
const tester = new RuleTester({
languageOptions: {
@@ -746,14 +745,9 @@ tester.run('no-undef-components', rule, {
}
]
},
- ...(semver.gte(
- require('@typescript-eslint/parser/package.json').version,
- '5.0.0'
- )
- ? [
- {
- filename: 'test.vue',
- code: `
+ {
+ filename: 'test.vue',
+ code: `
+ `,
+ ...getTypeScriptFixtureTestOptions()
}
],
@@ -393,8 +405,10 @@ ruleTester.run('prop-name-casing', rule, {
errors: [
{
message: 'Prop "greeting_text" is not in camelCase.',
- type: 'Property',
- line: 4
+ line: 4,
+ column: 13,
+ endLine: 4,
+ endColumn: 34
}
]
},
@@ -412,8 +426,10 @@ ruleTester.run('prop-name-casing', rule, {
errors: [
{
message: 'Prop "greeting_text" is not in camelCase.',
- type: 'Property',
- line: 4
+ line: 4,
+ column: 13,
+ endLine: 4,
+ endColumn: 34
}
]
},
@@ -429,8 +445,10 @@ ruleTester.run('prop-name-casing', rule, {
errors: [
{
message: 'Prop "greeting_text" is not in camelCase.',
- type: 'Literal',
- line: 3
+ line: 3,
+ column: 19,
+ endLine: 3,
+ endColumn: 34
}
]
},
@@ -448,8 +466,10 @@ ruleTester.run('prop-name-casing', rule, {
errors: [
{
message: 'Prop "greetingText" is not in snake_case.',
- type: 'Property',
- line: 4
+ line: 4,
+ column: 13,
+ endLine: 4,
+ endColumn: 33
}
]
},
@@ -467,8 +487,10 @@ ruleTester.run('prop-name-casing', rule, {
errors: [
{
message: 'Prop "greeting-text" is not in camelCase.',
- type: 'Property',
- line: 4
+ line: 4,
+ column: 13,
+ endLine: 4,
+ endColumn: 36
}
]
},
@@ -486,8 +508,10 @@ ruleTester.run('prop-name-casing', rule, {
errors: [
{
message: 'Prop "greeting-text" is not in snake_case.',
- type: 'Property',
- line: 4
+ line: 4,
+ column: 13,
+ endLine: 4,
+ endColumn: 36
}
]
},
@@ -504,8 +528,10 @@ ruleTester.run('prop-name-casing', rule, {
errors: [
{
message: 'Prop "greeting_text" is not in camelCase.',
- type: 'Property',
- line: 4
+ line: 4,
+ column: 13,
+ endLine: 4,
+ endColumn: 36
}
]
},
@@ -523,8 +549,10 @@ ruleTester.run('prop-name-casing', rule, {
errors: [
{
message: 'Prop "greeting-text" is not in camelCase.',
- type: 'Property',
- line: 4
+ line: 4,
+ column: 13,
+ endLine: 4,
+ endColumn: 38
}
]
},
@@ -542,8 +570,10 @@ ruleTester.run('prop-name-casing', rule, {
errors: [
{
message: 'Prop "greeting_text" is not in camelCase.',
- type: 'Property',
- line: 4
+ line: 4,
+ column: 13,
+ endLine: 4,
+ endColumn: 26
}
]
},
@@ -560,8 +590,10 @@ ruleTester.run('prop-name-casing', rule, {
errors: [
{
message: 'Prop "abc-123-def" is not in camelCase.',
- type: 'Property',
- line: 4
+ line: 4,
+ column: 13,
+ endLine: 4,
+ endColumn: 34
}
]
},
@@ -579,8 +611,10 @@ ruleTester.run('prop-name-casing', rule, {
errors: [
{
message: 'Prop "greeting-text" is not in camelCase.',
- type: 'Property',
- line: 4
+ line: 4,
+ column: 13,
+ endLine: 4,
+ endColumn: 40
}
]
},
@@ -651,7 +685,10 @@ ruleTester.run('prop-name-casing', rule, {
errors: [
{
message: 'Prop "greeting_text" is not in camelCase.',
- line: 4
+ line: 4,
+ column: 9,
+ endLine: 4,
+ endColumn: 30
}
]
},
@@ -669,41 +706,40 @@ ruleTester.run('prop-name-casing', rule, {
errors: [
{
message: 'Prop "greeting_text" is not in camelCase.',
- line: 3
+ line: 3,
+ column: 20,
+ endLine: 3,
+ endColumn: 35
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ languageOptions: {
+ parser: require('vue-eslint-parser'),
+ ...languageOptions,
+ parserOptions: {
+ parser: require.resolve('@typescript-eslint/parser')
+ }
+ },
+ errors: [
+ {
+ message: 'Prop "greeting_text" is not in camelCase.',
+ line: 4,
+ column: 9,
+ endLine: 4,
+ endColumn: 30
}
]
},
- ...(semver.lt(
- require('@typescript-eslint/parser/package.json').version,
- '4.0.0'
- )
- ? []
- : [
- {
- filename: 'test.vue',
- code: `
-
- `,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ...languageOptions,
- parserOptions: {
- parser: require.resolve('@typescript-eslint/parser')
- }
- },
- errors: [
- {
- message: 'Prop "greeting_text" is not in camelCase.',
- line: 4
- }
- ]
- }
- ]),
{
filename: 'test.vue',
code: `
@@ -720,13 +756,17 @@ ruleTester.run('prop-name-casing', rule, {
errors: [
{
message: 'Prop "notIgnored_prop" is not in camelCase.',
- type: 'Property',
- line: 4
+ line: 4,
+ column: 13,
+ endLine: 4,
+ endColumn: 36
},
{
message: 'Prop "other-pattern" is not in camelCase.',
- type: 'Property',
- line: 5
+ line: 5,
+ column: 13,
+ endLine: 5,
+ endColumn: 36
}
]
},
@@ -742,15 +782,52 @@ ruleTester.run('prop-name-casing', rule, {
errors: [
{
message: 'Prop "notIgnored_prop" is not in camelCase.',
- type: 'Literal',
- line: 3
+ line: 3,
+ column: 19,
+ endLine: 3,
+ endColumn: 36
},
{
message: 'Prop "pattern_invalid" is not in camelCase.',
- type: 'Literal',
- line: 3
+ line: 3,
+ column: 38,
+ endLine: 3,
+ endColumn: 55
}
]
+ },
+ {
+ code: `
+
+ `,
+ errors: [
+ {
+ message: 'Prop "snake_case" is not in camelCase.',
+ line: 5,
+ column: 19,
+ endLine: 5,
+ endColumn: 24
+ },
+ {
+ message: 'Prop "kebab-case" is not in camelCase.',
+ line: 5,
+ column: 19,
+ endLine: 5,
+ endColumn: 24
+ },
+ {
+ message: 'Prop "PascalCase" is not in camelCase.',
+ line: 5,
+ column: 19,
+ endLine: 5,
+ endColumn: 24
+ }
+ ],
+ ...getTypeScriptFixtureTestOptions()
}
]
})
diff --git a/tests/lib/rules/require-default-prop.js b/tests/lib/rules/require-default-prop.js
index 43160dfda..cbca0ee19 100644
--- a/tests/lib/rules/require-default-prop.js
+++ b/tests/lib/rules/require-default-prop.js
@@ -4,7 +4,6 @@
*/
'use strict'
-const semver = require('semver')
const rule = require('../../../lib/rules/require-default-prop')
const RuleTester = require('../../eslint-compat').RuleTester
const languageOptions = {
@@ -655,37 +654,30 @@ ruleTester.run('require-default-prop', rule, {
}
]
},
- ...(semver.lt(
- require('@typescript-eslint/parser/package.json').version,
- '4.0.0'
- )
- ? []
- : [
- {
- filename: 'test.vue',
- code: `
-
- `,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ...languageOptions,
- parserOptions: {
- parser: require.resolve('@typescript-eslint/parser')
- }
- },
- errors: [
- {
- message: "Prop 'foo' requires default value to be set.",
- line: 4
- }
- ]
- }
- ]),
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ languageOptions: {
+ parser: require('vue-eslint-parser'),
+ ...languageOptions,
+ parserOptions: {
+ parser: require.resolve('@typescript-eslint/parser')
+ }
+ },
+ errors: [
+ {
+ message: "Prop 'foo' requires default value to be set.",
+ line: 4
+ }
+ ]
+ },
{
filename: 'test.vue',
code: `
diff --git a/tests/lib/rules/require-direct-export.js b/tests/lib/rules/require-direct-export.js
index cec06c7a0..0a5816e94 100644
--- a/tests/lib/rules/require-direct-export.js
+++ b/tests/lib/rules/require-direct-export.js
@@ -94,8 +94,10 @@ ruleTester.run('require-direct-export', rule, {
errors: [
{
message: 'Expected the component literal to be directly exported.',
- type: 'ExportDefaultDeclaration',
- line: 3
+ line: 3,
+ column: 7,
+ endLine: 3,
+ endColumn: 23
}
]
},
@@ -109,8 +111,10 @@ ruleTester.run('require-direct-export', rule, {
errors: [
{
message: 'Expected the component literal to be directly exported.',
- type: 'ExportDefaultDeclaration',
- line: 5
+ line: 5,
+ column: 7,
+ endLine: 5,
+ endColumn: 23
}
]
},
@@ -120,8 +124,10 @@ ruleTester.run('require-direct-export', rule, {
errors: [
{
message: 'Expected the component literal to be directly exported.',
- type: 'ExportDefaultDeclaration',
- line: 1
+ line: 1,
+ column: 1,
+ endLine: 1,
+ endColumn: 38
}
]
},
@@ -131,8 +137,10 @@ ruleTester.run('require-direct-export', rule, {
errors: [
{
message: 'Expected the component literal to be directly exported.',
- type: 'ExportDefaultDeclaration',
- line: 1
+ line: 1,
+ column: 1,
+ endLine: 1,
+ endColumn: 30
}
]
},
@@ -142,8 +150,10 @@ ruleTester.run('require-direct-export', rule, {
errors: [
{
message: 'Expected the component literal to be directly exported.',
- type: 'ExportDefaultDeclaration',
- line: 1
+ line: 1,
+ column: 1,
+ endLine: 1,
+ endColumn: 24
}
]
},
@@ -157,8 +167,10 @@ ruleTester.run('require-direct-export', rule, {
errors: [
{
message: 'Expected the component literal to be directly exported.',
- type: 'ExportDefaultDeclaration',
- line: 1
+ line: 1,
+ column: 1,
+ endLine: 5,
+ endColumn: 8
}
]
},
@@ -170,8 +182,10 @@ ruleTester.run('require-direct-export', rule, {
errors: [
{
message: 'Expected the component literal to be directly exported.',
- type: 'ExportDefaultDeclaration',
- line: 1
+ line: 1,
+ column: 1,
+ endLine: 3,
+ endColumn: 8
}
]
},
@@ -186,8 +200,10 @@ ruleTester.run('require-direct-export', rule, {
errors: [
{
message: 'Expected the component literal to be directly exported.',
- type: 'ExportDefaultDeclaration',
- line: 5
+ line: 5,
+ column: 7,
+ endLine: 5,
+ endColumn: 23
}
]
},
diff --git a/tests/lib/rules/require-name-property.js b/tests/lib/rules/require-name-property.js
index c61c46759..517e8df58 100644
--- a/tests/lib/rules/require-name-property.js
+++ b/tests/lib/rules/require-name-property.js
@@ -80,7 +80,10 @@ ruleTester.run('require-name-property', rule, {
errors: [
{
message: 'Required name property is not set.',
- type: 'ObjectExpression',
+ line: 2,
+ column: 24,
+ endLine: 3,
+ endColumn: 10,
suggestions: [
{
desc: 'Add name property to component.',
@@ -104,7 +107,10 @@ ruleTester.run('require-name-property', rule, {
errors: [
{
message: 'Required name property is not set.',
- type: 'ObjectExpression',
+ line: 2,
+ column: 40,
+ endLine: 3,
+ endColumn: 10,
suggestions: [
{
desc: 'Add name property to component.',
@@ -127,7 +133,10 @@ ruleTester.run('require-name-property', rule, {
errors: [
{
message: 'Required name property is not set.',
- type: 'ObjectExpression',
+ line: 2,
+ column: 40,
+ endLine: 2,
+ endColumn: 43,
suggestions: [
{
desc: 'Add name property to component.',
@@ -150,7 +159,10 @@ ruleTester.run('require-name-property', rule, {
errors: [
{
message: 'Required name property is not set.',
- type: 'ObjectExpression',
+ line: 2,
+ column: 24,
+ endLine: 2,
+ endColumn: 27,
suggestions: [
{
desc: 'Add name property to component.',
@@ -175,7 +187,10 @@ ruleTester.run('require-name-property', rule, {
errors: [
{
message: 'Required name property is not set.',
- type: 'ObjectExpression',
+ line: 2,
+ column: 24,
+ endLine: 4,
+ endColumn: 10,
suggestions: [
{
desc: 'Add name property to component.',
@@ -201,7 +216,10 @@ ruleTester.run('require-name-property', rule, {
errors: [
{
message: 'Required name property is not set.',
- type: 'ObjectExpression',
+ line: 2,
+ column: 40,
+ endLine: 4,
+ endColumn: 10,
suggestions: [
{
desc: 'Add name property to component.',
@@ -230,7 +248,10 @@ ruleTester.run('require-name-property', rule, {
errors: [
{
message: 'Required name property is not set.',
- type: 'ObjectExpression',
+ line: 2,
+ column: 24,
+ endLine: 6,
+ endColumn: 10,
suggestions: [
{
desc: 'Add name property to component.',
@@ -258,7 +279,10 @@ ruleTester.run('require-name-property', rule, {
errors: [
{
message: 'Required name property is not set.',
- type: 'ObjectExpression',
+ line: 2,
+ column: 24,
+ endLine: 4,
+ endColumn: 10,
suggestions: [
{
desc: 'Add name property to component.',
diff --git a/tests/lib/rules/require-render-return.js b/tests/lib/rules/require-render-return.js
index d2aad3c01..0fa628302 100644
--- a/tests/lib/rules/require-render-return.js
+++ b/tests/lib/rules/require-render-return.js
@@ -140,8 +140,10 @@ ruleTester.run('require-render-return', rule, {
errors: [
{
message: 'Expected to return a value in render function.',
- type: 'Identifier',
- line: 2
+ line: 2,
+ column: 9,
+ endLine: 2,
+ endColumn: 15
}
]
},
@@ -158,8 +160,10 @@ ruleTester.run('require-render-return', rule, {
errors: [
{
message: 'Expected to return a value in render function.',
- type: 'Identifier',
- line: 2
+ line: 2,
+ column: 9,
+ endLine: 2,
+ endColumn: 15
}
]
},
@@ -175,8 +179,10 @@ ruleTester.run('require-render-return', rule, {
errors: [
{
message: 'Expected to return a value in render function.',
- type: 'Identifier',
- line: 2
+ line: 2,
+ column: 9,
+ endLine: 2,
+ endColumn: 15
}
]
},
@@ -192,8 +198,10 @@ ruleTester.run('require-render-return', rule, {
errors: [
{
message: 'Expected to return a value in render function.',
- type: 'Identifier',
- line: 2
+ line: 2,
+ column: 9,
+ endLine: 2,
+ endColumn: 15
}
]
},
@@ -209,8 +217,10 @@ ruleTester.run('require-render-return', rule, {
errors: [
{
message: 'Expected to return a value in render function.',
- type: 'Identifier',
- line: 2
+ line: 2,
+ column: 9,
+ endLine: 2,
+ endColumn: 15
}
]
},
@@ -228,8 +238,10 @@ ruleTester.run('require-render-return', rule, {
errors: [
{
message: 'Expected to return a value in render function.',
- type: 'Identifier',
- line: 2
+ line: 2,
+ column: 9,
+ endLine: 2,
+ endColumn: 15
}
]
}
diff --git a/tests/lib/rules/require-typed-ref.js b/tests/lib/rules/require-typed-ref.js
index 6f3b359d6..ec42c0751 100644
--- a/tests/lib/rules/require-typed-ref.js
+++ b/tests/lib/rules/require-typed-ref.js
@@ -242,7 +242,6 @@ tester.run('require-typed-ref', rule, {
}
}
- }
`,
languageOptions: { parser: require('vue-eslint-parser') },
errors: [
diff --git a/tests/lib/rules/singleline-html-element-content-newline.js b/tests/lib/rules/singleline-html-element-content-newline.js
index 52c01392b..83366266b 100644
--- a/tests/lib/rules/singleline-html-element-content-newline.js
+++ b/tests/lib/rules/singleline-html-element-content-newline.js
@@ -251,7 +251,6 @@ content
'Expected 1 line break after opening tag (`
`), but no line breaks found.',
line: 3,
column: 30,
- type: 'HTMLTagClose',
endLine: 3,
endColumn: 30
},
@@ -260,7 +259,6 @@ content
'Expected 1 line break before closing tag (`
`), but no line breaks found.',
line: 3,
column: 37,
- type: 'HTMLEndTagOpen',
endLine: 3,
endColumn: 37
}
diff --git a/tests/lib/rules/space-in-parens.js b/tests/lib/rules/space-in-parens.js
index d6218216d..9b1509f07 100644
--- a/tests/lib/rules/space-in-parens.js
+++ b/tests/lib/rules/space-in-parens.js
@@ -3,21 +3,9 @@
*/
'use strict'
-const { RuleTester, ESLint } = require('../../eslint-compat')
-const semver = require('semver')
+const { RuleTester } = require('../../eslint-compat')
const rule = require('../../../lib/rules/space-in-parens')
-const errorMessage = semver.lt(ESLint.version, '6.4.0')
- ? (obj) => {
- const messageId = obj.messageId
- delete obj.messageId
- obj.message = messageId.startsWith('missing')
- ? 'There must be a space inside this paren.'
- : 'There should be no spaces inside this paren.'
- return obj
- }
- : (obj) => obj
-
const tester = new RuleTester({
languageOptions: { parser: require('vue-eslint-parser'), ecmaVersion: 2015 }
})
@@ -76,14 +64,14 @@ tester.run('space-in-parens', rule, {
/>
`,
errors: [
- errorMessage({
+ {
messageId: 'rejectedOpeningSpace',
line: 4
- }),
- errorMessage({
+ },
+ {
messageId: 'rejectedClosingSpace',
line: 4
- })
+ }
]
},
{
@@ -101,14 +89,14 @@ tester.run('space-in-parens', rule, {
`,
options: ['always'],
errors: [
- errorMessage({
+ {
messageId: 'missingOpeningSpace',
line: 4
- }),
- errorMessage({
+ },
+ {
messageId: 'missingClosingSpace',
line: 4
- })
+ }
]
},
{
@@ -125,14 +113,14 @@ tester.run('space-in-parens', rule, {
>
`,
errors: [
- errorMessage({
+ {
messageId: 'rejectedOpeningSpace',
line: 4
- }),
- errorMessage({
+ },
+ {
messageId: 'rejectedClosingSpace',
line: 4
- })
+ }
]
},
{
@@ -150,14 +138,14 @@ tester.run('space-in-parens', rule, {
`,
options: ['always'],
errors: [
- errorMessage({
+ {
messageId: 'missingOpeningSpace',
line: 4
- }),
- errorMessage({
+ },
+ {
messageId: 'missingClosingSpace',
line: 4
- })
+ }
]
},
{
@@ -174,14 +162,14 @@ tester.run('space-in-parens', rule, {
>
`,
errors: [
- errorMessage({
+ {
messageId: 'rejectedOpeningSpace',
line: 4
- }),
- errorMessage({
+ },
+ {
messageId: 'rejectedClosingSpace',
line: 4
- })
+ }
]
},
{
@@ -199,14 +187,14 @@ tester.run('space-in-parens', rule, {
`,
options: ['always'],
errors: [
- errorMessage({
+ {
messageId: 'missingOpeningSpace',
line: 4
- }),
- errorMessage({
+ },
+ {
messageId: 'missingClosingSpace',
line: 4
- })
+ }
]
},
@@ -225,14 +213,14 @@ tester.run('space-in-parens', rule, {
}
`,
errors: [
- errorMessage({
+ {
messageId: 'rejectedOpeningSpace',
line: 4
- }),
- errorMessage({
+ },
+ {
messageId: 'rejectedClosingSpace',
line: 4
- })
+ }
]
}
]
diff --git a/tests/lib/rules/space-infix-ops.js b/tests/lib/rules/space-infix-ops.js
index 0325884a7..d05e25170 100644
--- a/tests/lib/rules/space-infix-ops.js
+++ b/tests/lib/rules/space-infix-ops.js
@@ -3,17 +3,14 @@
*/
'use strict'
-const { RuleTester, ESLint } = require('../../eslint-compat')
-const semver = require('semver')
+const { RuleTester } = require('../../eslint-compat')
const rule = require('../../../lib/rules/space-infix-ops')
const tester = new RuleTester({
languageOptions: { parser: require('vue-eslint-parser'), ecmaVersion: 2015 }
})
-const message = semver.lt(ESLint.version, '5.10.0')
- ? () => 'Infix operators must be spaced.'
- : (operator) => `Operator '${operator}' must be spaced.`
+const message = (operator) => `Operator '${operator}' must be spaced.`
tester.run('space-infix-ops', rule, {
valid: [
diff --git a/tests/lib/rules/static-class-names-order.js b/tests/lib/rules/static-class-names-order.js
index 0f293f5e9..748cd6603 100644
--- a/tests/lib/rules/static-class-names-order.js
+++ b/tests/lib/rules/static-class-names-order.js
@@ -42,7 +42,10 @@ tester.run('static-class-names-order', rule, {
errors: [
{
message: 'Classes should be ordered alphabetically.',
- type: 'VAttribute'
+ line: 1,
+ column: 16,
+ endLine: 1,
+ endColumn: 27
}
]
},
@@ -59,7 +62,10 @@ tester.run('static-class-names-order', rule, {
errors: [
{
message: 'Classes should be ordered alphabetically.',
- type: 'VAttribute'
+ line: 2,
+ column: 16,
+ endLine: 2,
+ endColumn: 29
}
]
}
diff --git a/tests/lib/rules/valid-define-options.js b/tests/lib/rules/valid-define-options.js
index 867bcb569..330bc819f 100644
--- a/tests/lib/rules/valid-define-options.js
+++ b/tests/lib/rules/valid-define-options.js
@@ -74,6 +74,14 @@ tester.run('valid-define-options', rule, {
defineOptions(def);
`
+ },
+ {
+ filename: 'test.vue',
+ code: `
+ `
}
],
invalid: [
diff --git a/tests/lib/utils/selector.js b/tests/lib/utils/selector.js
index b5b0ee986..4fff7cfa9 100644
--- a/tests/lib/utils/selector.js
+++ b/tests/lib/utils/selector.js
@@ -45,9 +45,7 @@ function extractElements(code, inputSelector) {
VElement(node) {
if (parsed.test(node)) {
matches.push(
- context
- .getSourceCode()
- .text.slice(...node.startTag.range)
+ context.sourceCode.text.slice(...node.startTag.range)
)
}
}
diff --git a/tests/lib/utils/vue-component.js b/tests/lib/utils/vue-component.js
index 12fcd904f..f2cce4331 100644
--- a/tests/lib/utils/vue-component.js
+++ b/tests/lib/utils/vue-component.js
@@ -26,11 +26,13 @@ const languageOptions = {
sourceType: 'module'
}
-function makeError(line) {
+function makeError(line, column, endLine, endColumn) {
return {
message: 'Component detected.',
line,
- type: 'ObjectExpression'
+ column,
+ endLine,
+ endColumn
}
}
@@ -132,37 +134,37 @@ function invalidTests(ext) {
// ${ext}
`,
languageOptions,
- errors: [makeError(4)]
+ errors: [makeError(4, 19, 4, 21)]
},
{
filename: `test.${ext}`,
code: `Vue.component({})`,
languageOptions,
- errors: [makeError(1)]
+ errors: [makeError(1, 15, 1, 17)]
},
{
filename: `test.${ext}`,
code: `Vue.mixin({})`,
languageOptions,
- errors: [makeError(1)]
+ errors: [makeError(1, 11, 1, 13)]
},
{
filename: `test.${ext}`,
code: `Vue.extend({})`,
languageOptions,
- errors: [makeError(1)]
+ errors: [makeError(1, 12, 1, 14)]
},
{
filename: `test.${ext}`,
code: `app.component('name', {})`,
languageOptions,
- errors: [makeError(1)]
+ errors: [makeError(1, 23, 1, 25)]
},
{
filename: `test.${ext}`,
code: `app.mixin({})`,
languageOptions,
- errors: [makeError(1)]
+ errors: [makeError(1, 11, 1, 13)]
},
{
filename: `test.${ext}`,
@@ -171,7 +173,7 @@ function invalidTests(ext) {
...languageOptions,
parser: require('@typescript-eslint/parser')
},
- errors: [makeError(1)]
+ errors: [makeError(1, 52, 1, 54)]
},
{
filename: `test.${ext}`,
@@ -180,7 +182,7 @@ function invalidTests(ext) {
...languageOptions,
parser: require('@typescript-eslint/parser')
},
- errors: [makeError(1)]
+ errors: [makeError(1, 27, 1, 29)]
},
{
filename: `test.${ext}`,
@@ -189,13 +191,13 @@ function invalidTests(ext) {
...languageOptions,
parser: require('@typescript-eslint/parser')
},
- errors: [makeError(1)]
+ errors: [makeError(1, 27, 1, 29)]
},
{
filename: `test.${ext}`,
code: `createApp({})`,
languageOptions,
- errors: [makeError(1)]
+ errors: [makeError(1, 11, 1, 13)]
},
{
filename: `test.${ext}`,
@@ -205,7 +207,7 @@ function invalidTests(ext) {
// ${ext}
`,
languageOptions,
- errors: [makeError(3)]
+ errors: [makeError(3, 24, 3, 27)]
},
{
filename: `test.${ext}`,
@@ -215,7 +217,7 @@ function invalidTests(ext) {
// ${ext}
`,
languageOptions,
- errors: [makeError(3)]
+ errors: [makeError(3, 24, 3, 27)]
},
{
filename: `test.${ext}`,
@@ -228,7 +230,7 @@ function invalidTests(ext) {
// ${ext}
`,
languageOptions,
- errors: [makeError(6)]
+ errors: [makeError(6, 24, 6, 27)]
},
{
filename: `test.${ext}`,
@@ -240,7 +242,7 @@ function invalidTests(ext) {
// ${ext}
`,
languageOptions,
- errors: [makeError(3), makeError(5)]
+ errors: [makeError(3, 24, 3, 27), makeError(5, 24, 5, 27)]
},
{
filename: `test.${ext}`,
@@ -252,7 +254,7 @@ function invalidTests(ext) {
// ${ext}
`,
languageOptions,
- errors: [makeError(3), makeError(5)]
+ errors: [makeError(3, 28, 3, 31), makeError(5, 24, 5, 27)]
},
{
filename: `test.${ext}`,
@@ -263,7 +265,10 @@ function invalidTests(ext) {
// ${ext}
`,
languageOptions,
- errors: [...(ext === 'js' ? [] : [makeError(2)]), makeError(4)]
+ errors: [
+ ...(ext === 'js' ? [] : [makeError(2, 24, 2, 27)]),
+ makeError(4, 26, 4, 29)
+ ]
},
{
filename: `test.${ext}`,
@@ -274,7 +279,7 @@ function invalidTests(ext) {
// ${ext}
`,
languageOptions,
- errors: [makeError(4)]
+ errors: [makeError(4, 26, 4, 29)]
},
{
filename: `test.${ext}`,
@@ -286,7 +291,7 @@ function invalidTests(ext) {
// ${ext}
`,
languageOptions,
- errors: [makeError(4)]
+ errors: [makeError(4, 13, 4, 16)]
},
{
filename: `test.${ext}`,
@@ -301,7 +306,10 @@ function invalidTests(ext) {
// ${ext}
`,
languageOptions,
- errors: [...(ext === 'js' ? [] : [makeError(3)]), makeError(6)]
+ errors: [
+ ...(ext === 'js' ? [] : [makeError(3, 24, 7, 10)]),
+ makeError(6, 16, 6, 19)
+ ]
},
{
filename: `test.${ext}`,
@@ -318,19 +326,22 @@ function invalidTests(ext) {
// ${ext}
`,
languageOptions,
- errors: [...(ext === 'js' ? [] : [makeError(2)]), makeError(8)]
+ errors: [
+ ...(ext === 'js' ? [] : [makeError(2, 24, 10, 10)]),
+ makeError(8, 20, 8, 22)
+ ]
},
{
filename: `test.${ext}`,
code: `export default defineComponent({})`,
languageOptions,
- errors: [makeError(1)]
+ errors: [makeError(1, 32, 1, 34)]
},
{
filename: `test.${ext}`,
code: `export default defineNuxtComponent({})`,
languageOptions,
- errors: [makeError(1)]
+ errors: [makeError(1, 36, 1, 38)]
}
]
}
@@ -353,13 +364,13 @@ ruleTester.run('vue-component', rule, {
filename: 'test.vue',
code: `export default { }`,
languageOptions,
- errors: [makeError(1)]
+ errors: [makeError(1, 16, 1, 19)]
},
{
filename: 'test.jsx',
code: `export default { }`,
languageOptions,
- errors: [makeError(1)]
+ errors: [makeError(1, 16, 1, 19)]
},
...invalidTests('js'),
...invalidTests('jsx'),
diff --git a/tests/test-utils/eslint-stylistic.js b/tests/test-utils/eslint-stylistic.js
new file mode 100644
index 000000000..81fc774f3
--- /dev/null
+++ b/tests/test-utils/eslint-stylistic.js
@@ -0,0 +1,16 @@
+const { existsSync, readFileSync } = require('node:fs')
+const path = require('node:path')
+
+const eslintStylisticPackagePath = path.join(
+ __dirname,
+ '../..',
+ 'node_modules',
+ '@stylistic',
+ 'eslint-plugin',
+ 'package.json'
+)
+const eslintStylisticVersion = existsSync(eslintStylisticPackagePath)
+ ? JSON.parse(readFileSync(eslintStylisticPackagePath, 'utf8')).version
+ : undefined
+
+module.exports = { eslintStylisticVersion }
diff --git a/tools/update-html-resources.js b/tools/update-html-resources.js
index fcbdacbb0..aba02d13f 100644
--- a/tools/update-html-resources.js
+++ b/tools/update-html-resources.js
@@ -21,9 +21,8 @@ async function main() {
// Update deprecated-html-elements.json
// ------------------------------------------------------------------------------
function updateDeprecatedHTMLElements() {
- const DEPRECATED_HTML_ELEMENTS_PATH = require.resolve(
- '../lib/utils/deprecated-html-elements.json'
- )
+ const DEPRECATED_HTML_ELEMENTS_PATH =
+ require.resolve('../lib/utils/deprecated-html-elements.json')
const elements = new Set()
const domDl = jsdom.JSDOM.fragment(obsoleteHtml).querySelector(
@@ -49,9 +48,8 @@ async function main() {
// Update html-elements.json
// ------------------------------------------------------------------------------
function updateHTMLElements() {
- const HTML_ELEMENTS_PATH = require.resolve(
- '../lib/utils/html-elements.json'
- )
+ const HTML_ELEMENTS_PATH =
+ require.resolve('../lib/utils/html-elements.json')
const elements = new Set()
const deprecatedHtmlElements = new Set(
require('../lib/utils/deprecated-html-elements.json')
diff --git a/tools/update-lib-flat-configs.js b/tools/update-lib-flat-configs.js
index e55fb2d01..bc103cad1 100644
--- a/tools/update-lib-flat-configs.js
+++ b/tools/update-lib-flat-configs.js
@@ -60,7 +60,7 @@ module.exports = [
name: 'vue/base/setup',
plugins: {
get vue() {
- return require('../../index')
+ return require('../../plugin')
}
},
languageOptions: {
@@ -72,7 +72,7 @@ module.exports = [
files: ['*.vue', '**/*.vue'],
plugins: {
get vue() {
- return require('../../index')
+ return require('../../plugin')
}
},
languageOptions: {
diff --git a/tools/update-lib-index.js b/tools/update-lib-index.js
deleted file mode 100644
index 5e9dd6187..000000000
--- a/tools/update-lib-index.js
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * @author Toru Nagashima
- * @copyright 2017 Toru Nagashima. All rights reserved.
- * See LICENSE file in root directory for full license.
- */
-'use strict'
-
-/*
-This script updates `lib/index.js` file from rule's meta data.
-*/
-
-const fs = require('fs')
-const path = require('path')
-const { FlatESLint } = require('eslint/use-at-your-own-risk')
-const rules = require('./lib/rules')
-
-// Update files.
-const filePath = path.resolve(__dirname, '../lib/index.js')
-const content = `/*
- * IMPORTANT!
- * This file has been automatically generated,
- * in order to update its content execute "npm run update"
- */
-'use strict'
-
-const plugin = {
- meta: require('./meta'),
- configs: {
- // eslintrc configs
- base: require('./configs/base'),
-
- 'vue2-essential': require('./configs/vue2-essential'),
- 'vue2-strongly-recommended': require('./configs/vue2-strongly-recommended'),
- 'vue2-recommended': require('./configs/vue2-recommended'),
-
- essential: require('./configs/vue3-essential'),
- 'strongly-recommended': require('./configs/vue3-strongly-recommended'),
- recommended: require('./configs/vue3-recommended'),
-
- // flat configs
- 'flat/base': require('./configs/flat/base.js'),
-
- 'flat/vue2-essential': require('./configs/flat/vue2-essential.js'),
- 'flat/vue2-strongly-recommended': require('./configs/flat/vue2-strongly-recommended.js'),
- 'flat/vue2-recommended': require('./configs/flat/vue2-recommended.js'),
-
- 'flat/essential': require('./configs/flat/vue3-essential.js'),
- 'flat/strongly-recommended': require('./configs/flat/vue3-strongly-recommended.js'),
- 'flat/recommended': require('./configs/flat/vue3-recommended.js'),
-
- // config-format-agnostic configs
- 'no-layout-rules': require('./configs/no-layout-rules'),
- },
- rules: {
- ${rules
- .map((rule) => `'${rule.name}': require('./rules/${rule.name}')`)
- .join(',\n')}
- },
- processors: {
- '.vue': require('./processor'),
- 'vue': require('./processor')
- }
-}
-
-module.exports = plugin
-`
-fs.writeFileSync(filePath, content)
-
-// Format files.
-async function format() {
- const linter = new FlatESLint({ fix: true })
- const report = await linter.lintFiles([filePath])
- FlatESLint.outputFixes(report)
-}
-
-format()
diff --git a/tools/update-lib-plugin.js b/tools/update-lib-plugin.js
new file mode 100644
index 000000000..b9fa03870
--- /dev/null
+++ b/tools/update-lib-plugin.js
@@ -0,0 +1,50 @@
+/**
+ * @author Toru Nagashima
+ * @copyright 2017 Toru Nagashima. All rights reserved.
+ * See LICENSE file in root directory for full license.
+ */
+'use strict'
+
+/*
+This script updates `lib/plugin.js` file from rule's meta data.
+*/
+
+const fs = require('fs')
+const path = require('path')
+const { FlatESLint } = require('eslint/use-at-your-own-risk')
+const rules = require('./lib/rules')
+
+// Update files.
+const filePath = path.resolve(__dirname, '../lib/plugin.js')
+const content = `/*
+ * IMPORTANT!
+ * This file has been automatically generated,
+ * in order to update its content execute "npm run update"
+ */
+'use strict'
+
+const plugin = {
+ meta: require('./meta'),
+ rules: {
+ ${rules
+ .map((rule) => `'${rule.name}': require('./rules/${rule.name}')`)
+ .join(',\n')}
+ },
+ processors: {
+ '.vue': require('./processor'),
+ 'vue': require('./processor')
+ }
+}
+
+module.exports = plugin
+`
+fs.writeFileSync(filePath, content)
+
+// Format files.
+async function format() {
+ const linter = new FlatESLint({ fix: true })
+ const report = await linter.lintFiles([filePath])
+ FlatESLint.outputFixes(report)
+}
+
+format()
diff --git a/tools/update.js b/tools/update.js
index 64da1be1b..f1a77c9a0 100644
--- a/tools/update.js
+++ b/tools/update.js
@@ -8,6 +8,6 @@
require('./update-no-layout-rules-config')
require('./update-lib-configs')
require('./update-lib-flat-configs')
-require('./update-lib-index')
+require('./update-lib-plugin')
require('./update-docs')
require('./update-docs-rules-index')
diff --git a/tsconfig.json b/tsconfig.json
index b488a6b93..2008bef78 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -4,6 +4,9 @@
"module": "node16",
"moduleResolution": "Node16",
"lib": ["es2020"],
+ "types": [
+ "vitest/globals"
+ ],
"allowJs": true,
"checkJs": true,
"noEmit": true,
@@ -25,6 +28,7 @@
},
"include": [
"lib/**/*",
+ "tests/**/*.ts",
"typings/eslint-plugin-vue/global.d.ts",
"docs/.vitepress/**/*.ts",
"docs/.vitepress/**/*.mts"
diff --git a/typings/eslint-plugin-vue/util-types/ast/es-ast.ts b/typings/eslint-plugin-vue/util-types/ast/es-ast.ts
index 3205dc74e..010945c5b 100644
--- a/typings/eslint-plugin-vue/util-types/ast/es-ast.ts
+++ b/typings/eslint-plugin-vue/util-types/ast/es-ast.ts
@@ -227,8 +227,7 @@ interface BasePropertyDefinition extends HasParentNode {
static: boolean
parent: ClassBody
}
-export interface PropertyDefinitionNonComputedName
- extends BasePropertyDefinition {
+export interface PropertyDefinitionNonComputedName extends BasePropertyDefinition {
computed: false
key: Identifier | Literal
}
@@ -351,7 +350,7 @@ export interface PrivateIdentifier extends HasParentNode {
}
export interface Literal extends HasParentNode {
type: 'Literal'
- value: string | boolean | null | number | RegExp | BigInt
+ value: string | boolean | null | number | RegExp | bigint
raw: string
regex?: {
pattern: string
@@ -627,8 +626,7 @@ interface BaseAssignmentProperty extends HasParentNode {
value: Pattern
parent: ObjectPattern
}
-export interface AssignmentPropertyNonComputedName
- extends BaseAssignmentProperty {
+export interface AssignmentPropertyNonComputedName extends BaseAssignmentProperty {
computed: false
key: Identifier | Literal
}
diff --git a/typings/eslint-plugin-vue/util-types/parser-services.ts b/typings/eslint-plugin-vue/util-types/parser-services.ts
index 6a9ccc776..5f2b5a24c 100644
--- a/typings/eslint-plugin-vue/util-types/parser-services.ts
+++ b/typings/eslint-plugin-vue/util-types/parser-services.ts
@@ -7,8 +7,7 @@ type TemplateListenerBase = {
[T in keyof VAST.VNodeListenerMap]?: (node: VAST.VNodeListenerMap[T]) => void
}
export interface TemplateListener
- extends TemplateListenerBase,
- eslint.Rule.NodeListener {
+ extends TemplateListenerBase, eslint.Rule.NodeListener {
[key: string]: ((node: VAST.ParamNode) => void) | undefined
}
diff --git a/typings/eslint/index.d.ts b/typings/eslint/index.d.ts
index 0558e5511..f45f216d8 100644
--- a/typings/eslint/index.d.ts
+++ b/typings/eslint/index.d.ts
@@ -18,8 +18,7 @@ export namespace Scope {
scopes: Scope[]
globalScope: Scope | null
acquire(node: VAST.ESNode | VAST.Program, inner?: boolean): Scope | null
- /** @since ESLint v8.38.0 */
- getDeclaredVariables?(node: VAST.ESNode): Variable[]
+ getDeclaredVariables(node: VAST.ESNode): Variable[]
}
interface Scope {
type:
@@ -232,10 +231,8 @@ export class SourceCode /*extends ESLintSourceCode*/ {
getCommentsAfter(nodeOrToken: VNODE.HasLocation): VNODE.Comment[]
getCommentsInside(node: VNODE.HasLocation): VNODE.Comment[]
- /** @since ESLint v8.39.0 */
- markVariableAsUsed?(name: string, node?: VNODE.HasLocation): void
- /** @since ESLint v8.37.0 */
- getScope?(node: VNODE.HasLocation): Scope.Scope
+ markVariableAsUsed(name: string, node?: VNODE.HasLocation): void
+ getScope(node: VNODE.HasLocation): Scope.Scope
}
export namespace SourceCode {
interface Config {
@@ -323,9 +320,9 @@ export namespace Rule {
id: string
options: ESLintRule.RuleContext['options']
settings: { [name: string]: any }
- /** @deprecated removed in ESLint v10? */
+ /** @deprecated removed in ESLint v10 */
parserPath?: string
- /** @deprecated removed in ESLint v10? */
+ /** @deprecated removed in ESLint v10 */
parserOptions?: ESLintLinter.ParserOptions
/** For flat config */
languageOptions?: ESLintLinter.FlatConfig['languageOptions']
@@ -336,22 +333,24 @@ export namespace Rule {
getAncestors?(): VAST.ESNode[]
/** @deprecated removed in ESLint v9 */
getDeclaredVariables?(node: VAST.ESNode): Scope.Variable[]
- getFilename(): string
- /** @since ESLint v8.40.0 */
- filename?: string
+ /** @deprecated removed in ESLint v10 */
+ getFilename?(): string
+ filename: string
+ /** @deprecated removed in ESLint v10 */
+ getPhysicalFilename?(): string
+ physicalFilename: string
/** @deprecated removed in ESLint v9 */
getScope?(): Scope.Scope
- getSourceCode(): SourceCode
- /** @since ESLint v8.40.0 */
- sourceCode?: SourceCode
+ /** @deprecated removed in ESLint v10 */
+ getSourceCode?(): SourceCode
+ sourceCode: SourceCode
/** @deprecated removed in ESLint v9 */
markVariableAsUsed?(name: string): boolean
report(descriptor: ReportDescriptor): void
- // eslint@6 does not have this method.
+ /** @deprecated removed in ESLint v10 */
getCwd?: () => string
- /** @since ESLint v8.40.0 */
- cwd?: string
+ cwd: string
}
type ReportDescriptor =
diff --git a/vitest.config.ts b/vitest.config.mts
similarity index 65%
rename from vitest.config.ts
rename to vitest.config.mts
index eeef751d6..be1e63448 100644
--- a/vitest.config.ts
+++ b/vitest.config.mts
@@ -1,11 +1,8 @@
+import { defineConfig } from 'vitest/config'
-import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
- include: [
- 'tests/lib/**/*.js',
- 'tests/integrations/**/*.js'
- ],
+ include: ['tests/lib/**/*.js', 'tests/integrations/**/*.js'],
exclude: [
'**/node_modules/**',
'**/dist/**',
@@ -18,15 +15,10 @@ export default defineConfig({
coverage: {
provider: 'v8',
include: ['lib/**/*.js'],
- exclude: [
- 'tests/**',
- 'dist/**',
- 'tools/**',
- 'node_modules/**'
- ],
+ exclude: ['tests/**', 'dist/**', 'tools/**', 'node_modules/**'],
reporter: ['text', 'lcov', 'json-summary', 'html'],
all: true,
reportsDirectory: './coverage'
- },
- },
-});
+ }
+ }
+})