LiteralTransformer.ts 3.5 KB

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