LiteralObfuscator.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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 { IReplacer } from '../../interfaces/node-transformers/IReplacer';
  7. import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscatorsReplacers';
  8. import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
  9. import { Node } from '../../node/Node';
  10. @injectable()
  11. export class LiteralObfuscator extends AbstractNodeTransformer {
  12. /**
  13. * @type {(replacer: NodeObfuscatorsReplacers) => IReplacer}
  14. */
  15. private readonly replacersFactory: (replacer: NodeObfuscatorsReplacers) => IReplacer;
  16. /**
  17. * @param replacersFactory
  18. * @param options
  19. */
  20. constructor(
  21. @inject(ServiceIdentifiers['Factory<IReplacer>']) replacersFactory: (replacer: NodeObfuscatorsReplacers) => IReplacer,
  22. @inject(ServiceIdentifiers.IOptions) options: IOptions
  23. ) {
  24. super(options);
  25. this.replacersFactory = replacersFactory;
  26. }
  27. /**
  28. * @param literalNode
  29. * @param parentNode
  30. */
  31. public transformNode (literalNode: ESTree.Literal, parentNode: ESTree.Node): void {
  32. if (Node.isPropertyNode(parentNode) && parentNode.key === literalNode) {
  33. return;
  34. }
  35. let content: string;
  36. switch (typeof literalNode.value) {
  37. case 'boolean':
  38. content = this.replacersFactory(NodeObfuscatorsReplacers.BooleanReplacer)
  39. .replace(<boolean>literalNode.value);
  40. break;
  41. case 'number':
  42. content = this.replacersFactory(NodeObfuscatorsReplacers.NumberLiteralReplacer)
  43. .replace(<number>literalNode.value);
  44. break;
  45. case 'string':
  46. content = this.replacersFactory(NodeObfuscatorsReplacers.StringLiteralReplacer)
  47. .replace(<string>literalNode.value);
  48. break;
  49. default:
  50. return;
  51. }
  52. literalNode['x-verbatim-property'] = {
  53. content : content,
  54. precedence: escodegen.Precedence.Primary
  55. };
  56. }
  57. }