import { injectable, inject } from 'inversify'; import { ServiceIdentifiers } from '../../container/ServiceIdentifiers'; import * as escodegen from 'escodegen'; import * as ESTree from 'estree'; import { IOptions } from '../../interfaces/options/IOptions'; import { IReplacer } from '../../interfaces/node-transformers/IReplacer'; import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscatorsReplacers'; import { AbstractNodeTransformer } from '../AbstractNodeTransformer'; import { Node } from '../../node/Node'; @injectable() export class LiteralObfuscator extends AbstractNodeTransformer { /** * @type {(replacer: NodeObfuscatorsReplacers) => IReplacer} */ private readonly replacersFactory: (replacer: NodeObfuscatorsReplacers) => IReplacer; /** * @param replacersFactory * @param options */ constructor( @inject(ServiceIdentifiers['Factory']) replacersFactory: (replacer: NodeObfuscatorsReplacers) => IReplacer, @inject(ServiceIdentifiers.IOptions) options: IOptions ) { super(options); this.replacersFactory = replacersFactory; } /** * @param literalNode * @param parentNode */ public transformNode (literalNode: ESTree.Literal, parentNode: ESTree.Node): void { if (Node.isPropertyNode(parentNode) && parentNode.key === literalNode) { return; } let content: string; switch (typeof literalNode.value) { case 'boolean': content = this.replacersFactory(NodeObfuscatorsReplacers.BooleanReplacer) .replace(literalNode.value); break; case 'number': content = this.replacersFactory(NodeObfuscatorsReplacers.NumberLiteralReplacer) .replace(literalNode.value); break; case 'string': content = this.replacersFactory(NodeObfuscatorsReplacers.StringLiteralReplacer) .replace(literalNode.value); break; default: return; } literalNode['x-verbatim-property'] = { content : content, precedence: escodegen.Precedence.Primary }; } }