+
+
+
+
+ `,
+ options: [{ maxDepth: 3 }],
+ errors: [
+ {
+ message:
+ 'Element is nested too deeply (depth of 4, maximum allowed is 3).',
+ line: 9,
+ endLine: 12
+ },
+ {
+ message:
+ 'Element is nested too deeply (depth of 5, maximum allowed is 3).',
+ line: 10,
+ endLine: 10
+ },
+ {
+ message:
+ 'Element is nested too deeply (depth of 5, maximum allowed is 3).',
+ line: 11,
+ endLine: 12
+ }
+ ]
+ }
+ ]
+})
diff --git a/tests/lib/rules/no-deprecated-slot-attribute.js b/tests/lib/rules/no-deprecated-slot-attribute.js
index 51d109358..2fd5fa401 100644
--- a/tests/lib/rules/no-deprecated-slot-attribute.js
+++ b/tests/lib/rules/no-deprecated-slot-attribute.js
@@ -643,6 +643,44 @@ tester.run('no-deprecated-slot-attribute', rule, {
}
],
errors: ['`slot` attributes are deprecated.']
+ },
+ {
+ code: `
+
+
+
+
+ `,
+ output: `
+
+
+
+
+
+
+ `,
+ errors: ['`slot` attributes are deprecated.']
+ },
+ {
+ code: `
+
+
+
+ Passing in a named slot to a div worked with old syntax
+ But not with new syntax
+
+
+ `,
+ output: null,
+ errors: ['`slot` attributes are deprecated.']
}
]
})
diff --git a/tests/lib/rules/require-default-export.js b/tests/lib/rules/require-default-export.js
new file mode 100644
index 000000000..279af4a38
--- /dev/null
+++ b/tests/lib/rules/require-default-export.js
@@ -0,0 +1,190 @@
+/**
+ * @author ItMaga
+ * See LICENSE file in root directory for full license.
+ */
+'use strict'
+
+const RuleTester = require('../../eslint-compat').RuleTester
+const rule = require('../../../lib/rules/require-default-export')
+
+const tester = new RuleTester({
+ languageOptions: {
+ parser: require('vue-eslint-parser'),
+ ecmaVersion: 2020,
+ sourceType: 'module'
+ }
+})
+
+tester.run('require-default-export', rule, {
+ valid: [
+ {
+ filename: 'test.vue',
+ code: `
+
Without script
+ `
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `
+ },
+ {
+ filename: 'test.js',
+ code: `
+ const foo = 'foo';
+ export const bar = 'bar';
+ `
+ },
+ {
+ filename: 'test.js',
+ code: `
+ import {defineComponent} from 'vue';
+ defineComponent({});
+ `
+ }
+ ],
+ invalid: [
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ errors: [
+ {
+ messageId: 'missing',
+ line: 4,
+ endLine: 4,
+ column: 7,
+ endColumn: 16
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ errors: [
+ {
+ messageId: 'missing',
+ line: 4,
+ endLine: 4,
+ column: 7,
+ endColumn: 16
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ errors: [
+ {
+ messageId: 'missing',
+ line: 6,
+ endLine: 6,
+ column: 7,
+ endColumn: 16
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ errors: [
+ {
+ messageId: 'missing',
+ line: 5,
+ endLine: 5,
+ column: 7,
+ endColumn: 16
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ errors: [
+ {
+ messageId: 'mustBeDefaultExport',
+ line: 6,
+ endLine: 6,
+ column: 7,
+ endColumn: 16
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ errors: [
+ {
+ messageId: 'mustBeDefaultExport',
+ line: 6,
+ endLine: 6,
+ column: 7,
+ endColumn: 16
+ }
+ ]
+ }
+ ]
+})
diff --git a/tests/lib/rules/require-toggle-inside-transition.js b/tests/lib/rules/require-toggle-inside-transition.js
index d40ad4748..cdd48c493 100644
--- a/tests/lib/rules/require-toggle-inside-transition.js
+++ b/tests/lib/rules/require-toggle-inside-transition.js
@@ -77,6 +77,15 @@ tester.run('require-toggle-inside-transition', rule, {
{
filename: 'test.vue',
code: '
'
+ },
+ {
+ filename: 'test.vue',
+ code: '
',
+ options: [
+ {
+ additionalDirectives: ['dialog']
+ }
+ ]
}
],
invalid: [
@@ -132,6 +141,36 @@ tester.run('require-toggle-inside-transition', rule, {
filename: 'test.vue',
code: '
',
errors: [{ messageId: 'expected' }]
+ },
+ {
+ filename: 'test.vue',
+ code: '
',
+ options: [
+ {
+ additionalDirectives: []
+ }
+ ],
+ errors: [
+ {
+ messageId: 'expected',
+ data: { allowedDirectives: '`v-if` or `v-show`' }
+ }
+ ]
+ },
+ {
+ filename: 'test.vue',
+ code: '
',
+ options: [
+ {
+ additionalDirectives: ['dialog']
+ }
+ ],
+ errors: [
+ {
+ messageId: 'expected',
+ data: { allowedDirectives: '`v-if`, `v-show` or `v-dialog`' }
+ }
+ ]
}
]
})
diff --git a/tests/lib/rules/require-typed-object-prop.js b/tests/lib/rules/require-typed-object-prop.js
index 9f5f000a9..8a16fb567 100644
--- a/tests/lib/rules/require-typed-object-prop.js
+++ b/tests/lib/rules/require-typed-object-prop.js
@@ -9,7 +9,12 @@ const rule = require('../../../lib/rules/require-typed-object-prop')
const ruleTester = new RuleTester({
languageOptions: {
- parser: require('@typescript-eslint/parser')
+ parser: require('vue-eslint-parser'),
+ ecmaVersion: 6,
+ sourceType: 'module',
+ parserOptions: {
+ parser: require.resolve('@typescript-eslint/parser')
+ }
}
})
@@ -19,20 +24,22 @@ ruleTester.run('require-typed-object-prop', rule, {
{
filename: 'test.vue',
code: `
+
+ `
},
{
filename: 'test.vue',
code: `
+
+ `
},
{
filename: 'test.vue',
@@ -40,31 +47,28 @@ ruleTester.run('require-typed-object-prop', rule, {
- `,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 6,
- sourceType: 'module'
- }
+ `
},
// array props
{
filename: 'test.vue',
code: `
+
+ `
},
{
filename: 'test.vue',
code: `
+
+ `
},
{
filename: 'test.vue',
@@ -72,31 +76,28 @@ ruleTester.run('require-typed-object-prop', rule, {
- `,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 6,
- sourceType: 'module'
- }
+ `
},
// primitive props
{
filename: 'test.vue',
code: `
+
+ `
},
{
filename: 'test.vue',
code: `
+
+ `
},
{
filename: 'test.vue',
@@ -104,31 +105,28 @@ ruleTester.run('require-typed-object-prop', rule, {
- `,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 6,
- sourceType: 'module'
- }
+ `
},
// union
{
filename: 'test.vue',
code: `
+
+ `
},
{
filename: 'test.vue',
code: `
+
+ `
},
{
filename: 'test.vue',
@@ -136,31 +134,28 @@ ruleTester.run('require-typed-object-prop', rule, {
- `,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 6,
- sourceType: 'module'
- }
+ `
},
// function
{
filename: 'test.vue',
code: `
+
+ `
},
{
filename: 'test.vue',
code: `
+
+ `
},
{
filename: 'test.vue',
@@ -168,40 +163,38 @@ ruleTester.run('require-typed-object-prop', rule, {
- `,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 6,
- sourceType: 'module'
- }
+ `
},
// typed object
{
filename: 'test.vue',
code: `
+
+ `
},
{
filename: 'test.vue',
code: `
+
+ `
},
{
filename: 'test.vue',
code: `
+
+ `
},
{
filename: 'test.vue',
@@ -209,42 +202,28 @@ ruleTester.run('require-typed-object-prop', rule, {
- `,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 6,
- sourceType: 'module',
- parserOptions: {
- parser: require.resolve('@typescript-eslint/parser')
- }
- }
+ `
},
{
filename: 'test.vue',
code: `
+
+ `
},
{
filename: 'test.vue',
code: `
+
+ `
},
{
filename: 'test.vue',
@@ -252,15 +231,7 @@ ruleTester.run('require-typed-object-prop', rule, {
- `,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 6,
- sourceType: 'module',
- parserOptions: {
- parser: require.resolve('@typescript-eslint/parser')
- }
- }
+ `
},
// any
{
@@ -269,15 +240,7 @@ ruleTester.run('require-typed-object-prop', rule, {
- `,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 6,
- sourceType: 'module',
- parserOptions: {
- parser: require.resolve('@typescript-eslint/parser')
- }
- }
+ `
},
{
filename: 'test.vue',
@@ -289,15 +252,7 @@ ruleTester.run('require-typed-object-prop', rule, {
}
};
- `,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 6,
- sourceType: 'module',
- parserOptions: {
- parser: require.resolve('@typescript-eslint/parser')
- }
- }
+ `
},
{
filename: 'test.vue',
@@ -309,13 +264,7 @@ ruleTester.run('require-typed-object-prop', rule, {
}
});
- `,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 6,
- sourceType: 'module',
- parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
- }
+ `
},
// unknown
{
@@ -324,13 +273,7 @@ ruleTester.run('require-typed-object-prop', rule, {
- `,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 6,
- sourceType: 'module',
- parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
- }
+ `
},
{
filename: 'test.vue',
@@ -342,13 +285,7 @@ ruleTester.run('require-typed-object-prop', rule, {
}
};
- `,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 6,
- sourceType: 'module',
- parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
- }
+ `
},
{
filename: 'test.vue',
@@ -360,13 +297,34 @@ ruleTester.run('require-typed-object-prop', rule, {
}
});
- `,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 6,
- sourceType: 'module',
- parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
- }
+ `
+ },
+ // JavaScript components
+ {
+ filename: 'test.vue',
+ code: `
+
+ `
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `
+ },
+ {
+ filename: 'test.js',
+ code: `
+ export default Vue.extend({
+ props: { foo: Object }
+ });
+ `
}
],
invalid: [
@@ -377,14 +335,6 @@ ruleTester.run('require-typed-object-prop', rule, {
defineProps({ foo: Object });
`,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 6,
- sourceType: 'module',
- parserOptions: {
- parser: require.resolve('@typescript-eslint/parser')
- }
- },
errors: [
{
messageId: 'expectedTypeAnnotation',
@@ -422,14 +372,6 @@ ruleTester.run('require-typed-object-prop', rule, {
defineProps({ foo: Array });
`,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 6,
- sourceType: 'module',
- parserOptions: {
- parser: require.resolve('@typescript-eslint/parser')
- }
- },
errors: [
{
messageId: 'expectedTypeAnnotation',
@@ -463,35 +405,40 @@ ruleTester.run('require-typed-object-prop', rule, {
{
filename: 'test.vue',
code: `
+
`,
- languageOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [
{
messageId: 'expectedTypeAnnotation',
- line: 3,
+ line: 4,
column: 23,
- endLine: 3,
+ endLine: 4,
endColumn: 29,
suggestions: [
{
messageId: 'addTypeAnnotation',
data: { type: 'any' },
output: `
+
`
},
{
messageId: 'addTypeAnnotation',
data: { type: 'unknown' },
output: `
+
`
}
]
@@ -501,35 +448,40 @@ ruleTester.run('require-typed-object-prop', rule, {
{
filename: 'test.vue',
code: `
+
`,
- languageOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [
{
messageId: 'expectedTypeAnnotation',
- line: 3,
+ line: 4,
column: 23,
- endLine: 3,
+ endLine: 4,
endColumn: 29,
suggestions: [
{
messageId: 'addTypeAnnotation',
data: { type: 'any' },
output: `
+
`
},
{
messageId: 'addTypeAnnotation',
data: { type: 'unknown' },
output: `
+
`
}
]
@@ -539,35 +491,40 @@ ruleTester.run('require-typed-object-prop', rule, {
{
filename: 'test.vue',
code: `
+
`,
- languageOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [
{
messageId: 'expectedTypeAnnotation',
- line: 3,
+ line: 4,
column: 31,
- endLine: 3,
+ endLine: 4,
endColumn: 37,
suggestions: [
{
messageId: 'addTypeAnnotation',
data: { type: 'any' },
output: `
+
`
},
{
messageId: 'addTypeAnnotation',
data: { type: 'unknown' },
output: `
+
`
}
]
@@ -577,35 +534,40 @@ ruleTester.run('require-typed-object-prop', rule, {
{
filename: 'test.vue',
code: `
+
`,
- languageOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [
{
messageId: 'expectedTypeAnnotation',
- line: 3,
+ line: 4,
column: 31,
- endLine: 3,
+ endLine: 4,
endColumn: 37,
suggestions: [
{
messageId: 'addTypeAnnotation',
data: { type: 'any' },
output: `
+
`
},
{
messageId: 'addTypeAnnotation',
data: { type: 'unknown' },
output: `
+
`
}
]
@@ -619,14 +581,6 @@ ruleTester.run('require-typed-object-prop', rule, {
defineProps({ foo: { type: Object } });
`,
- languageOptions: {
- parser: require('vue-eslint-parser'),
- ecmaVersion: 6,
- sourceType: 'module',
- parserOptions: {
- parser: require.resolve('@typescript-eslint/parser')
- }
- },
errors: [
{
messageId: 'expectedTypeAnnotation',
@@ -656,6 +610,44 @@ ruleTester.run('require-typed-object-prop', rule, {
]
}
]
+ },
+ {
+ // `.ts` file
+ filename: 'test.ts',
+ code: `
+ export default Vue.extend({
+ props: { foo: Object }
+ });
+ `,
+ errors: [
+ {
+ messageId: 'expectedTypeAnnotation',
+ line: 3,
+ column: 23,
+ endLine: 3,
+ endColumn: 29,
+ suggestions: [
+ {
+ messageId: 'addTypeAnnotation',
+ data: { type: 'any' },
+ output: `
+ export default Vue.extend({
+ props: { foo: Object as PropType
}
+ });
+ `
+ },
+ {
+ messageId: 'addTypeAnnotation',
+ data: { type: 'unknown' },
+ output: `
+ export default Vue.extend({
+ props: { foo: Object as PropType }
+ });
+ `
+ }
+ ]
+ }
+ ]
}
]
})
diff --git a/tests/lib/rules/v-if-else-key.js b/tests/lib/rules/v-if-else-key.js
index 16d975a0a..46c42f52f 100644
--- a/tests/lib/rules/v-if-else-key.js
+++ b/tests/lib/rules/v-if-else-key.js
@@ -127,6 +127,90 @@ tester.run('v-if-else-key', rule, {
}
`
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+
+ `
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+
+ `
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+ …
+ …
+
+ …
+ …
+
+
+
+ `
}
],
invalid: [
@@ -424,6 +508,74 @@ tester.run('v-if-else-key', rule, {
line: 6
}
]
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+
+
+
+
+
+
+
+
+
+
+ `,
+ output: `
+
+
+
+
+
+
+
+
+
+
+
+ `,
+ errors: [
+ {
+ message:
+ "Conditionally rendered repeated component 'ComponentA' expected to have a 'key' attribute.",
+ line: 4
+ },
+ {
+ message:
+ "Conditionally rendered repeated component 'ComponentA' expected to have a 'key' attribute.",
+ line: 5
+ },
+ {
+ message:
+ "Conditionally rendered repeated component 'ComponentA' expected to have a 'key' attribute.",
+ line: 7
+ },
+ {
+ message:
+ "Conditionally rendered repeated component 'ComponentA' expected to have a 'key' attribute.",
+ line: 8
+ },
+ {
+ message:
+ "Conditionally rendered repeated component 'ComponentA' expected to have a 'key' attribute.",
+ line: 9
+ }
+ ]
}
]
})
diff --git a/tools/update-lib-flat-configs.js b/tools/update-lib-flat-configs.js
index 9d1671b90..d25ba2815 100644
--- a/tools/update-lib-flat-configs.js
+++ b/tools/update-lib-flat-configs.js
@@ -58,7 +58,7 @@ function formatCategory(category) {
const globals = require('globals')
module.exports = [
{
- name: 'vue:base:setup',
+ name: 'vue/base/setup',
plugins: {
get vue() {
return require('../../index')
@@ -70,7 +70,7 @@ module.exports = [
}
},
{
- name: 'vue:base:setup-for-vue',
+ name: 'vue/base/setup-for-vue',
files: ['*.vue', '**/*.vue'],
plugins: {
get vue() {
@@ -99,7 +99,7 @@ const config = require('./${extendsCategoryId}.js')
module.exports = [
...config,
{
- name: 'vue:${category.categoryId.replace(/^vue3-/u, '')}:rules',
+ name: 'vue/${category.categoryId.replace(/^vue3-/u, '')}/rules',
rules: ${formatRules(category.rules, category.categoryId)},
}
]