diff --git a/lib/rules/name-property-required.js b/lib/rules/name-property-required.js new file mode 100644 index 000000000..b0235dbbb --- /dev/null +++ b/lib/rules/name-property-required.js @@ -0,0 +1,44 @@ +/** + * @fileoverview Require a name property in Vue components + * @author LukeeeeBennett + */ +'use strict' + +const utils = require('../utils') + +function isNameProperty (node) { + return node.type === 'Property' && node.key.name === 'name' +} + +function hasTruthyLiteralValue (node) { + return node.value.type === 'Literal' && node.value.value +} + +module.exports = { + meta: { + type: 'suggestion', + docs: { + description: 'require a name property in Vue components', + category: undefined, + url: 'https://eslint.vuejs.org/rules/name-property-required.html' + }, + fixable: null, + schema: [] + }, + + create (context) { + return utils.executeOnVue(context, component => { + const isValid = component.properties.some(property => { + return isNameProperty(property) && + hasTruthyLiteralValue(property) + }) + + if (isValid) return + + context.report({ + node: component, + message: 'Required name property is undefined.' + }) + }) + } +} diff --git a/tests/lib/rules/name-property-required.js b/tests/lib/rules/name-property-required.js new file mode 100644 index 000000000..15cc1fe80 --- /dev/null +++ b/tests/lib/rules/name-property-required.js @@ -0,0 +1,96 @@ +/** + * @fileoverview Require a name property in Vue components + * @author LukeeeeBennett + */ +'use strict' + +const rule = require('../../../lib/rules/name-property-required') +const RuleTester = require('eslint').RuleTester + +const parserOptions = { + ecmaVersion: 2018, + sourceType: 'module' +} + +const ruleTester = new RuleTester() +ruleTester.run('name-property-required', rule, { + + valid: [ + { + filename: 'ValidComponent.vue', + code: ` + export default { + name: 'IssaName' + } + `, + parserOptions + } + ], + + invalid: [ + { + filename: 'InvalidComponent.vue', + code: ` + export default { + } + `, + parserOptions, + errors: [{ + message: 'Required name property is undefined.', + type: 'ObjectExpression' + }] + }, + { + filename: 'InvalidComponent.vue', + code: ` + export default { + nameNot: 'IssaNameNot' + } + `, + parserOptions, + errors: [{ + message: 'Required name property is undefined.', + type: 'ObjectExpression' + }] + }, + { + filename: 'InvalidComponent.vue', + code: ` + export default { + name: '' + } + `, + parserOptions, + errors: [{ + message: 'Required name property is undefined.', + type: 'ObjectExpression' + }] + }, + { + filename: 'InvalidComponent.vue', + code: ` + export default { + name: undefined + } + `, + parserOptions, + errors: [{ + message: 'Required name property is undefined.', + type: 'ObjectExpression' + }] + }, + { + filename: 'InvalidComponent.vue', + code: ` + export default { + name: null + } + `, + parserOptions, + errors: [{ + message: 'Required name property is undefined.', + type: 'ObjectExpression' + }] + } + ] +})