UNPKG

eslint-plugin-vue

Version:
95 lines (83 loc) 2.45 kB
/** * @fileoverview Prop definitions should be detailed * @author Armano */ 'use strict' const utils = require('../utils') function create (context) { // ---------------------------------------------------------------------- // Helpers // ---------------------------------------------------------------------- function objectHasType (node) { const typeProperty = node.properties .find(p => utils.getStaticPropertyName(p.key) === 'type' && ( p.value.type !== 'ArrayExpression' || p.value.elements.length > 0 ) ) return Boolean(typeProperty) } function checkProperties (items) { for (const cp of items) { if (cp.type !== 'Property') { return } let hasType = true if (cp.value.type === 'ObjectExpression') { // foo: { hasType = objectHasType(cp.value) } else if (cp.value.type === 'ArrayExpression') { // foo: [ hasType = cp.value.elements.length > 0 } else if (cp.value.type === 'FunctionExpression' || cp.value.type === 'ArrowFunctionExpression') { hasType = false } if (!hasType) { context.report({ node: cp, message: 'Prop "{{name}}" should define at least it\'s type.', data: { name: cp.key.name } }) } } } // ---------------------------------------------------------------------- // Public // ---------------------------------------------------------------------- return utils.executeOnVue(context, (obj) => { const node = obj.properties .find(p => p.type === 'Property' && p.key.type === 'Identifier' && p.key.name === 'props' ) if (!node) return if (node.value.type === 'ObjectExpression') { checkProperties(node.value.properties) } else { context.report({ node, message: 'Props should at least define their types.' }) } }) } // ------------------------------------------------------------------------------ // Rule Definition // ------------------------------------------------------------------------------ module.exports = { meta: { docs: { description: 'Prop definitions should be detailed', category: 'Best Practices', recommended: false }, fixable: null, // or "code" or "whitespace" schema: [ // fill in your schema ] }, create }