UNPKG

eslint-plugin-vue-required-attributes

Version:

Require specified attributes on specified components from being used!

53 lines (52 loc) 2.21 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; const hasDirectiveKeyArgument_1 = __importDefault(require("../guards/hasDirectiveKeyArgument")); const defaultMessage = (tagName, missedAttribute) => { return `"${tagName}" component must have "${missedAttribute}" attribute.`; }; const rule = { meta: { type: 'suggestion', docs: { description: 'Requires specified attribute to be used into tag.', recommended: true, }, }, create: (context) => { return context.parserServices.defineTemplateBodyVisitor({ VElement(node) { const attributesList = context.options[0] || {}; const attributesObjectKeys = Object.keys(attributesList); if (!attributesObjectKeys.length) { return; } const customErrorMessageFunction = context.options[1] || defaultMessage; const elementName = node.rawName; Object.keys(attributesList).forEach((attributes) => { if (!attributesList[attributes].includes(elementName)) { return; } const nodeAttributesList = node.startTag.attributes; const attributesNames = nodeAttributesList.map((nodeAttribute) => { const { key } = nodeAttribute; if (key.type === 'VDirectiveKey' && (0, hasDirectiveKeyArgument_1.default)(key.argument)) { const { rawName } = key.argument; return rawName; } return nodeAttribute.key.name; }); if (attributesNames.includes(attributes)) { return; } context.report({ message: customErrorMessageFunction(elementName, attributes), loc: node.loc, }); }); } }); }, }; module.exports = rule;