BooleanLiteralObfuscatingReplacer.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { inject, injectable, } from 'inversify';
  2. import { ServiceIdentifiers } from '../../../../container/ServiceIdentifiers';
  3. import * as ESTree from 'estree';
  4. import { IOptions } from '../../../../interfaces/options/IOptions';
  5. import { AbstractObfuscatingReplacer } from '../AbstractObfuscatingReplacer';
  6. import { NodeFactory } from '../../../../node/NodeFactory';
  7. @injectable()
  8. export class BooleanLiteralObfuscatingReplacer extends AbstractObfuscatingReplacer {
  9. /**
  10. * @param {IOptions} options
  11. */
  12. public constructor (
  13. @inject(ServiceIdentifiers.IOptions) options: IOptions
  14. ) {
  15. super(options);
  16. }
  17. /**
  18. * @return {ESTree.UnaryExpression}
  19. */
  20. private static getTrueUnaryExpressionNode (): ESTree.UnaryExpression {
  21. return NodeFactory.unaryExpressionNode(
  22. '!',
  23. BooleanLiteralObfuscatingReplacer.getFalseUnaryExpressionNode()
  24. );
  25. }
  26. /**
  27. * @return {ESTree.UnaryExpression}
  28. */
  29. private static getFalseUnaryExpressionNode (): ESTree.UnaryExpression {
  30. return NodeFactory.unaryExpressionNode(
  31. '!',
  32. NodeFactory.arrayExpressionNode()
  33. );
  34. }
  35. /**
  36. * @param {SimpleLiteral} literalNode
  37. * @returns {Node}
  38. */
  39. public replace (literalNode: ESTree.SimpleLiteral): ESTree.Node {
  40. const literalValue: ESTree.SimpleLiteral['value'] = literalNode.value;
  41. if (typeof literalValue !== 'boolean') {
  42. throw new Error('`BooleanLiteralObfuscatingReplacer` should accept only literals with `boolean` value');
  43. }
  44. return literalValue
  45. ? BooleanLiteralObfuscatingReplacer.getTrueUnaryExpressionNode()
  46. : BooleanLiteralObfuscatingReplacer.getFalseUnaryExpressionNode();
  47. }
  48. }