eslint-plugin-vue-required-attributes
Version:
Require specified attributes on specified components from being used!
53 lines (52 loc) • 2.21 kB
JavaScript
;
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;