export default function normalizeClassDefinition()

in src/utils/normalizeClassDefinition.ts [27:97]


export default function normalizeClassDefinition(
  classDefinition: NodePath,
): void {
  let variableName;
  if (t.ClassDeclaration.check(classDefinition.node)) {
    // Class declarations don't have an id, e.g.: `export default class extends React.Component {}`
    if (classDefinition.node.id) {
      variableName = classDefinition.node.id.name;
    }
  } else if (t.ClassExpression.check(classDefinition.node)) {
    let { parentPath } = classDefinition;
    while (
      parentPath.node !== classDefinition.scope.node &&
      !t.BlockStatement.check(parentPath.node)
    ) {
      if (
        t.VariableDeclarator.check(parentPath.node) &&
        t.Identifier.check(parentPath.node.id)
      ) {
        variableName = parentPath.node.id.name;
        break;
      } else if (
        t.AssignmentExpression.check(parentPath.node) &&
        t.Identifier.check(parentPath.node.left)
      ) {
        variableName = parentPath.node.left.name;
        break;
      }
      parentPath = parentPath.parentPath;
    }
  }

  if (!variableName) {
    return;
  }

  const scopeRoot = classDefinition.scope;
  visit(scopeRoot.node, {
    visitFunction: ignore,
    visitClassDeclaration: ignore,
    visitClassExpression: ignore,
    visitForInStatement: ignore,
    visitForStatement: ignore,
    visitAssignmentExpression: function (path) {
      if (t.MemberExpression.check(path.node.left)) {
        const first = getMemberExpressionRoot(path.get('left'));
        if (
          t.Identifier.check(first.node) &&
          first.node.name === variableName
        ) {
          const [member] = getMembers(path.get('left'));
          if (member && !member.path.node.computed) {
            const classProperty = builders.classProperty(
              member.path.node,
              path.node.right,
              null,
              true,
            );
            classDefinition.get('body', 'body').value.push(classProperty);
            return false;
          }
        }
        this.traverse(path);
      } else {
        return false;
      }

      return undefined;
    },
  });
}