index.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  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. function hasRestProperty(path) {
  8. var foundRestProperty = false;
  9. path.traverse({
  10. RestProperty: function RestProperty() {
  11. foundRestProperty = true;
  12. path.stop();
  13. }
  14. });
  15. return foundRestProperty;
  16. }
  17. function hasSpread(node) {
  18. for (var _iterator = node.properties, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) {
  19. var _ref2;
  20. if (_isArray) {
  21. if (_i >= _iterator.length) break;
  22. _ref2 = _iterator[_i++];
  23. } else {
  24. _i = _iterator.next();
  25. if (_i.done) break;
  26. _ref2 = _i.value;
  27. }
  28. var prop = _ref2;
  29. if (t.isSpreadProperty(prop)) {
  30. return true;
  31. }
  32. }
  33. return false;
  34. }
  35. function createObjectSpread(file, props, objRef) {
  36. var restProperty = props.pop();
  37. var keys = [];
  38. for (var _iterator2 = props, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : (0, _getIterator3.default)(_iterator2);;) {
  39. var _ref3;
  40. if (_isArray2) {
  41. if (_i2 >= _iterator2.length) break;
  42. _ref3 = _iterator2[_i2++];
  43. } else {
  44. _i2 = _iterator2.next();
  45. if (_i2.done) break;
  46. _ref3 = _i2.value;
  47. }
  48. var prop = _ref3;
  49. var key = prop.key;
  50. if (t.isIdentifier(key) && !prop.computed) {
  51. key = t.stringLiteral(prop.key.name);
  52. }
  53. keys.push(key);
  54. }
  55. return [restProperty.argument, t.callExpression(file.addHelper("objectWithoutProperties"), [objRef, t.arrayExpression(keys)])];
  56. }
  57. function replaceRestProperty(parentPath, paramPath, i, numParams) {
  58. if (paramPath.isAssignmentPattern()) {
  59. replaceRestProperty(parentPath, paramPath.get("left"), i, numParams);
  60. return;
  61. }
  62. if (paramPath.isObjectPattern() && hasRestProperty(paramPath)) {
  63. var uid = parentPath.scope.generateUidIdentifier("ref");
  64. var declar = t.variableDeclaration("let", [t.variableDeclarator(paramPath.node, uid)]);
  65. declar._blockHoist = i ? numParams - i : 1;
  66. parentPath.ensureBlock();
  67. parentPath.get("body").unshiftContainer("body", declar);
  68. paramPath.replaceWith(uid);
  69. }
  70. }
  71. return {
  72. inherits: require("babel-plugin-syntax-object-rest-spread"),
  73. visitor: {
  74. Function: function Function(path) {
  75. var params = path.get("params");
  76. for (var i = 0; i < params.length; i++) {
  77. replaceRestProperty(params[i].parentPath, params[i], i, params.length);
  78. }
  79. },
  80. VariableDeclarator: function VariableDeclarator(path, file) {
  81. if (!path.get("id").isObjectPattern()) {
  82. return;
  83. }
  84. var insertionPath = path;
  85. path.get("id").traverse({
  86. RestProperty: function RestProperty(path) {
  87. if (this.originalPath.node.id.properties.length > 1 && !t.isIdentifier(this.originalPath.node.init)) {
  88. var initRef = path.scope.generateUidIdentifierBasedOnNode(this.originalPath.node.init, "ref");
  89. this.originalPath.insertBefore(t.variableDeclarator(initRef, this.originalPath.node.init));
  90. this.originalPath.replaceWith(t.variableDeclarator(this.originalPath.node.id, initRef));
  91. return;
  92. }
  93. var ref = this.originalPath.node.init;
  94. path.findParent(function (path) {
  95. if (path.isObjectProperty()) {
  96. ref = t.memberExpression(ref, t.identifier(path.node.key.name));
  97. } else if (path.isVariableDeclarator()) {
  98. return true;
  99. }
  100. });
  101. var _createObjectSpread = createObjectSpread(file, path.parentPath.node.properties, ref),
  102. argument = _createObjectSpread[0],
  103. callExpression = _createObjectSpread[1];
  104. insertionPath.insertAfter(t.variableDeclarator(argument, callExpression));
  105. insertionPath = insertionPath.getSibling(insertionPath.key + 1);
  106. if (path.parentPath.node.properties.length === 0) {
  107. path.findParent(function (path) {
  108. return path.isObjectProperty() || path.isVariableDeclarator();
  109. }).remove();
  110. }
  111. }
  112. }, {
  113. originalPath: path
  114. });
  115. },
  116. ExportNamedDeclaration: function ExportNamedDeclaration(path) {
  117. var declaration = path.get("declaration");
  118. if (!declaration.isVariableDeclaration()) return;
  119. if (!hasRestProperty(declaration)) return;
  120. var specifiers = [];
  121. for (var name in path.getOuterBindingIdentifiers(path)) {
  122. var id = t.identifier(name);
  123. specifiers.push(t.exportSpecifier(id, id));
  124. }
  125. path.replaceWith(declaration.node);
  126. path.insertAfter(t.exportNamedDeclaration(null, specifiers));
  127. },
  128. CatchClause: function CatchClause(path) {
  129. var paramPath = path.get("param");
  130. replaceRestProperty(paramPath.parentPath, paramPath);
  131. },
  132. AssignmentExpression: function AssignmentExpression(path, file) {
  133. var leftPath = path.get("left");
  134. if (leftPath.isObjectPattern() && hasRestProperty(leftPath)) {
  135. var nodes = [];
  136. var ref = void 0;
  137. if (path.isCompletionRecord() || path.parentPath.isExpressionStatement()) {
  138. ref = path.scope.generateUidIdentifierBasedOnNode(path.node.right, "ref");
  139. nodes.push(t.variableDeclaration("var", [t.variableDeclarator(ref, path.node.right)]));
  140. }
  141. var _createObjectSpread2 = createObjectSpread(file, path.node.left.properties, ref),
  142. argument = _createObjectSpread2[0],
  143. callExpression = _createObjectSpread2[1];
  144. var nodeWithoutSpread = t.clone(path.node);
  145. nodeWithoutSpread.right = ref;
  146. nodes.push(t.expressionStatement(nodeWithoutSpread));
  147. nodes.push(t.toStatement(t.assignmentExpression("=", argument, callExpression)));
  148. if (ref) {
  149. nodes.push(t.expressionStatement(ref));
  150. }
  151. path.replaceWithMultiple(nodes);
  152. }
  153. },
  154. ForXStatement: function ForXStatement(path) {
  155. var node = path.node,
  156. scope = path.scope;
  157. var leftPath = path.get("left");
  158. var left = node.left;
  159. if (t.isObjectPattern(left) && hasRestProperty(leftPath)) {
  160. var temp = scope.generateUidIdentifier("ref");
  161. node.left = t.variableDeclaration("var", [t.variableDeclarator(temp)]);
  162. path.ensureBlock();
  163. node.body.body.unshift(t.variableDeclaration("var", [t.variableDeclarator(left, temp)]));
  164. return;
  165. }
  166. if (!t.isVariableDeclaration(left)) return;
  167. var pattern = left.declarations[0].id;
  168. if (!t.isObjectPattern(pattern)) return;
  169. var key = scope.generateUidIdentifier("ref");
  170. node.left = t.variableDeclaration(left.kind, [t.variableDeclarator(key, null)]);
  171. path.ensureBlock();
  172. node.body.body.unshift(t.variableDeclaration(node.left.kind, [t.variableDeclarator(pattern, key)]));
  173. },
  174. ObjectExpression: function ObjectExpression(path, file) {
  175. if (!hasSpread(path.node)) return;
  176. var useBuiltIns = file.opts.useBuiltIns || false;
  177. if (typeof useBuiltIns !== "boolean") {
  178. throw new Error("transform-object-rest-spread currently only accepts a boolean " + "option for useBuiltIns (defaults to false)");
  179. }
  180. var args = [];
  181. var props = [];
  182. function push() {
  183. if (!props.length) return;
  184. args.push(t.objectExpression(props));
  185. props = [];
  186. }
  187. for (var _iterator3 = path.node.properties, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : (0, _getIterator3.default)(_iterator3);;) {
  188. var _ref4;
  189. if (_isArray3) {
  190. if (_i3 >= _iterator3.length) break;
  191. _ref4 = _iterator3[_i3++];
  192. } else {
  193. _i3 = _iterator3.next();
  194. if (_i3.done) break;
  195. _ref4 = _i3.value;
  196. }
  197. var prop = _ref4;
  198. if (t.isSpreadProperty(prop)) {
  199. push();
  200. args.push(prop.argument);
  201. } else {
  202. props.push(prop);
  203. }
  204. }
  205. push();
  206. if (!t.isObjectExpression(args[0])) {
  207. args.unshift(t.objectExpression([]));
  208. }
  209. var helper = useBuiltIns ? t.memberExpression(t.identifier("Object"), t.identifier("assign")) : file.addHelper("extends");
  210. path.replaceWith(t.callExpression(helper, args));
  211. }
  212. }
  213. };
  214. };
  215. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  216. module.exports = exports["default"];