findComponentDefinition.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import isReactComponentClass from './isReactComponentClass.js';
  2. import isReactCreateClassCall from './isReactCreateClassCall.js';
  3. import isReactForwardRefCall from './isReactForwardRefCall.js';
  4. import isStatelessComponent from './isStatelessComponent.js';
  5. import normalizeClassDefinition from './normalizeClassDefinition.js';
  6. import resolveHOC from './resolveHOC.js';
  7. import resolveToValue from './resolveToValue.js';
  8. function isComponentDefinition(path) {
  9. return (isReactCreateClassCall(path) ||
  10. isReactComponentClass(path) ||
  11. isStatelessComponent(path) ||
  12. isReactForwardRefCall(path));
  13. }
  14. function resolveComponentDefinition(definition) {
  15. if (isReactCreateClassCall(definition)) {
  16. // return argument
  17. const resolvedPath = resolveToValue(definition.get('arguments')[0]);
  18. if (resolvedPath.isObjectExpression()) {
  19. return resolvedPath;
  20. }
  21. }
  22. else if (isReactComponentClass(definition)) {
  23. normalizeClassDefinition(definition);
  24. return definition;
  25. }
  26. else if (isStatelessComponent(definition) ||
  27. isReactForwardRefCall(definition)) {
  28. return definition;
  29. }
  30. return null;
  31. }
  32. export default function findComponentDefinition(path) {
  33. let resolvedPath = path;
  34. if (!isComponentDefinition(resolvedPath)) {
  35. resolvedPath = resolveToValue(resolveHOC(resolvedPath));
  36. if (!isComponentDefinition(resolvedPath)) {
  37. return null;
  38. }
  39. }
  40. return resolveComponentDefinition(resolvedPath);
  41. }