index.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /*istanbul ignore next*/"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 ( /*istanbul ignore next*/_ref) {
  6. /*istanbul ignore next*/var t = _ref.types;
  7. function getSpreadLiteral(spread, scope, state) {
  8. if (state.opts.loose && !t.isIdentifier(spread.argument, { name: "arguments" })) {
  9. return spread.argument;
  10. } else {
  11. return scope.toArray(spread.argument, true);
  12. }
  13. }
  14. function hasSpread(nodes) {
  15. for (var i = 0; i < nodes.length; i++) {
  16. if (t.isSpreadElement(nodes[i])) {
  17. return true;
  18. }
  19. }
  20. return false;
  21. }
  22. function build(props, scope, state) {
  23. var nodes = [];
  24. var _props = [];
  25. function push() {
  26. if (!_props.length) return;
  27. nodes.push(t.arrayExpression(_props));
  28. _props = [];
  29. }
  30. for ( /*istanbul ignore next*/var _iterator = props, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) {
  31. /*istanbul ignore next*/
  32. var _ref2;
  33. if (_isArray) {
  34. if (_i >= _iterator.length) break;
  35. _ref2 = _iterator[_i++];
  36. } else {
  37. _i = _iterator.next();
  38. if (_i.done) break;
  39. _ref2 = _i.value;
  40. }
  41. var prop = _ref2;
  42. if (t.isSpreadElement(prop)) {
  43. push();
  44. nodes.push(getSpreadLiteral(prop, scope, state));
  45. } else {
  46. _props.push(prop);
  47. }
  48. }
  49. push();
  50. return nodes;
  51. }
  52. return {
  53. visitor: { /*istanbul ignore next*/
  54. ArrayExpression: function ArrayExpression(path, state) {
  55. /*istanbul ignore next*/var node = path.node;
  56. /*istanbul ignore next*/var scope = path.scope;
  57. var elements = node.elements;
  58. if (!hasSpread(elements)) return;
  59. var nodes = build(elements, scope, state);
  60. var first = nodes.shift();
  61. if (!t.isArrayExpression(first)) {
  62. nodes.unshift(first);
  63. first = t.arrayExpression([]);
  64. }
  65. path.replaceWith(t.callExpression(t.memberExpression(first, t.identifier("concat")), nodes));
  66. },
  67. /*istanbul ignore next*/CallExpression: function CallExpression(path, state) {
  68. /*istanbul ignore next*/var node = path.node;
  69. /*istanbul ignore next*/var scope = path.scope;
  70. var args = node.arguments;
  71. if (!hasSpread(args)) return;
  72. var calleePath = path.get("callee");
  73. if (calleePath.isSuper()) return;
  74. var contextLiteral = t.identifier("undefined");
  75. node.arguments = [];
  76. var nodes = /*istanbul ignore next*/void 0;
  77. if (args.length === 1 && args[0].argument.name === "arguments") {
  78. nodes = [args[0].argument];
  79. } else {
  80. nodes = build(args, scope, state);
  81. }
  82. var first = nodes.shift();
  83. if (nodes.length) {
  84. node.arguments.push(t.callExpression(t.memberExpression(first, t.identifier("concat")), nodes));
  85. } else {
  86. node.arguments.push(first);
  87. }
  88. var callee = node.callee;
  89. if (calleePath.isMemberExpression()) {
  90. var temp = scope.maybeGenerateMemoised(callee.object);
  91. if (temp) {
  92. callee.object = t.assignmentExpression("=", temp, callee.object);
  93. contextLiteral = temp;
  94. } else {
  95. contextLiteral = callee.object;
  96. }
  97. t.appendToMemberExpression(callee, t.identifier("apply"));
  98. } else {
  99. node.callee = t.memberExpression(node.callee, t.identifier("apply"));
  100. }
  101. if (t.isSuper(contextLiteral)) {
  102. contextLiteral = t.thisExpression();
  103. }
  104. node.arguments.unshift(contextLiteral);
  105. },
  106. /*istanbul ignore next*/NewExpression: function NewExpression(path, state) {
  107. /*istanbul ignore next*/var node = path.node;
  108. /*istanbul ignore next*/var scope = path.scope;
  109. var args = node.arguments;
  110. if (!hasSpread(args)) return;
  111. var nodes = build(args, scope, state);
  112. var context = t.arrayExpression([t.nullLiteral()]);
  113. args = t.callExpression(t.memberExpression(context, t.identifier("concat")), nodes);
  114. path.replaceWith(t.newExpression(t.callExpression(t.memberExpression(t.memberExpression(t.memberExpression(t.identifier("Function"), t.identifier("prototype")), t.identifier("bind")), t.identifier("apply")), [node.callee, args]), []));
  115. }
  116. }
  117. };
  118. };
  119. /*istanbul ignore next*/
  120. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  121. module.exports = exports["default"];