-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
/
Copy pathprops.js
130 lines (118 loc) · 4.14 KB
/
props.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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/**
* @fileoverview Utility functions for props
*/
'use strict';
const astUtil = require('./ast');
/**
* Checks if the Identifier node passed in looks like a propTypes declaration.
* @param {ASTNode} node The node to check. Must be an Identifier node.
* @returns {boolean} `true` if the node is a propTypes declaration, `false` if not
*/
function isPropTypesDeclaration(node) {
if (node && (node.type === 'ClassProperty' || node.type === 'PropertyDefinition')) {
// Flow support
if (node.typeAnnotation && node.key.name === 'props') {
return true;
}
}
return astUtil.getPropertyName(node) === 'propTypes';
}
/**
* Checks if the node passed in looks like a contextTypes declaration.
* @param {ASTNode} node The node to check.
* @returns {boolean} `true` if the node is a contextTypes declaration, `false` if not
*/
function isContextTypesDeclaration(node) {
if (node && (node.type === 'ClassProperty' || node.type === 'PropertyDefinition')) {
// Flow support
if (node.typeAnnotation && node.key.name === 'context') {
return true;
}
}
return astUtil.getPropertyName(node) === 'contextTypes';
}
/**
* Checks if the node passed in looks like a contextType declaration.
* @param {ASTNode} node The node to check.
* @returns {boolean} `true` if the node is a contextType declaration, `false` if not
*/
function isContextTypeDeclaration(node) {
return astUtil.getPropertyName(node) === 'contextType';
}
/**
* Checks if the node passed in looks like a childContextTypes declaration.
* @param {ASTNode} node The node to check.
* @returns {boolean} `true` if the node is a childContextTypes declaration, `false` if not
*/
function isChildContextTypesDeclaration(node) {
return astUtil.getPropertyName(node) === 'childContextTypes';
}
/**
* Checks if the Identifier node passed in looks like a defaultProps declaration.
* @param {ASTNode} node The node to check. Must be an Identifier node.
* @returns {boolean} `true` if the node is a defaultProps declaration, `false` if not
*/
function isDefaultPropsDeclaration(node) {
const propName = astUtil.getPropertyName(node);
return (propName === 'defaultProps' || propName === 'getDefaultProps');
}
/**
* Checks if we are declaring a display name
* @param {ASTNode} node The AST node being checked.
* @returns {boolean} True if we are declaring a display name, false if not.
*/
function isDisplayNameDeclaration(node) {
switch (node.type) {
case 'ClassProperty':
case 'PropertyDefinition':
return node.key && node.key.name === 'displayName';
case 'Identifier':
return node.name === 'displayName';
case 'Literal':
return node.value === 'displayName';
default:
return false;
}
}
/**
* Checks if the PropTypes MemberExpression node passed in declares a required propType.
* @param {ASTNode} propTypeExpression node to check. Must be a `PropTypes` MemberExpression.
* @returns {boolean} `true` if this PropType is required, `false` if not.
*/
function isRequiredPropType(propTypeExpression) {
return propTypeExpression.type === 'MemberExpression'
&& propTypeExpression.property.name === 'isRequired';
}
/**
* Returns the type arguments of a node or type parameters if type arguments are not available.
* @param {ASTNode} node The node to get the type arguments from.
* @returns {ASTNode} The type arguments or type parameters of the node.
*/
function getTypeArguments(node) {
if ('typeArguments' in node) {
return node.typeArguments;
}
return node.typeParameters;
}
/**
* Returns the super type arguments of a node or super type parameters if type arguments are not available.
* @param {ASTNode} node The node to get the super type arguments from.
* @returns {ASTNode} The super type arguments or parameters of the node.
*/
function getSuperTypeArguments(node) {
if ('superTypeArguments' in node) {
return node.superTypeArguments;
}
return node.superTypeParameters;
}
module.exports = {
isPropTypesDeclaration,
isContextTypesDeclaration,
isContextTypeDeclaration,
isChildContextTypesDeclaration,
isDefaultPropsDeclaration,
isDisplayNameDeclaration,
isRequiredPropType,
getTypeArguments,
getSuperTypeArguments,
};