/** * @fileoverview Require component name property to match its file name * @author Rodrigo Pedra Brum */ 'use strict' const rule = require('../../../lib/rules/match-component-file-name') const RuleTester = require('../../eslint-compat').RuleTester const jsxLanguageOptions = { ecmaVersion: 2018, sourceType: 'module', parserOptions: { ecmaFeatures: { jsx: true } } } const languageOptions = { ecmaVersion: 2018, sourceType: 'module' } const ruleTester = new RuleTester() ruleTester.run('match-component-file-name', rule, { valid: [ // .jsx { filename: 'MyComponent.jsx', code: ` export default { render() { return
} } `, languageOptions: jsxLanguageOptions }, { filename: 'MyComponent.jsx', code: ` export default { name: 'MyComponent', render() { return
} } `, languageOptions: jsxLanguageOptions }, { filename: 'MyComponent.jsx', code: ` export default { name: 'MyComponent', render() { return
} } `, options: [{ extensions: ['jsx'] }], languageOptions: jsxLanguageOptions }, { filename: 'MyComponent.jsx', code: ` export default { name: myComponent, render() { return
} } `, options: [{ extensions: ['jsx'] }], languageOptions: jsxLanguageOptions }, { filename: 'MyComponent.jsx', code: ` export default { name, render() { return
} } `, options: [{ extensions: ['jsx'] }], languageOptions: jsxLanguageOptions }, { filename: 'MyComponent.jsx', code: ` export default { name: \`MyComponent\`, render() { return
} } `, options: [{ extensions: ['jsx'] }], languageOptions: jsxLanguageOptions }, { filename: 'MyComponent.jsx', code: ` export default { name: \`My\${foo}\`, render() { return
} } `, options: [{ extensions: ['jsx'] }], languageOptions: jsxLanguageOptions }, { filename: 'MyComponent.jsx', code: ` export default { name: 'MComponent', render() { return
} } `, options: [{ extensions: ['vue'] }], // missing jsx in options languageOptions: jsxLanguageOptions }, // .vue { filename: 'MyComponent.vue', code: ` `, languageOptions: { parser: require('vue-eslint-parser'), ...languageOptions } }, { filename: 'MyComponent.vue', code: ` `, options: [{ extensions: ['jsx'] }], // missing jsx in options languageOptions: { parser: require('vue-eslint-parser'), ...languageOptions } }, { filename: 'MyComponent.vue', code: ` `, options: [{ extensions: ['vue'] }], languageOptions: { parser: require('vue-eslint-parser'), ...languageOptions } }, { filename: 'MyComponent.vue', code: ` `, options: [{ extensions: ['vue'] }], languageOptions: { parser: require('vue-eslint-parser'), ...languageOptions } }, { filename: 'MyComponent.vue', code: ` `, options: [{ extensions: ['vue'] }], languageOptions: { parser: require('vue-eslint-parser'), ...languageOptions } }, { filename: 'MyComponent.vue', code: ` `, options: [{ extensions: ['vue'] }], languageOptions: { parser: require('vue-eslint-parser'), ...languageOptions } }, { filename: 'MyComponent.vue', code: ` `, options: [{ extensions: ['vue'] }], languageOptions: { parser: require('vue-eslint-parser'), ...languageOptions } }, { filename: 'MyComponent.vue', code: ` `, options: [{ extensions: ['vue'] }], languageOptions: { parser: require('vue-eslint-parser'), ...languageOptions } }, { filename: 'MyComponent.vue', code: ` `, options: [{ extensions: ['vue'] }], languageOptions: { parser: require('vue-eslint-parser'), ...languageOptions } }, // .js { filename: 'MyComponent.js', code: ` new Vue({ name: 'MComponent', template: '
' }) `, languageOptions // options default to [['jsx']] }, { filename: 'MyComponent.js', code: ` Vue.mixin({}) `, languageOptions // options default to [['jsx']] }, { filename: 'MyComponent.js', code: ` Vue.component('MComponent', { template: '
' }) `, languageOptions // options default to [['jsx']] }, { filename: 'MyComponent.js', code: ` new Vue({ name: 'MComponent', template: '
' }) `, options: [{ extensions: ['vue'] }], // missing 'js' in options languageOptions }, { filename: 'MyComponent.js', code: ` Vue.mixin({}) `, options: [{ extensions: ['vue'] }], // missing 'js' in options languageOptions }, { filename: 'MyComponent.js', code: ` Vue.component('MComponent', { template: '
' }) `, options: [{ extensions: ['vue'] }], // missing 'js' in options languageOptions }, { filename: 'MyComponent.js', code: ` new Vue({ template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions }, { filename: 'MyComponent.js', code: ` new Vue({ name: 'MyComponent', template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions }, { filename: 'MyComponent.js', code: ` new Vue({ name: myComponent, template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions }, { filename: 'MyComponent.js', code: ` new Vue({ name, template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions }, { filename: 'MyComponent.js', code: ` new Vue({ name: \`MyComponent\`, template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions }, { filename: 'MyComponent.js', code: ` new Vue({ name: \`My\${foo}\`, template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions }, { filename: 'MyComponent.js', code: ` Vue.mixin({}) `, options: [{ extensions: ['js'] }], languageOptions }, { filename: 'MyComponent.js', code: ` new Vue.mixin({ name: 'MyComponent', }) `, options: [{ extensions: ['js'] }], languageOptions }, { filename: 'MyComponent.js', code: ` new Vue.mixin({ name: myComponent, }) `, options: [{ extensions: ['js'] }], languageOptions }, { filename: 'MyComponent.js', code: ` new Vue.mixin({ name }) `, options: [{ extensions: ['js'] }], languageOptions }, { filename: 'MyComponent.js', code: ` new Vue.mixin({ name: \`MyComponent\`, }) `, options: [{ extensions: ['js'] }], languageOptions }, { filename: 'MyComponent.js', code: ` new Vue.mixin({ name: \`My\${foo}\`, }) `, options: [{ extensions: ['js'] }], languageOptions }, { filename: 'MyComponent.js', code: ` Vue.component('MyComponent', { template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions }, { filename: 'MyComponent.js', code: ` app.component('MyComponent', { template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions }, { filename: 'MyComponent.js', code: ` Vue.component(myComponent, { template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions }, { filename: 'MyComponent.js', code: ` Vue.component(\`MyComponent\`, { template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions }, { filename: 'MyComponent.js', code: ` Vue.component(\`My\${foo}\`, { template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions }, { filename: 'index.js', code: ` Vue.component('MyComponent', { template: '
' }) Vue.component('OtherComponent', { template: '
' }) new Vue('OtherComponent', { name: 'ThirdComponent', template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions }, // casing { filename: 'my-component.jsx', code: ` export default { name: 'my-component', render() { return
} } `, languageOptions: jsxLanguageOptions }, { filename: 'my-component.jsx', code: ` export default { name: 'MyComponent', render() { return
} } `, languageOptions: jsxLanguageOptions }, { filename: 'MyComponent.jsx', code: ` export default { name: 'my-component', render() { return
} } `, languageOptions: jsxLanguageOptions }, { filename: 'my-component.jsx', code: ` export default { name: 'my-component', render() { return
} } `, options: [{ shouldMatchCase: true }], languageOptions: jsxLanguageOptions }, { filename: 'MyComponent.jsx', code: ` export default { name: 'MyComponent', render() { return
} } `, options: [{ shouldMatchCase: true }], languageOptions: jsxLanguageOptions }, // https://github.com/vuejs/eslint-plugin-vue/issues/1018 { filename: 'test.jsx', code: `fn1(component.data)`, languageOptions }, { filename: 'MyComponent.vue', code: ``, options: [{ extensions: ['vue'] }], languageOptions: { parser: require('vue-eslint-parser'), ...languageOptions } } ], invalid: [ // .jsx { filename: 'MyComponent.jsx', code: ` export default { name: 'MComponent', render() { return
} } `, languageOptions: jsxLanguageOptions, 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
} } ` } ] } ] }, { filename: 'MyComponent.jsx', code: ` export default { name: 'MComponent', render() { return
} } `, options: [{ extensions: ['jsx'] }], languageOptions: jsxLanguageOptions, 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
} } ` } ] } ] }, { filename: 'MyComponent.jsx', code: ` export default { name: "MComponent", render() { return
} } `, options: [{ extensions: ['jsx'] }], languageOptions: jsxLanguageOptions, 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
} } ` } ] } ] }, { filename: 'MyComponent.jsx', code: ` export default { name: \`MComponent\`, render() { return
} } `, options: [{ extensions: ['jsx'] }], languageOptions: jsxLanguageOptions, 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
} } ` } ] } ] }, // .vue { filename: 'MyComponent.vue', code: ` `, options: [{ extensions: ['vue'] }], languageOptions: { parser: require('vue-eslint-parser'), ...languageOptions }, errors: [ { message: 'Component name `MComponent` should match file name `MyComponent`.', suggestions: [ { desc: 'Rename component to match file name.', output: ` ` } ] } ] }, { filename: 'MyComponent.vue', code: ` `, options: [{ extensions: ['vue'] }], languageOptions: { parser: require('vue-eslint-parser'), ...languageOptions }, errors: [ { message: 'Component name `MComponent` should match file name `MyComponent`.', suggestions: [ { desc: 'Rename component to match file name.', output: ` ` } ] } ] }, { filename: 'MyComponent.vue', code: ` `, options: [{ extensions: ['vue'] }], languageOptions: { parser: require('vue-eslint-parser'), ...languageOptions }, errors: [ { message: 'Component name `MComponent` should match file name `MyComponent`.', suggestions: [ { desc: 'Rename component to match file name.', output: ` ` } ] } ] }, // .js { filename: 'MyComponent.js', code: ` new Vue({ name: 'MComponent', template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions, errors: [ { message: 'Component name `MComponent` should match file name `MyComponent`.', suggestions: [ { desc: 'Rename component to match file name.', output: ` new Vue({ name: 'MyComponent', template: '
' }) ` } ] } ] }, { filename: 'MyComponent.js', code: ` new Vue({ name: "MComponent", template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions, errors: [ { message: 'Component name `MComponent` should match file name `MyComponent`.', suggestions: [ { desc: 'Rename component to match file name.', output: ` new Vue({ name: "MyComponent", template: '
' }) ` } ] } ] }, { filename: 'MyComponent.js', code: ` new Vue({ name: \`MComponent\`, template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions, errors: [ { message: 'Component name `MComponent` should match file name `MyComponent`.', suggestions: [ { desc: 'Rename component to match file name.', output: ` new Vue({ name: \`MyComponent\`, template: '
' }) ` } ] } ] }, { filename: 'MyComponent.js', code: ` Vue.mixin({ name: 'MComponent', }) `, options: [{ extensions: ['js'] }], languageOptions, errors: [ { message: 'Component name `MComponent` should match file name `MyComponent`.', suggestions: [ { desc: 'Rename component to match file name.', output: ` Vue.mixin({ name: 'MyComponent', }) ` } ] } ] }, { filename: 'MyComponent.js', code: ` Vue.mixin({ name: "MComponent", }) `, options: [{ extensions: ['js'] }], languageOptions, errors: [ { message: 'Component name `MComponent` should match file name `MyComponent`.', suggestions: [ { desc: 'Rename component to match file name.', output: ` Vue.mixin({ name: "MyComponent", }) ` } ] } ] }, { filename: 'MyComponent.js', code: ` Vue.mixin({ name: \`MComponent\`, }) `, options: [{ extensions: ['js'] }], languageOptions, errors: [ { message: 'Component name `MComponent` should match file name `MyComponent`.', suggestions: [ { desc: 'Rename component to match file name.', output: ` Vue.mixin({ name: \`MyComponent\`, }) ` } ] } ] }, { filename: 'MyComponent.js', code: ` Vue.component('MComponent', { template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions, errors: [ { message: 'Component name `MComponent` should match file name `MyComponent`.', suggestions: [ { desc: 'Rename component to match file name.', output: ` Vue.component('MyComponent', { template: '
' }) ` } ] } ] }, { filename: 'MyComponent.js', code: ` Vue.component("MComponent", { template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions, errors: [ { message: 'Component name `MComponent` should match file name `MyComponent`.', suggestions: [ { desc: 'Rename component to match file name.', output: ` Vue.component("MyComponent", { template: '
' }) ` } ] } ] }, { filename: 'MyComponent.js', code: ` Vue.component(\`MComponent\`, { template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions, errors: [ { message: 'Component name `MComponent` should match file name `MyComponent`.', suggestions: [ { desc: 'Rename component to match file name.', output: ` Vue.component(\`MyComponent\`, { template: '
' }) ` } ] } ] }, { filename: 'MyComponent.js', code: ` app.component(\`MComponent\`, { template: '
' }) `, options: [{ extensions: ['js'] }], languageOptions, errors: [ { message: 'Component name `MComponent` should match file name `MyComponent`.', suggestions: [ { desc: 'Rename component to match file name.', output: ` app.component(\`MyComponent\`, { template: '
' }) ` } ] } ] }, // casing { filename: 'MyComponent.jsx', code: ` export default { name: 'my-component', render() { return
} } `, options: [{ shouldMatchCase: true }], languageOptions: jsxLanguageOptions, errors: [ { message: 'Component name `my-component` should match file name `MyComponent`.', suggestions: [ { desc: 'Rename component to match file name.', output: ` export default { name: 'MyComponent', render() { return
} } ` } ] } ] }, { filename: 'my-component.jsx', code: ` export default { name: 'MyComponent', render() { return
} } `, options: [{ shouldMatchCase: true }], languageOptions: jsxLanguageOptions, errors: [ { message: '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
} } ` } ] } ] }, { filename: 'MyComponent.vue', code: ``, options: [{ extensions: ['vue'] }], languageOptions: { parser: require('vue-eslint-parser'), ...languageOptions }, errors: [ { message: 'Component name `CoolComponent` should match file name `MyComponent`.', suggestions: [ { desc: 'Rename component to match file name.', output: `` } ] } ] } ] })