in src/utils/isReactComponentClass.ts [29:82]
export default function isReactComponentClass(
path: NodePath,
importer: Importer,
): boolean {
const node = path.node;
if (!t.ClassDeclaration.check(node) && !t.ClassExpression.check(node)) {
return false;
}
// extends something
if (!node.superClass) {
return false;
}
// React.Component or React.PureComponent
const superClass = resolveToValue(path.get('superClass'), importer);
if (
match(superClass.node, { property: { name: 'Component' } }) ||
match(superClass.node, { property: { name: 'PureComponent' } }) ||
isDestructuringAssignment(superClass, 'Component') ||
isDestructuringAssignment(superClass, 'PureComponent')
) {
const module = resolveToModule(superClass, importer);
if (module && isReactModuleName(module)) {
return true;
}
}
// render method
if (node.body.body.some(isRenderMethod)) {
return true;
}
// check for @extends React.Component in docblock
if (path.parentPath && path.parentPath.value) {
const classDeclaration = Array.isArray(path.parentPath.value)
? path.parentPath.value.find(function (declaration) {
return declaration.type === 'ClassDeclaration';
})
: path.parentPath.value;
if (
classDeclaration &&
classDeclaration.leadingComments &&
classDeclaration.leadingComments.some(function (comment) {
return /@extends\s+React\.Component/.test(comment.value);
})
) {
return true;
}
}
return false;
}