LiteralTransformer.ts 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { injectable, inject } from 'inversify';
  2. import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
  3. import * as ESTree from 'estree';
  4. import { TLiteralObfuscatingReplacerFactory } from '../../types/container/node-transformers/TLiteralObfuscatingReplacerFactory';
  5. import { IOptions } from '../../interfaces/options/IOptions';
  6. import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
  7. import { IVisitor } from '../../interfaces/IVisitor';
  8. import { LiteralObfuscatingReplacer } from '../../enums/container/node-transformers/LiteralObfuscatingReplacer';
  9. import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
  10. import { Node } from '../../node/Node';
  11. @injectable()
  12. export class LiteralTransformer extends AbstractNodeTransformer {
  13. /**
  14. * @type {TLiteralObfuscatingReplacerFactory}
  15. */
  16. private readonly literalObfuscatingReplacerFactory: TLiteralObfuscatingReplacerFactory;
  17. /**
  18. * @param {TLiteralObfuscatingReplacerFactory} literalObfuscatingReplacerFactory
  19. * @param {IRandomGenerator} randomGenerator
  20. * @param {IOptions} options
  21. */
  22. constructor (
  23. @inject(ServiceIdentifiers.Factory__IObfuscatingReplacer)
  24. literalObfuscatingReplacerFactory: TLiteralObfuscatingReplacerFactory,
  25. @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
  26. @inject(ServiceIdentifiers.IOptions) options: IOptions
  27. ) {
  28. super(randomGenerator, options);
  29. this.literalObfuscatingReplacerFactory = literalObfuscatingReplacerFactory;
  30. }
  31. /**
  32. * @return {IVisitor}
  33. */
  34. public getVisitor (): IVisitor {
  35. return {
  36. enter: (node: ESTree.Node, parentNode: ESTree.Node) => {
  37. if (Node.isLiteralNode(node) && !node.obfuscatedNode) {
  38. return this.transformNode(node, parentNode);
  39. }
  40. }
  41. };
  42. }
  43. /**
  44. * @param {Literal} literalNode
  45. * @param {Node} parentNode
  46. * @returns {Node}
  47. */
  48. public transformNode (literalNode: ESTree.Literal, parentNode: ESTree.Node): ESTree.Node {
  49. if (Node.isPropertyNode(parentNode) && parentNode.key === literalNode) {
  50. return literalNode;
  51. }
  52. switch (typeof literalNode.value) {
  53. case 'boolean':
  54. return this.literalObfuscatingReplacerFactory(LiteralObfuscatingReplacer.BooleanLiteralObfuscatingReplacer)
  55. .replace(<boolean>literalNode.value);
  56. case 'number':
  57. return this.literalObfuscatingReplacerFactory(LiteralObfuscatingReplacer.NumberLiteralObfuscatingReplacer)
  58. .replace(<number>literalNode.value);
  59. case 'string':
  60. return this.literalObfuscatingReplacerFactory(LiteralObfuscatingReplacer.StringLiteralObfuscatingReplacer)
  61. .replace(<string>literalNode.value);
  62. default:
  63. return literalNode;
  64. }
  65. }
  66. }