LiteralTransformer.ts 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import { injectable, inject } from 'inversify';
  2. import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
  3. import * as escodegen from 'escodegen';
  4. import * as ESTree from 'estree';
  5. import { IOptions } from '../../interfaces/options/IOptions';
  6. import { IObfuscationReplacer } from '../../interfaces/node-transformers/IObfuscationReplacer';
  7. import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscationReplacers';
  8. import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
  9. import { Node } from '../../node/Node';
  10. @injectable()
  11. export class LiteralTransformer extends AbstractNodeTransformer {
  12. /**
  13. * @type {(replacer: NodeObfuscatorsReplacers) => IObfuscationReplacer}
  14. */
  15. private readonly replacersFactory: (replacer: NodeObfuscatorsReplacers) => 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.replacersFactory = replacersFactory;
  26. }
  27. /**
  28. * @param literalNode
  29. * @param parentNode
  30. * @returns {ESTree.Node}
  31. */
  32. public transformNode (literalNode: ESTree.Literal, parentNode: ESTree.Node): ESTree.Node {
  33. if (Node.isPropertyNode(parentNode) && parentNode.key === literalNode) {
  34. return literalNode;
  35. }
  36. let content: string;
  37. switch (typeof literalNode.value) {
  38. case 'boolean':
  39. content = this.replacersFactory(NodeObfuscatorsReplacers.BooleanReplacer)
  40. .replace(<boolean>literalNode.value);
  41. break;
  42. case 'number':
  43. content = this.replacersFactory(NodeObfuscatorsReplacers.NumberLiteralReplacer)
  44. .replace(<number>literalNode.value);
  45. break;
  46. case 'string':
  47. content = this.replacersFactory(NodeObfuscatorsReplacers.StringLiteralReplacer)
  48. .replace(<string>literalNode.value);
  49. break;
  50. default:
  51. return literalNode;
  52. }
  53. literalNode['x-verbatim-property'] = {
  54. content : content,
  55. precedence: escodegen.Precedence.Primary
  56. };
  57. return literalNode;
  58. }
  59. }