diff --git a/lib/rules/match-component-file-name.js b/lib/rules/match-component-file-name.js index 57fd4ff89..7548453b8 100644 --- a/lib/rules/match-component-file-name.js +++ b/lib/rules/match-component-file-name.js @@ -37,7 +37,7 @@ module.exports = { categories: undefined, url: 'https://eslint.vuejs.org/rules/match-component-file-name.html' }, - fixable: null, + fixable: 'code', schema: [ { type: 'object', @@ -102,11 +102,14 @@ module.exports = { */ function verifyName(node) { let name + let quote = '' if (node.type === 'TemplateLiteral') { const quasis = node.quasis[0] name = quasis.value.cooked + quote = '`' } else { name = `${node.value}` + quote = node.raw[0] } if (!compareNames(name, filename)) { @@ -114,7 +117,10 @@ module.exports = { node, message: 'Component name `{{name}}` should match file name `{{filename}}`.', - data: { filename, name } + data: { filename, name }, + fix(fixer) { + 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..237b782ec 100644 --- a/tests/lib/rules/match-component-file-name.js +++ b/tests/lib/rules/match-component-file-name.js @@ -560,6 +560,12 @@ ruleTester.run('match-component-file-name', rule, { render() { return
} } `, + output: ` + export default { + name: 'MyComponent', + render() { return
} + } + `, parserOptions: jsxParserOptions, errors: [ { @@ -576,6 +582,35 @@ ruleTester.run('match-component-file-name', rule, { render() { return
} } `, + output: ` + export default { + name: 'MyComponent', + render() { return
} + } + `, + options: [{ extensions: ['jsx'] }], + parserOptions: jsxParserOptions, + errors: [ + { + message: + 'Component name `MComponent` should match file name `MyComponent`.' + } + ] + }, + { + filename: 'MyComponent.jsx', + code: ` + export default { + name: "MComponent", + render() { return
} + } + `, + output: ` + export default { + name: "MyComponent", + render() { return
} + } + `, options: [{ extensions: ['jsx'] }], parserOptions: jsxParserOptions, errors: [ @@ -593,6 +628,12 @@ ruleTester.run('match-component-file-name', rule, { render() { return
} } `, + output: ` + export default { + name: \`MyComponent\`, + render() { return
} + } + `, options: [{ extensions: ['jsx'] }], parserOptions: jsxParserOptions, errors: [ @@ -614,6 +655,42 @@ ruleTester.run('match-component-file-name', rule, { } `, + output: ` + + `, + options: [{ extensions: ['vue'] }], + parser: require.resolve('vue-eslint-parser'), + parserOptions, + errors: [ + { + message: + 'Component name `MComponent` should match file name `MyComponent`.' + } + ] + }, + { + filename: 'MyComponent.vue', + code: ` + + `, + output: ` + + `, options: [{ extensions: ['vue'] }], parser: require.resolve('vue-eslint-parser'), parserOptions, @@ -634,6 +711,14 @@ ruleTester.run('match-component-file-name', rule, { } `, + output: ` + + `, options: [{ extensions: ['vue'] }], parser: require.resolve('vue-eslint-parser'), parserOptions, @@ -654,6 +739,35 @@ ruleTester.run('match-component-file-name', rule, { template: '
' }) `, + output: ` + new Vue({ + name: 'MyComponent', + template: '
' + }) + `, + options: [{ extensions: ['js'] }], + parserOptions, + errors: [ + { + message: + 'Component name `MComponent` should match file name `MyComponent`.' + } + ] + }, + { + filename: 'MyComponent.js', + code: ` + new Vue({ + name: "MComponent", + template: '
' + }) + `, + output: ` + new Vue({ + name: "MyComponent", + template: '
' + }) + `, options: [{ extensions: ['js'] }], parserOptions, errors: [ @@ -671,6 +785,12 @@ ruleTester.run('match-component-file-name', rule, { template: '
' }) `, + output: ` + new Vue({ + name: \`MyComponent\`, + template: '
' + }) + `, options: [{ extensions: ['js'] }], parserOptions, errors: [ @@ -687,6 +807,11 @@ ruleTester.run('match-component-file-name', rule, { name: 'MComponent', }) `, + output: ` + Vue.mixin({ + name: 'MyComponent', + }) + `, options: [{ extensions: ['js'] }], parserOptions, errors: [ @@ -703,6 +828,11 @@ ruleTester.run('match-component-file-name', rule, { name: \`MComponent\`, }) `, + output: ` + Vue.mixin({ + name: \`MyComponent\`, + }) + `, options: [{ extensions: ['js'] }], parserOptions, errors: [ @@ -719,6 +849,11 @@ ruleTester.run('match-component-file-name', rule, { template: '
' }) `, + output: ` + Vue.component('MyComponent', { + template: '
' + }) + `, options: [{ extensions: ['js'] }], parserOptions, errors: [ @@ -735,6 +870,11 @@ ruleTester.run('match-component-file-name', rule, { template: '
' }) `, + output: ` + Vue.component(\`MyComponent\`, { + template: '
' + }) + `, options: [{ extensions: ['js'] }], parserOptions, errors: [ @@ -751,6 +891,11 @@ ruleTester.run('match-component-file-name', rule, { template: '
' }) `, + output: ` + app.component(\`MyComponent\`, { + template: '
' + }) + `, options: [{ extensions: ['js'] }], parserOptions, errors: [ @@ -770,6 +915,12 @@ ruleTester.run('match-component-file-name', rule, { render() { return
} } `, + output: ` + export default { + name: 'MyComponent', + render() { return
} + } + `, options: [{ shouldMatchCase: true }], parserOptions: jsxParserOptions, errors: [ @@ -787,6 +938,12 @@ ruleTester.run('match-component-file-name', rule, { render() { return
} } `, + output: ` + export default { + name: 'my-component', + render() { return
} + } + `, options: [{ shouldMatchCase: true }], parserOptions: jsxParserOptions, errors: [