import { ContainerModule, interfaces } from 'inversify'; import { ServiceIdentifiers } from '../../ServiceIdentifiers'; import { INodeTransformer } from '../../../interfaces/INodeTransformer'; import { NodeTransformers } from '../../../enums/container/NodeTransformers'; import { FunctionControlFlowTransformer } from '../../../node-transformers/node-control-flow-transformers/FunctionControlFlowTransformer'; import { CatchClauseObfuscator } from '../../../node-transformers/node-obfuscators/CatchClauseObfuscator'; import { FunctionDeclarationObfuscator } from '../../../node-transformers/node-obfuscators/FunctionDeclarationObfuscator'; import { FunctionObfuscator } from '../../../node-transformers/node-obfuscators/FunctionObfuscator'; import { LabeledStatementObfuscator } from '../../../node-transformers/node-obfuscators/LabeledStatementObfuscator'; import { LiteralObfuscator } from '../../../node-transformers/node-obfuscators/LiteralObfuscator'; import { MemberExpressionObfuscator } from '../../../node-transformers/node-obfuscators/MemberExpressionObfuscator'; import { MethodDefinitionObfuscator } from '../../../node-transformers/node-obfuscators/MethodDefinitionObfuscator'; import { ObjectExpressionObfuscator } from '../../../node-transformers/node-obfuscators/ObjectExpressionObfuscator'; import { VariableDeclarationObfuscator } from '../../../node-transformers/node-obfuscators/VariableDeclarationObfuscator'; export const nodeTransformersModule: interfaces.ContainerModule = new ContainerModule((bind: interfaces.Bind) => { const nodeTransformersTag: string = 'nodeTransformers'; // node control flow transformers bind(ServiceIdentifiers.INodeTransformer) .to(FunctionControlFlowTransformer) .whenTargetTagged(nodeTransformersTag, NodeTransformers.FunctionControlFlowTransformer); // node obfuscators bind(ServiceIdentifiers.INodeTransformer) .to(CatchClauseObfuscator) .whenTargetTagged(nodeTransformersTag, NodeTransformers.CatchClauseObfuscator); bind(ServiceIdentifiers.INodeTransformer) .to(FunctionDeclarationObfuscator) .whenTargetTagged(nodeTransformersTag, NodeTransformers.FunctionDeclarationObfuscator); bind(ServiceIdentifiers.INodeTransformer) .to(FunctionObfuscator) .whenTargetTagged(nodeTransformersTag, NodeTransformers.FunctionObfuscator); bind(ServiceIdentifiers.INodeTransformer) .to(LabeledStatementObfuscator) .whenTargetTagged(nodeTransformersTag, NodeTransformers.LabeledStatementObfuscator); bind(ServiceIdentifiers.INodeTransformer) .to(LiteralObfuscator) .whenTargetTagged(nodeTransformersTag, NodeTransformers.LiteralObfuscator); bind(ServiceIdentifiers.INodeTransformer) .to(MemberExpressionObfuscator) .whenTargetTagged(nodeTransformersTag, NodeTransformers.MemberExpressionObfuscator); bind(ServiceIdentifiers.INodeTransformer) .to(MethodDefinitionObfuscator) .whenTargetTagged(nodeTransformersTag, NodeTransformers.MethodDefinitionObfuscator); bind(ServiceIdentifiers.INodeTransformer) .to(ObjectExpressionObfuscator) .whenTargetTagged(nodeTransformersTag, NodeTransformers.ObjectExpressionObfuscator); bind(ServiceIdentifiers.INodeTransformer) .to(VariableDeclarationObfuscator) .whenTargetTagged(nodeTransformersTag, NodeTransformers.VariableDeclarationObfuscator); // node transformers factory bind(ServiceIdentifiers['Factory']) .toFactory((context: interfaces.Context) => { const cache: Map = new Map (); return (nodeTransformersMap: Map) => (nodeType: string) => { const nodeTransformers: NodeTransformers[] = nodeTransformersMap.get(nodeType) || []; const instancesArray: INodeTransformer[] = []; nodeTransformers.forEach((transformer: NodeTransformers) => { let nodeTransformer: INodeTransformer; if (cache.has(transformer)) { nodeTransformer = cache.get(transformer); } else { nodeTransformer = context.container.getTagged( ServiceIdentifiers.INodeTransformer, nodeTransformersTag, transformer ); cache.set(transformer, nodeTransformer); } instancesArray.push(nodeTransformer); }); return instancesArray; }; }); });