Node.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. import * as ESTree from 'estree';
  2. import { TNodeWithBlockStatement } from '../types/TNodeWithBlockStatement';
  3. import { TStatement } from '../types/TStatement';
  4. import { NodeType } from '../enums/NodeType';
  5. export class Node {
  6. /**
  7. * @param bodyNode
  8. * @returns ESTree.Program
  9. */
  10. public static getProgramNode (bodyNode: TStatement[]): ESTree.Program {
  11. return {
  12. 'type': NodeType.Program,
  13. 'body': bodyNode,
  14. 'sourceType': 'script',
  15. 'obfuscated': false
  16. };
  17. }
  18. /**
  19. * @param node
  20. * @returns {boolean}
  21. */
  22. public static isArrowFunctionExpressionNode (node: ESTree.Node): node is ESTree.ArrowFunctionExpression {
  23. return node.type === NodeType.ArrowFunctionExpression;
  24. }
  25. /**
  26. * @param node
  27. * @returns {boolean}
  28. */
  29. public static isBlockStatementNode (node: ESTree.Node): node is ESTree.BlockStatement {
  30. return node.type === NodeType.BlockStatement;
  31. }
  32. /**
  33. * @param node
  34. * @returns {boolean}
  35. */
  36. public static isBreakStatementNode (node: ESTree.Node): node is ESTree.BreakStatement {
  37. return node.type === NodeType.BreakStatement;
  38. }
  39. /**
  40. * @param node
  41. * @returns {boolean}
  42. */
  43. public static isCallExpressionNode (node: ESTree.Node): node is ESTree.CallExpression {
  44. return node.type === NodeType.CallExpression;
  45. }
  46. /**
  47. * @param node
  48. * @returns {boolean}
  49. */
  50. public static isContinueStatementNode (node: ESTree.Node): node is ESTree.ContinueStatement {
  51. return node.type === NodeType.ContinueStatement;
  52. }
  53. /**
  54. * @param node
  55. * @returns {boolean}
  56. */
  57. public static isExpressionStatementNode (node: ESTree.Node): node is ESTree.ExpressionStatement {
  58. return node.type === NodeType.ExpressionStatement;
  59. }
  60. /**
  61. * @param node
  62. * @returns {boolean}
  63. */
  64. public static isFunctionDeclarationNode (node: ESTree.Node): node is ESTree.FunctionDeclaration {
  65. return node.type === NodeType.FunctionDeclaration;
  66. }
  67. /**
  68. * @param node
  69. * @returns {boolean}
  70. */
  71. public static isFunctionExpressionNode (node: ESTree.Node): node is ESTree.FunctionExpression {
  72. return node.type === NodeType.FunctionExpression;
  73. }
  74. /**
  75. * @param node
  76. * @returns {boolean}
  77. */
  78. public static isIdentifierNode (node: ESTree.Node): node is ESTree.Identifier {
  79. return node.type === NodeType.Identifier;
  80. }
  81. /**
  82. * @param node
  83. * @param parentNode
  84. * @returns {boolean}
  85. */
  86. public static isLabelIdentifierNode (node: ESTree.Node, parentNode: ESTree.Node): node is ESTree.Identifier {
  87. const parentNodeIsLabeledStatementNode: boolean = Node.isLabeledStatementNode(parentNode) && parentNode.label === node;
  88. const parentNodeIsContinueStatementNode: boolean = Node.isContinueStatementNode(parentNode) && parentNode.label === node;
  89. const parentNodeIsBreakStatementNode: boolean = Node.isBreakStatementNode(parentNode) && parentNode.label === node;
  90. return parentNodeIsLabeledStatementNode ||
  91. parentNodeIsContinueStatementNode ||
  92. parentNodeIsBreakStatementNode;
  93. }
  94. /**
  95. * @param node
  96. * @returns {boolean}
  97. */
  98. public static isLabeledStatementNode (node: ESTree.Node): node is ESTree.LabeledStatement {
  99. return node.type === NodeType.LabeledStatement;
  100. }
  101. /**
  102. * @param node
  103. * @returns {boolean}
  104. */
  105. public static isLiteralNode (node: ESTree.Node): node is ESTree.Literal {
  106. return node.type === NodeType.Literal;
  107. }
  108. /**
  109. * @param node
  110. * @returns {boolean}
  111. */
  112. public static isMemberExpressionNode (node: ESTree.Node): node is ESTree.MemberExpression {
  113. return node.type === NodeType.MemberExpression;
  114. }
  115. /**
  116. * @param node
  117. * @returns {boolean}
  118. */
  119. public static isObjectExpressionNode (node: ESTree.Node): node is ESTree.ObjectExpression {
  120. return node.type === NodeType.ObjectExpression;
  121. }
  122. /**
  123. *
  124. * @param node
  125. * @returns {boolean}
  126. */
  127. public static isProgramNode (node: ESTree.Node): node is ESTree.Program {
  128. return node.type === NodeType.Program;
  129. }
  130. /**
  131. *
  132. * @param node
  133. * @returns {boolean}
  134. */
  135. public static isPropertyNode (node: ESTree.Node): node is ESTree.Property {
  136. return node.type === NodeType.Property;
  137. }
  138. /**
  139. * @param node
  140. * @param parentNode
  141. * @returns {boolean}
  142. */
  143. public static isReplaceableIdentifierNode (node: ESTree.Node, parentNode: ESTree.Node): node is ESTree.Identifier {
  144. if (!Node.isIdentifierNode(node)) {
  145. return false;
  146. }
  147. const parentNodeIsPropertyNode: boolean = Node.isPropertyNode(parentNode) && parentNode.key === node;
  148. const parentNodeIsMemberExpressionNode: boolean = (
  149. Node.isMemberExpressionNode(parentNode) &&
  150. parentNode.computed === false &&
  151. parentNode.property === node
  152. );
  153. return !parentNodeIsPropertyNode &&
  154. !parentNodeIsMemberExpressionNode &&
  155. !Node.isLabelIdentifierNode(node, parentNode);
  156. }
  157. /**
  158. *
  159. * @param node
  160. * @returns {boolean}
  161. */
  162. public static isVariableDeclarationNode (node: ESTree.Node): node is ESTree.VariableDeclaration {
  163. return node.type === NodeType.VariableDeclaration;
  164. }
  165. /**
  166. *
  167. * @param node
  168. * @returns {boolean}
  169. */
  170. public static isVariableDeclaratorNode (node: ESTree.Node): node is ESTree.VariableDeclarator {
  171. return node.type === NodeType.VariableDeclarator;
  172. }
  173. /**
  174. * @param node
  175. * @returns {boolean}
  176. */
  177. public static isNodeHasBlockStatement (node: ESTree.Node): node is TNodeWithBlockStatement {
  178. return node.hasOwnProperty('body') && Array.isArray((<TNodeWithBlockStatement>node).body);
  179. }
  180. }