NodeUtils.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. "use strict";
  2. const estraverse = require('estraverse');
  3. const NodeType_1 = require("./enums/NodeType");
  4. const Utils_1 = require("./Utils");
  5. class NodeUtils {
  6. static addXVerbatimPropertyToLiterals(node) {
  7. estraverse.replace(node, {
  8. enter: (node, parentNode) => {
  9. if (NodeUtils.isLiteralNode(node)) {
  10. node['x-verbatim-property'] = node.raw;
  11. }
  12. }
  13. });
  14. }
  15. static appendNode(blockScopeBody, node) {
  16. if (!NodeUtils.validateNode(node)) {
  17. return;
  18. }
  19. blockScopeBody.push(node);
  20. }
  21. static getBlockScopeNodeByIndex(node, index = 0) {
  22. if (NodeUtils.isNodeHasBlockScope(node) && node.body[index]) {
  23. return node.body[index];
  24. }
  25. return node;
  26. }
  27. static getBlockScopeOfNode(node, depth = 0) {
  28. if (!node.parentNode) {
  29. throw new ReferenceError('`parentNode` property of given node is `undefined`');
  30. }
  31. if (node.parentNode.type === NodeType_1.NodeType.Program) {
  32. return node.parentNode;
  33. }
  34. if (!Utils_1.Utils.arrayContains(NodeUtils.scopeNodes, node.parentNode.type)) {
  35. return NodeUtils.getBlockScopeOfNode(node.parentNode, depth);
  36. }
  37. if (depth > 0) {
  38. return NodeUtils.getBlockScopeOfNode(node.parentNode, --depth);
  39. }
  40. if (node.type !== NodeType_1.NodeType.BlockStatement) {
  41. return NodeUtils.getBlockScopeOfNode(node.parentNode);
  42. }
  43. return node;
  44. }
  45. static getProgramNode(bodyNode) {
  46. return {
  47. 'type': NodeType_1.NodeType.Program,
  48. 'body': bodyNode
  49. };
  50. }
  51. static insertNodeAtIndex(blockScopeBody, node, index) {
  52. if (!NodeUtils.validateNode(node)) {
  53. return;
  54. }
  55. blockScopeBody.splice(index, 0, node);
  56. }
  57. static isBlockStatementNode(node) {
  58. return node.type === NodeType_1.NodeType.BlockStatement;
  59. }
  60. static isIdentifierNode(node) {
  61. return node.type === NodeType_1.NodeType.Identifier;
  62. }
  63. static isLiteralNode(node) {
  64. return node.type === NodeType_1.NodeType.Literal;
  65. }
  66. static isMemberExpressionNode(node) {
  67. return node.type === NodeType_1.NodeType.MemberExpression;
  68. }
  69. static isNodeHasBlockScope(node) {
  70. return node.hasOwnProperty('body');
  71. }
  72. static isProgramNode(node) {
  73. return node.type === NodeType_1.NodeType.Program;
  74. }
  75. static isPropertyNode(node) {
  76. return node.type === NodeType_1.NodeType.Property;
  77. }
  78. static isVariableDeclaratorNode(node) {
  79. return node.type === NodeType_1.NodeType.VariableDeclarator;
  80. }
  81. static parentize(node) {
  82. estraverse.replace(node, {
  83. enter: (node, parentNode) => {
  84. Object.defineProperty(node, 'parentNode', {
  85. configurable: true,
  86. enumerable: true,
  87. value: parentNode || node,
  88. writable: true
  89. });
  90. }
  91. });
  92. }
  93. static prependNode(blockScopeBody, node) {
  94. if (!NodeUtils.validateNode(node)) {
  95. return;
  96. }
  97. blockScopeBody.unshift(node);
  98. }
  99. static validateNode(node) {
  100. return !!node;
  101. }
  102. }
  103. NodeUtils.scopeNodes = [
  104. NodeType_1.NodeType.ArrowFunctionExpression,
  105. NodeType_1.NodeType.FunctionDeclaration,
  106. NodeType_1.NodeType.FunctionExpression,
  107. NodeType_1.NodeType.MethodDefinition
  108. ];
  109. exports.NodeUtils = NodeUtils;