2 * @fileoverview Internal rule to prevent missing or invalid meta property in core rules.
3 * @author Vitor Balocco
8 //------------------------------------------------------------------------------
10 //------------------------------------------------------------------------------
13 * Gets the property of the Object node passed in that has the name specified.
14 * @param {string} property Name of the property to return.
15 * @param {ASTNode} node The ObjectExpression node.
16 * @returns {ASTNode} The Property node or null if not found.
18 function getPropertyFromObject(property
, node
) {
19 const properties
= node
.properties
;
21 if (!Array
.isArray(properties
)) {
26 for (let i
= 0; i
< properties
.length
; i
++) {
27 if (properties
[i
].key
.name
=== property
) {
36 * Extracts the `meta` property from the ObjectExpression that all rules export.
37 * @param {ASTNode} exportsNode ObjectExpression node that the rule exports.
38 * @returns {ASTNode} The `meta` Property node or null if not found.
40 function getMetaPropertyFromExportsNode(exportsNode
) {
41 return getPropertyFromObject("meta", exportsNode
);
45 * Whether this `meta` ObjectExpression has a `docs` property defined or not.
46 * @param {ASTNode} metaPropertyNode The `meta` ObjectExpression for this rule.
47 * @returns {boolean} `true` if a `docs` property exists.
49 function hasMetaDocs(metaPropertyNode
) {
50 return Boolean(getPropertyFromObject("docs", metaPropertyNode
.value
));
54 * Whether this `meta` ObjectExpression has a `docs.recommended` property defined or not.
55 * @param {ASTNode} metaPropertyNode The `meta` ObjectExpression for this rule.
56 * @returns {boolean} `true` if a `docs.recommended` property exists.
58 function hasMetaDocsRecommended(metaPropertyNode
) {
59 const metaDocs
= getPropertyFromObject("docs", metaPropertyNode
.value
);
61 return metaDocs
&& getPropertyFromObject("recommended", metaDocs
.value
);
65 * Checks the validity of the meta definition of this rule and reports any errors found.
66 * @param {RuleContext} context The ESLint rule context.
67 * @param {ASTNode} exportsNode ObjectExpression node that the rule exports.
70 function checkMetaValidity(context
, exportsNode
) {
71 const metaProperty
= getMetaPropertyFromExportsNode(exportsNode
);
74 context
.report({ node
: exportsNode
, messageId
: "missingMeta" });
78 if (!hasMetaDocs(metaProperty
)) {
79 context
.report({ node
: metaProperty
, messageId
: "missingMetaDocs" });
83 if (!hasMetaDocsRecommended(metaProperty
)) {
84 context
.report({ node
: metaProperty
, messageId
: "missingMetaDocsRecommended" });
88 //------------------------------------------------------------------------------
90 //------------------------------------------------------------------------------
95 description
: "Enforce correct use of `meta` property in core rules",
101 missingMeta
: "Rule is missing a meta property.",
102 missingMetaDocs
: "Rule is missing a meta.docs property.",
103 missingMetaDocsRecommended
: "Rule is missing a meta.docs.recommended property.",
104 noExport
: "Rule does not export anything. Make sure rule exports an object according to new rule format."
112 AssignmentExpression(node
) {
115 node
.left
.type
=== "MemberExpression" &&
116 node
.left
.object
.name
=== "module" &&
117 node
.left
.property
.name
=== "exports") {
119 exportsNode
= node
.right
;
123 "Program:exit"(node
) {
127 messageId
: "noExport"
130 checkMetaValidity(context
, exportsNode
);