MemberExpressionTransformer.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { injectable, inject } from 'inversify';
  2. import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
  3. import * as ESTree from 'estree';
  4. import { IOptions } from '../../interfaces/options/IOptions';
  5. import { IObfuscationReplacer } from '../../interfaces/node-transformers/IObfuscationReplacer';
  6. import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscationReplacers';
  7. import { NodeType } from '../../enums/NodeType';
  8. import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
  9. import { Node } from '../../node/Node';
  10. @injectable()
  11. export class MemberExpressionTransformer extends AbstractNodeTransformer {
  12. /**
  13. * @type {IObfuscationReplacer}
  14. */
  15. private readonly stringLiteralReplacer: IObfuscationReplacer;
  16. /**
  17. * @param replacersFactory
  18. * @param options
  19. */
  20. constructor(
  21. @inject(ServiceIdentifiers.Factory__IObfuscatorReplacer) replacersFactory: (replacer: NodeObfuscatorsReplacers) => IObfuscationReplacer,
  22. @inject(ServiceIdentifiers.IOptions) options: IOptions
  23. ) {
  24. super(options);
  25. this.stringLiteralReplacer = replacersFactory(NodeObfuscatorsReplacers.StringLiteralReplacer);
  26. }
  27. /**
  28. * replaces:
  29. * object.identifier = 1;
  30. *
  31. * on:
  32. * object['identifier'] = 1;
  33. *
  34. * and skip:
  35. * object[identifier] = 1;
  36. *
  37. * Literal node will be obfuscated by LiteralTransformer
  38. *
  39. * @param memberExpressionNode
  40. * @returns {ESTree.Node}
  41. */
  42. public transformNode (memberExpressionNode: ESTree.MemberExpression): ESTree.Node {
  43. if (Node.isIdentifierNode(memberExpressionNode.property)) {
  44. if (memberExpressionNode.computed) {
  45. return memberExpressionNode;
  46. }
  47. memberExpressionNode.computed = true;
  48. memberExpressionNode.property = {
  49. type: NodeType.Literal,
  50. value: memberExpressionNode.property.name,
  51. raw: `'${memberExpressionNode.property.name}'`
  52. };
  53. }
  54. return memberExpressionNode;
  55. }
  56. }