You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.3 KiB
103 lines
3.3 KiB
/** |
|
* @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'; |
|
} |
|
|
|
module.exports = { |
|
isPropTypesDeclaration, |
|
isContextTypesDeclaration, |
|
isContextTypeDeclaration, |
|
isChildContextTypesDeclaration, |
|
isDefaultPropsDeclaration, |
|
isDisplayNameDeclaration, |
|
isRequiredPropType, |
|
};
|
|
|