-
-
Notifications
You must be signed in to change notification settings - Fork 681
/
Copy pathno-invalid-meta.js
114 lines (104 loc) · 2.85 KB
/
no-invalid-meta.js
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
/**
* @fileoverview Internal rule to prevent missing or invalid meta property in core rules.
* @author Vitor Balocco
*/
'use strict'
/**
* Gets the property of the Object node passed in that has the name specified.
*
* @param {string} propertyName Name of the property to return.
* @param {ASTNode} node The ObjectExpression node.
* @returns {ASTNode} The Property node or null if not found.
*/
function getPropertyFromObject(propertyName, node) {
if (node && node.type === 'ObjectExpression') {
for (const property of node.properties) {
if (property.type === 'Property' && property.key.name === propertyName) {
return property
}
}
}
return null
}
/**
* Checks the validity of the meta definition of this rule and reports any errors found.
*
* @param {RuleContext} context The ESLint rule context.
* @param {ASTNode} exportsNode ObjectExpression node that the rule exports.
* @param {boolean} ruleIsFixable whether the rule is fixable or not.
* @returns {void}
*/
function checkMetaValidity(context, exportsNode) {
const metaProperty = getPropertyFromObject('meta', exportsNode)
if (!metaProperty) {
context.report({
node: exportsNode,
messageId: 'missingMeta'
})
return
}
const metaDocs = getPropertyFromObject('docs', metaProperty.value)
if (!metaDocs) {
context.report({
node: metaProperty,
messageId: 'missingMetaDocs'
})
return
}
const metaDocsCategories = getPropertyFromObject('categories', metaDocs.value)
if (!metaDocsCategories) {
context.report({
node: metaDocs,
messageId: 'missingMetaDocsCategories'
})
return
}
const metaDocsRecommended = getPropertyFromObject(
'recommended',
metaDocs.value
)
if (metaDocsRecommended) {
context.report({
node: metaDocsRecommended,
messageId: 'invalidMetaDocsRecommended'
})
return
}
}
module.exports = {
meta: {
type: 'problem',
docs: {
description: 'enforce correct use of `meta` property in core rules',
categories: ['Internal']
},
schema: [],
messages: {
missingMeta: 'Rule is missing a meta property.',
missingMetaDocs: 'Rule is missing a meta.docs property.',
missingMetaDocsCategories:
'Rule is missing a meta.docs.categories property.',
invalidMetaDocsRecommended:
'Rule should not have a meta.docs.recommended property.'
}
},
create(context) {
let exportsNode
return {
AssignmentExpression(node) {
if (
node.left &&
node.right &&
node.left.type === 'MemberExpression' &&
node.left.object.name === 'module' &&
node.left.property.name === 'exports'
) {
exportsNode = node.right
}
},
'Program:exit'(programNode) {
checkMetaValidity(context, exportsNode)
}
}
}
}