Blame view
node_modules/eslint/lib/internal-rules/internal-consistent-docs-description.js
3.8 KB
f7563de62
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
/** * @fileoverview Internal rule to enforce meta.docs.description conventions. * @author Vitor Balocco */ "use strict"; const ALLOWED_FIRST_WORDS = [ "enforce", "require", "disallow" ]; //------------------------------------------------------------------------------ // Helpers //------------------------------------------------------------------------------ /** * Gets the property of the Object node passed in that has the name specified. * * @param {string} property Name of the property to return. * @param {ASTNode} node The ObjectExpression node. * @returns {ASTNode} The Property node or null if not found. */ function getPropertyFromObject(property, node) { const properties = node.properties; for (let i = 0; i < properties.length; i++) { if (properties[i].key.name === property) { return properties[i]; } } return null; } /** * Verifies that the meta.docs.description property follows our internal conventions. * * @param {RuleContext} context The ESLint rule context. * @param {ASTNode} exportsNode ObjectExpression node that the rule exports. * @returns {void} */ function checkMetaDocsDescription(context, exportsNode) { if (exportsNode.type !== "ObjectExpression") { // if the exported node is not the correct format, "internal-no-invalid-meta" will already report this. return; } const metaProperty = getPropertyFromObject("meta", exportsNode); const metaDocs = metaProperty && getPropertyFromObject("docs", metaProperty.value); const metaDocsDescription = metaDocs && getPropertyFromObject("description", metaDocs.value); if (!metaDocsDescription) { // if there is no `meta.docs.description` property, "internal-no-invalid-meta" will already report this. return; } const description = metaDocsDescription.value.value; if (typeof description !== "string") { context.report({ node: metaDocsDescription.value, message: "`meta.docs.description` should be a string." }); return; } if (description === "") { context.report({ node: metaDocsDescription.value, message: "`meta.docs.description` should not be empty." }); return; } if (description.indexOf(" ") === 0) { context.report({ node: metaDocsDescription.value, message: "`meta.docs.description` should not start with whitespace." }); return; } const firstWord = description.split(" ")[0]; if (ALLOWED_FIRST_WORDS.indexOf(firstWord) === -1) { context.report({ node: metaDocsDescription.value, message: "`meta.docs.description` should start with one of the following words: {{ allowedWords }}. Started with \"{{ firstWord }}\" instead.", data: { allowedWords: ALLOWED_FIRST_WORDS.join(", "), firstWord } }); } } //------------------------------------------------------------------------------ // Rule Definition //------------------------------------------------------------------------------ module.exports = { meta: { docs: { description: "enforce correct conventions of `meta.docs.description` property in core rules", category: "Internal", recommended: false }, schema: [] }, create(context) { return { AssignmentExpression(node) { if (node.left && node.right && node.left.type === "MemberExpression" && node.left.object.name === "module" && node.left.property.name === "exports") { checkMetaDocsDescription(context, node.right); } } }; } }; |