@@ -13,122 +13,128 @@ var DEFAULTS = ['any', 'array', 'object'];
13
13
// Rule Definition
14
14
// ------------------------------------------------------------------------------
15
15
16
- module.exports = function(context) {
16
+ module.exports = {
17
+ meta: {
18
+ docs: {},
19
+
20
+ schema: [{
21
+ type: 'object',
22
+ properties: {
23
+ forbid: {
24
+ type: 'array',
25
+ items: {
26
+ type: 'string'
27
+ }
28
+ }
29
+ },
30
+ additionalProperties: true
31
+ }]
32
+ },
17
33
18
- function isForbidden(type) {
19
- var configuration = context.options[0] || {};
34
+ create: function(context) {
20
35
21
- var forbid = configuration.forbid || DEFAULTS;
22
- return forbid.indexOf(type) >= 0;
23
- }
36
+ function isForbidden(type) {
37
+ var configuration = context.options[0] || {};
24
38
25
- /**
26
- * Checks if node is `propTypes` declaration
27
- * @param {ASTNode} node The AST node being checked.
28
- * @returns {Boolean} True if node is `propTypes` declaration, false if not.
29
- */
30
- function isPropTypesDeclaration(node) {
31
-
32
- // Special case for class properties
33
- // (babel-eslint does not expose property name so we have to rely on tokens)
34
- if (node.type === 'ClassProperty') {
35
- var tokens = context.getFirstTokens(node, 2);
36
- if (tokens[0].value === 'propTypes' || (tokens[1] && tokens[1].value === 'propTypes')) {
37
- return true;
38
- }
39
- return false;
39
+ var forbid = configuration.forbid || DEFAULTS;
40
+ return forbid.indexOf(type) >= 0;
40
41
}
41
42
42
- return Boolean(
43
- node &&
44
- node.name === 'propTypes'
45
- );
46
- }
47
-
48
-
49
- /**
50
- * Checks if propTypes declarations are forbidden
51
- * @param {Array} declarations The array of AST nodes being checked.
52
- * @returns {void}
53
- */
54
- function checkForbidden(declarations) {
55
- declarations.forEach(function(declaration) {
56
- if (declaration.type !== 'Property') {
57
- return;
58
- }
59
- var target;
60
- var value = declaration.value;
61
- if (
62
- value.type === 'MemberExpression' &&
63
- value.property &&
64
- value.property.name &&
65
- value.property.name === 'isRequired'
66
- ) {
67
- value = value.object;
68
- }
69
- if (
70
- value.type === 'CallExpression' &&
71
- value.callee.type === 'MemberExpression'
72
- ) {
73
- value = value.callee;
74
- }
75
- if (value.property) {
76
- target = value.property.name;
77
- } else if (value.type === 'Identifier') {
78
- target = value.name;
79
- }
80
- if (isForbidden(target)) {
81
- context.report({
82
- node: declaration,
83
- message: 'Prop type `' + target + '` is forbidden'
84
- });
43
+ /**
44
+ * Checks if node is `propTypes` declaration
45
+ * @param {ASTNode} node The AST node being checked.
46
+ * @returns {Boolean} True if node is `propTypes` declaration, false if not.
47
+ */
48
+ function isPropTypesDeclaration(node) {
49
+
50
+ // Special case for class properties
51
+ // (babel-eslint does not expose property name so we have to rely on tokens)
52
+ if (node.type === 'ClassProperty') {
53
+ var tokens = context.getFirstTokens(node, 2);
54
+ if (tokens[0].value === 'propTypes' || (tokens[1] && tokens[1].value === 'propTypes')) {
55
+ return true;
56
+ }
57
+ return false;
85
58
}
86
- });
87
- }
88
59
89
- return {
90
- ClassProperty: function(node) {
91
- if (isPropTypesDeclaration(node) && node.value && node.value.type === 'ObjectExpression') {
92
- checkForbidden(node.value.properties);
93
- }
94
- },
60
+ return Boolean(
61
+ node &&
62
+ node.name === 'propTypes'
63
+ );
64
+ }
95
65
96
- MemberExpression: function(node) {
97
- if (isPropTypesDeclaration(node.property)) {
98
- var right = node.parent.right;
99
- if (right && right.type === 'ObjectExpression') {
100
- checkForbidden(right.properties);
101
- }
102
- }
103
- },
104
66
105
- ObjectExpression: function(node) {
106
- node.properties.forEach(function(property) {
107
- if (!property.key) {
67
+ /**
68
+ * Checks if propTypes declarations are forbidden
69
+ * @param {Array} declarations The array of AST nodes being checked.
70
+ * @returns {void}
71
+ */
72
+ function checkForbidden(declarations) {
73
+ declarations.forEach(function(declaration) {
74
+ if (declaration.type !== 'Property') {
108
75
return;
109
76
}
110
-
111
- if (!isPropTypesDeclaration(property.key)) {
112
- return;
77
+ var target;
78
+ var value = declaration.value;
79
+ if (
80
+ value.type === 'MemberExpression' &&
81
+ value.property &&
82
+ value.property.name &&
83
+ value.property.name === 'isRequired'
84
+ ) {
85
+ value = value.object;
113
86
}
114
- if (property.value.type === 'ObjectExpression') {
115
- checkForbidden(property.value.properties);
87
+ if (
88
+ value.type === 'CallExpression' &&
89
+ value.callee.type === 'MemberExpression'
90
+ ) {
91
+ value = value.callee;
92
+ }
93
+ if (value.property) {
94
+ target = value.property.name;
95
+ } else if (value.type === 'Identifier') {
96
+ target = value.name;
97
+ }
98
+ if (isForbidden(target)) {
99
+ context.report({
100
+ node: declaration,
101
+ message: 'Prop type `' + target + '` is forbidden'
102
+ });
116
103
}
117
104
});
118
105
}
119
106
120
- };
121
- };
122
-
123
- module.exports.schema = [{
124
- type: 'object',
125
- properties: {
126
- forbid: {
127
- type: 'array',
128
- items: {
129
- type: 'string'
107
+ return {
108
+ ClassProperty: function(node) {
109
+ if (isPropTypesDeclaration(node) && node.value && node.value.type === 'ObjectExpression') {
110
+ checkForbidden(node.value.properties);
111
+ }
112
+ },
113
+
114
+ MemberExpression: function(node) {
115
+ if (isPropTypesDeclaration(node.property)) {
116
+ var right = node.parent.right;
117
+ if (right && right.type === 'ObjectExpression') {
118
+ checkForbidden(right.properties);
119
+ }
120
+ }
121
+ },
122
+
123
+ ObjectExpression: function(node) {
124
+ node.properties.forEach(function(property) {
125
+ if (!property.key) {
126
+ return;
127
+ }
128
+
129
+ if (!isPropTypesDeclaration(property.key)) {
130
+ return;
131
+ }
132
+ if (property.value.type === 'ObjectExpression') {
133
+ checkForbidden(property.value.properties);
134
+ }
135
+ });
130
136
}
131
- }
132
- },
133
- additionalProperties: true
134
- }] ;
137
+
138
+ };
139
+ }
140
+ };
0 commit comments