index.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.TokenContext = void 0;
  6. exports.isLastChild = isLastChild;
  7. exports.needsParens = needsParens;
  8. exports.needsWhitespace = needsWhitespace;
  9. exports.needsWhitespaceAfter = needsWhitespaceAfter;
  10. exports.needsWhitespaceBefore = needsWhitespaceBefore;
  11. var whitespace = require("./whitespace.js");
  12. var parens = require("./parentheses.js");
  13. var _t = require("@babel/types");
  14. const {
  15. FLIPPED_ALIAS_KEYS,
  16. VISITOR_KEYS,
  17. isCallExpression,
  18. isDecorator,
  19. isExpressionStatement,
  20. isMemberExpression,
  21. isNewExpression,
  22. isParenthesizedExpression
  23. } = _t;
  24. const TokenContext = exports.TokenContext = {
  25. normal: 0,
  26. expressionStatement: 1,
  27. arrowBody: 2,
  28. exportDefault: 4,
  29. arrowFlowReturnType: 8,
  30. forInitHead: 16,
  31. forInHead: 32,
  32. forOfHead: 64,
  33. forInOrInitHeadAccumulate: 128,
  34. forInOrInitHeadAccumulatePassThroughMask: 128
  35. };
  36. function expandAliases(obj) {
  37. const map = new Map();
  38. function add(type, func) {
  39. const fn = map.get(type);
  40. map.set(type, fn ? function (node, parent, stack, getRawIdentifier) {
  41. var _fn;
  42. return (_fn = fn(node, parent, stack, getRawIdentifier)) != null ? _fn : func(node, parent, stack, getRawIdentifier);
  43. } : func);
  44. }
  45. for (const type of Object.keys(obj)) {
  46. const aliases = FLIPPED_ALIAS_KEYS[type];
  47. if (aliases) {
  48. for (const alias of aliases) {
  49. add(alias, obj[type]);
  50. }
  51. } else {
  52. add(type, obj[type]);
  53. }
  54. }
  55. return map;
  56. }
  57. const expandedParens = expandAliases(parens);
  58. const expandedWhitespaceNodes = expandAliases(whitespace.nodes);
  59. function isOrHasCallExpression(node) {
  60. if (isCallExpression(node)) {
  61. return true;
  62. }
  63. return isMemberExpression(node) && isOrHasCallExpression(node.object);
  64. }
  65. function needsWhitespace(node, parent, type) {
  66. var _expandedWhitespaceNo;
  67. if (!node) return false;
  68. if (isExpressionStatement(node)) {
  69. node = node.expression;
  70. }
  71. const flag = (_expandedWhitespaceNo = expandedWhitespaceNodes.get(node.type)) == null ? void 0 : _expandedWhitespaceNo(node, parent);
  72. if (typeof flag === "number") {
  73. return (flag & type) !== 0;
  74. }
  75. return false;
  76. }
  77. function needsWhitespaceBefore(node, parent) {
  78. return needsWhitespace(node, parent, 1);
  79. }
  80. function needsWhitespaceAfter(node, parent) {
  81. return needsWhitespace(node, parent, 2);
  82. }
  83. function needsParens(node, parent, tokenContext, getRawIdentifier) {
  84. var _expandedParens$get;
  85. if (!parent) return false;
  86. if (isNewExpression(parent) && parent.callee === node) {
  87. if (isOrHasCallExpression(node)) return true;
  88. }
  89. if (isDecorator(parent)) {
  90. return !isDecoratorMemberExpression(node) && !(isCallExpression(node) && isDecoratorMemberExpression(node.callee)) && !isParenthesizedExpression(node);
  91. }
  92. return (_expandedParens$get = expandedParens.get(node.type)) == null ? void 0 : _expandedParens$get(node, parent, tokenContext, getRawIdentifier);
  93. }
  94. function isDecoratorMemberExpression(node) {
  95. switch (node.type) {
  96. case "Identifier":
  97. return true;
  98. case "MemberExpression":
  99. return !node.computed && node.property.type === "Identifier" && isDecoratorMemberExpression(node.object);
  100. default:
  101. return false;
  102. }
  103. }
  104. function isLastChild(parent, child) {
  105. const visitorKeys = VISITOR_KEYS[parent.type];
  106. for (let i = visitorKeys.length - 1; i >= 0; i--) {
  107. const val = parent[visitorKeys[i]];
  108. if (val === child) {
  109. return true;
  110. } else if (Array.isArray(val)) {
  111. let j = val.length - 1;
  112. while (j >= 0 && val[j] === null) j--;
  113. return j >= 0 && val[j] === child;
  114. } else if (val) {
  115. return false;
  116. }
  117. }
  118. return false;
  119. }
  120. //# sourceMappingURL=index.js.map