isReactBuiltinReference.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import isReactModuleName from './isReactModuleName.js';
  2. import resolveToModule from './resolveToModule.js';
  3. import resolveToValue from './resolveToValue.js';
  4. import isDestructuringAssignment from './isDestructuringAssignment.js';
  5. import isImportSpecifier from './isImportSpecifier.js';
  6. function isNamedMemberExpression(value, name) {
  7. if (!value.isMemberExpression()) {
  8. return false;
  9. }
  10. const property = value.get('property');
  11. return property.isIdentifier() && property.node.name === name;
  12. }
  13. /**
  14. * Returns true if the expression is a reference to a react export.
  15. */
  16. export default function isReactBuiltinReference(path, name) {
  17. if (path.isMemberExpression() &&
  18. path.get('property').isIdentifier({ name })) {
  19. const module = resolveToModule(path.get('object'));
  20. return Boolean(module && isReactModuleName(module));
  21. }
  22. // Typescript
  23. if (path.isTSQualifiedName() && path.get('right').isIdentifier({ name })) {
  24. const module = resolveToModule(path.get('left'));
  25. return Boolean(module && isReactModuleName(module));
  26. }
  27. // Flow
  28. if (path.isQualifiedTypeIdentifier() &&
  29. path.get('id').isIdentifier({ name })) {
  30. const module = resolveToModule(path.get('qualification'));
  31. return Boolean(module && isReactModuleName(module));
  32. }
  33. const value = resolveToValue(path);
  34. if (value === path) {
  35. return false;
  36. }
  37. if (
  38. // const { x } = require('react')
  39. isDestructuringAssignment(value, name) ||
  40. // `require('react').createElement`
  41. isNamedMemberExpression(value, name) ||
  42. // `import { createElement } from 'react'`
  43. isImportSpecifier(value, name)) {
  44. const module = resolveToModule(value);
  45. return Boolean(module && isReactModuleName(module));
  46. }
  47. return false;
  48. }