index.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _helperPluginUtils = require("@babel/helper-plugin-utils");
  7. var _core = require("@babel/core");
  8. var _default = (0, _helperPluginUtils.declare)((api, options) => {
  9. var _api$assumption;
  10. api.assertVersion(7);
  11. const setComputedProperties = (_api$assumption = api.assumption("setComputedProperties")) != null ? _api$assumption : options.loose;
  12. const pushComputedProps = setComputedProperties ? pushComputedPropsLoose : pushComputedPropsSpec;
  13. const buildMutatorMapAssign = _core.template.statements(`
  14. MUTATOR_MAP_REF[KEY] = MUTATOR_MAP_REF[KEY] || {};
  15. MUTATOR_MAP_REF[KEY].KIND = VALUE;
  16. `);
  17. function getValue(prop) {
  18. if (_core.types.isObjectProperty(prop)) {
  19. return prop.value;
  20. } else if (_core.types.isObjectMethod(prop)) {
  21. return _core.types.functionExpression(null, prop.params, prop.body, prop.generator, prop.async);
  22. }
  23. }
  24. function pushAssign(objId, prop, body) {
  25. body.push(_core.types.expressionStatement(_core.types.assignmentExpression("=", _core.types.memberExpression(_core.types.cloneNode(objId), prop.key, prop.computed || _core.types.isLiteral(prop.key)), getValue(prop))));
  26. }
  27. function pushMutatorDefine({
  28. body,
  29. getMutatorId,
  30. scope
  31. }, prop) {
  32. let key = !prop.computed && _core.types.isIdentifier(prop.key) ? _core.types.stringLiteral(prop.key.name) : prop.key;
  33. const maybeMemoise = scope.maybeGenerateMemoised(key);
  34. if (maybeMemoise) {
  35. body.push(_core.types.expressionStatement(_core.types.assignmentExpression("=", maybeMemoise, key)));
  36. key = maybeMemoise;
  37. }
  38. body.push(...buildMutatorMapAssign({
  39. MUTATOR_MAP_REF: getMutatorId(),
  40. KEY: _core.types.cloneNode(key),
  41. VALUE: getValue(prop),
  42. KIND: _core.types.identifier(prop.kind)
  43. }));
  44. }
  45. function pushComputedPropsLoose(info) {
  46. for (const prop of info.computedProps) {
  47. if (_core.types.isObjectMethod(prop) && (prop.kind === "get" || prop.kind === "set")) {
  48. pushMutatorDefine(info, prop);
  49. } else {
  50. pushAssign(_core.types.cloneNode(info.objId), prop, info.body);
  51. }
  52. }
  53. }
  54. function pushComputedPropsSpec(info) {
  55. const {
  56. objId,
  57. body,
  58. computedProps,
  59. state
  60. } = info;
  61. for (const prop of computedProps) {
  62. const key = _core.types.toComputedKey(prop);
  63. if (_core.types.isObjectMethod(prop) && (prop.kind === "get" || prop.kind === "set")) {
  64. pushMutatorDefine(info, prop);
  65. } else {
  66. const value = getValue(prop);
  67. if (computedProps.length === 1) {
  68. return _core.types.callExpression(state.addHelper("defineProperty"), [info.initPropExpression, key, value]);
  69. } else {
  70. body.push(_core.types.expressionStatement(_core.types.callExpression(state.addHelper("defineProperty"), [_core.types.cloneNode(objId), key, value])));
  71. }
  72. }
  73. }
  74. }
  75. return {
  76. name: "transform-computed-properties",
  77. visitor: {
  78. ObjectExpression: {
  79. exit(path, state) {
  80. const {
  81. node,
  82. parent,
  83. scope
  84. } = path;
  85. let hasComputed = false;
  86. for (const prop of node.properties) {
  87. hasComputed = prop.computed === true;
  88. if (hasComputed) break;
  89. }
  90. if (!hasComputed) return;
  91. const initProps = [];
  92. const computedProps = [];
  93. let foundComputed = false;
  94. for (const prop of node.properties) {
  95. if (_core.types.isSpreadElement(prop)) {
  96. continue;
  97. }
  98. if (prop.computed) {
  99. foundComputed = true;
  100. }
  101. if (foundComputed) {
  102. computedProps.push(prop);
  103. } else {
  104. initProps.push(prop);
  105. }
  106. }
  107. const objId = scope.generateUidIdentifierBasedOnNode(parent);
  108. const initPropExpression = _core.types.objectExpression(initProps);
  109. const body = [];
  110. body.push(_core.types.variableDeclaration("var", [_core.types.variableDeclarator(objId, initPropExpression)]));
  111. let mutatorRef;
  112. const getMutatorId = function () {
  113. if (!mutatorRef) {
  114. mutatorRef = scope.generateUidIdentifier("mutatorMap");
  115. body.push(_core.types.variableDeclaration("var", [_core.types.variableDeclarator(mutatorRef, _core.types.objectExpression([]))]));
  116. }
  117. return _core.types.cloneNode(mutatorRef);
  118. };
  119. const single = pushComputedProps({
  120. scope,
  121. objId,
  122. body,
  123. computedProps,
  124. initPropExpression,
  125. getMutatorId,
  126. state
  127. });
  128. if (mutatorRef) {
  129. body.push(_core.types.expressionStatement(_core.types.callExpression(state.addHelper("defineEnumerableProperties"), [_core.types.cloneNode(objId), _core.types.cloneNode(mutatorRef)])));
  130. }
  131. if (single) {
  132. path.replaceWith(single);
  133. } else {
  134. body.push(_core.types.expressionStatement(_core.types.cloneNode(objId)));
  135. path.replaceWithMultiple(body);
  136. }
  137. }
  138. }
  139. }
  140. };
  141. });
  142. exports.default = _default;