export default function isReactComponentClass()

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;
}