LiteralTransformer.ts 2.8 KB

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