|  | 'use strict';
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var syntaxJsx = _interopDefault(require('babel-plugin-syntax-jsx'));
var groupEventAttributes = (function (t) {
  return function (obj, attribute) {
    if (t.isJSXSpreadAttribute(attribute)) {
      return obj;
    }
    var isNamespaced = t.isJSXNamespacedName(attribute.get('name'));
    var event = (isNamespaced ? attribute.get('name').get('namespace') : attribute.get('name')).get('name').node;
    var modifiers = isNamespaced ? new Set(attribute.get('name').get('name').get('name').node.split('-')) : new Set();
    if (event.indexOf('on') !== 0) {
      return obj;
    }
    var value = attribute.get('value');
    attribute.remove();
    if (!t.isJSXExpressionContainer(value)) {
      return obj;
    }
    var expression = value.get('expression').node;
    var eventName = event.substr(2);
    if (eventName[0] === '-') {
      eventName = eventName.substr(1);
    }
    eventName = eventName[0].toLowerCase() + eventName.substr(1);
    if (modifiers.has('capture')) {
      eventName = '!' + eventName;
    }
    if (modifiers.has('once')) {
      eventName = '~' + eventName;
    }
    if (!obj[eventName]) {
      obj[eventName] = [];
    }
    obj[eventName].push({ modifiers, expression, attribute });
    return obj;
  };
});
var aliases = {
  esc: 27,
  tab: 9,
  enter: 13,
  space: 32,
  up: 38,
  left: 37,
  right: 39,
  down: 40,
  delete: [8, 46]
};
var keyModifiers = ['ctrl', 'shift', 'alt', 'meta'];
var keyCodeRE = /^k(\d{1,})$/;
var generateBindingBody = (function (t, _ref) {
  var modifiers = _ref.modifiers,
      expression = _ref.expression;
  var callStatement = t.expressionStatement(t.callExpression(expression, [t.identifier('$event'), t.spreadElement(t.identifier('attrs'))]));
  var result = [];
  var conditions = [];
  var keyConditions = [t.unaryExpression('!', t.binaryExpression('in', t.stringLiteral('button'), t.identifier('$event')))];
  modifiers.forEach(function (modifier) {
    if (modifier === 'stop') {
      result.push(t.expressionStatement(t.callExpression(t.memberExpression(t.identifier('$event'), t.identifier('stopPropagation')), [])));
    } else if (modifier === 'prevent') {
      result.push(t.expressionStatement(t.callExpression(t.memberExpression(t.identifier('$event'), t.identifier('preventDefault')), [])));
    } else if (modifier === 'self') {
      conditions.push(t.binaryExpression('!==', t.memberExpression(t.identifier('$event'), t.identifier('target')), t.memberExpression(t.identifier('$event'), t.identifier('currentTarget'))));
    } else if (keyModifiers.includes(modifier)) {
      conditions.push(t.unaryExpression('!', t.memberExpression(t.identifier('$event'), t.identifier(`${modifier}Key`))));
    } else if (modifier === 'bare') {
      conditions.push(keyModifiers.filter(function (keyModifier) {
        return !modifiers.has(keyModifier);
      }).map(function (keyModifier) {
        return t.memberExpression(t.identifier('$event'), t.identifier(`${keyModifier}Key`));
      }).reduce(function (leftCondition, rightCondition) {
        return t.logicalExpression('||', leftCondition, rightCondition);
      }));
    } else if (aliases[modifier]) {
      keyConditions.push(t.callExpression(t.memberExpression(t.thisExpression(), t.identifier('_k')), [t.memberExpression(t.identifier('$event'), t.identifier('keyCode')), t.stringLiteral(modifier), Array.isArray(aliases[modifier]) ? t.arrayExpression(aliases[modifier].map(function (el) {
        return t.numericLiteral(el);
      })) : t.numericLiteral(aliases[modifier])]));
    } else if (modifier.match(keyCodeRE)) {
      var keyCode = +modifier.match(keyCodeRE)[1];
      keyConditions.push(t.binaryExpression('!==', t.memberExpression(t.identifier('$event'), t.identifier('keyCode')), t.numericLiteral(keyCode)));
    }
  });
  if (keyConditions.length > 1) {
    conditions.push(keyConditions.reduce(function (leftCondition, rightCondition) {
      return t.logicalExpression('&&', leftCondition, rightCondition);
    }));
  }
  if (conditions.length > 0) {
    result.push(t.ifStatement(conditions.reduce(function (leftCondition, rightCondition) {
      return t.logicalExpression('||', leftCondition, rightCondition);
    }), t.returnStatement(t.nullLiteral())));
  }
  result.push(callStatement);
  return result;
});
var generateBindingsList = (function (t, bindings) {
  return bindings.map(function (binding) {
    return t.arrowFunctionExpression([t.identifier('$event'), t.restElement(t.identifier('attrs'))], t.blockStatement(generateBindingBody(t, binding)));
  });
});
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
var generateSpreadEvent = (function (t) {
  return function (_ref) {
    var _ref2 = _slicedToArray(_ref, 2),
        event = _ref2[0],
        bindings = _ref2[1];
    var callbacks = generateBindingsList(t, bindings);
    return t.objectProperty(t.stringLiteral(event), callbacks.length === 1 ? callbacks[0] : t.arrayExpression(callbacks));
  };
});
var index = (function (_ref) {
  var t = _ref.types;
  return {
    inherits: syntaxJsx,
    visitor: {
      Program(path) {
        path.traverse({
          JSXOpeningElement(path) {
            var attributes = path.get('attributes');
            var groupedEventAttributes = attributes.reduce(groupEventAttributes(t), {});
            var events = Object.keys(groupedEventAttributes).map(function (key) {
              return [key, groupedEventAttributes[key]];
            });
            if (events.length > 0) {
              path.pushContainer('attributes', t.jSXSpreadAttribute(t.objectExpression([t.objectProperty(t.identifier('on'), t.objectExpression(events.map(generateSpreadEvent(t))))])));
            }
          }
        });
      }
    }
  };
});
module.exports = index;
 |