bundle.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. 'use strict';
  2. function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
  3. var syntaxJsx = _interopDefault(require('babel-plugin-syntax-jsx'));
  4. var groupEventAttributes = (function (t) {
  5. return function (obj, attribute) {
  6. if (t.isJSXSpreadAttribute(attribute)) {
  7. return obj;
  8. }
  9. var isNamespaced = t.isJSXNamespacedName(attribute.get('name'));
  10. var event = (isNamespaced ? attribute.get('name').get('namespace') : attribute.get('name')).get('name').node;
  11. var modifiers = isNamespaced ? new Set(attribute.get('name').get('name').get('name').node.split('-')) : new Set();
  12. if (event.indexOf('on') !== 0) {
  13. return obj;
  14. }
  15. var value = attribute.get('value');
  16. attribute.remove();
  17. if (!t.isJSXExpressionContainer(value)) {
  18. return obj;
  19. }
  20. var expression = value.get('expression').node;
  21. var eventName = event.substr(2);
  22. if (eventName[0] === '-') {
  23. eventName = eventName.substr(1);
  24. }
  25. eventName = eventName[0].toLowerCase() + eventName.substr(1);
  26. if (modifiers.has('capture')) {
  27. eventName = '!' + eventName;
  28. }
  29. if (modifiers.has('once')) {
  30. eventName = '~' + eventName;
  31. }
  32. if (!obj[eventName]) {
  33. obj[eventName] = [];
  34. }
  35. obj[eventName].push({ modifiers, expression, attribute });
  36. return obj;
  37. };
  38. });
  39. var aliases = {
  40. esc: 27,
  41. tab: 9,
  42. enter: 13,
  43. space: 32,
  44. up: 38,
  45. left: 37,
  46. right: 39,
  47. down: 40,
  48. delete: [8, 46]
  49. };
  50. var keyModifiers = ['ctrl', 'shift', 'alt', 'meta'];
  51. var keyCodeRE = /^k(\d{1,})$/;
  52. var generateBindingBody = (function (t, _ref) {
  53. var modifiers = _ref.modifiers,
  54. expression = _ref.expression;
  55. var callStatement = t.expressionStatement(t.callExpression(expression, [t.identifier('$event'), t.spreadElement(t.identifier('attrs'))]));
  56. var result = [];
  57. var conditions = [];
  58. var keyConditions = [t.unaryExpression('!', t.binaryExpression('in', t.stringLiteral('button'), t.identifier('$event')))];
  59. modifiers.forEach(function (modifier) {
  60. if (modifier === 'stop') {
  61. result.push(t.expressionStatement(t.callExpression(t.memberExpression(t.identifier('$event'), t.identifier('stopPropagation')), [])));
  62. } else if (modifier === 'prevent') {
  63. result.push(t.expressionStatement(t.callExpression(t.memberExpression(t.identifier('$event'), t.identifier('preventDefault')), [])));
  64. } else if (modifier === 'self') {
  65. conditions.push(t.binaryExpression('!==', t.memberExpression(t.identifier('$event'), t.identifier('target')), t.memberExpression(t.identifier('$event'), t.identifier('currentTarget'))));
  66. } else if (keyModifiers.includes(modifier)) {
  67. conditions.push(t.unaryExpression('!', t.memberExpression(t.identifier('$event'), t.identifier(`${modifier}Key`))));
  68. } else if (modifier === 'bare') {
  69. conditions.push(keyModifiers.filter(function (keyModifier) {
  70. return !modifiers.has(keyModifier);
  71. }).map(function (keyModifier) {
  72. return t.memberExpression(t.identifier('$event'), t.identifier(`${keyModifier}Key`));
  73. }).reduce(function (leftCondition, rightCondition) {
  74. return t.logicalExpression('||', leftCondition, rightCondition);
  75. }));
  76. } else if (aliases[modifier]) {
  77. 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) {
  78. return t.numericLiteral(el);
  79. })) : t.numericLiteral(aliases[modifier])]));
  80. } else if (modifier.match(keyCodeRE)) {
  81. var keyCode = +modifier.match(keyCodeRE)[1];
  82. keyConditions.push(t.binaryExpression('!==', t.memberExpression(t.identifier('$event'), t.identifier('keyCode')), t.numericLiteral(keyCode)));
  83. }
  84. });
  85. if (keyConditions.length > 1) {
  86. conditions.push(keyConditions.reduce(function (leftCondition, rightCondition) {
  87. return t.logicalExpression('&&', leftCondition, rightCondition);
  88. }));
  89. }
  90. if (conditions.length > 0) {
  91. result.push(t.ifStatement(conditions.reduce(function (leftCondition, rightCondition) {
  92. return t.logicalExpression('||', leftCondition, rightCondition);
  93. }), t.returnStatement(t.nullLiteral())));
  94. }
  95. result.push(callStatement);
  96. return result;
  97. });
  98. var generateBindingsList = (function (t, bindings) {
  99. return bindings.map(function (binding) {
  100. return t.arrowFunctionExpression([t.identifier('$event'), t.restElement(t.identifier('attrs'))], t.blockStatement(generateBindingBody(t, binding)));
  101. });
  102. });
  103. 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"); } }; }();
  104. var generateSpreadEvent = (function (t) {
  105. return function (_ref) {
  106. var _ref2 = _slicedToArray(_ref, 2),
  107. event = _ref2[0],
  108. bindings = _ref2[1];
  109. var callbacks = generateBindingsList(t, bindings);
  110. return t.objectProperty(t.stringLiteral(event), callbacks.length === 1 ? callbacks[0] : t.arrayExpression(callbacks));
  111. };
  112. });
  113. var index = (function (_ref) {
  114. var t = _ref.types;
  115. return {
  116. inherits: syntaxJsx,
  117. visitor: {
  118. Program(path) {
  119. path.traverse({
  120. JSXOpeningElement(path) {
  121. var attributes = path.get('attributes');
  122. var groupedEventAttributes = attributes.reduce(groupEventAttributes(t), {});
  123. var events = Object.keys(groupedEventAttributes).map(function (key) {
  124. return [key, groupedEventAttributes[key]];
  125. });
  126. if (events.length > 0) {
  127. path.pushContainer('attributes', t.jSXSpreadAttribute(t.objectExpression([t.objectProperty(t.identifier('on'), t.objectExpression(events.map(generateSpreadEvent(t))))])));
  128. }
  129. }
  130. });
  131. }
  132. }
  133. };
  134. });
  135. module.exports = index;