util.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.shouldTransform = shouldTransform;
  6. var _helperSkipTransparentExpressionWrappers = require("@babel/helper-skip-transparent-expression-wrappers");
  7. var _core = require("@babel/core");
  8. function matchAffectedArguments(argumentNodes) {
  9. const spreadIndex = argumentNodes.findIndex(node => _core.types.isSpreadElement(node));
  10. return spreadIndex >= 0 && spreadIndex !== argumentNodes.length - 1;
  11. }
  12. function shouldTransform(path) {
  13. let optionalPath = path;
  14. const chains = [];
  15. for (;;) {
  16. if (optionalPath.isOptionalMemberExpression()) {
  17. chains.push(optionalPath.node);
  18. optionalPath = (0, _helperSkipTransparentExpressionWrappers.skipTransparentExprWrappers)(optionalPath.get("object"));
  19. } else if (optionalPath.isOptionalCallExpression()) {
  20. chains.push(optionalPath.node);
  21. optionalPath = (0, _helperSkipTransparentExpressionWrappers.skipTransparentExprWrappers)(optionalPath.get("callee"));
  22. } else {
  23. break;
  24. }
  25. }
  26. for (let i = 0; i < chains.length; i++) {
  27. const node = chains[i];
  28. if (_core.types.isOptionalCallExpression(node) && matchAffectedArguments(node.arguments)) {
  29. if (node.optional) {
  30. return true;
  31. }
  32. const callee = chains[i + 1];
  33. if (_core.types.isOptionalMemberExpression(callee, {
  34. optional: true
  35. })) {
  36. return true;
  37. }
  38. }
  39. }
  40. return false;
  41. }
  42. //# sourceMappingURL=util.js.map