NodeMocks.ts 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import * as escodegen from 'escodegen';
  2. import { TExpression } from "../../src/types/nodes/TExpression";
  3. import { TStatement } from "../../src/types/nodes/TStatement";
  4. import { IBlockStatementNode } from "../../src/interfaces/nodes/IBlockStatementNode";
  5. import { ICallExpressionNode } from "../../src/interfaces/nodes/ICallExpressionNode";
  6. import { ICatchClauseNode } from "../../src/interfaces/nodes/ICatchClauseNode";
  7. import { IExpressionStatementNode } from "../../src/interfaces/nodes/IExpressionStatementNode";
  8. import { IFunctionDeclarationNode } from "../../src/interfaces/nodes/IFunctionDeclarationNode";
  9. import { IIdentifierNode } from "../../src/interfaces/nodes/IIdentifierNode";
  10. import { IIfStatementNode } from "../../src/interfaces/nodes/IIfStatementNode";
  11. import { ILiteralNode } from "../../src/interfaces/nodes/ILiteralNode";
  12. import { IProgramNode } from "../../src/interfaces/nodes/IProgramNode";
  13. import { ISpreadElementNode } from "../../src/interfaces/nodes/ISpreadElementNode";
  14. import { IVariableDeclarationNode } from "../../src/interfaces/nodes/IVariableDeclarationNode";
  15. import { IVariableDeclaratorNode } from "../../src/interfaces/nodes/IVariableDeclaratorNode";
  16. import { NodeType } from "../../src/enums/NodeType";
  17. export class NodeMocks {
  18. /**
  19. * @param bodyNodes
  20. * @returns {IProgramNode}
  21. */
  22. public static getProgramNode (bodyNodes: TStatement[] = []): IProgramNode {
  23. return {
  24. type: NodeType.Program,
  25. body: bodyNodes,
  26. sourceType: 'script'
  27. };
  28. }
  29. /**
  30. * @param bodyNodes
  31. * @returns {IBlockStatementNode}
  32. */
  33. public static getBlockStatementNode (bodyNodes: TStatement[] = []): IBlockStatementNode {
  34. return {
  35. type: NodeType.BlockStatement,
  36. body: bodyNodes
  37. };
  38. }
  39. /**
  40. * @param bodyNodes
  41. * @returns {ICatchClauseNode}
  42. */
  43. public static getCatchClauseNode (bodyNodes: TStatement[] = []): ICatchClauseNode {
  44. return {
  45. type: NodeType.CatchClause,
  46. param: NodeMocks.getIdentifierNode('err'),
  47. body: NodeMocks.getBlockStatementNode(bodyNodes)
  48. };
  49. }
  50. /**
  51. * @param callee
  52. * @param args
  53. * @returns {ICallExpressionNode}
  54. */
  55. public static getCallExpressionNode (
  56. callee: TExpression,
  57. args: TExpression[] | ISpreadElementNode[] = []
  58. ): ICallExpressionNode {
  59. return {
  60. type: NodeType.CallExpression,
  61. callee: callee,
  62. arguments: args
  63. };
  64. }
  65. /**
  66. * @param expression
  67. * @returns {IExpressionStatementNode}
  68. */
  69. public static getExpressionStatementNode (
  70. expression: TExpression = NodeMocks.getIdentifierNode()
  71. ): IExpressionStatementNode {
  72. return {
  73. type: NodeType.ExpressionStatement,
  74. expression: expression
  75. };
  76. }
  77. /**
  78. * @param functionName
  79. * @param blockStatementNode
  80. * @param params
  81. * @returns {IFunctionDeclarationNode}
  82. */
  83. public static getFunctionDeclarationNode (
  84. functionName: string,
  85. blockStatementNode: IBlockStatementNode,
  86. params: IIdentifierNode[] = []
  87. ): IFunctionDeclarationNode {
  88. return {
  89. type: NodeType.FunctionDeclaration,
  90. id: NodeMocks.getIdentifierNode(functionName),
  91. params: params,
  92. body: blockStatementNode,
  93. generator: false,
  94. expression: false
  95. };
  96. }
  97. /**
  98. * @param blockStatementNode
  99. * @returns {IIfStatementNode}
  100. */
  101. public static getIfStatementNode (blockStatementNode: IBlockStatementNode): IIfStatementNode {
  102. return {
  103. type: 'IfStatement',
  104. test: {
  105. type: 'Literal',
  106. value: true,
  107. raw: 'true'
  108. },
  109. consequent: blockStatementNode,
  110. alternate: null
  111. };
  112. }
  113. /**
  114. * @param identifierName
  115. * @returns {IIdentifierNode}
  116. */
  117. public static getIdentifierNode (identifierName: string = 'identifier'): IIdentifierNode {
  118. return {
  119. type: NodeType.Identifier,
  120. name: identifierName,
  121. };
  122. }
  123. /**
  124. * @param value
  125. * @returns {ILiteralNode}
  126. */
  127. public static getLiteralNode (value: boolean|number|string = 'value'): ILiteralNode {
  128. return {
  129. type: NodeType.Literal,
  130. value: value,
  131. raw: `'${value}'`,
  132. 'x-verbatim-property': {
  133. content: `'${value}'`,
  134. precedence: escodegen.Precedence.Primary
  135. }
  136. };
  137. }
  138. /**
  139. * @param declarations
  140. * @param kind
  141. * @returns {IVariableDeclarationNode}
  142. */
  143. public static getVariableDeclarationNode (
  144. declarations: IVariableDeclaratorNode[] = [],
  145. kind: string = 'var'
  146. ): IVariableDeclarationNode {
  147. return {
  148. type: NodeType.VariableDeclaration,
  149. declarations: declarations,
  150. kind: kind
  151. };
  152. }
  153. /**
  154. * @param id
  155. * @param init
  156. * @returns {IVariableDeclaratorNode}
  157. */
  158. public static getVariableDeclaratorNode (id: IIdentifierNode, init: any): IVariableDeclaratorNode {
  159. return {
  160. type: NodeType.VariableDeclarator,
  161. id: id,
  162. init: init
  163. };
  164. }
  165. }