react-docgen
Version:
A library to extract information from React components for documentation generation.
67 lines (66 loc) • 2.17 kB
JavaScript
import isReactModuleName from './isReactModuleName.js';
import resolveToModule from './resolveToModule.js';
import resolveToValue from './resolveToValue.js';
import isDestructuringAssignment from './isDestructuringAssignment.js';
import isImportSpecifier from './isImportSpecifier.js';
function isRenderMethod(path) {
if ((!path.isClassMethod() || path.node.kind !== 'method') &&
!path.isClassProperty()) {
return false;
}
if (path.node.computed || path.node.static) {
return false;
}
const key = path.get('key');
if (!key.isIdentifier() || key.node.name !== 'render') {
return false;
}
return true;
}
function classExtendsReactComponent(path) {
if (path.isMemberExpression()) {
const property = path.get('property');
if (property.isIdentifier({ name: 'Component' }) ||
property.isIdentifier({ name: 'PureComponent' })) {
return true;
}
}
else if (isImportSpecifier(path, 'Component') ||
isImportSpecifier(path, 'PureComponent')) {
return true;
}
else if (isDestructuringAssignment(path, 'Component') ||
isDestructuringAssignment(path, 'PureComponent')) {
return true;
}
return false;
}
/**
* Returns `true` of the path represents a class definition which either extends
* `React.Component` or has a superclass and implements a `render()` method.
*/
export default function isReactComponentClass(path) {
if (!path.isClass()) {
return false;
}
// React.Component or React.PureComponent
const superClass = path.get('superClass');
if (superClass.hasNode()) {
const resolvedSuperClass = resolveToValue(superClass);
if (classExtendsReactComponent(resolvedSuperClass)) {
const module = resolveToModule(resolvedSuperClass);
if (module && isReactModuleName(module)) {
return true;
}
}
}
else {
// does not extend anything
return false;
}
// render method
if (path.get('body').get('body').some(isRenderMethod)) {
return true;
}
return false;
}