index.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _helperPluginUtils = require("@babel/helper-plugin-utils");
  7. var _path = _interopRequireDefault(require("path"));
  8. var _core = require("@babel/core");
  9. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  10. var _default = (0, _helperPluginUtils.declare)(api => {
  11. api.assertVersion(7);
  12. function addDisplayName(id, call) {
  13. const props = call.arguments[0].properties;
  14. let safe = true;
  15. for (let i = 0; i < props.length; i++) {
  16. const prop = props[i];
  17. const key = _core.types.toComputedKey(prop);
  18. if (_core.types.isLiteral(key, {
  19. value: "displayName"
  20. })) {
  21. safe = false;
  22. break;
  23. }
  24. }
  25. if (safe) {
  26. props.unshift(_core.types.objectProperty(_core.types.identifier("displayName"), _core.types.stringLiteral(id)));
  27. }
  28. }
  29. const isCreateClassCallExpression = _core.types.buildMatchMemberExpression("React.createClass");
  30. const isCreateClassAddon = callee => callee.name === "createReactClass";
  31. function isCreateClass(node) {
  32. if (!node || !_core.types.isCallExpression(node)) return false;
  33. if (!isCreateClassCallExpression(node.callee) && !isCreateClassAddon(node.callee)) {
  34. return false;
  35. }
  36. const args = node.arguments;
  37. if (args.length !== 1) return false;
  38. const first = args[0];
  39. if (!_core.types.isObjectExpression(first)) return false;
  40. return true;
  41. }
  42. return {
  43. name: "transform-react-display-name",
  44. visitor: {
  45. ExportDefaultDeclaration({
  46. node
  47. }, state) {
  48. if (isCreateClass(node.declaration)) {
  49. const filename = state.filename || "unknown";
  50. let displayName = _path.default.basename(filename, _path.default.extname(filename));
  51. if (displayName === "index") {
  52. displayName = _path.default.basename(_path.default.dirname(filename));
  53. }
  54. addDisplayName(displayName, node.declaration);
  55. }
  56. },
  57. CallExpression(path) {
  58. const {
  59. node
  60. } = path;
  61. if (!isCreateClass(node)) return;
  62. let id;
  63. path.find(function (path) {
  64. if (path.isAssignmentExpression()) {
  65. id = path.node.left;
  66. } else if (path.isObjectProperty()) {
  67. id = path.node.key;
  68. } else if (path.isVariableDeclarator()) {
  69. id = path.node.id;
  70. } else if (path.isStatement()) {
  71. return true;
  72. }
  73. if (id) return true;
  74. });
  75. if (!id) return;
  76. if (_core.types.isMemberExpression(id)) {
  77. id = id.property;
  78. }
  79. if (_core.types.isIdentifier(id)) {
  80. addDisplayName(id.name, node);
  81. }
  82. }
  83. }
  84. };
  85. });
  86. exports.default = _default;