diff --git a/lib/rules/match-component-file-name.js b/lib/rules/match-component-file-name.js index 57fd4ff89..40d01ba00 100644 --- a/lib/rules/match-component-file-name.js +++ b/lib/rules/match-component-file-name.js @@ -31,6 +31,8 @@ function canVerify(node) { module.exports = { meta: { + // eslint-disable-next-line eslint-plugin/require-meta-has-suggestions + hasSuggestions: true, type: 'suggestion', docs: { description: 'require component name property to match its file name', @@ -114,7 +116,17 @@ module.exports = { node, message: 'Component name `{{name}}` should match file name `{{filename}}`.', - data: { filename, name } + data: { filename, name }, + suggest: [ + { + desc: 'Rename component to match file name.', + fix(fixer) { + const quote = + node.type === 'TemplateLiteral' ? '`' : node.raw[0] + return fixer.replaceText(node, `${quote}${filename}${quote}`) + } + } + ] }) } } diff --git a/tests/lib/rules/match-component-file-name.js b/tests/lib/rules/match-component-file-name.js index d1b4c3371..c654d8266 100644 --- a/tests/lib/rules/match-component-file-name.js +++ b/tests/lib/rules/match-component-file-name.js @@ -564,9 +564,21 @@ ruleTester.run('match-component-file-name', rule, { errors: [ { message: - 'Component name `MComponent` should match file name `MyComponent`.' + 'Component name `MComponent` should match file name `MyComponent`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + export default { + name: 'MyComponent', + render() { return
} } - ] + ` + } + ] + } + ], + output: null }, { filename: 'MyComponent.jsx', @@ -581,9 +593,50 @@ ruleTester.run('match-component-file-name', rule, { errors: [ { message: - 'Component name `MComponent` should match file name `MyComponent`.' + 'Component name `MComponent` should match file name `MyComponent`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + export default { + name: 'MyComponent', + render() { return
} } - ] + ` + } + ] + } + ], + output: null + }, + { + filename: 'MyComponent.jsx', + code: ` + export default { + name: "MComponent", + render() { return
} + } + `, + options: [{ extensions: ['jsx'] }], + parserOptions: jsxParserOptions, + errors: [ + { + message: + 'Component name `MComponent` should match file name `MyComponent`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + export default { + name: "MyComponent", + render() { return
} + } + ` + } + ] + } + ], + output: null }, { filename: 'MyComponent.jsx', @@ -598,9 +651,21 @@ ruleTester.run('match-component-file-name', rule, { errors: [ { message: - 'Component name `MComponent` should match file name `MyComponent`.' + 'Component name `MComponent` should match file name `MyComponent`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + export default { + name: \`MyComponent\`, + render() { return
} + } + ` + } + ] } - ] + ], + output: null }, // .vue @@ -620,9 +685,57 @@ ruleTester.run('match-component-file-name', rule, { errors: [ { message: - 'Component name `MComponent` should match file name `MyComponent`.' + 'Component name `MComponent` should match file name `MyComponent`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + + ` + } + ] + } + ], + output: null + }, + { + filename: 'MyComponent.vue', + code: ` + + `, + options: [{ extensions: ['vue'] }], + parser: require.resolve('vue-eslint-parser'), + parserOptions, + errors: [ + { + message: + 'Component name `MComponent` should match file name `MyComponent`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + + ` + } + ] } - ] + ], + output: null }, { filename: 'MyComponent.vue', @@ -640,9 +753,23 @@ ruleTester.run('match-component-file-name', rule, { errors: [ { message: - 'Component name `MComponent` should match file name `MyComponent`.' + 'Component name `MComponent` should match file name `MyComponent`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + + ` + } + ] } - ] + ], + output: null }, // .js @@ -659,9 +786,50 @@ ruleTester.run('match-component-file-name', rule, { errors: [ { message: - 'Component name `MComponent` should match file name `MyComponent`.' + 'Component name `MComponent` should match file name `MyComponent`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + new Vue({ + name: 'MyComponent', + template: '
' + }) + ` + } + ] + } + ], + output: null + }, + { + filename: 'MyComponent.js', + code: ` + new Vue({ + name: "MComponent", + template: '
' + }) + `, + options: [{ extensions: ['js'] }], + parserOptions, + errors: [ + { + message: + 'Component name `MComponent` should match file name `MyComponent`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + new Vue({ + name: "MyComponent", + template: '
' + }) + ` + } + ] } - ] + ], + output: null }, { filename: 'MyComponent.js', @@ -676,9 +844,21 @@ ruleTester.run('match-component-file-name', rule, { errors: [ { message: - 'Component name `MComponent` should match file name `MyComponent`.' + 'Component name `MComponent` should match file name `MyComponent`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + new Vue({ + name: \`MyComponent\`, + template: '
' + }) + ` + } + ] } - ] + ], + output: null }, { filename: 'MyComponent.js', @@ -692,9 +872,47 @@ ruleTester.run('match-component-file-name', rule, { errors: [ { message: - 'Component name `MComponent` should match file name `MyComponent`.' + 'Component name `MComponent` should match file name `MyComponent`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + Vue.mixin({ + name: 'MyComponent', + }) + ` + } + ] + } + ], + output: null + }, + { + filename: 'MyComponent.js', + code: ` + Vue.mixin({ + name: "MComponent", + }) + `, + options: [{ extensions: ['js'] }], + parserOptions, + errors: [ + { + message: + 'Component name `MComponent` should match file name `MyComponent`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + Vue.mixin({ + name: "MyComponent", + }) + ` + } + ] } - ] + ], + output: null }, { filename: 'MyComponent.js', @@ -708,9 +926,20 @@ ruleTester.run('match-component-file-name', rule, { errors: [ { message: - 'Component name `MComponent` should match file name `MyComponent`.' + 'Component name `MComponent` should match file name `MyComponent`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + Vue.mixin({ + name: \`MyComponent\`, + }) + ` + } + ] } - ] + ], + output: null }, { filename: 'MyComponent.js', @@ -724,9 +953,47 @@ ruleTester.run('match-component-file-name', rule, { errors: [ { message: - 'Component name `MComponent` should match file name `MyComponent`.' + 'Component name `MComponent` should match file name `MyComponent`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + Vue.component('MyComponent', { + template: '
' + }) + ` + } + ] } - ] + ], + output: null + }, + { + filename: 'MyComponent.js', + code: ` + Vue.component("MComponent", { + template: '
' + }) + `, + options: [{ extensions: ['js'] }], + parserOptions, + errors: [ + { + message: + 'Component name `MComponent` should match file name `MyComponent`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + Vue.component("MyComponent", { + template: '
' + }) + ` + } + ] + } + ], + output: null }, { filename: 'MyComponent.js', @@ -740,9 +1007,20 @@ ruleTester.run('match-component-file-name', rule, { errors: [ { message: - 'Component name `MComponent` should match file name `MyComponent`.' + 'Component name `MComponent` should match file name `MyComponent`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + Vue.component(\`MyComponent\`, { + template: '
' + }) + ` + } + ] } - ] + ], + output: null }, { filename: 'MyComponent.js', @@ -756,9 +1034,20 @@ ruleTester.run('match-component-file-name', rule, { errors: [ { message: - 'Component name `MComponent` should match file name `MyComponent`.' + 'Component name `MComponent` should match file name `MyComponent`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + app.component(\`MyComponent\`, { + template: '
' + }) + ` + } + ] } - ] + ], + output: null }, // casing @@ -775,9 +1064,21 @@ ruleTester.run('match-component-file-name', rule, { errors: [ { message: - 'Component name `my-component` should match file name `MyComponent`.' + 'Component name `my-component` should match file name `MyComponent`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + export default { + name: 'MyComponent', + render() { return
} + } + ` + } + ] } - ] + ], + output: null }, { filename: 'my-component.jsx', @@ -792,9 +1093,21 @@ ruleTester.run('match-component-file-name', rule, { errors: [ { message: - 'Component name `MyComponent` should match file name `my-component`.' + 'Component name `MyComponent` should match file name `my-component`.', + suggestions: [ + { + desc: 'Rename component to match file name.', + output: ` + export default { + name: 'my-component', + render() { return
} + } + ` + } + ] } - ] + ], + output: null } ] })