All files index.js

88.89% Statements 16/18
75% Branches 6/8
100% Functions 1/1
93.33% Lines 14/15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52                  2x       32x 32x 30x   24x 24x   24x 24x           24x           24x         21x         21x   21x 21x          
// @flow
import type {Node, Path} from './types';
import * as t from 'babel-types';
import isReactComponentSuperClass from './isReactComponentSuperClass';
import findPropsClassProperty from './findPropsClassProperty';
import convertTypeToPropTypes from './convertTypeToPropTypes';
import {log} from 'babel-log';
 
export default function() {
  return {
    name: 'react-flow-props-to-prop-types',
    visitor: {
      ClassDeclaration(path: Path) {
        const superClass = path.get('superClass');
        if (!superClass.node) return;
        if (!isReactComponentSuperClass(superClass)) return;
 
        let props = findPropsClassProperty(path.get('body'));
        Iif (!props) return;
 
        let typeAnnotation = props.get('typeAnnotation');
        Iif (!typeAnnotation.node) {
          throw props.buildCodeFrameError(
            'React component props must have type annotation',
          );
        }
 
        let propTypesRef = path.hub.file.addImport(
          'prop-types',
          'default',
          'PropTypes',
        );
 
        let objectExpression = convertTypeToPropTypes(
          typeAnnotation,
          propTypesRef,
        );
 
        let propTypesClassProperty = t.classProperty(
          t.identifier('propTypes'),
          objectExpression,
        );
 
        propTypesClassProperty.static = true;
 
        props.insertBefore(propTypesClassProperty);
        props.remove();
      },
    },
  };
}