' should be above '',
- output: '
',
- options: [{ order: ['script', 'template', 'style'] }],
- errors: [
- {
- message: "'`,
- output:
- '\n' +
- '
\n' +
- '\n' +
- ' \n' +
- '\n' +
- ' ',
- errors: [
- {
- message: "'
-
- `,
- output:
- '\n' +
- ' \n' +
- '
\n' +
- ' \n' +
- ' ',
- options: [{ order: ['script', 'template', 'style'] }],
- errors: [
- {
- message: "'
-
-
- `,
- output:
- '\n' +
- '
\n' +
- ' \n' +
- ' \n' +
- ' ',
- options: [{ order: ['template', 'script', 'style'] }],
- errors: [
- {
- message: "'
' should be above '
-
- `,
- output:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' ',
- options: [{ order: ['docs', 'template', 'script', 'style'] }],
- errors: [
- {
- message: "'' should be above '' on line 2.",
- line: 3
- }
- ]
- },
- {
- code: `
-
-
-
-
- `,
- output:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' ',
- options: [{ order: ['script', 'template', 'style'] }],
- errors: [
- {
- message: "'
-
- `,
- output:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' ',
- options: [{ order: ['script', 'template', 'style'] }],
- errors: [
- {
- message: "'
-
- `,
- output:
- '\n \n \n ',
- options: [{ order: ['template', 'script'] }],
- errors: [
- {
- message: "'' should be above '
- `,
- output:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' ',
- errors: [
- {
- message: "'' should be above '
-
-
-
- `,
- output:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' ',
- errors: [
- {
- message: "'' should be above '
-
- `,
- output: '\n \n \n ',
- errors: [
- {
- message: "'',
- output: '',
- options: [{ order: ['script:not([scoped])', 'style:not([scoped])'] }],
- errors: [
- {
- message: "'`
- const [{ messages, output }] = await eslint.lintText(code, {
- filePath: 'test.vue'
- })
- assert.deepStrictEqual(messages, [])
- // should not fix `
- )
- })
-})
diff --git a/tests/lib/rules/custom-event-name-casing.js b/tests/lib/rules/custom-event-name-casing.js
index 6b6e84c80..9a0668206 100644
--- a/tests/lib/rules/custom-event-name-casing.js
+++ b/tests/lib/rules/custom-event-name-casing.js
@@ -237,18 +237,6 @@ tester.run('custom-event-name-casing', rule, {
]
},
- // For backward compatibility
- {
- filename: 'test.vue',
- code: `
-
-
-
- `,
- options: [{ ignores: ['fooBar'] }]
- },
-
// camelCase
{
filename: 'test.vue',
@@ -423,9 +411,27 @@ tester.run('custom-event-name-casing', rule, {
`,
options: ['kebab-case'],
errors: [
- "Custom event name 'fooBar' must be kebab-case.",
- "Custom event name 'barBaz' must be kebab-case.",
- "Custom event name 'bazQux' must be kebab-case."
+ {
+ message: "Custom event name 'fooBar' must be kebab-case.",
+ line: 4,
+ column: 27,
+ endLine: 4,
+ endColumn: 35
+ },
+ {
+ message: "Custom event name 'barBaz' must be kebab-case.",
+ line: 11,
+ column: 31,
+ endLine: 11,
+ endColumn: 39
+ },
+ {
+ message: "Custom event name 'bazQux' must be kebab-case.",
+ line: 17,
+ column: 27,
+ endLine: 17,
+ endColumn: 35
+ }
]
},
{
@@ -454,9 +460,27 @@ tester.run('custom-event-name-casing', rule, {
`,
options: ['kebab-case'],
errors: [
- "Custom event name 'fooBar' must be kebab-case.",
- "Custom event name 'barBaz' must be kebab-case.",
- "Custom event name 'bazQux' must be kebab-case."
+ {
+ message: "Custom event name 'fooBar' must be kebab-case.",
+ line: 4,
+ column: 27,
+ endLine: 4,
+ endColumn: 35
+ },
+ {
+ message: "Custom event name 'barBaz' must be kebab-case.",
+ line: 11,
+ column: 33,
+ endLine: 11,
+ endColumn: 41
+ },
+ {
+ message: "Custom event name 'bazQux' must be kebab-case.",
+ line: 17,
+ column: 29,
+ endLine: 17,
+ endColumn: 37
+ }
]
},
{
@@ -488,9 +512,27 @@ tester.run('custom-event-name-casing', rule, {
{ ignores: ['/^[a-z]+(?:-[a-z]+)*:[a-z]+(?:-[a-z]+)*$/u'] }
],
errors: [
- "Custom event name 'input/update' must be kebab-case.",
- "Custom event name 'search/update' must be kebab-case.",
- "Custom event name 'click/row' must be kebab-case."
+ {
+ message: "Custom event name 'input/update' must be kebab-case.",
+ line: 4,
+ column: 25,
+ endLine: 4,
+ endColumn: 39
+ },
+ {
+ message: "Custom event name 'search/update' must be kebab-case.",
+ line: 11,
+ column: 28,
+ endLine: 11,
+ endColumn: 43
+ },
+ {
+ message: "Custom event name 'click/row' must be kebab-case.",
+ line: 17,
+ column: 24,
+ endLine: 17,
+ endColumn: 35
+ }
]
},
{
@@ -522,9 +564,27 @@ tester.run('custom-event-name-casing', rule, {
{ ignores: ['input:update', 'search:update', 'click:row'] }
],
errors: [
- "Custom event name 'input/update' must be kebab-case.",
- "Custom event name 'search/update' must be kebab-case.",
- "Custom event name 'click/row' must be kebab-case."
+ {
+ message: "Custom event name 'input/update' must be kebab-case.",
+ line: 4,
+ column: 25,
+ endLine: 4,
+ endColumn: 39
+ },
+ {
+ message: "Custom event name 'search/update' must be kebab-case.",
+ line: 11,
+ column: 28,
+ endLine: 11,
+ endColumn: 43
+ },
+ {
+ message: "Custom event name 'click/row' must be kebab-case.",
+ line: 17,
+ column: 24,
+ endLine: 17,
+ endColumn: 35
+ }
]
},
// camelCase
@@ -554,9 +614,27 @@ tester.run('custom-event-name-casing', rule, {
`,
options: ['camelCase'],
errors: [
- "Custom event name 'foo-bar' must be camelCase.",
- "Custom event name 'bar-baz' must be camelCase.",
- "Custom event name 'baz-qux' must be camelCase."
+ {
+ message: "Custom event name 'foo-bar' must be camelCase.",
+ line: 4,
+ column: 25,
+ endLine: 4,
+ endColumn: 34
+ },
+ {
+ message: "Custom event name 'bar-baz' must be camelCase.",
+ line: 11,
+ column: 28,
+ endLine: 11,
+ endColumn: 37
+ },
+ {
+ message: "Custom event name 'baz-qux' must be camelCase.",
+ line: 17,
+ column: 24,
+ endLine: 17,
+ endColumn: 33
+ }
]
},
// Default
@@ -585,9 +663,27 @@ tester.run('custom-event-name-casing', rule, {
`,
errors: [
- "Custom event name 'foo-bar' must be camelCase.",
- "Custom event name 'bar-baz' must be camelCase.",
- "Custom event name 'baz-qux' must be camelCase."
+ {
+ message: "Custom event name 'foo-bar' must be camelCase.",
+ line: 4,
+ column: 25,
+ endLine: 4,
+ endColumn: 34
+ },
+ {
+ message: "Custom event name 'bar-baz' must be camelCase.",
+ line: 11,
+ column: 28,
+ endLine: 11,
+ endColumn: 37
+ },
+ {
+ message: "Custom event name 'baz-qux' must be camelCase.",
+ line: 17,
+ column: 24,
+ endLine: 17,
+ endColumn: 33
+ }
]
},
// kebab-case
@@ -603,7 +699,10 @@ tester.run('custom-event-name-casing', rule, {
errors: [
{
message: "Custom event name 'foo-bar' must be camelCase.",
- line: 5
+ line: 5,
+ column: 12,
+ endLine: 5,
+ endColumn: 21
}
]
},
@@ -618,7 +717,10 @@ tester.run('custom-event-name-casing', rule, {
errors: [
{
message: "Custom event name 'foo-bar' must be camelCase.",
- line: 4
+ line: 4,
+ column: 12,
+ endLine: 4,
+ endColumn: 21
}
]
},
@@ -639,15 +741,24 @@ tester.run('custom-event-name-casing', rule, {
errors: [
{
message: "Custom event name 'foo-bar' must be camelCase.",
- line: 4
+ line: 4,
+ column: 12,
+ endLine: 4,
+ endColumn: 21
},
{
message: "Custom event name 'foo-bar' must be camelCase.",
- line: 8
+ line: 8,
+ column: 28,
+ endLine: 8,
+ endColumn: 37
},
{
message: "Custom event name 'foo-bar' must be camelCase.",
- line: 9
+ line: 9,
+ column: 29,
+ endLine: 9,
+ endColumn: 38
}
]
}
diff --git a/tests/lib/rules/define-emits-declaration.js b/tests/lib/rules/define-emits-declaration.js
index 4e65783c2..417ac8944 100644
--- a/tests/lib/rules/define-emits-declaration.js
+++ b/tests/lib/rules/define-emits-declaration.js
@@ -149,7 +149,10 @@ tester.run('define-emits-declaration', rule, {
errors: [
{
message: 'Use type based declaration instead of runtime declaration.',
- line: 3
+ line: 3,
+ column: 21,
+ endLine: 3,
+ endColumn: 54
}
]
},
@@ -164,7 +167,10 @@ tester.run('define-emits-declaration', rule, {
errors: [
{
message: 'Use type based declaration instead of runtime declaration.',
- line: 3
+ line: 3,
+ column: 21,
+ endLine: 3,
+ endColumn: 54
}
]
},
@@ -184,7 +190,10 @@ tester.run('define-emits-declaration', rule, {
errors: [
{
message: 'Use type based declaration instead of runtime declaration.',
- line: 3
+ line: 3,
+ column: 21,
+ endLine: 3,
+ endColumn: 54
}
]
},
@@ -207,7 +216,10 @@ tester.run('define-emits-declaration', rule, {
errors: [
{
message: 'Use runtime declaration instead of type based declaration.',
- line: 3
+ line: 3,
+ column: 22,
+ endLine: 6,
+ endColumn: 13
}
]
},
@@ -231,12 +243,18 @@ tester.run('define-emits-declaration', rule, {
{
message:
'Use new type literal declaration instead of the old call signature declaration.',
- line: 4
+ line: 4,
+ column: 11,
+ endLine: 4,
+ endColumn: 42
},
{
message:
'Use new type literal declaration instead of the old call signature declaration.',
- line: 5
+ line: 5,
+ column: 11,
+ endLine: 5,
+ endColumn: 45
}
]
},
@@ -260,7 +278,10 @@ tester.run('define-emits-declaration', rule, {
{
message:
'Use new type literal declaration instead of the old call signature declaration.',
- line: 5
+ line: 5,
+ column: 11,
+ endLine: 5,
+ endColumn: 45
}
]
},
@@ -281,7 +302,10 @@ tester.run('define-emits-declaration', rule, {
{
message:
'Use new type literal declaration instead of the old call signature declaration.',
- line: 3
+ line: 3,
+ column: 34,
+ endLine: 3,
+ endColumn: 67
}
]
}
diff --git a/tests/lib/rules/define-macros-order.js b/tests/lib/rules/define-macros-order.js
index 3def7cf1e..0a3e274fd 100644
--- a/tests/lib/rules/define-macros-order.js
+++ b/tests/lib/rules/define-macros-order.js
@@ -354,7 +354,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineEmits'),
- line: 5
+ line: 5,
+ column: 11,
+ endLine: 5,
+ endColumn: 39
}
]
},
@@ -390,7 +393,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineProps'),
- line: 8
+ line: 8,
+ column: 11,
+ endLine: 10,
+ endColumn: 13
}
]
},
@@ -423,7 +429,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineProps'),
- line: 6
+ line: 6,
+ column: 11,
+ endLine: 8,
+ endColumn: 13
}
]
},
@@ -455,7 +464,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineEmits'),
- line: 8
+ line: 8,
+ column: 11,
+ endLine: 8,
+ endColumn: 52
}
]
},
@@ -489,7 +501,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('definePage'),
- line: 8
+ line: 8,
+ column: 11,
+ endLine: 10,
+ endColumn: 13
}
]
},
@@ -532,7 +547,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineEmits'),
- line: 12
+ line: 12,
+ column: 11,
+ endLine: 12,
+ endColumn: 65
}
]
},
@@ -587,7 +605,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('definePage'),
- line: 15
+ line: 15,
+ column: 11,
+ endLine: 17,
+ endColumn: 13
}
]
},
@@ -625,7 +646,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineProps'),
- line: 10
+ line: 10,
+ column: 11,
+ endLine: 10,
+ endColumn: 42
}
]
},
@@ -680,7 +704,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineEmits'),
- line: 16
+ line: 16,
+ column: 11,
+ endLine: 16,
+ endColumn: 59
}
]
},
@@ -699,7 +726,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineEmits'),
- line: 3
+ line: 3,
+ column: 56,
+ endLine: 3,
+ endColumn: 84
}
]
},
@@ -718,7 +748,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('definePage'),
- line: 3
+ line: 3,
+ column: 56,
+ endLine: 3,
+ endColumn: 83
}
]
},
@@ -753,7 +786,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineProps'),
- line: 11
+ line: 11,
+ column: 11,
+ endLine: 11,
+ endColumn: 56
}
]
},
@@ -768,7 +804,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineProps'),
- line: 2
+ line: 2,
+ column: 52,
+ endLine: 2,
+ endColumn: 82
}
]
},
@@ -790,7 +829,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineProps'),
- line: 4
+ line: 4,
+ column: 11,
+ endLine: 4,
+ endColumn: 41
}
]
},
@@ -814,7 +856,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineProps'),
- line: 5
+ line: 5,
+ column: 11,
+ endLine: 5,
+ endColumn: 41
}
]
},
@@ -838,7 +883,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineCustom'),
- line: 5
+ line: 5,
+ column: 11,
+ endLine: 5,
+ endColumn: 42
}
]
},
@@ -862,7 +910,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineCustom'),
- line: 5
+ line: 5,
+ column: 11,
+ endLine: 5,
+ endColumn: 57
}
]
},
@@ -914,7 +965,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineOptions'),
- line: 12
+ line: 12,
+ column: 11,
+ endLine: 12,
+ endColumn: 28
}
]
},
@@ -962,7 +1016,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineOptions'),
- line: 6
+ line: 6,
+ column: 11,
+ endLine: 6,
+ endColumn: 28
}
]
},
@@ -984,6 +1041,9 @@ tester.run('define-macros-order', rule, {
{
message: defineExposeNotTheLast,
line: 6,
+ column: 11,
+ endLine: 6,
+ endColumn: 27,
suggestions: [
{
desc: putExposeAtBottom,
@@ -1042,6 +1102,9 @@ tester.run('define-macros-order', rule, {
{
message: defineExposeNotTheLast,
line: 6,
+ column: 11,
+ endLine: 6,
+ endColumn: 27,
suggestions: [
{
desc: putExposeAtBottom,
@@ -1064,7 +1127,10 @@ tester.run('define-macros-order', rule, {
},
{
message: message('defineOptions'),
- line: 8
+ line: 8,
+ column: 11,
+ endLine: 8,
+ endColumn: 28
}
]
},
@@ -1096,7 +1162,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineModel'),
- line: 6
+ line: 6,
+ column: 11,
+ endLine: 6,
+ endColumn: 45
}
]
},
@@ -1124,7 +1193,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineModel'),
- line: 5
+ line: 5,
+ column: 11,
+ endLine: 5,
+ endColumn: 47
}
]
},
@@ -1162,7 +1234,10 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineSomething'),
- line: 5
+ line: 5,
+ column: 11,
+ endLine: 5,
+ endColumn: 53
}
]
},
@@ -1195,11 +1270,17 @@ tester.run('define-macros-order', rule, {
errors: [
{
message: message('defineModel'),
- line: 5
+ line: 5,
+ column: 11,
+ endLine: 5,
+ endColumn: 37
},
{
message: defineExposeNotTheLast,
line: 6,
+ column: 11,
+ endLine: 6,
+ endColumn: 27,
suggestions: [
{
messageId: 'putExposeAtTheLast',
diff --git a/tests/lib/rules/define-props-declaration.js b/tests/lib/rules/define-props-declaration.js
index d6785b93c..ff9e3e1b6 100644
--- a/tests/lib/rules/define-props-declaration.js
+++ b/tests/lib/rules/define-props-declaration.js
@@ -120,7 +120,10 @@ tester.run('define-props-declaration', rule, {
errors: [
{
message: 'Use type-based declaration instead of runtime declaration.',
- line: 3
+ line: 3,
+ column: 21,
+ endLine: 5,
+ endColumn: 9
}
]
},
@@ -137,7 +140,10 @@ tester.run('define-props-declaration', rule, {
errors: [
{
message: 'Use type-based declaration instead of runtime declaration.',
- line: 3
+ line: 3,
+ column: 21,
+ endLine: 5,
+ endColumn: 9
}
]
},
@@ -159,7 +165,10 @@ tester.run('define-props-declaration', rule, {
errors: [
{
message: 'Use runtime declaration instead of type-based declaration.',
- line: 3
+ line: 3,
+ column: 21,
+ endLine: 5,
+ endColumn: 11
}
]
}
diff --git a/tests/lib/rules/define-props-destructuring.js b/tests/lib/rules/define-props-destructuring.js
new file mode 100644
index 000000000..ce8f3db97
--- /dev/null
+++ b/tests/lib/rules/define-props-destructuring.js
@@ -0,0 +1,228 @@
+/**
+ * @author Wayne Zhang
+ * See LICENSE file in root directory for full license.
+ */
+'use strict'
+
+const RuleTester = require('../../eslint-compat').RuleTester
+const rule = require('../../../lib/rules/define-props-destructuring')
+
+const tester = new RuleTester({
+ languageOptions: {
+ parser: require('vue-eslint-parser'),
+ ecmaVersion: 2015,
+ sourceType: 'module'
+ }
+})
+
+tester.run('define-props-destructuring', rule, {
+ valid: [
+ {
+ filename: 'test.vue',
+ code: `
+
+ `
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ languageOptions: {
+ parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
+ }
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ options: [{ destructure: 'never' }]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ options: [{ destructure: 'never' }]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ options: [{ destructure: 'never' }],
+ languageOptions: {
+ parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
+ }
+ }
+ ],
+ invalid: [
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ errors: [
+ {
+ messageId: 'preferDestructuring',
+ line: 3,
+ column: 21,
+ endLine: 3,
+ endColumn: 41
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ errors: [
+ {
+ messageId: 'preferDestructuring',
+ line: 3,
+ column: 34,
+ endLine: 3,
+ endColumn: 54
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ errors: [
+ {
+ messageId: 'avoidWithDefaults',
+ line: 3,
+ column: 23,
+ endLine: 3,
+ endColumn: 35
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ languageOptions: {
+ parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
+ },
+ errors: [
+ {
+ messageId: 'preferDestructuring',
+ line: 3,
+ column: 34,
+ endLine: 3,
+ endColumn: 65
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ languageOptions: {
+ parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
+ },
+ errors: [
+ {
+ messageId: 'avoidWithDefaults',
+ line: 3,
+ column: 23,
+ endLine: 3,
+ endColumn: 35
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ options: [{ destructure: 'never' }],
+ errors: [
+ {
+ messageId: 'avoidDestructuring',
+ line: 3,
+ column: 23,
+ endLine: 3,
+ endColumn: 43
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ options: [{ destructure: 'never' }],
+ errors: [
+ {
+ messageId: 'avoidDestructuring',
+ line: 3,
+ column: 36,
+ endLine: 3,
+ endColumn: 56
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ options: [{ destructure: 'never' }],
+ languageOptions: {
+ parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
+ },
+ errors: [
+ {
+ messageId: 'avoidDestructuring',
+ line: 3,
+ column: 23,
+ endLine: 3,
+ endColumn: 54
+ }
+ ]
+ }
+ ]
+})
diff --git a/tests/lib/rules/dot-location.js b/tests/lib/rules/dot-location.js
index b2002d185..fada8d3ef 100644
--- a/tests/lib/rules/dot-location.js
+++ b/tests/lib/rules/dot-location.js
@@ -48,7 +48,10 @@ tester.run('dot-location', rule, {
errors: [
{
message: 'Expected dot to be on same line as object.',
- line: 5
+ line: 5,
+ column: 13,
+ endLine: 5,
+ endColumn: 14
}
]
},
@@ -71,7 +74,10 @@ tester.run('dot-location', rule, {
errors: [
{
message: 'Expected dot to be on same line as property.',
- line: 4
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 22
}
]
}
diff --git a/tests/lib/rules/dot-notation.js b/tests/lib/rules/dot-notation.js
index 993aade52..58626395d 100644
--- a/tests/lib/rules/dot-notation.js
+++ b/tests/lib/rules/dot-notation.js
@@ -29,12 +29,28 @@ tester.run('dot-notation', rule, {
{
code: `
`,
output: `
`,
- errors: ['["bar"] is better written in dot notation.']
+ errors: [
+ {
+ message: '["bar"] is better written in dot notation.',
+ line: 1,
+ column: 27,
+ endLine: 1,
+ endColumn: 32
+ }
+ ]
},
{
code: `
`,
output: `
`,
- errors: ['[`bar`] is better written in dot notation.']
+ errors: [
+ {
+ message: '[`bar`] is better written in dot notation.',
+ line: 1,
+ column: 22,
+ endLine: 1,
+ endColumn: 27
+ }
+ ]
},
// CSS vars injection
{
@@ -50,7 +66,15 @@ tester.run('dot-notation', rule, {
color: v-bind(foo.bar)
}
`,
- errors: ['[`bar`] is better written in dot notation.']
+ errors: [
+ {
+ message: '[`bar`] is better written in dot notation.',
+ line: 4,
+ column: 27,
+ endLine: 4,
+ endColumn: 32
+ }
+ ]
},
{
code: `
@@ -65,7 +89,15 @@ tester.run('dot-notation', rule, {
color: v-bind("foo.bar")
}
`,
- errors: ['[`bar`] is better written in dot notation.']
+ errors: [
+ {
+ message: '[`bar`] is better written in dot notation.',
+ line: 4,
+ column: 28,
+ endLine: 4,
+ endColumn: 33
+ }
+ ]
}
]
})
diff --git a/tests/lib/rules/enforce-style-attribute.js b/tests/lib/rules/enforce-style-attribute.js
index f12f66998..1a269ab06 100644
--- a/tests/lib/rules/enforce-style-attribute.js
+++ b/tests/lib/rules/enforce-style-attribute.js
@@ -63,7 +63,11 @@ tester.run('enforce-style-attribute', rule, {
code: ` `,
errors: [
{
- message: 'Plain `,
errors: [
{
- message: 'The module attribute is not allowed. Allowed: scoped.'
+ message: 'The module attribute is not allowed. Allowed: scoped.',
+ line: 1,
+ column: 39,
+ endLine: 1,
+ endColumn: 61
}
]
},
@@ -81,7 +89,11 @@ tester.run('enforce-style-attribute', rule, {
options: [{ allow: ['scoped'] }],
errors: [
{
- message: 'Plain `,
- errors: ["Expected '===' and instead saw '=='."]
+ errors: [
+ {
+ message: "Expected '===' and instead saw '=='.",
+ suggestions: semver.gte(ESLint.version, '9.26.0')
+ ? [
+ {
+ desc: "Use '===' instead of '=='.",
+ output: `
+ `
+ }
+ ]
+ : null,
+ line: 4,
+ column: 25,
+ endLine: 4,
+ endColumn: 27
+ }
+ ]
}
]
})
diff --git a/tests/lib/rules/first-attribute-linebreak.js b/tests/lib/rules/first-attribute-linebreak.js
index a322aa498..23dd84cf4 100644
--- a/tests/lib/rules/first-attribute-linebreak.js
+++ b/tests/lib/rules/first-attribute-linebreak.js
@@ -161,7 +161,9 @@ name="John Doe"
{
message: 'Expected a linebreak before this attribute.',
line: 8,
- column: 20
+ column: 20,
+ endLine: 8,
+ endColumn: 35
}
]
},
@@ -203,12 +205,16 @@ name="John Doe"
{
message: 'Expected no linebreak before this attribute.',
line: 4,
- column: 11
+ column: 11,
+ endLine: 4,
+ endColumn: 26
},
{
message: 'Expected no linebreak before this attribute.',
line: 13,
- column: 11
+ column: 11,
+ endLine: 13,
+ endColumn: 26
}
]
},
@@ -254,12 +260,16 @@ name="John Doe"
{
message: 'Expected a linebreak before this attribute.',
line: 8,
- column: 20
+ column: 20,
+ endLine: 8,
+ endColumn: 35
},
{
message: 'Expected a linebreak before this attribute.',
line: 15,
- column: 20
+ column: 20,
+ endLine: 15,
+ endColumn: 35
}
]
}
diff --git a/tests/lib/rules/html-button-has-type.js b/tests/lib/rules/html-button-has-type.js
index a5d83777d..e39185395 100644
--- a/tests/lib/rules/html-button-has-type.js
+++ b/tests/lib/rules/html-button-has-type.js
@@ -58,7 +58,10 @@ ruleTester.run('html-button-has-type', rule, {
errors: [
{
message: 'Missing an explicit type attribute for button.',
- column: 11
+ column: 11,
+ line: 1,
+ endLine: 1,
+ endColumn: 19
}
]
},
@@ -68,7 +71,10 @@ ruleTester.run('html-button-has-type', rule, {
errors: [
{
message: 'A value must be set for button type attribute.',
- column: 24
+ column: 24,
+ line: 1,
+ endLine: 1,
+ endColumn: 26
}
]
},
@@ -78,7 +84,10 @@ ruleTester.run('html-button-has-type', rule, {
errors: [
{
message: 'A value must be set for button type attribute.',
- column: 19
+ column: 19,
+ line: 1,
+ endLine: 1,
+ endColumn: 23
}
]
},
@@ -88,7 +97,10 @@ ruleTester.run('html-button-has-type', rule, {
errors: [
{
message: 'foo is an invalid value for button type attribute.',
- column: 24
+ column: 24,
+ line: 1,
+ endLine: 1,
+ endColumn: 29
}
]
},
@@ -99,7 +111,10 @@ ruleTester.run('html-button-has-type', rule, {
errors: [
{
message: 'button is a forbidden value for button type attribute.',
- column: 24
+ column: 24,
+ line: 1,
+ endLine: 1,
+ endColumn: 32
}
]
},
@@ -110,7 +125,10 @@ ruleTester.run('html-button-has-type', rule, {
errors: [
{
message: 'submit is a forbidden value for button type attribute.',
- column: 24
+ column: 24,
+ line: 1,
+ endLine: 1,
+ endColumn: 32
}
]
},
@@ -121,7 +139,10 @@ ruleTester.run('html-button-has-type', rule, {
errors: [
{
message: 'reset is a forbidden value for button type attribute.',
- column: 24
+ column: 24,
+ line: 1,
+ endLine: 1,
+ endColumn: 31
}
]
},
@@ -137,17 +158,23 @@ ruleTester.run('html-button-has-type', rule, {
{
message: 'button is a forbidden value for button type attribute.',
line: 2,
- column: 30
+ column: 30,
+ endLine: 2,
+ endColumn: 38
},
{
message: 'submit is a forbidden value for button type attribute.',
line: 3,
- column: 30
+ column: 30,
+ endLine: 3,
+ endColumn: 38
},
{
message: 'reset is a forbidden value for button type attribute.',
line: 4,
- column: 30
+ column: 30,
+ endLine: 4,
+ endColumn: 37
}
]
},
@@ -165,17 +192,23 @@ ruleTester.run('html-button-has-type', rule, {
{
message: 'reset is a forbidden value for button type attribute.',
line: 4,
- column: 30
+ column: 30,
+ endLine: 4,
+ endColumn: 37
},
{
message: 'A value must be set for button type attribute.',
line: 5,
- column: 30
+ column: 30,
+ endLine: 5,
+ endColumn: 32
},
{
message: 'foo is an invalid value for button type attribute.',
line: 6,
- column: 30
+ column: 30,
+ endLine: 6,
+ endColumn: 35
}
]
},
@@ -185,11 +218,17 @@ ruleTester.run('html-button-has-type', rule, {
errors: [
{
message: 'Missing an explicit type attribute for button.',
- column: 11
+ column: 11,
+ line: 1,
+ endLine: 1,
+ endColumn: 19
},
{
message: 'Missing an explicit type attribute for button.',
- column: 39
+ column: 39,
+ line: 1,
+ endLine: 1,
+ endColumn: 47
}
]
},
@@ -199,7 +238,10 @@ ruleTester.run('html-button-has-type', rule, {
errors: [
{
message: 'A value must be set for button type attribute.',
- column: 25
+ column: 25,
+ line: 1,
+ endLine: 1,
+ endColumn: 27
}
]
}
diff --git a/tests/lib/rules/html-closing-bracket-newline.js b/tests/lib/rules/html-closing-bracket-newline.js
index faf898bc5..37aaa41d2 100644
--- a/tests/lib/rules/html-closing-bracket-newline.js
+++ b/tests/lib/rules/html-closing-bracket-newline.js
@@ -174,8 +174,22 @@ tester.run('html-closing-bracket-newline', rule, {
`,
errors: [
- 'Expected no line breaks before closing bracket, but 1 line break found.',
- 'Expected no line breaks before closing bracket, but 2 line breaks found.'
+ {
+ message:
+ 'Expected no line breaks before closing bracket, but 1 line break found.',
+ line: 3,
+ column: 15,
+ endLine: 4,
+ endColumn: 11
+ },
+ {
+ message:
+ 'Expected no line breaks before closing bracket, but 2 line breaks found.',
+ line: 4,
+ column: 17,
+ endLine: 6,
+ endColumn: 11
+ }
]
},
{
@@ -195,7 +209,14 @@ tester.run('html-closing-bracket-newline', rule, {
`,
errors: [
- 'Expected 1 line break before closing bracket, but no line breaks found.'
+ {
+ message:
+ 'Expected 1 line break before closing bracket, but no line breaks found.',
+ line: 4,
+ column: 18,
+ endLine: 4,
+ endColumn: 18
+ }
]
},
{
@@ -219,8 +240,22 @@ tester.run('html-closing-bracket-newline', rule, {
}
],
errors: [
- 'Expected no line breaks before closing bracket, but 1 line break found.',
- 'Expected no line breaks before closing bracket, but 2 line breaks found.'
+ {
+ message:
+ 'Expected no line breaks before closing bracket, but 1 line break found.',
+ line: 3,
+ column: 15,
+ endLine: 4,
+ endColumn: 11
+ },
+ {
+ message:
+ 'Expected no line breaks before closing bracket, but 2 line breaks found.',
+ line: 4,
+ column: 17,
+ endLine: 6,
+ endColumn: 11
+ }
]
},
{
@@ -246,7 +281,14 @@ tester.run('html-closing-bracket-newline', rule, {
}
],
errors: [
- 'Expected no line breaks before closing bracket, but 1 line break found.'
+ {
+ message:
+ 'Expected no line breaks before closing bracket, but 1 line break found.',
+ line: 4,
+ column: 18,
+ endLine: 5,
+ endColumn: 13
+ }
]
},
{
@@ -272,7 +314,14 @@ tester.run('html-closing-bracket-newline', rule, {
}
],
errors: [
- 'Expected 1 line break before closing bracket, but no line breaks found.'
+ {
+ message:
+ 'Expected 1 line break before closing bracket, but no line breaks found.',
+ line: 4,
+ column: 18,
+ endLine: 4,
+ endColumn: 18
+ }
]
},
{
@@ -297,8 +346,22 @@ tester.run('html-closing-bracket-newline', rule, {
}
],
errors: [
- 'Expected no line breaks before closing bracket, but 1 line break found.',
- 'Expected no line breaks before closing bracket, but 1 line break found.'
+ {
+ message:
+ 'Expected no line breaks before closing bracket, but 1 line break found.',
+ line: 3,
+ column: 21,
+ endLine: 4,
+ endColumn: 11
+ },
+ {
+ message:
+ 'Expected no line breaks before closing bracket, but 1 line break found.',
+ line: 5,
+ column: 16,
+ endLine: 6,
+ endColumn: 11
+ }
]
},
{
@@ -329,8 +392,22 @@ tester.run('html-closing-bracket-newline', rule, {
}
],
errors: [
- 'Expected no line breaks before closing bracket, but 1 line break found.',
- 'Expected 1 line break before closing bracket, but no line breaks found.'
+ {
+ message:
+ 'Expected no line breaks before closing bracket, but 1 line break found.',
+ line: 5,
+ column: 18,
+ endLine: 6,
+ endColumn: 13
+ },
+ {
+ message:
+ 'Expected 1 line break before closing bracket, but no line breaks found.',
+ line: 7,
+ column: 16,
+ endLine: 7,
+ endColumn: 16
+ }
]
},
{
@@ -359,8 +436,22 @@ tester.run('html-closing-bracket-newline', rule, {
}
],
errors: [
- 'Expected 1 line break before closing bracket, but no line breaks found.',
- 'Expected 1 line break before closing bracket, but no line breaks found.'
+ {
+ message:
+ 'Expected 1 line break before closing bracket, but no line breaks found.',
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 21
+ },
+ {
+ message:
+ 'Expected 1 line break before closing bracket, but no line breaks found.',
+ line: 5,
+ column: 16,
+ endLine: 5,
+ endColumn: 16
+ }
]
},
{
@@ -474,42 +565,48 @@ tester.run('html-closing-bracket-newline', rule, {
'Expected 1 line break before closing bracket, but no line breaks found.',
line: 2,
column: 18,
- endColumn: 18
+ endColumn: 18,
+ endLine: 2
},
{
message:
'Expected 1 line break before closing bracket, but no line breaks found.',
line: 3,
column: 19,
- endColumn: 19
+ endColumn: 19,
+ endLine: 3
},
{
message:
'Expected 1 line break before closing bracket, but no line breaks found.',
line: 4,
column: 16,
- endColumn: 16
+ endColumn: 16,
+ endLine: 4
},
{
message:
'Expected 1 line break before closing bracket, but no line breaks found.',
line: 5,
column: 17,
- endColumn: 17
+ endColumn: 17,
+ endLine: 5
},
{
message:
'Expected 1 line break before closing bracket, but no line breaks found.',
line: 6,
column: 15,
- endColumn: 15
+ endColumn: 15,
+ endLine: 6
},
{
message:
'Expected 1 line break before closing bracket, but no line breaks found.',
line: 6,
column: 23,
- endColumn: 23
+ endColumn: 23,
+ endLine: 6
}
]
},
@@ -534,7 +631,14 @@ tester.run('html-closing-bracket-newline', rule, {
}
],
errors: [
- 'Expected no line breaks before closing bracket, but 1 line break found.'
+ {
+ message:
+ 'Expected no line breaks before closing bracket, but 1 line break found.',
+ line: 3,
+ column: 18,
+ endLine: 4,
+ endColumn: 11
+ }
]
},
{
@@ -560,7 +664,14 @@ tester.run('html-closing-bracket-newline', rule, {
}
],
errors: [
- 'Expected 1 line break before closing bracket, but no line breaks found.'
+ {
+ message:
+ 'Expected 1 line break before closing bracket, but no line breaks found.',
+ line: 4,
+ column: 23,
+ endLine: 4,
+ endColumn: 23
+ }
]
},
{
@@ -584,7 +695,14 @@ tester.run('html-closing-bracket-newline', rule, {
}
],
errors: [
- 'Expected 1 line break before closing bracket, but no line breaks found.'
+ {
+ message:
+ 'Expected 1 line break before closing bracket, but no line breaks found.',
+ line: 3,
+ column: 29,
+ endLine: 3,
+ endColumn: 29
+ }
]
},
{
@@ -610,7 +728,14 @@ tester.run('html-closing-bracket-newline', rule, {
}
],
errors: [
- 'Expected no line breaks before closing bracket, but 1 line break found.'
+ {
+ message:
+ 'Expected no line breaks before closing bracket, but 1 line break found.',
+ line: 4,
+ column: 23,
+ endLine: 5,
+ endColumn: 11
+ }
]
}
]
diff --git a/tests/lib/rules/jsx-uses-vars.js b/tests/lib/rules/jsx-uses-vars.js
index 680df0161..81d907dae 100644
--- a/tests/lib/rules/jsx-uses-vars.js
+++ b/tests/lib/rules/jsx-uses-vars.js
@@ -4,12 +4,12 @@
*/
'use strict'
-const eslint = require('../../eslint-compat')
+const semver = require('semver')
+const { RuleTester, ESLint } = require('../../eslint-compat')
const rule = require('../../../lib/rules/jsx-uses-vars')
const { getCoreRule } = require('../../../lib/utils')
const ruleNoUnusedVars = getCoreRule('no-unused-vars')
-const RuleTester = eslint.RuleTester
const ruleTester = new RuleTester({
languageOptions: {
ecmaVersion: 6,
@@ -108,7 +108,23 @@ describe('jsx-uses-vars', () => {
`,
errors: [
{
- message: "'SomeComponent' is defined but never used."
+ message: "'SomeComponent' is defined but never used.",
+ suggestions: semver.gte(ESLint.version, '9.17.0')
+ ? [
+ {
+ desc: "Remove unused variable 'SomeComponent'.",
+ output: `
+ /* eslint vue/jsx-uses-vars: 1 */
+ import './SomeComponent.jsx';
+ export default {
+ render () {
+ return
;
+ },
+ };
+ `
+ }
+ ]
+ : null
}
]
},
@@ -128,7 +144,25 @@ describe('jsx-uses-vars', () => {
`,
errors: [
{
- message: "'wrapper' is assigned a value but never used."
+ message: "'wrapper' is assigned a value but never used.",
+ suggestions: semver.gte(ESLint.version, '9.17.0')
+ ? [
+ {
+ desc: "Remove unused variable 'wrapper'.",
+ output: `
+ /* eslint vue/jsx-uses-vars: 1 */
+ import SomeComponent from './SomeComponent.jsx';
+
+
+ export default {
+ render () {
+ return
;
+ },
+ };
+ `
+ }
+ ]
+ : null
}
]
}
diff --git a/tests/lib/rules/max-props.js b/tests/lib/rules/max-props.js
index 1ebfb9cff..7d000f363 100644
--- a/tests/lib/rules/max-props.js
+++ b/tests/lib/rules/max-props.js
@@ -26,6 +26,15 @@ tester.run('max-props', rule, {
`,
options: [{ maxProps: 5 }]
},
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ options: [{ maxProps: 5 }]
+ },
{
filename: 'test.vue',
code: `
@@ -99,6 +108,20 @@ tester.run('max-props', rule, {
parser: require.resolve('@typescript-eslint/parser')
}
}
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ options: [{ maxProps: 2 }],
+ languageOptions: {
+ parserOptions: {
+ parser: require.resolve('@typescript-eslint/parser')
+ }
+ }
}
],
invalid: [
@@ -160,6 +183,56 @@ tester.run('max-props', rule, {
endLine: 3
}
]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ options: [{ maxProps: 2 }],
+ languageOptions: {
+ parserOptions: {
+ parser: require.resolve('@typescript-eslint/parser')
+ }
+ },
+ errors: [
+ {
+ message: 'Component has too many props (3). Maximum allowed is 2.',
+ line: 3,
+ endLine: 3
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ options: [{ maxProps: 2 }],
+ languageOptions: {
+ parserOptions: {
+ parser: require.resolve('@typescript-eslint/parser')
+ }
+ },
+ errors: [
+ {
+ message: 'Component has too many props (3). Maximum allowed is 2.',
+ line: 3,
+ endLine: 11
+ }
+ ]
}
]
})
diff --git a/tests/lib/rules/no-bare-strings-in-template.js b/tests/lib/rules/no-bare-strings-in-template.js
index 6c8497531..6706aaae0 100644
--- a/tests/lib/rules/no-bare-strings-in-template.js
+++ b/tests/lib/rules/no-bare-strings-in-template.js
@@ -114,7 +114,51 @@ tester.run('no-bare-strings-in-template', rule, {
title="( ) , . & + - = * / # % ! ? : [ ] { } < > • — | ( ) , . & & + − = * * / # % ! ? : [ [ ] ] { { } } < < > > • • — – 	 
 | | |"
/>
- `
+ `,
+ {
+ // https://github.com/vuejs/eslint-plugin-vue/issues/2681
+ code: `
+
+ foo
+ foo_bar
+
+ `,
+ options: [{ allowlist: ['foo', 'foo_bar'] }]
+ },
+ {
+ code: `
+
+ @@
+
+ `,
+ options: [{ allowlist: ['@@'] }]
+ },
+ // regex
+ {
+ code: `
+
+ 123 321
+
+ `,
+ options: [{ allowlist: [String.raw`/\d+/g`] }]
+ },
+ {
+ code: `
+
+ $foo
+ $bar
+
+ `,
+ options: [{ allowlist: [String.raw`/\$\w+/`] }]
+ },
+ {
+ code: `
+
+ foo123foo
+
+ `,
+ options: [{ allowlist: [String.raw`/\d+/`, 'foo'] }]
+ }
],
invalid: [
{
@@ -227,6 +271,24 @@ tester.run('no-bare-strings-in-template', rule, {
}
]
},
+ {
+ code: `
+
+ foo
+ foo_bar
+
+ `,
+ options: [{ allowlist: ['foo'] }],
+ errors: [
+ {
+ messageId: 'unexpected',
+ line: 4,
+ column: 13,
+ endLine: 4,
+ endColumn: 20
+ }
+ ]
+ },
{
code: `
@@ -280,6 +342,40 @@ tester.run('no-bare-strings-in-template', rule, {
endColumn: 34
}
]
+ },
+ {
+ code: `
+
+ 123, foo is invalid, 321
+
+ `,
+ options: [{ allowlist: [String.raw`/^\d+$/g`] }],
+ errors: [
+ {
+ messageId: 'unexpected',
+ line: 3,
+ column: 13,
+ endLine: 3,
+ endColumn: 37
+ }
+ ]
+ },
+ {
+ code: `
+
+ foo123bar
+
+ `,
+ options: [{ allowlist: [String.raw`/\d+/`, 'foo'] }],
+ errors: [
+ {
+ messageId: 'unexpected',
+ line: 3,
+ column: 13,
+ endLine: 3,
+ endColumn: 22
+ }
+ ]
}
]
})
diff --git a/tests/lib/rules/no-deprecated-slot-attribute.js b/tests/lib/rules/no-deprecated-slot-attribute.js
index 2fd5fa401..01b8f31df 100644
--- a/tests/lib/rules/no-deprecated-slot-attribute.js
+++ b/tests/lib/rules/no-deprecated-slot-attribute.js
@@ -55,6 +55,42 @@ tester.run('no-deprecated-slot-attribute', rule, {
`,
options: [{ ignore: ['one', 'two', 'my-component'] }]
+ },
+ {
+ code: `
+
+
+
+
+
+
+
+ `,
+ options: [{ ignore: ['/one/', '/^Two$/i', '/^my-.*/i'] }]
+ },
+ {
+ code: `
+
+
+
+
+
+
+
+ `,
+ options: [{ ignoreParents: ['LinkList'] }]
+ },
+ {
+ code: `
+
+
+
+
+
+
+
+ `,
+ options: [{ ignoreParents: ['/^Link/'] }]
}
],
invalid: [
@@ -74,7 +110,10 @@ tester.run('no-deprecated-slot-attribute', rule, {
errors: [
{
message: '`slot` attributes are deprecated.',
- line: 4
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 25
}
]
},
@@ -94,7 +133,10 @@ tester.run('no-deprecated-slot-attribute', rule, {
errors: [
{
message: '`slot` attributes are deprecated.',
- line: 4
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 25
}
]
},
@@ -114,7 +156,10 @@ tester.run('no-deprecated-slot-attribute', rule, {
errors: [
{
message: '`slot` attributes are deprecated.',
- line: 4
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 25
}
]
},
@@ -134,7 +179,10 @@ tester.run('no-deprecated-slot-attribute', rule, {
errors: [
{
message: '`slot` attributes are deprecated.',
- line: 4
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 25
}
]
},
@@ -154,7 +202,10 @@ tester.run('no-deprecated-slot-attribute', rule, {
errors: [
{
message: '`slot` attributes are deprecated.',
- line: 4
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 25
}
]
},
@@ -173,23 +224,38 @@ tester.run('no-deprecated-slot-attribute', rule, {
errors: [
{
message: '`slot` attributes are deprecated.',
- line: 4
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 25
},
{
message: '`slot` attributes are deprecated.',
- line: 5
+ line: 5,
+ column: 21,
+ endLine: 5,
+ endColumn: 25
},
{
message: '`slot` attributes are deprecated.',
- line: 6
+ line: 6,
+ column: 21,
+ endLine: 6,
+ endColumn: 25
},
{
message: '`slot` attributes are deprecated.',
- line: 7
+ line: 7,
+ column: 21,
+ endLine: 7,
+ endColumn: 25
},
{
message: '`slot` attributes are deprecated.',
- line: 8
+ line: 8,
+ column: 21,
+ endLine: 8,
+ endColumn: 25
}
]
},
@@ -209,7 +275,10 @@ tester.run('no-deprecated-slot-attribute', rule, {
errors: [
{
message: '`slot` attributes are deprecated.',
- line: 4
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 32
}
]
},
@@ -224,7 +293,10 @@ tester.run('no-deprecated-slot-attribute', rule, {
errors: [
{
message: '`slot` attributes are deprecated.',
- line: 4
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 26
}
]
},
@@ -244,7 +316,10 @@ tester.run('no-deprecated-slot-attribute', rule, {
errors: [
{
message: '`slot` attributes are deprecated.',
- line: 4
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 26
}
]
},
@@ -259,7 +334,10 @@ tester.run('no-deprecated-slot-attribute', rule, {
errors: [
{
message: '`slot` attributes are deprecated.',
- line: 4
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 26
}
]
},
@@ -274,7 +352,10 @@ tester.run('no-deprecated-slot-attribute', rule, {
errors: [
{
message: '`slot` attributes are deprecated.',
- line: 4
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 26
}
]
},
@@ -289,7 +370,10 @@ tester.run('no-deprecated-slot-attribute', rule, {
errors: [
{
message: '`slot` attributes are deprecated.',
- line: 4
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 26
}
]
},
@@ -304,7 +388,10 @@ tester.run('no-deprecated-slot-attribute', rule, {
errors: [
{
message: '`slot` attributes are deprecated.',
- line: 4
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 26
}
]
},
@@ -324,7 +411,10 @@ tester.run('no-deprecated-slot-attribute', rule, {
errors: [
{
message: '`slot` attributes are deprecated.',
- line: 4
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 26
}
]
},
@@ -344,7 +434,10 @@ tester.run('no-deprecated-slot-attribute', rule, {
errors: [
{
message: '`slot` attributes are deprecated.',
- line: 4
+ line: 4,
+ column: 14,
+ endLine: 4,
+ endColumn: 18
}
]
},
@@ -364,7 +457,10 @@ tester.run('no-deprecated-slot-attribute', rule, {
errors: [
{
message: '`slot` attributes are deprecated.',
- line: 4
+ line: 4,
+ column: 14,
+ endLine: 4,
+ endColumn: 19
}
]
},
@@ -385,7 +481,15 @@ tester.run('no-deprecated-slot-attribute', rule, {
`,
- errors: ['`slot` attributes are deprecated.']
+ errors: [
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 25
+ }
+ ]
},
{
code: `
@@ -404,7 +508,15 @@ tester.run('no-deprecated-slot-attribute', rule, {
`,
- errors: ['`slot` attributes are deprecated.']
+ errors: [
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 25
+ }
+ ]
},
{
code: `
@@ -423,7 +535,15 @@ tester.run('no-deprecated-slot-attribute', rule, {
`,
- errors: ['`slot` attributes are deprecated.']
+ errors: [
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 25
+ }
+ ]
},
{
// https://github.com/vuejs/eslint-plugin-vue/issues/1499
@@ -458,11 +578,17 @@ tester.run('no-deprecated-slot-attribute', rule, {
errors: [
{
message: '`slot` attributes are deprecated.',
- line: 4
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 25
},
{
message: '`slot` attributes are deprecated.',
- line: 9
+ line: 9,
+ column: 23,
+ endLine: 9,
+ endColumn: 27
}
]
},
@@ -490,8 +616,20 @@ tester.run('no-deprecated-slot-attribute', rule, {
`,
errors: [
- '`slot` attributes are deprecated.',
- '`slot` attributes are deprecated.'
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 4,
+ column: 37,
+ endLine: 4,
+ endColumn: 41
+ },
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 7,
+ column: 37,
+ endLine: 7,
+ endColumn: 42
+ }
]
},
{
@@ -508,8 +646,20 @@ tester.run('no-deprecated-slot-attribute', rule, {
`,
output: null,
errors: [
- '`slot` attributes are deprecated.',
- '`slot` attributes are deprecated.'
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 25
+ },
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 7,
+ column: 21,
+ endLine: 7,
+ endColumn: 25
+ }
]
},
{
@@ -554,8 +704,20 @@ tester.run('no-deprecated-slot-attribute', rule, {
`,
output: null,
errors: [
- '`slot` attributes are deprecated.',
- '`slot` attributes are deprecated.'
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 4,
+ column: 37,
+ endLine: 4,
+ endColumn: 42
+ },
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 7,
+ column: 37,
+ endLine: 7,
+ endColumn: 42
+ }
]
},
{
@@ -582,8 +744,20 @@ tester.run('no-deprecated-slot-attribute', rule, {
`,
errors: [
- '`slot` attributes are deprecated.',
- '`slot` attributes are deprecated.'
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 4,
+ column: 37,
+ endLine: 4,
+ endColumn: 42
+ },
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 7,
+ column: 37,
+ endLine: 7,
+ endColumn: 42
+ }
]
},
{
@@ -610,8 +784,20 @@ tester.run('no-deprecated-slot-attribute', rule, {
`,
errors: [
- '`slot` attributes are deprecated.',
- '`slot` attributes are deprecated.'
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 4,
+ column: 41,
+ endLine: 4,
+ endColumn: 46
+ },
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 7,
+ column: 37,
+ endLine: 7,
+ endColumn: 42
+ }
]
},
{
@@ -642,7 +828,175 @@ tester.run('no-deprecated-slot-attribute', rule, {
ignore: ['one']
}
],
- errors: ['`slot` attributes are deprecated.']
+ errors: [
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 7,
+ column: 16,
+ endLine: 7,
+ endColumn: 20
+ }
+ ]
+ },
+ {
+ code: `
+
+
+
+ A
+
+
+ B
+
+
+ `,
+ output: `
+
+
+
+ A
+
+ \n
+ B
+ \n
+
+ `,
+ options: [
+ {
+ ignore: ['/one/']
+ }
+ ],
+ errors: [
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 7,
+ endLine: 7,
+ column: 16,
+ endColumn: 20
+ }
+ ]
+ },
+ {
+ code: `
+
+
+
+ A
+
+
+ B
+
+
+ `,
+ output: `
+
+
+
+ A
+
+ \n
+ B
+ \n
+
+ `,
+ options: [
+ {
+ ignore: ['/^one$/']
+ }
+ ],
+ errors: [
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 7,
+ endLine: 7,
+ column: 16,
+ endColumn: 20
+ }
+ ]
+ },
+ {
+ code: `
+
+
+
+ A
+
+
+
+
+ B
+
+
+ `,
+ output: `
+
+
+
+ A
+
+
+
+ \n
+ B
+ \n
+
+ `,
+ options: [
+ {
+ ignoreParents: ['my-component']
+ }
+ ],
+ errors: [
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 9,
+ column: 16,
+ endLine: 9,
+ endColumn: 20
+ }
+ ]
+ },
+ {
+ code: `
+
+
+
+ A
+
+
+
+
+ B
+
+
+ `,
+ output: `
+
+
+
+ A
+
+
+
+ \n
+ B
+ \n
+
+ `,
+ options: [
+ {
+ ignoreParents: ['/component$/']
+ }
+ ],
+ errors: [
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 9,
+ column: 16,
+ endLine: 9,
+ endColumn: 20
+ }
+ ]
},
{
code: `
@@ -667,7 +1021,15 @@ tester.run('no-deprecated-slot-attribute', rule, {
`,
- errors: ['`slot` attributes are deprecated.']
+ errors: [
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 6,
+ column: 13,
+ endLine: 6,
+ endColumn: 18
+ }
+ ]
},
{
code: `
@@ -680,7 +1042,15 @@ tester.run('no-deprecated-slot-attribute', rule, {
`,
output: null,
- errors: ['`slot` attributes are deprecated.']
+ errors: [
+ {
+ message: '`slot` attributes are deprecated.',
+ line: 4,
+ column: 16,
+ endLine: 4,
+ endColumn: 20
+ }
+ ]
}
]
})
diff --git a/tests/lib/rules/no-dupe-keys.js b/tests/lib/rules/no-dupe-keys.js
index 124442ec2..2df95908c 100644
--- a/tests/lib/rules/no-dupe-keys.js
+++ b/tests/lib/rules/no-dupe-keys.js
@@ -466,7 +466,7 @@ ruleTester.run('no-dupe-keys', rule, {
{
filename: 'test.vue',
code: `
-
+
`,
@@ -475,7 +475,7 @@ ruleTester.run('no-dupe-keys', rule, {
{
filename: 'test.vue',
code: `
-
+
`,
@@ -500,6 +500,17 @@ ruleTester.run('no-dupe-keys', rule, {
parser: require('vue-eslint-parser'),
parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
}
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ languageOptions: { parser: require('vue-eslint-parser') }
}
],
@@ -1105,6 +1116,24 @@ ruleTester.run('no-dupe-keys', rule, {
line: 5
}
]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ languageOptions: { parser: require('vue-eslint-parser') },
+ errors: [
+ {
+ message:
+ "Duplicate key 'bar'. May cause name collision in script or template tag.",
+ line: 5
+ }
+ ]
}
]
})
diff --git a/tests/lib/rules/no-export-in-script-setup.js b/tests/lib/rules/no-export-in-script-setup.js
index 8703dc74a..bf24b8682 100644
--- a/tests/lib/rules/no-export-in-script-setup.js
+++ b/tests/lib/rules/no-export-in-script-setup.js
@@ -92,20 +92,62 @@ ruleTester.run('no-export-in-script-setup', rule, {
export * from 'foo'
export default {}
export class A {}
+ export const test = '123'
+ export function foo() {}
+ const a = 1
+ export { a }
+ export { fao } from 'bar'
`,
errors: [
{
message: '`
+ `
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `
+ }
+ ],
+ invalid: [
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ output: `
+
+ `,
+ errors: [
+ {
+ messageId: 'noImportCompilerMacros',
+ data: {
+ name: 'defineProps'
+ },
+ line: 3,
+ column: 16
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ output: `
+
+ `,
+ errors: [
+ {
+ messageId: 'noImportCompilerMacros',
+ data: {
+ name: 'defineProps'
+ },
+ line: 5,
+ column: 9
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ output: `
+
+ `,
+ errors: [
+ {
+ messageId: 'noImportCompilerMacros',
+ data: {
+ name: 'defineProps'
+ },
+ line: 3,
+ column: 21
+ },
+ {
+ messageId: 'noImportCompilerMacros',
+ data: {
+ name: 'defineEmits'
+ },
+ line: 4,
+ column: 16
+ },
+ {
+ messageId: 'noImportCompilerMacros',
+ data: {
+ name: 'defineExpose'
+ },
+ line: 5,
+ column: 16
+ },
+ {
+ messageId: 'noImportCompilerMacros',
+ data: {
+ name: 'withDefaults'
+ },
+ line: 5,
+ column: 37
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ output: `
+
+ `,
+ errors: [
+ {
+ messageId: 'noImportCompilerMacros',
+ data: {
+ name: 'defineModel'
+ },
+ line: 3,
+ column: 16
+ },
+ {
+ messageId: 'noImportCompilerMacros',
+ data: {
+ name: 'defineOptions'
+ },
+ line: 3,
+ column: 29
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ output: `
+
+ `,
+ languageOptions: {
+ parserOptions: {
+ parser: require.resolve('@typescript-eslint/parser')
+ }
+ },
+ errors: [
+ {
+ messageId: 'noImportCompilerMacros',
+ data: {
+ name: 'defineSlots'
+ },
+ line: 3,
+ column: 31
+ }
+ ]
+ }
+ ]
+})
diff --git a/tests/lib/rules/no-invalid-model-keys.js b/tests/lib/rules/no-invalid-model-keys.js
deleted file mode 100644
index 44469346f..000000000
--- a/tests/lib/rules/no-invalid-model-keys.js
+++ /dev/null
@@ -1,143 +0,0 @@
-/**
- * @fileoverview Prevents invalid keys in model option.
- * @author Alex Sokolov
- */
-'use strict'
-
-const rule = require('../../../lib/rules/no-invalid-model-keys')
-const RuleTester = require('../../eslint-compat').RuleTester
-
-const ruleTester = new RuleTester({
- languageOptions: {
- ecmaVersion: 2018,
- sourceType: 'module'
- }
-})
-ruleTester.run('no-invalid-model-keys', rule, {
- valid: [
- {
- filename: 'test.vue',
- code: `
- export default {
- model: {
- prop: 'list'
- }
- }
- `
- },
- {
- filename: 'test.vue',
- code: `
- export default {
- model: {
- event: 'update'
- }
- }
- `
- },
- {
- filename: 'test.vue',
- code: `
- export default {
- model: {
- prop: 'list',
- event: 'update'
- }
- }
- `
- }
- ],
-
- invalid: [
- {
- filename: 'test.vue',
- code: `
- export default {
- model: {
- props: 'list'
- }
- }
- `,
- errors: ["Invalid key 'props' in model option."]
- },
- {
- filename: 'test.vue',
- code: `
- export default {
- model: {
- events: 'update'
- }
- }
- `,
- errors: ["Invalid key 'events' in model option."]
- },
- {
- filename: 'test.vue',
- code: `
- export default {
- model: {
- props: 'list',
- event: 'update'
- }
- }
- `,
- errors: ["Invalid key 'props' in model option."]
- },
- {
- filename: 'test.vue',
- code: `
- export default {
- model: {
- prop: 'list',
- events: 'update'
- }
- }
- `,
- errors: ["Invalid key 'events' in model option."]
- },
- {
- filename: 'test.vue',
- code: `
- export default {
- model: {
- props: 'list',
- events: 'update'
- }
- }
- `,
- errors: [
- "Invalid key 'props' in model option.",
- "Invalid key 'events' in model option."
- ]
- },
- {
- filename: 'test.vue',
- code: `
- export default {
- model: {
- prop: 'checked',
- props: 'list',
- event: 'update'
- }
- }
- `,
- errors: ["Invalid key 'props' in model option."]
- },
- {
- filename: 'test.vue',
- code: `
- export default {
- model: {
- name: 'checked',
- props: 'list',
- event: 'update'
- }
- }
- `,
- errors: [
- "Invalid key 'name' in model option.",
- "Invalid key 'props' in model option."
- ]
- }
- ]
-})
diff --git a/tests/lib/rules/no-multiple-template-root.js b/tests/lib/rules/no-multiple-template-root.js
index 7ab80af7e..c52c1c202 100644
--- a/tests/lib/rules/no-multiple-template-root.js
+++ b/tests/lib/rules/no-multiple-template-root.js
@@ -62,6 +62,66 @@ ruleTester.run('no-multiple-template-root', rule, {
`
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+ 12333
+
+
+ `,
+ options: [{ disallowComments: false }]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+
+ 12333
+
+
+ `,
+ options: [{ disallowComments: false }]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ 12333
+
+
+ 12333
+
+
+
+ `,
+ options: [{ disallowComments: true }]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ 12333
+
+
+ 12333
+
+
+
+
+ 12333
+
+
+ `,
+ options: [{ disallowComments: true }]
}
],
invalid: [
@@ -104,6 +164,132 @@ ruleTester.run('no-multiple-template-root', rule, {
filename: 'test.vue',
code: '
',
errors: ["The template root disallows '
' elements."]
+ },
+ {
+ code: `
+
+
+ 12333
+
+
+ `,
+ options: [{ disallowComments: true }],
+ errors: [
+ {
+ message: 'The template root disallows comments.',
+ line: 3
+ },
+ {
+ message: 'The template root disallows comments.',
+ line: 5
+ }
+ ]
+ },
+ {
+ code: `
+
+
+
+ 12333
+
+
+
+ `,
+ options: [{ disallowComments: true }],
+ errors: [
+ {
+ message: 'The template root disallows comments.',
+ line: 3
+ }
+ ]
+ },
+ {
+ code: `
+
+
+
+
+ 12333
+
+
+ 12333
+
+
+
+
+
+ 12333
+
+
+
+ `,
+ options: [{ disallowComments: true }],
+ errors: [
+ {
+ message: 'The template root disallows comments.',
+ line: 3
+ },
+ {
+ message: 'The template root disallows comments.',
+ line: 12
+ },
+ {
+ message: 'The template root disallows comments.',
+ line: 17
+ }
+ ]
+ },
+ {
+ code: `
+
+
+ 12333
+
+
+
+
+ `,
+ options: [{ disallowComments: true }],
+ errors: [
+ {
+ message: 'The template root disallows comments.',
+ line: 7
+ }
+ ]
+ },
+ {
+ code: `
+
+
+
+
+
+ `,
+ options: [{ disallowComments: true }],
+ errors: [
+ {
+ message: 'The template root disallows comments.',
+ line: 4
+ },
+ {
+ message: 'The template root requires exactly one element.',
+ line: 5
+ }
+ ]
+ },
+ {
+ code: `
+
+
+
+ 12333
+
+
+
+ `,
+ options: [{ disallowComments: true }],
+ errors: ['The template root disallows comments.']
}
]
})
diff --git a/tests/lib/rules/no-negated-condition.js b/tests/lib/rules/no-negated-condition.js
new file mode 100644
index 000000000..4a4d5e4c2
--- /dev/null
+++ b/tests/lib/rules/no-negated-condition.js
@@ -0,0 +1,166 @@
+/**
+ * @author Wayne Zhang
+ * See LICENSE file in root directory for full license.
+ */
+'use strict'
+
+const RuleTester = require('../../eslint-compat').RuleTester
+const rule = require('../../../lib/rules/no-negated-condition')
+
+const tester = new RuleTester({
+ languageOptions: {
+ parser: require('vue-eslint-parser'),
+ ecmaVersion: 2020,
+ sourceType: 'module'
+ }
+})
+
+tester.run('no-negated-condition', rule, {
+ valid: [
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `
+ }
+ ],
+ invalid: [
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ errors: [
+ {
+ message: 'Unexpected negated condition.',
+ line: 3,
+ column: 22,
+ endLine: 3,
+ endColumn: 42
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ errors: [
+ {
+ message: 'Unexpected negated condition.',
+ line: 4,
+ column: 22,
+ endLine: 4,
+ endColumn: 51
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ errors: [
+ {
+ message: 'Unexpected negated condition.',
+ line: 4,
+ column: 21,
+ endLine: 4,
+ endColumn: 40
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ errors: [
+ {
+ message: 'Unexpected negated condition.',
+ line: 3,
+ column: 25,
+ endLine: 3,
+ endColumn: 48
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ errors: [
+ {
+ message: 'Unexpected negated condition.',
+ line: 3,
+ column: 22,
+ endLine: 3,
+ endColumn: 52
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ errors: [
+ {
+ message: 'Unexpected negated condition.',
+ line: 3,
+ column: 22,
+ endLine: 3,
+ endColumn: 52
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ errors: [
+ {
+ message: 'Unexpected negated condition.',
+ line: 4,
+ column: 20,
+ endLine: 4,
+ endColumn: 37
+ }
+ ]
+ }
+ ]
+})
diff --git a/tests/lib/rules/no-ref-as-operand.js b/tests/lib/rules/no-ref-as-operand.js
index d57356356..9db2ab3a0 100644
--- a/tests/lib/rules/no-ref-as-operand.js
+++ b/tests/lib/rules/no-ref-as-operand.js
@@ -168,6 +168,22 @@ tester.run('no-ref-as-operand', rule, {
}
`,
+ `
+
+ `,
+ `
+
+ `,
`
+ `,
+ `
+
+ `,
+ `
+
+ `,
+ `
+
+ `,
+ `
+
+ `,
+ `
+
+ `,
+ `
+
`
],
invalid: [
@@ -823,6 +939,176 @@ tester.run('no-ref-as-operand', rule, {
}
]
},
+ {
+ code: `
+
+ `,
+ output: `
+
+ `,
+ errors: [
+ {
+ message:
+ 'Must use `.value` to read or write the value wrapped by `ref()`.',
+ line: 8,
+ endLine: 8
+ }
+ ]
+ },
+ {
+ code: `
+
+ `,
+ output: `
+
+ `,
+ errors: [
+ {
+ message:
+ 'Must use `.value` to read or write the value wrapped by `ref()`.',
+ line: 10,
+ endLine: 10
+ }
+ ]
+ },
+ {
+ code: `
+
+ `,
+ output: `
+
+ `,
+ errors: [
+ {
+ message:
+ 'Must use `.value` to read or write the value wrapped by `ref()`.',
+ line: 10,
+ endLine: 10
+ }
+ ]
+ },
+ {
+ code: `
+
+ `,
+ output: `
+
+ `,
+ errors: [
+ {
+ message:
+ 'Must use `.value` to read or write the value wrapped by `ref()`.',
+ line: 10,
+ endLine: 10
+ }
+ ]
+ },
// Auto-import
{
code: `
diff --git a/tests/lib/rules/no-ref-object-destructure.js b/tests/lib/rules/no-ref-object-destructure.js
deleted file mode 100644
index e9b6e0d59..000000000
--- a/tests/lib/rules/no-ref-object-destructure.js
+++ /dev/null
@@ -1,449 +0,0 @@
-/**
- * @author Yosuke Ota
- * See LICENSE file in root directory for full license.
- */
-'use strict'
-
-const RuleTester = require('../../eslint-compat').RuleTester
-const rule = require('../../../lib/rules/no-ref-object-destructure')
-
-const tester = new RuleTester({
- languageOptions: {
- ecmaVersion: 2020,
- sourceType: 'module'
- }
-})
-
-tester.run('no-ref-object-destructure', rule, {
- valid: [
- `
- import { ref } from 'vue'
- const count = ref(0)
- const value1 = computed(() => count.value)
- const value2 = fn(count)
- const value3 = computed(() => fn(count.value))
- `,
- `
- import { toRefs } from 'vue'
- const { count } = toRefs(foo)
- const value1 = computed(() => count.value)
- const value2 = fn(count)
- const value3 = computed(() => fn(count.value))
- `,
- `
- import { toRefs } from 'vue'
- const refs = toRefs(foo)
- const value1 = computed(() => refs.count.value)
- const value2 = fn(refs.count)
- const value3 = computed(() => fn(refs.count.value))
- `,
- `
- import { ref } from 'vue'
- const count = ref(0)
- count.value = 42
- `,
- `
- import { ref } from 'vue'
- const count = ref(0)
- count.value++
- `,
- `
- import { ref } from 'vue'
- const count = ref(0)
- ;( { foo: count.value } = bar )
- `,
- `
- import { ref, computed, shallowRef, customRef, toRef } from 'vue'
- const r = ref(0)
- const c = computed(() => r.value)
- const sr = shallowRef({ count: 1 })
- const cr = customRef((track, trigger) => {
- return {
- get() { return sr.value },
- set(newValue) { sr.value = newValue }
- }
- })
- const tr = toRef(sr, 'count')
- function fn() {
- console.log(c.value, cr.value, tr.value)
- }
- `,
- // unknown
- `
- import { ref } from 'vue'
- const [a] = ref(0)
- foo.bar = ref(0)
- unknown.value
- `,
- `
- import { ref } from 'vue'
- let foo = ref(0)
- foo = foo
- `,
- // Reactivity Transform
- `
- const count = $ref(0)
- const value1 = computed(() => count)
- const value2 = fn($$(count))
- const value3 = computed(() => fn(count))
- `,
- `
- const count = $(foo)
- const value1 = computed(() => count)
- const value2 = fn($$(count))
- const value3 = computed(() => fn(count))
- `,
- `
- const { count } = $(foo)
- const value1 = computed(() => count)
- const value2 = fn($$(count))
- const value3 = computed(() => fn(count))
- `,
- `
- let count = $ref(0)
- count = 42
- `,
- `
- let count = $ref(0)
- count++
- `,
- `
- let count = $ref(0)
- ;( { foo: count } = bar )
- `,
- `
- const { v1, v2, v3, v4 } = $(foo)
- fn($$({ v1, a: [v2], a: [...v3], ...v4}))
- `,
- `
- let r = $ref(0)
- let c = $computed(() => r)
- let sr = $shallowRef({ count: 1 })
- let cr = $customRef((track, trigger) => {
- return {
- get() { return sr },
- set(newValue) { sr = newValue }
- }
- })
- let tr = $toRef($$(sr), 'count')
- function fn() {
- console.log(
- r.value,
- c.value,
- sr.value,
- cr.value,
- tr.value
- )
- }
- `
- ],
- invalid: [
- {
- code: `
- import { ref } from 'vue'
- const count = ref(0)
- const value1 = count.value
- const { value: value2 } = count
- const value3 = fn(count.value)
- const { value: value4 = 42 } = count
- if (foo) {
- const value1 = count.value
- }
- `,
- errors: [
- {
- message:
- 'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
- line: 4
- },
- {
- message:
- 'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
- line: 5
- },
- {
- message:
- 'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
- line: 6
- },
- {
- message:
- 'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
- line: 7
- },
- {
- message:
- 'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
- line: 9
- }
- ]
- },
- {
- code: `
- import { toRefs } from 'vue'
- const { count } = toRefs(foo)
- const value1 = count.value
- const { value: value2 } = count
- const value3 = fn(count.value)
- `,
- errors: [
- {
- message:
- 'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
- line: 4
- },
- {
- message:
- 'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
- line: 5
- },
- {
- message:
- 'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
- line: 6
- }
- ]
- },
- {
- code: `
- import { toRefs } from 'vue'
- const refs = toRefs(foo)
- const value1 = refs.count.value
- const { value: value2 } = refs.count
- const value3 = fn(refs.count.value)
- `,
- errors: [
- {
- message:
- 'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
- line: 4
- },
- {
- message:
- 'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
- line: 5
- },
- {
- message:
- 'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
- line: 6
- }
- ]
- },
- {
- code: `
- import { ref } from 'vue'
- const count = ref(0).value
- `,
- errors: [
- {
- message:
- 'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
- line: 3
- }
- ]
- },
- {
- code: `
- import { toRefs } from 'vue'
- const refs = toRefs(foo)
- const { foo = 42 } = refs
- const v = foo.value
- `,
- errors: [
- {
- message:
- 'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
- line: 5
- }
- ]
- },
- {
- code: `
- import { ref, computed, shallowRef, customRef, toRef } from 'vue'
- const r = ref(0)
- const c = computed(() => r.value)
- const sr = shallowRef({ count: 1 })
- const cr = customRef((track, trigger) => {
- return {
- get() { return sr.value },
- set(newValue) { sr.value = newValue }
- }
- })
- const tr = toRef(sr, 'count')
-
- console.log(
- r.value,
- c.value,
- sr.value,
- cr.value,
- tr.value
- )
- `,
- errors: [
- {
- message:
- 'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
- line: 15
- },
- {
- message:
- 'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
- line: 16
- },
- {
- message:
- 'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
- line: 17
- },
- {
- message:
- 'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
- line: 18
- },
- {
- message:
- 'Getting a value from the ref object in the same scope will cause the value to lose reactivity.',
- line: 19
- }
- ]
- },
- // Reactivity Transform
- {
- code: `
- const count = $ref(0)
- const value1 = count
- const value2 = fn(count)
- `,
- errors: [
- {
- message:
- 'Getting a reactive variable in the same scope will cause the value to lose reactivity.',
- line: 3
- },
- {
- message:
- 'Getting a reactive variable in the same scope will cause the value to lose reactivity.',
- line: 4
- }
- ]
- },
- {
- code: `
- const count = $(foo)
- const value1 = count
- const value2 = fn(count)
- `,
- errors: [
- {
- message:
- 'Getting a reactive variable in the same scope will cause the value to lose reactivity.',
- line: 3
- },
- {
- message:
- 'Getting a reactive variable in the same scope will cause the value to lose reactivity.',
- line: 4
- }
- ]
- },
- {
- code: `
- const { count } = $(foo)
- const value1 = count
- const value2 = fn(count)
- `,
- errors: [
- {
- message:
- 'Getting a reactive variable in the same scope will cause the value to lose reactivity.',
- line: 3
- },
- {
- message:
- 'Getting a reactive variable in the same scope will cause the value to lose reactivity.',
- line: 4
- }
- ]
- },
- {
- code: `
- const { v1, a: [v2 = 42], b: [...v3], ...v4 } = $(foo)
- const value1 = v1
- const value2 = v2
- const value3 = v3
- const value4 = v4
- `,
- errors: [
- {
- message:
- 'Getting a reactive variable in the same scope will cause the value to lose reactivity.',
- line: 3
- },
- {
- message:
- 'Getting a reactive variable in the same scope will cause the value to lose reactivity.',
- line: 4
- },
- {
- message:
- 'Getting a reactive variable in the same scope will cause the value to lose reactivity.',
- line: 5
- },
- {
- message:
- 'Getting a reactive variable in the same scope will cause the value to lose reactivity.',
- line: 6
- }
- ]
- },
- {
- code: `
- let r = $ref(0)
- let c = $computed(() => r)
- let sr = $shallowRef({ count: 1 })
- let cr = $customRef((track, trigger) => {
- return {
- get() { return sr },
- set(newValue) { sr = newValue }
- }
- })
- let tr = $toRef($$(sr), 'count')
- console.log(
- r.value,
- c.value,
- sr.value,
- cr.value,
- tr.value
- )
- `,
- errors: [
- {
- message:
- 'Getting a reactive variable in the same scope will cause the value to lose reactivity.',
- line: 13
- },
- {
- message:
- 'Getting a reactive variable in the same scope will cause the value to lose reactivity.',
- line: 14
- },
- {
- message:
- 'Getting a reactive variable in the same scope will cause the value to lose reactivity.',
- line: 15
- },
- {
- message:
- 'Getting a reactive variable in the same scope will cause the value to lose reactivity.',
- line: 16
- },
- {
- message:
- 'Getting a reactive variable in the same scope will cause the value to lose reactivity.',
- line: 17
- }
- ]
- }
- ]
-})
diff --git a/tests/lib/rules/no-reserved-component-names.js b/tests/lib/rules/no-reserved-component-names.js
index 231e1f98d..809d35103 100644
--- a/tests/lib/rules/no-reserved-component-names.js
+++ b/tests/lib/rules/no-reserved-component-names.js
@@ -247,12 +247,6 @@ const invalidElements = [
'menuitem',
'summary',
'Summary',
- 'content',
- 'Content',
- 'element',
- 'Element',
- 'shadow',
- 'Shadow',
'template',
'Template',
'slot',
@@ -278,8 +272,6 @@ const invalidElements = [
'Defs',
'desc',
'Desc',
- 'discard',
- 'Discard',
'ellipse',
'Ellipse',
'feBlend',
@@ -351,8 +343,6 @@ const invalidElements = [
'textPath',
'tspan',
'Tspan',
- 'unknown',
- 'Unknown',
'use',
'Use',
'view',
@@ -373,8 +363,6 @@ const invalidElements = [
'Blink',
'center',
'Center',
- 'command',
- 'Command',
'dir',
'Dir',
'font',
diff --git a/tests/lib/rules/no-restricted-html-elements.js b/tests/lib/rules/no-restricted-html-elements.js
index c3e3e9eeb..f89f58a11 100644
--- a/tests/lib/rules/no-restricted-html-elements.js
+++ b/tests/lib/rules/no-restricted-html-elements.js
@@ -31,6 +31,23 @@ tester.run('no-restricted-html-elements', rule, {
filename: 'test.vue',
code: '
',
options: ['button']
+ },
+ {
+ filename: 'test.vue',
+ code: ' ',
+ options: [{ element: ['div', 'span'] }]
+ },
+ // SVG
+ {
+ filename: 'test.vue',
+ code: ' ',
+ options: ['circle']
+ },
+ // Math
+ {
+ filename: 'test.vue',
+ code: '2 ',
+ options: ['mi']
}
],
invalid: [
@@ -40,7 +57,7 @@ tester.run('no-restricted-html-elements', rule, {
options: ['button'],
errors: [
{
- message: 'Unexpected use of forbidden HTML element button.',
+ message: 'Unexpected use of forbidden element button.',
line: 1,
column: 16
}
@@ -52,7 +69,7 @@ tester.run('no-restricted-html-elements', rule, {
options: ['div'],
errors: [
{
- message: 'Unexpected use of forbidden HTML element div.',
+ message: 'Unexpected use of forbidden element div.',
line: 1,
column: 11
}
@@ -69,6 +86,85 @@ tester.run('no-restricted-html-elements', rule, {
column: 11
}
]
+ },
+ {
+ filename: 'test.vue',
+ code: ' ',
+ options: [
+ {
+ element: ['a', 'RouterLink'],
+ message: 'Prefer the use of component'
+ }
+ ],
+ errors: [
+ {
+ message: 'Prefer the use of component',
+ line: 1,
+ column: 11
+ },
+ {
+ message: 'Prefer the use of component',
+ line: 1,
+ column: 18
+ }
+ ]
+ },
+ // SVG
+ {
+ filename: 'test.vue',
+ code: ' ',
+ options: ['circle'],
+ errors: [
+ {
+ message: 'Unexpected use of forbidden element circle.',
+ line: 1,
+ column: 16
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: ' ',
+ options: [
+ { element: ['rect', 'path'], message: 'Use simplified shapes instead' }
+ ],
+ errors: [
+ {
+ message: 'Use simplified shapes instead',
+ line: 1,
+ column: 16
+ },
+ {
+ message: 'Use simplified shapes instead',
+ line: 1,
+ column: 54
+ }
+ ]
+ },
+ // Math
+ {
+ filename: 'test.vue',
+ code: '1 2 ',
+ options: ['mfrac'],
+ errors: [
+ {
+ message: 'Unexpected use of forbidden element mfrac.',
+ line: 1,
+ column: 17
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: 'x = 5 ',
+ options: [{ element: 'mo', message: 'Avoid using operators directly' }],
+ errors: [
+ {
+ message: 'Avoid using operators directly',
+ line: 1,
+ column: 27
+ }
+ ]
}
]
})
diff --git a/tests/lib/rules/no-setup-props-destructure.js b/tests/lib/rules/no-setup-props-destructure.js
deleted file mode 100644
index eecbcd6d7..000000000
--- a/tests/lib/rules/no-setup-props-destructure.js
+++ /dev/null
@@ -1,670 +0,0 @@
-/**
- * @author Yosuke Ota
- */
-'use strict'
-
-const RuleTester = require('../../eslint-compat').RuleTester
-const rule = require('../../../lib/rules/no-setup-props-destructure')
-
-const tester = new RuleTester({
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 2020,
- sourceType: 'module'
- }
-})
-
-tester.run('no-setup-props-destructure', rule, {
- valid: [
- {
- filename: 'test.vue',
- code: `
-
- `
- },
- {
- filename: 'test.vue',
- code: `
-
- `
- },
- {
- filename: 'test.vue',
- code: `
-
- `
- },
- {
- filename: 'test.vue',
- code: `
-
- `
- },
- {
- filename: 'test.vue',
- code: `
-
- `
- },
- {
- filename: 'test.vue',
- code: `
-
- `
- },
- {
- filename: 'test.vue',
- code: `
-
- `
- },
- {
- filename: 'test.vue',
- code: `
-
- `
- },
- {
- filename: 'test.vue',
- code: `
-
- `
- },
- {
- filename: 'test.vue',
- code: `
-
- `
- },
- {
- filename: 'test.vue',
- code: `
-
- `
- },
- `
- Vue.component('test', {
- el: a = b
- })
- `,
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 4
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 4
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `
- },
- {
- filename: 'test.vue',
- code: `
-
- `
- }
- ],
- invalid: [
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'destructuring',
- line: 4,
- column: 15,
- endLine: 4,
- endColumn: 24
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 5,
- column: 17,
- endLine: 5,
- endColumn: 26
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 5
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 5
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 5
- },
- {
- messageId: 'getProperty',
- line: 11
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 5
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 5
- },
- {
- messageId: 'getProperty',
- line: 6
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 5
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 5
- },
- {
- messageId: 'getProperty',
- line: 6
- },
- {
- messageId: 'getProperty',
- line: 7
- },
- {
- messageId: 'getProperty',
- line: 9
- },
- {
- messageId: 'getProperty',
- line: 10
- },
- {
- messageId: 'getProperty',
- line: 11
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 6
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 5
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 5
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- message:
- 'Getting a value from the `props` in root scope of `
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 4
- },
- {
- messageId: 'getProperty',
- line: 5
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 5
- },
- {
- messageId: 'getProperty',
- line: 6
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 4
- },
- {
- messageId: 'getProperty',
- line: 5
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 4
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 4
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 4
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 4
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- errors: [
- {
- messageId: 'getProperty',
- line: 6
- }
- ]
- }
- ]
-})
diff --git a/tests/lib/rules/no-undef-components.js b/tests/lib/rules/no-undef-components.js
index e9992e39d..37a3bec68 100644
--- a/tests/lib/rules/no-undef-components.js
+++ b/tests/lib/rules/no-undef-components.js
@@ -269,6 +269,21 @@ tester.run('no-undef-components', rule, {
}
]
},
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+
+ `
+ },
{
filename: 'test.vue',
code: `
diff --git a/tests/lib/rules/order-in-components.js b/tests/lib/rules/order-in-components.js
index 2cbe721c5..c8afe3db1 100644
--- a/tests/lib/rules/order-in-components.js
+++ b/tests/lib/rules/order-in-components.js
@@ -50,6 +50,8 @@ ruleTester.run('order-in-components', rule, {
model,
props, propsData,
emits,
+ slots,
+ expose,
setup,
data,
computed,
@@ -234,6 +236,84 @@ ruleTester.run('order-in-components', rule, {
}
]
},
+ {
+ filename: 'test.vue',
+ code: `
+ import { defineComponent } from 'vue'
+ export default defineComponent({
+ name: 'app',
+ data () {
+ return {
+ msg: 'Welcome to Your Vue.js App'
+ }
+ },
+ props: {
+ propA: Number,
+ },
+ })
+ `,
+ output: `
+ import { defineComponent } from 'vue'
+ export default defineComponent({
+ name: 'app',
+ props: {
+ propA: Number,
+ },
+ data () {
+ return {
+ msg: 'Welcome to Your Vue.js App'
+ }
+ },
+ })
+ `,
+ languageOptions,
+ errors: [
+ {
+ message:
+ 'The "props" property should be above the "data" property on line 5.',
+ line: 10
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+ import { defineNuxtComponent } from '#app'
+ export default defineNuxtComponent({
+ name: 'app',
+ data () {
+ return {
+ msg: 'Welcome to Your Vue.js App'
+ }
+ },
+ props: {
+ propA: Number,
+ },
+ })
+ `,
+ output: `
+ import { defineNuxtComponent } from '#app'
+ export default defineNuxtComponent({
+ name: 'app',
+ props: {
+ propA: Number,
+ },
+ data () {
+ return {
+ msg: 'Welcome to Your Vue.js App'
+ }
+ },
+ })
+ `,
+ languageOptions,
+ errors: [
+ {
+ message:
+ 'The "props" property should be above the "data" property on line 5.',
+ line: 10
+ }
+ ]
+ },
{
filename: 'test.jsx',
code: `
@@ -1207,6 +1287,61 @@ ruleTester.run('order-in-components', rule, {
line: 5
}
]
+ },
+ {
+ filename: 'example.vue',
+ code: `
+ export default {
+ setup,
+ slots,
+ expose,
+ };
+ `,
+ output: `
+ export default {
+ slots,
+ setup,
+ expose,
+ };
+ `,
+ languageOptions,
+ errors: [
+ {
+ message:
+ 'The "slots" property should be above the "setup" property on line 3.',
+ line: 4
+ },
+ {
+ message:
+ 'The "expose" property should be above the "setup" property on line 3.',
+ line: 5
+ }
+ ]
+ },
+ {
+ filename: 'example.vue',
+ code: `
+ export default {
+ slots,
+ setup,
+ expose,
+ };
+ `,
+ output: `
+ export default {
+ slots,
+ expose,
+ setup,
+ };
+ `,
+ languageOptions,
+ errors: [
+ {
+ message:
+ 'The "expose" property should be above the "setup" property on line 4.',
+ line: 5
+ }
+ ]
}
]
})
diff --git a/tests/lib/rules/prefer-true-attribute-shorthand.js b/tests/lib/rules/prefer-true-attribute-shorthand.js
index 43253fd69..80965bac6 100644
--- a/tests/lib/rules/prefer-true-attribute-shorthand.js
+++ b/tests/lib/rules/prefer-true-attribute-shorthand.js
@@ -148,6 +148,24 @@ tester.run('prefer-true-attribute-shorthand', rule, {
`,
options: ['never']
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ options: ['always', { except: ['value', '/^foo-/'] }]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ `,
+ options: ['never', { except: ['value', '/^foo-/'] }]
}
],
invalid: [
@@ -280,6 +298,98 @@ tester.run('prefer-true-attribute-shorthand', rule, {
]
}
]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+ `,
+ output: null,
+ options: ['always', { except: ['value', '/^foo-/'] }],
+ errors: [
+ {
+ messageId: 'expectLong',
+ line: 3,
+ column: 17,
+ suggestions: [
+ {
+ messageId: 'rewriteIntoLongVueProp',
+ output: `
+
+
+ `
+ },
+ {
+ messageId: 'rewriteIntoLongHtmlAttr',
+ output: `
+
+
+ `
+ }
+ ]
+ },
+ {
+ messageId: 'expectLong',
+ line: 3,
+ column: 23,
+ suggestions: [
+ {
+ messageId: 'rewriteIntoLongVueProp',
+ output: `
+
+
+ `
+ },
+ {
+ messageId: 'rewriteIntoLongHtmlAttr',
+ output: `
+
+
+ `
+ }
+ ]
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+ `,
+ output: null,
+ options: ['never', { except: ['value', '/^foo-/'] }],
+ errors: [
+ {
+ messageId: 'expectShort',
+ line: 3,
+ column: 17,
+ suggestions: [
+ {
+ messageId: 'rewriteIntoShort',
+ output: `
+
+
+ `
+ }
+ ]
+ },
+ {
+ messageId: 'expectShort',
+ line: 3,
+ column: 31,
+ suggestions: [
+ {
+ messageId: 'rewriteIntoShort',
+ output: `
+
+
+ `
+ }
+ ]
+ }
+ ]
}
]
})
diff --git a/tests/lib/rules/prefer-use-template-ref.js b/tests/lib/rules/prefer-use-template-ref.js
index 77020cdcf..afc6d6a11 100644
--- a/tests/lib/rules/prefer-use-template-ref.js
+++ b/tests/lib/rules/prefer-use-template-ref.js
@@ -252,6 +252,51 @@ tester.run('prefer-use-template-ref', rule, {
}
`
+ },
+ {
+ filename: 'non-block-arrow-setup-function.vue',
+ code: `
+
+ `
+ },
+ {
+ filename: 'multiple-scripts-setup-first.vue',
+ code: `
+
+
+
+
+
+
+
+ `
+ },
+ {
+ filename: 'multiple-scripts-setup-last.vue',
+ code: `
+
+
+
+
+
+
+
+ `
}
],
invalid: [
@@ -383,6 +428,86 @@ tester.run('prefer-use-template-ref', rule, {
column: 22
}
]
+ },
+ {
+ filename: 'block-arrow-setup-function.vue',
+ code: `
+
+ Click
+
+
+ `,
+ errors: [
+ {
+ messageId: 'preferUseTemplateRef',
+ data: {
+ name: 'ref'
+ },
+ line: 9,
+ column: 28
+ }
+ ]
+ },
+ {
+ filename: 'multiple-scripts-setup-first.vue',
+ code: `
+
+
+
+
+
+
+
+ `,
+ errors: [
+ {
+ messageId: 'preferUseTemplateRef',
+ data: {
+ name: 'ref'
+ },
+ line: 8,
+ column: 20
+ }
+ ]
+ },
+ {
+ filename: 'multiple-scripts-setup-last.vue',
+ code: `
+
+
+
+
+
+
+
+ `,
+ errors: [
+ {
+ messageId: 'preferUseTemplateRef',
+ data: {
+ name: 'ref'
+ },
+ line: 12,
+ column: 20
+ }
+ ]
}
]
})
diff --git a/tests/lib/rules/prop-name-casing.js b/tests/lib/rules/prop-name-casing.js
index 65748dc49..a83893a5a 100644
--- a/tests/lib/rules/prop-name-casing.js
+++ b/tests/lib/rules/prop-name-casing.js
@@ -149,7 +149,7 @@ ruleTester.run('prop-name-casing', rule, {
languageOptions
},
{
- // valiable computed property name does not warn
+ // variable computed property name does not warn
filename: 'test.vue',
code: `
export default {
@@ -161,7 +161,7 @@ ruleTester.run('prop-name-casing', rule, {
languageOptions
},
{
- // valiable computed property name does not warn
+ // variable computed property name does not warn
filename: 'test.vue',
code: `
export default {
@@ -359,6 +359,23 @@ ruleTester.run('prop-name-casing', rule, {
parser: require.resolve('@typescript-eslint/parser')
}
}
+ },
+ {
+ filename: 'test.vue',
+ code: `
+ export default {
+ props: {
+ 'ignored-pattern-test': String,
+ ignored_prop: Number,
+ validProp: Boolean
+ }
+ }
+ `,
+ options: [
+ 'camelCase',
+ { ignoreProps: ['ignored_prop', '/^ignored-pattern-/'] }
+ ],
+ languageOptions
}
],
@@ -686,6 +703,54 @@ ruleTester.run('prop-name-casing', rule, {
}
]
}
- ])
+ ]),
+ {
+ filename: 'test.vue',
+ code: `
+ export default {
+ props: {
+ notIgnored_prop: String,
+ 'other-pattern': Number,
+ 'pattern-valid': String
+ }
+ }
+ `,
+ options: ['camelCase', { ignoreProps: ['ignored_prop', '/^pattern-/'] }],
+ languageOptions,
+ errors: [
+ {
+ message: 'Prop "notIgnored_prop" is not in camelCase.',
+ type: 'Property',
+ line: 4
+ },
+ {
+ message: 'Prop "other-pattern" is not in camelCase.',
+ type: 'Property',
+ line: 5
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+ export default {
+ props: ['notIgnored_prop', 'pattern_invalid', 'validProp', 'pattern-valid']
+ }
+ `,
+ options: ['camelCase', { ignoreProps: ['ignored_prop', '/^pattern-/'] }],
+ languageOptions,
+ errors: [
+ {
+ message: 'Prop "notIgnored_prop" is not in camelCase.',
+ type: 'Literal',
+ line: 3
+ },
+ {
+ message: 'Prop "pattern_invalid" is not in camelCase.',
+ type: 'Literal',
+ line: 3
+ }
+ ]
+ }
]
})
diff --git a/tests/lib/rules/require-default-prop.js b/tests/lib/rules/require-default-prop.js
index e352eddf3..43160dfda 100644
--- a/tests/lib/rules/require-default-prop.js
+++ b/tests/lib/rules/require-default-prop.js
@@ -388,6 +388,31 @@ ruleTester.run('require-default-prop', rule, {
parser: require('vue-eslint-parser'),
...languageOptions
}
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ languageOptions: {
+ parser: require('vue-eslint-parser'),
+ ...languageOptions
+ }
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ languageOptions: {
+ parser: require('vue-eslint-parser'),
+ ...languageOptions,
+ parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
+ }
}
],
@@ -700,6 +725,26 @@ ruleTester.run('require-default-prop', rule, {
line: 3
}
]
+ },
+ {
+ // https://github.com/vuejs/eslint-plugin-vue/issues/2725
+ filename: 'type-with-props-destructure.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: 3
+ }
+ ]
}
]
})
diff --git a/tests/lib/rules/require-explicit-slots.js b/tests/lib/rules/require-explicit-slots.js
index f99614119..afee739a6 100644
--- a/tests/lib/rules/require-explicit-slots.js
+++ b/tests/lib/rules/require-explicit-slots.js
@@ -6,6 +6,9 @@
const RuleTester = require('../../eslint-compat').RuleTester
const rule = require('../../../lib/rules/require-explicit-slots')
+const {
+ getTypeScriptFixtureTestOptions
+} = require('../../test-utils/typescript')
const tester = new RuleTester({
languageOptions: {
@@ -276,6 +279,21 @@ tester.run('require-explicit-slots', rule, {
})
`
},
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+
+
+
+ `,
+ ...getTypeScriptFixtureTestOptions()
+ },
{
filename: 'test.vue',
code: `
@@ -656,6 +674,28 @@ tester.run('require-explicit-slots', rule, {
}
]
},
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+
+
+
+ `,
+ errors: [
+ {
+ message: 'Slots must be explicitly defined.',
+ line: 5,
+ column: 11
+ }
+ ],
+ ...getTypeScriptFixtureTestOptions()
+ },
{
// ignore attribute binding except string literal
filename: 'test.vue',
diff --git a/tests/lib/rules/require-valid-default-prop.js b/tests/lib/rules/require-valid-default-prop.js
index 238460876..103b6b7d3 100644
--- a/tests/lib/rules/require-valid-default-prop.js
+++ b/tests/lib/rules/require-valid-default-prop.js
@@ -108,6 +108,7 @@ ruleTester.run('require-valid-default-prop', rule, {
foo: { type: String, default () { return Foo } },
foo: { type: Number, default () { return Foo } },
foo: { type: Object, default () { return Foo } },
+ foo: { type: Object, default: null },
}
})`,
languageOptions
@@ -221,8 +222,7 @@ ruleTester.run('require-valid-default-prop', rule, {
`,
languageOptions: {
parser: require('@typescript-eslint/parser'),
- ecmaVersion: 6,
- sourceType: 'module'
+ ...languageOptions
}
},
{
@@ -331,6 +331,17 @@ ruleTester.run('require-valid-default-prop', rule, {
languageOptions: {
parser: require('vue-eslint-parser')
}
+ },
+ {
+ // https://github.com/vuejs/eslint-plugin-vue/issues/2692
+ filename: 'test.vue',
+ code: `
+
+ `,
+ ...getTypeScriptFixtureTestOptions()
}
],
@@ -1200,6 +1211,22 @@ ruleTester.run('require-valid-default-prop', rule, {
line: 3
}
]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ errors: [
+ {
+ message: "Type of the default value for 'foo' prop must be a string.",
+ line: 4
+ }
+ ],
+ ...getTypeScriptFixtureTestOptions()
}
]
})
diff --git a/tests/lib/rules/script-setup-uses-vars.js b/tests/lib/rules/script-setup-uses-vars.js
deleted file mode 100644
index f903a3f9b..000000000
--- a/tests/lib/rules/script-setup-uses-vars.js
+++ /dev/null
@@ -1,379 +0,0 @@
-/**
- * @fileoverview Prevent `
-
-
-
-
- `
- ],
- invalid: []
-})
-describe('script-setup-uses-vars', () => {
- ruleTester.run('no-unused-vars', ruleNoUnusedVars, {
- valid: [
- {
- filename: 'test.vue',
- code: `
-
-
-
-
-
- `
- },
- {
- filename: 'test.vue',
- code: `
-
-
-
- {{ msg }}
-
- `
- },
- {
- filename: 'test.vue',
- code: `
-
-
-
-
-
-
-
- `
- },
- {
- filename: 'test.vue',
- code: `
-
-
-
-
-
-
- `
- },
- {
- filename: 'test.vue',
- code: `
-
-
-
-
-
- `
- },
-
- // Resolve component name
- {
- filename: 'test.vue',
- code: `
-
-
-
-
-
-
-
- `
- },
- {
- filename: 'test.vue',
- code: `
-
-
-
-
-
-
- `
- },
-
- // TopLevel await
- {
- filename: 'test.vue',
- code: `
-
-
-
- {{post}}
-
- `,
- languageOptions: {
- ecmaVersion: 2022,
- sourceType: 'module'
- }
- },
-
- // ref
- {
- filename: 'test.vue',
- code: `
-
-
-
-
-
- `
- },
-
- //style vars
- {
- filename: 'test.vue',
- code: `
-
-
-
- `
- },
- // ns
- {
- filename: 'test.vue',
- code: `
-
-
-
-
- label
-
-
- `
- }
- ],
-
- invalid: [
- {
- filename: 'test.vue',
- code: `
-
-
-
-
-
- `,
- errors: [
- {
- message: "'Bar' is defined but never used.",
- line: 6
- },
- {
- message: "'baz' is assigned a value but never used.",
- line: 19
- }
- ]
- },
-
- // Resolve component name
- {
- filename: 'test.vue',
- code: `
-
-
-
-
-
- `,
- errors: [
- {
- message: "'camelCase' is defined but never used.",
- line: 4
- }
- ]
- },
-
- // Scope tests
- {
- filename: 'test.vue',
- code: `
-
-
-
- {{ msg }}
-
- `,
- errors: [
- {
- message: "'msg' is assigned a value but never used.",
- line: 5
- }
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
-
-
- {{ i }}
-
- `,
- errors: [
- {
- message: "'i' is assigned a value but never used.",
- line: 4
- }
- ]
- },
-
- // Not `
-
-
- {{ msg }}
-
- `,
- errors: [
- {
- message: "'msg' is assigned a value but never used.",
- line: 4
- }
- ]
- },
-
- //style vars
- {
- filename: 'test.vue',
- code: `
-
-
-
- `,
- errors: ["'color' is assigned a value but never used."]
- }
- ]
- })
-})
diff --git a/tests/lib/rules/v-on-function-call.js b/tests/lib/rules/v-on-function-call.js
deleted file mode 100644
index ad6292505..000000000
--- a/tests/lib/rules/v-on-function-call.js
+++ /dev/null
@@ -1,356 +0,0 @@
-/**
- * @author Niklas Higi
- */
-'use strict'
-
-const RuleTester = require('../../eslint-compat').RuleTester
-const rule = require('../../../lib/rules/v-on-function-call')
-
-const tester = new RuleTester({
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 2020,
- sourceType: 'module'
- }
-})
-
-tester.run('v-on-function-call', rule, {
- valid: [
- {
- filename: 'test.vue',
- code: ''
- },
- {
- filename: 'test.vue',
- code: '
',
- options: ['always']
- },
- {
- filename: 'test.vue',
- code: '
',
- options: ['never']
- },
- {
- filename: 'test.vue',
- code: '
',
- options: ['always']
- },
- {
- filename: 'test.vue',
- code: '
',
- options: ['never']
- },
- {
- filename: 'test.vue',
- code: '
'
- },
- {
- filename: 'test.vue',
- code: '
',
- options: ['always']
- },
- {
- filename: 'test.vue',
- code: '
'
- },
- {
- filename: 'test.vue',
- code: '
',
- options: ['always']
- },
- {
- filename: 'test.vue',
- code: '
foo.bar()">
'
- },
- {
- filename: 'test.vue',
- code: '
foo.bar()">
',
- options: ['always']
- },
- {
- filename: 'test.vue',
- code: `
-
-
- `,
- options: ['never']
- },
- {
- filename: 'test.vue',
- code: `
-
-
- `,
- options: ['never']
- },
- {
- filename: 'test.vue',
- code: `
-
-
- `,
- options: ['never']
- },
- {
- filename: 'test.vue',
- code: `
-
-
- `,
- options: ['never', { ignoreIncludesComment: true }]
- },
- {
- filename: 'test.vue',
- code: '
',
- options: ['never']
- },
- {
- filename: 'test.vue',
- code: `
-
- `,
- options: ['never']
- },
- {
- filename: 'test.vue',
- code: `
-
-
-
-
-
- `,
- options: ['never']
- },
- {
- filename: 'test.vue',
- code: `
-
-
-
-
-
- `,
- options: ['never']
- }
- ],
- invalid: [
- {
- filename: 'test.vue',
- code: '
',
- output: null,
- options: ['always'],
- errors: [
- "Method calls inside of 'v-on' directives must have parentheses."
- ]
- },
- {
- filename: 'test.vue',
- code: '
',
- output: `
`,
- options: ['never'],
- errors: [
- "Method calls without arguments inside of 'v-on' directives must not have parentheses."
- ]
- },
- {
- filename: 'test.vue',
- code: '
',
- output: `
`,
- options: ['never'],
- errors: [
- "Method calls without arguments inside of 'v-on' directives must not have parentheses."
- ]
- },
- {
- filename: 'test.vue',
- code: '
',
- output: null,
- options: ['never'],
- errors: [
- "Method calls without arguments inside of 'v-on' directives must not have parentheses."
- ]
- },
- {
- filename: 'test.vue',
- code: `
-
-
-
-
-