index.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. "use strict";
  2. exports.__esModule = true;
  3. var _getIterator2 = require("babel-runtime/core-js/get-iterator");
  4. var _getIterator3 = _interopRequireDefault(_getIterator2);
  5. exports.default = function (_ref) {
  6. var t = _ref.types;
  7. var findBareSupers = {
  8. Super: function Super(path) {
  9. if (path.parentPath.isCallExpression({ callee: path.node })) {
  10. this.push(path.parentPath);
  11. }
  12. }
  13. };
  14. var referenceVisitor = {
  15. ReferencedIdentifier: function ReferencedIdentifier(path) {
  16. if (this.scope.hasOwnBinding(path.node.name)) {
  17. this.collision = true;
  18. path.skip();
  19. }
  20. }
  21. };
  22. return {
  23. inherits: require("babel-plugin-syntax-class-properties"),
  24. visitor: {
  25. Class: function Class(path) {
  26. var isDerived = !!path.node.superClass;
  27. var constructor = void 0;
  28. var props = [];
  29. var body = path.get("body");
  30. for (var _iterator = body.get("body"), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) {
  31. var _ref2;
  32. if (_isArray) {
  33. if (_i >= _iterator.length) break;
  34. _ref2 = _iterator[_i++];
  35. } else {
  36. _i = _iterator.next();
  37. if (_i.done) break;
  38. _ref2 = _i.value;
  39. }
  40. var _path = _ref2;
  41. if (_path.isClassProperty()) {
  42. props.push(_path);
  43. } else if (_path.isClassMethod({ kind: "constructor" })) {
  44. constructor = _path;
  45. }
  46. }
  47. if (!props.length) return;
  48. var nodes = [];
  49. var ref = void 0;
  50. if (path.isClassExpression() || !path.node.id) {
  51. (0, _babelHelperFunctionName2.default)(path);
  52. ref = path.scope.generateUidIdentifier("class");
  53. } else {
  54. // path.isClassDeclaration() && path.node.id
  55. ref = path.node.id;
  56. }
  57. var instanceBody = [];
  58. for (var _iterator2 = props, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : (0, _getIterator3.default)(_iterator2);;) {
  59. var _ref3;
  60. if (_isArray2) {
  61. if (_i2 >= _iterator2.length) break;
  62. _ref3 = _iterator2[_i2++];
  63. } else {
  64. _i2 = _iterator2.next();
  65. if (_i2.done) break;
  66. _ref3 = _i2.value;
  67. }
  68. var _prop = _ref3;
  69. var propNode = _prop.node;
  70. if (propNode.decorators && propNode.decorators.length > 0) continue;
  71. if (!propNode.value) continue;
  72. var isStatic = propNode.static;
  73. if (isStatic) {
  74. nodes.push(t.expressionStatement(t.assignmentExpression("=", t.memberExpression(ref, propNode.key), propNode.value)));
  75. } else {
  76. instanceBody.push(t.expressionStatement(t.assignmentExpression("=", t.memberExpression(t.thisExpression(), propNode.key), propNode.value)));
  77. }
  78. }
  79. if (instanceBody.length) {
  80. if (!constructor) {
  81. var newConstructor = t.classMethod("constructor", t.identifier("constructor"), [], t.blockStatement([]));
  82. if (isDerived) {
  83. newConstructor.params = [t.restElement(t.identifier("args"))];
  84. newConstructor.body.body.push(t.returnStatement(t.callExpression(t.super(), [t.spreadElement(t.identifier("args"))])));
  85. }
  86. var _body$unshiftContaine = body.unshiftContainer("body", newConstructor);
  87. constructor = _body$unshiftContaine[0];
  88. }
  89. var collisionState = {
  90. collision: false,
  91. scope: constructor.scope
  92. };
  93. for (var _iterator3 = props, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : (0, _getIterator3.default)(_iterator3);;) {
  94. var _ref4;
  95. if (_isArray3) {
  96. if (_i3 >= _iterator3.length) break;
  97. _ref4 = _iterator3[_i3++];
  98. } else {
  99. _i3 = _iterator3.next();
  100. if (_i3.done) break;
  101. _ref4 = _i3.value;
  102. }
  103. var prop = _ref4;
  104. prop.traverse(referenceVisitor, collisionState);
  105. if (collisionState.collision) break;
  106. }
  107. if (collisionState.collision) {
  108. var initialisePropsRef = path.scope.generateUidIdentifier("initialiseProps");
  109. nodes.push(t.variableDeclaration("var", [t.variableDeclarator(initialisePropsRef, t.functionExpression(null, [], t.blockStatement(instanceBody)))]));
  110. instanceBody = [t.expressionStatement(t.callExpression(t.memberExpression(initialisePropsRef, t.identifier("call")), [t.thisExpression()]))];
  111. }
  112. //
  113. if (isDerived) {
  114. var bareSupers = [];
  115. constructor.traverse(findBareSupers, bareSupers);
  116. for (var _iterator4 = bareSupers, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : (0, _getIterator3.default)(_iterator4);;) {
  117. var _ref5;
  118. if (_isArray4) {
  119. if (_i4 >= _iterator4.length) break;
  120. _ref5 = _iterator4[_i4++];
  121. } else {
  122. _i4 = _iterator4.next();
  123. if (_i4.done) break;
  124. _ref5 = _i4.value;
  125. }
  126. var bareSuper = _ref5;
  127. bareSuper.insertAfter(instanceBody);
  128. }
  129. } else {
  130. constructor.get("body").unshiftContainer("body", instanceBody);
  131. }
  132. }
  133. for (var _iterator5 = props, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : (0, _getIterator3.default)(_iterator5);;) {
  134. var _ref6;
  135. if (_isArray5) {
  136. if (_i5 >= _iterator5.length) break;
  137. _ref6 = _iterator5[_i5++];
  138. } else {
  139. _i5 = _iterator5.next();
  140. if (_i5.done) break;
  141. _ref6 = _i5.value;
  142. }
  143. var _prop2 = _ref6;
  144. _prop2.remove();
  145. }
  146. if (!nodes.length) return;
  147. if (path.isClassExpression()) {
  148. path.scope.push({ id: ref });
  149. path.replaceWith(t.assignmentExpression("=", ref, path.node));
  150. } else {
  151. // path.isClassDeclaration()
  152. if (!path.node.id) {
  153. path.node.id = ref;
  154. }
  155. if (path.parentPath.isExportDeclaration()) {
  156. path = path.parentPath;
  157. }
  158. }
  159. path.insertAfter(nodes);
  160. },
  161. ArrowFunctionExpression: function ArrowFunctionExpression(path) {
  162. var classExp = path.get("body");
  163. if (!classExp.isClassExpression()) return;
  164. var body = classExp.get("body");
  165. var members = body.get("body");
  166. if (members.some(function (member) {
  167. return member.isClassProperty();
  168. })) {
  169. path.ensureBlock();
  170. }
  171. }
  172. }
  173. };
  174. };
  175. var _babelHelperFunctionName = require("babel-helper-function-name");
  176. var _babelHelperFunctionName2 = _interopRequireDefault(_babelHelperFunctionName);
  177. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  178. /* eslint max-len: 0 */
  179. // todo: define instead of assign
  180. module.exports = exports["default"];