RenamePropertiesTransformer.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import { inject, injectable, } from 'inversify';
  2. import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
  3. import * as ESTree from 'estree';
  4. import { IRenamePropertiesReplacer } from '../../interfaces/node-transformers/rename-properties-transformers/replacer/IRenamePropertiesReplacer';
  5. import { IOptions } from '../../interfaces/options/IOptions';
  6. import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
  7. import { IVisitor } from '../../interfaces/node-transformers/IVisitor';
  8. import { NodeTransformationStage } from '../../enums/node-transformers/NodeTransformationStage';
  9. import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
  10. import { NodeGuards } from '../../node/NodeGuards';
  11. @injectable()
  12. export class RenamePropertiesTransformer extends AbstractNodeTransformer {
  13. /**
  14. * @type {IRenamePropertiesReplacer}
  15. */
  16. private readonly renamePropertiesReplacer: IRenamePropertiesReplacer;
  17. /**
  18. * @param {IRenamePropertiesReplacer} renamePropertiesReplacer
  19. * @param {IRandomGenerator} randomGenerator
  20. * @param {IOptions} options
  21. */
  22. public constructor (
  23. @inject(ServiceIdentifiers.IRenamePropertiesReplacer) renamePropertiesReplacer: IRenamePropertiesReplacer,
  24. @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
  25. @inject(ServiceIdentifiers.IOptions) options: IOptions
  26. ) {
  27. super(randomGenerator, options);
  28. this.renamePropertiesReplacer = renamePropertiesReplacer;
  29. }
  30. /**
  31. * @param {TNode} propertyNode
  32. * @param {ESTree.Expression} propertyKeyNode
  33. * @returns {boolean}
  34. */
  35. private static isValidPropertyNode<
  36. TNode extends ESTree.Property | ESTree.MemberExpression | ESTree.MethodDefinition
  37. > (
  38. propertyNode: TNode,
  39. propertyKeyNode: ESTree.Expression
  40. ): propertyKeyNode is ESTree.Identifier | ESTree.Literal {
  41. if (NodeGuards.isIdentifierNode(propertyKeyNode) && propertyNode.computed) {
  42. return false;
  43. }
  44. return NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards.isLiteralNode(propertyKeyNode);
  45. }
  46. /**
  47. * @param {NodeTransformationStage} nodeTransformationStage
  48. * @returns {IVisitor | null}
  49. */
  50. public getVisitor (nodeTransformationStage: NodeTransformationStage): IVisitor | null {
  51. switch (nodeTransformationStage) {
  52. case NodeTransformationStage.RenameProperties:
  53. return {
  54. enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
  55. if (parentNode) {
  56. return this.transformNode(node, parentNode);
  57. }
  58. }
  59. };
  60. default:
  61. return null;
  62. }
  63. }
  64. /**
  65. * @param {Node} node
  66. * @param {NodeGuards} parentNode
  67. * @returns {Node}
  68. */
  69. public transformNode (node: ESTree.Node, parentNode: ESTree.Node): ESTree.Node {
  70. if (NodeGuards.isPropertyNode(node)) {
  71. return this.transformPropertyNode(node);
  72. }
  73. if (NodeGuards.isMemberExpressionNode(node)) {
  74. return this.transformMemberExpressionNode(node);
  75. }
  76. if (NodeGuards.isMethodDefinitionNode(node)) {
  77. return this.transformMethodDefinitionNode(node);
  78. }
  79. return node;
  80. }
  81. /**
  82. * @param {Property} propertyNode
  83. * @returns {Property}
  84. */
  85. private transformPropertyNode (propertyNode: ESTree.Property): ESTree.Property {
  86. const propertyKeyNode: ESTree.Expression = propertyNode.key;
  87. if (RenamePropertiesTransformer.isValidPropertyNode(propertyNode, propertyKeyNode)) {
  88. propertyNode.key = this.renamePropertiesReplacer.replace(propertyKeyNode);
  89. propertyNode.shorthand = false;
  90. }
  91. return propertyNode;
  92. }
  93. /**
  94. * @param {Property} memberExpressionNode
  95. * @returns {Property}
  96. */
  97. private transformMemberExpressionNode (memberExpressionNode: ESTree.MemberExpression): ESTree.MemberExpression {
  98. const propertyKeyNode: ESTree.Expression = memberExpressionNode.property;
  99. if (RenamePropertiesTransformer.isValidPropertyNode(memberExpressionNode, propertyKeyNode)) {
  100. memberExpressionNode.property = this.renamePropertiesReplacer.replace(propertyKeyNode);
  101. }
  102. return memberExpressionNode;
  103. }
  104. /**
  105. * @param {MethodDefinition} methodDefinitionNode
  106. * @returns {MethodDefinition}
  107. */
  108. private transformMethodDefinitionNode (methodDefinitionNode: ESTree.MethodDefinition): ESTree.MethodDefinition {
  109. const propertyKeyNode: ESTree.Expression = methodDefinitionNode.key;
  110. if (RenamePropertiesTransformer.isValidPropertyNode(methodDefinitionNode, propertyKeyNode)) {
  111. methodDefinitionNode.key = this.renamePropertiesReplacer.replace(propertyKeyNode);
  112. }
  113. return methodDefinitionNode;
  114. }
  115. }